/* * Copyright 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ package org.webrtc; import androidx.annotation.Nullable; import java.util.Arrays; import java.util.LinkedHashSet; /** Helper class that combines HW and SW encoders. */ public class DefaultVideoEncoderFactory implements VideoEncoderFactory { private final VideoEncoderFactory hardwareVideoEncoderFactory; private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory(); /** Create encoder factory using default hardware encoder factory. */ public DefaultVideoEncoderFactory( EglBase.Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) { this.hardwareVideoEncoderFactory = new HardwareVideoEncoderFactory(eglContext, enableIntelVp8Encoder, enableH264HighProfile); } /** Create encoder factory using explicit hardware encoder factory. */ DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) { this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory; } @Nullable @Override public VideoEncoder createEncoder(VideoCodecInfo info) { 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 hardwareEncoder != null ? hardwareEncoder : softwareEncoder; } @Override public VideoCodecInfo[] getSupportedCodecs() { LinkedHashSet supportedCodecInfos = new LinkedHashSet(); supportedCodecInfos.addAll(Arrays.asList(softwareVideoEncoderFactory.getSupportedCodecs())); supportedCodecInfos.addAll(Arrays.asList(hardwareVideoEncoderFactory.getSupportedCodecs())); return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]); } }