MediaBuffer.h revision f59c0bafebcd795b20141bf928a5cab8ac46e882
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/* 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Copyright (C) 2009 The Android Open Source Project 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 56773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * you may not use this file except in compliance with the License. 66773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * You may obtain a copy of the License at 76773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 96773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Unless required by applicable law or agreed to in writing, software 116773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * distributed under the License is distributed on an "AS IS" BASIS, 126773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * See the License for the specific language governing permissions and 146773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan * limitations under the License. 153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian */ 163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#ifndef MEDIA_BUFFER_H_ 183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define MEDIA_BUFFER_H_ 203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <atomic> 223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <list> 236773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan#include <media/stagefright/foundation/MediaBufferBase.h> 24d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 256773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan#include <pthread.h> 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/MemoryDealer.h> 28d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <utils/Errors.h> 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/RefBase.h> 303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstruct ABuffer; 342d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chenclass GraphicBuffer; 35b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yehclass MediaBuffer; 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass MediaBufferObserver; 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass MetaData; 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass MediaBufferObserver { 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 41090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh MediaBufferObserver() {} 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual ~MediaBufferObserver() {} 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void signalBufferReturned(MediaBuffer *buffer) = 0; 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianprivate: 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian MediaBufferObserver(const MediaBufferObserver &); 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian MediaBufferObserver &operator=(const MediaBufferObserver &); 493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block}; 503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass MediaBuffer : public MediaBufferBase { 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // allocations larger than or equal to this will use shared memory. 543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian static const size_t kSharedMemThreshold = 64 * 1024; 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // The underlying data remains the responsibility of the caller! 573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian MediaBuffer(void *data, size_t size); 583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 5957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li MediaBuffer(size_t size); 6057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li 613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian MediaBuffer(const sp<GraphicBuffer>& graphicBuffer); 623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block 633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian MediaBuffer(const sp<ABuffer> &buffer); 643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian MediaBuffer(const sp<IMemory> &mem) : 6606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen MediaBuffer((uint8_t *)mem->pointer() + sizeof(SharedControl), mem->size()) { 6757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li // delegate and override mMemory 6857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li mMemory = mem; 6957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 7057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li 713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // Decrements the reference count and returns the buffer to its 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // associated MediaBufferGroup if the reference count drops to 0. 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void release(); 743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // Increments the reference count. 763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void add_ref(); 773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void *data() const; 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian size_t size() const; 803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian size_t range_offset() const; 8206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen size_t range_length() const; 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void set_range(size_t offset, size_t length); 852d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 862d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen sp<GraphicBuffer> graphicBuffer() const; 872d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 882d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen sp<MetaData> meta_data(); 892d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 902d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // Clears meta data and resets the range to the full extent. 912d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void reset(); 922d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 932d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void setObserver(MediaBufferObserver *group); 942d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 95b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // Returns a clone of this MediaBuffer increasing its reference count. 96b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // The clone references the same data but has its own range and 97b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // MetaData. 98b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh MediaBuffer *clone(); 99b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 100b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh int refcount() const; 101b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 102b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh bool isDeadObject() const { 103b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return isDeadObject(mMemory); 104b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 105b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 106b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh static bool isDeadObject(const sp<IMemory> &memory) { 107b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh if (memory.get() == nullptr || memory->pointer() == nullptr) return false; 108b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return reinterpret_cast<SharedControl *>(memory->pointer())->isDeadObject(); 109b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 110b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 111b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yehprotected: 112b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // MediaBuffer remote releases are handled through a 113b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // pending release count variable stored in a SharedControl block 114b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // at the start of the IMemory. 115b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 116b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // Returns old value of pending release count. 117b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh inline int32_t addPendingRelease(int32_t value) { 1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return getSharedControl()->addPendingRelease(value); 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // Issues all pending releases (works in parallel). 1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // Assumes there is a MediaBufferObserver. 1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian inline void resolvePendingRelease() { 1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (mMemory.get() == nullptr) return; 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian while (addPendingRelease(-1) > 0) { 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian release(); 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian addPendingRelease(1); 1293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block } 1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // true if MediaBuffer is observed (part of a MediaBufferGroup). 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian inline bool isObserved() const { 1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return mObserver != nullptr; 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual ~MediaBuffer(); 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block sp<IMemory> mMemory; 1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianprivate: 1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian friend class MediaBufferGroup; 14257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li friend class OMXDecoder; 14357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li friend class BnMediaSource; 14457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li friend class BpMediaSource; 14557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li 14657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li // For use by OMXDecoder, reference count must be 1, drop reference 14757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li // count to 0 without signalling the observer. 14857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li void claim(); 14957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li 15057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li MediaBufferObserver *mObserver; 1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int mRefCount; 1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void *mData; 1543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block size_t mSize, mRangeOffset, mRangeLength; 1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<GraphicBuffer> mGraphicBuffer; 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<ABuffer> mBuffer; 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool mOwnsData; 1592d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1602d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen sp<MetaData> mMetaData; 1612d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1622d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen MediaBuffer *mOriginal; 1632d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1642d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen MediaBuffer(const MediaBuffer &); 1652d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen MediaBuffer &operator=(const MediaBuffer &); 1662d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1672d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // SharedControl block at the start of IMemory. 1682d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen struct SharedControl { 1692d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen enum { 1702d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen FLAG_DEAD_OBJECT = (1 << 0), 1712d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen }; 1722d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1732d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // returns old value 1742d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen inline int32_t addPendingRelease(int32_t value) { 1756773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan return std::atomic_fetch_add_explicit( 1766773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan &mPendingRelease, (int_least32_t)value, std::memory_order_seq_cst); 1772d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 1782d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian inline int32_t getPendingRelease() const { 1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return std::atomic_load_explicit(&mPendingRelease, std::memory_order_seq_cst); 181b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 182b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 183b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh inline void setPendingRelease(int32_t value) { 184b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::atomic_store_explicit( 185b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh &mPendingRelease, (int_least32_t)value, std::memory_order_seq_cst); 186b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 187b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 188b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh inline bool isDeadObject() const { 189b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return (std::atomic_load_explicit( 190b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh &mFlags, std::memory_order_seq_cst) & FLAG_DEAD_OBJECT) != 0; 191b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 192b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 193b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh inline void setDeadObject() { 194b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh (void)std::atomic_fetch_or_explicit( 195b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh &mFlags, (int_least32_t)FLAG_DEAD_OBJECT, std::memory_order_seq_cst); 196b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 197b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 198b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh inline void clear() { 199b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::atomic_store_explicit( 200b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh &mFlags, (int_least32_t)0, std::memory_order_seq_cst); 201b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::atomic_store_explicit( 202b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh &mPendingRelease, (int_least32_t)0, std::memory_order_seq_cst); 203b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 204b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 205b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh private: 206b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // Caution: atomic_int_fast32_t is 64 bits on LP64. 207b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::atomic_int_least32_t mFlags; 208b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::atomic_int_least32_t mPendingRelease; 209b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh int32_t unused[6]; // additional buffer space 210b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh }; 211b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 212b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh inline SharedControl *getSharedControl() const { 213b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return reinterpret_cast<SharedControl *>(mMemory->pointer()); 214b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 215b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh}; 2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} // namespace android 2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif // MEDIA_BUFFER_H_ 2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian