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