MediaBuffer.h revision e9a5b96e7927fd4e38623e17ac73e8e4e25877ee
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
25b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen#include <binder/MemoryDealer.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huberstruct ABuffer;
326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisclass GraphicBuffer;
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBuffer;
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver;
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData;
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver {
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver() {}
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBufferObserver() {}
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver(const MediaBufferObserver &);
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver &operator=(const MediaBufferObserver &);
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4996e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jiaclass MediaBuffer : public MediaBufferBase {
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
51e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia    // allocations larger than or equal to this will use shared memory.
52e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia    static const size_t kSharedMemThreshold = 64 * 1024;
53e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The underlying data remains the responsibility of the caller!
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(void *data, size_t size);
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(size_t size);
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
596a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    MediaBuffer(const sp<GraphicBuffer>& graphicBuffer);
606a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
61f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber    MediaBuffer(const sp<ABuffer> &buffer);
62f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Decrements the reference count and returns the buffer to its
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // associated MediaBufferGroup if the reference count drops to 0.
6596e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia    virtual void release();
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Increments the reference count.
6896e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia    virtual void add_ref();
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *data() const;
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size() const;
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_offset() const;
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_length() const;
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void set_range(size_t offset, size_t length);
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
786a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<GraphicBuffer> graphicBuffer() const;
796a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> meta_data();
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Clears meta data and resets the range to the full extent.
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void reset();
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setObserver(MediaBufferObserver *group);
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Returns a clone of this MediaBuffer increasing its reference count.
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The clone references the same data but has its own range and
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData.
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *clone();
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int refcount() const;
93693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBuffer();
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class MediaBufferGroup;
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class OMXDecoder;
100b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen    friend class BnMediaSource;
101b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen    friend class BpMediaSource;
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // For use by OMXDecoder, reference count must be 1, drop reference
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // count to 0 without signalling the observer.
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void claim();
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver *mObserver;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mNextBuffer;
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    int mRefCount;
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *mData;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t mSize, mRangeOffset, mRangeLength;
1136a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
114f89d780df70b7fbb8465bce4913c46cca019721fAndreas Huber    sp<ABuffer> mBuffer;
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool mOwnsData;
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> mMetaData;
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mOriginal;
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setNextBuffer(MediaBuffer *buffer);
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *nextBuffer();
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(const MediaBuffer &);
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer &operator=(const MediaBuffer &);
127b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen    sp<IMemory> mMemory;
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // MEDIA_BUFFER_H_
133