• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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