Fix crash if video decoder fails to initialize

This commit is contained in:
Cameron Gutman 2017-05-18 09:58:28 -07:00
parent 9417908848
commit d0ecde1e16
3 changed files with 36 additions and 27 deletions

View File

@ -13,7 +13,7 @@ public class AndroidAudioRenderer implements AudioRenderer {
private AudioTrack track; private AudioTrack track;
@Override @Override
public void setup(int audioConfiguration) { public int setup(int audioConfiguration) {
int channelConfig; int channelConfig;
int bufferSize; int bufferSize;
int bytesPerFrame; int bytesPerFrame;
@ -30,7 +30,7 @@ public class AndroidAudioRenderer implements AudioRenderer {
break; break;
default: default:
LimeLog.severe("Decoder returned unhandled channel count"); LimeLog.severe("Decoder returned unhandled channel count");
return; return -1;
} }
// We're not supposed to request less than the minimum // We're not supposed to request less than the minimum
@ -76,6 +76,7 @@ public class AndroidAudioRenderer implements AudioRenderer {
} }
LimeLog.info("Audio track buffer size: "+bufferSize); LimeLog.info("Audio track buffer size: "+bufferSize);
return 0;
} }
@Override @Override

View File

@ -149,7 +149,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
} }
@Override @Override
public boolean setup(int format, int width, int height, int redrawRate) { public int setup(int format, int width, int height, int redrawRate) {
this.initialWidth = width; this.initialWidth = width;
this.initialHeight = height; this.initialHeight = height;
this.videoFormat = format; this.videoFormat = format;
@ -163,7 +163,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
if (avcDecoder == null) { if (avcDecoder == null) {
LimeLog.severe("No available AVC decoder!"); LimeLog.severe("No available AVC decoder!");
return false; return -1;
} }
// These fixups only apply to H264 decoders // These fixups only apply to H264 decoders
@ -192,14 +192,15 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
if (hevcDecoder == null) { if (hevcDecoder == null) {
LimeLog.severe("No available HEVC decoder!"); LimeLog.severe("No available HEVC decoder!");
return false; return -2;
} }
refFrameInvalidationActive = refFrameInvalidationHevc; refFrameInvalidationActive = refFrameInvalidationHevc;
} }
else { else {
// Unknown format // Unknown format
return false; LimeLog.severe("Unknown format");
return -3;
} }
// Codecs have been known to throw all sorts of crazy runtime exceptions // Codecs have been known to throw all sorts of crazy runtime exceptions
@ -207,7 +208,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
try { try {
videoDecoder = MediaCodec.createByCodecName(selectedDecoderName); videoDecoder = MediaCodec.createByCodecName(selectedDecoderName);
} catch (Exception e) { } catch (Exception e) {
return false; e.printStackTrace();
return -4;
} }
MediaFormat videoFormat = MediaFormat.createVideoFormat(mimeType, width, height); MediaFormat videoFormat = MediaFormat.createVideoFormat(mimeType, width, height);
@ -227,35 +229,40 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
videoFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, Short.MAX_VALUE); videoFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, Short.MAX_VALUE);
} }
videoDecoder.configure(videoFormat, ((SurfaceHolder)renderTarget).getSurface(), null, 0); try {
videoDecoder.setVideoScalingMode(MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT); videoDecoder.configure(videoFormat, ((SurfaceHolder)renderTarget).getSurface(), null, 0);
videoDecoder.setVideoScalingMode(MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);
if (USE_FRAME_RENDER_TIME && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (USE_FRAME_RENDER_TIME && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
videoDecoder.setOnFrameRenderedListener(new MediaCodec.OnFrameRenderedListener() { videoDecoder.setOnFrameRenderedListener(new MediaCodec.OnFrameRenderedListener() {
@Override @Override
public void onFrameRendered(MediaCodec mediaCodec, long presentationTimeUs, long renderTimeNanos) { public void onFrameRendered(MediaCodec mediaCodec, long presentationTimeUs, long renderTimeNanos) {
long delta = (renderTimeNanos / 1000000L) - (presentationTimeUs / 1000); long delta = (renderTimeNanos / 1000000L) - (presentationTimeUs / 1000);
if (delta >= 0 && delta < 1000) { if (delta >= 0 && delta < 1000) {
if (USE_FRAME_RENDER_TIME) { if (USE_FRAME_RENDER_TIME) {
totalTimeMs += delta; totalTimeMs += delta;
}
} }
} }
} }, null);
}, null); }
}
LimeLog.info("Using codec "+selectedDecoderName+" for hardware decoding "+mimeType); LimeLog.info("Using codec "+selectedDecoderName+" for hardware decoding "+mimeType);
// Start the decoder // Start the decoder
videoDecoder.start(); videoDecoder.start();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
legacyInputBuffers = videoDecoder.getInputBuffers(); legacyInputBuffers = videoDecoder.getInputBuffers();
}
} catch (Exception e) {
e.printStackTrace();
return -5;
} }
startRendererThread(); startRendererThread();
return true; return 0;
} }
private void handleDecoderException(Exception e, ByteBuffer buf, int codecFlags) { private void handleDecoderException(Exception e, ByteBuffer buf, int codecFlags) {
@ -456,6 +463,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override
public int submitDecodeUnit(byte[] frameData) { public int submitDecodeUnit(byte[] frameData) {
totalFrames++; totalFrames++;

@ -1 +1 @@
Subproject commit 7794ca7a3ecb4398d977beca138d2e584e533002 Subproject commit f7f1825a874b1345cc3c65484fd0ad38625396e3