Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 0c2da5c

Browse files
authored
Support hardware accelerated FFMPEG decoder. (#711)
This change enables external video decoder factory for both MSDK decoder and FFMPEG decoder.
1 parent f75fde7 commit 0c2da5c

9 files changed

+53
-43
lines changed

talk/owt/BUILD.gn

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,17 @@ static_library("owt_sdk_base") {
295295
"sdk/base/win/videorendererd3d11.cc",
296296
"sdk/base/win/videorendererd3d11.h",
297297
]
298+
if (owt_msdk_header_root != "" || owt_ffmpeg_root != "") {
299+
sources += [
300+
"sdk/base/win/externalvideodecoderfactory.cc",
301+
"sdk/base/win/externalvideodecoderfactory.h",
302+
"sdk/base/win/externalvideoencoderfactory.cc",
303+
"sdk/base/win/externalvideoencoderfactory.h",
304+
"sdk/base/win/mediacapabilities.cc",
305+
"sdk/base/win/mediacapabilities.h",
306+
"sdk/base/win/vpedefs.h",
307+
]
308+
}
298309
if (owt_msdk_header_root != "") {
299310
sources += [
300311
"sdk/base/win/base_allocator.cc",
@@ -303,23 +314,16 @@ static_library("owt_sdk_base") {
303314
"sdk/base/win/d3d11_allocator.h",
304315
"sdk/base/win/d3d_allocator.cc",
305316
"sdk/base/win/d3d_allocator.h",
306-
"sdk/base/win/mediacapabilities.cc",
307-
"sdk/base/win/mediacapabilities.h",
308317
"sdk/base/win/msdkvideobase.cc",
309318
"sdk/base/win/msdkvideobase.h",
310319
"sdk/base/win/msdkvideodecoder.cc",
311320
"sdk/base/win/msdkvideodecoder.h",
312-
"sdk/base/win/msdkvideodecoderfactory.cc",
313-
"sdk/base/win/msdkvideodecoderfactory.h",
314321
"sdk/base/win/msdkvideoencoder.cc",
315322
"sdk/base/win/msdkvideoencoder.h",
316-
"sdk/base/win/msdkvideoencoderfactory.cc",
317-
"sdk/base/win/msdkvideoencoderfactory.h",
318323
"sdk/base/win/sysmem_allocator.cc",
319324
"sdk/base/win/sysmem_allocator.h",
320325
"sdk/base/win/vp9ratecontrol.cc",
321326
"sdk/base/win/vp9ratecontrol.h",
322-
"sdk/base/win/vpedefs.h",
323327
]
324328
public_deps += [
325329
"//third_party/libvpx",

talk/owt/sdk/base/linux/msdkvideodecoderfactory.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@
1515
namespace owt {
1616
namespace base {
1717

18-
MSDKVideoDecoderFactory::MSDKVideoDecoderFactory() {
18+
ExternalVideoDecoderFactory::ExternalVideoDecoderFactory() {
1919
// TODO: Add the other codecs support
2020
supported_codecs_.push_back(webrtc::kVideoCodecH264);
2121
supported_codecs_.push_back(webrtc::kVideoCodecH265);
2222
}
2323

2424

2525

26-
MSDKVideoDecoderFactory::~MSDKVideoDecoderFactory() {}
26+
ExternalVideoDecoderFactory::~ExternalVideoDecoderFactory() {}
2727

2828

29-
std::unique_ptr<webrtc::VideoDecoder> MSDKVideoDecoderFactory::CreateVideoDecoder(
29+
std::unique_ptr<webrtc::VideoDecoder> ExternalVideoDecoderFactory::CreateVideoDecoder(
3030
const webrtc::SdpVideoFormat& format) {
3131

3232
if (absl::EqualsIgnoreCase(format.name, cricket::kVp8CodecName) ||
@@ -42,7 +42,7 @@ std::unique_ptr<webrtc::VideoDecoder> MSDKVideoDecoderFactory::CreateVideoDecode
4242

4343
return nullptr;
4444
}
45-
std::vector<webrtc::SdpVideoFormat> MSDKVideoDecoderFactory::GetSupportedFormats()
45+
std::vector<webrtc::SdpVideoFormat> ExternalVideoDecoderFactory::GetSupportedFormats()
4646
const {
4747

4848
std::vector<webrtc::SdpVideoFormat> supported_codecs;

talk/owt/sdk/base/linux/msdkvideodecoderfactory.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ namespace owt {
1414
namespace base {
1515

1616
// Declaration of MSDK based decoder factory.
17-
class MSDKVideoDecoderFactory : public webrtc::VideoDecoderFactory {
17+
class ExternalVideoDecoderFactory : public webrtc::VideoDecoderFactory {
1818
public:
19-
MSDKVideoDecoderFactory();
20-
virtual ~MSDKVideoDecoderFactory();
19+
ExternalVideoDecoderFactory();
20+
virtual ~ExternalVideoDecoderFactory();
2121

2222
// WebRtcVideoDecoderFactory implementation.
2323
// VideoDecoderFactory implementation

talk/owt/sdk/base/peerconnectiondependencyfactory.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include "webrtc/rtc_base/physical_socket_server.h"
2323
#if defined(WEBRTC_WIN)
2424
#include <d3d11.h>
25-
#include "talk/owt/sdk/base/win/msdkvideodecoderfactory.h"
26-
#include "talk/owt/sdk/base/win/msdkvideoencoderfactory.h"
25+
#include "talk/owt/sdk/base/win/externalvideodecoderfactory.h"
26+
#include "talk/owt/sdk/base/win/externalvideoencoderfactory.h"
2727
#elif defined(WEBRTC_LINUX)
2828
#include "talk/owt/sdk/base/linux/msdkvideodecoderfactory.h"
2929
#elif defined(WEBRTC_IOS)
@@ -190,8 +190,8 @@ void PeerConnectionDependencyFactory::
190190
if (encoded_frame_) {
191191
encoder_factory.reset(new EncodedVideoEncoderFactory());
192192
} else if (render_hardware_acceleration_enabled_) {
193-
#ifdef OWT_USE_MSDK
194-
encoder_factory.reset(new MSDKVideoEncoderFactory());
193+
#if defined(OWT_USE_MSDK) || defined(OWT_USE_FFMPEG)
194+
encoder_factory.reset(new ExternalVideoEncoderFactory());
195195
#else
196196
// For Linux HW encoder pending verification.
197197
encoder_factory = webrtc::CreateBuiltinVideoEncoderFactory();
@@ -204,8 +204,8 @@ void PeerConnectionDependencyFactory::
204204
decoder_factory.reset(new CustomizedVideoDecoderFactory(
205205
GlobalConfiguration::GetCustomizedVideoDecoder()));
206206
} else if (render_hardware_acceleration_enabled_) {
207-
#ifdef OWT_USE_MSDK
208-
decoder_factory.reset(new MSDKVideoDecoderFactory(nullptr));
207+
#if defined(OWT_USE_MSDK) || defined(OWT_USE_FFMPEG)
208+
decoder_factory.reset(new ExternalVideoDecoderFactory(nullptr));
209209
#else
210210
decoder_factory = webrtc::CreateBuiltinVideoDecoderFactory();
211211
#endif

talk/owt/sdk/base/win/d3d11va_h264_decoder.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ int H264DXVADecoderImpl::InitHwContext(AVCodecContext* ctx,
9797
device_hwctx = (AVD3D11VADeviceContext*)device_ctx->hwctx;
9898

9999
hr = D3D11CreateDevice(
100-
nullptr, D3D_DRIVER_TYPE_UNKNOWN, nullptr, creation_flags, feature_levels,
100+
nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, creation_flags, feature_levels,
101101
sizeof(feature_levels) / sizeof(feature_levels[0]), D3D11_SDK_VERSION,
102102
&device_hwctx->device, &feature_levels_out, &d3d11_device_context_);
103103
if (FAILED(hr)) {
@@ -317,8 +317,8 @@ int32_t H264DXVADecoderImpl::Decode(const webrtc::EncodedImage& input_image,
317317
// We get one frame from the decoder.
318318
if (frame != nullptr && frame->format == hw_pix_fmt) {
319319
ID3D11Texture2D* texture = (ID3D11Texture2D*)frame->data[0];
320-
int width = frame->crop_right - frame->crop_left;
321-
int height = frame->crop_bottom - frame->crop_top;
320+
int width = frame->width;
321+
int height = frame->height;
322322
int index = (intptr_t)frame->data[1];
323323
D3D11_TEXTURE2D_DESC texture_desc;
324324

talk/owt/sdk/base/win/msdkvideodecoderfactory.cc renamed to talk/owt/sdk/base/win/externalvideodecoderfactory.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//
33
// SPDX-License-Identifier: Apache-2.0
44

5-
#include "talk/owt/sdk/base/win/msdkvideodecoderfactory.h"
5+
#include "talk/owt/sdk/base/win/externalvideodecoderfactory.h"
66
#include <vector>
77
#include "absl/strings/match.h"
88
#include "media/base/codec.h"
@@ -11,16 +11,19 @@
1111
#include "modules/video_coding/codecs/vp8/include/vp8.h"
1212
#include "modules/video_coding/codecs/vp9/include/vp9.h"
1313
#include "talk/owt/sdk/base/codecutils.h"
14-
#include "talk/owt/sdk/base/win/msdkvideodecoder.h"
15-
#include "webrtc/rtc_base/checks.h"
1614
#ifdef OWT_USE_FFMPEG
1715
#include "talk/owt/sdk/base/win/d3d11va_h264_decoder.h"
1816
#endif
17+
#ifdef OWT_USE_MSDK
18+
#include "talk/owt/sdk/base/win/msdkvideodecoder.h"
19+
#endif
20+
#include "webrtc/rtc_base/checks.h"
21+
#include "webrtc/rtc_base/logging.h"
1922

2023
namespace owt {
2124
namespace base {
2225

23-
MSDKVideoDecoderFactory::MSDKVideoDecoderFactory(ID3D11Device* d3d11_device_external) {
26+
ExternalVideoDecoderFactory::ExternalVideoDecoderFactory(ID3D11Device* d3d11_device_external) {
2427
supported_codec_types_.clear();
2528

2629
bool is_vp8_hw_supported = false, is_vp9_hw_supported = false;
@@ -66,10 +69,10 @@ MSDKVideoDecoderFactory::MSDKVideoDecoderFactory(ID3D11Device* d3d11_device_exte
6669
}
6770
}
6871

69-
MSDKVideoDecoderFactory::~MSDKVideoDecoderFactory() {}
72+
ExternalVideoDecoderFactory::~ExternalVideoDecoderFactory() {}
7073

7174
std::unique_ptr<webrtc::VideoDecoder>
72-
MSDKVideoDecoderFactory::CreateVideoDecoder(
75+
ExternalVideoDecoderFactory::CreateVideoDecoder(
7376
const webrtc::SdpVideoFormat& format) {
7477
bool vp9_hw = false, vp8_hw = false, av1_hw = false, h264_hw = false;
7578
#ifdef WEBRTC_USE_H265
@@ -121,10 +124,10 @@ MSDKVideoDecoderFactory::CreateVideoDecoder(
121124
}
122125
#endif
123126

124-
return MSDKVideoDecoder::Create(cricket::VideoCodec(format));
127+
RTC_CHECK_NOTREACHED();
125128
}
126129

127-
std::vector<webrtc::SdpVideoFormat> MSDKVideoDecoderFactory::GetSupportedFormats()
130+
std::vector<webrtc::SdpVideoFormat> ExternalVideoDecoderFactory::GetSupportedFormats()
128131
const {
129132
std::vector<webrtc::SdpVideoFormat> supported_codecs;
130133
supported_codecs.push_back(webrtc::SdpVideoFormat(cricket::kVp8CodecName));

talk/owt/sdk/base/win/msdkvideodecoderfactory.h renamed to talk/owt/sdk/base/win/externalvideodecoderfactory.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
namespace owt {
2222
namespace base {
23-
// Declaration of MSDK based decoder factory.
24-
class MSDKVideoDecoderFactory : public webrtc::VideoDecoderFactory {
23+
// Decoder factory for MSDK decoder and FFMPEG decoder.
24+
class ExternalVideoDecoderFactory : public webrtc::VideoDecoderFactory {
2525
public:
26-
MSDKVideoDecoderFactory(ID3D11Device* d3d11_device_external);
27-
virtual ~MSDKVideoDecoderFactory();
26+
ExternalVideoDecoderFactory(ID3D11Device* d3d11_device_external);
27+
virtual ~ExternalVideoDecoderFactory();
2828

2929
// VideoDecoderFactory implementation
3030
std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override;

talk/owt/sdk/base/win/msdkvideoencoderfactory.cc renamed to talk/owt/sdk/base/win/externalvideoencoderfactory.cc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@
22
//
33
// SPDX-License-Identifier: Apache-2.0
44

5-
#include "talk/owt/sdk/base/win/msdkvideoencoderfactory.h"
5+
#include "talk/owt/sdk/base/win/externalvideoencoderfactory.h"
66
#include <string>
77
#include "absl/strings/match.h"
88
#include "modules/video_coding/codecs/av1/libaom_av1_encoder.h"
99
#include "modules/video_coding/codecs/h264/include/h264.h"
1010
#include "modules/video_coding/codecs/vp8/include/vp8.h"
1111
#include "modules/video_coding/codecs/vp9/include/vp9.h"
1212
#include "talk/owt/sdk/base/codecutils.h"
13+
#ifdef OWT_USE_MSDK
1314
#include "talk/owt/sdk/base/win/msdkvideoencoder.h"
15+
#endif
1416
#include "webrtc/api/video_codecs/vp9_profile.h"
1517

1618
namespace owt {
1719
namespace base {
1820

19-
MSDKVideoEncoderFactory::MSDKVideoEncoderFactory() {
21+
ExternalVideoEncoderFactory::ExternalVideoEncoderFactory() {
2022
supported_codec_types_.clear();
2123
MediaCapabilities* media_capability = MediaCapabilities::Get();
2224
std::vector<owt::base::VideoCodec> codecs_to_check;
@@ -39,7 +41,7 @@ MSDKVideoEncoderFactory::MSDKVideoEncoderFactory() {
3941
supported_codec_types_.push_back(webrtc::kVideoCodecAV1);
4042
}
4143

42-
std::unique_ptr<webrtc::VideoEncoder> MSDKVideoEncoderFactory::CreateVideoEncoder(
44+
std::unique_ptr<webrtc::VideoEncoder> ExternalVideoEncoderFactory::CreateVideoEncoder(
4345
const webrtc::SdpVideoFormat& format) {
4446
bool vp9_hw = false, vp8_hw = false, av1_hw = false, h264_hw = false;
4547
#ifdef WEBRTC_USE_H265
@@ -73,11 +75,11 @@ std::unique_ptr<webrtc::VideoEncoder> MSDKVideoEncoderFactory::CreateVideoEncode
7375
!h265_hw) {
7476
}
7577
#endif
76-
return MSDKVideoEncoder::Create(cricket::VideoCodec(format));
78+
RTC_CHECK_NOTREACHED();
7779
}
7880

7981
std::vector<webrtc::SdpVideoFormat>
80-
MSDKVideoEncoderFactory::GetSupportedFormats() const {
82+
ExternalVideoEncoderFactory::GetSupportedFormats() const {
8183
std::vector<webrtc::SdpVideoFormat> supported_codecs;
8284
supported_codecs.push_back(webrtc::SdpVideoFormat(cricket::kVp8CodecName));
8385
supported_codecs.push_back(webrtc::SdpVideoFormat(cricket::kAv1CodecName));

talk/owt/sdk/base/win/msdkvideoencoderfactory.h renamed to talk/owt/sdk/base/win/externalvideoencoderfactory.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414

1515
namespace owt {
1616
namespace base {
17-
class MSDKVideoEncoderFactory : public webrtc::VideoEncoderFactory {
17+
// Encoder factory for MSDK encoder and FFMPEG encoder.
18+
class ExternalVideoEncoderFactory : public webrtc::VideoEncoderFactory {
1819
public:
19-
MSDKVideoEncoderFactory();
20-
~MSDKVideoEncoderFactory() {}
20+
ExternalVideoEncoderFactory();
21+
~ExternalVideoEncoderFactory() {}
2122
std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder(
2223
const webrtc::SdpVideoFormat& format) override;
2324

0 commit comments

Comments
 (0)