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