MediaBuffer.h revision 693d271e62a3726689ff68f4505ba49228eb94b2
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
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <pthread.h>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBuffer;
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver;
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData;
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBufferObserver {
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver() {}
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBufferObserver() {}
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver(const MediaBufferObserver &);
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver &operator=(const MediaBufferObserver &);
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBuffer {
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The underlying data remains the responsibility of the caller!
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(void *data, size_t size);
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(size_t size);
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Decrements the reference count and returns the buffer to its
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // associated MediaBufferGroup if the reference count drops to 0.
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void release();
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Increments the reference count.
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void add_ref();
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *data() const;
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size() const;
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_offset() const;
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t range_length() const;
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void set_range(size_t offset, size_t length);
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> meta_data();
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Clears meta data and resets the range to the full extent.
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void reset();
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setObserver(MediaBufferObserver *group);
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // Returns a clone of this MediaBuffer increasing its reference count.
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // The clone references the same data but has its own range and
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData.
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *clone();
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    int refcount() const;
79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MediaBuffer();
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class MediaBufferGroup;
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    friend class OMXDecoder;
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // For use by OMXDecoder, reference count must be 1, drop reference
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // count to 0 without signalling the observer.
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void claim();
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBufferObserver *mObserver;
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mNextBuffer;
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    int mRefCount;
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void *mData;
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t mSize, mRangeOffset, mRangeLength;
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool mOwnsData;
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<MetaData> mMetaData;
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *mOriginal;
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void setNextBuffer(MediaBuffer *buffer);
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer *nextBuffer();
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer(const MediaBuffer &);
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaBuffer &operator=(const MediaBuffer &);
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // MEDIA_BUFFER_H_
114