From 3b5f6c8b26b217ca06ceb534893729975e7d7f95 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sun, 27 Feb 2022 18:56:08 +0100 Subject: [PATCH] ffmpeg: update v4l2-request patch Patch created using revisions 081225c..5607e91 from branch v4l2-request-hwaccel-4.4 of https://github.com/jernejsk/FFmpeg --- .../ffmpeg-001-v4l2-request.patch | 210 ++++++++++++++++-- 1 file changed, 194 insertions(+), 16 deletions(-) diff --git a/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch b/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch index 1976ec823b..d437a10977 100644 --- a/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch +++ b/packages/multimedia/ffmpeg/patches/v4l2-request/ffmpeg-001-v4l2-request.patch @@ -1,7 +1,7 @@ From 904af26693095364851bbc6c6557fca9b3437b69 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 3 Dec 2018 23:48:04 +0100 -Subject: [PATCH 01/16] avutil: add av_buffer_pool_flush() +Subject: [PATCH 01/17] avutil: add av_buffer_pool_flush() Used by V4L2 request API hwaccel @@ -55,7 +55,7 @@ index 241a80ed6709..f41363faf1dc 100644 From ec84dc22e99f544e4de7c43e7f8ef9ab7ee8e19b Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 -Subject: [PATCH 02/16] Add common V4L2 request API code +Subject: [PATCH 02/17] Add common V4L2 request API code Signed-off-by: Jonas Karlman --- @@ -1242,7 +1242,7 @@ index 000000000000..58d2aa70af80 From e432d3151f4c5507e40fb1fe8b3c3fb7c7a0a08c Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Wed, 20 Feb 2019 11:18:00 -0300 -Subject: [PATCH 03/16] h264dec: add idr_pic_id to slice context +Subject: [PATCH 03/17] h264dec: add idr_pic_id to slice context Used by V4L2 request API h264 hwaccel @@ -1282,7 +1282,7 @@ index b7b19ba4f162..0698ab95ba51 100644 From 84564d13ec0ec40f408622ff6b0d900723bbab5b Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2019 14:44:22 +0200 -Subject: [PATCH 04/16] h264dec: add ref_pic_marking and pic_order_cnt bit_size +Subject: [PATCH 04/17] h264dec: add ref_pic_marking and pic_order_cnt bit_size to slice context Used by V4L2 request API h264 hwaccel @@ -1359,7 +1359,7 @@ index 0698ab95ba51..2b39e82c3b03 100644 From 5a8628cf6368fe18457d02bf551d5935609efab5 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 -Subject: [PATCH 05/16] Add V4L2 request API h264 hwaccel +Subject: [PATCH 05/17] Add V4L2 request API h264 hwaccel Signed-off-by: Jernej Skrabec Signed-off-by: Jonas Karlman @@ -1920,7 +1920,7 @@ index 000000000000..88da8f0a2db0 From 02b8fb17c2a019463dcab4baa1cb0bec63353183 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 -Subject: [PATCH 06/16] Add V4L2 request API mpeg2 hwaccel +Subject: [PATCH 06/17] Add V4L2 request API mpeg2 hwaccel Signed-off-by: Jonas Karlman --- @@ -2170,7 +2170,7 @@ index 000000000000..84d53209c79d From 1cd61e5730acc12c39c964bcf13c73a54203a390 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 22 May 2019 14:46:58 +0200 -Subject: [PATCH 07/16] Add V4L2 request API vp8 hwaccel +Subject: [PATCH 07/17] Add V4L2 request API vp8 hwaccel Signed-off-by: Boris Brezillon Signed-off-by: Ezequiel Garcia @@ -2443,7 +2443,7 @@ index d16e7b6aa34e..8ee768d875ad 100644 From 3c09465f9dee3355b0ef68140b86e9e66797b5fc Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 -Subject: [PATCH 08/16] Add V4L2 request API hevc hwaccel +Subject: [PATCH 08/17] Add V4L2 request API hevc hwaccel Signed-off-by: Jernej Skrabec Signed-off-by: Jonas Karlman @@ -3157,7 +3157,7 @@ index 000000000000..3a9d564ce20b From 140874637c7d3d99b69e6b30f0ad32b07d4e43e8 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 12 Dec 2019 16:13:55 +0100 -Subject: [PATCH 09/16] Add V4L2 request API VP9 hwaccel +Subject: [PATCH 09/17] Add V4L2 request API VP9 hwaccel Signed-off-by: Boris Brezillon Signed-off-by: Jernej Skrabec @@ -3885,7 +3885,7 @@ index 54726df742f9..fee3568736f7 100644 From ae118fbbef1e287c5101d7ceaa164727d825c4c2 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 14 Feb 2019 23:20:05 +0100 -Subject: [PATCH 10/16] Add and use private linux v5.16 headers for V4L2 +Subject: [PATCH 10/17] Add and use private linux v5.16 headers for V4L2 request API ctrls Signed-off-by: Jernej Skrabec @@ -4184,7 +4184,7 @@ index 3a9d564ce20b..f645c538c25c 100644 From afe6727d8c300c77a72549b4e094910f09242a42 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 29 Apr 2019 22:08:59 +0000 -Subject: [PATCH 11/16] HACK: hwcontext_drm: do not require drm device +Subject: [PATCH 11/17] HACK: hwcontext_drm: do not require drm device Signed-off-by: Jonas Karlman --- @@ -4211,7 +4211,7 @@ index 7a9fdbd263d4..6297d1f9b613 100644 From bcad5ac25923b3d2395edceca821129c00b57b9e Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 -Subject: [PATCH 12/16] WIP: hevc entry point offsets +Subject: [PATCH 12/17] WIP: hevc entry point offsets Signed-off-by: Jernej Skrabec --- @@ -4258,7 +4258,7 @@ index f645c538c25c..601202a77d7a 100644 From 694b79d528295ae4d073c5972d35173116ff2b69 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Fri, 15 May 2020 16:54:05 +0000 -Subject: [PATCH 13/16] WIP: add NV15 and NV20 support +Subject: [PATCH 13/17] WIP: add NV15 and NV20 support Signed-off-by: Jonas Karlman --- @@ -4345,7 +4345,7 @@ index 5234b5049b0d..0b294feff2eb 100644 From dd29c8e4b504f12be27db8e188ba5bbaade7559f Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Mon, 27 Jul 2020 23:15:45 +0000 -Subject: [PATCH 14/16] HACK: define drm NV15 and NV20 format +Subject: [PATCH 14/17] HACK: define drm NV15 and NV20 format --- libavcodec/v4l2_request.c | 8 ++++++++ @@ -4374,7 +4374,7 @@ index 0b294feff2eb..a8f0ee79eeef 100644 From 0d56f3e7b04a5d574d38dd885000a6eb19eff903 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Wed, 13 May 2020 22:51:21 +0000 -Subject: [PATCH 15/16] WIP: hevc rkvdec fields +Subject: [PATCH 15/17] WIP: hevc rkvdec fields Signed-off-by: Jonas Karlman --- @@ -4490,7 +4490,7 @@ index 601202a77d7a..be7838244447 100644 From eb9a3213d56d9f6a177f16e907f57e0063b23244 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Sun, 19 Sep 2021 13:10:55 +0200 -Subject: [PATCH 16/16] v4l2_request: validate supported framesizes +Subject: [PATCH 16/17] v4l2_request: validate supported framesizes Signed-off-by: Alex Bee --- @@ -4553,3 +4553,181 @@ index a8f0ee79eeef..2fbe16634160 100644 fmtdesc.index++; } + +From 5607e918e68f9eb3280914b04e93ebff766e9e02 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sun, 27 Feb 2022 18:54:21 +0100 +Subject: [PATCH 17/17] Improve VP9 decoding + +--- + libavcodec/v4l2_request_vp9.c | 110 +++++++++++++++++++--------------- + 1 file changed, 62 insertions(+), 48 deletions(-) + +diff --git a/libavcodec/v4l2_request_vp9.c b/libavcodec/v4l2_request_vp9.c +index 9b95c76cdb82..ec0300f66dbe 100644 +--- a/libavcodec/v4l2_request_vp9.c ++++ b/libavcodec/v4l2_request_vp9.c +@@ -22,78 +22,62 @@ + + typedef struct V4L2RequestControlsVP9 { + struct v4l2_ctrl_vp9_frame decode_params; ++ struct v4l2_ctrl_vp9_compressed_hdr chp; + } V4L2RequestControlsVP9; + +-static int v4l2_request_vp9_set_frame_ctx(AVCodecContext *avctx) ++static void v4l2_request_vp9_set_frame_ctx(AVCodecContext *avctx) + { + VP9Context *s = avctx->priv_data; +- struct v4l2_ctrl_vp9_compressed_hdr chp; +- struct v4l2_ext_control control[] = { +- { +- .id = V4L2_CID_STATELESS_VP9_COMPRESSED_HDR, +- .ptr = &chp, +- .size = sizeof(chp), +- }, +- }; ++ const VP9Frame *f = &s->s.frames[CUR_FRAME]; ++ V4L2RequestControlsVP9 *controls = f->hwaccel_picture_private; ++ struct v4l2_ctrl_vp9_compressed_hdr *chp = &controls->chp; + +- memset(&chp, 0, sizeof(chp)); ++ memset(chp, 0, sizeof(&chp)); + +- chp.tx_mode = s->s.h.txfmmode; +- memcpy(chp.tx8, s->prob_raw.p.tx8p, sizeof(s->prob_raw.p.tx8p)); +- memcpy(chp.tx16, s->prob_raw.p.tx16p, sizeof(s->prob_raw.p.tx16p)); +- memcpy(chp.tx32, s->prob_raw.p.tx32p, sizeof(s->prob_raw.p.tx32p)); ++ chp->tx_mode = s->s.h.txfmmode; ++ memcpy(chp->tx8, s->prob_raw.p.tx8p, sizeof(s->prob_raw.p.tx8p)); ++ memcpy(chp->tx16, s->prob_raw.p.tx16p, sizeof(s->prob_raw.p.tx16p)); ++ memcpy(chp->tx32, s->prob_raw.p.tx32p, sizeof(s->prob_raw.p.tx32p)); + for (unsigned i = 0; i < 4; i++) { + for (unsigned j = 0; j < 2; j++) { + for (unsigned k = 0; k < 2; k++) { + for (unsigned l = 0; l < 6; l++) { + for (unsigned m = 0; m < 6; m++) { +- memcpy(chp.coef[i][j][k][l][m], s->prob_raw.coef[i][j][k][l][m], sizeof(chp.coef[0][0][0][0][0])); ++ memcpy(chp->coef[i][j][k][l][m], s->prob_raw.coef[i][j][k][l][m], sizeof(chp->coef[0][0][0][0][0])); + } + } + } + } + } +- memcpy(chp.skip, s->prob_raw.p.skip, sizeof(s->prob_raw.p.skip)); +- memcpy(chp.inter_mode, s->prob_raw.p.mv_mode, sizeof(s->prob_raw.p.mv_mode)); +- memcpy(chp.interp_filter, s->prob_raw.p.filter, sizeof(s->prob_raw.p.filter)); +- memcpy(chp.is_inter, s->prob_raw.p.intra, sizeof(s->prob_raw.p.intra)); +- memcpy(chp.comp_mode, s->prob_raw.p.comp, sizeof(s->prob_raw.p.comp)); +- memcpy(chp.single_ref, s->prob_raw.p.single_ref, sizeof(s->prob_raw.p.single_ref)); +- memcpy(chp.comp_ref, s->prob_raw.p.comp_ref, sizeof(s->prob_raw.p.comp_ref)); +- memcpy(chp.y_mode, s->prob_raw.p.y_mode, sizeof(s->prob_raw.p.y_mode)); ++ memcpy(chp->skip, s->prob_raw.p.skip, sizeof(s->prob_raw.p.skip)); ++ memcpy(chp->inter_mode, s->prob_raw.p.mv_mode, sizeof(s->prob_raw.p.mv_mode)); ++ memcpy(chp->interp_filter, s->prob_raw.p.filter, sizeof(s->prob_raw.p.filter)); ++ memcpy(chp->is_inter, s->prob_raw.p.intra, sizeof(s->prob_raw.p.intra)); ++ memcpy(chp->comp_mode, s->prob_raw.p.comp, sizeof(s->prob_raw.p.comp)); ++ memcpy(chp->single_ref, s->prob_raw.p.single_ref, sizeof(s->prob_raw.p.single_ref)); ++ memcpy(chp->comp_ref, s->prob_raw.p.comp_ref, sizeof(s->prob_raw.p.comp_ref)); ++ memcpy(chp->y_mode, s->prob_raw.p.y_mode, sizeof(s->prob_raw.p.y_mode)); + for (unsigned i = 0; i < 10; i++) +- memcpy(chp.uv_mode[i], s->prob.p.uv_mode[i], sizeof(s->prob.p.uv_mode[0])); ++ memcpy(chp->uv_mode[i], s->prob.p.uv_mode[i], sizeof(s->prob.p.uv_mode[0])); + for (unsigned i = 0; i < 4; i++) +- memcpy(chp.partition[i * 4], s->prob_raw.p.partition[i], sizeof(s->prob_raw.p.partition[0])); +- memcpy(chp.mv.joint, s->prob_raw.p.mv_joint, sizeof(s->prob_raw.p.mv_joint)); ++ memcpy(chp->partition[i * 4], s->prob_raw.p.partition[i], sizeof(s->prob_raw.p.partition[0])); ++ memcpy(chp->mv.joint, s->prob_raw.p.mv_joint, sizeof(s->prob_raw.p.mv_joint)); + for (unsigned i = 0; i < 2; i++) { +- chp.mv.sign[i] = s->prob_raw.p.mv_comp[i].sign; +- memcpy(chp.mv.classes[i], s->prob_raw.p.mv_comp[i].classes, sizeof(s->prob_raw.p.mv_comp[0].classes)); +- chp.mv.class0_bit[i] = s->prob_raw.p.mv_comp[i].class0; +- memcpy(chp.mv.bits[i], s->prob_raw.p.mv_comp[i].bits, sizeof(s->prob_raw.p.mv_comp[0].bits)); +- memcpy(chp.mv.class0_fr[i], s->prob_raw.p.mv_comp[i].class0_fp, sizeof(s->prob_raw.p.mv_comp[0].class0_fp)); +- memcpy(chp.mv.fr[i], s->prob_raw.p.mv_comp[i].fp, sizeof(s->prob_raw.p.mv_comp[0].fp)); +- chp.mv.class0_hp[i] = s->prob_raw.p.mv_comp[i].class0_hp; +- chp.mv.hp[i] = s->prob_raw.p.mv_comp[i].hp; ++ chp->mv.sign[i] = s->prob_raw.p.mv_comp[i].sign; ++ memcpy(chp->mv.classes[i], s->prob_raw.p.mv_comp[i].classes, sizeof(s->prob_raw.p.mv_comp[0].classes)); ++ chp->mv.class0_bit[i] = s->prob_raw.p.mv_comp[i].class0; ++ memcpy(chp->mv.bits[i], s->prob_raw.p.mv_comp[i].bits, sizeof(s->prob_raw.p.mv_comp[0].bits)); ++ memcpy(chp->mv.class0_fr[i], s->prob_raw.p.mv_comp[i].class0_fp, sizeof(s->prob_raw.p.mv_comp[0].class0_fp)); ++ memcpy(chp->mv.fr[i], s->prob_raw.p.mv_comp[i].fp, sizeof(s->prob_raw.p.mv_comp[0].fp)); ++ chp->mv.class0_hp[i] = s->prob_raw.p.mv_comp[i].class0_hp; ++ chp->mv.hp[i] = s->prob_raw.p.mv_comp[i].hp; + } +- +- return ff_v4l2_request_set_controls(avctx, control, FF_ARRAY_ELEMS(control)); + } + +-static int v4l2_request_vp9_start_frame(AVCodecContext *avctx, +- av_unused const uint8_t *buffer, +- av_unused uint32_t size) ++static void fill_frame(struct v4l2_ctrl_vp9_frame *dec_params, AVCodecContext *avctx) + { + const VP9Context *s = avctx->priv_data; +- const VP9Frame *f = &s->s.frames[CUR_FRAME]; +- V4L2RequestControlsVP9 *controls = f->hwaccel_picture_private; +- struct v4l2_ctrl_vp9_frame *dec_params = &controls->decode_params; + const ThreadFrame *ref; +- int ret; +- +- ret = v4l2_request_vp9_set_frame_ctx(avctx); +- if (ret) +- return ret; + + memset(dec_params, 0, sizeof(*dec_params)); + +@@ -208,6 +192,19 @@ static int v4l2_request_vp9_start_frame(AVCodecContext *avctx, + if (s->s.h.segmentation.feat[i].skip_enabled) + dec_params->seg.feature_enabled[i] |= 1 << V4L2_VP9_SEG_LVL_SKIP; + } ++} ++ ++static int v4l2_request_vp9_start_frame(AVCodecContext *avctx, ++ av_unused const uint8_t *buffer, ++ av_unused uint32_t size) ++{ ++ const VP9Context *s = avctx->priv_data; ++ const VP9Frame *f = &s->s.frames[CUR_FRAME]; ++ V4L2RequestControlsVP9 *controls = f->hwaccel_picture_private; ++ ++ v4l2_request_vp9_set_frame_ctx(avctx); ++ ++ fill_frame(&controls->decode_params, avctx); + + return ff_v4l2_request_reset_frame(avctx, f->tf.f); + } +@@ -233,6 +230,11 @@ static int v4l2_request_vp9_end_frame(AVCodecContext *avctx) + .ptr = &controls->decode_params, + .size = sizeof(controls->decode_params), + }, ++ { ++ .id = V4L2_CID_STATELESS_VP9_COMPRESSED_HDR, ++ .ptr = &controls->chp, ++ .size = sizeof(controls->chp), ++ }, + }; + + ret = ff_v4l2_request_decode_frame(avctx, f->tf.f, control, FF_ARRAY_ELEMS(control)); +@@ -247,8 +249,20 @@ static int v4l2_request_vp9_end_frame(AVCodecContext *avctx) + + static int v4l2_request_vp9_init(AVCodecContext *avctx) + { ++ struct v4l2_ctrl_vp9_frame frame; ++ ++ struct v4l2_ext_control control[] = { ++ { ++ .id = V4L2_CID_STATELESS_VP9_FRAME, ++ .ptr = &frame, ++ .size = sizeof(frame), ++ }, ++ }; ++ ++ fill_frame(&frame, avctx); ++ + // TODO: check V4L2_CID_MPEG_VIDEO_VP9_PROFILE +- return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_VP9_FRAME, 3 * 1024 * 1024, NULL, 0); ++ return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_VP9_FRAME, 3 * 1024 * 1024, control, FF_ARRAY_ELEMS(control)); + } + + const AVHWAccel ff_vp9_v4l2request_hwaccel = {