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

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

Issue 2105693003: Vp9 decoder mft support for AMD apu/gpu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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 "media/gpu/dxva_video_decode_accelerator_win.h" 5 #include "media/gpu/dxva_video_decode_accelerator_win.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #if !defined(OS_WIN) 9 #if !defined(OS_WIN)
10 #error This file should only be built on Windows. 10 #error This file should only be built on Windows.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "media/gpu/dxva_picture_buffer_win.h" 42 #include "media/gpu/dxva_picture_buffer_win.h"
43 #include "media/video/video_decode_accelerator.h" 43 #include "media/video/video_decode_accelerator.h"
44 #include "third_party/angle/include/EGL/egl.h" 44 #include "third_party/angle/include/EGL/egl.h"
45 #include "third_party/angle/include/EGL/eglext.h" 45 #include "third_party/angle/include/EGL/eglext.h"
46 #include "ui/gl/gl_bindings.h" 46 #include "ui/gl/gl_bindings.h"
47 #include "ui/gl/gl_context.h" 47 #include "ui/gl/gl_context.h"
48 #include "ui/gl/gl_fence.h" 48 #include "ui/gl/gl_fence.h"
49 #include "ui/gl/gl_surface_egl.h" 49 #include "ui/gl/gl_surface_egl.h"
50 50
51 namespace { 51 namespace {
52 #define INTEL_WEBM_MFT_VP9_ENABLE_MASK 0x1
53 #define AMD_WEBM_MFT_VP9_ENABLE_MASK 0x2
52 54
55 // AMD
56 // Path is appended on to the PROGRAM_FILES base path.
57 const wchar_t kAMDVPXDecoderDLLPath[] =
58 L"Common Files\\ATI Technologies\\Multimedia\\";
59
60 const wchar_t kAMDVP9DecoderDLLName[] =
61 #if defined(ARCH_CPU_X86)
62 L"amf-mft-decvp9-decoder32.dll";
63 #elif defined(ARCH_CPU_X86_64)
64 L"amf-mft-decvp9-decoder64.dll";
65 #else
66 #error Unsupported Windows CPU Architecture
67 #endif
68
69 const CLSID CLSID_AMDWebmMfVp9Dec = {
70 0x2d2d728a,
71 0x67d6,
72 0x48ab,
73 {0x89, 0xfb, 0xa6, 0xec, 0x65, 0x55, 0x49, 0x70}};
74
75 // Intel
53 // Path is appended on to the PROGRAM_FILES base path. 76 // Path is appended on to the PROGRAM_FILES base path.
54 const wchar_t kVPXDecoderDLLPath[] = L"Intel\\Media SDK\\"; 77 const wchar_t kVPXDecoderDLLPath[] = L"Intel\\Media SDK\\";
55 78
56 const wchar_t kVP8DecoderDLLName[] = 79 const wchar_t kVP8DecoderDLLName[] =
57 #if defined(ARCH_CPU_X86) 80 #if defined(ARCH_CPU_X86)
58 L"mfx_mft_vp8vd_32.dll"; 81 L"mfx_mft_vp8vd_32.dll";
59 #elif defined(ARCH_CPU_X86_64) 82 #elif defined(ARCH_CPU_X86_64)
60 L"mfx_mft_vp8vd_64.dll"; 83 L"mfx_mft_vp8vd_64.dll";
61 #else 84 #else
62 #error Unsupported Windows CPU Architecture 85 #error Unsupported Windows CPU Architecture
(...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 // fall back to software decoding. See crbug/403440. 1404 // fall back to software decoding. See crbug/403440.
1382 std::unique_ptr<FileVersionInfo> version_info( 1405 std::unique_ptr<FileVersionInfo> version_info(
1383 FileVersionInfo::CreateFileVersionInfoForModule(decoder_dll)); 1406 FileVersionInfo::CreateFileVersionInfoForModule(decoder_dll));
1384 RETURN_ON_FAILURE(version_info, "unable to get version of msmpeg2vdec.dll", 1407 RETURN_ON_FAILURE(version_info, "unable to get version of msmpeg2vdec.dll",
1385 false); 1408 false);
1386 base::string16 file_version = version_info->file_version(); 1409 base::string16 file_version = version_info->file_version();
1387 RETURN_ON_FAILURE(file_version.find(L"6.1.7140") == base::string16::npos, 1410 RETURN_ON_FAILURE(file_version.find(L"6.1.7140") == base::string16::npos,
1388 "blacklisted version of msmpeg2vdec.dll 6.1.7140", false); 1411 "blacklisted version of msmpeg2vdec.dll 6.1.7140", false);
1389 codec_ = kCodecH264; 1412 codec_ = kCodecH264;
1390 clsid = __uuidof(CMSH264DecoderMFT); 1413 clsid = __uuidof(CMSH264DecoderMFT);
1391 } else if (enable_accelerated_vpx_decode_ && 1414 } else if (enable_accelerated_vpx_decode_ != 0 &&
1392 (profile == VP8PROFILE_ANY || profile == VP9PROFILE_PROFILE0 || 1415 (profile == media::VP8PROFILE_ANY ||
jbauman 2016/06/28 20:24:22 Shouldn't need to change this.
kplum 2016/06/28 21:35:14 Acknowledged.
1393 profile == VP9PROFILE_PROFILE1 || 1416 profile == media::VP9PROFILE_PROFILE0 ||
1394 profile == VP9PROFILE_PROFILE2 || 1417 profile == media::VP9PROFILE_PROFILE1 ||
1395 profile == VP9PROFILE_PROFILE3)) { 1418 profile == media::VP9PROFILE_PROFILE2 ||
1419 profile == media::VP9PROFILE_PROFILE3)) {
1396 int program_files_key = base::DIR_PROGRAM_FILES; 1420 int program_files_key = base::DIR_PROGRAM_FILES;
1397 if (base::win::OSInfo::GetInstance()->wow64_status() == 1421 if (base::win::OSInfo::GetInstance()->wow64_status() ==
1398 base::win::OSInfo::WOW64_ENABLED) { 1422 base::win::OSInfo::WOW64_ENABLED) {
1399 program_files_key = base::DIR_PROGRAM_FILES6432; 1423 program_files_key = base::DIR_PROGRAM_FILES6432;
1400 } 1424 }
1401 1425
1402 base::FilePath dll_path; 1426 // Intel
1403 RETURN_ON_FAILURE(PathService::Get(program_files_key, &dll_path), 1427 if (enable_accelerated_vpx_decode_ & INTEL_WEBM_MFT_VP9_ENABLE_MASK) {
1404 "failed to get path for Program Files", false); 1428 base::FilePath dll_path;
1429 if (PathService::Get(program_files_key, &dll_path)) {
1430 dll_path = dll_path.Append(kVPXDecoderDLLPath);
1431 if (profile == media::VP8PROFILE_ANY) {
1432 codec_ = media::kCodecVP8;
1433 dll_path = dll_path.Append(kVP8DecoderDLLName);
1434 clsid = CLSID_WebmMfVp8Dec;
1435 } else {
1436 codec_ = media::kCodecVP9;
1437 dll_path = dll_path.Append(kVP9DecoderDLLName);
1438 clsid = CLSID_WebmMfVp9Dec;
1439 }
1440 decoder_dll = ::LoadLibraryEx(dll_path.value().data(), NULL,
1441 LOAD_WITH_ALTERED_SEARCH_PATH);
1442 }
1443 }
1444 // AMD
1445 if (decoder_dll == NULL &&
1446 enable_accelerated_vpx_decode_ & AMD_WEBM_MFT_VP9_ENABLE_MASK &&
1447 profile == media::VP9PROFILE_PROFILE0) {
1448 base::FilePath dll_path;
1449 if (PathService::Get(program_files_key, &dll_path)) {
1450 codec_ = media::kCodecVP9;
1451 dll_path = dll_path.Append(kAMDVPXDecoderDLLPath);
1452 dll_path = dll_path.Append(kAMDVP9DecoderDLLName);
jbauman 2016/06/28 20:24:22 Do you need to try to load this in DXVAVideoDecode
kplum 2016/06/28 21:35:14 Originally I thought I would, but then I noticed I
1453 clsid = CLSID_AMDWebmMfVp9Dec;
1454 decoder_dll = ::LoadLibraryEx(dll_path.value().data(), NULL,
1455 LOAD_WITH_ALTERED_SEARCH_PATH);
1456 }
1457 }
1458 }
1405 1459
1406 dll_path = dll_path.Append(kVPXDecoderDLLPath); 1460 // if nothing selected at this point, or dlls failed to load,
1407 if (profile == VP8PROFILE_ANY) { 1461 // there is no support for this codec.
1408 codec_ = kCodecVP8; 1462 if (decoder_dll == NULL) {
1409 dll_path = dll_path.Append(kVP8DecoderDLLName);
1410 clsid = CLSID_WebmMfVp8Dec;
1411 } else {
1412 codec_ = kCodecVP9;
1413 dll_path = dll_path.Append(kVP9DecoderDLLName);
1414 clsid = CLSID_WebmMfVp9Dec;
1415 }
1416 decoder_dll = ::LoadLibraryEx(dll_path.value().data(), NULL,
1417 LOAD_WITH_ALTERED_SEARCH_PATH);
1418 RETURN_ON_FAILURE(decoder_dll, "vpx decoder dll is not loaded", false);
1419 } else {
1420 RETURN_ON_FAILURE(false, "Unsupported codec.", false); 1463 RETURN_ON_FAILURE(false, "Unsupported codec.", false);
1421 } 1464 }
1422 1465
1423 HRESULT hr = CreateCOMObjectFromDll( 1466 HRESULT hr = CreateCOMObjectFromDll(
1424 decoder_dll, clsid, __uuidof(IMFTransform), decoder_.ReceiveVoid()); 1467 decoder_dll, clsid, __uuidof(IMFTransform), decoder_.ReceiveVoid());
1425 RETURN_ON_HR_FAILURE(hr, "Failed to create decoder instance", false); 1468 RETURN_ON_HR_FAILURE(hr, "Failed to create decoder instance", false);
1426 1469
1427 RETURN_ON_FAILURE(CheckDecoderDxvaSupport(), 1470 RETURN_ON_FAILURE(CheckDecoderDxvaSupport(),
1428 "Failed to check decoder DXVA support", false); 1471 "Failed to check decoder DXVA support", false);
1429 1472
(...skipping 1253 matching lines...) Expand 10 before | Expand all | Expand 10 after
2683 SetState(kConfigChange); 2726 SetState(kConfigChange);
2684 Invalidate(); 2727 Invalidate();
2685 Initialize(config_, client_); 2728 Initialize(config_, client_);
2686 decoder_thread_task_runner_->PostTask( 2729 decoder_thread_task_runner_->PostTask(
2687 FROM_HERE, 2730 FROM_HERE,
2688 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, 2731 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
2689 base::Unretained(this))); 2732 base::Unretained(this)));
2690 } 2733 }
2691 2734
2692 } // namespace media 2735 } // namespace media
OLDNEW
« gpu/command_buffer/service/gpu_preferences.h ('K') | « media/gpu/dxva_video_decode_accelerator_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698