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:
committed by
Commit Bot
parent
b5d3802b7a
commit
443959b800
@ -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
|
||||
|
||||
Reference in New Issue
Block a user