Chromium Code Reviews| Index: media/filters/ffmpeg_video_decoder.cc |
| diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc |
| index 12980c1b83c8c7c28846f7fdc1d2e072bd9d464c..c8b56c22f9ca6cf47262b4216980eeb280dc5758 100644 |
| --- a/media/filters/ffmpeg_video_decoder.cc |
| +++ b/media/filters/ffmpeg_video_decoder.cc |
| @@ -72,8 +72,8 @@ int FFmpegVideoDecoder::GetVideoBuffer(AVCodecContext* codec_context, |
| format == VideoFrame::YV12J); |
| gfx::Size size(codec_context->width, codec_context->height); |
| - int ret; |
| - if ((ret = av_image_check_size(size.width(), size.height(), 0, NULL)) < 0) |
| + const int ret = av_image_check_size(size.width(), size.height(), 0, NULL); |
| + if (ret < 0) |
|
scherkus (not reviewing)
2014/05/07 03:04:31
intentional change / cleanup?
DaleCurtis
2014/05/07 03:34:19
Yes, we don't use this type of expression regularl
|
| return ret; |
| gfx::Size natural_size; |
| @@ -85,12 +85,22 @@ int FFmpegVideoDecoder::GetVideoBuffer(AVCodecContext* codec_context, |
| natural_size = config_.natural_size(); |
| } |
| - if (!VideoFrame::IsValidConfig(format, size, gfx::Rect(size), natural_size)) |
| + // FFmpeg has specific requirements on the allocation size of the frame. The |
| + // following logic replicates FFMpeg's allocation strategy to ensure buffers |
|
scherkus (not reviewing)
2014/05/07 03:04:31
nit: s/FFMpeg/FFmpeg/
DaleCurtis
2014/05/07 03:34:19
Done.
|
| + // are not overread / overwritten. See ff_init_buffer_info() for details. |
| + // |
| + // When lowres is non-zero, dimensions should be divided by 2^(lowres), but |
| + // since we don't use this, just DCHECK that it's zero. |
| + DCHECK_EQ(codec_context->lowres, 0); |
| + gfx::Size coded_size(std::max(size.width(), codec_context->coded_width), |
| + std::max(size.height(), codec_context->coded_height)); |
| + |
| + if (!VideoFrame::IsValidConfig( |
| + format, coded_size, gfx::Rect(size), natural_size)) |
| return AVERROR(EINVAL); |
| - scoped_refptr<VideoFrame> video_frame = |
| - frame_pool_.CreateFrame(format, size, gfx::Rect(size), |
| - natural_size, kNoTimestamp()); |
| + scoped_refptr<VideoFrame> video_frame = frame_pool_.CreateFrame( |
| + format, coded_size, gfx::Rect(size), natural_size, kNoTimestamp()); |
| for (int i = 0; i < 3; i++) { |
| frame->base[i] = video_frame->data(i); |
| @@ -101,8 +111,8 @@ int FFmpegVideoDecoder::GetVideoBuffer(AVCodecContext* codec_context, |
| frame->opaque = NULL; |
| video_frame.swap(reinterpret_cast<VideoFrame**>(&frame->opaque)); |
| frame->type = FF_BUFFER_TYPE_USER; |
| - frame->width = codec_context->width; |
| - frame->height = codec_context->height; |
| + frame->width = coded_size.width(); |
| + frame->height = coded_size.height(); |
| frame->format = codec_context->pix_fmt; |
| return 0; |