Index: media/filters/gpu_video_decoder.cc |
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc |
index b74ba5ba82e5c8a2563b6b7f84459d7402b24c55..ff713c801ea37771d5f87a508ed73fd8ac9751d5 100644 |
--- a/media/filters/gpu_video_decoder.cc |
+++ b/media/filters/gpu_video_decoder.cc |
@@ -432,15 +432,20 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) { |
GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect, |
&natural_size); |
DCHECK(decoder_texture_target_); |
+ |
+ gpu::Mailbox mailbox = factories_->ProduceTextureToMailbox(pb.texture_id()); |
piman
2013/04/11 22:57:58
The first time you produce (or when you consume),
danakj
2013/04/12 00:01:39
Oh okay. I had in my head that Gen and Produce are
|
+ |
scoped_refptr<VideoFrame> frame( |
VideoFrame::WrapNativeTexture( |
- pb.texture_id(), decoder_texture_target_, pb.size(), visible_rect, |
+ mailbox, decoder_texture_target_, |
+ pb.size(), visible_rect, |
natural_size, timestamp, |
base::Bind(&Factories::ReadPixels, factories_, pb.texture_id(), |
decoder_texture_target_, |
gfx::Size(visible_rect.width(), visible_rect.height())), |
base::Bind(&GpuVideoDecoder::ReusePictureBuffer, this, |
- picture.picture_buffer_id()))); |
+ picture.picture_buffer_id(), |
+ mailbox))); |
CHECK_GT(available_pictures_, 0); |
available_pictures_--; |
@@ -468,10 +473,14 @@ void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( |
ready_video_frames_.pop_front(); |
} |
-void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id) { |
+void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id, |
+ gpu::Mailbox mailbox) { |
if (!gvd_loop_proxy_->BelongsToCurrentThread()) { |
gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
- &GpuVideoDecoder::ReusePictureBuffer, this, picture_buffer_id)); |
+ &GpuVideoDecoder::ReusePictureBuffer, |
+ this, |
+ picture_buffer_id, |
+ mailbox)); |
return; |
} |
CHECK_GE(available_pictures_, 0); |
@@ -479,6 +488,17 @@ void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id) { |
if (!vda_.get()) |
return; |
+ |
+ std::map<int32, PictureBuffer>::iterator it = |
+ picture_buffers_in_decoder_.find(picture_buffer_id); |
+ if (it == picture_buffers_in_decoder_.end()) { |
+ NOTREACHED() << "Missing picture buffer: " << picture_buffer_id; |
+ NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); |
+ return; |
+ } |
+ const PictureBuffer& pb = it->second; |
+ factories_->ConsumeMailboxToTexture(mailbox, pb.texture_id()); |
+ |
vda_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
&VideoDecodeAccelerator::ReusePictureBuffer, weak_vda_, |
picture_buffer_id)); |