aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-16 23:40:32 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-17 15:11:22 +0200
commit20ea6adbf199097c4f5f591ffee088340630dae4 (patch)
treed6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch
parentbca05bd072180dc38ef740b37ded9572a6db1981 (diff)
downloadupstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip
bcm27xx: add support for linux v5.15
Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch111
1 files changed, 111 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch b/target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch
new file mode 100644
index 0000000000..8fcd0c20da
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0467-media-rpivid-Only-create-aux-entries-for-H265-if-nee.patch
@@ -0,0 +1,111 @@
+From 9b0eddfd7341525e0e3074a7f6202f5ccd431b05 Mon Sep 17 00:00:00 2001
+From: John Cox <jc@kynesim.co.uk>
+Date: Thu, 6 May 2021 13:48:05 +0100
+Subject: [PATCH] media: rpivid: Only create aux entries for H265 if
+ needed
+
+Only create aux entries of mv info for frames where that info might
+be used by a later frame. This saves some memory bandwidth and
+potentially some memory.
+
+Signed-off-by: John Cox <jc@kynesim.co.uk>
+---
+ drivers/staging/media/rpivid/rpivid_h265.c | 38 +++++++++++++---------
+ 1 file changed, 23 insertions(+), 15 deletions(-)
+
+--- a/drivers/staging/media/rpivid/rpivid_h265.c
++++ b/drivers/staging/media/rpivid/rpivid_h265.c
+@@ -246,6 +246,8 @@ struct rpivid_dec_state {
+ // Slice vars
+ unsigned int slice_idx;
+ bool slice_temporal_mvp; /* Slice flag but constant for frame */
++ bool use_aux;
++ bool mk_aux;
+
+ // Temp vars per run - don't actually need to persist
+ u8 *src_buf;
+@@ -1657,7 +1659,7 @@ static u32 mk_config2(const struct rpivi
+ c |= BIT(13);
+ if (sps->flags & V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED)
+ c |= BIT(14);
+- if (sps->flags & V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED)
++ if (s->mk_aux)
+ c |= BIT(15); /* Write motion vectors to external memory */
+ c |= (pps->log2_parallel_merge_level_minus2 + 2) << 16;
+ if (s->slice_temporal_mvp)
+@@ -1669,6 +1671,14 @@ static u32 mk_config2(const struct rpivi
+ return c;
+ }
+
++static inline bool is_ref_unit_type(const unsigned int nal_unit_type)
++{
++ /* From Table 7-1
++ * True for 1, 3, 5, 7, 9, 11, 13, 15
++ */
++ return (nal_unit_type & ~0xe) != 0;
++}
++
+ static void rpivid_h265_setup(struct rpivid_ctx *ctx, struct rpivid_run *run)
+ {
+ struct rpivid_dev *const dev = ctx->dev;
+@@ -1685,7 +1695,6 @@ static void rpivid_h265_setup(struct rpi
+ struct rpivid_dec_env *de = ctx->dec0;
+ unsigned int prev_rs;
+ unsigned int i;
+- int use_aux;
+ int rv;
+ bool slice_temporal_mvp;
+ bool frame_end;
+@@ -1828,6 +1837,16 @@ static void rpivid_h265_setup(struct rpi
+ */
+ s->slice_temporal_mvp = slice_temporal_mvp;
+
++ /*
++ * Need Aux ents for all (ref) DPB ents if temporal MV could
++ * be enabled for any pic
++ */
++ s->use_aux = ((s->sps.flags &
++ V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED) != 0);
++ s->mk_aux = s->use_aux &&
++ (s->sps.sps_max_sub_layers_minus1 >= sh0->nuh_temporal_id_plus1 ||
++ is_ref_unit_type(sh0->nal_unit_type));
++
+ // Phase 2 reg pre-calc
+ de->rpi_config2 = mk_config2(s);
+ de->rpi_framesize = (s->sps.pic_height_in_luma_samples << 16) |
+@@ -1952,15 +1971,6 @@ static void rpivid_h265_setup(struct rpi
+ // Frame end
+ memset(dpb_q_aux, 0,
+ sizeof(*dpb_q_aux) * V4L2_HEVC_DPB_ENTRIES_NUM_MAX);
+- /*
+- * Need Aux ents for all (ref) DPB ents if temporal MV could
+- * be enabled for any pic
+- * ** At the moment we create aux ents for all pics whether or not
+- * they are ref - they should then be discarded by the DPB-aux
+- * garbage collection code
+- */
+- use_aux = ((s->sps.flags &
+- V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED) != 0);
+
+ // Locate ref frames
+ // At least in the current implementation this is constant across all
+@@ -1994,7 +2004,7 @@ static void rpivid_h265_setup(struct rpi
+ continue;
+ }
+
+- if (use_aux) {
++ if (s->use_aux) {
+ dpb_q_aux[i] = aux_q_ref_idx(ctx, buffer_index);
+ if (!dpb_q_aux[i])
+ v4l2_warn(&dev->v4l2_dev,
+@@ -2016,9 +2026,7 @@ static void rpivid_h265_setup(struct rpi
+ // now
+ aux_q_release(ctx, &s->frame_aux);
+
+- if (use_aux) {
+- // New frame so new aux ent
+- // ??? Do we need this if non-ref ??? can we tell
++ if (s->mk_aux) {
+ s->frame_aux = aux_q_new(ctx, run->dst->vb2_buf.index);
+
+ if (!s->frame_aux) {