Cleanup video decoder teardown paths

This commit is contained in:
Cameron Gutman 2017-06-16 19:11:39 -07:00
parent 6f82f82abb
commit 60de065836

View File

@ -294,8 +294,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
} }
} }
// Only throw if the surface is still around and we're not stopping // Only throw if we're not stopping
if (!stopping && renderTarget.getSurface().isValid()) { if (!stopping) {
if (buf != null || codecFlags != 0) { if (buf != null || codecFlags != 0) {
throw new RendererException(this, e, buf, codecFlags); throw new RendererException(this, e, buf, codecFlags);
} }
@ -311,7 +311,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
@Override @Override
public void run() { public void run() {
BufferInfo info = new BufferInfo(); BufferInfo info = new BufferInfo();
while (!isInterrupted()) { while (!stopping) {
try { try {
// Try to output a frame // Try to output a frame
int outIndex = videoDecoder.dequeueOutputBuffer(info, 50000); int outIndex = videoDecoder.dequeueOutputBuffer(info, 50000);
@ -369,7 +369,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
public void run() { public void run() {
// This thread exists to keep the CPU at a higher DVFS state on devices // This thread exists to keep the CPU at a higher DVFS state on devices
// where the governor scales clock speed sporadically, causing dropped frames. // where the governor scales clock speed sporadically, causing dropped frames.
while (!isInterrupted()) { while (!stopping) {
try { try {
Thread.sleep(0, 1); Thread.sleep(0, 1);
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -421,14 +421,15 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
public void prepareForStop() { public void prepareForStop() {
// Let the decoding code know to ignore codec exceptions now // Let the decoding code know to ignore codec exceptions now
stopping = true; stopping = true;
// Halt the rendering thread
rendererThread.interrupt();
} }
@Override @Override
public void stop() { public void stop() {
stopping = true; // May be called already, but we'll call it now to be safe
prepareForStop();
// Halt the rendering thread
rendererThread.interrupt();
try { try {
// Invalidate pending decode buffers // Invalidate pending decode buffers
@ -653,13 +654,13 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
inputBufferIndex = dequeueInputBuffer(); inputBufferIndex = dequeueInputBuffer();
if (inputBufferIndex < 0) { if (inputBufferIndex < 0) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
buf = getEmptyInputBuffer(inputBufferIndex); buf = getEmptyInputBuffer(inputBufferIndex);
if (buf == null) { if (buf == null) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
// Write the annex B header // Write the annex B header
@ -687,13 +688,13 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
inputBufferIndex = dequeueInputBuffer(); inputBufferIndex = dequeueInputBuffer();
if (inputBufferIndex < 0) { if (inputBufferIndex < 0) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
buf = getEmptyInputBuffer(inputBufferIndex); buf = getEmptyInputBuffer(inputBufferIndex);
if (buf == null) { if (buf == null) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
if (needsBaselineSpsHack) { if (needsBaselineSpsHack) {
@ -726,13 +727,13 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
inputBufferIndex = dequeueInputBuffer(); inputBufferIndex = dequeueInputBuffer();
if (inputBufferIndex < 0) { if (inputBufferIndex < 0) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
buf = getEmptyInputBuffer(inputBufferIndex); buf = getEmptyInputBuffer(inputBufferIndex);
if (buf == null) { if (buf == null) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
// When we get the PPS, submit the VPS and SPS together with // When we get the PPS, submit the VPS and SPS together with
@ -751,13 +752,13 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
inputBufferIndex = dequeueInputBuffer(); inputBufferIndex = dequeueInputBuffer();
if (inputBufferIndex < 0) { if (inputBufferIndex < 0) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
buf = getEmptyInputBuffer(inputBufferIndex); buf = getEmptyInputBuffer(inputBufferIndex);
if (buf == null) { if (buf == null) {
// We're being torn down now // We're being torn down now
return MoonBridge.DR_OK; return MoonBridge.DR_NEED_IDR;
} }
} }