Injectable software codecs for Android.
This is similar to https://webrtc-review.googlesource.com/c/src/+/3620 for iOS. Using the new WebRtcMediaEngineFactory::Create API, the built-in software video codecs are no longer appended to the injected codecs. To be able to use the software codecs, they are exposed as Java classes through SoftwareVideoEncoderFactory etc. There is also a new DefaultVideoEncoderFactory used by AppRTCMobile. This factory tries to use hardware implementations where available, but falls back to using the injected software codecs. The HardwareVideoEncoderFactory is temporarily also falling back on the software codecs in its default configuration in order to maintain backwards compatibility. Bug: webrtc:7925 Change-Id: I3e8c5ed492ccd160aca968986ad217d7978a951c Reviewed-on: https://webrtc-review.googlesource.com/17480 Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Commit-Queue: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20647}
This commit is contained in:

committed by
Commit Bot

parent
45bbc8ac19
commit
dc1b9f179a
70
sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java
Normal file
70
sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* 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 java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class DefaultVideoEncoderFactory implements VideoEncoderFactory {
|
||||
private final VideoEncoderFactory hardwareVideoEncoderFactory;
|
||||
private final VideoEncoderFactory softwareVideoEncoderFactory;
|
||||
|
||||
public DefaultVideoEncoderFactory(
|
||||
EglBase.Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
|
||||
hardwareVideoEncoderFactory = new HardwareVideoEncoderFactory(
|
||||
eglContext, enableIntelVp8Encoder, enableH264HighProfile, false /* fallbackToSoftware */);
|
||||
softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
|
||||
}
|
||||
|
||||
/* This is used for testing. */
|
||||
DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) {
|
||||
this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory;
|
||||
softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public VideoEncoder createEncoder(VideoCodecInfo info) {
|
||||
List<VideoCodecInfo> hardwareSupportedCodecs =
|
||||
Arrays.asList(hardwareVideoEncoderFactory.getSupportedCodecs());
|
||||
if (containsSameCodec(hardwareSupportedCodecs, info)) {
|
||||
return hardwareVideoEncoderFactory.createEncoder(info);
|
||||
} else {
|
||||
return softwareVideoEncoderFactory.createEncoder(info);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public VideoCodecInfo[] getSupportedCodecs() {
|
||||
List<VideoCodecInfo> supportedCodecInfos = new ArrayList<>();
|
||||
|
||||
supportedCodecInfos.addAll(Arrays.asList(softwareVideoEncoderFactory.getSupportedCodecs()));
|
||||
|
||||
for (VideoCodecInfo info : hardwareVideoEncoderFactory.getSupportedCodecs()) {
|
||||
if (!containsSameCodec(supportedCodecInfos, info)) {
|
||||
supportedCodecInfos.add(info);
|
||||
}
|
||||
}
|
||||
|
||||
return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
|
||||
}
|
||||
|
||||
private static boolean containsSameCodec(List<VideoCodecInfo> infos, VideoCodecInfo info) {
|
||||
for (VideoCodecInfo otherInfo : infos) {
|
||||
if (isSameCodec(info, otherInfo)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static native boolean isSameCodec(VideoCodecInfo info1, VideoCodecInfo info2);
|
||||
}
|
Reference in New Issue
Block a user