IMediaSource: use shared memory to transfer large buffer.
Also move MediaBufferGroup to libstagefright/foundation/.
Bug: 26295488
Change-Id: I88f4e6bf83ffb2b196628a2d4d83ea7b1f6ad9c2
diff --git a/include/media/IMediaSource.h b/include/media/IMediaSource.h
index 1420120..f7586a7 100644
--- a/include/media/IMediaSource.h
+++ b/include/media/IMediaSource.h
@@ -26,6 +26,7 @@
struct MediaSource;
class MetaData;
class MediaBuffer;
+class MediaBufferGroup;
class IMediaSource : public IInterface {
public:
@@ -112,6 +113,8 @@
class BnMediaSource: public BnInterface<IMediaSource>
{
public:
+ BnMediaSource();
+
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags = 0);
@@ -122,6 +125,12 @@
virtual status_t setBuffers(const Vector<MediaBuffer *> & /* buffers */) {
return ERROR_UNSUPPORTED;
}
+
+protected:
+ virtual ~BnMediaSource();
+
+private:
+ MediaBufferGroup *mGroup;
};
diff --git a/include/media/stagefright/MediaBuffer.h b/include/media/stagefright/MediaBuffer.h
index 1e0c7d4..18b80e3 100644
--- a/include/media/stagefright/MediaBuffer.h
+++ b/include/media/stagefright/MediaBuffer.h
@@ -48,6 +48,9 @@
class MediaBuffer : public MediaBufferBase {
public:
+ // allocations larger than or equal to this will use shared memory.
+ static const size_t kSharedMemThreshold = 64 * 1024;
+
// The underlying data remains the responsibility of the caller!
MediaBuffer(void *data, size_t size);
diff --git a/include/media/stagefright/MediaBufferGroup.h b/include/media/stagefright/MediaBufferGroup.h
index a006f7f..7ca3fa1 100644
--- a/include/media/stagefright/MediaBufferGroup.h
+++ b/include/media/stagefright/MediaBufferGroup.h
@@ -39,7 +39,11 @@
// The returned buffer will have a reference count of 1.
// If nonBlocking is true and a buffer is not immediately available,
// buffer is set to NULL and it returns WOULD_BLOCK.
- status_t acquire_buffer(MediaBuffer **buffer, bool nonBlocking = false);
+ // If requestedSize is 0, any free MediaBuffer will be returned.
+ // If requestedSize is > 0, the returned MediaBuffer should have buffer
+ // size of at least requstedSize.
+ status_t acquire_buffer(
+ MediaBuffer **buffer, bool nonBlocking = false, size_t requestedSize = 0);
protected:
virtual void signalBufferReturned(MediaBuffer *buffer);