am a1563026: am 5642a2e0: Merge "Revert "Move overflow checks into SkipCutBuffer""
* commit 'a1563026c59471183bbc3bc5f6183e663fa5099d':
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 0b81b80..166600b 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -4438,13 +4438,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 4c39194..7ae24dd 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();