Bug 1313991 - Rewrite input buffer polling logic. draft
authorJohn Lin <jolin@mozilla.com>
Mon, 21 Nov 2016 15:36:06 +0800
changeset 442797 18173ae54f841a6c7737404ee0b1f6d23aa8de4b
parent 442775 0ddfec7126ec503b54df9c4b7c3b988906f6c882
child 537889 fdabfd38361e50034bb44a4da89bf34d8878c767
push id36814
push userbmo:jolin@mozilla.com
push dateWed, 23 Nov 2016 07:37:38 +0000
bugs1313991
milestone53.0a1
Bug 1313991 - Rewrite input buffer polling logic. - poll all buffers when started or flushed. - retry only for timed out. - remove unnecessary polling MozReview-Commit-ID: DU9vvjJkwDH
mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java
--- a/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java
@@ -207,34 +207,32 @@ final class JellyBeanAsyncCodec implemen
 
             return true;
         }
 
         private void pollInputBuffer() {
             int result = mCodec.dequeueInputBuffer(DEQUEUE_TIMEOUT_US);
             if (result >= 0) {
                 mCallbackSender.notifyInputBuffer(result);
-                schedulePollingIfNotCanceled(BufferPoller.MSG_POLL_INPUT_BUFFERS);
-            } else if (result != MediaCodec.INFO_TRY_AGAIN_LATER) {
+            } else if (result == MediaCodec.INFO_TRY_AGAIN_LATER) {
+                mBufferPoller.schedulePollingIfNotCanceled(BufferPoller.MSG_POLL_INPUT_BUFFERS);
+            } else {
                 mCallbackSender.notifyError(result);
             }
         }
 
         private void pollOutputBuffer() {
             boolean dequeueMoreBuffer = true;
             MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
             int result = mCodec.dequeueOutputBuffer(info, DEQUEUE_TIMEOUT_US);
             if (result >= 0) {
                 if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
                     mOutputEnded = true;
                 }
                 mCallbackSender.notifyOutputBuffer(result, info);
-                if (!hasMessages(MSG_POLL_INPUT_BUFFERS)) {
-                    schedulePollingIfNotCanceled(MSG_POLL_INPUT_BUFFERS);
-                }
             } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
                 mOutputBuffers = mCodec.getOutputBuffers();
             } else if (result == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                 mCallbackSender.notifyOutputFormat(mCodec.getOutputFormat());
             } else if (result == MediaCodec.INFO_TRY_AGAIN_LATER) {
                 // When input ended, keep polling remaining output buffer until EOS.
                 dequeueMoreBuffer = mInputEnded;
             } else {
@@ -310,36 +308,38 @@ final class JellyBeanAsyncCodec implemen
     @Override
     public void start() {
         assertCallbacks();
 
         mCodec.start();
         mInputEnded = false;
         mOutputEnded = false;
         mInputBuffers = mCodec.getInputBuffers();
+        for (int i = 0; i < mInputBuffers.length; i++) {
+            mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
+        }
         mOutputBuffers = mCodec.getOutputBuffers();
-        mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
     }
 
     @Override
     public final void queueInputBuffer(int index, int offset, int size, long presentationTimeUs, int flags) {
         assertCallbacks();
 
         mInputEnded = (flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
 
         try {
             mCodec.queueInputBuffer(index, offset, size, presentationTimeUs, flags);
         } catch (IllegalStateException e) {
             e.printStackTrace();
             mCallbackSender.notifyError(ERROR_CODEC);
             return;
         }
 
+        mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_OUTPUT_BUFFERS);
         mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
-        mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_OUTPUT_BUFFERS);
     }
 
     @Override
     public final void queueSecureInputBuffer(int index,
                                              int offset,
                                              MediaCodec.CryptoInfo cryptoInfo,
                                              long presentationTimeUs,
                                              int flags) {
@@ -383,17 +383,19 @@ final class JellyBeanAsyncCodec implemen
     @Override
     public void flush() {
         assertCallbacks();
 
         mInputEnded = false;
         mOutputEnded = false;
         cancelPendingTasks();
         mCodec.flush();
-        mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
+        for (int i = 0; i < mInputBuffers.length; i++) {
+            mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS);
+        }
     }
 
     private void cancelPendingTasks() {
         mBufferPoller.cancel();
         mCallbackSender.cancel();
     }
 
     @Override