Merge commit 'd231e84b06a9964c840cff4e228509f706165fb6'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 21 Mar 2015 12:24:23 +0000 (13:24 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 21 Mar 2015 12:24:23 +0000 (13:24 +0100)
* commit 'd231e84b06a9964c840cff4e228509f706165fb6':
  h264: move the quantizers into the per-slice context

Conflicts:
libavcodec/dxva2_h264.c
libavcodec/h264_cavlc.c
libavcodec/h264_loopfilter.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/dxva2_h264.c
libavcodec/h264.h
libavcodec/h264_cabac.c
libavcodec/h264_cavlc.c
libavcodec/h264_loopfilter.c
libavcodec/h264_mb.c
libavcodec/h264_mb_template.c
libavcodec/h264_mvpred.h
libavcodec/h264_slice.c
libavcodec/svq3.c
libavcodec/vaapi_h264.c

@@@ -275,8 -275,8 +275,8 @@@ static void fill_slice_long(AVCodecCont
              }
          }
      }
 -    slice->slice_qs_delta    = 0; /* XXX not implemented by Libav */
 +    slice->slice_qs_delta    = 0; /* XXX not implemented by FFmpeg */
-     slice->slice_qp_delta    = h->qscale - h->pps.init_qp;
+     slice->slice_qp_delta    = sl->qscale - h->pps.init_qp;
      slice->redundant_pic_cnt = h->redundant_pic_count;
      if (h->slice_type == AV_PICTURE_TYPE_B)
          slice->direct_spatial_mv_pred_flag = h->direct_spatial_mv_pred;
@@@ -870,11 -811,11 +871,11 @@@ int ff_h264_decode_mb_cavlc(H264Contex
   * Decode a CABAC coded macroblock
   * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR on error
   */
- int ff_h264_decode_mb_cabac(H264Context *h);
+ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl);
  
- void ff_h264_init_cabac_states(H264Context *h);
+ void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl);
  
 -void h264_init_dequant_tables(H264Context *h);
 +void ff_h264_init_dequant_tables(H264Context *h);
  
  void ff_h264_direct_dist_scale_factor(H264Context *const h);
  void ff_h264_direct_ref_list_init(H264Context *const h);
Simple merge
@@@ -1123,15 -1111,13 +1124,15 @@@ decode_intra_mb
          }
          h->cbp_table[mb_xy] |= ret << 12;
          if (CHROMA444(h)) {
-             if( decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ){
+             if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ) {
                  return -1;
              }
-             if( decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ){
+             if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ) {
                  return -1;
              }
 -        } else if (CHROMA422(h)) {
 +        } else {
 +            const int num_c8x8 = h->sps.chroma_format_idc;
 +
              if(cbp&0x30){
                  for(chroma_idx=0; chroma_idx<2; chroma_idx++)
                      if (decode_residual(h, gb, h->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
  
              if(cbp&0x20){
                  for(chroma_idx=0; chroma_idx<2; chroma_idx++){
-                     const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]];
+                     const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]];
                      int16_t *mb = h->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
 -                    for (i8x8 = 0; i8x8 < 2; i8x8++) {
 +                    for (i8x8 = 0; i8x8<num_c8x8; i8x8++) {
                          for (i4x4 = 0; i4x4 < 4; i4x4++) {
                              const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
                              if (decode_residual(h, gb, mb, index, scan + 1, qmul, 15) < 0)
@@@ -413,10 -415,14 +413,14 @@@ static av_always_inline void h264_filte
      }
  }
  
- void ff_h264_filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) {
+ void ff_h264_filter_mb_fast(H264Context *h, H264SliceContext *sl,
+                             int mb_x, int mb_y, uint8_t *img_y,
+                             uint8_t *img_cb, uint8_t *img_cr,
+                             unsigned int linesize, unsigned int uvlinesize)
+ {
 -    assert(!FRAME_MBAFF(h));
 +    av_assert2(!FRAME_MBAFF(h));
      if(!h->h264dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff) {
-         ff_h264_filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize);
+         ff_h264_filter_mb(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize);
          return;
      }
  
@@@ -578,11 -591,9 +589,11 @@@ static av_always_inline void filter_mb_
              // value in IPCM macroblocks.
              if(bS[0]+bS[1]+bS[2]+bS[3]){
                  qp = (h->cur_pic.qscale_table[mb_xy] + h->cur_pic.qscale_table[mbm_xy] + 1) >> 1;
 +                //tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], h->cur_pic.qscale_table[mbn_xy]);
                  tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
-                 chroma_qp_avg[0] = (h->chroma_qp[0] + get_chroma_qp(h, 0, h->cur_pic.qscale_table[mbm_xy]) + 1) >> 1;
-                 chroma_qp_avg[1] = (h->chroma_qp[1] + get_chroma_qp(h, 1, h->cur_pic.qscale_table[mbm_xy]) + 1) >> 1;
 +                //{ int i; for (i = 0; i < 4; i++) tprintf(h->avctx, " bS[%d]:%d", i, bS[i]); tprintf(h->avctx, "\n"); }
+                 chroma_qp_avg[0] = (sl->chroma_qp[0] + get_chroma_qp(h, 0, h->cur_pic.qscale_table[mbm_xy]) + 1) >> 1;
+                 chroma_qp_avg[1] = (sl->chroma_qp[1] + get_chroma_qp(h, 1, h->cur_pic.qscale_table[mbm_xy]) + 1) >> 1;
                  if( dir == 0 ) {
                      filter_mb_edgev( &img_y[0], linesize, bS, qp, a, b, h, 1 );
                      if (chroma) {
Simple merge
Simple merge
Simple merge
@@@ -2453,14 -2221,12 +2453,14 @@@ static int decode_slice(struct AVCodecC
                  er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x - 1,
                               h->mb_y, ER_MB_END);
                  if (h->mb_x >= lf_x_start)
-                     loop_filter(h, lf_x_start, h->mb_x + 1);
+                     loop_filter(h, sl, lf_x_start, h->mb_x + 1);
                  return 0;
              }
 -            if (ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
 +            if (h->cabac.bytestream > h->cabac.bytestream_end + 2 )
 +                av_log(h->avctx, AV_LOG_DEBUG, "bytestream overread %"PTRDIFF_SPECIFIER"\n", h->cabac.bytestream_end - h->cabac.bytestream);
 +            if (ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 4) {
                  av_log(h->avctx, AV_LOG_ERROR,
 -                       "error while decoding MB %d %d, bytestream %td\n",
 +                       "error while decoding MB %d %d, bytestream %"PTRDIFF_SPECIFIER"\n",
                         h->mb_x, h->mb_y,
                         h->cabac.bytestream_end - h->cabac.bytestream);
                  er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x,
Simple merge
Simple merge