MediaBuffer.h revision 693d271e62a3726689ff68f4505ba49228eb94b2
1642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki/*
2642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Copyright (C) 2009 The Android Open Source Project
3642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *
4642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * you may not use this file except in compliance with the License.
6642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * You may obtain a copy of the License at
7642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *
8642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *
10642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * See the License for the specific language governing permissions and
14642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * limitations under the License.
15642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki */
16642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
17642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#ifndef MEDIA_BUFFER_H_
18642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
19642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#define MEDIA_BUFFER_H_
20642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
21642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#include <pthread.h>
22642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
23642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#include <utils/Errors.h>
24642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#include <utils/RefBase.h>
25642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
26642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakinamespace android {
27642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
28642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBuffer;
29642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBufferObserver;
30642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MetaData;
31642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
32642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBufferObserver {
33642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakipublic:
34642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    MediaBufferObserver() {}
35642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    virtual ~MediaBufferObserver() {}
36642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
37642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
38642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
39642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiprivate:
40642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    MediaBufferObserver(const MediaBufferObserver &);
41642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    MediaBufferObserver &operator=(const MediaBufferObserver &);
42642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki};
43642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
44642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBuffer {
45642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakipublic:
46642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    // The underlying data remains the responsibility of the caller!
47642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    MediaBuffer(void *data, size_t size);
48642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
49642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    MediaBuffer(size_t size);
50642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
51642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    // Decrements the reference count and returns the buffer to its
52642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    // associated MediaBufferGroup if the reference count drops to 0.
53642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    void release();
54642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
55642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    // Increments the reference count.
56642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    void add_ref();
57642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
58642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    void *data() const;
59642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    size_t size() const;
60642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
61642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    size_t range_offset() const;
62642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    size_t range_length() const;
63642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
64642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    void set_range(size_t offset, size_t length);
65642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
66    sp<MetaData> meta_data();
67
68    // Clears meta data and resets the range to the full extent.
69    void reset();
70
71    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
78    int refcount() const;
79
80protected:
81    virtual ~MediaBuffer();
82
83private:
84    friend class MediaBufferGroup;
85    friend class OMXDecoder;
86
87    // For use by OMXDecoder, reference count must be 1, drop reference
88    // count to 0 without signalling the observer.
89    void claim();
90
91    MediaBufferObserver *mObserver;
92    MediaBuffer *mNextBuffer;
93    int mRefCount;
94
95    void *mData;
96    size_t mSize, mRangeOffset, mRangeLength;
97
98    bool mOwnsData;
99
100    sp<MetaData> mMetaData;
101
102    MediaBuffer *mOriginal;
103
104    void setNextBuffer(MediaBuffer *buffer);
105    MediaBuffer *nextBuffer();
106
107    MediaBuffer(const MediaBuffer &);
108    MediaBuffer &operator=(const MediaBuffer &);
109};
110
111}  // namespace android
112
113#endif  // MEDIA_BUFFER_H_
114