From: Maxime Jourdan <[email protected]>

In order to handle Compressed Framebuffer support, we need to handle
the switch between 8bit and 10bit frame output.

This handles the bitdepth in the codec amvdec_src_change() call to handle
a source change/decode resume when the stream bitdepth changes.

Signed-off-by: Maxime Jourdan <[email protected]>
Signed-off-by: Neil Armstrong <[email protected]>
---
 drivers/staging/media/meson/vdec/codec_h264.c   |  3 ++-
 drivers/staging/media/meson/vdec/codec_vp9.c    |  3 ++-
 drivers/staging/media/meson/vdec/vdec.h         |  1 +
 drivers/staging/media/meson/vdec/vdec_helpers.c | 10 ++++++----
 drivers/staging/media/meson/vdec/vdec_helpers.h |  3 ++-
 5 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/media/meson/vdec/codec_h264.c 
b/drivers/staging/media/meson/vdec/codec_h264.c
index c61128fc4bb9..d53c9a464bde 100644
--- a/drivers/staging/media/meson/vdec/codec_h264.c
+++ b/drivers/staging/media/meson/vdec/codec_h264.c
@@ -353,7 +353,8 @@ static void codec_h264_src_change(struct amvdec_session 
*sess)
                frame_width, frame_height, crop_right, crop_bottom);
 
        codec_h264_set_par(sess);
-       amvdec_src_change(sess, frame_width, frame_height, h264->max_refs + 5);
+       amvdec_src_change(sess, frame_width, frame_height,
+                         h264->max_refs + 5, 8);
 }
 
 /*
diff --git a/drivers/staging/media/meson/vdec/codec_vp9.c 
b/drivers/staging/media/meson/vdec/codec_vp9.c
index 897f5d7a6aad..4c6a644ab1a7 100644
--- a/drivers/staging/media/meson/vdec/codec_vp9.c
+++ b/drivers/staging/media/meson/vdec/codec_vp9.c
@@ -2132,7 +2132,8 @@ static irqreturn_t codec_vp9_threaded_isr(struct 
amvdec_session *sess)
 
        codec_vp9_fetch_rpm(sess);
        if (codec_vp9_process_rpm(vp9)) {
-               amvdec_src_change(sess, vp9->width, vp9->height, 16);
+               amvdec_src_change(sess, vp9->width, vp9->height, 16,
+                                 vp9->is_10bit ? 10 : 8);
 
                /* No frame is actually processed */
                vp9->cur_frame = NULL;
diff --git a/drivers/staging/media/meson/vdec/vdec.h 
b/drivers/staging/media/meson/vdec/vdec.h
index f95445ac0658..e3e4af73447a 100644
--- a/drivers/staging/media/meson/vdec/vdec.h
+++ b/drivers/staging/media/meson/vdec/vdec.h
@@ -234,6 +234,7 @@ struct amvdec_session {
        u32 width;
        u32 height;
        u32 colorspace;
+       u32 bitdepth;
        u8 ycbcr_enc;
        u8 quantization;
        u8 xfer_func;
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c 
b/drivers/staging/media/meson/vdec/vdec_helpers.c
index 7f07a9175815..eed7a929c5d0 100644
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
@@ -436,7 +436,7 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess,
 EXPORT_SYMBOL_GPL(amvdec_set_par_from_dar);
 
 void amvdec_src_change(struct amvdec_session *sess, u32 width,
-                      u32 height, u32 dpb_size)
+                      u32 height, u32 dpb_size, u32 bitdepth)
 {
        static const struct v4l2_event ev = {
                .type = V4L2_EVENT_SOURCE_CHANGE,
@@ -451,7 +451,8 @@ void amvdec_src_change(struct amvdec_session *sess, u32 
width,
        if (sess->streamon_cap &&
            sess->width == width &&
            sess->height == height &&
-           dpb_size <= sess->num_dst_bufs) {
+           dpb_size <= sess->num_dst_bufs &&
+           sess->bitdepth == bitdepth) {
                sess->fmt_out->codec_ops->resume(sess);
                return;
        }
@@ -460,9 +461,10 @@ void amvdec_src_change(struct amvdec_session *sess, u32 
width,
        sess->width = width;
        sess->height = height;
        sess->status = STATUS_NEEDS_RESUME;
+       sess->bitdepth = bitdepth;
 
-       dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB size %u\n",
-               width, height, dpb_size);
+       dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB %u, bitdepth %u\n",
+               width, height, dpb_size, bitdepth);
        v4l2_event_queue_fh(&sess->fh, &ev);
 }
 EXPORT_SYMBOL_GPL(amvdec_src_change);
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.h 
b/drivers/staging/media/meson/vdec/vdec_helpers.h
index cfaed52ab526..f059cf195cca 100644
--- a/drivers/staging/media/meson/vdec/vdec_helpers.h
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.h
@@ -76,9 +76,10 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess,
  * @width: picture width detected by the hardware
  * @height: picture height detected by the hardware
  * @dpb_size: Decoded Picture Buffer size (= amount of buffers for decoding)
+ * @bitdepth: Bit depth (usually 10 or 8) of the coded content
  */
 void amvdec_src_change(struct amvdec_session *sess, u32 width,
-                      u32 height, u32 dpb_size);
+                      u32 height, u32 dpb_size, u32 bitdepth);
 
 /**
  * amvdec_abort() - Abort the current decoding session
-- 
2.22.0

Reply via email to