MediaBuffer.h revision 20111aa043c5f404472bc63b90bc5aad906b1101
16bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker/*
26bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Copyright (C) 2009 The Android Open Source Project
36bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker *
46bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Licensed under the Apache License, Version 2.0 (the "License");
56bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * you may not use this file except in compliance with the License.
66bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * You may obtain a copy of the License at
76bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker *
86bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker *      http://www.apache.org/licenses/LICENSE-2.0
96bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker *
106bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Unless required by applicable law or agreed to in writing, software
116bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * distributed under the License is distributed on an "AS IS" BASIS,
126bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * See the License for the specific language governing permissions and
146bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * limitations under the License.
156bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker */
166bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
176bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#ifndef MEDIA_BUFFER_H_
186bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
196bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#define MEDIA_BUFFER_H_
206bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
21aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker#include <pthread.h>
226bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
236bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#include <utils/Errors.h>
246bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#include <utils/RefBase.h>
256bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
266bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakernamespace android {
276bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
286bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBuffer;
296bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBufferObserver;
306bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MetaData;
316bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
326bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBufferObserver {
33d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubakerpublic:
34d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    MediaBufferObserver() {}
35d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    virtual ~MediaBufferObserver() {}
36d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker
376bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
386bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
396bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerprivate:
406bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker    MediaBufferObserver(const MediaBufferObserver &);
416bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker    MediaBufferObserver &operator=(const MediaBufferObserver &);
426bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker};
436bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker
446bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBuffer {
45d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubakerpublic:
46d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    // The underlying data remains the responsibility of the caller!
47d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    MediaBuffer(void *data, size_t size);
48d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker
49d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    MediaBuffer(size_t size);
50d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker
51d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    // Decrements the reference count and returns the buffer to its
52d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    // associated MediaBufferGroup if the reference count drops to 0.
53d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker    void release();
54fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker
55fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker    // Increments the reference count.
56fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker    void add_ref();
57fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker
58fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker    void *data() const;
59fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker    size_t size() const;
60fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker
61fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker    size_t range_offset() const;
62fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker    size_t range_length() const;
63aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker
64aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker    void set_range(size_t offset, size_t length);
65aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker
66aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker    sp<MetaData> meta_data();
67bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker
68bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker    // Clears meta data and resets the range to the full extent.
69bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker    void reset();
70bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker
716bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker    void setObserver(MediaBufferObserver *group);
72
73    // Returns a clone of this MediaBuffer increasing its reference count.
74    // The clone references the same data but has its own range and
75    // MetaData.
76    MediaBuffer *clone();
77
78protected:
79    virtual ~MediaBuffer();
80
81private:
82    friend class MediaBufferGroup;
83    friend class OMXDecoder;
84
85    // For use by OMXDecoder, reference count must be 1, drop reference
86    // count to 0 without signalling the observer.
87    void claim();
88
89    MediaBufferObserver *mObserver;
90    MediaBuffer *mNextBuffer;
91    int mRefCount;
92
93    void *mData;
94    size_t mSize, mRangeOffset, mRangeLength;
95
96    bool mOwnsData;
97
98    sp<MetaData> mMetaData;
99
100    MediaBuffer *mOriginal;
101
102    void setNextBuffer(MediaBuffer *buffer);
103    MediaBuffer *nextBuffer();
104
105    int refcount() const;
106
107    MediaBuffer(const MediaBuffer &);
108    MediaBuffer &operator=(const MediaBuffer &);
109};
110
111}  // namespace android
112
113#endif  // MEDIA_BUFFER_H_
114