Bug 1338975 - Don't leak MediaCodec exceptions to CodecProxy. r?jchen
MozReview-Commit-ID: AaouG5McGNb
--- a/mobile/android/base/java/org/mozilla/gecko/media/Codec.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/Codec.java
@@ -72,20 +72,25 @@ import java.util.concurrent.ConcurrentLi
if (!sample.isEOS()) {
Sample temp = sample;
sample = mDequeuedSamples.remove();
sample.info = temp.info;
sample.cryptoInfo = temp.cryptoInfo;
temp.dispose();
}
- if (mInputSamples.offer(sample)) {
+ if (!mInputSamples.offer(sample)) {
+ reportError(Error.FATAL, new Exception("FAIL: input sample queue is full"));
+ return;
+ }
+
+ try {
feedSampleToBuffer();
- } else {
- reportError(Error.FATAL, new Exception("FAIL: input sample queue is full"));
+ } catch (Exception e) {
+ reportError(Error.FATAL, e);
}
}
private synchronized void onBuffer(int index) {
if (mStopped) {
return;
}
@@ -364,20 +369,21 @@ import java.util.concurrent.ConcurrentLi
}
@Override
public synchronized boolean isAdaptivePlaybackSupported() {
return mIsAdaptivePlaybackSupported;
}
private void releaseCodec() {
- // In case Codec.stop() is not called yet.
- mInputProcessor.stop();
- mOutputProcessor.stop();
try {
+ // In case Codec.stop() is not called yet.
+ mInputProcessor.stop();
+ mOutputProcessor.stop();
+
mCodec.release();
} catch (Exception e) {
reportError(Error.FATAL, e);
}
mCodec = null;
}
private String getDecoderForFormat(MediaFormat format) {
@@ -425,31 +431,33 @@ import java.util.concurrent.ConcurrentLi
} catch (RemoteException re) {
re.printStackTrace();
}
}
@Override
public synchronized void stop() throws RemoteException {
if (DEBUG) { Log.d(LOGTAG, "stop " + this); }
- mInputProcessor.stop();
- mOutputProcessor.stop();
try {
+ mInputProcessor.stop();
+ mOutputProcessor.stop();
+
mCodec.stop();
} catch (Exception e) {
reportError(Error.FATAL, e);
}
}
@Override
public synchronized void flush() throws RemoteException {
if (DEBUG) { Log.d(LOGTAG, "flush " + this); }
- mInputProcessor.stop();
- mOutputProcessor.stop();
try {
+ mInputProcessor.stop();
+ mOutputProcessor.stop();
+
mCodec.flush();
if (DEBUG) { Log.d(LOGTAG, "flushed " + this); }
mInputProcessor.start();
mOutputProcessor.start();
mCodec.resumeReceivingInputs();
} catch (Exception e) {
reportError(Error.FATAL, e);
}
@@ -462,17 +470,21 @@ import java.util.concurrent.ConcurrentLi
@Override
public synchronized void queueInput(Sample sample) throws RemoteException {
mInputProcessor.onSample(sample);
}
@Override
public synchronized void releaseOutput(Sample sample, boolean render) {
- mOutputProcessor.onRelease(sample, render);
+ try {
+ mOutputProcessor.onRelease(sample, render);
+ } catch (Exception e) {
+ reportError(Error.FATAL, e);
+ }
}
@Override
public synchronized void release() throws RemoteException {
if (DEBUG) { Log.d(LOGTAG, "release " + this); }
releaseCodec();
mSamplePool.reset();
mSamplePool = null;