OSDN Git Service

Merge commit '370ddc7b38d6b27b54fc2f5ee5f3dd9506f8c7c8'
authorClément Bœsch <clement@stupeflix.com>
Mon, 20 Jun 2016 10:35:32 +0000 (12:35 +0200)
committerClément Bœsch <clement@stupeflix.com>
Mon, 20 Jun 2016 10:48:49 +0000 (12:48 +0200)
* commit '370ddc7b38d6b27b54fc2f5ee5f3dd9506f8c7c8':
  h264: remove H264Context.pict_type

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

@@@ -490,9 -436,8 +490,7 @@@ static void decode_postinit(H264Contex
      H264Picture *out = h->cur_pic_ptr;
      H264Picture *cur = h->cur_pic_ptr;
      int i, pics, out_of_order, out_idx;
 -    int invalid = 0, cnt = 0;
  
-     h->cur_pic_ptr->f->pict_type = h->pict_type;
      if (h->next_output_pic)
          return;
  
Simple merge
@@@ -496,37 -466,11 +496,39 @@@ static int h264_frame_start(H264Contex
      pic->f->key_frame = 0;
      pic->mmco_reset  = 0;
      pic->recovered   = 0;
 +    pic->invalid_gap = 0;
 +    pic->sei_recovery_frame_cnt = h->sei.recovery_point.recovery_frame_cnt;
  
 -    if (CONFIG_ERROR_RESILIENCE && h->enable_er)
+     pic->f->pict_type = h->slice_ctx[0].slice_type;
 +    if ((ret = alloc_picture(h, pic)) < 0)
 +        return ret;
 +    if(!h->frame_recovered && !h->avctx->hwaccel
 +#if FF_API_CAP_VDPAU
 +       && !(h->avctx->codec->capabilities & AV_CODEC_CAP_HWACCEL_VDPAU)
 +#endif
 +       )
 +        ff_color_frame(pic->f, c);
 +
 +    h->cur_pic_ptr = pic;
 +    ff_h264_unref_picture(h, &h->cur_pic);
 +    if (CONFIG_ERROR_RESILIENCE) {
 +        ff_h264_set_erpic(&h->slice_ctx[0].er.cur_pic, NULL);
 +    }
 +
 +    if ((ret = ff_h264_ref_picture(h, &h->cur_pic, h->cur_pic_ptr)) < 0)
 +        return ret;
 +
 +    for (i = 0; i < h->nb_slice_ctx; i++) {
 +        h->slice_ctx[i].linesize   = h->cur_pic_ptr->f->linesize[0];
 +        h->slice_ctx[i].uvlinesize = h->cur_pic_ptr->f->linesize[1];
 +    }
 +
 +    if (CONFIG_ERROR_RESILIENCE && h->enable_er) {
          ff_er_frame_start(&h->slice_ctx[0].er);
 +        ff_h264_set_erpic(&h->slice_ctx[0].er.last_pic, NULL);
 +        ff_h264_set_erpic(&h->slice_ctx[0].er.next_pic, NULL);
 +    }
  
      for (i = 0; i < 16; i++) {
          h->block_offset[i]           = (4 * ((scan8[i] - scan8[0]) & 7) << pixel_shift) + 4 * pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
@@@ -1129,21 -976,6 +1131,17 @@@ int ff_h264_decode_slice_header(H264Con
          return AVERROR_INVALIDDATA;
      }
  
-     // to make a few old functions happy, it's wrong though
-     if (!h->setup_finished)
-         h->pict_type = sl->slice_type;
 +    if (h->current_slice == 0 && !h->first_field) {
 +        if (
 +            (h->avctx->skip_frame >= AVDISCARD_NONREF && !h->nal_ref_idc) ||
 +            (h->avctx->skip_frame >= AVDISCARD_BIDIR  && sl->slice_type_nos == AV_PICTURE_TYPE_B) ||
 +            (h->avctx->skip_frame >= AVDISCARD_NONINTRA && sl->slice_type_nos != AV_PICTURE_TYPE_I) ||
 +            (h->avctx->skip_frame >= AVDISCARD_NONKEY && h->nal_unit_type != NAL_IDR_SLICE && h->sei.recovery_point.recovery_frame_cnt < 0) ||
 +            h->avctx->skip_frame >= AVDISCARD_ALL) {
 +            return SLICE_SKIPED;
 +        }
 +    }
 +
      pps_id = get_ue_golomb(&sl->gb);
      if (pps_id >= MAX_PPS_COUNT) {
          av_log(h->avctx, AV_LOG_ERROR, "pps_id %u out of range\n", pps_id);