Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Unified Diff: media/filters/ffmpeg_video_decoder.cc

Issue 270193002: Replicate FFmpeg's video frame allocation strategy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/ffmpeg/ffmpeg_regression_tests.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..bc2346ddf8843526fde8ae980e847488e7ba0b13 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)
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
+ // 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;
« no previous file with comments | « media/ffmpeg/ffmpeg_regression_tests.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698