Migrate legacy Android video codec factories.
Prepare for building without built-in software codecs. When passing null, inject the new type of factories but wrap them in the built-in software codecs outside the videoengine. Bug: webrtc:7925 Change-Id: I7408e6e46e6b9efdf346852954bf51a97e023b5c Reviewed-on: https://webrtc-review.googlesource.com/83729 Commit-Queue: Anders Carlsson <andersc@webrtc.org> Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23897}
This commit is contained in:
committed by
Commit Bot
parent
ef43aafcf5
commit
1e06d885dc
@ -17,14 +17,17 @@
|
||||
// androidmediacodeccommon.h to avoid build errors.
|
||||
#include "sdk/android/src/jni/androidmediadecoder_jni.h"
|
||||
|
||||
#include "api/video_codecs/sdp_video_format.h"
|
||||
#include "common_video/h264/h264_bitstream_parser.h"
|
||||
#include "common_video/include/i420_buffer_pool.h"
|
||||
#include "media/base/mediaconstants.h"
|
||||
#include "modules/video_coding/include/video_codec_interface.h"
|
||||
#include "modules/video_coding/utility/vp8_header_parser.h"
|
||||
#include "rtc_base/bind.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/numerics/safe_conversions.h"
|
||||
#include "rtc_base/ptr_util.h"
|
||||
#include "rtc_base/scoped_ref_ptr.h"
|
||||
#include "rtc_base/thread.h"
|
||||
#include "rtc_base/timeutils.h"
|
||||
@ -781,24 +784,24 @@ MediaCodecVideoDecoderFactory::MediaCodecVideoDecoderFactory()
|
||||
ALOGD << "MediaCodecVideoDecoderFactory ctor";
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
supported_codec_types_.clear();
|
||||
supported_formats_.clear();
|
||||
|
||||
if (Java_MediaCodecVideoDecoder_isVp8HwSupported(jni) &&
|
||||
!CheckException(jni)) {
|
||||
ALOGD << "VP8 HW Decoder supported.";
|
||||
supported_codec_types_.push_back(kVideoCodecVP8);
|
||||
supported_formats_.push_back(SdpVideoFormat(cricket::kVp8CodecName));
|
||||
}
|
||||
|
||||
if (Java_MediaCodecVideoDecoder_isVp9HwSupported(jni) &&
|
||||
!CheckException(jni)) {
|
||||
ALOGD << "VP9 HW Decoder supported.";
|
||||
supported_codec_types_.push_back(kVideoCodecVP9);
|
||||
supported_formats_.push_back(SdpVideoFormat(cricket::kVp9CodecName));
|
||||
}
|
||||
|
||||
if (Java_MediaCodecVideoDecoder_isH264HwSupported(jni) &&
|
||||
!CheckException(jni)) {
|
||||
ALOGD << "H264 HW Decoder supported.";
|
||||
supported_codec_types_.push_back(kVideoCodecH264);
|
||||
supported_formats_.push_back(SdpVideoFormat(cricket::kH264CodecName));
|
||||
}
|
||||
}
|
||||
|
||||
@ -823,27 +826,28 @@ void MediaCodecVideoDecoderFactory::SetEGLContext(JNIEnv* jni,
|
||||
}
|
||||
}
|
||||
|
||||
VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder(
|
||||
VideoCodecType type) {
|
||||
if (supported_codec_types_.empty()) {
|
||||
ALOGW << "No HW video decoder for type " << static_cast<int>(type);
|
||||
return nullptr;
|
||||
}
|
||||
for (VideoCodecType codec_type : supported_codec_types_) {
|
||||
if (codec_type == type) {
|
||||
ALOGD << "Create HW video decoder for type " << static_cast<int>(type);
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
return new MediaCodecVideoDecoder(jni, type, egl_context_);
|
||||
}
|
||||
}
|
||||
ALOGW << "Can not find HW video decoder for type " << static_cast<int>(type);
|
||||
return nullptr;
|
||||
std::vector<SdpVideoFormat> MediaCodecVideoDecoderFactory::GetSupportedFormats()
|
||||
const {
|
||||
return supported_formats_;
|
||||
}
|
||||
|
||||
void MediaCodecVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder* decoder) {
|
||||
ALOGD << "Destroy video decoder.";
|
||||
delete decoder;
|
||||
std::unique_ptr<VideoDecoder> MediaCodecVideoDecoderFactory::CreateVideoDecoder(
|
||||
const SdpVideoFormat& format) {
|
||||
if (supported_formats_.empty()) {
|
||||
ALOGW << "No HW video decoder for type " << format.name;
|
||||
return nullptr;
|
||||
}
|
||||
for (SdpVideoFormat supported_format : supported_formats_) {
|
||||
if (supported_format == format) {
|
||||
ALOGD << "Create HW video decoder for type " << format.name;
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
return rtc::MakeUnique<MediaCodecVideoDecoder>(
|
||||
jni, PayloadStringToCodecType(format.name), egl_context_);
|
||||
}
|
||||
}
|
||||
ALOGW << "Can not find HW video decoder for type " << format.name;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool MediaCodecVideoDecoderFactory::IsH264HighProfileSupported(JNIEnv* env) {
|
||||
|
||||
@ -13,31 +13,30 @@
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "media/engine/webrtcvideodecoderfactory.h"
|
||||
#include "api/video_codecs/video_decoder_factory.h"
|
||||
#include "sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Implementation of Android MediaCodec based decoder factory.
|
||||
class MediaCodecVideoDecoderFactory
|
||||
: public cricket::WebRtcVideoDecoderFactory {
|
||||
class MediaCodecVideoDecoderFactory : public VideoDecoderFactory {
|
||||
public:
|
||||
MediaCodecVideoDecoderFactory();
|
||||
~MediaCodecVideoDecoderFactory() override;
|
||||
|
||||
void SetEGLContext(JNIEnv* jni, jobject render_egl_context);
|
||||
|
||||
// WebRtcVideoDecoderFactory implementation.
|
||||
VideoDecoder* CreateVideoDecoder(VideoCodecType type) override;
|
||||
|
||||
void DestroyVideoDecoder(VideoDecoder* decoder) override;
|
||||
// VideoDecoderFactory implementation.
|
||||
std::vector<SdpVideoFormat> GetSupportedFormats() const override;
|
||||
std::unique_ptr<VideoDecoder> CreateVideoDecoder(
|
||||
const SdpVideoFormat& format) override;
|
||||
|
||||
static bool IsH264HighProfileSupported(JNIEnv* env);
|
||||
|
||||
private:
|
||||
jobject egl_context_;
|
||||
std::vector<VideoCodecType> supported_codec_types_;
|
||||
std::vector<SdpVideoFormat> supported_formats_;
|
||||
};
|
||||
|
||||
} // namespace jni
|
||||
|
||||
@ -18,11 +18,14 @@
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "api/video_codecs/sdp_video_format.h"
|
||||
#include "api/video_codecs/video_encoder.h"
|
||||
#include "common_types.h" // NOLINT(build/include)
|
||||
#include "common_video/h264/h264_bitstream_parser.h"
|
||||
#include "common_video/h264/h264_common.h"
|
||||
#include "common_video/h264/profile_level_id.h"
|
||||
#include "media/base/codec.h"
|
||||
#include "media/base/mediaconstants.h"
|
||||
#include "media/engine/internalencoderfactory.h"
|
||||
#include "modules/video_coding/include/video_codec_interface.h"
|
||||
#include "modules/video_coding/utility/quality_scaler.h"
|
||||
@ -31,6 +34,7 @@
|
||||
#include "rtc_base/bind.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/ptr_util.h"
|
||||
#include "rtc_base/sequenced_task_checker.h"
|
||||
#include "rtc_base/task_queue.h"
|
||||
#include "rtc_base/thread.h"
|
||||
@ -93,7 +97,7 @@ class MediaCodecVideoEncoder : public VideoEncoder {
|
||||
public:
|
||||
~MediaCodecVideoEncoder() override;
|
||||
MediaCodecVideoEncoder(JNIEnv* jni,
|
||||
const cricket::VideoCodec& codec,
|
||||
const SdpVideoFormat& format,
|
||||
jobject egl_context);
|
||||
|
||||
// VideoEncoder implementation.
|
||||
@ -197,7 +201,7 @@ class MediaCodecVideoEncoder : public VideoEncoder {
|
||||
#endif
|
||||
|
||||
// Type of video codec.
|
||||
const cricket::VideoCodec codec_;
|
||||
const SdpVideoFormat format_;
|
||||
|
||||
EncodedImageCallback* callback_;
|
||||
|
||||
@ -297,9 +301,9 @@ MediaCodecVideoEncoder::~MediaCodecVideoEncoder() {
|
||||
}
|
||||
|
||||
MediaCodecVideoEncoder::MediaCodecVideoEncoder(JNIEnv* jni,
|
||||
const cricket::VideoCodec& codec,
|
||||
const SdpVideoFormat& format,
|
||||
jobject egl_context)
|
||||
: codec_(codec),
|
||||
: format_(format),
|
||||
callback_(NULL),
|
||||
j_media_codec_video_encoder_(
|
||||
jni,
|
||||
@ -348,7 +352,7 @@ int32_t MediaCodecVideoEncoder::InitEncode(const VideoCodec* codec_settings,
|
||||
profile_ = H264::Profile::kProfileBaseline;
|
||||
if (codec_type == kVideoCodecH264) {
|
||||
const absl::optional<H264::ProfileLevelId> profile_level_id =
|
||||
H264::ParseSdpProfileLevelId(codec_.params);
|
||||
H264::ParseSdpProfileLevelId(format_.parameters);
|
||||
RTC_DCHECK(profile_level_id);
|
||||
profile_ = profile_level_id->profile;
|
||||
ALOGD << "H.264 profile: " << profile_;
|
||||
@ -425,12 +429,14 @@ bool MediaCodecVideoEncoder::EncodeTask::Run() {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsFormatSupported(
|
||||
const std::vector<webrtc::SdpVideoFormat>& supported_formats,
|
||||
const std::string& name) {
|
||||
for (const webrtc::SdpVideoFormat& supported_format : supported_formats) {
|
||||
if (cricket::CodecNamesEq(name, supported_format.name))
|
||||
bool IsFormatSupported(const std::vector<SdpVideoFormat>& supported_formats,
|
||||
const SdpVideoFormat& format) {
|
||||
for (const SdpVideoFormat& supported_format : supported_formats) {
|
||||
if (cricket::IsSameCodec(format.name, format.parameters,
|
||||
supported_format.name,
|
||||
supported_format.parameters)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -439,7 +445,7 @@ bool MediaCodecVideoEncoder::ProcessHWError(
|
||||
bool reset_if_fallback_unavailable) {
|
||||
ALOGE << "ProcessHWError";
|
||||
if (IsFormatSupported(InternalEncoderFactory().GetSupportedFormats(),
|
||||
codec_.name)) {
|
||||
format_)) {
|
||||
ALOGE << "Fallback to SW encoder.";
|
||||
sw_fallback_required_ = true;
|
||||
return false;
|
||||
@ -457,7 +463,7 @@ int32_t MediaCodecVideoEncoder::ProcessHWErrorOnEncode() {
|
||||
}
|
||||
|
||||
VideoCodecType MediaCodecVideoEncoder::GetCodecType() const {
|
||||
return PayloadStringToCodecType(codec_.name);
|
||||
return PayloadStringToCodecType(format_.name);
|
||||
}
|
||||
|
||||
int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width,
|
||||
@ -1210,20 +1216,20 @@ MediaCodecVideoEncoderFactory::MediaCodecVideoEncoderFactory()
|
||||
: egl_context_(nullptr) {
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
supported_codecs_.clear();
|
||||
supported_formats_.clear();
|
||||
|
||||
bool is_vp8_hw_supported = Java_MediaCodecVideoEncoder_isVp8HwSupported(jni);
|
||||
if (is_vp8_hw_supported) {
|
||||
ALOGD << "VP8 HW Encoder supported.";
|
||||
supported_codecs_.push_back(cricket::VideoCodec(cricket::kVp8CodecName));
|
||||
supported_formats_.push_back(SdpVideoFormat(cricket::kVp8CodecName));
|
||||
}
|
||||
|
||||
bool is_vp9_hw_supported = Java_MediaCodecVideoEncoder_isVp9HwSupported(jni);
|
||||
if (is_vp9_hw_supported) {
|
||||
ALOGD << "VP9 HW Encoder supported.";
|
||||
supported_codecs_.push_back(cricket::VideoCodec(cricket::kVp9CodecName));
|
||||
supported_formats_.push_back(SdpVideoFormat(cricket::kVp9CodecName));
|
||||
}
|
||||
supported_codecs_with_h264_hp_ = supported_codecs_;
|
||||
supported_formats_with_h264_hp_ = supported_formats_;
|
||||
|
||||
// Check if high profile is supported by decoder. If yes, encoder can always
|
||||
// fall back to baseline profile as a subset as high profile.
|
||||
@ -1233,15 +1239,14 @@ MediaCodecVideoEncoderFactory::MediaCodecVideoEncoderFactory()
|
||||
ALOGD << "H.264 High Profile HW Encoder supported.";
|
||||
// TODO(magjed): Enumerate actual level instead of using hardcoded level
|
||||
// 3.1. Level 3.1 is 1280x720@30fps which is enough for now.
|
||||
cricket::VideoCodec constrained_high(cricket::kH264CodecName);
|
||||
SdpVideoFormat constrained_high(cricket::kH264CodecName);
|
||||
const H264::ProfileLevelId constrained_high_profile(
|
||||
H264::kProfileConstrainedHigh, H264::kLevel3_1);
|
||||
constrained_high.SetParam(
|
||||
cricket::kH264FmtpProfileLevelId,
|
||||
*H264::ProfileLevelIdToString(constrained_high_profile));
|
||||
constrained_high.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
|
||||
constrained_high.SetParam(cricket::kH264FmtpPacketizationMode, "1");
|
||||
supported_codecs_with_h264_hp_.push_back(constrained_high);
|
||||
constrained_high.parameters[cricket::kH264FmtpProfileLevelId] =
|
||||
*H264::ProfileLevelIdToString(constrained_high_profile);
|
||||
constrained_high.parameters[cricket::kH264FmtpLevelAsymmetryAllowed] = "1";
|
||||
constrained_high.parameters[cricket::kH264FmtpPacketizationMode] = "1";
|
||||
supported_formats_with_h264_hp_.push_back(constrained_high);
|
||||
}
|
||||
|
||||
bool is_h264_hw_supported =
|
||||
@ -1252,16 +1257,16 @@ MediaCodecVideoEncoderFactory::MediaCodecVideoEncoderFactory()
|
||||
// ready, http://crbug/webrtc/6337. We can negotiate Constrained High
|
||||
// profile as long as we have decode support for it and still send Baseline
|
||||
// since Baseline is a subset of the High profile.
|
||||
cricket::VideoCodec constrained_baseline(cricket::kH264CodecName);
|
||||
SdpVideoFormat constrained_baseline(cricket::kH264CodecName);
|
||||
const H264::ProfileLevelId constrained_baseline_profile(
|
||||
H264::kProfileConstrainedBaseline, H264::kLevel3_1);
|
||||
constrained_baseline.SetParam(
|
||||
cricket::kH264FmtpProfileLevelId,
|
||||
*H264::ProfileLevelIdToString(constrained_baseline_profile));
|
||||
constrained_baseline.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
|
||||
constrained_baseline.SetParam(cricket::kH264FmtpPacketizationMode, "1");
|
||||
supported_codecs_.push_back(constrained_baseline);
|
||||
supported_codecs_with_h264_hp_.push_back(constrained_baseline);
|
||||
constrained_baseline.parameters[cricket::kH264FmtpProfileLevelId] =
|
||||
*H264::ProfileLevelIdToString(constrained_baseline_profile);
|
||||
constrained_baseline.parameters[cricket::kH264FmtpLevelAsymmetryAllowed] =
|
||||
"1";
|
||||
constrained_baseline.parameters[cricket::kH264FmtpPacketizationMode] = "1";
|
||||
supported_formats_.push_back(constrained_baseline);
|
||||
supported_formats_with_h264_hp_.push_back(constrained_baseline);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1286,30 +1291,34 @@ void MediaCodecVideoEncoderFactory::SetEGLContext(JNIEnv* jni,
|
||||
}
|
||||
}
|
||||
|
||||
VideoEncoder* MediaCodecVideoEncoderFactory::CreateVideoEncoder(
|
||||
const cricket::VideoCodec& codec) {
|
||||
if (supported_codecs().empty()) {
|
||||
ALOGW << "No HW video encoder for codec " << codec.name;
|
||||
std::unique_ptr<VideoEncoder> MediaCodecVideoEncoderFactory::CreateVideoEncoder(
|
||||
const SdpVideoFormat& format) {
|
||||
if (GetSupportedFormats().empty()) {
|
||||
ALOGW << "No HW video encoder for codec " << format.name;
|
||||
return nullptr;
|
||||
}
|
||||
if (FindMatchingCodec(supported_codecs(), codec)) {
|
||||
ALOGD << "Create HW video encoder for " << codec.name;
|
||||
if (IsFormatSupported(GetSupportedFormats(), format)) {
|
||||
ALOGD << "Create HW video encoder for " << format.name;
|
||||
JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(jni);
|
||||
return new MediaCodecVideoEncoder(jni, codec, egl_context_);
|
||||
return rtc::MakeUnique<MediaCodecVideoEncoder>(jni, format, egl_context_);
|
||||
}
|
||||
ALOGW << "Can not find HW video encoder for type " << codec.name;
|
||||
ALOGW << "Can not find HW video encoder for type " << format.name;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const std::vector<cricket::VideoCodec>&
|
||||
MediaCodecVideoEncoderFactory::supported_codecs() const {
|
||||
return supported_codecs_with_h264_hp_;
|
||||
std::vector<SdpVideoFormat> MediaCodecVideoEncoderFactory::GetSupportedFormats()
|
||||
const {
|
||||
return supported_formats_with_h264_hp_;
|
||||
}
|
||||
|
||||
void MediaCodecVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder* encoder) {
|
||||
ALOGD << "Destroy video encoder.";
|
||||
delete encoder;
|
||||
VideoEncoderFactory::CodecInfo MediaCodecVideoEncoderFactory::QueryVideoEncoder(
|
||||
const SdpVideoFormat& format) const {
|
||||
VideoEncoderFactory::CodecInfo codec_info;
|
||||
codec_info.is_hardware_accelerated =
|
||||
IsFormatSupported(supported_formats_, format);
|
||||
codec_info.has_internal_source = false;
|
||||
return codec_info;
|
||||
}
|
||||
|
||||
static void JNI_MediaCodecVideoEncoder_FillInputBuffer(
|
||||
|
||||
@ -13,32 +13,32 @@
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "media/engine/webrtcvideoencoderfactory.h"
|
||||
#include "api/video_codecs/video_encoder_factory.h"
|
||||
#include "sdk/android/src/jni/jni_helpers.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
// Implementation of Android MediaCodec based encoder factory.
|
||||
class MediaCodecVideoEncoderFactory
|
||||
: public cricket::WebRtcVideoEncoderFactory {
|
||||
class MediaCodecVideoEncoderFactory : public VideoEncoderFactory {
|
||||
public:
|
||||
MediaCodecVideoEncoderFactory();
|
||||
~MediaCodecVideoEncoderFactory() override;
|
||||
|
||||
void SetEGLContext(JNIEnv* jni, jobject egl_context);
|
||||
|
||||
// WebRtcVideoEncoderFactory implementation.
|
||||
VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override;
|
||||
const std::vector<cricket::VideoCodec>& supported_codecs() const override;
|
||||
void DestroyVideoEncoder(VideoEncoder* encoder) override;
|
||||
// VideoEncoderFactory implementation.
|
||||
std::vector<SdpVideoFormat> GetSupportedFormats() const override;
|
||||
CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const override;
|
||||
std::unique_ptr<VideoEncoder> CreateVideoEncoder(
|
||||
const SdpVideoFormat& format) override;
|
||||
|
||||
private:
|
||||
jobject egl_context_;
|
||||
|
||||
// Empty if platform support is lacking, const after ctor returns.
|
||||
std::vector<cricket::VideoCodec> supported_codecs_;
|
||||
std::vector<cricket::VideoCodec> supported_codecs_with_h264_hp_;
|
||||
std::vector<SdpVideoFormat> supported_formats_;
|
||||
std::vector<SdpVideoFormat> supported_formats_with_h264_hp_;
|
||||
};
|
||||
|
||||
} // namespace jni
|
||||
|
||||
@ -30,21 +30,6 @@ RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
|
||||
return webrtc::CreateRtcEventLogFactory().release();
|
||||
}
|
||||
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
|
||||
const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
|
||||
cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
|
||||
cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer,
|
||||
rtc::scoped_refptr<AudioProcessing> audio_processor) {
|
||||
return cricket::WebRtcMediaEngineFactory::Create(
|
||||
adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
|
||||
video_decoder_factory, audio_mixer, audio_processor);
|
||||
}
|
||||
#endif
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
rtc::scoped_refptr<AudioDeviceModule> adm,
|
||||
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
|
||||
|
||||
@ -29,8 +29,6 @@ class VideoDecoderFactory;
|
||||
|
||||
namespace cricket {
|
||||
class MediaEngineInterface;
|
||||
class WebRtcVideoEncoderFactory;
|
||||
class WebRtcVideoDecoderFactory;
|
||||
} // namespace cricket
|
||||
|
||||
namespace webrtc {
|
||||
@ -39,15 +37,6 @@ namespace jni {
|
||||
CallFactoryInterface* CreateCallFactory();
|
||||
RtcEventLogFactoryInterface* CreateRtcEventLogFactory();
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
|
||||
const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
|
||||
cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
|
||||
cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer,
|
||||
rtc::scoped_refptr<AudioProcessing> audio_processor);
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
rtc::scoped_refptr<AudioDeviceModule> adm,
|
||||
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
|
||||
|
||||
@ -21,17 +21,6 @@ RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
AudioDeviceModule* adm,
|
||||
const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
|
||||
const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
|
||||
cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
|
||||
cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
|
||||
rtc::scoped_refptr<AudioMixer> audio_mixer,
|
||||
rtc::scoped_refptr<AudioProcessing> audio_processor) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
cricket::MediaEngineInterface* CreateMediaEngine(
|
||||
rtc::scoped_refptr<AudioDeviceModule> adm,
|
||||
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
|
||||
|
||||
@ -10,6 +10,9 @@
|
||||
|
||||
#include "sdk/android/src/jni/pc/video.h"
|
||||
|
||||
#include "api/video_codecs/video_decoder_factory.h"
|
||||
#include "api/video_codecs/video_encoder_factory.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
@ -26,10 +29,10 @@ VideoDecoderFactory* CreateVideoDecoderFactory(
|
||||
}
|
||||
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoEncoderFactory* encoder_factory,
|
||||
VideoEncoderFactory* encoder_factory,
|
||||
const JavaRef<jobject>& egl_context) {}
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoDecoderFactory* decoder_factory,
|
||||
VideoDecoderFactory* decoder_factory,
|
||||
const JavaRef<jobject>& egl_context) {}
|
||||
|
||||
void* CreateVideoSource(JNIEnv* env,
|
||||
@ -39,28 +42,21 @@ void* CreateVideoSource(JNIEnv* env,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoEncoderFactory* encoder_factory,
|
||||
jobject egl_context) {}
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoDecoderFactory* decoder_factory,
|
||||
jobject egl_context) {}
|
||||
|
||||
cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory() {
|
||||
std::unique_ptr<VideoEncoderFactory> CreateLegacyVideoEncoderFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
cricket::WebRtcVideoDecoderFactory* CreateLegacyVideoDecoderFactory() {
|
||||
std::unique_ptr<VideoDecoderFactory> CreateLegacyVideoDecoderFactory() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
VideoEncoderFactory* WrapLegacyVideoEncoderFactory(
|
||||
cricket::WebRtcVideoEncoderFactory* legacy_encoder_factory) {
|
||||
std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
|
||||
std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
VideoDecoderFactory* WrapLegacyVideoDecoderFactory(
|
||||
cricket::WebRtcVideoDecoderFactory* legacy_decoder_factory) {
|
||||
std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
|
||||
std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@ -18,8 +18,6 @@
|
||||
#include "api/peerconnectioninterface.h"
|
||||
#include "rtc_base/thread.h"
|
||||
|
||||
using cricket::WebRtcVideoDecoderFactory;
|
||||
using cricket::WebRtcVideoEncoderFactory;
|
||||
using rtc::Thread;
|
||||
|
||||
namespace webrtc {
|
||||
@ -38,8 +36,8 @@ class OwnedFactoryAndThreads {
|
||||
OwnedFactoryAndThreads(std::unique_ptr<Thread> network_thread,
|
||||
std::unique_ptr<Thread> worker_thread,
|
||||
std::unique_ptr<Thread> signaling_thread,
|
||||
WebRtcVideoEncoderFactory* legacy_encoder_factory,
|
||||
WebRtcVideoDecoderFactory* legacy_decoder_factory,
|
||||
VideoEncoderFactory* legacy_encoder_factory,
|
||||
VideoDecoderFactory* legacy_decoder_factory,
|
||||
rtc::NetworkMonitorFactory* network_monitor_factory,
|
||||
PeerConnectionFactoryInterface* factory)
|
||||
: network_thread_(std::move(network_thread)),
|
||||
@ -56,10 +54,10 @@ class OwnedFactoryAndThreads {
|
||||
Thread* network_thread() { return network_thread_.get(); }
|
||||
Thread* signaling_thread() { return signaling_thread_.get(); }
|
||||
Thread* worker_thread() { return worker_thread_.get(); }
|
||||
WebRtcVideoEncoderFactory* legacy_encoder_factory() {
|
||||
VideoEncoderFactory* legacy_encoder_factory() {
|
||||
return legacy_encoder_factory_;
|
||||
}
|
||||
WebRtcVideoDecoderFactory* legacy_decoder_factory() {
|
||||
VideoDecoderFactory* legacy_decoder_factory() {
|
||||
return legacy_decoder_factory_;
|
||||
}
|
||||
rtc::NetworkMonitorFactory* network_monitor_factory() {
|
||||
@ -72,8 +70,8 @@ class OwnedFactoryAndThreads {
|
||||
const std::unique_ptr<Thread> network_thread_;
|
||||
const std::unique_ptr<Thread> worker_thread_;
|
||||
const std::unique_ptr<Thread> signaling_thread_;
|
||||
WebRtcVideoEncoderFactory* legacy_encoder_factory_;
|
||||
WebRtcVideoDecoderFactory* legacy_decoder_factory_;
|
||||
VideoEncoderFactory* legacy_encoder_factory_;
|
||||
VideoDecoderFactory* legacy_decoder_factory_;
|
||||
rtc::NetworkMonitorFactory* network_monitor_factory_;
|
||||
PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor.
|
||||
};
|
||||
|
||||
@ -241,54 +241,43 @@ jlong CreatePeerConnectionFactoryForJava(
|
||||
std::unique_ptr<RtcEventLogFactoryInterface> rtc_event_log_factory(
|
||||
CreateRtcEventLogFactory());
|
||||
|
||||
cricket::WebRtcVideoEncoderFactory* legacy_video_encoder_factory = nullptr;
|
||||
cricket::WebRtcVideoDecoderFactory* legacy_video_decoder_factory = nullptr;
|
||||
VideoEncoderFactory* legacy_video_encoder_factory = nullptr;
|
||||
VideoDecoderFactory* legacy_video_decoder_factory = nullptr;
|
||||
std::unique_ptr<cricket::MediaEngineInterface> media_engine;
|
||||
if (jencoder_factory.is_null() && jdecoder_factory.is_null()) {
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
// This uses the legacy API, which automatically uses the internal SW
|
||||
// codecs in WebRTC.
|
||||
if (video_hw_acceleration_enabled) {
|
||||
legacy_video_encoder_factory = CreateLegacyVideoEncoderFactory();
|
||||
legacy_video_decoder_factory = CreateLegacyVideoDecoderFactory();
|
||||
}
|
||||
media_engine.reset(CreateMediaEngine(
|
||||
audio_device_module, audio_encoder_factory, audio_decoder_factory,
|
||||
legacy_video_encoder_factory, legacy_video_decoder_factory, audio_mixer,
|
||||
audio_processor));
|
||||
#endif
|
||||
|
||||
std::unique_ptr<VideoEncoderFactory> video_encoder_factory = nullptr;
|
||||
if (jencoder_factory.is_null()) {
|
||||
// TODO(bugs.webrtc.org/7925): When all clients switched to injectable
|
||||
// factories, remove the legacy codec factories
|
||||
std::unique_ptr<VideoEncoderFactory> legacy_factory =
|
||||
CreateLegacyVideoEncoderFactory();
|
||||
legacy_video_encoder_factory = legacy_factory.get();
|
||||
video_encoder_factory =
|
||||
WrapLegacyVideoEncoderFactory(std::move(legacy_factory));
|
||||
} else {
|
||||
// This uses the new API, does not automatically include software codecs.
|
||||
std::unique_ptr<VideoEncoderFactory> video_encoder_factory = nullptr;
|
||||
if (jencoder_factory.is_null()) {
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
legacy_video_encoder_factory = CreateLegacyVideoEncoderFactory();
|
||||
video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
|
||||
WrapLegacyVideoEncoderFactory(legacy_video_encoder_factory));
|
||||
#endif
|
||||
} else {
|
||||
video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
|
||||
CreateVideoEncoderFactory(jni, jencoder_factory));
|
||||
}
|
||||
|
||||
std::unique_ptr<VideoDecoderFactory> video_decoder_factory = nullptr;
|
||||
if (jdecoder_factory.is_null()) {
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
legacy_video_decoder_factory = CreateLegacyVideoDecoderFactory();
|
||||
video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
|
||||
WrapLegacyVideoDecoderFactory(legacy_video_decoder_factory));
|
||||
#endif
|
||||
} else {
|
||||
video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
|
||||
CreateVideoDecoderFactory(jni, jdecoder_factory));
|
||||
}
|
||||
|
||||
media_engine.reset(CreateMediaEngine(
|
||||
audio_device_module, audio_encoder_factory, audio_decoder_factory,
|
||||
std::move(video_encoder_factory), std::move(video_decoder_factory),
|
||||
audio_mixer, audio_processor));
|
||||
video_encoder_factory = std::unique_ptr<VideoEncoderFactory>(
|
||||
CreateVideoEncoderFactory(jni, jencoder_factory));
|
||||
}
|
||||
|
||||
std::unique_ptr<VideoDecoderFactory> video_decoder_factory = nullptr;
|
||||
if (jdecoder_factory.is_null()) {
|
||||
// TODO(bugs.webrtc.org/7925): When all clients switched to injectable
|
||||
// factories, remove the legacy codec factories
|
||||
std::unique_ptr<VideoDecoderFactory> legacy_factory =
|
||||
CreateLegacyVideoDecoderFactory();
|
||||
legacy_video_decoder_factory = legacy_factory.get();
|
||||
video_decoder_factory =
|
||||
WrapLegacyVideoDecoderFactory(std::move(legacy_factory));
|
||||
} else {
|
||||
video_decoder_factory = std::unique_ptr<VideoDecoderFactory>(
|
||||
CreateVideoDecoderFactory(jni, jdecoder_factory));
|
||||
}
|
||||
|
||||
media_engine.reset(CreateMediaEngine(
|
||||
audio_device_module, audio_encoder_factory, audio_decoder_factory,
|
||||
std::move(video_encoder_factory), std::move(video_decoder_factory),
|
||||
audio_mixer, audio_processor));
|
||||
|
||||
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
|
||||
CreateModularPeerConnectionFactory(
|
||||
network_thread.get(), worker_thread.get(), signaling_thread.get(),
|
||||
@ -484,14 +473,12 @@ static void JNI_PeerConnectionFactory_SetVideoHwAccelerationOptions(
|
||||
jlong native_factory,
|
||||
const JavaParamRef<jobject>& local_egl_context,
|
||||
const JavaParamRef<jobject>& remote_egl_context) {
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
OwnedFactoryAndThreads* owned_factory =
|
||||
reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
|
||||
SetEglContext(jni, owned_factory->legacy_encoder_factory(),
|
||||
local_egl_context);
|
||||
SetEglContext(jni, owned_factory->legacy_decoder_factory(),
|
||||
remote_egl_context);
|
||||
#endif
|
||||
}
|
||||
|
||||
static jlong JNI_PeerConnectionFactory_GetNativePeerConnectionFactory(
|
||||
|
||||
@ -16,12 +16,9 @@
|
||||
#include "api/video_codecs/video_decoder_factory.h"
|
||||
#include "api/video_codecs/video_encoder_factory.h"
|
||||
#include "api/videosourceproxy.h"
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
#include "media/engine/convert_legacy_video_factory.h" // nogncheck
|
||||
#endif
|
||||
#include "media/engine/webrtcvideodecoderfactory.h"
|
||||
#include "media/engine/webrtcvideoencoderfactory.h"
|
||||
#include "media/engine/convert_legacy_video_factory.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/ptr_util.h"
|
||||
#include "sdk/android/generated_video_jni/jni/EglBase14_jni.h"
|
||||
#include "sdk/android/src/jni/androidmediadecoder_jni.h"
|
||||
#include "sdk/android/src/jni/androidmediaencoder_jni.h"
|
||||
@ -45,9 +42,8 @@ VideoDecoderFactory* CreateVideoDecoderFactory(
|
||||
}
|
||||
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoEncoderFactory* encoder_factory,
|
||||
VideoEncoderFactory* encoder_factory,
|
||||
const JavaRef<jobject>& egl_context) {
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
if (encoder_factory) {
|
||||
MediaCodecVideoEncoderFactory* media_codec_factory =
|
||||
static_cast<MediaCodecVideoEncoderFactory*>(encoder_factory);
|
||||
@ -56,16 +52,10 @@ void SetEglContext(JNIEnv* env,
|
||||
media_codec_factory->SetEGLContext(env, egl_context.obj());
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (Java_Context_isEgl14Context(env, egl_context)) {
|
||||
RTC_LOG(LS_INFO) << "Set EGL context for HW encoding.";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoDecoderFactory* decoder_factory,
|
||||
VideoDecoderFactory* decoder_factory,
|
||||
const JavaRef<jobject>& egl_context) {
|
||||
if (decoder_factory) {
|
||||
MediaCodecVideoDecoderFactory* media_codec_factory =
|
||||
@ -76,7 +66,6 @@ void SetEglContext(JNIEnv* env,
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void* CreateVideoSource(JNIEnv* env,
|
||||
rtc::Thread* signaling_thread,
|
||||
@ -89,31 +78,25 @@ void* CreateVideoSource(JNIEnv* env,
|
||||
.release();
|
||||
}
|
||||
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory() {
|
||||
return new MediaCodecVideoEncoderFactory();
|
||||
std::unique_ptr<VideoEncoderFactory> CreateLegacyVideoEncoderFactory() {
|
||||
return rtc::MakeUnique<MediaCodecVideoEncoderFactory>();
|
||||
}
|
||||
|
||||
cricket::WebRtcVideoDecoderFactory* CreateLegacyVideoDecoderFactory() {
|
||||
return new MediaCodecVideoDecoderFactory();
|
||||
std::unique_ptr<VideoDecoderFactory> CreateLegacyVideoDecoderFactory() {
|
||||
return rtc::MakeUnique<MediaCodecVideoDecoderFactory>();
|
||||
}
|
||||
|
||||
VideoEncoderFactory* WrapLegacyVideoEncoderFactory(
|
||||
cricket::WebRtcVideoEncoderFactory* legacy_encoder_factory) {
|
||||
return ConvertVideoEncoderFactory(
|
||||
std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(
|
||||
legacy_encoder_factory))
|
||||
.release();
|
||||
std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
|
||||
std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory) {
|
||||
return std::unique_ptr<VideoEncoderFactory>(
|
||||
cricket::ConvertVideoEncoderFactory(std::move(legacy_encoder_factory)));
|
||||
}
|
||||
|
||||
VideoDecoderFactory* WrapLegacyVideoDecoderFactory(
|
||||
cricket::WebRtcVideoDecoderFactory* legacy_decoder_factory) {
|
||||
return ConvertVideoDecoderFactory(
|
||||
std::unique_ptr<cricket::WebRtcVideoDecoderFactory>(
|
||||
legacy_decoder_factory))
|
||||
.release();
|
||||
std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
|
||||
std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory) {
|
||||
return std::unique_ptr<VideoDecoderFactory>(
|
||||
cricket::ConvertVideoDecoderFactory(std::move(legacy_decoder_factory)));
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
@ -17,11 +17,6 @@
|
||||
#include "rtc_base/thread.h"
|
||||
#include "sdk/android/native_api/jni/scoped_java_ref.h"
|
||||
|
||||
namespace cricket {
|
||||
class WebRtcVideoEncoderFactory;
|
||||
class WebRtcVideoDecoderFactory;
|
||||
} // namespace cricket
|
||||
|
||||
namespace webrtc {
|
||||
class VideoEncoderFactory;
|
||||
class VideoDecoderFactory;
|
||||
@ -39,10 +34,10 @@ VideoDecoderFactory* CreateVideoDecoderFactory(
|
||||
const JavaRef<jobject>& j_decoder_factory);
|
||||
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoEncoderFactory* encoder_factory,
|
||||
VideoEncoderFactory* encoder_factory,
|
||||
const JavaRef<jobject>& egl_context);
|
||||
void SetEglContext(JNIEnv* env,
|
||||
cricket::WebRtcVideoDecoderFactory* decoder_factory,
|
||||
VideoDecoderFactory* decoder_factory,
|
||||
const JavaRef<jobject>& egl_context);
|
||||
|
||||
void* CreateVideoSource(JNIEnv* env,
|
||||
@ -50,13 +45,13 @@ void* CreateVideoSource(JNIEnv* env,
|
||||
rtc::Thread* worker_thread,
|
||||
jboolean is_screencast);
|
||||
|
||||
cricket::WebRtcVideoEncoderFactory* CreateLegacyVideoEncoderFactory();
|
||||
cricket::WebRtcVideoDecoderFactory* CreateLegacyVideoDecoderFactory();
|
||||
std::unique_ptr<VideoEncoderFactory> CreateLegacyVideoEncoderFactory();
|
||||
std::unique_ptr<VideoDecoderFactory> CreateLegacyVideoDecoderFactory();
|
||||
|
||||
VideoEncoderFactory* WrapLegacyVideoEncoderFactory(
|
||||
cricket::WebRtcVideoEncoderFactory* legacy_encoder_factory);
|
||||
VideoDecoderFactory* WrapLegacyVideoDecoderFactory(
|
||||
cricket::WebRtcVideoDecoderFactory* legacy_decoder_factory);
|
||||
std::unique_ptr<VideoEncoderFactory> WrapLegacyVideoEncoderFactory(
|
||||
std::unique_ptr<VideoEncoderFactory> legacy_encoder_factory);
|
||||
std::unique_ptr<VideoDecoderFactory> WrapLegacyVideoDecoderFactory(
|
||||
std::unique_ptr<VideoDecoderFactory> legacy_decoder_factory);
|
||||
|
||||
} // namespace jni
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user