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..aefb758bae3ac32bfb0ab08e8b248a2bb19c80a3 100644 |
--- a/media/filters/gpu_video_decoder.cc |
+++ b/media/filters/gpu_video_decoder.cc |
@@ -368,9 +368,13 @@ void GpuVideoDecoder::ProvidePictureBuffers(uint32 count, |
} |
std::vector<uint32> texture_ids; |
+ std::vector<gpu::Mailbox> texture_mailboxes; |
decoder_texture_target_ = texture_target; |
- if (!factories_->CreateTextures( |
- count, size, &texture_ids, decoder_texture_target_)) { |
+ if (!factories_->CreateTextures(count, |
+ size, |
+ &texture_ids, |
+ &texture_mailboxes, |
+ decoder_texture_target_)) { |
NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); |
return; |
} |
@@ -384,7 +388,7 @@ void GpuVideoDecoder::ProvidePictureBuffers(uint32 count, |
std::vector<PictureBuffer> picture_buffers; |
for (size_t i = 0; i < texture_ids.size(); ++i) { |
picture_buffers.push_back(PictureBuffer( |
- next_picture_buffer_id_++, size, texture_ids[i])); |
+ next_picture_buffer_id_++, size, texture_ids[i], texture_mailboxes[i])); |
bool inserted = picture_buffers_in_decoder_.insert(std::make_pair( |
picture_buffers.back().id(), picture_buffers.back())).second; |
DCHECK(inserted); |
@@ -432,15 +436,28 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) { |
GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect, |
&natural_size); |
DCHECK(decoder_texture_target_); |
+ |
+#ifdef VIDEO_FRAME_MAILBOX |
+ uint32 sync_point = factories_->ProduceTextureToMailbox( |
+ pb.texture_mailbox(), pb.texture_id()); |
+#endif |
+ |
scoped_refptr<VideoFrame> frame( |
VideoFrame::WrapNativeTexture( |
- pb.texture_id(), decoder_texture_target_, pb.size(), visible_rect, |
+#ifdef VIDEO_FRAME_MAILBOX |
+ pb.texture_mailbox(), sync_point, |
+#else |
+ pb.texture_id(), |
+#endif |
+ 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()), |
+ base::Closure())); |
CHECK_GT(available_pictures_, 0); |
available_pictures_--; |
@@ -468,10 +485,14 @@ void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( |
ready_video_frames_.pop_front(); |
} |
-void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id) { |
+void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id, |
+ uint32 sync_point) { |
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, |
+ sync_point)); |
return; |
} |
CHECK_GE(available_pictures_, 0); |
@@ -479,6 +500,21 @@ 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; |
+ } |
+#ifdef VIDEO_FRAME_MAILBOX |
+ const PictureBuffer& pb = it->second; |
+ factories_->ConsumeMailboxToTexture(pb.texture_mailbox(), |
+ pb.texture_id(), |
+ sync_point); |
+#endif |
+ |
vda_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
&VideoDecodeAccelerator::ReusePictureBuffer, weak_vda_, |
picture_buffer_id)); |