Merge commit '4a0f6651434c6f213d830140f575b4ec7858519f'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 24 Mar 2014 13:26:17 +0000 (14:26 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 24 Mar 2014 13:26:17 +0000 (14:26 +0100)
* commit '4a0f6651434c6f213d830140f575b4ec7858519f':
  libavcodec: when decoding, copy replaygain side data to decoded frames

Conflicts:
libavcodec/internal.h
libavcodec/rawdec.c
libavcodec/utils.c

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

@@@ -129,6 -102,6 +129,8 @@@ struct AVCodecDefault 
      const uint8_t *value;
  };
  
++extern const uint8_t ff_log2_run[41];
++
  /**
   * Return the hardware accelerated codec for codec codec_id and
   * pixel format pix_fmt.
@@@ -209,21 -150,17 +209,24 @@@ static int raw_decode(AVCodecContext *a
  
      frame->pict_type        = AV_PICTURE_TYPE_I;
      frame->key_frame        = 1;
-     frame->reordered_opaque = avctx->reordered_opaque;
-     frame->pkt_pts          = avctx->internal->pkt->pts;
+     res = ff_decode_frame_props(avctx, frame);
+     if (res < 0)
+         return res;
 -    if (buf_size < context->frame_size - (avctx->pix_fmt == AV_PIX_FMT_PAL8 ?
 -                                          AVPALETTE_SIZE : 0))
 -        return -1;
 +    av_frame_set_pkt_pos     (frame, avctx->internal->pkt->pos);
 +    av_frame_set_pkt_duration(frame, avctx->internal->pkt->duration);
 +
 +    if (context->tff >= 0) {
 +        frame->interlaced_frame = 1;
 +        frame->top_field_first  = context->tff;
 +    }
 +
 +    if ((res = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
 +        return res;
  
      if (need_copy)
 -        frame->buf[0] = av_buffer_alloc(context->frame_size);
 +        frame->buf[0] = av_buffer_alloc(FFMAX(context->frame_size, buf_size));
      else
          frame->buf[0] = av_buffer_ref(avpkt->buf);
      if (!frame->buf[0])
@@@ -827,26 -572,89 +827,58 @@@ static void compat_release_buffer(void 
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
  
 -int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
+ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
+ {
+     AVPacket *pkt = avctx->internal->pkt;
+     uint8_t *packet_sd;
+     int size;
+     AVFrameSideData *frame_sd;
+     frame->reordered_opaque = avctx->reordered_opaque;
+     if (!pkt) {
+         frame->pkt_pts = AV_NOPTS_VALUE;
+         return 0;
+     }
+     frame->pkt_pts = pkt->pts;
+     /* copy the replaygain data to the output frame */
+     packet_sd = av_packet_get_side_data(pkt, AV_PKT_DATA_REPLAYGAIN, &size);
+     if (packet_sd) {
+         frame_sd = av_frame_new_side_data(frame, AV_FRAME_DATA_REPLAYGAIN, size);
+         if (!frame_sd)
+             return AVERROR(ENOMEM);
+         memcpy(frame_sd->data, packet_sd, size);
+     }
+     return 0;
+ }
 +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);
      }
 -
+     ret = ff_decode_frame_props(avctx, frame);
+     if (ret < 0)
+         return ret;
 +    if ((ret = ff_init_buffer_info(avctx, frame)) < 0)
 +        return ret;
  
  #if FF_API_GET_BUFFER
  FF_DISABLE_DEPRECATION_WARNINGS