Merge commit 'f7e85ee996b3886c2b13e928b83277382311af96'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 20 Jan 2014 14:07:45 +0000 (15:07 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 20 Jan 2014 14:07:45 +0000 (15:07 +0100)
* commit 'f7e85ee996b3886c2b13e928b83277382311af96':
  lavc: allow the caller to override dimensions in ff_get_buffer()

Conflicts:
libavcodec/utils.c

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

@@@ -747,63 -542,6 +747,61 @@@ FF_ENABLE_DEPRECATION_WARNING
      }
  }
  
-         frame->width  = FFMAX(avctx->width,  FF_CEIL_RSHIFT(avctx->coded_width,  avctx->lowres));
-         frame->height = FFMAX(avctx->height, FF_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
 +int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
 +{
 +    if (avctx->internal->pkt) {
 +        frame->pkt_pts = avctx->internal->pkt->pts;
 +        av_frame_set_pkt_pos     (frame, avctx->internal->pkt->pos);
 +        av_frame_set_pkt_duration(frame, avctx->internal->pkt->duration);
 +        av_frame_set_pkt_size    (frame, avctx->internal->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) {
 +    case AVMEDIA_TYPE_VIDEO:
 +        if (frame->format < 0)
 +            frame->format              = avctx->pix_fmt;
 +        if (!frame->sample_aspect_ratio.num)
 +            frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
 +        if (av_frame_get_colorspace(frame) == AVCOL_SPC_UNSPECIFIED)
 +            av_frame_set_colorspace(frame, avctx->colorspace);
 +        if (av_frame_get_color_range(frame) == AVCOL_RANGE_UNSPECIFIED)
 +            av_frame_set_color_range(frame, avctx->color_range);
 +        break;
 +    case AVMEDIA_TYPE_AUDIO:
 +        if (!frame->sample_rate)
 +            frame->sample_rate    = avctx->sample_rate;
 +        if (frame->format < 0)
 +            frame->format         = avctx->sample_fmt;
 +        if (!frame->channel_layout) {
 +            if (avctx->channel_layout) {
 +                 if (av_get_channel_layout_nb_channels(avctx->channel_layout) !=
 +                     avctx->channels) {
 +                     av_log(avctx, AV_LOG_ERROR, "Inconsistent channel "
 +                            "configuration.\n");
 +                     return AVERROR(EINVAL);
 +                 }
 +
 +                frame->channel_layout = avctx->channel_layout;
 +            } else {
 +                if (avctx->channels > FF_SANE_NB_CHANNELS) {
 +                    av_log(avctx, AV_LOG_ERROR, "Too many channels: %d.\n",
 +                           avctx->channels);
 +                    return AVERROR(ENOSYS);
 +                }
 +            }
 +        }
 +        av_frame_set_channels(frame, avctx->channels);
 +        break;
 +    }
 +    return 0;
 +}
 +
  #if FF_API_GET_BUFFER
  FF_DISABLE_DEPRECATION_WARNINGS
  int avcodec_default_get_buffer(AVCodecContext *avctx, AVFrame *frame)
@@@ -832,18 -570,59 +830,26 @@@ static void compat_release_buffer(void 
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
  
 -int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 +static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
  {
+     int override_dimensions = 1;
      int ret;
  
 -    switch (avctx->codec_type) {
 -    case AVMEDIA_TYPE_VIDEO:
 +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
 +        if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0 || avctx->pix_fmt<0) {
 +            av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
 +            return AVERROR(EINVAL);
 +        }
 +    }
++    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+         if (frame->width <= 0 || frame->height <= 0) {
 -            frame->width  = FFMAX(avctx->width, avctx->coded_width);
 -            frame->height = FFMAX(avctx->height, avctx->coded_height);
++            frame->width  = FFMAX(avctx->width,  FF_CEIL_RSHIFT(avctx->coded_width,  avctx->lowres));
++            frame->height = FFMAX(avctx->height, FF_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
+             override_dimensions = 0;
+         }
 -        if (frame->format < 0)
 -            frame->format              = avctx->pix_fmt;
 -        if (!frame->sample_aspect_ratio.num)
 -            frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
 -
 -        if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
 -            return ret;
 -        break;
 -    case AVMEDIA_TYPE_AUDIO:
 -        if (!frame->sample_rate)
 -            frame->sample_rate    = avctx->sample_rate;
 -        if (frame->format < 0)
 -            frame->format         = avctx->sample_fmt;
 -        if (!frame->channel_layout) {
 -            if (avctx->channel_layout) {
 -                 if (av_get_channel_layout_nb_channels(avctx->channel_layout) !=
 -                     avctx->channels) {
 -                     av_log(avctx, AV_LOG_ERROR, "Inconsistent channel "
 -                            "configuration.\n");
 -                     return AVERROR(EINVAL);
 -                 }
 -
 -                frame->channel_layout = avctx->channel_layout;
 -            } else {
 -                if (avctx->channels > FF_SANE_NB_CHANNELS) {
 -                    av_log(avctx, AV_LOG_ERROR, "Too many channels: %d.\n",
 -                           avctx->channels);
 -                    return AVERROR(ENOSYS);
 -                }
 -
 -                frame->channel_layout = av_get_default_channel_layout(avctx->channels);
 -                if (!frame->channel_layout)
 -                    frame->channel_layout = (1ULL << avctx->channels) - 1;
 -            }
 -        }
 -        break;
 -    default: return AVERROR(EINVAL);
+     }
 -
 -    frame->pkt_pts = avctx->internal->pkt ? avctx->internal->pkt->pts : AV_NOPTS_VALUE;
 -    frame->reordered_opaque = avctx->reordered_opaque;
 +    if ((ret = ff_init_buffer_info(avctx, frame)) < 0)
 +        return ret;
  
  #if FF_API_GET_BUFFER
  FF_DISABLE_DEPRECATION_WARNINGS