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