Move AV1X-AV1 mapping to VideoCodecTypeMime
AV1X->AV1 mapping added to SdpVideoFormatToVideoCodecInfo in https://webrtc-review.googlesource.com/c/src/+/215586 results in discrepancy of codec name between SDP and VideoCodecInfo. That violates VideoCodecInfo design and breaks downstream projects. This CL moves the mapping from VideoCodecInfoToSdpVideoFormat and SdpVideoFormatToVideoCodecInfo to VideoCodecTypeMime. Bug: b/181690054 Change-Id: I2a76524c29b082241f2ec72a60a209ce9b0c7c5f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221205 Reviewed-by: Philip Eliasson <philipel@webrtc.org> Reviewed-by: Xavier Lepaul <xalep@webrtc.org> Commit-Queue: Sergey Silkin <ssilkin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34230}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
e34380a160
commit
1b63db956f
@ -234,6 +234,7 @@ if (is_android) {
|
|||||||
"src/java/org/webrtc/GlGenericDrawer.java",
|
"src/java/org/webrtc/GlGenericDrawer.java",
|
||||||
"src/java/org/webrtc/H264Utils.java",
|
"src/java/org/webrtc/H264Utils.java",
|
||||||
"src/java/org/webrtc/NV21Buffer.java",
|
"src/java/org/webrtc/NV21Buffer.java",
|
||||||
|
"src/java/org/webrtc/VideoCodecMimeType.java",
|
||||||
"src/java/org/webrtc/VideoDecoderWrapper.java",
|
"src/java/org/webrtc/VideoDecoderWrapper.java",
|
||||||
"src/java/org/webrtc/VideoEncoderWrapper.java",
|
"src/java/org/webrtc/VideoEncoderWrapper.java",
|
||||||
"src/java/org/webrtc/WrappedNativeI420Buffer.java",
|
"src/java/org/webrtc/WrappedNativeI420Buffer.java",
|
||||||
@ -403,7 +404,6 @@ if (is_android) {
|
|||||||
"src/java/org/webrtc/MediaCodecWrapperFactory.java",
|
"src/java/org/webrtc/MediaCodecWrapperFactory.java",
|
||||||
"src/java/org/webrtc/MediaCodecWrapperFactoryImpl.java",
|
"src/java/org/webrtc/MediaCodecWrapperFactoryImpl.java",
|
||||||
"src/java/org/webrtc/NV12Buffer.java",
|
"src/java/org/webrtc/NV12Buffer.java",
|
||||||
"src/java/org/webrtc/VideoCodecMimeType.java",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
deps = [
|
deps = [
|
||||||
|
|||||||
@ -94,7 +94,7 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoCodecMimeType type = VideoCodecMimeType.valueOf(input.name);
|
VideoCodecMimeType type = VideoCodecMimeType.fromSdpCodecName(input.getName());
|
||||||
MediaCodecInfo info = findCodecForType(type);
|
MediaCodecInfo info = findCodecForType(type);
|
||||||
|
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
@ -142,7 +142,7 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
|
|||||||
VideoCodecMimeType.VP9, VideoCodecMimeType.H264, VideoCodecMimeType.AV1}) {
|
VideoCodecMimeType.VP9, VideoCodecMimeType.H264, VideoCodecMimeType.AV1}) {
|
||||||
MediaCodecInfo codec = findCodecForType(type);
|
MediaCodecInfo codec = findCodecForType(type);
|
||||||
if (codec != null) {
|
if (codec != null) {
|
||||||
String name = type.name();
|
String name = type.toSdpCodecName();
|
||||||
// TODO(sakal): Always add H264 HP once WebRTC correctly removes codecs that are not
|
// TODO(sakal): Always add H264 HP once WebRTC correctly removes codecs that are not
|
||||||
// supported by the decoder.
|
// supported by the decoder.
|
||||||
if (type == VideoCodecMimeType.H264 && isH264HighProfileSupported(codec)) {
|
if (type == VideoCodecMimeType.H264 && isH264HighProfileSupported(codec)) {
|
||||||
|
|||||||
@ -25,14 +25,18 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public VideoDecoder createDecoder(VideoCodecInfo codecType) {
|
public VideoDecoder createDecoder(VideoCodecInfo codecInfo) {
|
||||||
if (codecType.getName().equalsIgnoreCase("VP8")) {
|
String codecName = codecInfo.getName();
|
||||||
|
|
||||||
|
if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP8.toSdpCodecName())) {
|
||||||
return new LibvpxVp8Decoder();
|
return new LibvpxVp8Decoder();
|
||||||
}
|
}
|
||||||
if (codecType.getName().equalsIgnoreCase("VP9") && LibvpxVp9Decoder.nativeIsSupported()) {
|
if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP9.toSdpCodecName())
|
||||||
|
&& LibvpxVp9Decoder.nativeIsSupported()) {
|
||||||
return new LibvpxVp9Decoder();
|
return new LibvpxVp9Decoder();
|
||||||
}
|
}
|
||||||
if (codecType.getName().equalsIgnoreCase("AV1") && LibaomAv1Decoder.nativeIsSupported()) {
|
if (codecName.equalsIgnoreCase(VideoCodecMimeType.AV1.toSdpCodecName())
|
||||||
|
&& LibaomAv1Decoder.nativeIsSupported()) {
|
||||||
return new LibaomAv1Decoder();
|
return new LibaomAv1Decoder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,12 +51,12 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory {
|
|||||||
static VideoCodecInfo[] supportedCodecs() {
|
static VideoCodecInfo[] supportedCodecs() {
|
||||||
List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();
|
List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();
|
||||||
|
|
||||||
codecs.add(new VideoCodecInfo("VP8", new HashMap<>()));
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.toSdpCodecName(), new HashMap<>()));
|
||||||
if (LibvpxVp9Decoder.nativeIsSupported()) {
|
if (LibvpxVp9Decoder.nativeIsSupported()) {
|
||||||
codecs.add(new VideoCodecInfo("VP9", new HashMap<>()));
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.toSdpCodecName(), new HashMap<>()));
|
||||||
}
|
}
|
||||||
if (LibaomAv1Decoder.nativeIsSupported()) {
|
if (LibaomAv1Decoder.nativeIsSupported()) {
|
||||||
codecs.add(new VideoCodecInfo("AV1", new HashMap<>()));
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.toSdpCodecName(), new HashMap<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||||
|
|||||||
@ -18,14 +18,18 @@ import java.util.List;
|
|||||||
public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {
|
public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public VideoEncoder createEncoder(VideoCodecInfo info) {
|
public VideoEncoder createEncoder(VideoCodecInfo codecInfo) {
|
||||||
if (info.name.equalsIgnoreCase("VP8")) {
|
String codecName = codecInfo.getName();
|
||||||
|
|
||||||
|
if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP8.toSdpCodecName())) {
|
||||||
return new LibvpxVp8Encoder();
|
return new LibvpxVp8Encoder();
|
||||||
}
|
}
|
||||||
if (info.name.equalsIgnoreCase("VP9") && LibvpxVp9Encoder.nativeIsSupported()) {
|
if (codecName.equalsIgnoreCase(VideoCodecMimeType.VP9.toSdpCodecName())
|
||||||
|
&& LibvpxVp9Encoder.nativeIsSupported()) {
|
||||||
return new LibvpxVp9Encoder();
|
return new LibvpxVp9Encoder();
|
||||||
}
|
}
|
||||||
if (info.name.equalsIgnoreCase("AV1") && LibaomAv1Encoder.nativeIsSupported()) {
|
if (codecName.equalsIgnoreCase(VideoCodecMimeType.AV1.toSdpCodecName())
|
||||||
|
&& LibaomAv1Encoder.nativeIsSupported()) {
|
||||||
return new LibaomAv1Encoder();
|
return new LibaomAv1Encoder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,12 +44,12 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {
|
|||||||
static VideoCodecInfo[] supportedCodecs() {
|
static VideoCodecInfo[] supportedCodecs() {
|
||||||
List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();
|
List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();
|
||||||
|
|
||||||
codecs.add(new VideoCodecInfo("VP8", new HashMap<>()));
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.toSdpCodecName(), new HashMap<>()));
|
||||||
if (LibvpxVp9Encoder.nativeIsSupported()) {
|
if (LibvpxVp9Encoder.nativeIsSupported()) {
|
||||||
codecs.add(new VideoCodecInfo("VP9", new HashMap<>()));
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.toSdpCodecName(), new HashMap<>()));
|
||||||
}
|
}
|
||||||
if (LibaomAv1Encoder.nativeIsSupported()) {
|
if (LibaomAv1Encoder.nativeIsSupported()) {
|
||||||
codecs.add(new VideoCodecInfo("AV1", new HashMap<>()));
|
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.toSdpCodecName(), new HashMap<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||||
|
|||||||
@ -73,7 +73,7 @@ public class DefaultVideoEncoderFactoryTest {
|
|||||||
assertEquals(5, videoCodecs.length);
|
assertEquals(5, videoCodecs.length);
|
||||||
assertEquals("VP8", videoCodecs[0].name);
|
assertEquals("VP8", videoCodecs[0].name);
|
||||||
assertEquals("VP9", videoCodecs[1].name);
|
assertEquals("VP9", videoCodecs[1].name);
|
||||||
assertEquals("AV1", videoCodecs[2].name);
|
assertEquals("AV1X", videoCodecs[2].name);
|
||||||
assertEquals("H264", videoCodecs[3].name);
|
assertEquals("H264", videoCodecs[3].name);
|
||||||
assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id"));
|
assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id"));
|
||||||
assertEquals("H264", videoCodecs[4].name);
|
assertEquals("H264", videoCodecs[4].name);
|
||||||
@ -89,7 +89,7 @@ public class DefaultVideoEncoderFactoryTest {
|
|||||||
assertEquals(4, videoCodecs.length);
|
assertEquals(4, videoCodecs.length);
|
||||||
assertEquals("VP8", videoCodecs[0].name);
|
assertEquals("VP8", videoCodecs[0].name);
|
||||||
assertEquals("VP9", videoCodecs[1].name);
|
assertEquals("VP9", videoCodecs[1].name);
|
||||||
assertEquals("AV1", videoCodecs[2].name);
|
assertEquals("AV1X", videoCodecs[2].name);
|
||||||
assertEquals("H264", videoCodecs[3].name);
|
assertEquals("H264", videoCodecs[3].name);
|
||||||
assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id"));
|
assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id"));
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ public class DefaultVideoEncoderFactoryTest {
|
|||||||
assertEquals(5, videoCodecs.length);
|
assertEquals(5, videoCodecs.length);
|
||||||
assertEquals("VP8", videoCodecs[0].name);
|
assertEquals("VP8", videoCodecs[0].name);
|
||||||
assertEquals("VP9", videoCodecs[1].name);
|
assertEquals("VP9", videoCodecs[1].name);
|
||||||
assertEquals("AV1", videoCodecs[2].name);
|
assertEquals("AV1X", videoCodecs[2].name);
|
||||||
assertEquals("H264", videoCodecs[3].name);
|
assertEquals("H264", videoCodecs[3].name);
|
||||||
assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id"));
|
assertEquals("42e01f", videoCodecs[3].params.get("profile-level-id"));
|
||||||
assertEquals("H264", videoCodecs[4].name);
|
assertEquals("H264", videoCodecs[4].name);
|
||||||
|
|||||||
@ -46,7 +46,7 @@ class MediaCodecVideoDecoderFactory implements VideoDecoderFactory {
|
|||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public VideoDecoder createDecoder(VideoCodecInfo codecType) {
|
public VideoDecoder createDecoder(VideoCodecInfo codecType) {
|
||||||
VideoCodecMimeType type = VideoCodecMimeType.valueOf(codecType.getName());
|
VideoCodecMimeType type = VideoCodecMimeType.fromSdpCodecName(codecType.getName());
|
||||||
MediaCodecInfo info = findCodecForType(type);
|
MediaCodecInfo info = findCodecForType(type);
|
||||||
|
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
@ -68,7 +68,7 @@ class MediaCodecVideoDecoderFactory implements VideoDecoderFactory {
|
|||||||
VideoCodecMimeType.VP9, VideoCodecMimeType.H264, VideoCodecMimeType.AV1}) {
|
VideoCodecMimeType.VP9, VideoCodecMimeType.H264, VideoCodecMimeType.AV1}) {
|
||||||
MediaCodecInfo codec = findCodecForType(type);
|
MediaCodecInfo codec = findCodecForType(type);
|
||||||
if (codec != null) {
|
if (codec != null) {
|
||||||
String name = type.name();
|
String name = type.toSdpCodecName();
|
||||||
if (type == VideoCodecMimeType.H264 && isH264HighProfileSupported(codec)) {
|
if (type == VideoCodecMimeType.H264 && isH264HighProfileSupported(codec)) {
|
||||||
supportedCodecInfos.add(new VideoCodecInfo(
|
supportedCodecInfos.add(new VideoCodecInfo(
|
||||||
name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ true)));
|
name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ true)));
|
||||||
|
|||||||
@ -26,4 +26,12 @@ enum VideoCodecMimeType {
|
|||||||
String mimeType() {
|
String mimeType() {
|
||||||
return mimeType;
|
return mimeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VideoCodecMimeType fromSdpCodecName(String codecName) {
|
||||||
|
return codecName.equals("AV1X") ? AV1 : valueOf(codecName);
|
||||||
|
}
|
||||||
|
|
||||||
|
String toSdpCodecName() {
|
||||||
|
return this == AV1 ? "AV1X" : name();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,33 +19,18 @@ namespace jni {
|
|||||||
|
|
||||||
SdpVideoFormat VideoCodecInfoToSdpVideoFormat(JNIEnv* jni,
|
SdpVideoFormat VideoCodecInfoToSdpVideoFormat(JNIEnv* jni,
|
||||||
const JavaRef<jobject>& j_info) {
|
const JavaRef<jobject>& j_info) {
|
||||||
std::string codecName =
|
|
||||||
JavaToNativeString(jni, Java_VideoCodecInfo_getName(jni, j_info));
|
|
||||||
std::string sdpCodecName;
|
|
||||||
if (codecName == "AV1") {
|
|
||||||
// TODO(yyaroshevich): Undo mapping once AV1 sdp name is standardized
|
|
||||||
sdpCodecName = "AV1X";
|
|
||||||
} else {
|
|
||||||
sdpCodecName = codecName;
|
|
||||||
}
|
|
||||||
return SdpVideoFormat(
|
return SdpVideoFormat(
|
||||||
sdpCodecName,
|
JavaToNativeString(jni, Java_VideoCodecInfo_getName(jni, j_info)),
|
||||||
JavaToNativeStringMap(jni, Java_VideoCodecInfo_getParams(jni, j_info)));
|
JavaToNativeStringMap(jni, Java_VideoCodecInfo_getParams(jni, j_info)));
|
||||||
}
|
}
|
||||||
|
|
||||||
ScopedJavaLocalRef<jobject> SdpVideoFormatToVideoCodecInfo(
|
ScopedJavaLocalRef<jobject> SdpVideoFormatToVideoCodecInfo(
|
||||||
JNIEnv* jni,
|
JNIEnv* jni,
|
||||||
const SdpVideoFormat& format) {
|
const SdpVideoFormat& format) {
|
||||||
std::string codecName;
|
|
||||||
if (format.name == "AV1X" || format.name == "AV1") {
|
|
||||||
codecName = "AV1";
|
|
||||||
} else {
|
|
||||||
codecName = format.name;
|
|
||||||
}
|
|
||||||
ScopedJavaLocalRef<jobject> j_params =
|
ScopedJavaLocalRef<jobject> j_params =
|
||||||
NativeToJavaStringMap(jni, format.parameters);
|
NativeToJavaStringMap(jni, format.parameters);
|
||||||
return Java_VideoCodecInfo_Constructor(
|
return Java_VideoCodecInfo_Constructor(
|
||||||
jni, NativeToJavaString(jni, codecName), j_params);
|
jni, NativeToJavaString(jni, format.name), j_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace jni
|
} // namespace jni
|
||||||
|
|||||||
Reference in New Issue
Block a user