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
28e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huberstruct ABuffer;
2958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennisclass GraphicBuffer;
30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBuffer;
31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBufferObserver;
32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MetaData;
33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBufferObserver {
35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver() {}
37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual ~MediaBufferObserver() {}
38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate:
42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver(const MediaBufferObserver &);
43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver &operator=(const MediaBufferObserver &);
44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBuffer {
47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // The underlying data remains the responsibility of the caller!
49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer(void *data, size_t size);
50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer(size_t size);
52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
5358a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis    MediaBuffer(const sp<GraphicBuffer>& graphicBuffer);
5458a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis
55e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber    MediaBuffer(const sp<ABuffer> &buffer);
56e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber
57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Decrements the reference count and returns the buffer to its
58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // associated MediaBufferGroup if the reference count drops to 0.
59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void release();
60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Increments the reference count.
62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void add_ref();
63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void *data() const;
65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t size() const;
66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t range_offset() const;
68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t range_length() const;
69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void set_range(size_t offset, size_t length);
71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
7258a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis    sp<GraphicBuffer> graphicBuffer() const;
7358a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis
74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    sp<MetaData> meta_data();
75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
76e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Clears meta data and resets the range to the full extent.
77e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void reset();
78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void setObserver(MediaBufferObserver *group);
80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // Returns a clone of this MediaBuffer increasing its reference count.
82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // The clone references the same data but has its own range and
83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // MetaData.
84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *clone();
85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
86be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    int refcount() const;
87be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprotected:
89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual ~MediaBuffer();
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate:
92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    friend class MediaBufferGroup;
93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    friend class OMXDecoder;
94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // For use by OMXDecoder, reference count must be 1, drop reference
96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    // count to 0 without signalling the observer.
97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void claim();
98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBufferObserver *mObserver;
100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *mNextBuffer;
101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    int mRefCount;
102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void *mData;
104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    size_t mSize, mRangeOffset, mRangeLength;
10558a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
106e38a2cba16f2161a3a41521c84325cc5c24d9668Andreas Huber    sp<ABuffer> mBuffer;
107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    bool mOwnsData;
109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    sp<MetaData> mMetaData;
111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *mOriginal;
113e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    void setNextBuffer(MediaBuffer *buffer);
115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer *nextBuffer();
116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer(const MediaBuffer &);
118e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    MediaBuffer &operator=(const MediaBuffer &);
119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // MEDIA_BUFFER_H_
124