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