Merge commit 'a1ee1648690726b34e98eaf8db04fd7b3303cfc8'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Dec 2013 16:48:24 +0000 (17:48 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Dec 2013 16:48:24 +0000 (17:48 +0100)
* commit 'a1ee1648690726b34e98eaf8db04fd7b3303cfc8':
  lavc/decode_video(): always unref the frame if there is no output in decode_video

Conflicts:
libavcodec/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/utils.c

@@@ -2049,50 -1398,24 +2049,47 @@@ int attribute_align_arg avcodec_decode_
          av_frame_unref(&avci->to_free);
  
      if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {
 +        int did_split = av_packet_split_side_data(&tmp);
 +        ret = apply_param_change(avctx, &tmp);
 +        if (ret < 0) {
 +            av_log(avctx, AV_LOG_ERROR, "Error applying parameter changes.\n");
 +            if (avctx->err_recognition & AV_EF_EXPLODE)
 +                goto fail;
 +        }
 +
 +        avctx->internal->pkt = &tmp;
          if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
              ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,
 -                                         avpkt);
 +                                         &tmp);
          else {
              ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
 -                                       avpkt);
 +                                       &tmp);
              picture->pkt_dts = avpkt->dts;
 +
 +            if(!avctx->has_b_frames){
 +                av_frame_set_pkt_pos(picture, avpkt->pos);
 +            }
 +            //FIXME these should be under if(!avctx->has_b_frames)
              /* get_buffer is supposed to set frame parameters */
              if (!(avctx->codec->capabilities & CODEC_CAP_DR1)) {
 -                picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
 -                picture->width               = avctx->width;
 -                picture->height              = avctx->height;
 -                picture->format              = avctx->pix_fmt;
 +                if (!picture->sample_aspect_ratio.num)    picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
 +                if (!picture->width)                      picture->width               = avctx->width;
 +                if (!picture->height)                     picture->height              = avctx->height;
 +                if (picture->format == AV_PIX_FMT_NONE)   picture->format              = avctx->pix_fmt;
              }
          }
 +        add_metadata_from_side_data(avctx, picture);
  
 +fail:
          emms_c(); //needed to avoid an emms_c() call before every return;
  
-         if (ret < 0 && picture->buf[0])
-             av_frame_unref(picture);
 +        avctx->internal->pkt = NULL;
 +        if (did_split) {
 +            av_packet_free_side_data(&tmp);
 +            if(ret == tmp.size)
 +                ret = avpkt->size;
 +        }
 +
          if (*got_picture_ptr) {
              if (!avctx->refcounted_frames) {
                  avci->to_free = *picture;
              }
  
              avctx->frame_number++;
-         }
 +            av_frame_set_best_effort_timestamp(picture,
 +                                               guess_correct_pts(avctx,
 +                                                                 picture->pkt_pts,
 +                                                                 picture->pkt_dts));
+         } else
+             av_frame_unref(picture);
      } else
          ret = 0;