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