diff options
author | Marco Nelissen <marcone@google.com> | 2012-03-28 16:38:37 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2012-03-29 09:28:47 -0700 |
commit | cb5b766bb0a3ed992998a5bd66de0ee1d2223b81 (patch) | |
tree | e4d3d93e823d0c5c691549d9966f7660de1373df /media/libstagefright/SkipCutBuffer.cpp | |
parent | 559bf2836f5da25b75bfb229fec0d20d540ee426 (diff) | |
download | frameworks_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-x | media/libstagefright/SkipCutBuffer.cpp | 48 |
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; } |