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