1 /* 2 * Copyright 2019 Rockchip Electronics Co. LTD 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * author: martin.cheng@rock-chips.com 17 * date: 2019/01/04 18 * module: RTMediaBuffer 19 * author: martin.cheng@rock-chips.com 20 * date: 2019/11/01 21 * module: add RTBufferListener. 22 */ 23 24 #ifndef SRC_RT_MEDIA_INCLUDE_RTMEDIABUFFER_H_ 25 #define SRC_RT_MEDIA_INCLUDE_RTMEDIABUFFER_H_ 26 27 #include <map> 28 29 #include "rt_mutex.h" 30 #include "rt_metadata.h" 31 #include "RTObject.h" 32 #include "RTMediaData.h" 33 #include "RTMediaBufferDef.h" 34 35 class RTBufferListener { 36 public: RTBufferListener()37 RTBufferListener() {} ~RTBufferListener()38 virtual ~RTBufferListener() {} 39 40 public: 41 // buffer callback. 42 virtual void onBufferAvailable(void* buffer) = 0; 43 virtual void onBufferRealloc(void* buffer, UINT32 size) = 0; onBufferRegister(UINT64 poolCapacity,UINT32 size)44 virtual void onBufferRegister(UINT64 poolCapacity, UINT32 size) {} 45 virtual void onBufferRelease(void* buffer, RT_BOOL render) = 0; 46 }; 47 48 class RTAllocator; 49 class RTMediaBuffer : public RTObject { 50 public: 51 // The underlying data remains the responsibility of the caller! 52 explicit RTMediaBuffer(void* data, UINT32 size); 53 explicit RTMediaBuffer( 54 void* data, 55 UINT32 size, 56 INT32 handle, 57 INT32 fd, 58 RTAllocator *alloctor = RT_NULL); 59 explicit RTMediaBuffer(UINT32 size); 60 explicit RTMediaBuffer(const RTMediaBuffer* data); 61 virtual ~RTMediaBuffer(); 62 RTMediaBuffer& operator = (const RTMediaBuffer &); 63 64 public: 65 // override RTObject methods summary(INT32 fd)66 void summary(INT32 fd) { } getName()67 const char* getName() {return "mediabuffer";} 68 virtual RTMediaBufferType getType(); 69 virtual RT_BOOL checkType(RTMediaBufferType type); 70 71 public: 72 virtual void release(bool debug = false); 73 virtual void signalBufferAvailable(); 74 virtual void signalBufferRealloc(UINT32 size); 75 virtual void signalBufferRelease(bool render = false); 76 virtual void signalBufferRegister(UINT64 poolCapacity, UINT32 size); 77 78 virtual void* getData() const; 79 virtual UINT32 getSize() const; 80 virtual UINT32 getRealSize() const; 81 virtual UINT32 getOffset() const; 82 virtual UINT32 getLength() const; 83 virtual INT32 getFd() const; 84 virtual INT32 getHandle() const; 85 virtual UINT32 getPhyAddr() const; 86 virtual INT32 getUniqueID() const; 87 virtual INT32 getBufferSeq() const; 88 virtual INT32 getPoolID() const; 89 virtual UINT64 getModID() const; 90 virtual void* getUserData() const; 91 92 virtual void setData(void* data, UINT32 size); 93 virtual void setListener(RTBufferListener* listener); 94 virtual void setPhyAddr(UINT32 phyaddr); 95 virtual void setRange(UINT32 offset, UINT32 length); setRealSize(UINT32 real)96 virtual void setRealSize(UINT32 real) { mRealSize = real;} 97 virtual void setStatus(RtMediaBufferStatus status); 98 virtual void setSite(RTMediaBufferSite site); 99 virtual void setBufferID(void *id); 100 virtual void setModID(UINT64 modId); 101 virtual void setBufferSeq(INT32 seq); 102 virtual void setFd(INT32 fd); 103 virtual void setHandle(INT32 handle); 104 virtual void setUniqueID(INT32 uniqueId); 105 virtual void setPoolID(INT32 poolId); 106 virtual void setAllocator(RTAllocator *allocator); 107 virtual void setUserData(void *param, UserDataFree freeFunc = RT_NULL); 108 109 virtual RT_BOOL hasFlag(INT32 flag) const; 110 virtual void setFlag(INT32 flag, INT32 value); 111 virtual RtMetaData* getMetaData(); 112 getAllocator()113 RTAllocator * getAllocator() { return mAllocator; } 114 RtMediaBufferStatus getStatus(); 115 RTMediaBufferSite getSite(); 116 RtMetaData* extraMeta(const INT32 id); 117 void setExtraMeta(RtMetaData *meta, const INT32 id); hasMeta(const INT32 id)118 RT_BOOL hasMeta(const INT32 id) { 119 return mExtraMetas.find(id) != mExtraMetas.end(); 120 } 121 void* getBufferID(); 122 123 void setRegistered(RT_BOOL registered); 124 RT_BOOL isRegistered(); 125 126 // refs manage 127 RT_RET addRefs(); 128 INT32 refsCount(); 129 // Clears meta data and resets the range to the full extent. 130 virtual void reset(); 131 132 protected: 133 void decRefs(); 134 135 private: 136 void baseInit(); 137 138 protected: 139 void *mData; 140 UINT32 mSize; 141 UINT32 mRealSize; 142 UINT32 mRangeOffset; 143 UINT32 mRangeLength; 144 INT32 mHandle; 145 INT32 mFd; 146 INT32 mUniqueId; // all process can using this id 147 INT32 mPoolID; 148 UINT64 mModId; 149 UINT32 mPhyAddr; 150 RT_BOOL mOwnsData; 151 INT32 mRefCount; 152 void *mBufferID; 153 INT32 mBufferSeq; 154 RT_BOOL mRegistered; 155 RT_BOOL mReleased; 156 INT32 mFlag; 157 RTMBUserData mUserData; 158 RTAllocator *mAllocator; 159 RtMutex *mLock; 160 RtMutex mListenerLock; 161 RtReference *mBufObjRef; 162 163 RtMediaBufferStatus mStatus; 164 RTMediaBufferSite mSite; 165 RTBufferListener *mBufferListener; 166 RtMetaData *mMetaData; 167 std::map<INT32, RtMetaData *> mExtraMetas; 168 }; 169 170 #endif // SRC_RT_MEDIA_INCLUDE_RTMEDIABUFFER_H_ 171