1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define LOG_TAG "MediaBuffer" 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/Log.h> 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <errno.h> 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <pthread.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <stdlib.h> 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 24e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaBuffer.h> 26b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber#include <media/stagefright/MediaDebug.h> 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MetaData.h> 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 2958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis#include <ui/GraphicBuffer.h> 304e26bc686b619ec9b6db39b7fefb84890904e59cGlenn Kasten#include <sys/atomics.h> 3158a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 34e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer::MediaBuffer(void *data, size_t size) 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : mObserver(NULL), 36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNextBuffer(NULL), 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRefCount(0), 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mData(data), 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSize(size), 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeOffset(0), 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeLength(size), 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOwnsData(false), 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mMetaData(new MetaData), 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal(NULL) { 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer::MediaBuffer(size_t size) 48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : mObserver(NULL), 49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNextBuffer(NULL), 50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRefCount(0), 51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mData(malloc(size)), 52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSize(size), 53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeOffset(0), 54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeLength(size), 55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOwnsData(true), 56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mMetaData(new MetaData), 57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal(NULL) { 58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 6058a36adac1bb3294cd9f2d516d52c6358987687aJamie GennisMediaBuffer::MediaBuffer(const sp<GraphicBuffer>& graphicBuffer) 6158a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis : mObserver(NULL), 6258a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mNextBuffer(NULL), 6358a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mRefCount(0), 6458a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mData(NULL), 6558a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mSize(1), 6658a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mRangeOffset(0), 6758a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mRangeLength(mSize), 6858a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mGraphicBuffer(graphicBuffer), 6958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mOwnsData(false), 7058a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mMetaData(new MetaData), 7158a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis mOriginal(NULL) { 7258a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis} 7358a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 74e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas HuberMediaBuffer::MediaBuffer(const sp<ABuffer> &buffer) 75e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber : mObserver(NULL), 76e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mNextBuffer(NULL), 77e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mRefCount(0), 78e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mData(buffer->data()), 79e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mSize(buffer->size()), 80e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mRangeOffset(0), 81e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mRangeLength(mSize), 82e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mBuffer(buffer), 83e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mOwnsData(false), 84e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mMetaData(new MetaData), 85e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber mOriginal(NULL) { 86e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber} 87e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber 88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::release() { 89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mObserver == NULL) { 90b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK_EQ(mRefCount, 0); 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber delete this; 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return; 93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 954e26bc686b619ec9b6db39b7fefb84890904e59cGlenn Kasten int prevCount = __atomic_dec(&mRefCount); 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (prevCount == 1) { 97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mObserver == NULL) { 98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber delete this; 99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return; 100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mObserver->signalBufferReturned(this); 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 104b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(prevCount > 0); 105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::claim() { 108b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(mObserver != NULL); 109b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK_EQ(mRefCount, 1); 110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRefCount = 0; 112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 113e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::add_ref() { 1154e26bc686b619ec9b6db39b7fefb84890904e59cGlenn Kasten (void) __atomic_inc(&mRefCount); 116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 118e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid *MediaBuffer::data() const { 11958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis CHECK(mGraphicBuffer == NULL); 120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mData; 121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersize_t MediaBuffer::size() const { 12458a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis CHECK(mGraphicBuffer == NULL); 125e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mSize; 126e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 127e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersize_t MediaBuffer::range_offset() const { 129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mRangeOffset; 130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersize_t MediaBuffer::range_length() const { 133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mRangeLength; 134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 135e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::set_range(size_t offset, size_t length) { 13758a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis if ((mGraphicBuffer == NULL) && (offset + length > mSize)) { 138e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber LOGE("offset = %d, length = %d, mSize = %d", offset, length, mSize); 139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 14058a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis CHECK((mGraphicBuffer != NULL) || (offset + length <= mSize)); 141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeOffset = offset; 143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeLength = length; 144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 14658a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennissp<GraphicBuffer> MediaBuffer::graphicBuffer() const { 14758a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis return mGraphicBuffer; 14858a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis} 14958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersp<MetaData> MediaBuffer::meta_data() { 151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mMetaData; 152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::reset() { 155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mMetaData->clear(); 156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber set_range(0, mSize); 157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 159e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer::~MediaBuffer() { 160b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK_EQ(mObserver, NULL); 161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mOwnsData && mData != NULL) { 163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber free(mData); 164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mData = NULL; 165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mOriginal != NULL) { 168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal->release(); 169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal = NULL; 170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 172e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::setObserver(MediaBufferObserver *observer) { 174b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(observer == NULL || mObserver == NULL); 175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mObserver = observer; 176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::setNextBuffer(MediaBuffer *buffer) { 179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNextBuffer = buffer; 180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 182e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer *MediaBuffer::nextBuffer() { 183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mNextBuffer; 184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberint MediaBuffer::refcount() const { 187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mRefCount; 188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 190e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer *MediaBuffer::clone() { 19158a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis CHECK_EQ(mGraphicBuffer, NULL); 19258a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 193e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaBuffer *buffer = new MediaBuffer(mData, mSize); 194e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->set_range(mRangeOffset, mRangeLength); 195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->mMetaData = new MetaData(*mMetaData.get()); 196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber add_ref(); 198e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->mOriginal = this; 199e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return buffer; 201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 204