mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
media: platform: Cancel the last frame handling flow
There is no need to queue an empty buffer for signaling a last frame, because all frames are separate from each other in JPEG. Reviewed-by: Tomasz Figa <tfiga@chromium.org> Signed-off-by: Xia Jiang <xia.jiang@mediatek.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
0058ff2bef
commit
63ca740d51
@ -55,15 +55,9 @@ static struct mtk_jpeg_fmt mtk_jpeg_formats[] = {
|
||||
|
||||
#define MTK_JPEG_NUM_FORMATS ARRAY_SIZE(mtk_jpeg_formats)
|
||||
|
||||
enum {
|
||||
MTK_JPEG_BUF_FLAGS_INIT = 0,
|
||||
MTK_JPEG_BUF_FLAGS_LAST_FRAME = 1,
|
||||
};
|
||||
|
||||
struct mtk_jpeg_src_buf {
|
||||
struct vb2_v4l2_buffer b;
|
||||
struct list_head list;
|
||||
int flags;
|
||||
struct mtk_jpeg_dec_param dec_param;
|
||||
};
|
||||
|
||||
@ -501,31 +495,6 @@ static int mtk_jpeg_s_selection(struct file *file, void *priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtk_jpeg_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
|
||||
{
|
||||
struct v4l2_fh *fh = file->private_data;
|
||||
struct mtk_jpeg_ctx *ctx = mtk_jpeg_fh_to_ctx(priv);
|
||||
struct vb2_queue *vq;
|
||||
struct vb2_buffer *vb;
|
||||
struct mtk_jpeg_src_buf *jpeg_src_buf;
|
||||
|
||||
if (buf->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
|
||||
goto end;
|
||||
|
||||
vq = v4l2_m2m_get_vq(fh->m2m_ctx, buf->type);
|
||||
if (buf->index >= vq->num_buffers) {
|
||||
dev_err(ctx->jpeg->dev, "buffer index out of range\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vb = vb2_get_buffer(vq, buf->index);
|
||||
jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(vb);
|
||||
jpeg_src_buf->flags = (buf->m.planes[0].bytesused == 0) ?
|
||||
MTK_JPEG_BUF_FLAGS_LAST_FRAME : MTK_JPEG_BUF_FLAGS_INIT;
|
||||
end:
|
||||
return v4l2_m2m_qbuf(file, fh->m2m_ctx, buf);
|
||||
}
|
||||
|
||||
static const struct v4l2_ioctl_ops mtk_jpeg_ioctl_ops = {
|
||||
.vidioc_querycap = mtk_jpeg_querycap,
|
||||
.vidioc_enum_fmt_vid_cap = mtk_jpeg_enum_fmt_vid_cap,
|
||||
@ -536,7 +505,7 @@ static const struct v4l2_ioctl_ops mtk_jpeg_ioctl_ops = {
|
||||
.vidioc_g_fmt_vid_out_mplane = mtk_jpeg_g_fmt_vid_mplane,
|
||||
.vidioc_s_fmt_vid_cap_mplane = mtk_jpeg_s_fmt_vid_cap_mplane,
|
||||
.vidioc_s_fmt_vid_out_mplane = mtk_jpeg_s_fmt_vid_out_mplane,
|
||||
.vidioc_qbuf = mtk_jpeg_qbuf,
|
||||
.vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
|
||||
.vidioc_subscribe_event = mtk_jpeg_subscribe_event,
|
||||
.vidioc_g_selection = mtk_jpeg_g_selection,
|
||||
.vidioc_s_selection = mtk_jpeg_s_selection,
|
||||
@ -676,10 +645,6 @@ static void mtk_jpeg_buf_queue(struct vb2_buffer *vb)
|
||||
param = &jpeg_src_buf->dec_param;
|
||||
memset(param, 0, sizeof(*param));
|
||||
|
||||
if (jpeg_src_buf->flags & MTK_JPEG_BUF_FLAGS_LAST_FRAME) {
|
||||
v4l2_dbg(1, debug, &jpeg->v4l2_dev, "Got eos\n");
|
||||
goto end;
|
||||
}
|
||||
header_valid = mtk_jpeg_parse(param, (u8 *)vb2_plane_vaddr(vb, 0),
|
||||
vb2_get_plane_payload(vb, 0));
|
||||
if (!header_valid) {
|
||||
@ -792,19 +757,12 @@ static void mtk_jpeg_device_run(void *priv)
|
||||
struct mtk_jpeg_src_buf *jpeg_src_buf;
|
||||
struct mtk_jpeg_bs bs;
|
||||
struct mtk_jpeg_fb fb;
|
||||
int i, ret;
|
||||
int ret;
|
||||
|
||||
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
||||
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
||||
jpeg_src_buf = mtk_jpeg_vb2_to_srcbuf(&src_buf->vb2_buf);
|
||||
|
||||
if (jpeg_src_buf->flags & MTK_JPEG_BUF_FLAGS_LAST_FRAME) {
|
||||
for (i = 0; i < dst_buf->vb2_buf.num_planes; i++)
|
||||
vb2_set_plane_payload(&dst_buf->vb2_buf, i, 0);
|
||||
buf_state = VB2_BUF_STATE_DONE;
|
||||
goto dec_end;
|
||||
}
|
||||
|
||||
if (mtk_jpeg_check_resolution_change(ctx, &jpeg_src_buf->dec_param)) {
|
||||
mtk_jpeg_queue_src_chg_event(ctx);
|
||||
ctx->state = MTK_JPEG_SOURCE_CHANGE;
|
||||
|
Loading…
Reference in New Issue
Block a user