Merge commit '2d410ebbaa1e760d6837cb434a6d1d4c3c6f0d85'
authorClément Bœsch <clement@stupeflix.com>
Thu, 30 Jun 2016 08:15:51 +0000 (10:15 +0200)
committerClément Bœsch <clement@stupeflix.com>
Thu, 30 Jun 2016 08:15:51 +0000 (10:15 +0200)
* commit '2d410ebbaa1e760d6837cb434a6d1d4c3c6f0d85':
  h264: decode the MMCOs into per-slice contexts

Merged-by: Clément Bœsch <clement@stupeflix.com>
1  2 
libavcodec/h264.h
libavcodec/h264_refs.c
libavcodec/h264_slice.c

Simple merge
@@@ -601,13 -536,16 +601,14 @@@ static int check_opcodes(MMCO *mmco1, M
      return 0;
  }
  
- int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
+ int ff_generate_sliding_window_mmcos(const H264Context *h,
+                                      H264SliceContext *sl)
  {
-     MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp;
+     MMCO *mmco = sl->mmco;
      int nb_mmco = 0, i = 0;
  
 -    assert(h->long_ref_count + h->short_ref_count <= h->ps.sps->ref_frame_count);
 -
      if (h->short_ref_count &&
 -        h->long_ref_count + h->short_ref_count == h->ps.sps->ref_frame_count &&
 +        h->long_ref_count + h->short_ref_count >= h->ps.sps->ref_frame_count &&
          !(FIELD_PICTURE(h) && !h->first_field && h->cur_pic_ptr->reference)) {
          mmco[0].opcode        = MMCO_SHORT2UNUSED;
          mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num;
@@@ -1418,13 -1199,14 +1418,15 @@@ static int h264_slice_header_parse(H264
              h->poc.prev_frame_num++;
              h->poc.prev_frame_num        %= 1 << sps->log2_max_frame_num;
              h->cur_pic_ptr->frame_num = h->poc.prev_frame_num;
 +            h->cur_pic_ptr->invalid_gap = !sps->gaps_in_frame_num_allowed_flag;
              ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 0);
              ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 1);
-             ret = ff_generate_sliding_window_mmcos(h, 1);
+             ret = ff_generate_sliding_window_mmcos(h, sl);
              if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
                  return ret;
-             ret = ff_h264_execute_ref_pic_marking(h, h->mmco, h->nb_mmco);
+             ret = ff_h264_execute_ref_pic_marking(h, sl->mmco, sl->nb_mmco);
              if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
                  return ret;
              /* Error concealment: If a ref is missing, copy the previous ref
          (pps->weighted_bipred_idc == 1 &&
           sl->slice_type_nos == AV_PICTURE_TYPE_B))
          ff_h264_pred_weight_table(&sl->gb, sps, sl->ref_count,
 -                                  sl->slice_type_nos, &sl->pwt);
 +                                  sl->slice_type_nos, &sl->pwt, h->avctx);
  
-     // If frame-mt is enabled, only update mmco tables for the first slice
-     // in a field. Subsequent slices can temporarily clobber h->nb_mmco
-     // or h->mmco, which will cause ref list mix-ups and decoding errors
-     // further down the line. This may break decoding if the first slice is
-     // corrupt, thus we only do this if frame-mt is enabled.
      if (h->nal_ref_idc) {
-         ret = ff_h264_decode_ref_pic_marking(h, &sl->gb,
-                                              !(h->avctx->active_thread_type & FF_THREAD_FRAME) ||
-                                              h->current_slice == 0);
+         ret = ff_h264_decode_ref_pic_marking(h, sl, &sl->gb);
          if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
              return AVERROR_INVALIDDATA;
      }
@@@ -1672,9 -1434,9 +1667,9 @@@ int ff_h264_decode_slice_header(H264Con
                                   FIELD_OR_MBAFF_PICTURE(h);
      if (h->picture_structure == PICT_BOTTOM_FIELD)
          sl->resync_mb_y = sl->mb_y = sl->mb_y + 1;
 -    assert(sl->mb_y < h->mb_height);
 +    av_assert1(sl->mb_y < h->mb_height);
  
-     if (!h->setup_finished)
+     if (!h->setup_finished) {
          ff_h264_init_poc(h->cur_pic_ptr->field_poc, &h->cur_pic_ptr->poc,
                           h->ps.sps, &h->poc, h->picture_structure, h->nal_ref_idc);