MediaBuffer.cpp revision e46b7be812d68e49710b34048662cbf18e2a6550
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#undef NDEBUG 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <assert.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <errno.h> 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <pthread.h> 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <stdlib.h> 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaBuffer.h> 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MetaData.h> 29e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber// XXX make this truly atomic. 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatic int atomic_add(int *value, int delta) { 34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int prev_value = *value; 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *value += delta; 36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return prev_value; 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer::MediaBuffer(void *data, size_t size) 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : mObserver(NULL), 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNextBuffer(NULL), 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRefCount(0), 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mData(data), 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSize(size), 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeOffset(0), 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeLength(size), 48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOwnsData(false), 49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mMetaData(new MetaData), 50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal(NULL) { 51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 53e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer::MediaBuffer(size_t size) 54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : mObserver(NULL), 55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNextBuffer(NULL), 56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRefCount(0), 57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mData(malloc(size)), 58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSize(size), 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeOffset(0), 60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeLength(size), 61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOwnsData(true), 62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mMetaData(new MetaData), 63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal(NULL) { 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::release() { 67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mObserver == NULL) { 68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(mRefCount == 0); 69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber delete this; 70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return; 71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int prevCount = atomic_add(&mRefCount, -1); 74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (prevCount == 1) { 75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mObserver == NULL) { 76e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber delete this; 77e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return; 78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mObserver->signalBufferReturned(this); 81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(prevCount > 0); 83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::claim() { 86e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(mObserver != NULL); 87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(mRefCount == 1); 88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRefCount = 0; 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::add_ref() { 93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber atomic_add(&mRefCount, 1); 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid *MediaBuffer::data() const { 97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mData; 98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersize_t MediaBuffer::size() const { 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mSize; 102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersize_t MediaBuffer::range_offset() const { 105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mRangeOffset; 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersize_t MediaBuffer::range_length() const { 109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mRangeLength; 110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::set_range(size_t offset, size_t length) { 113e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (offset < 0 || offset + length > mSize) { 114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber LOGE("offset = %d, length = %d, mSize = %d", offset, length, mSize); 115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(offset >= 0 && offset + length <= mSize); 117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 118e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeOffset = offset; 119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mRangeLength = length; 120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersp<MetaData> MediaBuffer::meta_data() { 123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mMetaData; 124e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 125e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 126e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::reset() { 127e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mMetaData->clear(); 128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber set_range(0, mSize); 129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 131e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer::~MediaBuffer() { 132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(mObserver == NULL); 133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mOwnsData && mData != NULL) { 135e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber free(mData); 136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mData = NULL; 137e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 138e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mOriginal != NULL) { 140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal->release(); 141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mOriginal = NULL; 142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::setObserver(MediaBufferObserver *observer) { 146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber assert(observer == NULL || mObserver == NULL); 147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mObserver = observer; 148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid MediaBuffer::setNextBuffer(MediaBuffer *buffer) { 151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNextBuffer = buffer; 152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 154e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer *MediaBuffer::nextBuffer() { 155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mNextBuffer; 156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberint MediaBuffer::refcount() const { 159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return mRefCount; 160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 162e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberMediaBuffer *MediaBuffer::clone() { 163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaBuffer *buffer = new MediaBuffer(mData, mSize); 164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->set_range(mRangeOffset, mRangeLength); 165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->mMetaData = new MetaData(*mMetaData.get()); 166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber add_ref(); 168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->mOriginal = this; 169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return buffer; 171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 172e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 175