Index: chrome/gpu/arc_gpu_video_decode_accelerator.cc |
diff --git a/chrome/gpu/arc_gpu_video_decode_accelerator.cc b/chrome/gpu/arc_gpu_video_decode_accelerator.cc |
index b4b46b0da454249a619c6f9a6357041eeead1c85..bebb137a769322e2d7ca008082a1f1c306fe2bd5 100644 |
--- a/chrome/gpu/arc_gpu_video_decode_accelerator.cc |
+++ b/chrome/gpu/arc_gpu_video_decode_accelerator.cc |
@@ -33,8 +33,7 @@ ArcGpuVideoDecodeAccelerator::InputBufferInfo::InputBufferInfo( |
ArcGpuVideoDecodeAccelerator::InputBufferInfo::~InputBufferInfo() {} |
ArcGpuVideoDecodeAccelerator::ArcGpuVideoDecodeAccelerator() |
- : pending_eos_output_buffer_(false), |
- arc_client_(nullptr), |
+ : arc_client_(nullptr), |
next_bitstream_buffer_id_(0), |
output_buffer_size_(0) {} |
@@ -208,13 +207,22 @@ void ArcGpuVideoDecodeAccelerator::UseBuffer(PortType port, |
vda_->Decode(media::BitstreamBuffer( |
bitstream_buffer_id, base::SharedMemoryHandle(dup_fd, true), |
metadata.bytes_used, input_info->offset)); |
- if (metadata.flags & BUFFER_FLAG_EOS) { |
- vda_->Flush(); |
- } |
break; |
} |
case PORT_OUTPUT: { |
- SendEosIfNeededOrReusePicture(index); |
+ // is_valid() is true for the first time the buffer is passed to the VDA. |
+ // In that case, VDA needs to import the buffer first. |
+ if (buffers_pending_import_[index].is_valid()) { |
+ gfx::GpuMemoryBufferHandle handle; |
+#if defined(USE_OZONE) |
+ handle.native_pixmap_handle.fd = base::FileDescriptor( |
+ buffers_pending_import_[index].release(), true); |
+#endif |
+ vda_->ImportBufferForPicture( |
+ index, std::vector<gfx::GpuMemoryBufferHandle>{handle}); |
dcheng
2016/05/10 23:00:11
Also, just write {handle} here (no std::vector<gfx
Owen Lin
2016/05/11 01:49:57
Done. Thanks.
|
+ } else { |
+ vda_->ReusePictureBuffer(index); |
+ } |
break; |
} |
default: |
@@ -231,6 +239,15 @@ void ArcGpuVideoDecodeAccelerator::Reset() { |
vda_->Reset(); |
} |
+void ArcGpuVideoDecodeAccelerator::Flush() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!vda_) { |
+ DLOG(ERROR) << "VDA not initialized"; |
+ return; |
+ } |
+ vda_->Flush(); |
+} |
+ |
void ArcGpuVideoDecodeAccelerator::ProvidePictureBuffers( |
uint32_t requested_num_of_buffers, |
uint32_t textures_per_buffer, |
@@ -283,11 +300,6 @@ void ArcGpuVideoDecodeAccelerator::PictureReady(const media::Picture& picture) { |
<< ", bitstream_buffer_id=" << picture.bitstream_buffer_id(); |
DCHECK(thread_checker_.CalledOnValidThread()); |
- // Empty buffer, returned in Flushing. |
- if (picture.bitstream_buffer_id() == -1) { |
- buffers_pending_eos_.push(picture.picture_buffer_id()); |
- return; |
- } |
InputRecord* input_record = FindInputRecord(picture.bitstream_buffer_id()); |
if (input_record == nullptr) { |
DLOG(ERROR) << "Cannot find for bitstream buffer id: " |
@@ -317,11 +329,7 @@ void ArcGpuVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer( |
void ArcGpuVideoDecodeAccelerator::NotifyFlushDone() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- pending_eos_output_buffer_ = true; |
- while (!buffers_pending_eos_.empty()) { |
- SendEosIfNeededOrReusePicture(buffers_pending_eos_.front()); |
- buffers_pending_eos_.pop(); |
- } |
+ arc_client_->OnFlushDone(); |
} |
void ArcGpuVideoDecodeAccelerator::NotifyResetDone() { |
@@ -353,28 +361,6 @@ void ArcGpuVideoDecodeAccelerator::NotifyError( |
arc_client_->OnError(ConvertErrorCode(error)); |
} |
-void ArcGpuVideoDecodeAccelerator::SendEosIfNeededOrReusePicture( |
- uint32_t index) { |
- if (pending_eos_output_buffer_) { |
- BufferMetadata metadata; |
- metadata.flags = BUFFER_FLAG_EOS; |
- arc_client_->OnBufferDone(PORT_OUTPUT, index, metadata); |
- pending_eos_output_buffer_ = false; |
- } else { |
- if (buffers_pending_import_[index].is_valid()) { |
- std::vector<gfx::GpuMemoryBufferHandle> buffers; |
- buffers.push_back(gfx::GpuMemoryBufferHandle()); |
-#if defined(USE_OZONE) |
- buffers.back().native_pixmap_handle.fd = |
- base::FileDescriptor(buffers_pending_import_[index].release(), true); |
-#endif |
- vda_->ImportBufferForPicture(index, buffers); |
- } else { |
- vda_->ReusePictureBuffer(index); |
- } |
- } |
-} |
- |
void ArcGpuVideoDecodeAccelerator::CreateInputRecord( |
int32_t bitstream_buffer_id, |
uint32_t buffer_index, |