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

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: Ifdefed 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..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(), &timestamp, &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));

Powered by Google App Engine
This is Rietveld 408576698