Index: media/filters/gpu_video_decoder.cc |
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc |
index 54845214bb138195a69ba075b5582318230d2f2f..b6aef79135bf5672b1b988143ed691a580e5760e 100644 |
--- a/media/filters/gpu_video_decoder.cc |
+++ b/media/filters/gpu_video_decoder.cc |
@@ -154,7 +154,8 @@ void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config, |
BindToCurrentLoop(orig_status_cb)); |
bool previously_initialized = config_.IsValidConfig(); |
-#if !defined(OS_CHROMEOS) && !defined(OS_WIN) |
+#if !defined(OS_CHROMEOS) && !defined(OS_WIN) && \ |
+ !(defined(OS_LINUX) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)) |
if (previously_initialized) { |
// TODO(xhwang): Make GpuVideoDecoder reinitializable. |
// See http://crbug.com/233608 |
@@ -424,27 +425,21 @@ void GpuVideoDecoder::DismissPictureBuffer(int32 id) { |
static void ReadPixelsSyncInner( |
const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories, |
- uint32 texture_id, |
- const gfx::Rect& visible_rect, |
+ const scoped_refptr<VideoFrame>& frame, |
const SkBitmap& pixels, |
base::WaitableEvent* event) { |
- factories->ReadPixels(texture_id, visible_rect, pixels); |
+ factories->ReadPixels(frame, pixels); |
event->Signal(); |
} |
static void ReadPixelsSync( |
const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories, |
- uint32 texture_id, |
- const gfx::Rect& visible_rect, |
+ const scoped_refptr<VideoFrame>& frame, |
const SkBitmap& pixels) { |
base::WaitableEvent event(true, false); |
- if (!factories->GetTaskRunner()->PostTask(FROM_HERE, |
- base::Bind(&ReadPixelsSyncInner, |
- factories, |
- texture_id, |
- visible_rect, |
- pixels, |
- &event))) |
+ if (!factories->GetTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ReadPixelsSyncInner, factories, frame, pixels, &event))) |
return; |
event.Wait(); |
} |
@@ -480,7 +475,7 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) { |
visible_rect, |
natural_size, |
timestamp, |
- base::Bind(&ReadPixelsSync, factories_, pb.texture_id(), visible_rect))); |
+ base::Bind(&ReadPixelsSync, factories_))); |
CHECK_GT(available_pictures_, 0); |
--available_pictures_; |
bool inserted = |
@@ -514,7 +509,8 @@ void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( |
void GpuVideoDecoder::ReusePictureBuffer( |
int64 picture_buffer_id, |
- scoped_ptr<gpu::MailboxHolder> mailbox_holder) { |
+ scoped_ptr<gpu::MailboxHolder> mailbox_holder, |
+ const std::vector<uint32>& release_sync_points) { |
DVLOG(3) << "ReusePictureBuffer(" << picture_buffer_id << ")"; |
DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); |
@@ -538,7 +534,9 @@ void GpuVideoDecoder::ReusePictureBuffer( |
return; |
} |
- factories_->WaitSyncPoint(mailbox_holder->sync_point); |
+ for (size_t i = 0; i < release_sync_points.size(); i++) |
+ factories_->WaitSyncPoint(release_sync_points[i]); |
+ |
++available_pictures_; |
vda_->ReusePictureBuffer(picture_buffer_id); |