MediaBuffer.h revision e46b7be812d68e49710b34048662cbf18e2a6550
1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/*
2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License.
6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at
7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software
11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and
14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License.
15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */
16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef MEDIA_BUFFER_H_
18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define MEDIA_BUFFER_H_
20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <pthread.h>
22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/Errors.h>
24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/RefBase.h>
25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android {
27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBuffer;
29e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBufferObserver;
30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MetaData;
31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBufferObserver {
33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver() {}
35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual ~MediaBufferObserver() {}
36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate:
40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver(const MediaBufferObserver &);
41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver &operator=(const MediaBufferObserver &);
42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBuffer {
45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // The underlying data remains the responsibility of the caller!
47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer(void *data, size_t size);
48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer(size_t size);
50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Decrements the reference count and returns the buffer to its
52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // associated MediaBufferGroup if the reference count drops to 0.
53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void release();
54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Increments the reference count.
56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void add_ref();
57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void *data() const;
59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t size() const;
60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t range_offset() const;
62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t range_length() const;
63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void set_range(size_t offset, size_t length);
65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    sp<MetaData> meta_data();
67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Clears meta data and resets the range to the full extent.
69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void reset();
70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void setObserver(MediaBufferObserver *group);
72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Returns a clone of this MediaBuffer increasing its reference count.
74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // The clone references the same data but has its own range and
75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // MetaData.
76e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *clone();
77e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprotected:
79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual ~MediaBuffer();
80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate:
82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    friend class MediaBufferGroup;
83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    friend class OMXDecoder;
84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // For use by OMXDecoder, reference count must be 1, drop reference
86e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // count to 0 without signalling the observer.
87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void claim();
88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver *mObserver;
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *mNextBuffer;
91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    int mRefCount;
92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void *mData;
94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t mSize, mRangeOffset, mRangeLength;
95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    bool mOwnsData;
97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    sp<MetaData> mMetaData;
99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *mOriginal;
101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void setNextBuffer(MediaBuffer *buffer);
103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *nextBuffer();
104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    int refcount() const;
106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer(const MediaBuffer &);
108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer &operator=(const MediaBuffer &);
109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
113e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // MEDIA_BUFFER_H_
114