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

Side by Side Diff: content/common/gpu/media/dxva_video_decode_accelerator_win.cc

Issue 1706023003: Moving the validation of bitstream_buffer into VDA implementations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix compiling errors on windows Created 4 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/gpu/media/dxva_video_decode_accelerator_win.h" 5 #include "content/common/gpu/media/dxva_video_decode_accelerator_win.h"
6 6
7 #if !defined(OS_WIN) 7 #if !defined(OS_WIN)
8 #error This file should only be built on Windows. 8 #error This file should only be built on Windows.
9 #endif // !defined(OS_WIN) 9 #endif // !defined(OS_WIN)
10 10
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 239
240 hr = buffer->SetCurrentLength(size); 240 hr = buffer->SetCurrentLength(size);
241 RETURN_ON_HR_FAILURE(hr, "Failed to set buffer length", NULL); 241 RETURN_ON_HR_FAILURE(hr, "Failed to set buffer length", NULL);
242 242
243 hr = buffer->Unlock(); 243 hr = buffer->Unlock();
244 RETURN_ON_HR_FAILURE(hr, "Failed to unlock buffer", NULL); 244 RETURN_ON_HR_FAILURE(hr, "Failed to unlock buffer", NULL);
245 245
246 return sample.Detach(); 246 return sample.Detach();
247 } 247 }
248 248
249 static IMFSample* CreateSampleFromInputBuffer(
250 const media::BitstreamBuffer& bitstream_buffer,
251 uint32_t stream_size,
252 DWORD alignment) {
253 base::SharedMemory shm(bitstream_buffer.handle(), true);
254 RETURN_ON_FAILURE(shm.Map(bitstream_buffer.size()),
255 "Failed in base::SharedMemory::Map", NULL);
256
257 return CreateInputSample(reinterpret_cast<const uint8_t*>(shm.memory()),
258 bitstream_buffer.size(),
259 std::min<uint32_t>(bitstream_buffer.size(),
260 stream_size),
261 alignment);
262 }
263
264 // Helper function to create a COM object instance from a DLL. The alternative 249 // Helper function to create a COM object instance from a DLL. The alternative
265 // is to use the CoCreateInstance API which requires the COM apartment to be 250 // is to use the CoCreateInstance API which requires the COM apartment to be
266 // initialized which is not the case on the GPU main thread. We want to avoid 251 // initialized which is not the case on the GPU main thread. We want to avoid
267 // initializing COM as it may have sideeffects. 252 // initializing COM as it may have sideeffects.
268 HRESULT CreateCOMObjectFromDll(HMODULE dll, const CLSID& clsid, const IID& iid, 253 HRESULT CreateCOMObjectFromDll(HMODULE dll, const CLSID& clsid, const IID& iid,
269 void** object) { 254 void** object) {
270 if (!dll || !object) 255 if (!dll || !object)
271 return E_INVALIDARG; 256 return E_INVALIDARG;
272 257
273 using GetClassObject = HRESULT (WINAPI*)( 258 using GetClassObject = HRESULT (WINAPI*)(
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 hr, 920 hr,
936 "Failed to set MF_LOW_LATENCY attribute on converter", 921 "Failed to set MF_LOW_LATENCY attribute on converter",
937 false); 922 false);
938 return true; 923 return true;
939 } 924 }
940 925
941 void DXVAVideoDecodeAccelerator::Decode( 926 void DXVAVideoDecodeAccelerator::Decode(
942 const media::BitstreamBuffer& bitstream_buffer) { 927 const media::BitstreamBuffer& bitstream_buffer) {
943 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 928 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
944 929
930 // SharedMemory will take over the ownership of handle.
931 base::SharedMemory shm(bitstream_buffer.handle(), true);
932
945 State state = GetState(); 933 State state = GetState();
946 RETURN_AND_NOTIFY_ON_FAILURE((state == kNormal || state == kStopped || 934 RETURN_AND_NOTIFY_ON_FAILURE((state == kNormal || state == kStopped ||
947 state == kFlushing), 935 state == kFlushing),
948 "Invalid state: " << state, ILLEGAL_STATE,); 936 "Invalid state: " << state, ILLEGAL_STATE,);
937 if (bitstream_buffer.id() < 0) {
938 RETURN_AND_NOTIFY_ON_FAILURE(
939 false, "Invalid bitstream_buffer, id: " << bitstream_buffer.id(),
940 INVALID_ARGUMENT, );
941 }
949 942
950 base::win::ScopedComPtr<IMFSample> sample; 943 base::win::ScopedComPtr<IMFSample> sample;
951 sample.Attach(CreateSampleFromInputBuffer(bitstream_buffer, 944 RETURN_AND_NOTIFY_ON_FAILURE(shm.Map(bitstream_buffer.size()),
952 input_stream_info_.cbSize, 945 "Failed in base::SharedMemory::Map",
953 input_stream_info_.cbAlignment)); 946 PLATFORM_FAILURE, );
947
948 sample.Attach(CreateInputSample(
949 reinterpret_cast<const uint8_t*>(shm.memory()), bitstream_buffer.size(),
950 std::min<uint32_t>(bitstream_buffer.size(), input_stream_info_.cbSize),
951 input_stream_info_.cbAlignment));
954 RETURN_AND_NOTIFY_ON_FAILURE(sample.get(), "Failed to create input sample", 952 RETURN_AND_NOTIFY_ON_FAILURE(sample.get(), "Failed to create input sample",
955 PLATFORM_FAILURE, ); 953 PLATFORM_FAILURE, );
956 954
957 RETURN_AND_NOTIFY_ON_HR_FAILURE(sample->SetSampleTime(bitstream_buffer.id()), 955 RETURN_AND_NOTIFY_ON_HR_FAILURE(sample->SetSampleTime(bitstream_buffer.id()),
958 "Failed to associate input buffer id with sample", PLATFORM_FAILURE,); 956 "Failed to associate input buffer id with sample", PLATFORM_FAILURE,);
959 957
960 decoder_thread_task_runner_->PostTask( 958 decoder_thread_task_runner_->PostTask(
961 FROM_HERE, 959 FROM_HERE,
962 base::Bind(&DXVAVideoDecodeAccelerator::DecodeInternal, 960 base::Bind(&DXVAVideoDecodeAccelerator::DecodeInternal,
963 base::Unretained(this), sample)); 961 base::Unretained(this), sample));
(...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2381 } 2379 }
2382 RETURN_ON_HR_FAILURE(hr, "Failed to set output type", false); 2380 RETURN_ON_HR_FAILURE(hr, "Failed to set output type", false);
2383 return true; 2381 return true;
2384 } 2382 }
2385 media_type.Release(); 2383 media_type.Release();
2386 } 2384 }
2387 return false; 2385 return false;
2388 } 2386 }
2389 2387
2390 } // namespace content 2388 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698