Merge "Benchmark: Fix for audio encoders on Android 9"
diff --git a/media/tests/benchmark/MediaBenchmarkTest/src/main/java/com/android/media/benchmark/library/Encoder.java b/media/tests/benchmark/MediaBenchmarkTest/src/main/java/com/android/media/benchmark/library/Encoder.java
index 8df462e..45e5574 100644
--- a/media/tests/benchmark/MediaBenchmarkTest/src/main/java/com/android/media/benchmark/library/Encoder.java
+++ b/media/tests/benchmark/MediaBenchmarkTest/src/main/java/com/android/media/benchmark/library/Encoder.java
@@ -29,7 +29,9 @@
 import java.nio.ByteBuffer;
 
 public class Encoder {
-    private static final int ENCODE_DEFAULT_MAX_INPUT_SIZE = 3840;
+    // Change in AUDIO_ENCODE_DEFAULT_MAX_INPUT_SIZE should also be taken to
+    // kDefaultAudioEncodeFrameSize present in BenchmarkCommon.h
+    private static final int AUDIO_ENCODE_DEFAULT_MAX_INPUT_SIZE = 4096;
     private static final String TAG = "Encoder";
     private static final boolean DEBUG = false;
     private static final int kQueueDequeueTimeoutUs = 1000;
@@ -134,7 +136,7 @@
         if (mMime.startsWith("video/")) {
             mFrameSize = frameSize;
         } else {
-            int maxInputSize = ENCODE_DEFAULT_MAX_INPUT_SIZE;
+            int maxInputSize = AUDIO_ENCODE_DEFAULT_MAX_INPUT_SIZE;
             MediaFormat format = mCodec.getInputFormat();
             if (format.containsKey(MediaFormat.KEY_MAX_INPUT_SIZE)) {
                 maxInputSize = format.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE);
@@ -281,19 +283,27 @@
             return;
         }
         int bufSize = inputBuffer.capacity();
-        int bytesRead = mFrameSize;
+        int bytesToRead = mFrameSize;
         if (mInputBufferSize - mOffset < mFrameSize) {
-            bytesRead = (int) (mInputBufferSize - mOffset);
+            bytesToRead = (int) (mInputBufferSize - mOffset);
         }
-        if (bufSize < bytesRead) {
-            mSignalledError = true;
-            return;
+        //b/148655275 - Update Frame size, as Format value may not be valid
+        if (bufSize < bytesToRead) {
+            if(mNumInputFrame == 0) {
+                mFrameSize = bufSize;
+                bytesToRead = bufSize;
+                mNumFrames = (int) ((mInputBufferSize + mFrameSize - 1) / mFrameSize);
+            } else {
+                mSignalledError = true;
+                return;
+            }
         }
-        byte[] inputArray = new byte[bytesRead];
-        mInputStream.read(inputArray, 0, bytesRead);
+
+        byte[] inputArray = new byte[bytesToRead];
+        mInputStream.read(inputArray, 0, bytesToRead);
         inputBuffer.put(inputArray);
         int flag = 0;
-        if (mNumInputFrame >= mNumFrames - 1 || bytesRead == 0) {
+        if (mNumInputFrame >= mNumFrames - 1 || bytesToRead == 0) {
             Log.i(TAG, "Sending EOS on input last frame");
             mSawInputEOS = true;
             flag = MediaCodec.BUFFER_FLAG_END_OF_STREAM;
@@ -304,9 +314,9 @@
         } else {
             presentationTimeUs = mNumInputFrame * mFrameSize * 1000000 / mSampleRate;
         }
-        mediaCodec.queueInputBuffer(inputBufferId, 0, bytesRead, presentationTimeUs, flag);
+        mediaCodec.queueInputBuffer(inputBufferId, 0, bytesToRead, presentationTimeUs, flag);
         mNumInputFrame++;
-        mOffset += bytesRead;
+        mOffset += bytesToRead;
     }
 
     /**
diff --git a/media/tests/benchmark/src/native/common/BenchmarkCommon.h b/media/tests/benchmark/src/native/common/BenchmarkCommon.h
index c11fe36..40a8c9e 100644
--- a/media/tests/benchmark/src/native/common/BenchmarkCommon.h
+++ b/media/tests/benchmark/src/native/common/BenchmarkCommon.h
@@ -35,6 +35,9 @@
 constexpr uint32_t kQueueDequeueTimeoutUs = 1000;
 constexpr uint32_t kMaxCSDStrlen = 16;
 constexpr uint32_t kMaxBufferSize = 1024 * 1024 * 16;
+// Change in kDefaultAudioEncodeFrameSize should also be taken to
+// AUDIO_ENCODE_DEFAULT_MAX_INPUT_SIZE present in Encoder.java
+constexpr uint32_t kDefaultAudioEncodeFrameSize = 4096;
 
 template <typename T>
 class CallBackQueue {
diff --git a/media/tests/benchmark/src/native/encoder/Encoder.cpp b/media/tests/benchmark/src/native/encoder/Encoder.cpp
index 8dfe993..26fb1b9 100644
--- a/media/tests/benchmark/src/native/encoder/Encoder.cpp
+++ b/media/tests/benchmark/src/native/encoder/Encoder.cpp
@@ -47,29 +47,36 @@
             mEncoderDoneCondition.notify_one();
             return;
         }
-        size_t bytesRead = mParams.frameSize;
+        size_t bytesToRead = mParams.frameSize;
         if (mInputBufferSize - mOffset < mParams.frameSize) {
-            bytesRead = mInputBufferSize - mOffset;
+            bytesToRead = mInputBufferSize - mOffset;
         }
-        if (bufSize < bytesRead) {
-            ALOGE("bytes to read %zu bufSize %zu \n", bytesRead, bufSize);
+        //b/148655275 - Update Frame size, as Format value may not be valid
+        if (bufSize < bytesToRead) {
+            if(mNumInputFrame == 0) {
+                mParams.frameSize = bufSize;
+                bytesToRead = bufSize;
+                mParams.numFrames = (mInputBufferSize + mParams.frameSize - 1) / mParams.frameSize;
+            } else {
+                ALOGE("bytes to read %zu bufSize %zu \n", bytesToRead, bufSize);
+                mErrorCode = AMEDIA_ERROR_MALFORMED;
+                mSignalledError = true;
+                mEncoderDoneCondition.notify_one();
+                return;
+            }
+        }
+        if (bytesToRead < mParams.frameSize && mNumInputFrame < mParams.numFrames - 1) {
+            ALOGE("Partial frame at frameID %d bytesToRead %zu frameSize %d total numFrames %d\n",
+                  mNumInputFrame, bytesToRead, mParams.frameSize, mParams.numFrames);
             mErrorCode = AMEDIA_ERROR_MALFORMED;
             mSignalledError = true;
             mEncoderDoneCondition.notify_one();
             return;
         }
-        if (bytesRead < mParams.frameSize && mNumInputFrame < mParams.numFrames - 1) {
-            ALOGE("Partial frame at frameID %d bytesRead %zu frameSize %d total numFrames %d\n",
-                  mNumInputFrame, bytesRead, mParams.frameSize, mParams.numFrames);
-            mErrorCode = AMEDIA_ERROR_MALFORMED;
-            mSignalledError = true;
-            mEncoderDoneCondition.notify_one();
-            return;
-        }
-        mEleStream->read(buf, bytesRead);
+        mEleStream->read(buf, bytesToRead);
         size_t bytesgcount = mEleStream->gcount();
-        if (bytesgcount != bytesRead) {
-            ALOGE("bytes to read %zu actual bytes read %zu \n", bytesRead, bytesgcount);
+        if (bytesgcount != bytesToRead) {
+            ALOGE("bytes to read %zu actual bytes read %zu \n", bytesToRead, bytesgcount);
             mErrorCode = AMEDIA_ERROR_MALFORMED;
             mSignalledError = true;
             mEncoderDoneCondition.notify_one();
@@ -77,7 +84,7 @@
         }
 
         uint32_t flag = 0;
-        if (mNumInputFrame == mParams.numFrames - 1 || bytesRead == 0) {
+        if (mNumInputFrame == mParams.numFrames - 1 || bytesToRead == 0) {
             ALOGD("Sending EOS on input Last frame\n");
             flag |= AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM;
         }
@@ -92,10 +99,10 @@
 
         if (flag == AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) mSawInputEOS = true;
         ALOGV("%s bytesRead : %zd presentationTimeUs : %" PRIu64 " mSawInputEOS : %s", __FUNCTION__,
-              bytesRead, presentationTimeUs, mSawInputEOS ? "TRUE" : "FALSE");
+              bytesToRead, presentationTimeUs, mSawInputEOS ? "TRUE" : "FALSE");
 
         media_status_t status = AMediaCodec_queueInputBuffer(mCodec, bufIdx, 0 /* offset */,
-                                                             bytesRead, presentationTimeUs, flag);
+                                                             bytesToRead, presentationTimeUs, flag);
         if (AMEDIA_OK != status) {
             mErrorCode = status;
             mSignalledError = true;
@@ -103,7 +110,7 @@
             return;
         }
         mNumInputFrame++;
-        mOffset += bytesRead;
+        mOffset += bytesToRead;
     }
 }
 
@@ -220,13 +227,12 @@
     if (!strncmp(mMime, "video/", 6)) {
         mParams.frameSize = mParams.width * mParams.height * 3 / 2;
     } else {
-        mParams.frameSize = 4096;
+        mParams.frameSize = kDefaultAudioEncodeFrameSize;
         // Get mInputMaxBufSize
         AMediaFormat *inputFormat = AMediaCodec_getInputFormat(mCodec);
         AMediaFormat_getInt32(inputFormat, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, &mParams.maxFrameSize);
         if (mParams.maxFrameSize < 0) {
-            ALOGE("Invalid mParams.maxFrameSize %d\n", mParams.maxFrameSize);
-            return AMEDIA_ERROR_INVALID_PARAMETER;
+            mParams.maxFrameSize = kDefaultAudioEncodeFrameSize;
         }
         if (mParams.frameSize > mParams.maxFrameSize) {
             mParams.frameSize = mParams.maxFrameSize;