MediaBuffer.h revision 96e92b58b7e9647b4c7c2f54b62a1b357ab06b66
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#ifndef MEDIA_BUFFER_H_
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define MEDIA_BUFFER_H_
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia#include <media/stagefright/foundation/MediaBufferBase.h>
2296e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <pthread.h>
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huberstruct ABuffer;
316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisclass GraphicBuffer;
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBuffer;
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver;
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData;
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver {
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver() {}
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBufferObserver() {}
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver(const MediaBufferObserver &);
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver &operator=(const MediaBufferObserver &);
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4896e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jiaclass MediaBuffer : public MediaBufferBase {
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The underlying data remains the responsibility of the caller!
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(void *data, size_t size);
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(size_t size);
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
556a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    MediaBuffer(const sp<GraphicBuffer>& graphicBuffer);
566a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
57f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber    MediaBuffer(const sp<ABuffer> &buffer);
58f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Decrements the reference count and returns the buffer to its
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // associated MediaBufferGroup if the reference count drops to 0.
6196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia    virtual void release();
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Increments the reference count.
6496e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia    virtual void add_ref();
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *data() const;
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size() const;
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_offset() const;
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_length() const;
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void set_range(size_t offset, size_t length);
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
746a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<GraphicBuffer> graphicBuffer() const;
756a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> meta_data();
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Clears meta data and resets the range to the full extent.
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void reset();
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setObserver(MediaBufferObserver *group);
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Returns a clone of this MediaBuffer increasing its reference count.
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The clone references the same data but has its own range and
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData.
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *clone();
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
88693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int refcount() const;
89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBuffer();
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class MediaBufferGroup;
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class OMXDecoder;
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // For use by OMXDecoder, reference count must be 1, drop reference
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // count to 0 without signalling the observer.
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void claim();
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver *mObserver;
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mNextBuffer;
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    int mRefCount;
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *mData;
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t mSize, mRangeOffset, mRangeLength;
1076a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
108f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber    sp<ABuffer> mBuffer;
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool mOwnsData;
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> mMetaData;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mOriginal;
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setNextBuffer(MediaBuffer *buffer);
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *nextBuffer();
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(const MediaBuffer &);
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer &operator=(const MediaBuffer &);
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // MEDIA_BUFFER_H_
126