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