xref: /rockchip-linux_mpp/mpp/base/mpp_buffer.c (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 #define MODULE_TAG "mpp_buffer"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "mpp_mem.h"
11*437bfbebSnyanmisaka #include "mpp_debug.h"
12*437bfbebSnyanmisaka #include "mpp_dmabuf.h"
13*437bfbebSnyanmisaka #include "mpp_buffer_impl.h"
14*437bfbebSnyanmisaka 
mpp_buffer_import_with_tag(MppBufferGroup group,MppBufferInfo * info,MppBuffer * buffer,const char * tag,const char * caller)15*437bfbebSnyanmisaka MPP_RET mpp_buffer_import_with_tag(MppBufferGroup group, MppBufferInfo *info, MppBuffer *buffer,
16*437bfbebSnyanmisaka                                    const char *tag, const char *caller)
17*437bfbebSnyanmisaka {
18*437bfbebSnyanmisaka     if (NULL == info) {
19*437bfbebSnyanmisaka         mpp_err("mpp_buffer_commit invalid input: info NULL from %s\n", caller);
20*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
21*437bfbebSnyanmisaka     }
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka     if (p) {
26*437bfbebSnyanmisaka         // if group is specified we need to check the parameter
27*437bfbebSnyanmisaka         if ((p->type & MPP_BUFFER_TYPE_MASK) != info->type ||
28*437bfbebSnyanmisaka             (p->type & MPP_BUFFER_TYPE_MASK) >= MPP_BUFFER_TYPE_BUTT ||
29*437bfbebSnyanmisaka             p->mode != MPP_BUFFER_EXTERNAL) {
30*437bfbebSnyanmisaka             mpp_err("mpp_buffer_commit invalid type found group %d info %d group mode %d from %s\n",
31*437bfbebSnyanmisaka                     p->type, info->type, p->mode, caller);
32*437bfbebSnyanmisaka             return MPP_ERR_UNKNOW;
33*437bfbebSnyanmisaka         }
34*437bfbebSnyanmisaka     } else {
35*437bfbebSnyanmisaka         // otherwise use default external group to manage them
36*437bfbebSnyanmisaka         p = mpp_buffer_get_misc_group(MPP_BUFFER_EXTERNAL, info->type);
37*437bfbebSnyanmisaka     }
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka     mpp_assert(p);
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
42*437bfbebSnyanmisaka     if (buffer) {
43*437bfbebSnyanmisaka         MppBufferImpl *buf = NULL;
44*437bfbebSnyanmisaka         ret = mpp_buffer_create(tag, caller, p, info, &buf);
45*437bfbebSnyanmisaka         *buffer = buf;
46*437bfbebSnyanmisaka     } else {
47*437bfbebSnyanmisaka         ret = mpp_buffer_create(tag, caller, p, info, NULL);
48*437bfbebSnyanmisaka     }
49*437bfbebSnyanmisaka     return ret;
50*437bfbebSnyanmisaka }
51*437bfbebSnyanmisaka 
mpp_buffer_get_with_tag(MppBufferGroup group,MppBuffer * buffer,size_t size,const char * tag,const char * caller)52*437bfbebSnyanmisaka MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t size,
53*437bfbebSnyanmisaka                                 const char *tag, const char *caller)
54*437bfbebSnyanmisaka {
55*437bfbebSnyanmisaka     if (NULL == buffer || 0 == size) {
56*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get invalid input: group %p buffer %p size %u from %s\n",
57*437bfbebSnyanmisaka                 group, buffer, size, caller);
58*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
59*437bfbebSnyanmisaka     }
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     if (NULL == group) {
62*437bfbebSnyanmisaka         // deprecated, only for libvpu support
63*437bfbebSnyanmisaka         group = mpp_buffer_get_misc_group(MPP_BUFFER_INTERNAL, MPP_BUFFER_TYPE_ION);
64*437bfbebSnyanmisaka     }
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     mpp_assert(group);
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
69*437bfbebSnyanmisaka     // try unused buffer first
70*437bfbebSnyanmisaka     MppBufferImpl *buf = mpp_buffer_get_unused(p, size, caller);
71*437bfbebSnyanmisaka     if (NULL == buf && MPP_BUFFER_INTERNAL == p->mode) {
72*437bfbebSnyanmisaka         MppBufferInfo info = {
73*437bfbebSnyanmisaka             p->type,
74*437bfbebSnyanmisaka             size,
75*437bfbebSnyanmisaka             NULL,
76*437bfbebSnyanmisaka             NULL,
77*437bfbebSnyanmisaka             -1,
78*437bfbebSnyanmisaka             -1,
79*437bfbebSnyanmisaka         };
80*437bfbebSnyanmisaka         // if failed try init a new buffer
81*437bfbebSnyanmisaka         mpp_buffer_create(tag, caller, p, &info, &buf);
82*437bfbebSnyanmisaka     }
83*437bfbebSnyanmisaka     *buffer = buf;
84*437bfbebSnyanmisaka     return (buf) ? (MPP_OK) : (MPP_NOK);
85*437bfbebSnyanmisaka }
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka 
mpp_buffer_put_with_caller(MppBuffer buffer,const char * caller)88*437bfbebSnyanmisaka MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller)
89*437bfbebSnyanmisaka {
90*437bfbebSnyanmisaka     if (NULL == buffer) {
91*437bfbebSnyanmisaka         mpp_err("mpp_buffer_put invalid input: buffer NULL from %s\n", caller);
92*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
93*437bfbebSnyanmisaka     }
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka     return mpp_buffer_ref_dec((MppBufferImpl*)buffer, caller);
96*437bfbebSnyanmisaka }
97*437bfbebSnyanmisaka 
mpp_buffer_inc_ref_with_caller(MppBuffer buffer,const char * caller)98*437bfbebSnyanmisaka MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller)
99*437bfbebSnyanmisaka {
100*437bfbebSnyanmisaka     if (NULL == buffer) {
101*437bfbebSnyanmisaka         mpp_err("mpp_buffer_inc_ref invalid input: buffer NULL from %s\n", caller);
102*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
103*437bfbebSnyanmisaka     }
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka     return mpp_buffer_ref_inc((MppBufferImpl*)buffer, caller);
106*437bfbebSnyanmisaka }
107*437bfbebSnyanmisaka 
mpp_buffer_discard_with_caller(MppBuffer buffer,const char * caller)108*437bfbebSnyanmisaka MPP_RET mpp_buffer_discard_with_caller(MppBuffer buffer, const char *caller)
109*437bfbebSnyanmisaka {
110*437bfbebSnyanmisaka     if (NULL == buffer) {
111*437bfbebSnyanmisaka         mpp_err("mpp_buffer_discard invalid input: buffer NULL from %s\n", caller);
112*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
113*437bfbebSnyanmisaka     }
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka     return mpp_buffer_discard((MppBufferImpl*)buffer, caller);
116*437bfbebSnyanmisaka }
117*437bfbebSnyanmisaka 
mpp_buffer_read_with_caller(MppBuffer buffer,size_t offset,void * data,size_t size,const char * caller)118*437bfbebSnyanmisaka MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller)
119*437bfbebSnyanmisaka {
120*437bfbebSnyanmisaka     if (NULL == buffer || NULL == data) {
121*437bfbebSnyanmisaka         mpp_err("mpp_buffer_read invalid input: buffer %p data %p from %s\n",
122*437bfbebSnyanmisaka                 buffer, data, caller);
123*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
124*437bfbebSnyanmisaka     }
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     if (0 == size)
127*437bfbebSnyanmisaka         return MPP_OK;
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
130*437bfbebSnyanmisaka     if (NULL == p->info.ptr)
131*437bfbebSnyanmisaka         mpp_buffer_mmap(p, caller);
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     void *src = p->info.ptr;
134*437bfbebSnyanmisaka     mpp_assert(src != NULL);
135*437bfbebSnyanmisaka     if (src)
136*437bfbebSnyanmisaka         memcpy(data, (char*)src + offset, size);
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     return MPP_OK;
139*437bfbebSnyanmisaka }
140*437bfbebSnyanmisaka 
mpp_buffer_write_with_caller(MppBuffer buffer,size_t offset,void * data,size_t size,const char * caller)141*437bfbebSnyanmisaka MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller)
142*437bfbebSnyanmisaka {
143*437bfbebSnyanmisaka     if (NULL == buffer || NULL == data) {
144*437bfbebSnyanmisaka         mpp_err("mpp_buffer_write invalid input: buffer %p data %p from %s\n",
145*437bfbebSnyanmisaka                 buffer, data, caller);
146*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
147*437bfbebSnyanmisaka     }
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     if (0 == size)
150*437bfbebSnyanmisaka         return MPP_OK;
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
153*437bfbebSnyanmisaka     if (offset + size > p->info.size)
154*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
155*437bfbebSnyanmisaka     if (NULL == p->info.ptr)
156*437bfbebSnyanmisaka         mpp_buffer_mmap(p, caller);
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     void *dst = p->info.ptr;
159*437bfbebSnyanmisaka     mpp_assert(dst != NULL);
160*437bfbebSnyanmisaka     if (dst)
161*437bfbebSnyanmisaka         memcpy((char*)dst + offset, data, size);
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     return MPP_OK;
164*437bfbebSnyanmisaka }
165*437bfbebSnyanmisaka 
mpp_buffer_get_ptr_with_caller(MppBuffer buffer,const char * caller)166*437bfbebSnyanmisaka void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller)
167*437bfbebSnyanmisaka {
168*437bfbebSnyanmisaka     if (NULL == buffer) {
169*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_ptr invalid NULL input from %s\n", caller);
170*437bfbebSnyanmisaka         return NULL;
171*437bfbebSnyanmisaka     }
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
174*437bfbebSnyanmisaka     if (NULL == p->info.ptr)
175*437bfbebSnyanmisaka         mpp_buffer_mmap(p, caller);
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     mpp_assert(p->info.ptr != NULL);
178*437bfbebSnyanmisaka     if (NULL == p->info.ptr)
179*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_ptr buffer %p ret NULL from %s\n", buffer, caller);
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka     return p->info.ptr;
182*437bfbebSnyanmisaka }
183*437bfbebSnyanmisaka 
mpp_buffer_get_fd_with_caller(MppBuffer buffer,const char * caller)184*437bfbebSnyanmisaka int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller)
185*437bfbebSnyanmisaka {
186*437bfbebSnyanmisaka     if (NULL == buffer) {
187*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_fd invalid NULL input from %s\n", caller);
188*437bfbebSnyanmisaka         return -1;
189*437bfbebSnyanmisaka     }
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
192*437bfbebSnyanmisaka     int fd = p->info.fd;
193*437bfbebSnyanmisaka     mpp_assert(fd >= 0);
194*437bfbebSnyanmisaka     if (fd < 0)
195*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_fd buffer %p fd %d from %s\n", buffer, fd, caller);
196*437bfbebSnyanmisaka 
197*437bfbebSnyanmisaka     return fd;
198*437bfbebSnyanmisaka }
199*437bfbebSnyanmisaka 
mpp_buffer_get_size_with_caller(MppBuffer buffer,const char * caller)200*437bfbebSnyanmisaka size_t mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller)
201*437bfbebSnyanmisaka {
202*437bfbebSnyanmisaka     if (NULL == buffer) {
203*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_size invalid NULL input from %s\n", caller);
204*437bfbebSnyanmisaka         return 0;
205*437bfbebSnyanmisaka     }
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
208*437bfbebSnyanmisaka     if (p->info.size == 0)
209*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_size buffer %p ret zero size from %s\n", buffer, caller);
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka     return p->info.size;
212*437bfbebSnyanmisaka }
213*437bfbebSnyanmisaka 
mpp_buffer_get_index_with_caller(MppBuffer buffer,const char * caller)214*437bfbebSnyanmisaka int mpp_buffer_get_index_with_caller(MppBuffer buffer, const char *caller)
215*437bfbebSnyanmisaka {
216*437bfbebSnyanmisaka     if (NULL == buffer) {
217*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_index invalid NULL input from %s\n", caller);
218*437bfbebSnyanmisaka         return -1;
219*437bfbebSnyanmisaka     }
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
222*437bfbebSnyanmisaka     return p->info.index;
223*437bfbebSnyanmisaka }
224*437bfbebSnyanmisaka 
mpp_buffer_set_index_with_caller(MppBuffer buffer,int index,const char * caller)225*437bfbebSnyanmisaka MPP_RET mpp_buffer_set_index_with_caller(MppBuffer buffer, int index,
226*437bfbebSnyanmisaka                                          const char *caller)
227*437bfbebSnyanmisaka {
228*437bfbebSnyanmisaka     if (NULL == buffer) {
229*437bfbebSnyanmisaka         mpp_err("mpp_buffer_set_index invalid NULL input from %s\n", caller);
230*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
231*437bfbebSnyanmisaka     }
232*437bfbebSnyanmisaka 
233*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
234*437bfbebSnyanmisaka     p->info.index = index;
235*437bfbebSnyanmisaka     return MPP_OK;
236*437bfbebSnyanmisaka }
237*437bfbebSnyanmisaka 
mpp_buffer_get_offset_with_caller(MppBuffer buffer,const char * caller)238*437bfbebSnyanmisaka size_t  mpp_buffer_get_offset_with_caller(MppBuffer buffer, const char *caller)
239*437bfbebSnyanmisaka {
240*437bfbebSnyanmisaka     if (NULL == buffer) {
241*437bfbebSnyanmisaka         mpp_err("mpp_buffer_get_offset invalid NULL input from %s\n", caller);
242*437bfbebSnyanmisaka         return -1;
243*437bfbebSnyanmisaka     }
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
246*437bfbebSnyanmisaka     return p->offset;
247*437bfbebSnyanmisaka }
248*437bfbebSnyanmisaka 
mpp_buffer_set_offset_with_caller(MppBuffer buffer,size_t offset,const char * caller)249*437bfbebSnyanmisaka MPP_RET mpp_buffer_set_offset_with_caller(MppBuffer buffer, size_t offset, const char *caller)
250*437bfbebSnyanmisaka {
251*437bfbebSnyanmisaka     if (NULL == buffer) {
252*437bfbebSnyanmisaka         mpp_err("mpp_buffer_set_offset invalid NULL input from %s\n", caller);
253*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
254*437bfbebSnyanmisaka     }
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
257*437bfbebSnyanmisaka     p->offset = offset;
258*437bfbebSnyanmisaka     return MPP_OK;
259*437bfbebSnyanmisaka }
260*437bfbebSnyanmisaka 
mpp_buffer_info_get_with_caller(MppBuffer buffer,MppBufferInfo * info,const char * caller)261*437bfbebSnyanmisaka MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller)
262*437bfbebSnyanmisaka {
263*437bfbebSnyanmisaka     if (NULL == buffer || NULL == info) {
264*437bfbebSnyanmisaka         mpp_err("mpp_buffer_info_get invalid input buffer %p info %p from %s\n",
265*437bfbebSnyanmisaka                 buffer, info, caller);
266*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
267*437bfbebSnyanmisaka     }
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka     MppBufferImpl *p = (MppBufferImpl*)buffer;
270*437bfbebSnyanmisaka     if (NULL == p->info.ptr)
271*437bfbebSnyanmisaka         mpp_buffer_mmap(p, caller);
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka     *info = p->info;
274*437bfbebSnyanmisaka     (void)caller;
275*437bfbebSnyanmisaka     return MPP_OK;
276*437bfbebSnyanmisaka }
277*437bfbebSnyanmisaka 
check_buf_need_sync(MppBuffer buffer,MPP_RET * ret,const char * caller)278*437bfbebSnyanmisaka static MPP_RET check_buf_need_sync(MppBuffer buffer, MPP_RET *ret, const char *caller)
279*437bfbebSnyanmisaka {
280*437bfbebSnyanmisaka     if (NULL == buffer) {
281*437bfbebSnyanmisaka         mpp_err("check buffer found NULL pointer from %s\n", caller);
282*437bfbebSnyanmisaka         return MPP_NOK;
283*437bfbebSnyanmisaka     }
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka     MppBufferImpl *impl = (MppBufferImpl *)buffer;
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka     if (impl->info.fd <= 0) {
288*437bfbebSnyanmisaka         mpp_err("check fd found invalid fd %d from %s\n", impl->info.fd, caller);
289*437bfbebSnyanmisaka         return MPP_NOK;
290*437bfbebSnyanmisaka     }
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     /* uncached buffer do not need to sync */
293*437bfbebSnyanmisaka     if (impl->uncached) {
294*437bfbebSnyanmisaka         *ret = MPP_OK;
295*437bfbebSnyanmisaka         return MPP_NOK;
296*437bfbebSnyanmisaka     }
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     return MPP_OK;
299*437bfbebSnyanmisaka }
300*437bfbebSnyanmisaka 
mpp_buffer_sync_begin_f(MppBuffer buffer,RK_S32 ro,const char * caller)301*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_begin_f(MppBuffer buffer, RK_S32 ro, const char* caller)
302*437bfbebSnyanmisaka {
303*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
304*437bfbebSnyanmisaka 
305*437bfbebSnyanmisaka     if (check_buf_need_sync(buffer, &ret, caller))
306*437bfbebSnyanmisaka         return ret;
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     MppBufferImpl *impl = (MppBufferImpl *)buffer;
309*437bfbebSnyanmisaka 
310*437bfbebSnyanmisaka     return mpp_dmabuf_sync_begin(impl->info.fd, ro, caller);
311*437bfbebSnyanmisaka }
312*437bfbebSnyanmisaka 
mpp_buffer_sync_end_f(MppBuffer buffer,RK_S32 ro,const char * caller)313*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_end_f(MppBuffer buffer, RK_S32 ro, const char* caller)
314*437bfbebSnyanmisaka {
315*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     if (check_buf_need_sync(buffer, &ret, caller))
318*437bfbebSnyanmisaka         return ret;
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka     MppBufferImpl *impl = (MppBufferImpl *)buffer;
321*437bfbebSnyanmisaka 
322*437bfbebSnyanmisaka     return mpp_dmabuf_sync_end(impl->info.fd, ro, caller);
323*437bfbebSnyanmisaka }
324*437bfbebSnyanmisaka 
mpp_buffer_sync_partial_begin_f(MppBuffer buffer,RK_S32 ro,RK_U32 offset,RK_U32 length,const char * caller)325*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_partial_begin_f(MppBuffer buffer, RK_S32 ro, RK_U32 offset, RK_U32 length, const char* caller)
326*437bfbebSnyanmisaka {
327*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
328*437bfbebSnyanmisaka 
329*437bfbebSnyanmisaka     if (check_buf_need_sync(buffer, &ret, caller))
330*437bfbebSnyanmisaka         return ret;
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka     MppBufferImpl *impl = (MppBufferImpl *)buffer;
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     return mpp_dmabuf_sync_partial_begin(impl->info.fd, ro, impl->offset + offset, length, caller);
335*437bfbebSnyanmisaka }
336*437bfbebSnyanmisaka 
mpp_buffer_sync_partial_end_f(MppBuffer buffer,RK_S32 ro,RK_U32 offset,RK_U32 length,const char * caller)337*437bfbebSnyanmisaka MPP_RET mpp_buffer_sync_partial_end_f(MppBuffer buffer, RK_S32 ro, RK_U32 offset, RK_U32 length, const char* caller)
338*437bfbebSnyanmisaka {
339*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
340*437bfbebSnyanmisaka 
341*437bfbebSnyanmisaka     if (check_buf_need_sync(buffer, &ret, caller))
342*437bfbebSnyanmisaka         return ret;
343*437bfbebSnyanmisaka 
344*437bfbebSnyanmisaka     MppBufferImpl *impl = (MppBufferImpl *)buffer;
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     return mpp_dmabuf_sync_partial_end(impl->info.fd, ro, impl->offset + offset, length, caller);
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka 
mpp_buffer_group_get(MppBufferGroup * group,MppBufferType type,MppBufferMode mode,const char * tag,const char * caller)349*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_get(MppBufferGroup *group, MppBufferType type, MppBufferMode mode,
350*437bfbebSnyanmisaka                              const char *tag, const char *caller)
351*437bfbebSnyanmisaka {
352*437bfbebSnyanmisaka     if (NULL == group ||
353*437bfbebSnyanmisaka         mode >= MPP_BUFFER_MODE_BUTT ||
354*437bfbebSnyanmisaka         (type & MPP_BUFFER_TYPE_MASK) >= MPP_BUFFER_TYPE_BUTT) {
355*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p mode %d type %d from %s\n",
356*437bfbebSnyanmisaka                   group, mode, type, caller);
357*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
358*437bfbebSnyanmisaka     }
359*437bfbebSnyanmisaka 
360*437bfbebSnyanmisaka     return mpp_buffer_group_init((MppBufferGroupImpl**)group, tag, caller, mode, type);
361*437bfbebSnyanmisaka }
362*437bfbebSnyanmisaka 
mpp_buffer_group_put(MppBufferGroup group)363*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_put(MppBufferGroup group)
364*437bfbebSnyanmisaka {
365*437bfbebSnyanmisaka     if (NULL == group) {
366*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
367*437bfbebSnyanmisaka         return MPP_NOK;
368*437bfbebSnyanmisaka     }
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     return mpp_buffer_group_deinit((MppBufferGroupImpl *)group);
371*437bfbebSnyanmisaka }
372*437bfbebSnyanmisaka 
mpp_buffer_group_clear(MppBufferGroup group)373*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_clear(MppBufferGroup group)
374*437bfbebSnyanmisaka {
375*437bfbebSnyanmisaka     if (NULL == group) {
376*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
377*437bfbebSnyanmisaka         return MPP_NOK;
378*437bfbebSnyanmisaka     }
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka     return mpp_buffer_group_reset((MppBufferGroupImpl *)group);
381*437bfbebSnyanmisaka }
382*437bfbebSnyanmisaka 
mpp_buffer_group_unused(MppBufferGroup group)383*437bfbebSnyanmisaka RK_S32  mpp_buffer_group_unused(MppBufferGroup group)
384*437bfbebSnyanmisaka {
385*437bfbebSnyanmisaka     if (NULL == group) {
386*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
387*437bfbebSnyanmisaka         return MPP_NOK;
388*437bfbebSnyanmisaka     }
389*437bfbebSnyanmisaka 
390*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
391*437bfbebSnyanmisaka     RK_S32 unused = 0;
392*437bfbebSnyanmisaka 
393*437bfbebSnyanmisaka     if (p->mode == MPP_BUFFER_INTERNAL) {
394*437bfbebSnyanmisaka         if (p->limit_count)
395*437bfbebSnyanmisaka             unused = p->limit_count - p->count_used;
396*437bfbebSnyanmisaka         else
397*437bfbebSnyanmisaka             unused = 3; /* NOTE: 3 for 1 decoding 2 deinterlace buffer */
398*437bfbebSnyanmisaka     } else
399*437bfbebSnyanmisaka         unused = p->count_unused;
400*437bfbebSnyanmisaka 
401*437bfbebSnyanmisaka     return unused;
402*437bfbebSnyanmisaka }
403*437bfbebSnyanmisaka 
mpp_buffer_group_usage(MppBufferGroup group)404*437bfbebSnyanmisaka size_t mpp_buffer_group_usage(MppBufferGroup group)
405*437bfbebSnyanmisaka {
406*437bfbebSnyanmisaka     if (NULL == group) {
407*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
408*437bfbebSnyanmisaka         return MPP_BUFFER_MODE_BUTT;
409*437bfbebSnyanmisaka     }
410*437bfbebSnyanmisaka 
411*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
412*437bfbebSnyanmisaka     return p->usage;
413*437bfbebSnyanmisaka }
414*437bfbebSnyanmisaka 
mpp_buffer_group_mode(MppBufferGroup group)415*437bfbebSnyanmisaka MppBufferMode mpp_buffer_group_mode(MppBufferGroup group)
416*437bfbebSnyanmisaka {
417*437bfbebSnyanmisaka     if (NULL == group) {
418*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
419*437bfbebSnyanmisaka         return MPP_BUFFER_MODE_BUTT;
420*437bfbebSnyanmisaka     }
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
423*437bfbebSnyanmisaka     return p->mode;
424*437bfbebSnyanmisaka }
425*437bfbebSnyanmisaka 
mpp_buffer_group_type(MppBufferGroup group)426*437bfbebSnyanmisaka MppBufferType mpp_buffer_group_type(MppBufferGroup group)
427*437bfbebSnyanmisaka {
428*437bfbebSnyanmisaka     if (NULL == group) {
429*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
430*437bfbebSnyanmisaka         return MPP_BUFFER_TYPE_BUTT;
431*437bfbebSnyanmisaka     }
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
434*437bfbebSnyanmisaka     return p->type;
435*437bfbebSnyanmisaka }
436*437bfbebSnyanmisaka 
mpp_buffer_group_limit_config(MppBufferGroup group,size_t size,RK_S32 count)437*437bfbebSnyanmisaka MPP_RET mpp_buffer_group_limit_config(MppBufferGroup group, size_t size, RK_S32 count)
438*437bfbebSnyanmisaka {
439*437bfbebSnyanmisaka     if (NULL == group) {
440*437bfbebSnyanmisaka         mpp_err_f("input invalid group %p\n", group);
441*437bfbebSnyanmisaka         return MPP_NOK;
442*437bfbebSnyanmisaka     }
443*437bfbebSnyanmisaka 
444*437bfbebSnyanmisaka     MppBufferGroupImpl *p = (MppBufferGroupImpl *)group;
445*437bfbebSnyanmisaka     mpp_assert(p->mode == MPP_BUFFER_INTERNAL);
446*437bfbebSnyanmisaka     p->limit_size     = size;
447*437bfbebSnyanmisaka     p->limit_count    = count;
448*437bfbebSnyanmisaka     return MPP_OK;
449*437bfbebSnyanmisaka }