MediaBuffer.h revision 693d271e62a3726689ff68f4505ba49228eb94b2
1642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki/* 2642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Copyright (C) 2009 The Android Open Source Project 3642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * 4642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License"); 5642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * you may not use this file except in compliance with the License. 6642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * You may obtain a copy of the License at 7642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * 8642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * http://www.apache.org/licenses/LICENSE-2.0 9642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * 10642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Unless required by applicable law or agreed to in writing, software 11642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS, 12642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * See the License for the specific language governing permissions and 14642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * limitations under the License. 15642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki */ 16642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 17642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#ifndef MEDIA_BUFFER_H_ 18642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 19642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#define MEDIA_BUFFER_H_ 20642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 21642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#include <pthread.h> 22642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 23642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#include <utils/Errors.h> 24642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki#include <utils/RefBase.h> 25642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 26642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakinamespace android { 27642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 28642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBuffer; 29642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBufferObserver; 30642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MetaData; 31642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 32642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBufferObserver { 33642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakipublic: 34642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki MediaBufferObserver() {} 35642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki virtual ~MediaBufferObserver() {} 36642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 37642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki virtual void signalBufferReturned(MediaBuffer *buffer) = 0; 38642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 39642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiprivate: 40642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki MediaBufferObserver(const MediaBufferObserver &); 41642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki MediaBufferObserver &operator=(const MediaBufferObserver &); 42642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki}; 43642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 44642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass MediaBuffer { 45642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakipublic: 46642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki // The underlying data remains the responsibility of the caller! 47642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki MediaBuffer(void *data, size_t size); 48642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 49642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki MediaBuffer(size_t size); 50642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 51642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki // Decrements the reference count and returns the buffer to its 52642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki // associated MediaBufferGroup if the reference count drops to 0. 53642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki void release(); 54642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 55642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki // Increments the reference count. 56642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki void add_ref(); 57642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 58642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki void *data() const; 59642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki size_t size() const; 60642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 61642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki size_t range_offset() const; 62642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki size_t range_length() const; 63642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 64642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki void set_range(size_t offset, size_t length); 65642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki 66 sp<MetaData> meta_data(); 67 68 // Clears meta data and resets the range to the full extent. 69 void reset(); 70 71 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 78 int refcount() const; 79 80protected: 81 virtual ~MediaBuffer(); 82 83private: 84 friend class MediaBufferGroup; 85 friend class OMXDecoder; 86 87 // For use by OMXDecoder, reference count must be 1, drop reference 88 // count to 0 without signalling the observer. 89 void claim(); 90 91 MediaBufferObserver *mObserver; 92 MediaBuffer *mNextBuffer; 93 int mRefCount; 94 95 void *mData; 96 size_t mSize, mRangeOffset, mRangeLength; 97 98 bool mOwnsData; 99 100 sp<MetaData> mMetaData; 101 102 MediaBuffer *mOriginal; 103 104 void setNextBuffer(MediaBuffer *buffer); 105 MediaBuffer *nextBuffer(); 106 107 MediaBuffer(const MediaBuffer &); 108 MediaBuffer &operator=(const MediaBuffer &); 109}; 110 111} // namespace android 112 113#endif // MEDIA_BUFFER_H_ 114