Android: Add software fallback wrapper in Default video codec factories

When both SW and HW video codec is available, create a fallback wrapper.
This CL also makes the ctor public for injecting an external HW codec
factory. This will be useful when making the legacy video codecs
injectable.

Bug: webrtc:7925
Change-Id: I250b18f0c2d5123495436ff432c0442755ab0e94
Reviewed-on: https://webrtc-review.googlesource.com/88366
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23961}
This commit is contained in:
Magnus Jedvert 2018-07-13 10:40:26 +02:00 committed by Commit Bot
parent b5d3802b7a
commit 443959b800
3 changed files with 31 additions and 18 deletions

View File

@ -1090,6 +1090,7 @@ rtc_android_library("default_video_codec_factory_java") {
":hwcodecs_java",
":swcodecs_java",
":video_api_java",
":video_java",
]
}

View File

@ -10,27 +10,36 @@
package org.webrtc;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import javax.annotation.Nullable;
/** Helper class that combines HW and SW decoders. */
public class DefaultVideoDecoderFactory implements VideoDecoderFactory {
private final HardwareVideoDecoderFactory hardwareVideoDecoderFactory;
private final SoftwareVideoDecoderFactory softwareVideoDecoderFactory;
private final VideoDecoderFactory hardwareVideoDecoderFactory;
private final VideoDecoderFactory softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
/** Create decoder factory using default hardware decoder factory. */
public DefaultVideoDecoderFactory(EglBase.Context eglContext) {
hardwareVideoDecoderFactory = new HardwareVideoDecoderFactory(eglContext);
softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
this.hardwareVideoDecoderFactory = new HardwareVideoDecoderFactory(eglContext);
}
/** Create decoder factory using explicit hardware decoder factory. */
DefaultVideoDecoderFactory(VideoDecoderFactory hardwareVideoDecoderFactory) {
this.hardwareVideoDecoderFactory = hardwareVideoDecoderFactory;
}
@Override
public @Nullable VideoDecoder createDecoder(String codecType) {
VideoDecoder decoder = hardwareVideoDecoderFactory.createDecoder(codecType);
if (decoder != null) {
return decoder;
final VideoDecoder softwareDecoder = softwareVideoDecoderFactory.createDecoder(codecType);
final VideoDecoder hardwareDecoder = hardwareVideoDecoderFactory.createDecoder(codecType);
if (hardwareDecoder != null && softwareDecoder != null) {
// Both hardware and software supported, wrap it in a software fallback
return new VideoDecoderFallback(
/* fallback= */ softwareDecoder, /* primary= */ hardwareDecoder);
}
return softwareVideoDecoderFactory.createDecoder(codecType);
return hardwareDecoder != null ? hardwareDecoder : softwareDecoder;
}
@Override

View File

@ -15,31 +15,34 @@ import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
/** Helper class that combines HW and SW encoders. */
public class DefaultVideoEncoderFactory implements VideoEncoderFactory {
private final VideoEncoderFactory hardwareVideoEncoderFactory;
private final VideoEncoderFactory softwareVideoEncoderFactory;
private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
/** Create encoder factory using default hardware encoder factory. */
public DefaultVideoEncoderFactory(
EglBase.Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
hardwareVideoEncoderFactory =
this.hardwareVideoEncoderFactory =
new HardwareVideoEncoderFactory(eglContext, enableIntelVp8Encoder, enableH264HighProfile);
softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
}
/* This is used for testing. */
/** Create encoder factory using explicit hardware encoder factory. */
DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) {
this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory;
softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
}
@Nullable
@Override
public VideoEncoder createEncoder(VideoCodecInfo info) {
final VideoEncoder videoEncoder = hardwareVideoEncoderFactory.createEncoder(info);
if (videoEncoder != null) {
return videoEncoder;
final VideoEncoder softwareEncoder = softwareVideoEncoderFactory.createEncoder(info);
final VideoEncoder hardwareEncoder = hardwareVideoEncoderFactory.createEncoder(info);
if (hardwareEncoder != null && softwareEncoder != null) {
// Both hardware and software supported, wrap it in a software fallback
return new VideoEncoderFallback(
/* fallback= */ softwareEncoder, /* primary= */ hardwareEncoder);
}
return softwareVideoEncoderFactory.createEncoder(info);
return hardwareEncoder != null ? hardwareEncoder : softwareEncoder;
}
@Override