120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef MEDIA_BUFFER_H_
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define MEDIA_BUFFER_H_
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung#include <atomic>
22f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung#include <list>
2396e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia#include <media/stagefright/foundation/MediaBufferBase.h>
2496e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <pthread.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen#include <binder/MemoryDealer.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h>
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huberstruct ABuffer;
346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisclass GraphicBuffer;
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBuffer;
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver;
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData;
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver {
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver() {}
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBufferObserver() {}
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver(const MediaBufferObserver &);
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver &operator=(const MediaBufferObserver &);
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jiaclass MediaBuffer : public MediaBufferBase {
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
53e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia    // allocations larger than or equal to this will use shared memory.
54e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia    static const size_t kSharedMemThreshold = 64 * 1024;
55e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The underlying data remains the responsibility of the caller!
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(void *data, size_t size);
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
590d1ed381fde5dac12dd84fcf3da66dac46699378Chih-Hung Hsieh    explicit MediaBuffer(size_t size);
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
610d1ed381fde5dac12dd84fcf3da66dac46699378Chih-Hung Hsieh    explicit MediaBuffer(const sp<GraphicBuffer>& graphicBuffer);
626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
630d1ed381fde5dac12dd84fcf3da66dac46699378Chih-Hung Hsieh    explicit MediaBuffer(const sp<ABuffer> &buffer);
64f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber
65f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    MediaBuffer(const sp<IMemory> &mem) :
66f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        MediaBuffer((uint8_t *)mem->pointer() + sizeof(SharedControl), mem->size()) {
67f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        // delegate and override mMemory
68f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        mMemory = mem;
69f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    }
70f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
719bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // If MediaBufferGroup is set, decrement the local reference count;
729bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // if the local reference count drops to 0, return the buffer to the
739bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // associated MediaBufferGroup.
749bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    //
759bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // If no MediaBufferGroup is set, the local reference count must be zero
769bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // when called, whereupon the MediaBuffer is deleted.
7796e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia    virtual void release();
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
799bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // Increments the local reference count.
809bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // Use only when MediaBufferGroup is set.
8196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia    virtual void add_ref();
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *data() const;
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size() const;
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_offset() const;
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_length() const;
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void set_range(size_t offset, size_t length);
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
916a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<GraphicBuffer> graphicBuffer() const;
926a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> meta_data();
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Clears meta data and resets the range to the full extent.
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void reset();
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setObserver(MediaBufferObserver *group);
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Returns a clone of this MediaBuffer increasing its reference count.
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The clone references the same data but has its own range and
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData.
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *clone();
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1059bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // sum of localRefcount() and remoteRefcount()
1069bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    int refcount() const {
1079bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        return localRefcount() + remoteRefcount();
1089bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    }
1099bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung
1109bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    int localRefcount() const {
1119bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        return mRefCount;
1129bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    }
1139bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung
1149bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    int remoteRefcount() const {
1159bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        if (mMemory.get() == nullptr || mMemory->pointer() == nullptr) return 0;
1169bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        int32_t remoteRefcount =
1179bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung                reinterpret_cast<SharedControl *>(mMemory->pointer())->getRemoteRefcount();
1189bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        // Sanity check so that remoteRefCount() is non-negative.
1199bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        return remoteRefcount >= 0 ? remoteRefcount : 0; // do not allow corrupted data.
1209bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    }
1219bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung
1229bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    // returns old value
1239bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    int addRemoteRefcount(int32_t value) {
1249bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        if (mMemory.get() == nullptr || mMemory->pointer() == nullptr) return 0;
1259bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        return reinterpret_cast<SharedControl *>(mMemory->pointer())->addRemoteRefcount(value);
1269bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung    }
127693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
128f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    bool isDeadObject() const {
129f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        return isDeadObject(mMemory);
130f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    }
131f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
132f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    static bool isDeadObject(const sp<IMemory> &memory) {
133f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        if (memory.get() == nullptr || memory->pointer() == nullptr) return false;
134f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        return reinterpret_cast<SharedControl *>(memory->pointer())->isDeadObject();
135f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    }
136f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
137cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung    // Sticky on enabling of shared memory MediaBuffers. By default we don't use
138cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung    // shared memory for MediaBuffers, but we enable this for those processes
139cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung    // that export MediaBuffers.
140cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung    static void useSharedMemory() {
141cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung        std::atomic_store_explicit(
142cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung                &mUseSharedMemory, (int_least32_t)1, std::memory_order_seq_cst);
143cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung    }
144cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
146f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    // true if MediaBuffer is observed (part of a MediaBufferGroup).
147f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    inline bool isObserved() const {
148f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        return mObserver != nullptr;
149f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    }
150f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBuffer();
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
153f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    sp<IMemory> mMemory;
154f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class MediaBufferGroup;
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class OMXDecoder;
158b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen    friend class BnMediaSource;
159b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen    friend class BpMediaSource;
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // For use by OMXDecoder, reference count must be 1, drop reference
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // count to 0 without signalling the observer.
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void claim();
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver *mObserver;
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    int mRefCount;
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *mData;
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t mSize, mRangeOffset, mRangeLength;
1706a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
171f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber    sp<ABuffer> mBuffer;
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool mOwnsData;
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> mMetaData;
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mOriginal;
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
179cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung    static std::atomic_int_least32_t mUseSharedMemory;
180cfa86b5efa029391df04182dedfabd72b49a32f5Andy Hung
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(const MediaBuffer &);
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer &operator=(const MediaBuffer &);
183f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
184f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    // SharedControl block at the start of IMemory.
185f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    struct SharedControl {
186f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        enum {
187f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            FLAG_DEAD_OBJECT = (1 << 0),
188f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        };
189f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
190f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        // returns old value
1919bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        inline int32_t addRemoteRefcount(int32_t value) {
192f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            return std::atomic_fetch_add_explicit(
1939bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung                    &mRemoteRefcount, (int_least32_t)value, std::memory_order_seq_cst);
194f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        }
195f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
1969bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        inline int32_t getRemoteRefcount() const {
1979bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung            return std::atomic_load_explicit(&mRemoteRefcount, std::memory_order_seq_cst);
198f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        }
199f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
2009bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        inline void setRemoteRefcount(int32_t value) {
201f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            std::atomic_store_explicit(
2029bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung                    &mRemoteRefcount, (int_least32_t)value, std::memory_order_seq_cst);
203f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        }
204f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
205f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        inline bool isDeadObject() const {
206f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            return (std::atomic_load_explicit(
207f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung                    &mFlags, std::memory_order_seq_cst) & FLAG_DEAD_OBJECT) != 0;
208f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        }
209f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
210f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        inline void setDeadObject() {
211f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            (void)std::atomic_fetch_or_explicit(
212f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung                    &mFlags, (int_least32_t)FLAG_DEAD_OBJECT, std::memory_order_seq_cst);
213f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        }
214f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
215f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        inline void clear() {
216f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            std::atomic_store_explicit(
217f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung                    &mFlags, (int_least32_t)0, std::memory_order_seq_cst);
218f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung            std::atomic_store_explicit(
2199bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung                    &mRemoteRefcount, (int_least32_t)0, std::memory_order_seq_cst);
220f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        }
221f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
222f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    private:
223f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        // Caution: atomic_int_fast32_t is 64 bits on LP64.
224f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        std::atomic_int_least32_t mFlags;
2259bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung        std::atomic_int_least32_t mRemoteRefcount;
226f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung        int32_t unused[6]; // additional buffer space
227f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    };
228f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung
229f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung    inline SharedControl *getSharedControl() const {
230f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung         return reinterpret_cast<SharedControl *>(mMemory->pointer());
231f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung     }
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // MEDIA_BUFFER_H_
237