xref: /rockchip-linux_mpp/inc/mpp_buffer.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #ifndef __MPP_BUFFER_H__
7*437bfbebSnyanmisaka #define __MPP_BUFFER_H__
8*437bfbebSnyanmisaka 
9*437bfbebSnyanmisaka #include "rk_type.h"
10*437bfbebSnyanmisaka #include "mpp_err.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka /*
13*437bfbebSnyanmisaka  * MppBuffer module has several functions:
14*437bfbebSnyanmisaka  *
15*437bfbebSnyanmisaka  * 1. buffer get / put / reference management / external commit / get info.
16*437bfbebSnyanmisaka  *    this part is the basic user interface for MppBuffer.
17*437bfbebSnyanmisaka  *
18*437bfbebSnyanmisaka  *    function:
19*437bfbebSnyanmisaka  *
20*437bfbebSnyanmisaka  *    mpp_buffer_get
21*437bfbebSnyanmisaka  *    mpp_buffer_put
22*437bfbebSnyanmisaka  *    mpp_buffer_inc_ref
23*437bfbebSnyanmisaka  *    mpp_buffer_commit
24*437bfbebSnyanmisaka  *    mpp_buffer_info_get
25*437bfbebSnyanmisaka  *
26*437bfbebSnyanmisaka  * 2. user buffer working flow control abstraction.
27*437bfbebSnyanmisaka  *    buffer should attach to certain group, and buffer mode control the buffer usage flow.
28*437bfbebSnyanmisaka  *    this part is also a part of user interface.
29*437bfbebSnyanmisaka  *
30*437bfbebSnyanmisaka  *    function:
31*437bfbebSnyanmisaka  *
32*437bfbebSnyanmisaka  *    mpp_buffer_group_get
33*437bfbebSnyanmisaka  *    mpp_buffer_group_normal_get
34*437bfbebSnyanmisaka  *    mpp_buffer_group_limit_get
35*437bfbebSnyanmisaka  *    mpp_buffer_group_put
36*437bfbebSnyanmisaka  *    mpp_buffer_group_limit_config
37*437bfbebSnyanmisaka  *
38*437bfbebSnyanmisaka  * 3. buffer allocator management
39*437bfbebSnyanmisaka  *    this part is for allocator on different os, it does not have user interface
40*437bfbebSnyanmisaka  *    it will support normal buffer, Android ion buffer, Linux v4l2 vb2 buffer
41*437bfbebSnyanmisaka  *    user can only use MppBufferType to choose.
42*437bfbebSnyanmisaka  *
43*437bfbebSnyanmisaka  */
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka /*
46*437bfbebSnyanmisaka  * mpp buffer group support two work flow mode:
47*437bfbebSnyanmisaka  *
48*437bfbebSnyanmisaka  * normal flow: all buffer are generated by MPP
49*437bfbebSnyanmisaka  *              under this mode, buffer pool is maintained internally
50*437bfbebSnyanmisaka  *
51*437bfbebSnyanmisaka  *              typical call flow:
52*437bfbebSnyanmisaka  *
53*437bfbebSnyanmisaka  *              mpp_buffer_group_get()          return A
54*437bfbebSnyanmisaka  *              mpp_buffer_get(A)               return a    ref +1 -> used
55*437bfbebSnyanmisaka  *              mpp_buffer_inc_ref(a)                       ref +1
56*437bfbebSnyanmisaka  *              mpp_buffer_put(a)                           ref -1
57*437bfbebSnyanmisaka  *              mpp_buffer_put(a)                           ref -1 -> unused
58*437bfbebSnyanmisaka  *              mpp_buffer_group_put(A)
59*437bfbebSnyanmisaka  *
60*437bfbebSnyanmisaka  * commit flow: all buffer are commited out of MPP
61*437bfbebSnyanmisaka  *              under this mode, buffers is commit by external api.
62*437bfbebSnyanmisaka  *              normally MPP only use it but not generate it.
63*437bfbebSnyanmisaka  *
64*437bfbebSnyanmisaka  *              typical call flow:
65*437bfbebSnyanmisaka  *
66*437bfbebSnyanmisaka  *              ==== external allocator ====
67*437bfbebSnyanmisaka  *              mpp_buffer_group_get()          return A
68*437bfbebSnyanmisaka  *              mpp_buffer_commit(A, x)
69*437bfbebSnyanmisaka  *              mpp_buffer_commit(A, y)
70*437bfbebSnyanmisaka  *
71*437bfbebSnyanmisaka  *              ======= internal user ======
72*437bfbebSnyanmisaka  *              mpp_buffer_get(A)               return a
73*437bfbebSnyanmisaka  *              mpp_buffer_get(A)               return b
74*437bfbebSnyanmisaka  *              mpp_buffer_put(a)
75*437bfbebSnyanmisaka  *              mpp_buffer_put(b)
76*437bfbebSnyanmisaka  *
77*437bfbebSnyanmisaka  *              ==== external allocator ====
78*437bfbebSnyanmisaka  *              mpp_buffer_group_put(A)
79*437bfbebSnyanmisaka  *
80*437bfbebSnyanmisaka  *              NOTE: commit interface required group handle to record group information
81*437bfbebSnyanmisaka  */
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka /*
84*437bfbebSnyanmisaka  * mpp buffer group has two buffer limit mode: normal and limit
85*437bfbebSnyanmisaka  *
86*437bfbebSnyanmisaka  * normal mode: allows any buffer size and always general new buffer is no unused buffer
87*437bfbebSnyanmisaka  *              is available.
88*437bfbebSnyanmisaka  *              This mode normally use with normal flow and is used for table / stream buffer
89*437bfbebSnyanmisaka  *
90*437bfbebSnyanmisaka  * limit mode : restrict the buffer's size and count in the buffer group. if try to calloc
91*437bfbebSnyanmisaka  *              buffer with different size or extra count it will fail.
92*437bfbebSnyanmisaka  *              This mode normally use with commit flow and is used for frame buffer
93*437bfbebSnyanmisaka  */
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka /*
96*437bfbebSnyanmisaka  * NOTE: normal mode is recommanded to work with normal flow, working with limit  mode is not.
97*437bfbebSnyanmisaka  *       limit  mode is recommanded to work with commit flow, working with normal mode is not.
98*437bfbebSnyanmisaka  */
99*437bfbebSnyanmisaka typedef enum {
100*437bfbebSnyanmisaka     MPP_BUFFER_INTERNAL,
101*437bfbebSnyanmisaka     MPP_BUFFER_EXTERNAL,
102*437bfbebSnyanmisaka     MPP_BUFFER_MODE_BUTT,
103*437bfbebSnyanmisaka } MppBufferMode;
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka /*
106*437bfbebSnyanmisaka  * the mpp buffer has serval types:
107*437bfbebSnyanmisaka  *
108*437bfbebSnyanmisaka  * normal   : normal malloc buffer for unit test or hardware simulation
109*437bfbebSnyanmisaka  * ion      : use ion device under Android/Linux, MppBuffer will encapsulte ion file handle
110*437bfbebSnyanmisaka  * ext_dma  : the DMABUF(DMA buffers) come from the application
111*437bfbebSnyanmisaka  * drm      : use the drm device interface for memory management
112*437bfbebSnyanmisaka  *
113*437bfbebSnyanmisaka  * MPP default allocator select priority for kernel above 5.10:
114*437bfbebSnyanmisaka  * MPP_BUFFER_TYPE_DMA_HEAP > MPP_BUFFER_TYPE_DRM > MPP_BUFFER_TYPE_ION
115*437bfbebSnyanmisaka  * MPP_BUFFER_TYPE_EXT_DMA is only used for general external dma_buf fd import.
116*437bfbebSnyanmisaka  */
117*437bfbebSnyanmisaka typedef enum {
118*437bfbebSnyanmisaka     MPP_BUFFER_TYPE_NORMAL,
119*437bfbebSnyanmisaka     MPP_BUFFER_TYPE_ION,
120*437bfbebSnyanmisaka     MPP_BUFFER_TYPE_EXT_DMA,
121*437bfbebSnyanmisaka     MPP_BUFFER_TYPE_DRM,
122*437bfbebSnyanmisaka     MPP_BUFFER_TYPE_DMA_HEAP,
123*437bfbebSnyanmisaka     MPP_BUFFER_TYPE_BUTT,
124*437bfbebSnyanmisaka } MppBufferType;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka #define MPP_BUFFER_TYPE_MASK            0x0000FFFF
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka /*
129*437bfbebSnyanmisaka  * MPP_BUFFER_FLAGS cooperate with MppBufferType
130*437bfbebSnyanmisaka  * 16 high bits of MppBufferType are used in flags
131*437bfbebSnyanmisaka  *
132*437bfbebSnyanmisaka  * eg:
133*437bfbebSnyanmisaka  * DMA_HEAP CMA buffer  : MPP_BUFFER_TYPE_DMA_HEAP | MPP_BUFFER_FLAGS_CONTIG
134*437bfbebSnyanmisaka  *                      = 0x00010004
135*437bfbebSnyanmisaka  * DRM SECURE buffer    : MPP_BUFFER_TYPE_DRM | MPP_BUFFER_FLAGS_SECURE
136*437bfbebSnyanmisaka  *                      = 0x00080003
137*437bfbebSnyanmisaka  *
138*437bfbebSnyanmisaka  * The dma buffer source can also be set by format: flags | type.
139*437bfbebSnyanmisaka  * dma buffer source flags:
140*437bfbebSnyanmisaka  * MPP_BUFFER_FLAGS_CONTIG means cma
141*437bfbebSnyanmisaka  * MPP_BUFFER_FLAGS_CACHABLE means cachable
142*437bfbebSnyanmisaka  * MPP_BUFFER_FLAGS_DMA32 means dma32
143*437bfbebSnyanmisaka  *
144*437bfbebSnyanmisaka  * flags originate from drm_rockchip_gem_mem_type
145*437bfbebSnyanmisaka  */
146*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_MASK           0x003f0000      //ROCKCHIP_BO_MASK << 16
147*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_CONTIG         0x00010000      //ROCKCHIP_BO_CONTIG << 16
148*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_CACHABLE       0x00020000      //ROCKCHIP_BO_CACHABLE << 16
149*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_WC             0x00040000      //ROCKCHIP_BO_WC << 16
150*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_SECURE         0x00080000      //ROCKCHIP_BO_SECURE << 16
151*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_ALLOC_KMAP     0x00100000      //ROCKCHIP_BO_ALLOC_KMAP << 16
152*437bfbebSnyanmisaka #define MPP_BUFFER_FLAGS_DMA32          0x00200000      //ROCKCHIP_BO_DMA32 << 16
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka /*
155*437bfbebSnyanmisaka  * MppBufferInfo variable's meaning is different in different MppBufferType
156*437bfbebSnyanmisaka  *
157*437bfbebSnyanmisaka  * Common
158*437bfbebSnyanmisaka  * index - the buffer index used to track buffer in buffer pool
159*437bfbebSnyanmisaka  * size  - the buffer size
160*437bfbebSnyanmisaka  *
161*437bfbebSnyanmisaka  * MPP_BUFFER_TYPE_NORMAL
162*437bfbebSnyanmisaka  *
163*437bfbebSnyanmisaka  * ptr  - virtual address of normal malloced buffer
164*437bfbebSnyanmisaka  * fd   - unused and set to -1, the allocator would return its
165*437bfbebSnyanmisaka  *         internal buffer counter number
166*437bfbebSnyanmisaka  *
167*437bfbebSnyanmisaka  * MPP_BUFFER_TYPE_ION
168*437bfbebSnyanmisaka  *
169*437bfbebSnyanmisaka  * ptr  - virtual address of ion buffer in user space
170*437bfbebSnyanmisaka  * hnd  - ion handle in user space
171*437bfbebSnyanmisaka  * fd   - ion buffer file handle for map / unmap
172*437bfbebSnyanmisaka  *
173*437bfbebSnyanmisaka  */
174*437bfbebSnyanmisaka typedef struct MppBufferInfo_t {
175*437bfbebSnyanmisaka     MppBufferType   type;
176*437bfbebSnyanmisaka     size_t          size;
177*437bfbebSnyanmisaka     void            *ptr;
178*437bfbebSnyanmisaka     void            *hnd;
179*437bfbebSnyanmisaka     int             fd;
180*437bfbebSnyanmisaka     int             index;
181*437bfbebSnyanmisaka } MppBufferInfo;
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka #define BUFFER_GROUP_SIZE_DEFAULT           (SZ_1M*80)
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka /*
186*437bfbebSnyanmisaka  * mpp_buffer_import_with_tag(MppBufferGroup group, MppBufferInfo *info, MppBuffer *buffer)
187*437bfbebSnyanmisaka  *
188*437bfbebSnyanmisaka  * 1. group - specified the MppBuffer to be attached to.
189*437bfbebSnyanmisaka  *    group can be NULL then this buffer will attached to default legecy group
190*437bfbebSnyanmisaka  *    Default to NULL on mpp_buffer_import case
191*437bfbebSnyanmisaka  *
192*437bfbebSnyanmisaka  * 2. info  - input information for the output MppBuffer
193*437bfbebSnyanmisaka  *    info can NOT be NULL. It must contain at least one of ptr/fd.
194*437bfbebSnyanmisaka  *
195*437bfbebSnyanmisaka  * 3. buffer - generated MppBuffer from MppBufferInfo.
196*437bfbebSnyanmisaka  *    buffer can be NULL then the buffer is commit to group with unused status.
197*437bfbebSnyanmisaka  *    Otherwise generated buffer will be directly got and ref_count increased.
198*437bfbebSnyanmisaka  *    Default to NULL on mpp_buffer_commit case
199*437bfbebSnyanmisaka  *
200*437bfbebSnyanmisaka  * mpp_buffer_commit usage:
201*437bfbebSnyanmisaka  *
202*437bfbebSnyanmisaka  * Add a external buffer info to group. This buffer will be on unused status.
203*437bfbebSnyanmisaka  * Typical usage is on Android. MediaPlayer gralloc Graphic buffer then commit these buffer
204*437bfbebSnyanmisaka  * to decoder's buffer group. Then decoder will recycle these buffer and return buffer reference
205*437bfbebSnyanmisaka  * to MediaPlayer for display.
206*437bfbebSnyanmisaka  *
207*437bfbebSnyanmisaka  * mpp_buffer_import usage:
208*437bfbebSnyanmisaka  *
209*437bfbebSnyanmisaka  * Transfer a external buffer info to MppBuffer but it is not expected to attached to certain
210*437bfbebSnyanmisaka  * buffer group. So the group is set to NULL. Then this buffer can be used for MppFrame/MppPacket.
211*437bfbebSnyanmisaka  * Typical usage is for image processing. Image processing normally will be a oneshot operation
212*437bfbebSnyanmisaka  * It does not need complicated group management. But in other hand mpp still need to know the
213*437bfbebSnyanmisaka  * imported buffer is leak or not and trace its usage inside mpp process. So we attach this kind
214*437bfbebSnyanmisaka  * of buffer to default misc buffer group for management.
215*437bfbebSnyanmisaka  */
216*437bfbebSnyanmisaka #define mpp_buffer_commit(group, info) \
217*437bfbebSnyanmisaka         mpp_buffer_import_with_tag(group, info, NULL, MODULE_TAG, __FUNCTION__)
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka #define mpp_buffer_import(buffer, info) \
220*437bfbebSnyanmisaka         mpp_buffer_import_with_tag(NULL, info, buffer, MODULE_TAG, __FUNCTION__)
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka #define mpp_buffer_get(group, buffer, size) \
223*437bfbebSnyanmisaka         mpp_buffer_get_with_tag(group, buffer, size, MODULE_TAG, __FUNCTION__)
224*437bfbebSnyanmisaka 
225*437bfbebSnyanmisaka #define mpp_buffer_put(buffer) \
226*437bfbebSnyanmisaka         mpp_buffer_put_with_caller(buffer, __FUNCTION__)
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka #define mpp_buffer_inc_ref(buffer) \
229*437bfbebSnyanmisaka         mpp_buffer_inc_ref_with_caller(buffer, __FUNCTION__)
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka #define mpp_buffer_info_get(buffer, info) \
232*437bfbebSnyanmisaka         mpp_buffer_info_get_with_caller(buffer, info, __FUNCTION__)
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka #define mpp_buffer_read(buffer, offset, data, size) \
235*437bfbebSnyanmisaka         mpp_buffer_read_with_caller(buffer, offset, data, size, __FUNCTION__)
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka #define mpp_buffer_write(buffer, offset, data, size) \
238*437bfbebSnyanmisaka         mpp_buffer_write_with_caller(buffer, offset, data, size, __FUNCTION__)
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka #define mpp_buffer_get_ptr(buffer) \
241*437bfbebSnyanmisaka         mpp_buffer_get_ptr_with_caller(buffer, __FUNCTION__)
242*437bfbebSnyanmisaka 
243*437bfbebSnyanmisaka #define mpp_buffer_get_fd(buffer) \
244*437bfbebSnyanmisaka         mpp_buffer_get_fd_with_caller(buffer, __FUNCTION__)
245*437bfbebSnyanmisaka 
246*437bfbebSnyanmisaka #define mpp_buffer_get_size(buffer) \
247*437bfbebSnyanmisaka         mpp_buffer_get_size_with_caller(buffer, __FUNCTION__)
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka #define mpp_buffer_get_index(buffer) \
250*437bfbebSnyanmisaka         mpp_buffer_get_index_with_caller(buffer, __FUNCTION__)
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka #define mpp_buffer_set_index(buffer, index) \
253*437bfbebSnyanmisaka         mpp_buffer_set_index_with_caller(buffer, index, __FUNCTION__)
254*437bfbebSnyanmisaka 
255*437bfbebSnyanmisaka #define mpp_buffer_get_offset(buffer) \
256*437bfbebSnyanmisaka         mpp_buffer_get_offset_with_caller(buffer, __FUNCTION__)
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka #define mpp_buffer_set_offset(buffer, offset) \
259*437bfbebSnyanmisaka         mpp_buffer_set_offset_with_caller(buffer, offset, __FUNCTION__)
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka #define mpp_buffer_set_discard(buffer) \
262*437bfbebSnyanmisaka         mpp_buffer_discard_with_caller(buffer, __FUNCTION__)
263*437bfbebSnyanmisaka 
264*437bfbebSnyanmisaka #define mpp_buffer_sync_begin(buffer) \
265*437bfbebSnyanmisaka         mpp_buffer_sync_begin_f(buffer, 0, __FUNCTION__)
266*437bfbebSnyanmisaka #define mpp_buffer_sync_end(buffer) \
267*437bfbebSnyanmisaka         mpp_buffer_sync_end_f(buffer, 0, __FUNCTION__)
268*437bfbebSnyanmisaka #define mpp_buffer_sync_partial_begin(buffer, offset, length) \
269*437bfbebSnyanmisaka         mpp_buffer_sync_partial_begin_f(buffer, 0, offset, length, __FUNCTION__)
270*437bfbebSnyanmisaka #define mpp_buffer_sync_partial_end(buffer, offset, length) \
271*437bfbebSnyanmisaka         mpp_buffer_sync_partial_end_f(buffer, 0, offset, length, __FUNCTION__)
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka #define mpp_buffer_sync_ro_begin(buffer) \
274*437bfbebSnyanmisaka         mpp_buffer_sync_begin_f(buffer, 1, __FUNCTION__)
275*437bfbebSnyanmisaka #define mpp_buffer_sync_ro_end(buffer) \
276*437bfbebSnyanmisaka         mpp_buffer_sync_end_f(buffer, 1, __FUNCTION__)
277*437bfbebSnyanmisaka #define mpp_buffer_sync_ro_partial_begin(buffer, offset, length) \
278*437bfbebSnyanmisaka         mpp_buffer_sync_partial_begin_f(buffer, 1, offset, length, __FUNCTION__)
279*437bfbebSnyanmisaka #define mpp_buffer_sync_ro_partial_end(buffer, offset, length) \
280*437bfbebSnyanmisaka         mpp_buffer_sync_partial_end_f(buffer, 1, offset, length, __FUNCTION__)
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka #define mpp_buffer_group_get_internal(group, type, ...) \
283*437bfbebSnyanmisaka         mpp_buffer_group_get(group, (MppBufferType)(type), MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__)
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka #define mpp_buffer_group_get_external(group, type, ...) \
286*437bfbebSnyanmisaka         mpp_buffer_group_get(group, (MppBufferType)(type), MPP_BUFFER_EXTERNAL, MODULE_TAG, __FUNCTION__)
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka #ifdef __cplusplus
289*437bfbebSnyanmisaka extern "C" {
290*437bfbebSnyanmisaka #endif
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka /*
293*437bfbebSnyanmisaka  * MppBuffer interface
294*437bfbebSnyanmisaka  * these interface will change value of group and buffer so before calling functions
295*437bfbebSnyanmisaka  * parameter need to be checked.
296*437bfbebSnyanmisaka  *
297*437bfbebSnyanmisaka  * IMPORTANT:
298*437bfbebSnyanmisaka  * mpp_buffer_import_with_tag - compounded interface for commit and import
299*437bfbebSnyanmisaka  *
300*437bfbebSnyanmisaka  */
301*437bfbebSnyanmisaka MPP_RET mpp_buffer_import_with_tag(MppBufferGroup group, MppBufferInfo *info, MppBuffer *buffer,
302*437bfbebSnyanmisaka                                    const char *tag, const char *caller);
303*437bfbebSnyanmisaka MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t size,
304*437bfbebSnyanmisaka                                 const char *tag, const char *caller);
305*437bfbebSnyanmisaka MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller);
306*437bfbebSnyanmisaka MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller);
307*437bfbebSnyanmisaka MPP_RET mpp_buffer_discard_with_caller(MppBuffer buffer, const char *caller);
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller);
310*437bfbebSnyanmisaka MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller);
311*437bfbebSnyanmisaka MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller);
312*437bfbebSnyanmisaka void   *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller);
313*437bfbebSnyanmisaka int     mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller);
314*437bfbebSnyanmisaka size_t  mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller);
315*437bfbebSnyanmisaka int     mpp_buffer_get_index_with_caller(MppBuffer buffer, const char *caller);
316*437bfbebSnyanmisaka MPP_RET mpp_buffer_set_index_with_caller(MppBuffer buffer, int index, const char *caller);
317*437bfbebSnyanmisaka size_t  mpp_buffer_get_offset_with_caller(MppBuffer buffer, const char *caller);
318*437bfbebSnyanmisaka MPP_RET mpp_buffer_set_offset_with_caller(MppBuffer buffer, size_t offset, const char *caller);
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka /**
321*437bfbebSnyanmisaka  * @brief MppBuffer cache operation function
322*437bfbebSnyanmisaka  * @param buffer The MppBuffer to run the cache operation
323*437bfbebSnyanmisaka  * @param ro for readonly option
324*437bfbebSnyanmisaka  * @param offset partial sync data start offset
325*437bfbebSnyanmisaka  * @param length partial sync data length
326*437bfbebSnyanmisaka  */
327*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_begin_f(MppBuffer buffer, RK_S32 ro, const char* caller);
328*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_end_f(MppBuffer buffer, RK_S32 ro, const char* caller);
329*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_partial_begin_f(MppBuffer buffer, RK_S32 ro, RK_U32 offset, RK_U32 length, const char* caller);
330*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_partial_end_f(MppBuffer buffer, RK_S32 ro, RK_U32 offset, RK_U32 length, const char* caller);
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_get(MppBufferGroup *group, MppBufferType type, MppBufferMode mode,
333*437bfbebSnyanmisaka                              const char *tag, const char *caller);
334*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_put(MppBufferGroup group);
335*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_clear(MppBufferGroup group);
336*437bfbebSnyanmisaka RK_S32  mpp_buffer_group_unused(MppBufferGroup group);
337*437bfbebSnyanmisaka size_t  mpp_buffer_group_usage(MppBufferGroup group);
338*437bfbebSnyanmisaka MppBufferMode mpp_buffer_group_mode(MppBufferGroup group);
339*437bfbebSnyanmisaka MppBufferType mpp_buffer_group_type(MppBufferGroup group);
340*437bfbebSnyanmisaka 
341*437bfbebSnyanmisaka /*
342*437bfbebSnyanmisaka  * size  : 0 - no limit, other - max buffer size
343*437bfbebSnyanmisaka  * count : 0 - no limit, other - max buffer count
344*437bfbebSnyanmisaka  */
345*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_limit_config(MppBufferGroup group, size_t size, RK_S32 count);
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka RK_U32 mpp_buffer_total_now();
348*437bfbebSnyanmisaka RK_U32 mpp_buffer_total_max();
349*437bfbebSnyanmisaka 
350*437bfbebSnyanmisaka #ifdef __cplusplus
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka #endif
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka #endif /*__MPP_BUFFER_H__*/
355