Don't use MediaCodec.setOutputSurface on Nexus 7 with qcom decoder

Issue: #3236

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=167581198
This commit is contained in:
olly 2017-09-05 08:17:44 -07:00 committed by Oliver Woodman
parent a90cef0cb5
commit 0183a83047

View File

@ -78,6 +78,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
private Format[] streamFormats; private Format[] streamFormats;
private CodecMaxValues codecMaxValues; private CodecMaxValues codecMaxValues;
private boolean codecNeedsSetOutputSurfaceWorkaround;
private Surface surface; private Surface surface;
private Surface dummySurface; private Surface dummySurface;
@ -360,7 +361,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
int state = getState(); int state = getState();
if (state == STATE_ENABLED || state == STATE_STARTED) { if (state == STATE_ENABLED || state == STATE_STARTED) {
MediaCodec codec = getCodec(); MediaCodec codec = getCodec();
if (Util.SDK_INT >= 23 && codec != null && surface != null) { if (Util.SDK_INT >= 23 && codec != null && surface != null
&& !codecNeedsSetOutputSurfaceWorkaround) {
setOutputSurfaceV23(codec, surface); setOutputSurfaceV23(codec, surface);
} else { } else {
releaseCodec(); releaseCodec();
@ -431,6 +433,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
protected void onCodecInitialized(String name, long initializedTimestampMs, protected void onCodecInitialized(String name, long initializedTimestampMs,
long initializationDurationMs) { long initializationDurationMs) {
eventDispatcher.decoderInitialized(name, initializedTimestampMs, initializationDurationMs); eventDispatcher.decoderInitialized(name, initializedTimestampMs, initializationDurationMs);
codecNeedsSetOutputSurfaceWorkaround = codecNeedsSetOutputSurfaceWorkaround(name);
} }
@Override @Override
@ -969,6 +972,18 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
return Util.SDK_INT <= 22 && "foster".equals(Util.DEVICE) && "NVIDIA".equals(Util.MANUFACTURER); return Util.SDK_INT <= 22 && "foster".equals(Util.DEVICE) && "NVIDIA".equals(Util.MANUFACTURER);
} }
/**
* Returns whether the device is known to implement {@link MediaCodec#setOutputSurface(Surface)}
* incorrectly.
* <p>
* If true is returned then we fall back to releasing and re-instantiating the codec instead.
*/
private static boolean codecNeedsSetOutputSurfaceWorkaround(String name) {
// Work around https://github.com/google/ExoPlayer/issues/3236
return ("deb".equals(Util.DEVICE) || "flo".equals(Util.DEVICE))
&& "OMX.qcom.video.decoder.avc".equals(name);
}
/** /**
* Returns whether a codec with suitable {@link CodecMaxValues} will support adaptation between * Returns whether a codec with suitable {@link CodecMaxValues} will support adaptation between
* two {@link Format}s. * two {@link Format}s.