Bug 1338975 - Don't leak MediaCodec exceptions to CodecProxy. r?jchen draft
authorJohn Lin <jolin@mozilla.com>
Tue, 14 Feb 2017 13:43:35 +0800
changeset 484261 99c52be823c3aa7a5d743f214f0b09ab409dcc4a
parent 484187 1060668405a9399774c205430de4a7001d3f27ac
child 545752 1b4dc81de4e5545990ad20c34d03f284d96f8f07
push id45437
push userbmo:jolin@mozilla.com
push dateWed, 15 Feb 2017 03:25:58 +0000
reviewersjchen
bugs1338975
milestone54.0a1
Bug 1338975 - Don't leak MediaCodec exceptions to CodecProxy. r?jchen MozReview-Commit-ID: AaouG5McGNb
mobile/android/base/java/org/mozilla/gecko/media/Codec.java
--- 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;