Index: content/common/gpu/media/dxva_video_decode_accelerator_win.cc |
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc |
index a2f28f23374aaae70f7f3f3bbad64cae77ef1b65..1b0212c93feb2f4b3f322e13a1be54b84b4e45ea 100644 |
--- a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc |
+++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc |
@@ -246,21 +246,6 @@ static IMFSample* CreateInputSample(const uint8_t* stream, |
return sample.Detach(); |
} |
-static IMFSample* CreateSampleFromInputBuffer( |
- const media::BitstreamBuffer& bitstream_buffer, |
- uint32_t stream_size, |
- DWORD alignment) { |
- base::SharedMemory shm(bitstream_buffer.handle(), true); |
- RETURN_ON_FAILURE(shm.Map(bitstream_buffer.size()), |
- "Failed in base::SharedMemory::Map", NULL); |
- |
- return CreateInputSample(reinterpret_cast<const uint8_t*>(shm.memory()), |
- bitstream_buffer.size(), |
- std::min<uint32_t>(bitstream_buffer.size(), |
- stream_size), |
- alignment); |
-} |
- |
// Helper function to create a COM object instance from a DLL. The alternative |
// is to use the CoCreateInstance API which requires the COM apartment to be |
// initialized which is not the case on the GPU main thread. We want to avoid |
@@ -942,15 +927,28 @@ void DXVAVideoDecodeAccelerator::Decode( |
const media::BitstreamBuffer& bitstream_buffer) { |
DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); |
+ // SharedMemory will take over the ownership of handle. |
+ base::SharedMemory shm(bitstream_buffer.handle(), true); |
+ |
State state = GetState(); |
RETURN_AND_NOTIFY_ON_FAILURE((state == kNormal || state == kStopped || |
state == kFlushing), |
"Invalid state: " << state, ILLEGAL_STATE,); |
+ if (bitstream_buffer.id() < 0) { |
+ RETURN_AND_NOTIFY_ON_FAILURE( |
+ false, "Invalid bitstream_buffer, id: " << bitstream_buffer.id(), |
+ INVALID_ARGUMENT, ); |
+ } |
base::win::ScopedComPtr<IMFSample> sample; |
- sample.Attach(CreateSampleFromInputBuffer(bitstream_buffer, |
- input_stream_info_.cbSize, |
- input_stream_info_.cbAlignment)); |
+ RETURN_AND_NOTIFY_ON_FAILURE(shm.Map(bitstream_buffer.size()), |
+ "Failed in base::SharedMemory::Map", |
+ PLATFORM_FAILURE, ); |
+ |
+ sample.Attach(CreateInputSample( |
+ reinterpret_cast<const uint8_t*>(shm.memory()), bitstream_buffer.size(), |
+ std::min<uint32_t>(bitstream_buffer.size(), input_stream_info_.cbSize), |
+ input_stream_info_.cbAlignment)); |
RETURN_AND_NOTIFY_ON_FAILURE(sample.get(), "Failed to create input sample", |
PLATFORM_FAILURE, ); |