* [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail
@ 2024-11-16 3:17 Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion Yunfei Dong
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Yunfei Dong @ 2024-11-16 3:17 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
User space attach the syntaxes and bit-stream buffer to a same media
request for stateless decode, and the syntax controls are the only
v4l2 control request. The request will be marked to complete status
when the buffer is set to done, then request object will be cleaned
form media request.
When v4l2_ctrl_request_complete() is later called, the control request
detect that there is no controls in the request object. It then creates
an empty control request object, but attaching an object to a completed
request is not allowed. Using manual request completion to handle the
request complete event.
---
depends on manual request completion patch:
[1] https://patchwork.linuxtv.org/project/linux-media/cover/cover.1724928939.git.hverkuil-cisco@xs4all.nl/
---
compared with v6:
- Using manual request completion for patch 1
- rebase on latest driver for patches 2/3/4/5
compared with v5:
- fix comments for patch 3
- fix smatch error for patch 1
compared with v4:
- re-write the commit message for cover-letter
- change patch 2/3/4/5 commit message
compared with v3:
- fix flush decoder issue when userspace stream off capture queue firstly
- fluster test result same with v3
compared with v2:
- add patch 5/6/7 to fix decode again issue
- add fluster test result with mt8195 platform(same with no changed):
1> ./fluster.py run -d GStreamer-VP8-V4L2SL-Gst1.0 -j1 -t 90
VP8-TEST-VECTORS 59/61
2> ./fluster.py run -d GStreamer-VP9-V4L2SL-Gst1.0 -j1 -t 90
VP9-TEST-VECTORS 276/305
3> ./fluster.py run -d GStreamer-AV1-V4L2SL-Gst1.0 -j1 -t 90
AV1-TEST-VECTORS 237/239
4> ./fluster.py run -d GStreamer-H.264-V4L2SL-Gst1.0 -j1 -t 90
JVT-AVC_V1 95/135
5> ./fluster.py run -d GStreamer-H.265-V4L2SL-Gst1.0 -j1 -t 90
JCT-VC-HEVC_V1 142/147
compared with v1:
- add patch 2/3/4 to fix timing issue.
---
Yunfei Dong (5):
media: mediatek: vcodec: support manual request completion
media: mediatek: vcodec: change flush decode order when stream off
media: mediatek: vcodec: remove media request checking
media: mediatek: vcodec: Get SRC buffer from bitstream instead of M2M
media: mediatek: vcodec: store current vb2 buffer to decode again
.../mediatek/vcodec/decoder/mtk_vcodec_dec.c | 43 ++++++++--------
.../vcodec/decoder/mtk_vcodec_dec_drv.h | 2 +
.../vcodec/decoder/mtk_vcodec_dec_stateless.c | 51 ++++++++++++-------
.../vcodec/decoder/vdec/vdec_av1_req_lat_if.c | 14 ++---
.../vcodec/decoder/vdec/vdec_vp9_req_lat_if.c | 15 +++---
5 files changed, 72 insertions(+), 53 deletions(-)
--
2.46.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion
2024-11-16 3:17 [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail Yunfei Dong
@ 2024-11-16 3:17 ` Yunfei Dong
2024-11-26 8:04 ` Sebastian Fricke
2024-11-16 3:17 ` [PATCH v7 2/5] media: mediatek: vcodec: change flush decode order when stream off Yunfei Dong
` (3 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Yunfei Dong @ 2024-11-16 3:17 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
There is only a buffer object for some codecs, the request is marked
as completed if the buffer is set to done. Framework will add a new
control handler object to the request with latest control values, will
get below warning if the driver calling v4l2_ctrl_request_complete to
set media request complete again. Using manual request completion to
fix this issue.
Workqueue: core-decoder vdec_msg_queue_core_work [mtk_vcodec_dec]
pstate: 80c00089 (Nzcv daIf +PAN +UAO -TCO BTYPE=--)
pc : media_request_object_bind+0xa8/0x124
lr : media_request_object_bind+0x50/0x124
sp : ffffffc011393be0
x29: ffffffc011393be0 x28: 0000000000000000
x27: ffffff890c280248 x26: ffffffe21a71ab88
x25: 0000000000000000 x24: ffffff890c280280
x23: ffffff890c280280 x22: 00000000fffffff0
x21: 0000000000000000 x20: ffffff890260d280
x19: ffffff890260d2e8 x18: 0000000000001000
x17: 0000000000000400 x16: ffffffe21a4584a0
x15: 000000000053361d x14: 0000000000000018
x13: 0000000000000004 x12: ffffffa82427d000
x11: ffffffe21ac3fce0 x10: 0000000000000001
x9 : 0000000000000000 x8 : 0000000000000003
x7 : 0000000000000000 x6 : 000000000000003f
x5 : 0000000000000040 x4 : ffffff89052e7b98
x3 : 0000000000000000 x2 : 0000000000000001
x1 : 0000000000000000 x0 : 0000000000000000
Call trace:
media_request_object_bind+0xa8/0x124
v4l2_ctrl_request_bind+0xc4/0x168
v4l2_ctrl_request_complete+0x198/0x1f4
mtk_vdec_stateless_cap_to_disp+0x58/0x8c [mtk_vcodec_dec 245a7c1e48ff1b2451a50e1dfcb174262b6b462c]
vdec_vp9_slice_core_decode+0x1c0/0x268 [mtk_vcodec_dec 245a7c1e48ff1b2451a50e1dfcb174262b6b462c]
vdec_msg_queue_core_work+0x60/0x11c [mtk_vcodec_dec 245a7c1e48ff1b2451a50e1dfcb174262b6b462c]
process_one_work+0x140/0x480
worker_thread+0x12c/0x2f8
kthread+0x13c/0x1d8
ret_from_fork+0x10/0x30
Fixes: 7b182b8d9c852 ("media: mediatek: vcodec: Refactor get and put capture buffer flow")
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../mediatek/vcodec/decoder/mtk_vcodec_dec.c | 8 +++++---
.../vcodec/decoder/mtk_vcodec_dec_stateless.c | 17 ++++++++++++++---
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
index 98838217b97d..d2146724f5de 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
@@ -887,10 +887,12 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
if (src_buf != &ctx->empty_flush_buf.vb) {
struct media_request *req =
src_buf->vb2_buf.req_obj.req;
- v4l2_m2m_buf_done(src_buf,
- VB2_BUF_STATE_ERROR);
- if (req)
+
+ v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
+ if (req) {
v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl);
+ media_request_manual_complete(req);
+ }
}
}
return;
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
index afa224da0f41..1e11c08d708f 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
@@ -264,8 +264,10 @@ static void mtk_vdec_stateless_cap_to_disp(struct mtk_vcodec_dec_ctx *ctx, int e
mtk_v4l2_vdec_err(ctx, "dst buffer is NULL");
}
- if (src_buf_req)
+ if (src_buf_req) {
v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
+ media_request_manual_complete(src_buf_req);
+ }
}
static struct vdec_fb *vdec_get_cap_buffer(struct mtk_vcodec_dec_ctx *ctx)
@@ -308,6 +310,7 @@ static void vb2ops_vdec_buf_request_complete(struct vb2_buffer *vb)
struct mtk_vcodec_dec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
v4l2_ctrl_request_complete(vb->req_obj.req, &ctx->ctrl_hdl);
+ media_request_manual_complete(vb->req_obj.req);
}
static void mtk_vdec_worker(struct work_struct *work)
@@ -375,8 +378,10 @@ static void mtk_vdec_worker(struct work_struct *work)
if (!IS_VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch) ||
ctx->current_codec == V4L2_PIX_FMT_VP8_FRAME) {
v4l2_m2m_buf_done_and_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx, state);
- if (src_buf_req)
+ if (src_buf_req) {
v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
+ media_request_manual_complete(src_buf_req);
+ }
} else {
if (ret != -EAGAIN) {
v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
@@ -731,9 +736,15 @@ static int fops_media_request_validate(struct media_request *mreq)
return vb2_request_validate(mreq);
}
+static void fops_media_request_queue(struct media_request *req)
+{
+ media_request_mark_manual_completion(req);
+ v4l2_m2m_request_queue(req);
+}
+
const struct media_device_ops mtk_vcodec_media_ops = {
.req_validate = fops_media_request_validate,
- .req_queue = v4l2_m2m_request_queue,
+ .req_queue = fops_media_request_queue,
};
static void mtk_vcodec_add_formats(unsigned int fourcc,
--
2.46.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 2/5] media: mediatek: vcodec: change flush decode order when stream off
2024-11-16 3:17 [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion Yunfei Dong
@ 2024-11-16 3:17 ` Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 3/5] media: mediatek: vcodec: remove media request checking Yunfei Dong
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Yunfei Dong @ 2024-11-16 3:17 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
The driver status is set to flush when flush_decoder is called.
The order of STREAMOFF ioctl for OUTPUT and CAPTURE are randomly.
If flush_decoder is called in STREAMOFF for capture queue always,
leading to get NULL dst buffer when calling STREAMOFF for output
queue before capture queue.
Need to flush decoder when stream off no matter output or capture
queue is called firstly.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../mediatek/vcodec/decoder/mtk_vcodec_dec.c | 47 +++++++++----------
1 file changed, 23 insertions(+), 24 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
index d2146724f5de..2ccdffbadcda 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
@@ -882,29 +882,11 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
mtk_v4l2_vdec_dbg(3, ctx, "[%d] (%d) state=(%x) ctx->decoded_frame_cnt=%d",
ctx->id, q->type, ctx->state, ctx->decoded_frame_cnt);
- if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
- while ((src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx))) {
- if (src_buf != &ctx->empty_flush_buf.vb) {
- struct media_request *req =
- src_buf->vb2_buf.req_obj.req;
-
- v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
- if (req) {
- v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl);
- media_request_manual_complete(req);
- }
- }
- }
- return;
- }
-
- if (ctx->state >= MTK_STATE_HEADER) {
-
- /* Until STREAMOFF is called on the CAPTURE queue
- * (acknowledging the event), the driver operates
- * as if the resolution hasn't changed yet, i.e.
- * VIDIOC_G_FMT< etc. return previous resolution.
- * So we update picinfo here
+ if (ctx->state >= MTK_STATE_HEADER && ctx->state != MTK_STATE_FLUSH) {
+ /*
+ * The resolution hasn't been changed when STREAMOFF is called.
+ * Update the picinfo here with previous resolution if VIDIOC_G_FMT
+ * is called.
*/
ctx->picinfo = ctx->last_decoded_picinfo;
@@ -919,8 +901,25 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
ret = ctx->dev->vdec_pdata->flush_decoder(ctx);
if (ret)
mtk_v4l2_vdec_err(ctx, "DecodeFinal failed, ret=%d", ret);
+
+ ctx->state = MTK_STATE_FLUSH;
+ }
+
+ if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ while ((src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx))) {
+ if (src_buf != &ctx->empty_flush_buf.vb) {
+ struct media_request *req =
+ src_buf->vb2_buf.req_obj.req;
+
+ v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
+ if (req) {
+ v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl);
+ media_request_manual_complete(req);
+ }
+ }
+ }
+ return;
}
- ctx->state = MTK_STATE_FLUSH;
while ((dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx))) {
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0);
--
2.46.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 3/5] media: mediatek: vcodec: remove media request checking
2024-11-16 3:17 [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 2/5] media: mediatek: vcodec: change flush decode order when stream off Yunfei Dong
@ 2024-11-16 3:17 ` Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 4/5] media: mediatek: vcodec: Get SRC buffer from bitstream instead of M2M Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 5/5] media: mediatek: vcodec: store current vb2 buffer to decode again Yunfei Dong
4 siblings, 0 replies; 7+ messages in thread
From: Yunfei Dong @ 2024-11-16 3:17 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Setting the buffer status to error if the media request of
each source buffer is NULL, then schedule the work to process
again in case of access NULL pointer.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../mediatek/vcodec/decoder/mtk_vcodec_dec.c | 6 ++----
.../vcodec/decoder/mtk_vcodec_dec_stateless.c | 17 +++++------------
2 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
index 2ccdffbadcda..b16572d5cf54 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
@@ -912,10 +912,8 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
src_buf->vb2_buf.req_obj.req;
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
- if (req) {
- v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl);
- media_request_manual_complete(req);
- }
+ v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl);
+ media_request_manual_complete(req);
}
}
return;
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
index 1e11c08d708f..dd6ee694382e 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
@@ -264,10 +264,8 @@ static void mtk_vdec_stateless_cap_to_disp(struct mtk_vcodec_dec_ctx *ctx, int e
mtk_v4l2_vdec_err(ctx, "dst buffer is NULL");
}
- if (src_buf_req) {
- v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
- media_request_manual_complete(src_buf_req);
- }
+ v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
+ media_request_manual_complete(src_buf_req);
}
static struct vdec_fb *vdec_get_cap_buffer(struct mtk_vcodec_dec_ctx *ctx)
@@ -356,10 +354,7 @@ static void mtk_vdec_worker(struct work_struct *work)
ctx->id, bs_src->va, &bs_src->dma_addr, bs_src->size, vb2_src);
/* Apply request controls. */
src_buf_req = vb2_src->req_obj.req;
- if (src_buf_req)
- v4l2_ctrl_request_setup(src_buf_req, &ctx->ctrl_hdl);
- else
- mtk_v4l2_vdec_err(ctx, "vb2 buffer media request is NULL");
+ v4l2_ctrl_request_setup(src_buf_req, &ctx->ctrl_hdl);
ret = vdec_if_decode(ctx, bs_src, NULL, &res_chg);
if (ret && ret != -EAGAIN) {
@@ -378,10 +373,8 @@ static void mtk_vdec_worker(struct work_struct *work)
if (!IS_VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch) ||
ctx->current_codec == V4L2_PIX_FMT_VP8_FRAME) {
v4l2_m2m_buf_done_and_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx, state);
- if (src_buf_req) {
- v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
- media_request_manual_complete(src_buf_req);
- }
+ v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
+ media_request_manual_complete(src_buf_req);
} else {
if (ret != -EAGAIN) {
v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
--
2.46.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 4/5] media: mediatek: vcodec: Get SRC buffer from bitstream instead of M2M
2024-11-16 3:17 [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail Yunfei Dong
` (2 preceding siblings ...)
2024-11-16 3:17 ` [PATCH v7 3/5] media: mediatek: vcodec: remove media request checking Yunfei Dong
@ 2024-11-16 3:17 ` Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 5/5] media: mediatek: vcodec: store current vb2 buffer to decode again Yunfei Dong
4 siblings, 0 replies; 7+ messages in thread
From: Yunfei Dong @ 2024-11-16 3:17 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Getting the SRC buffer from M2M will pick a different than the one
used for current decode operation when the SRC buffer is removed
from ready list.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
---
.../vcodec/decoder/vdec/vdec_av1_req_lat_if.c | 14 ++++++++------
.../vcodec/decoder/vdec/vdec_vp9_req_lat_if.c | 15 +++++++--------
2 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c
index bf21f2467a0f..68e02c18a0af 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c
@@ -1062,18 +1062,20 @@ static inline void vdec_av1_slice_vsi_to_remote(struct vdec_av1_slice_vsi *vsi,
static int vdec_av1_slice_setup_lat_from_src_buf(struct vdec_av1_slice_instance *instance,
struct vdec_av1_slice_vsi *vsi,
+ struct mtk_vcodec_mem *bs,
struct vdec_lat_buf *lat_buf)
{
- struct vb2_v4l2_buffer *src;
+ struct mtk_video_dec_buf *src_buf_info;
struct vb2_v4l2_buffer *dst;
- src = v4l2_m2m_next_src_buf(instance->ctx->m2m_ctx);
- if (!src)
+ src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer);
+ if (!src_buf_info)
return -EINVAL;
- lat_buf->src_buf_req = src->vb2_buf.req_obj.req;
+ lat_buf->src_buf_req = src_buf_info->m2m_buf.vb.vb2_buf.req_obj.req;
+
dst = &lat_buf->ts_info;
- v4l2_m2m_buf_copy_metadata(src, dst, true);
+ v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, dst, true);
vsi->frame.cur_ts = dst->vb2_buf.timestamp;
return 0;
@@ -1723,7 +1725,7 @@ static int vdec_av1_slice_setup_lat(struct vdec_av1_slice_instance *instance,
struct vdec_av1_slice_vsi *vsi = &pfc->vsi;
int ret;
- ret = vdec_av1_slice_setup_lat_from_src_buf(instance, vsi, lat_buf);
+ ret = vdec_av1_slice_setup_lat_from_src_buf(instance, vsi, bs, lat_buf);
if (ret)
return ret;
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c
index eea709d93820..54a9c1d2695f 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c
@@ -712,19 +712,18 @@ int vdec_vp9_slice_setup_single_from_src_to_dst(struct vdec_vp9_slice_instance *
}
static int vdec_vp9_slice_setup_lat_from_src_buf(struct vdec_vp9_slice_instance *instance,
+ struct mtk_vcodec_mem *bs,
struct vdec_lat_buf *lat_buf)
{
- struct vb2_v4l2_buffer *src;
- struct vb2_v4l2_buffer *dst;
+ struct mtk_video_dec_buf *src_buf_info;
- src = v4l2_m2m_next_src_buf(instance->ctx->m2m_ctx);
- if (!src)
+ src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer);
+ if (!src_buf_info)
return -EINVAL;
- lat_buf->src_buf_req = src->vb2_buf.req_obj.req;
+ lat_buf->src_buf_req = src_buf_info->m2m_buf.vb.vb2_buf.req_obj.req;
+ v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, &lat_buf->ts_info, true);
- dst = &lat_buf->ts_info;
- v4l2_m2m_buf_copy_metadata(src, dst, true);
return 0;
}
@@ -1154,7 +1153,7 @@ static int vdec_vp9_slice_setup_lat(struct vdec_vp9_slice_instance *instance,
struct vdec_vp9_slice_vsi *vsi = &pfc->vsi;
int ret;
- ret = vdec_vp9_slice_setup_lat_from_src_buf(instance, lat_buf);
+ ret = vdec_vp9_slice_setup_lat_from_src_buf(instance, bs, lat_buf);
if (ret)
goto err;
--
2.46.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 5/5] media: mediatek: vcodec: store current vb2 buffer to decode again
2024-11-16 3:17 [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail Yunfei Dong
` (3 preceding siblings ...)
2024-11-16 3:17 ` [PATCH v7 4/5] media: mediatek: vcodec: Get SRC buffer from bitstream instead of M2M Yunfei Dong
@ 2024-11-16 3:17 ` Yunfei Dong
4 siblings, 0 replies; 7+ messages in thread
From: Yunfei Dong @ 2024-11-16 3:17 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
All the src vb2 buffer are removed from ready list when STREAMOFF
capture queue, may remove a non exist vb2 buffer if lat is working
currently. The driver also need to use current vb2 buffer to decode
again to wait for enough resource when lat decode error.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../vcodec/decoder/mtk_vcodec_dec_drv.h | 2 ++
.../vcodec/decoder/mtk_vcodec_dec_stateless.c | 29 ++++++++++++++-----
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h
index ac568ed14fa2..e70e97e401ba 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h
@@ -155,6 +155,7 @@ struct mtk_vcodec_dec_pdata {
* @last_decoded_picinfo: pic information get from latest decode
* @empty_flush_buf: a fake size-0 capture buffer that indicates flush. Used
* for stateful decoder.
+ * @cur_src_buffer: current vb2 buffer for the latest decode.
* @is_flushing: set to true if flushing is in progress.
*
* @current_codec: current set input codec, in V4L2 pixel format
@@ -201,6 +202,7 @@ struct mtk_vcodec_dec_ctx {
struct work_struct decode_work;
struct vdec_pic_info last_decoded_picinfo;
struct v4l2_m2m_buffer empty_flush_buf;
+ struct vb2_v4l2_buffer *cur_src_buffer;
bool is_flushing;
u32 current_codec;
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
index dd6ee694382e..ad3c585e339d 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
@@ -316,7 +316,7 @@ static void mtk_vdec_worker(struct work_struct *work)
struct mtk_vcodec_dec_ctx *ctx =
container_of(work, struct mtk_vcodec_dec_ctx, decode_work);
struct mtk_vcodec_dec_dev *dev = ctx->dev;
- struct vb2_v4l2_buffer *vb2_v4l2_src;
+ struct vb2_v4l2_buffer *vb2_v4l2_src = ctx->cur_src_buffer;
struct vb2_buffer *vb2_src;
struct mtk_vcodec_mem *bs_src;
struct mtk_video_dec_buf *dec_buf_src;
@@ -325,7 +325,7 @@ static void mtk_vdec_worker(struct work_struct *work)
bool res_chg = false;
int ret;
- vb2_v4l2_src = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
+ vb2_v4l2_src = vb2_v4l2_src ? vb2_v4l2_src : v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
if (!vb2_v4l2_src) {
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
mtk_v4l2_vdec_dbg(1, ctx, "[%d] no available source buffer", ctx->id);
@@ -375,13 +375,26 @@ static void mtk_vdec_worker(struct work_struct *work)
v4l2_m2m_buf_done_and_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx, state);
v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
media_request_manual_complete(src_buf_req);
- } else {
- if (ret != -EAGAIN) {
- v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
- v4l2_m2m_buf_done(vb2_v4l2_src, state);
- }
- v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
+
+ return;
}
+
+ /*
+ * If each codec return -EAGAIN to decode again, need to backup current source
+ * buffer, then the driver will get this buffer next time.
+ *
+ * If each codec decode error, must to set buffer done with error status for
+ * this buffer have been removed from ready list.
+ */
+ ctx->cur_src_buffer = (ret != -EAGAIN) ? NULL : vb2_v4l2_src;
+ if (ret && ret != -EAGAIN) {
+ v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
+ media_request_manual_complete(src_buf_req);
+ }
+
+ if (ret != -EAGAIN)
+ v4l2_m2m_buf_done(vb2_v4l2_src, state);
+ v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
}
static void vb2ops_vdec_stateless_buf_queue(struct vb2_buffer *vb)
--
2.46.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion
2024-11-16 3:17 ` [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion Yunfei Dong
@ 2024-11-26 8:04 ` Sebastian Fricke
0 siblings, 0 replies; 7+ messages in thread
From: Sebastian Fricke @ 2024-11-26 8:04 UTC (permalink / raw)
To: Yunfei Dong
Cc: Nícolas F . R . A . Prado, Nicolas Dufresne, Hans Verkuil,
AngeloGioacchino Del Regno, Benjamin Gaignard, Nathan Hebert,
Daniel Almeida, Hsin-Yi Wang, Fritz Koenig, Daniel Vetter,
Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
Hey Yunfei,
On 16.11.2024 11:17, Yunfei Dong wrote:
>There is only a buffer object for some codecs, the request is marked
>as completed if the buffer is set to done. Framework will add a new
>control handler object to the request with latest control values, will
>get below warning if the driver calling v4l2_ctrl_request_complete to
>set media request complete again. Using manual request completion to
>fix this issue.
Thank you for working on this.
I am currently working on this as well, so I would like to ask you for a
bit more patience, once I am finished with my testing and have a working
patch I'll send that patch and then we can discuss on the basis of that.
Regards,
Sebastian
>
>Workqueue: core-decoder vdec_msg_queue_core_work [mtk_vcodec_dec]
>pstate: 80c00089 (Nzcv daIf +PAN +UAO -TCO BTYPE=--)
>pc : media_request_object_bind+0xa8/0x124
>lr : media_request_object_bind+0x50/0x124
>sp : ffffffc011393be0
>x29: ffffffc011393be0 x28: 0000000000000000
>x27: ffffff890c280248 x26: ffffffe21a71ab88
>x25: 0000000000000000 x24: ffffff890c280280
>x23: ffffff890c280280 x22: 00000000fffffff0
>x21: 0000000000000000 x20: ffffff890260d280
>x19: ffffff890260d2e8 x18: 0000000000001000
>x17: 0000000000000400 x16: ffffffe21a4584a0
>x15: 000000000053361d x14: 0000000000000018
>x13: 0000000000000004 x12: ffffffa82427d000
>x11: ffffffe21ac3fce0 x10: 0000000000000001
>x9 : 0000000000000000 x8 : 0000000000000003
>x7 : 0000000000000000 x6 : 000000000000003f
>x5 : 0000000000000040 x4 : ffffff89052e7b98
>x3 : 0000000000000000 x2 : 0000000000000001
>x1 : 0000000000000000 x0 : 0000000000000000
>Call trace:
> media_request_object_bind+0xa8/0x124
> v4l2_ctrl_request_bind+0xc4/0x168
> v4l2_ctrl_request_complete+0x198/0x1f4
> mtk_vdec_stateless_cap_to_disp+0x58/0x8c [mtk_vcodec_dec 245a7c1e48ff1b2451a50e1dfcb174262b6b462c]
> vdec_vp9_slice_core_decode+0x1c0/0x268 [mtk_vcodec_dec 245a7c1e48ff1b2451a50e1dfcb174262b6b462c]
> vdec_msg_queue_core_work+0x60/0x11c [mtk_vcodec_dec 245a7c1e48ff1b2451a50e1dfcb174262b6b462c]
> process_one_work+0x140/0x480
> worker_thread+0x12c/0x2f8
> kthread+0x13c/0x1d8
> ret_from_fork+0x10/0x30
>
>Fixes: 7b182b8d9c852 ("media: mediatek: vcodec: Refactor get and put capture buffer flow")
>Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
>---
> .../mediatek/vcodec/decoder/mtk_vcodec_dec.c | 8 +++++---
> .../vcodec/decoder/mtk_vcodec_dec_stateless.c | 17 ++++++++++++++---
> 2 files changed, 19 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
>index 98838217b97d..d2146724f5de 100644
>--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
>+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c
>@@ -887,10 +887,12 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
> if (src_buf != &ctx->empty_flush_buf.vb) {
> struct media_request *req =
> src_buf->vb2_buf.req_obj.req;
>- v4l2_m2m_buf_done(src_buf,
>- VB2_BUF_STATE_ERROR);
>- if (req)
>+
>+ v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
>+ if (req) {
> v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl);
>+ media_request_manual_complete(req);
>+ }
> }
> }
> return;
>diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
>index afa224da0f41..1e11c08d708f 100644
>--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
>+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c
>@@ -264,8 +264,10 @@ static void mtk_vdec_stateless_cap_to_disp(struct mtk_vcodec_dec_ctx *ctx, int e
> mtk_v4l2_vdec_err(ctx, "dst buffer is NULL");
> }
>
>- if (src_buf_req)
>+ if (src_buf_req) {
> v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
>+ media_request_manual_complete(src_buf_req);
>+ }
> }
>
> static struct vdec_fb *vdec_get_cap_buffer(struct mtk_vcodec_dec_ctx *ctx)
>@@ -308,6 +310,7 @@ static void vb2ops_vdec_buf_request_complete(struct vb2_buffer *vb)
> struct mtk_vcodec_dec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
>
> v4l2_ctrl_request_complete(vb->req_obj.req, &ctx->ctrl_hdl);
>+ media_request_manual_complete(vb->req_obj.req);
> }
>
> static void mtk_vdec_worker(struct work_struct *work)
>@@ -375,8 +378,10 @@ static void mtk_vdec_worker(struct work_struct *work)
> if (!IS_VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch) ||
> ctx->current_codec == V4L2_PIX_FMT_VP8_FRAME) {
> v4l2_m2m_buf_done_and_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx, state);
>- if (src_buf_req)
>+ if (src_buf_req) {
> v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl);
>+ media_request_manual_complete(src_buf_req);
>+ }
> } else {
> if (ret != -EAGAIN) {
> v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
>@@ -731,9 +736,15 @@ static int fops_media_request_validate(struct media_request *mreq)
> return vb2_request_validate(mreq);
> }
>
>+static void fops_media_request_queue(struct media_request *req)
>+{
>+ media_request_mark_manual_completion(req);
>+ v4l2_m2m_request_queue(req);
>+}
>+
> const struct media_device_ops mtk_vcodec_media_ops = {
> .req_validate = fops_media_request_validate,
>- .req_queue = v4l2_m2m_request_queue,
>+ .req_queue = fops_media_request_queue,
> };
>
> static void mtk_vcodec_add_formats(unsigned int fourcc,
>--
>2.46.0
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-11-26 8:04 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-16 3:17 [PATCH v7 0/5] media: mediatek: vcodec: fix v4l2_ctrl_request_complete fail Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 1/5] media: mediatek: vcodec: support manual request completion Yunfei Dong
2024-11-26 8:04 ` Sebastian Fricke
2024-11-16 3:17 ` [PATCH v7 2/5] media: mediatek: vcodec: change flush decode order when stream off Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 3/5] media: mediatek: vcodec: remove media request checking Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 4/5] media: mediatek: vcodec: Get SRC buffer from bitstream instead of M2M Yunfei Dong
2024-11-16 3:17 ` [PATCH v7 5/5] media: mediatek: vcodec: store current vb2 buffer to decode again Yunfei Dong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox