Index: media/filters/gpu_video_decoder.cc |
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc |
index 092e1278c66603284bc1267a9a24f65f55030afd..d59364b835f204b0fd82feb33d045396c3a5a1d7 100644 |
--- a/media/filters/gpu_video_decoder.cc |
+++ b/media/filters/gpu_video_decoder.cc |
@@ -42,8 +42,9 @@ GpuVideoDecoder::BufferPair::BufferPair( |
GpuVideoDecoder::BufferPair::~BufferPair() {} |
GpuVideoDecoder::BufferData::BufferData( |
- int32 bbid, base::TimeDelta ts, const gfx::Size& ns) |
- : bitstream_buffer_id(bbid), timestamp(ts), natural_size(ns) { |
+ int32 bbid, base::TimeDelta ts, const gfx::Rect& vr, const gfx::Size& ns) |
+ : bitstream_buffer_id(bbid), timestamp(ts), visible_rect(vr), |
+ natural_size(ns) { |
} |
GpuVideoDecoder::BufferData::~BufferData() {} |
@@ -325,6 +326,7 @@ void GpuVideoDecoder::RecordBufferData( |
const BitstreamBuffer& bitstream_buffer, const Buffer& buffer) { |
input_buffer_data_.push_front(BufferData( |
bitstream_buffer.id(), buffer.GetTimestamp(), |
+ demuxer_stream_->video_decoder_config().visible_rect(), |
demuxer_stream_->video_decoder_config().natural_size())); |
// Why this value? Because why not. avformat.h:MAX_REORDER_DELAY is 16, but |
// that's too small for some pathological B-frame test videos. The cost of |
@@ -337,6 +339,7 @@ void GpuVideoDecoder::RecordBufferData( |
} |
void GpuVideoDecoder::GetBufferData(int32 id, base::TimeDelta* timestamp, |
+ gfx::Rect* visible_rect, |
gfx::Size* natural_size) { |
for (std::list<BufferData>::const_iterator it = |
input_buffer_data_.begin(); it != input_buffer_data_.end(); |
@@ -344,6 +347,7 @@ void GpuVideoDecoder::GetBufferData(int32 id, base::TimeDelta* timestamp, |
if (it->bitstream_buffer_id != id) |
continue; |
*timestamp = it->timestamp; |
+ *visible_rect = it->visible_rect; |
*natural_size = it->natural_size; |
return; |
} |
@@ -425,16 +429,19 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) { |
// Update frame's timestamp. |
base::TimeDelta timestamp; |
+ gfx::Rect visible_rect; |
gfx::Size natural_size; |
- GetBufferData(picture.bitstream_buffer_id(), ×tamp, &natural_size); |
+ GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect, |
+ &natural_size); |
DCHECK(decoder_texture_target_); |
- scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture( |
- pb.texture_id(), decoder_texture_target_, pb.size(), natural_size, |
- timestamp, |
- base::Bind(&Factories::ReadPixels, factories_, pb.texture_id(), |
- decoder_texture_target_, pb.size()), |
- base::Bind(&GpuVideoDecoder::ReusePictureBuffer, this, |
- picture.picture_buffer_id()))); |
+ scoped_refptr<VideoFrame> frame( |
+ VideoFrame::WrapNativeTexture( |
+ pb.texture_id(), decoder_texture_target_, pb.size(), visible_rect, |
+ natural_size, timestamp, |
+ base::Bind(&Factories::ReadPixels, factories_, pb.texture_id(), |
+ decoder_texture_target_, pb.size()), |
+ base::Bind(&GpuVideoDecoder::ReusePictureBuffer, this, |
+ picture.picture_buffer_id()))); |
EnqueueFrameAndTriggerFrameDelivery(frame); |
} |