am a1563026: am 5642a2e0: Merge "Revert "Move overflow checks into SkipCutBuffer""
am: 5700f3eb20

* commit '5700f3eb20ac31fd1839e78364a60bb718e919cf':
  Revert "Move overflow checks into SkipCutBuffer"
diff --git a/include/media/stagefright/SkipCutBuffer.h b/include/media/stagefright/SkipCutBuffer.h
index 61f9949..098aa69 100644
--- a/include/media/stagefright/SkipCutBuffer.h
+++ b/include/media/stagefright/SkipCutBuffer.h
@@ -29,10 +29,9 @@
  */
 class SkipCutBuffer: public RefBase {
  public:
-    // 'skip' is the number of frames to skip from the beginning
-    // 'cut' is the number of frames to cut from the end
-    // 'num16BitChannels' is the number of channels, which are assumed to be 16 bit wide each
-    SkipCutBuffer(size_t skip, size_t cut, size_t num16Channels);
+    // 'skip' is the number of bytes to skip from the beginning
+    // 'cut' is the number of bytes to cut from the end
+    SkipCutBuffer(int32_t skip, int32_t cut);
 
     // Submit one MediaBuffer for skipping and cutting. This may consume all or
     // some of the data in the buffer, or it may add data to it.
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index cb5cfe3..19c4aa1 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -4445,13 +4445,16 @@
                (mEncoderDelay || mEncoderPadding)) {
         int32_t channelCount;
         CHECK(notify->findInt32("channel-count", &channelCount));
+        size_t frameSize = channelCount * sizeof(int16_t);
         if (mSkipCutBuffer != NULL) {
             size_t prevbufsize = mSkipCutBuffer->size();
             if (prevbufsize != 0) {
                 ALOGW("Replacing SkipCutBuffer holding %zu bytes", prevbufsize);
             }
         }
-        mSkipCutBuffer = new SkipCutBuffer(mEncoderDelay, mEncoderPadding, channelCount);
+        mSkipCutBuffer = new SkipCutBuffer(
+                mEncoderDelay * frameSize,
+                mEncoderPadding * frameSize);
     }
 
     notify->post();
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 6938b3c..f73d800 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1751,13 +1751,14 @@
         int32_t numchannels = 0;
         if (delay + padding) {
             if (mOutputFormat->findInt32(kKeyChannelCount, &numchannels)) {
+                size_t frameSize = numchannels * sizeof(int16_t);
                 if (mSkipCutBuffer != NULL) {
                     size_t prevbuffersize = mSkipCutBuffer->size();
                     if (prevbuffersize != 0) {
                         ALOGW("Replacing SkipCutBuffer holding %zu bytes", prevbuffersize);
                     }
                 }
-                mSkipCutBuffer = new SkipCutBuffer(delay, padding, numchannels);
+                mSkipCutBuffer = new SkipCutBuffer(delay * frameSize, padding * frameSize);
             }
         }
     }
diff --git a/media/libstagefright/SkipCutBuffer.cpp b/media/libstagefright/SkipCutBuffer.cpp
index 59beade..1da1e5e 100644
--- a/media/libstagefright/SkipCutBuffer.cpp
+++ b/media/libstagefright/SkipCutBuffer.cpp
@@ -24,31 +24,20 @@
 
 namespace android {
 
-SkipCutBuffer::SkipCutBuffer(size_t skip, size_t cut, size_t num16BitChannels) {
+SkipCutBuffer::SkipCutBuffer(int32_t skip, int32_t cut) {
 
-    mWriteHead = 0;
-    mReadHead = 0;
-    mCapacity = 0;
-    mCutBuffer = NULL;
-
-    if (num16BitChannels == 0 || num16BitChannels > SIZE_MAX / 2) {
-        ALOGW("# channels out of range: %zu, using passthrough instead", num16BitChannels);
-        return;
+    if (skip < 0 || cut < 0 || cut > 64 * 1024) {
+        ALOGW("out of range skip/cut: %d/%d, using passthrough instead", skip, cut);
+        skip = 0;
+        cut = 0;
     }
-    size_t frameSize = num16BitChannels * 2;
-    if (skip > SIZE_MAX / frameSize || cut > SIZE_MAX / frameSize
-            || cut * frameSize > SIZE_MAX - 4096) {
-        ALOGW("out of range skip/cut: %zu/%zu, using passthrough instead",
-                skip, cut);
-        return;
-    }
-    skip *= frameSize;
-    cut *= frameSize;
 
     mFrontPadding = mSkip = skip;
     mBackPadding = cut;
+    mWriteHead = 0;
+    mReadHead = 0;
     mCapacity = cut + 4096;
-    mCutBuffer = new (std::nothrow) char[mCapacity];
+    mCutBuffer = new char[mCapacity];
     ALOGV("skipcutbuffer %d %d %d", skip, cut, mCapacity);
 }
 
@@ -57,11 +46,6 @@
 }
 
 void SkipCutBuffer::submit(MediaBuffer *buffer) {
-    if (mCutBuffer == NULL) {
-        // passthrough mode
-        return;
-    }
-
     int32_t offset = buffer->range_offset();
     int32_t buflen = buffer->range_length();
 
@@ -89,11 +73,6 @@
 }
 
 void SkipCutBuffer::submit(const sp<ABuffer>& buffer) {
-    if (mCutBuffer == NULL) {
-        // passthrough mode
-        return;
-    }
-
     int32_t offset = buffer->offset();
     int32_t buflen = buffer->size();