Merge branch 'master' of git://git.videolan.org/x264.git
authorPhillip Blucas <pblucas@gmail.com>
Thu, 27 Jan 2011 02:46:35 +0000 (20:46 -0600)
committerPhillip Blucas <pblucas@gmail.com>
Thu, 27 Jan 2011 02:46:35 +0000 (20:46 -0600)
27 files changed:
1  2 
common/bitstream.c
common/bitstream.h
common/common.c
common/common.h
common/dct.c
common/dct.h
common/frame.c
common/frame.h
common/mc.c
common/mc.h
common/predict.c
common/predict.h
common/quant.c
common/quant.h
common/set.c
common/set.h
encoder/analyse.c
encoder/encoder.c
encoder/macroblock.c
encoder/macroblock.h
encoder/ratecontrol.c
encoder/rdo.c
encoder/set.c
encoder/set.h
encoder/slicetype.c
x264.c
x264.h

Simple merge
index 75aead5,c896abf..74592a2
mode 100755,100644..100755
diff --cc common/common.c
Simple merge
diff --cc common/common.h
index 0bc3292,4654c17..2b0ac49
mode 100755,100644..100644
@@@ -59,10 -59,9 +59,12 @@@ do {
  #define X264_PCM_COST (384*BIT_DEPTH+16)
  #define X264_LOOKAHEAD_MAX 250
  #define QP_BD_OFFSET (6*(BIT_DEPTH-8))
- #define QP_MAX (51+QP_BD_OFFSET)
- #define QP_MAX_MAX (51+2*6)
- #define QP_MAX_MPEG2 31
 -#define QP_MAX_SPEC (51+QP_BD_OFFSET)
 -#define QP_MAX (QP_MAX_SPEC+18)
++#define QP_MAX_SPEC_H264 (51+QP_BD_OFFSET)
++#define QP_MAX_SPEC_MPEG2 31
++#define QP_MAX_SPEC (MPEG2 ? QP_MAX_SPEC_MPEG2 : QP_MAX_SPEC_H264)
++#define QP_MAX (QP_MAX_SPEC_H264+18)
+ #define QP_MAX_MAX (51+2*6+18)
 +#define LAMBDA_MAX (91 << (BIT_DEPTH-8))
  #define PIXEL_MAX ((1 << BIT_DEPTH)-1)
  // arbitrary, but low because SATD scores are 1/4 normal
  #define X264_LOOKAHEAD_QP (12+QP_BD_OFFSET)
diff --cc common/dct.c
index be23311,fef004e..c328f6b
mode 100755,100644..100755
diff --cc common/dct.h
Simple merge
diff --cc common/frame.c
Simple merge
diff --cc common/frame.h
Simple merge
diff --cc common/mc.c
Simple merge
diff --cc common/mc.h
Simple merge
Simple merge
Simple merge
diff --cc common/quant.c
index 3dd0c90,afc50a3..233d51c
mode 100755,100644..100755
@@@ -339,21 -285,10 +339,14 @@@ void x264_quant_init( x264_t *h, int cp
      pf->coeff_level_run[  DCT_LUMA_AC] = x264_coeff_level_run15;
      pf->coeff_level_run[ DCT_LUMA_4x4] = x264_coeff_level_run16;
  
 +    pf->quant_8x8_mpeg2 = quant_8x8_mpeg2;
 +    pf->dequant_mpeg2_intra = dequant_mpeg2_intra;
 +    pf->dequant_mpeg2_inter = dequant_mpeg2_inter;
 +
  #if HIGH_BIT_DEPTH
  #if HAVE_MMX
-     if( cpu&X264_CPU_MMX )
-     {
-         pf->quant_4x4 = x264_quant_4x4_mmx;
-         pf->quant_8x8 = x264_quant_8x8_mmx;
-     }
      if( cpu&X264_CPU_MMXEXT )
      {
-         pf->quant_2x2_dc = x264_quant_2x2_dc_mmxext;
-         pf->quant_4x4_dc = x264_quant_4x4_dc_mmxext;
  #if ARCH_X86
          pf->denoise_dct = x264_denoise_dct_mmx;
          pf->decimate_score15 = x264_decimate_score15_mmxext;
diff --cc common/quant.h
index 57f6f09,f65328f..cd8c2ee
mode 100755,100644..100755
diff --cc common/set.c
@@@ -224,34 -249,6 +268,34 @@@ fail
      return -1;
  }
  
-         CHECKED_MALLOC( h->quant8_bias[i], (QP_MAX_MPEG2+1)*64*sizeof(uint16_t) );
-         CHECKED_MALLOC( h->  quant8_mf[i], (QP_MAX_MPEG2+1)*64*sizeof(uint16_t) );
-         CHECKED_MALLOC( h->dequant8_mf[i], (QP_MAX_MPEG2+1)*64*sizeof(int) );
 +int x262_cqm_init( x264_t *h )
 +{
 +    const uint8_t *qscale = x262_qscale[h->param.b_nonlinear_quant];
 +
 +    for( int i = 0; i < 2; i++ )
 +    {
-     for( int q = 0; q < QP_MAX_MPEG2+1; q++ )
++        CHECKED_MALLOC( h->quant8_bias[i], (QP_MAX_SPEC_MPEG2+1)*64*sizeof(uint16_t) );
++        CHECKED_MALLOC( h->  quant8_mf[i], (QP_MAX_SPEC_MPEG2+1)*64*sizeof(uint16_t) );
++        CHECKED_MALLOC( h->dequant8_mf[i], (QP_MAX_SPEC_MPEG2+1)*64*sizeof(int) );
 +    }
++    for( int q = 0; q < QP_MAX_SPEC_MPEG2+1; q++ )
 +    {
 +        for( int i = 0; i < 64; i++ )
 +        {
 +            h->  quant8_mf[CQM_8IY][q][i] =
 +            h->dequant8_mf[CQM_8IY][q][i] = 2 * qscale[q] * h->pps->scaling_list[CQM_8IY][i];
 +
 +            h->  quant8_mf[CQM_8PY][q][i] =
 +            h->dequant8_mf[CQM_8PY][q][i] = 2 * qscale[q] * h->pps->scaling_list[CQM_8PY][i];
 +            h->quant8_bias[CQM_8PY][q][i] = qscale[q] * h->pps->scaling_list[CQM_8PY][i];
 +        }
 +    }
 +    return 0;
 +fail:
 +    x264_cqm_delete( h );
 +    return -1;
 +}
 +
  #define CQM_DELETE( n, max )\
      for( int i = 0; i < max; i++ )\
      {\
  
  void x264_cqm_delete( x264_t *h )
  {
 -    CQM_DELETE( 4, 4 );
 +    if( !MPEG2 )
 +        CQM_DELETE( 4, 4 );
      CQM_DELETE( 8, 2 );
+     x264_free( h->nr_offset_emergency );
  }
  
  static int x264_cqm_parse_jmlist( x264_t *h, const char *buf, const char *name,
diff --cc common/set.h
index 06ead30,fb81c1a..f450ea4
mode 100755,100644..100755
index 9a4f06d,bf9f3c9..e093289
mode 100755,100644..100644
@@@ -150,49 -153,21 +153,81 @@@ const uint16_t x264_lambda_tab[QP_MAX_M
  };
  
  /* lambda2 = pow(lambda,2) * .9 * 256 */
+ /* Capped to avoid overflow */
  const int x264_lambda2_tab[QP_MAX_MAX+1] = {
-      14,     18,     22,      28,      36,      45,      57,      72, /*  0- 7 */
-      91,    115,    145,     182,     230,     290,     365,     460, /*  8-15 */
-     580,    731,    921,    1161,    1462,    1843,    2322,    2925, /* 16-23 */
-    3686,   4644,   5851,    7372,    9289,   11703,   14745,   18578, /* 24-31 */
-   23407,  29491,  37156,   46814,   58982,   74313,   93628,  117964, /* 32-39 */
-  148626, 187257, 235929,  297252,  374514,  471859,  594505,  749029, /* 40-47 */
-  943718,1189010,1498059, 1887436, 2378021, 2996119, 3774873, 4756042, /* 48-55 */
- 5992238,7549747,9512085,11984476,15099494,19024170,23968953,30198988, /* 56-63 */
+        14,       18,       22,       28,       36,       45,      57,      72, /*  0- 7 */
+        91,      115,      145,      182,      230,      290,     365,     460, /*  8-15 */
+       580,      731,      921,     1161,     1462,     1843,    2322,    2925, /* 16-23 */
+      3686,     4644,     5851,     7372,     9289,    11703,   14745,   18578, /* 24-31 */
+     23407,    29491,    37156,    46814,    58982,    74313,   93628,  117964, /* 32-39 */
+    148626,   187257,   235929,   297252,   374514,   471859,  594505,  749029, /* 40-47 */
+    943718,  1189010,  1498059,  1887436,  2378021,  2996119, 3774873, 4756042, /* 48-55 */
+   5992238,  7549747,  9512085, 11984476, 15099494, 19024170,23968953,30198988, /* 56-63 */
+  38048341, 47937906, 60397977, 76096683, 95875813,120795955,                   /* 64-69 */
+ 134217727,134217727,134217727,134217727,134217727,134217727,                   /* 70-75 */
+ 134217727,134217727,134217727,134217727,134217727,134217727,                   /* 76-81 */
  };
  
- const uint16_t x262_lambda_tab_exp[QP_MAX_MPEG2+1] = {
-    0,   2,   2,   3,   3,   3,   3,   4, /*  0- 7 */
-    4,   4,   5,   5,   6,   6,   7,   7, /*  8-15 */
-    8,   9,  10,  10,  11,  12,  13,  15, /* 16-23 */
-   16,  17,  19,  21,  23,  25,  27,  29, /* 24-31 */
 +/* lambda = pow(2,qp/8+1) */
- const int x262_lambda2_tab_exp[QP_MAX_MPEG2+1] = {
-       0,   1095,   1303,    1549,    1843,    2191,    2606,    3099, /*  0- 7 */
-    3686,   4383,   5213,    6199,    7372,    8767,   10426,   12399, /*  8-15 */
-   14745,  17535,  20853,   24799,   29491,   35071,   41706,   49598, /* 16-23 */
-   58982,  70142,  83413,   99196,  117964,  140284,  166827,  198392, /* 24-31 */
++const uint16_t x262_lambda_tab_exp[QP_MAX_MAX+1] = {
++    0,    2,    2,    3,    3,    3,    3,    4, /*  0- 7 */
++    4,    4,    5,    5,    6,    6,    7,    7, /*  8-15 */
++    8,    9,   10,   10,   11,   12,   13,   15, /* 16-23 */
++   16,   17,   19,   21,   23,   25,   27,   29, /* 24-31 */
++   32,   35,   38,   41,   45,   49,   54,   59, /* 32-39 */
++   64,   70,   76,   83,   91,   99,  108,  117, /* 40-47 */
++  128,  140,  152,  166,  181,  197,  215,  235, /* 48-55 */
++  256,  279,  304,  332,  362,  395,  431,  470, /* 56-63 */
++  512,  559,  609,  664,  724,  789,  861,  939, /* 64-71 */
++ 1024, 1117, 1218, 1328, 1448, 1579, 1722, 1878, /* 72-79 */
++ 2048, 2233,                                     /* 80-81 */
 +};
 +
 +/* lambda2 = pow(lambda,2) * .9 * 256 */
- const uint16_t x262_lambda_tab_lin[QP_MAX_MPEG2+1] = {
-    0,   3,   3,   4,   4,   5,   5,   6, /*  0- 7 */
-    6,   7,   7,   8,   8,   9,   9,  10, /*  8-15 */
-   10,  11,  11,  12,  12,  13,  13,  14, /* 16-23 */
-   14,  15,  15,  16,  16,  17,  17,  18, /* 24-31 */
++const int x262_lambda2_tab_exp[QP_MAX_MAX+1] = {
++        0,     1095,     1303,     1549,     1843,     2191,    2606,    3099, /*  0- 7 */
++     3686,     4383,     5213,     6199,     7372,     8767,   10426,   12399, /*  8-15 */
++    14745,    17535,    20853,    24799,    29491,    35071,   41706,   49598, /* 16-23 */
++    58982,    70142,    83413,    99196,   117964,   140284,  166827,  198392, /* 24-31 */
++   235930,   280569,   333655,   396785,   471859,   561138,  667310,  793569, /* 32-39 */
++   943718,  1122277,  1334619,  1587139,  1887437,  2244553, 2669239, 3174278, /* 40-47 */
++  3774874,  4489107,  5338477,  6348555,  7549747,  8978213,10676955,12697111, /* 48-55 */
++ 15099494, 17956426, 21353910, 25394221, 30198989, 35912852,42707820,50788443, /* 56-63 */
++ 60397978, 71825705, 85415639,101576886,120795955,134217727,                   /* 64-69 */
++134217727,134217727,134217727,134217727,134217727,134217727,                   /* 70-75 */
++134217727,134217727,134217727,134217727,134217727,134217727,                   /* 76-81 */
 +};
 +
 +/* lambda = qp/2+2 */
- const int x262_lambda2_tab_lin[QP_MAX_MPEG2+1] = {
-       0,   1440,   2073,    2822,    3686,    4665,    5760,    6969, /*  0- 7 */
-    8294,   9734,  11289,   12960,   14745,   16646,   18662,   20793, /*  8-15 */
-   23040,  25401,  27878,   30470,   33177,   36000,   38937,   41990, /* 16-23 */
-   45158,  48441,  51840,   55353,   58982,   62726,   66585,   70560, /* 24-31 */
++const uint16_t x262_lambda_tab_lin[QP_MAX_MAX+1] = {
++  0,   3,   3,   4,   4,   5,   5,   6, /*  0- 7 */
++  6,   7,   7,   8,   8,   9,   9,  10, /*  8-15 */
++ 10,  11,  11,  12,  12,  13,  13,  14, /* 16-23 */
++ 14,  15,  15,  16,  16,  17,  17,  18, /* 24-31 */
++ 18,  19,  19,  20,  20,  21,  21,  22, /* 32-39 */
++ 22,  23,  23,  24,  24,  25,  25,  26, /* 40-47 */
++ 26,  27,  27,  28,  28,  29,  29,  30, /* 48-55 */
++ 30,  31,  31,  32,  32,  33,  33,  34, /* 56-63 */
++ 34,  35,  35,  36,  36,  37,  37,  38, /* 64-71 */
++ 38,  39,  39,  40,  40,  41,  41,  42, /* 72-79 */
++ 42,  43,                               /* 80-81 */
 +};
 +
 +/* lambda2 = pow(lambda,2) * .9 * 256 */
++const int x262_lambda2_tab_lin[QP_MAX_MAX+1] = {
++      0,   1440,   2073,   2822,   3686,   4665,   5760,   6969, /*  0- 7 */
++   8294,   9734,  11289,  12960,  14745,  16646,  18662,  20793, /*  8-15 */
++  23040,  25401,  27878,  30470,  33177,  36000,  38937,  41990, /* 16-23 */
++  45158,  48441,  51840,  55353,  58982,  62726,  66585,  70560, /* 24-31 */
++  74650,  78854,  83174,  87610,  92160,  96826, 101606, 106502, /* 32-39 */
++ 111514, 116640, 121882, 127238, 132710, 138298, 144000, 149818, /* 40-47 */
++ 155750, 161798, 167962, 174240, 180634, 187142, 193766, 200506, /* 48-55 */
++ 207360, 214330, 221414, 228614, 235930, 243360, 250906, 258566, /* 56-63 */
++ 266342, 274264, 282240, 290362, 298598, 306950, 315418, 324000, /* 64-71 */
++ 332698, 341510, 350438, 359482, 368640, 377914, 387302, 396806, /* 72-79 */
++ 406426, 416160,                                                 /* 80-81 */
 +};
 +
  const uint8_t x264_exp2_lut[64] = {
        0,   3,   6,   8,  11,  14,  17,  20,  23,  26,  29,  32,  36,  39,  42,  45,
       48,  52,  55,  58,  62,  65,  69,  72,  76,  80,  83,  87,  91,  94,  98, 102,
@@@ -284,21 -269,16 +329,21 @@@ static UNUSED x264_pthread_mutex_t cost
  
  int x264_analyse_init_costs( x264_t *h, int qp )
  {
 -    int lambda = x264_lambda_tab[qp];
 +    const uint16_t *lambda_tab;
 +    if( MPEG2 )
 +        lambda_tab = h->param.b_nonlinear_quant ? x262_lambda_tab_exp : x262_lambda_tab_lin;
 +    else
 +        lambda_tab = x264_lambda_tab;
 +    int lambda = lambda_tab[qp];
-     if( h->cost_mv[lambda] )
+     if( h->cost_mv[qp] )
          return 0;
      /* factor of 4 from qpel, 2 from sign, and 2 because mv can be opposite from mvp */
-     CHECKED_MALLOC( h->cost_mv[lambda], (4*4*2048 + 1) * sizeof(uint16_t) );
-     h->cost_mv[lambda] += 2*4*2048;
+     CHECKED_MALLOC( h->cost_mv[qp], (4*4*2048 + 1) * sizeof(uint16_t) );
+     h->cost_mv[qp] += 2*4*2048;
      for( int i = 0; i <= 2*4*2048; i++ )
      {
-         h->cost_mv[lambda][-i] =
-         h->cost_mv[lambda][i]  = lambda * (log2f(i+1)*2 + 0.718f + !!i) + .5f;
+         h->cost_mv[qp][-i] =
+         h->cost_mv[qp][i]  = X264_MIN( lambda * (log2f(i+1)*2 + 0.718f + !!i) + .5f, (1<<16)-1 );
      }
      x264_pthread_mutex_lock( &cost_ref_mutex );
      for( int i = 0; i < 3; i++ )
@@@ -363,32 -343,16 +408,29 @@@ void x264_analyse_weight_frame( x264_t 
  /* initialize an array of lambda*nbits for all possible mvs */
  static void x264_mb_analyse_load_costs( x264_t *h, x264_mb_analysis_t *a )
  {
-     a->p_cost_mv = h->cost_mv[a->i_lambda];
-     a->p_cost_ref[0] = x264_cost_ref[a->i_lambda][x264_clip3(h->sh.i_num_ref_idx_l0_active-1,0,2)];
-     a->p_cost_ref[1] = x264_cost_ref[a->i_lambda][x264_clip3(h->sh.i_num_ref_idx_l1_active-1,0,2)];
+     a->p_cost_mv = h->cost_mv[a->i_qp];
+     a->p_cost_ref[0] = x264_cost_ref[a->i_qp][x264_clip3(h->sh.i_num_ref_idx_l0_active-1,0,2)];
+     a->p_cost_ref[1] = x264_cost_ref[a->i_qp][x264_clip3(h->sh.i_num_ref_idx_l1_active-1,0,2)];
  }
  
- static void x264_mb_analyse_init_qp( x264_t *h, x264_mb_analysis_t *a, int i_qp )
+ static void x264_mb_analyse_init_qp( x264_t *h, x264_mb_analysis_t *a, int qp )
  {
-     /* conduct the analysis using this lamda and QP */
-     a->i_qp = h->mb.i_qp = i_qp;
-     h->mb.i_chroma_qp = h->chroma_qp_table[i_qp];
-     a->i_lambda = lambda_tab[i_qp];
-     a->i_lambda2 = lambda2_tab[i_qp];
 +    const uint16_t *lambda_tab;
 +    const int *lambda2_tab;
 +    if( MPEG2 )
 +    {
 +        lambda_tab = h->param.b_nonlinear_quant ? x262_lambda_tab_exp : x262_lambda_tab_lin;
 +        lambda2_tab = h->param.b_nonlinear_quant ? x262_lambda2_tab_exp : x262_lambda2_tab_lin;
 +    }
 +    else
 +    {
 +        lambda_tab = x264_lambda_tab;
 +        lambda2_tab = x264_lambda2_tab;
 +    }
 +
 -    a->i_lambda = x264_lambda_tab[qp];
 -    a->i_lambda2 = x264_lambda2_tab[qp];
+     int effective_chroma_qp = h->chroma_qp_table[SPEC_QP(qp)] + X264_MAX( qp - QP_MAX_SPEC, 0 );
++    a->i_lambda = lambda_tab[qp];
++    a->i_lambda2 = lambda2_tab[qp];
  
      h->mb.b_trellis = h->param.analyse.i_trellis > 1 && a->i_mbrd;
      if( h->param.analyse.i_trellis )
index efc8087,217bfa8..b820e4f
mode 100755,100644..100644
@@@ -593,24 -532,15 +593,21 @@@ static int x264_validate_parameters( x2
      if( h->param.rc.i_rc_method == X264_RC_CQP )
      {
          float qp_p = h->param.rc.i_qp_constant;
 -        float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
 -        float qp_b = qp_p + 6*log2f( h->param.rc.f_pb_factor );
 -        h->param.rc.i_qp_min = x264_clip3( (int)(X264_MIN3( qp_p, qp_i, qp_b )), 0, QP_MAX );
 -        h->param.rc.i_qp_max = x264_clip3( (int)(X264_MAX3( qp_p, qp_i, qp_b ) + .999), 0, QP_MAX );
 +        float stepsize = 6.0;
 +        int qp_max = QP_MAX;
 +        if( MPEG2 )
-         {
 +            stepsize = 8.0;
-             qp_max = QP_MAX_MPEG2;
-         }
 +        float qp_i = qp_p - stepsize*log2f( h->param.rc.f_ip_factor );
 +        float qp_b = qp_p + stepsize*log2f( h->param.rc.f_pb_factor );
 +        h->param.rc.i_qp_min = x264_clip3( (int)(X264_MIN3( qp_p, qp_i, qp_b )), 0, qp_max );
 +        h->param.rc.i_qp_max = x264_clip3( (int)(X264_MAX3( qp_p, qp_i, qp_b ) + .999), 0, qp_max );
          h->param.rc.i_aq_mode = 0;
          h->param.rc.b_mb_tree = 0;
      }
 -    h->param.rc.i_qp_max = x264_clip3( h->param.rc.i_qp_max, 0, QP_MAX );
 -    h->param.rc.i_qp_min = x264_clip3( h->param.rc.i_qp_min, 0, h->param.rc.i_qp_max );
 +
-     h->param.rc.i_qp_max = x264_clip3( h->param.rc.i_qp_max, 1, MPEG2 ? QP_MAX_MPEG2 : QP_MAX );
++    h->param.rc.i_qp_max = x264_clip3( h->param.rc.i_qp_max, 1, MPEG2 ? QP_MAX_SPEC_MPEG2 : QP_MAX );
 +    h->param.rc.i_qp_min = x264_clip3( h->param.rc.i_qp_min, 1, h->param.rc.i_qp_max );
 +
      if( h->param.rc.i_vbv_buffer_size )
      {
          if( h->param.rc.i_rc_method == X264_RC_CQP )
@@@ -1197,15 -1072,12 +1195,15 @@@ x264_t *x264_encoder_open( x264_param_
      if( x264_analyse_init_costs( h, X264_LOOKAHEAD_QP ) )
          goto fail;
  
 -    static const uint16_t cost_mv_correct[7] = { 24, 47, 95, 189, 379, 757, 1515 };
 -    /* Checks for known miscompilation issues. */
 -    if( h->cost_mv[X264_LOOKAHEAD_QP][2013] != cost_mv_correct[BIT_DEPTH-8] )
 +    if( !MPEG2 )
      {
 -        x264_log( h, X264_LOG_ERROR, "MV cost test failed: x264 has been miscompiled!\n" );
 -        goto fail;
 +        static const uint16_t cost_mv_correct[7] = { 24, 47, 95, 189, 379, 757, 1515 };
 +        /* Checks for known miscompilation issues. */
-         if( h->cost_mv[x264_lambda_tab[X264_LOOKAHEAD_QP]][2013] != cost_mv_correct[BIT_DEPTH-8] )
++        if( h->cost_mv[X264_LOOKAHEAD_QP][2013] != cost_mv_correct[BIT_DEPTH-8] )
 +        {
 +            x264_log( h, X264_LOG_ERROR, "MV cost test failed: x264 has been miscompiled!\n" );
 +            goto fail;
 +        }
      }
  
      /* Must be volatile or else GCC will optimize it out. */
index 2b6dfd2,4b9091c..105fe54
mode 100755,100644..100755
  extern const int x264_lambda2_tab[QP_MAX_MAX+1];
  extern const uint16_t x264_lambda_tab[QP_MAX_MAX+1];
  
- extern const int x262_lambda2_tab_exp[QP_MAX_MPEG2+1];
- extern const uint16_t x262_lambda_tab_exp[QP_MAX_MPEG2+1];
- extern const int x262_lambda2_tab_lin[QP_MAX_MPEG2+1];
- extern const uint16_t x262_lambda_tab_lin[QP_MAX_MPEG2+1];
++extern const int x262_lambda2_tab_exp[QP_MAX_MAX+1];
++extern const uint16_t x262_lambda_tab_exp[QP_MAX_MAX+1];
++extern const int x262_lambda2_tab_lin[QP_MAX_MAX+1];
++extern const uint16_t x262_lambda_tab_lin[QP_MAX_MAX+1];
 +
 +
  void x264_rdo_init( void );
  
  int x264_macroblock_probe_skip( x264_t *h, int b_bidir );
index 9dd60d8,553070e..c4f3cb9
mode 100755,100644..100644
@@@ -646,22 -629,15 +646,22 @@@ int x264_ratecontrol_new( x264_t *h 
          rc->last_non_b_pict_type = SLICE_TYPE_I;
      }
  
 -    rc->ip_offset = 6.0 * log2f( h->param.rc.f_ip_factor );
 -    rc->pb_offset = 6.0 * log2f( h->param.rc.f_pb_factor );
 +    float stepsize = 6.0;
 +    float qp_max = QP_MAX;
 +    if( MPEG2 )
 +    {
 +        stepsize = 8.0;
-         qp_max = QP_MAX_MPEG2;
++        qp_max = QP_MAX_SPEC_MPEG2;
 +    }
 +    rc->ip_offset = stepsize * log2f( h->param.rc.f_ip_factor );
 +    rc->pb_offset = stepsize * log2f( h->param.rc.f_pb_factor );
      rc->qp_constant[SLICE_TYPE_P] = h->param.rc.i_qp_constant;
 -    rc->qp_constant[SLICE_TYPE_I] = x264_clip3( h->param.rc.i_qp_constant - rc->ip_offset + 0.5, 0, QP_MAX );
 -    rc->qp_constant[SLICE_TYPE_B] = x264_clip3( h->param.rc.i_qp_constant + rc->pb_offset + 0.5, 0, QP_MAX );
 +    rc->qp_constant[SLICE_TYPE_I] = x264_clip3( h->param.rc.i_qp_constant - rc->ip_offset + 0.5, 0, qp_max );
 +    rc->qp_constant[SLICE_TYPE_B] = x264_clip3( h->param.rc.i_qp_constant + rc->pb_offset + 0.5, 0, qp_max );
      h->mb.ip_offset = rc->ip_offset + 0.5;
  
 -    rc->lstep = pow( 2, h->param.rc.i_qp_step / 6.0 );
 -    rc->last_qscale = qp2qscale( 26 );
 +    rc->lstep = pow( 2, h->param.rc.i_qp_step / stepsize );
 +    rc->last_qscale = qp2qscale( h, 26 );
      int num_preds = h->param.b_sliced_threads * h->param.i_threads + 1;
      CHECKED_MALLOC( rc->pred, 5 * sizeof(predictor_t) * num_preds );
      CHECKED_MALLOC( rc->pred_b_from_p, sizeof(predictor_t) );
@@@ -1466,13 -1441,14 +1466,18 @@@ int x264_ratecontrol_mb_qp( x264_t *h 
  {
      x264_emms();
      float qp = h->rc->qpm;
++    float qp_offset;
      if( h->param.rc.i_aq_mode )
      {
 -         /* MB-tree currently doesn't adjust quantizers in unreferenced frames. */
 -        float qp_offset = h->fdec->b_kept_as_ref ? h->fenc->f_qp_offset[h->mb.i_mb_xy] : h->fenc->f_qp_offset_aq[h->mb.i_mb_xy];
 +        /* MB-tree currently doesn't adjust quantizers in unreferenced frames. */
 +        if( MPEG2 )
-             qp += qptompeg2qp( h, h->fdec->b_kept_as_ref ? h->fenc->f_qp_offset[h->mb.i_mb_xy] : h->fenc->f_qp_offset_aq[h->mb.i_mb_xy] );
++            qp_offset = qptompeg2qp( h, h->fdec->b_kept_as_ref ? h->fenc->f_qp_offset[h->mb.i_mb_xy] : h->fenc->f_qp_offset_aq[h->mb.i_mb_xy] );
 +        else
-             qp += h->fdec->b_kept_as_ref ? h->fenc->f_qp_offset[h->mb.i_mb_xy] : h->fenc->f_qp_offset_aq[h->mb.i_mb_xy];
++            qp_offset = h->fdec->b_kept_as_ref ? h->fenc->f_qp_offset[h->mb.i_mb_xy] : h->fenc->f_qp_offset_aq[h->mb.i_mb_xy];
+         /* Scale AQ's effect towards zero in emergency mode. */
+         if( qp > QP_MAX_SPEC )
+             qp_offset *= (QP_MAX - qp) / (QP_MAX_SPEC - QP_MAX);
+         qp += qp_offset;
      }
      return x264_clip3( qp + .5, h->param.rc.i_qp_min, h->param.rc.i_qp_max );
  }
diff --cc encoder/rdo.c
index 369300c,c59960f..f2d3284
mode 100755,100644..100755
diff --cc encoder/set.c
index 6923faf,ee19574..ac8aacc
mode 100755,100644..100755
@@@ -590,11 -574,11 +593,11 @@@ int x264_sei_version_write( x264_t *h, 
  
      memcpy( payload, uuid, 16 );
      sprintf( payload+16, "x264 - core %d%s - H.264/MPEG-4 AVC codec - "
-              "Copy%s 2003-2010 - http://www.videolan.org/x264.html - options: %s",
+              "Copy%s 2003-2011 - http://www.videolan.org/x264.html - options: %s",
               X264_BUILD, X264_VERSION, HAVE_GPL?"left":"right", opts );
      length = strlen(payload)+1;
 -
 -    x264_sei_write( s, (uint8_t *)payload, length, SEI_USER_DATA_UNREGISTERED );
 +    MPEG2 ? x262_user_data_write( s, (uint8_t *)payload, length ) :
 +                  x264_sei_write( s, (uint8_t *)payload, length, SEI_USER_DATA_UNREGISTERED );
  
      x264_free( opts );
      x264_free( payload );
diff --cc encoder/set.h
index b5e16dc,7fcca13..58e41d8
mode 100755,100644..100755
Simple merge
diff --cc x264.c
index 866f124,c0d7a0f..e12e19b
mode 100755,100644..100755
--- 1/x264.c
--- 2/x264.c
+++ b/x264.c
diff --cc x264.h
index 144ef7e,5234bc0..d7ef585
mode 100755,100644..100755
--- 1/x264.h
--- 2/x264.h
+++ b/x264.h