Improve error message for unknown encoder

The provided encoder name depends on the selected codec. Improve the
error message and the suggestions.

PR #3757 <https://github.com/Genymobile/scrcpy/pull/3757>
This commit is contained in:
Romain Vimont 2023-02-19 19:58:05 +01:00
parent 90d88a6927
commit 10ef8da95d

View file

@ -63,9 +63,9 @@ public class ScreenEncoder implements Device.RotationListener {
} }
public void streamScreen() throws IOException, ConfigurationException { public void streamScreen() throws IOException, ConfigurationException {
String videoMimeType = streamer.getCodec().getMimeType(); Codec codec = streamer.getCodec();
MediaCodec mediaCodec = createMediaCodec(videoMimeType, encoderName); MediaCodec mediaCodec = createMediaCodec(codec, encoderName);
MediaFormat format = createFormat(videoMimeType, bitRate, maxFps, codecOptions); MediaFormat format = createFormat(codec.getMimeType(), bitRate, maxFps, codecOptions);
IBinder display = createDisplay(); IBinder display = createDisplay();
device.setRotationListener(this); device.setRotationListener(this);
@ -210,28 +210,28 @@ public class ScreenEncoder implements Device.RotationListener {
return result.toArray(new MediaCodecInfo[result.size()]); return result.toArray(new MediaCodecInfo[result.size()]);
} }
private static MediaCodec createMediaCodec(String videoMimeType, String encoderName) throws IOException, ConfigurationException { private static MediaCodec createMediaCodec(Codec codec, String encoderName) throws IOException, ConfigurationException {
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); return MediaCodec.createByCodecName(encoderName);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
Ln.e(buildUnknownEncoderMessage(videoMimeType, encoderName)); Ln.e(buildUnknownEncoderMessage(codec, encoderName));
throw new ConfigurationException("Unknown encoder: " + encoderName); throw new ConfigurationException("Unknown encoder: " + encoderName);
} }
} }
MediaCodec mediaCodec = MediaCodec.createEncoderByType(videoMimeType); MediaCodec mediaCodec = MediaCodec.createEncoderByType(codec.getMimeType());
Ln.d("Using encoder: '" + mediaCodec.getName() + "'"); Ln.d("Using encoder: '" + mediaCodec.getName() + "'");
return mediaCodec; return mediaCodec;
} }
private static String buildUnknownEncoderMessage(String videoMimeType, String encoderName) { private static String buildUnknownEncoderMessage(Codec codec, String encoderName) {
StringBuilder msg = new StringBuilder("Encoder '").append(encoderName).append("' not found"); StringBuilder msg = new StringBuilder("Encoder '").append(encoderName).append("' for ").append(codec.getName()).append(" not found");
MediaCodecInfo[] encoders = listEncoders(videoMimeType); MediaCodecInfo[] encoders = listEncoders(codec.getMimeType());
if (encoders != null && encoders.length > 0) { if (encoders != null && encoders.length > 0) {
msg.append("\nTry to use one of the available encoders:"); msg.append("\nTry to use one of the available encoders:");
for (MediaCodecInfo encoder : encoders) { for (MediaCodecInfo encoder : encoders) {
msg.append("\n scrcpy --encoder='").append(encoder.getName()).append("'"); msg.append("\n scrcpy --codec=").append(codec.getName()).append(" --encoder='").append(encoder.getName()).append("'");
} }
} }
return msg.toString(); return msg.toString();