MediaBuffer.h revision 20111aa043c5f404472bc63b90bc5aad906b1101
16bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker/* 26bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Copyright (C) 2009 The Android Open Source Project 36bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * 46bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Licensed under the Apache License, Version 2.0 (the "License"); 56bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * you may not use this file except in compliance with the License. 66bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * You may obtain a copy of the License at 76bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * 86bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * http://www.apache.org/licenses/LICENSE-2.0 96bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * 106bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Unless required by applicable law or agreed to in writing, software 116bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * distributed under the License is distributed on an "AS IS" BASIS, 126bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * See the License for the specific language governing permissions and 146bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * limitations under the License. 156bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker */ 166bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 176bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#ifndef MEDIA_BUFFER_H_ 186bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 196bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#define MEDIA_BUFFER_H_ 206bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 21aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker#include <pthread.h> 226bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 236bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#include <utils/Errors.h> 246bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker#include <utils/RefBase.h> 256bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 266bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakernamespace android { 276bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 286bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBuffer; 296bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBufferObserver; 306bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MetaData; 316bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 326bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBufferObserver { 33d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubakerpublic: 34d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker MediaBufferObserver() {} 35d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker virtual ~MediaBufferObserver() {} 36d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker 376bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker virtual void signalBufferReturned(MediaBuffer *buffer) = 0; 386bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 396bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerprivate: 406bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker MediaBufferObserver(const MediaBufferObserver &); 416bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker MediaBufferObserver &operator=(const MediaBufferObserver &); 426bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker}; 436bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 446bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerclass MediaBuffer { 45d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubakerpublic: 46d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker // The underlying data remains the responsibility of the caller! 47d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker MediaBuffer(void *data, size_t size); 48d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker 49d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker MediaBuffer(size_t size); 50d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker 51d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker // Decrements the reference count and returns the buffer to its 52d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker // associated MediaBufferGroup if the reference count drops to 0. 53d3af9620817220d737fdb532c1ae1032bdd65e11Chad Brubaker void release(); 54fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker 55fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker // Increments the reference count. 56fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker void add_ref(); 57fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker 58fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker void *data() const; 59fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker size_t size() const; 60fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker 61fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker size_t range_offset() const; 62fa9beebb83abe38fa04c14dc628bc5c1b4b068cdChad Brubaker size_t range_length() const; 63aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker 64aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker void set_range(size_t offset, size_t length); 65aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker 66aa6c3c3e252252b80c3900bd4c1ff27d37265c6dChad Brubaker sp<MetaData> meta_data(); 67bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker 68bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker // Clears meta data and resets the range to the full extent. 69bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker void reset(); 70bf9a82a6433701aa2f02761f3a7c425ffef4fa09Chad Brubaker 716bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 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 78protected: 79 virtual ~MediaBuffer(); 80 81private: 82 friend class MediaBufferGroup; 83 friend class OMXDecoder; 84 85 // For use by OMXDecoder, reference count must be 1, drop reference 86 // count to 0 without signalling the observer. 87 void claim(); 88 89 MediaBufferObserver *mObserver; 90 MediaBuffer *mNextBuffer; 91 int mRefCount; 92 93 void *mData; 94 size_t mSize, mRangeOffset, mRangeLength; 95 96 bool mOwnsData; 97 98 sp<MetaData> mMetaData; 99 100 MediaBuffer *mOriginal; 101 102 void setNextBuffer(MediaBuffer *buffer); 103 MediaBuffer *nextBuffer(); 104 105 int refcount() const; 106 107 MediaBuffer(const MediaBuffer &); 108 MediaBuffer &operator=(const MediaBuffer &); 109}; 110 111} // namespace android 112 113#endif // MEDIA_BUFFER_H_ 114