summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/SkipCutBuffer.cpp
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2012-03-28 16:38:37 -0700
committerMarco Nelissen <marcone@google.com>2012-03-29 09:28:47 -0700
commitcb5b766bb0a3ed992998a5bd66de0ee1d2223b81 (patch)
treee4d3d93e823d0c5c691549d9966f7660de1373df /media/libstagefright/SkipCutBuffer.cpp
parent559bf2836f5da25b75bfb229fec0d20d540ee426 (diff)
downloadframeworks_av-cb5b766bb0a3ed992998a5bd66de0ee1d2223b81.zip
frameworks_av-cb5b766bb0a3ed992998a5bd66de0ee1d2223b81.tar.gz
frameworks_av-cb5b766bb0a3ed992998a5bd66de0ee1d2223b81.tar.bz2
Add ABuffer support to SkipCutBuffer
Add support for ABuffer to SkipCutBuffer, and make it (re)allocate an appropriately sized buffer when needed, rather then relying on the caller to tell it ahead of time how big the buffers are going to be. Change-Id: I8b5c9ba5dd2fc13ef8870b7d4fe93a1bfdc7a626
Diffstat (limited to 'media/libstagefright/SkipCutBuffer.cpp')
-rwxr-xr-xmedia/libstagefright/SkipCutBuffer.cpp48
1 files changed, 43 insertions, 5 deletions
diff --git a/media/libstagefright/SkipCutBuffer.cpp b/media/libstagefright/SkipCutBuffer.cpp
index 6d331b0..773854f 100755
--- a/media/libstagefright/SkipCutBuffer.cpp
+++ b/media/libstagefright/SkipCutBuffer.cpp
@@ -24,12 +24,12 @@
namespace android {
-SkipCutBuffer::SkipCutBuffer(int32_t skip, int32_t cut, int32_t output_size) {
+SkipCutBuffer::SkipCutBuffer(int32_t skip, int32_t cut) {
mFrontPadding = skip;
mBackPadding = cut;
mWriteHead = 0;
mReadHead = 0;
- mCapacity = cut + output_size;
+ mCapacity = cut + 4096;
mCutBuffer = new char[mCapacity];
ALOGV("skipcutbuffer %d %d %d", skip, cut, mCapacity);
}
@@ -65,6 +65,33 @@ void SkipCutBuffer::submit(MediaBuffer *buffer) {
buffer->set_range(0, copied);
}
+void SkipCutBuffer::submit(const sp<ABuffer>& buffer) {
+ int32_t offset = buffer->offset();
+ int32_t buflen = buffer->size();
+
+ // drop the initial data from the buffer if needed
+ if (mFrontPadding > 0) {
+ // still data left to drop
+ int32_t to_drop = (buflen < mFrontPadding) ? buflen : mFrontPadding;
+ offset += to_drop;
+ buflen -= to_drop;
+ buffer->setRange(offset, buflen);
+ mFrontPadding -= to_drop;
+ }
+
+
+ // append data to cutbuffer
+ char *src = (char*) buffer->data();
+ write(src, buflen);
+
+
+ // the mediabuffer is now empty. Fill it from cutbuffer, always leaving
+ // at least mBackPadding bytes in the cutbuffer
+ char *dst = (char*) buffer->base();
+ size_t copied = read(dst, buffer->capacity());
+ buffer->setRange(0, copied);
+}
+
void SkipCutBuffer::clear() {
mWriteHead = mReadHead = 0;
}
@@ -73,8 +100,19 @@ void SkipCutBuffer::write(const char *src, size_t num) {
int32_t sizeused = (mWriteHead - mReadHead);
if (sizeused < 0) sizeused += mCapacity;
- // everything must fit
- CHECK_GE((mCapacity - size_t(sizeused)), num);
+ // Everything must fit. Make sure the buffer is a little larger than needed,
+ // so there is no ambiguity as to whether mWriteHead == mReadHead means buffer
+ // full or empty
+ size_t available = mCapacity - sizeused - 32;
+ if (available < num) {
+ int32_t newcapacity = mCapacity + (num - available);
+ char * newbuffer = new char[newcapacity];
+ memcpy(newbuffer, mCutBuffer, mCapacity);
+ delete [] mCutBuffer;
+ mCapacity = newcapacity;
+ mCutBuffer = newbuffer;
+ ALOGV("reallocated buffer at size %d", newcapacity);
+ }
size_t copyfirst = (mCapacity - mWriteHead);
if (copyfirst > num) copyfirst = num;
@@ -100,7 +138,7 @@ size_t SkipCutBuffer::read(char *dst, size_t num) {
if (available <=0) {
return 0;
}
- if (available < num) {
+ if (available < int32_t(num)) {
num = available;
}