|  | /* | 
|  | *  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<VideoCodecInfo> supportedCodecInfos = new LinkedHashSet<VideoCodecInfo>(); | 
|  |  | 
|  | supportedCodecInfos.addAll(Arrays.asList(softwareVideoEncoderFactory.getSupportedCodecs())); | 
|  | supportedCodecInfos.addAll(Arrays.asList(hardwareVideoEncoderFactory.getSupportedCodecs())); | 
|  |  | 
|  | return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]); | 
|  | } | 
|  | } |