1 /* 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 package org.webrtc; 12 13 import androidx.annotation.Nullable; 14 import java.util.Arrays; 15 import java.util.LinkedHashSet; 16 17 /** Helper class that combines HW and SW encoders. */ 18 public class DefaultVideoEncoderFactory implements VideoEncoderFactory { 19 private final VideoEncoderFactory hardwareVideoEncoderFactory; 20 private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory(); 21 22 /** Create encoder factory using default hardware encoder factory. */ DefaultVideoEncoderFactory( EglBase.Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile)23 public DefaultVideoEncoderFactory( 24 EglBase.Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) { 25 this.hardwareVideoEncoderFactory = 26 new HardwareVideoEncoderFactory(eglContext, enableIntelVp8Encoder, enableH264HighProfile); 27 } 28 29 /** Create encoder factory using explicit hardware encoder factory. */ DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory)30 DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) { 31 this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory; 32 } 33 34 @Nullable 35 @Override createEncoder(VideoCodecInfo info)36 public VideoEncoder createEncoder(VideoCodecInfo info) { 37 final VideoEncoder softwareEncoder = softwareVideoEncoderFactory.createEncoder(info); 38 final VideoEncoder hardwareEncoder = hardwareVideoEncoderFactory.createEncoder(info); 39 if (hardwareEncoder != null && softwareEncoder != null) { 40 // Both hardware and software supported, wrap it in a software fallback 41 return new VideoEncoderFallback( 42 /* fallback= */ softwareEncoder, /* primary= */ hardwareEncoder); 43 } 44 return hardwareEncoder != null ? hardwareEncoder : softwareEncoder; 45 } 46 47 @Override getSupportedCodecs()48 public VideoCodecInfo[] getSupportedCodecs() { 49 LinkedHashSet<VideoCodecInfo> supportedCodecInfos = new LinkedHashSet<VideoCodecInfo>(); 50 51 supportedCodecInfos.addAll(Arrays.asList(softwareVideoEncoderFactory.getSupportedCodecs())); 52 supportedCodecInfos.addAll(Arrays.asList(hardwareVideoEncoderFactory.getSupportedCodecs())); 53 54 return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]); 55 } 56 } 57