Detect codec/encoder mismatch
Fail with an explicit error when the requested encoder does not match the requested codec. Refs #5066 <https://github.com/Genymobile/scrcpy/issues/5066>
This commit is contained in:
parent
f69ac40534
commit
0cc6f6aa09
@ -287,7 +287,13 @@ public final class AudioEncoder implements AsyncProcessor {
|
|||||||
if (encoderName != null) {
|
if (encoderName != null) {
|
||||||
Ln.d("Creating audio encoder by name: '" + encoderName + "'");
|
Ln.d("Creating audio encoder by name: '" + encoderName + "'");
|
||||||
try {
|
try {
|
||||||
return MediaCodec.createByCodecName(encoderName);
|
MediaCodec mediaCodec = MediaCodec.createByCodecName(encoderName);
|
||||||
|
String mimeType = Codec.getMimeType(mediaCodec);
|
||||||
|
if (!codec.getMimeType().equals(mimeType)) {
|
||||||
|
Ln.e("Audio encoder type for \"" + encoderName + "\" (" + mimeType + ") does not match codec type (" + codec.getMimeType() + ")");
|
||||||
|
throw new ConfigurationException("Incorrect encoder type: " + encoderName);
|
||||||
|
}
|
||||||
|
return mediaCodec;
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
Ln.e("Audio encoder '" + encoderName + "' for " + codec.getName() + " not found\n" + LogUtils.buildAudioEncoderListMessage());
|
Ln.e("Audio encoder '" + encoderName + "' for " + codec.getName() + " not found\n" + LogUtils.buildAudioEncoderListMessage());
|
||||||
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.genymobile.scrcpy.util;
|
package com.genymobile.scrcpy.util;
|
||||||
|
|
||||||
|
import android.media.MediaCodec;
|
||||||
|
|
||||||
public interface Codec {
|
public interface Codec {
|
||||||
|
|
||||||
enum Type {
|
enum Type {
|
||||||
@ -14,4 +16,9 @@ public interface Codec {
|
|||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
String getMimeType();
|
String getMimeType();
|
||||||
|
|
||||||
|
static String getMimeType(MediaCodec codec) {
|
||||||
|
String[] types = codec.getCodecInfo().getSupportedTypes();
|
||||||
|
return types.length > 0 ? types[0] : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,13 @@ public class SurfaceEncoder implements AsyncProcessor {
|
|||||||
if (encoderName != null) {
|
if (encoderName != null) {
|
||||||
Ln.d("Creating encoder by name: '" + encoderName + "'");
|
Ln.d("Creating encoder by name: '" + encoderName + "'");
|
||||||
try {
|
try {
|
||||||
return MediaCodec.createByCodecName(encoderName);
|
MediaCodec mediaCodec = MediaCodec.createByCodecName(encoderName);
|
||||||
|
String mimeType = Codec.getMimeType(mediaCodec);
|
||||||
|
if (!codec.getMimeType().equals(mimeType)) {
|
||||||
|
Ln.e("Video encoder type for \"" + encoderName + "\" (" + mimeType + ") does not match codec type (" + codec.getMimeType() + ")");
|
||||||
|
throw new ConfigurationException("Incorrect encoder type: " + encoderName);
|
||||||
|
}
|
||||||
|
return mediaCodec;
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
Ln.e("Video encoder '" + encoderName + "' for " + codec.getName() + " not found\n" + LogUtils.buildVideoEncoderListMessage());
|
Ln.e("Video encoder '" + encoderName + "' for " + codec.getName() + " not found\n" + LogUtils.buildVideoEncoderListMessage());
|
||||||
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user