Add support for SW fallback decoder in VideoProcessor.

BUG=none

Change-Id: Ib144b377115a48d26ff053e3b4b43f5260aa9f84
Reviewed-on: https://webrtc-review.googlesource.com/3760
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#19999}
This commit is contained in:
Rasmus Brandt
2017-09-27 13:14:14 +02:00
committed by Commit Bot
parent c9d5b05ef4
commit 638200e1eb
3 changed files with 19 additions and 19 deletions

View File

@ -99,8 +99,7 @@ struct TestConfig {
// Should the hardware codecs be wrapped in software fallbacks?
bool sw_fallback_encoder = false;
// TODO(brandtr): Add support for SW decoder fallbacks, when
// webrtc::VideoDecoder's can be wrapped in std::unique_ptr's.
bool sw_fallback_decoder = false;
};
// Handles encoding/decoding of video using the VideoEncoder/VideoDecoder

View File

@ -23,6 +23,7 @@
#include "media/engine/internaldecoderfactory.h"
#include "media/engine/internalencoderfactory.h"
#include "media/engine/videodecodersoftwarefallbackwrapper.h"
#include "media/engine/videoencodersoftwarefallbackwrapper.h"
#include "modules/video_coding/codecs/vp8/include/vp8_common_types.h"
#include "modules/video_coding/include/video_codec_interface.h"
@ -302,18 +303,19 @@ void VideoProcessorIntegrationTest::CreateEncoderAndDecoder() {
encoder_factory.reset(new cricket::InternalEncoderFactory());
}
std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory;
if (config_.hw_decoder) {
#if defined(WEBRTC_ANDROID)
decoder_factory_.reset(new jni::MediaCodecVideoDecoderFactory());
decoder_factory.reset(new jni::MediaCodecVideoDecoderFactory());
#elif defined(WEBRTC_IOS)
EXPECT_EQ(kVideoCodecH264, config_.codec_settings.codecType)
<< "iOS HW codecs only support H264.";
decoder_factory_ = CreateObjCDecoderFactory();
decoder_factory = CreateObjCDecoderFactory();
#else
RTC_NOTREACHED() << "Only support HW decoder on Android and iOS.";
#endif
} else {
decoder_factory_.reset(new cricket::InternalDecoderFactory());
decoder_factory.reset(new cricket::InternalDecoderFactory());
}
cricket::VideoCodec codec;
@ -322,21 +324,21 @@ void VideoProcessorIntegrationTest::CreateEncoderAndDecoder() {
case kVideoCodecVP8:
codec = cricket::VideoCodec(cricket::kVp8CodecName);
encoder_.reset(encoder_factory->CreateVideoEncoder(codec));
decoder_ =
decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params);
decoder_.reset(
decoder_factory->CreateVideoDecoderWithParams(codec, decoder_params));
break;
case kVideoCodecVP9:
codec = cricket::VideoCodec(cricket::kVp9CodecName);
encoder_.reset(encoder_factory->CreateVideoEncoder(codec));
decoder_ =
decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params);
decoder_.reset(
decoder_factory->CreateVideoDecoderWithParams(codec, decoder_params));
break;
case kVideoCodecH264:
// TODO(brandtr): Generalize so that we support multiple profiles here.
codec = cricket::VideoCodec(cricket::kH264CodecName);
encoder_.reset(encoder_factory->CreateVideoEncoder(codec));
decoder_ =
decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params);
decoder_.reset(
decoder_factory->CreateVideoDecoderWithParams(codec, decoder_params));
break;
default:
RTC_NOTREACHED();
@ -347,6 +349,10 @@ void VideoProcessorIntegrationTest::CreateEncoderAndDecoder() {
encoder_ = rtc::MakeUnique<VideoEncoderSoftwareFallbackWrapper>(
codec, std::move(encoder_));
}
if (config_.sw_fallback_decoder) {
decoder_ = rtc::MakeUnique<VideoDecoderSoftwareFallbackWrapper>(
config_.codec_settings.codecType, std::move(decoder_));
}
EXPECT_TRUE(encoder_) << "Encoder not successfully created.";
EXPECT_TRUE(decoder_) << "Decoder not successfully created.";
@ -354,7 +360,7 @@ void VideoProcessorIntegrationTest::CreateEncoderAndDecoder() {
void VideoProcessorIntegrationTest::DestroyEncoderAndDecoder() {
encoder_.reset();
decoder_factory_->DestroyVideoDecoder(decoder_);
decoder_.reset();
}
void VideoProcessorIntegrationTest::SetUpAndInitObjects(
@ -407,12 +413,8 @@ void VideoProcessorIntegrationTest::SetUpAndInitObjects(
rtc::Event sync_event(false, false);
task_queue->PostTask([this, &sync_event]() {
// TODO(brandtr): std::move |encoder_| and |decoder_| into the
// VideoProcessor when we are able to store |decoder_| in a
// std::unique_ptr. That is, when https://codereview.webrtc.org/3009973002
// has been relanded.
processor_ = rtc::MakeUnique<VideoProcessor>(
encoder_.get(), decoder_, analysis_frame_reader_.get(),
encoder_.get(), decoder_.get(), analysis_frame_reader_.get(),
analysis_frame_writer_.get(), packet_manipulator_.get(), config_,
&stats_, encoded_frame_writer_.get(), decoded_frame_writer_.get());
processor_->Init();

View File

@ -194,8 +194,7 @@ class VideoProcessorIntegrationTest : public testing::Test {
// Codecs.
std::unique_ptr<VideoEncoder> encoder_;
std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory_;
VideoDecoder* decoder_;
std::unique_ptr<VideoDecoder> decoder_;
// Helper objects.
std::unique_ptr<FrameReader> analysis_frame_reader_;