Merge commit 'a7f46586bf47174b5fa00a905b767b1781ec8b72'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 19 Apr 2013 19:40:46 +0000 (21:40 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 19 Apr 2013 19:49:29 +0000 (21:49 +0200)
* commit 'a7f46586bf47174b5fa00a905b767b1781ec8b72':
  ff_get_buffer(): allocate the frame for max(coded,display) dimensions

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

@@@ -604,27 -523,40 +604,25 @@@ int avcodec_default_get_buffer2(AVCodec
      }
  }
  
 -#if FF_API_GET_BUFFER
 -int avcodec_default_get_buffer(AVCodecContext *avctx, AVFrame *frame)
 -{
 -    return avcodec_default_get_buffer2(avctx, frame, 0);
 -}
 -
 -typedef struct CompatReleaseBufPriv {
 -    AVCodecContext avctx;
 -    AVFrame frame;
 -} CompatReleaseBufPriv;
 -
 -static void compat_free_buffer(void *opaque, uint8_t *data)
 -{
 -    CompatReleaseBufPriv *priv = opaque;
 -    if (priv->avctx.release_buffer)
 -        priv->avctx.release_buffer(&priv->avctx, &priv->frame);
 -    av_freep(&priv);
 -}
 -
 -static void compat_release_buffer(void *opaque, uint8_t *data)
 -{
 -    AVBufferRef *buf = opaque;
 -    av_buffer_unref(&buf);
 -}
 -#endif
 -
 -int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 +int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
  {
 -    int ret;
 +    if (avctx->pkt) {
 +        frame->pkt_pts = avctx->pkt->pts;
 +        av_frame_set_pkt_pos     (frame, avctx->pkt->pos);
 +        av_frame_set_pkt_duration(frame, avctx->pkt->duration);
 +        av_frame_set_pkt_size    (frame, avctx->pkt->size);
 +    } else {
 +        frame->pkt_pts = AV_NOPTS_VALUE;
 +        av_frame_set_pkt_pos     (frame, -1);
 +        av_frame_set_pkt_duration(frame, 0);
 +        av_frame_set_pkt_size    (frame, -1);
 +    }
 +    frame->reordered_opaque = avctx->reordered_opaque;
  
 -    switch (avctx->codec_type) {
 +    switch (avctx->codec->type) {
      case AVMEDIA_TYPE_VIDEO:
-         if (!frame->width)
-             frame->width               = avctx->width;
-         if (!frame->height)
-             frame->height              = avctx->height;
+         frame->width  = FFMAX(avctx->width, avctx->coded_width);
+         frame->height = FFMAX(avctx->height, avctx->coded_height);
          if (frame->format < 0)
              frame->format              = avctx->pix_fmt;
          if (!frame->sample_aspect_ratio.num)
@@@ -809,18 -713,17 +810,25 @@@ fail
      }
  #endif
  
-     return avctx->get_buffer2(avctx, frame, flags);
+     ret = avctx->get_buffer2(avctx, frame, flags);
+     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+         frame->width  = avctx->width;
+         frame->height = avctx->height;
+     }
+     return ret;
  }
  
 -int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
 +int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 +{
 +    int ret = get_buffer_internal(avctx, frame, flags);
 +    if (ret < 0)
 +        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +    return ret;
 +}
 +
 +static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
  {
      AVFrame tmp;
      int ret;