mirror of https://gitee.com/openkylin/linux.git
162 lines
4.0 KiB
C
162 lines
4.0 KiB
C
#ifndef _MEDIA_VIDEOBUF2_INTERNAL_H
|
|
#define _MEDIA_VIDEOBUF2_INTERNAL_H
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <media/videobuf2-core.h>
|
|
|
|
extern int vb2_debug;
|
|
|
|
#define dprintk(level, fmt, arg...) \
|
|
do { \
|
|
if (vb2_debug >= level) \
|
|
pr_info("vb2: %s: " fmt, __func__, ## arg); \
|
|
} while (0)
|
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
|
/*
|
|
* If advanced debugging is on, then count how often each op is called
|
|
* successfully, which can either be per-buffer or per-queue.
|
|
*
|
|
* This makes it easy to check that the 'init' and 'cleanup'
|
|
* (and variations thereof) stay balanced.
|
|
*/
|
|
|
|
#define log_memop(vb, op) \
|
|
dprintk(2, "call_memop(%p, %d, %s)%s\n", \
|
|
(vb)->vb2_queue, (vb)->index, #op, \
|
|
(vb)->vb2_queue->mem_ops->op ? "" : " (nop)")
|
|
|
|
#define call_memop(vb, op, args...) \
|
|
({ \
|
|
struct vb2_queue *_q = (vb)->vb2_queue; \
|
|
int err; \
|
|
\
|
|
log_memop(vb, op); \
|
|
err = _q->mem_ops->op ? _q->mem_ops->op(args) : 0; \
|
|
if (!err) \
|
|
(vb)->cnt_mem_ ## op++; \
|
|
err; \
|
|
})
|
|
|
|
#define call_ptr_memop(vb, op, args...) \
|
|
({ \
|
|
struct vb2_queue *_q = (vb)->vb2_queue; \
|
|
void *ptr; \
|
|
\
|
|
log_memop(vb, op); \
|
|
ptr = _q->mem_ops->op ? _q->mem_ops->op(args) : NULL; \
|
|
if (!IS_ERR_OR_NULL(ptr)) \
|
|
(vb)->cnt_mem_ ## op++; \
|
|
ptr; \
|
|
})
|
|
|
|
#define call_void_memop(vb, op, args...) \
|
|
({ \
|
|
struct vb2_queue *_q = (vb)->vb2_queue; \
|
|
\
|
|
log_memop(vb, op); \
|
|
if (_q->mem_ops->op) \
|
|
_q->mem_ops->op(args); \
|
|
(vb)->cnt_mem_ ## op++; \
|
|
})
|
|
|
|
#define log_qop(q, op) \
|
|
dprintk(2, "call_qop(%p, %s)%s\n", q, #op, \
|
|
(q)->ops->op ? "" : " (nop)")
|
|
|
|
#define call_qop(q, op, args...) \
|
|
({ \
|
|
int err; \
|
|
\
|
|
log_qop(q, op); \
|
|
err = (q)->ops->op ? (q)->ops->op(args) : 0; \
|
|
if (!err) \
|
|
(q)->cnt_ ## op++; \
|
|
err; \
|
|
})
|
|
|
|
#define call_void_qop(q, op, args...) \
|
|
({ \
|
|
log_qop(q, op); \
|
|
if ((q)->ops->op) \
|
|
(q)->ops->op(args); \
|
|
(q)->cnt_ ## op++; \
|
|
})
|
|
|
|
#define log_vb_qop(vb, op, args...) \
|
|
dprintk(2, "call_vb_qop(%p, %d, %s)%s\n", \
|
|
(vb)->vb2_queue, (vb)->index, #op, \
|
|
(vb)->vb2_queue->ops->op ? "" : " (nop)")
|
|
|
|
#define call_vb_qop(vb, op, args...) \
|
|
({ \
|
|
int err; \
|
|
\
|
|
log_vb_qop(vb, op); \
|
|
err = (vb)->vb2_queue->ops->op ? \
|
|
(vb)->vb2_queue->ops->op(args) : 0; \
|
|
if (!err) \
|
|
(vb)->cnt_ ## op++; \
|
|
err; \
|
|
})
|
|
|
|
#define call_void_vb_qop(vb, op, args...) \
|
|
({ \
|
|
log_vb_qop(vb, op); \
|
|
if ((vb)->vb2_queue->ops->op) \
|
|
(vb)->vb2_queue->ops->op(args); \
|
|
(vb)->cnt_ ## op++; \
|
|
})
|
|
|
|
#else
|
|
|
|
#define call_memop(vb, op, args...) \
|
|
((vb)->vb2_queue->mem_ops->op ? \
|
|
(vb)->vb2_queue->mem_ops->op(args) : 0)
|
|
|
|
#define call_ptr_memop(vb, op, args...) \
|
|
((vb)->vb2_queue->mem_ops->op ? \
|
|
(vb)->vb2_queue->mem_ops->op(args) : NULL)
|
|
|
|
#define call_void_memop(vb, op, args...) \
|
|
do { \
|
|
if ((vb)->vb2_queue->mem_ops->op) \
|
|
(vb)->vb2_queue->mem_ops->op(args); \
|
|
} while (0)
|
|
|
|
#define call_qop(q, op, args...) \
|
|
((q)->ops->op ? (q)->ops->op(args) : 0)
|
|
|
|
#define call_void_qop(q, op, args...) \
|
|
do { \
|
|
if ((q)->ops->op) \
|
|
(q)->ops->op(args); \
|
|
} while (0)
|
|
|
|
#define call_vb_qop(vb, op, args...) \
|
|
((vb)->vb2_queue->ops->op ? (vb)->vb2_queue->ops->op(args) : 0)
|
|
|
|
#define call_void_vb_qop(vb, op, args...) \
|
|
do { \
|
|
if ((vb)->vb2_queue->ops->op) \
|
|
(vb)->vb2_queue->ops->op(args); \
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
#define call_bufop(q, op, args...) \
|
|
({ \
|
|
int ret = 0; \
|
|
if (q && q->buf_ops && q->buf_ops->op) \
|
|
ret = q->buf_ops->op(args); \
|
|
ret; \
|
|
})
|
|
|
|
bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb);
|
|
int vb2_verify_memory_type(struct vb2_queue *q,
|
|
enum vb2_memory memory, unsigned int type);
|
|
#endif /* _MEDIA_VIDEOBUF2_INTERNAL_H */
|