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

Unified Diff: media/filters/gpu_video_decoder.cc

Issue 14199002: Send hardware video frames with mailboxes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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
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(), &timestamp, &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));

Powered by Google App Engine
This is Rietveld 408576698