MediaBuffer.cpp revision f89d780df70b7fbb8465bce4913c46cca019721f
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#define LOG_TAG "MediaBuffer"
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <errno.h>
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <pthread.h>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdlib.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber#include <media/stagefright/foundation/ABuffer.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaBuffer.h>
260c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber#include <media/stagefright/MediaDebug.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis#include <ui/GraphicBuffer.h>
304dafe5b814c923538a0f275b62220ec9cc94a9b5Glenn Kasten#include <sys/atomics.h>
316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMediaBuffer::MediaBuffer(void *data, size_t size)
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    : mObserver(NULL),
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mNextBuffer(NULL),
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mRefCount(0),
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mData(data),
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSize(size),
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mRangeOffset(0),
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mRangeLength(size),
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mOwnsData(false),
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mMetaData(new MetaData),
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mOriginal(NULL) {
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMediaBuffer::MediaBuffer(size_t size)
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    : mObserver(NULL),
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mNextBuffer(NULL),
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mRefCount(0),
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mData(malloc(size)),
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSize(size),
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mRangeOffset(0),
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mRangeLength(size),
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mOwnsData(true),
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mMetaData(new MetaData),
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mOriginal(NULL) {
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
606a9da9fc558263548ebfbae2cbf177eb7454a41bJamie GennisMediaBuffer::MediaBuffer(const sp<GraphicBuffer>& graphicBuffer)
616a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    : mObserver(NULL),
626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mNextBuffer(NULL),
636a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mRefCount(0),
646a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mData(NULL),
656a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mSize(1),
666a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mRangeOffset(0),
676a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mRangeLength(mSize),
686a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mGraphicBuffer(graphicBuffer),
696a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mOwnsData(false),
706a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mMetaData(new MetaData),
716a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis      mOriginal(NULL) {
726a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}
736a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
74f89d780df70b7fbb8465bce4913c46cca019721fAndreas HuberMediaBuffer::MediaBuffer(const sp<ABuffer> &buffer)
75f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber    : mObserver(NULL),
76f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mNextBuffer(NULL),
77f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mRefCount(0),
78f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mData(buffer->data()),
79f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mSize(buffer->size()),
80f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mRangeOffset(0),
81f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mRangeLength(mSize),
82f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mBuffer(buffer),
83f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mOwnsData(false),
84f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mMetaData(new MetaData),
85f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber      mOriginal(NULL) {
86f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber}
87f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::release() {
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mObserver == NULL) {
900c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber        CHECK_EQ(mRefCount, 0);
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        delete this;
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return;
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
954dafe5b814c923538a0f275b62220ec9cc94a9b5Glenn Kasten    int prevCount = __atomic_dec(&mRefCount);
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (prevCount == 1) {
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (mObserver == NULL) {
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            delete this;
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return;
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mObserver->signalBufferReturned(this);
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
1040c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(prevCount > 0);
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::claim() {
1080c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mObserver != NULL);
1090c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK_EQ(mRefCount, 1);
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mRefCount = 0;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::add_ref() {
1154dafe5b814c923538a0f275b62220ec9cc94a9b5Glenn Kasten    (void) __atomic_inc(&mRefCount);
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid *MediaBuffer::data() const {
1196a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    CHECK(mGraphicBuffer == NULL);
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mData;
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersize_t MediaBuffer::size() const {
1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    CHECK(mGraphicBuffer == NULL);
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mSize;
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersize_t MediaBuffer::range_offset() const {
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mRangeOffset;
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersize_t MediaBuffer::range_length() const {
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mRangeLength;
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::set_range(size_t offset, size_t length) {
1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    if ((mGraphicBuffer == NULL) && (offset + length > mSize)) {
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        LOGE("offset = %d, length = %d, mSize = %d", offset, length, mSize);
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    CHECK((mGraphicBuffer != NULL) || (offset + length <= mSize));
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mRangeOffset = offset;
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mRangeLength = length;
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennissp<GraphicBuffer> MediaBuffer::graphicBuffer() const {
1476a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    return mGraphicBuffer;
1486a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis}
1496a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersp<MetaData> MediaBuffer::meta_data() {
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mMetaData;
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::reset() {
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mMetaData->clear();
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    set_range(0, mSize);
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMediaBuffer::~MediaBuffer() {
1600c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK_EQ(mObserver, NULL);
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mOwnsData && mData != NULL) {
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        free(mData);
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mData = NULL;
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (mOriginal != NULL) {
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mOriginal->release();
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mOriginal = NULL;
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::setObserver(MediaBufferObserver *observer) {
1740c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(observer == NULL || mObserver == NULL);
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mObserver = observer;
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MediaBuffer::setNextBuffer(MediaBuffer *buffer) {
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mNextBuffer = buffer;
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMediaBuffer *MediaBuffer::nextBuffer() {
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mNextBuffer;
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberint MediaBuffer::refcount() const {
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return mRefCount;
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMediaBuffer *MediaBuffer::clone() {
1916a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    CHECK_EQ(mGraphicBuffer, NULL);
1926a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *buffer = new MediaBuffer(mData, mSize);
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    buffer->set_range(mRangeOffset, mRangeLength);
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    buffer->mMetaData = new MetaData(*mMetaData.get());
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    add_ref();
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    buffer->mOriginal = this;
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return buffer;
20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
204