media: coda: fix mpeg2 sequence number handling [Linux 4.9.187]

This Linux kernel change "media: coda: fix mpeg2 sequence number handling" is included in the Linux 4.9.187 release. This change is authored by Philipp Zabel <p.zabel [at] pengutronix.de> on Tue Jun 18 12:45:10 2019 -0400. The commit for this change in Linux stable tree is 06480fc (patch) which is from upstream commit 56d159a. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 56d159a.

media: coda: fix mpeg2 sequence number handling

[ Upstream commit 56d159a4ec6d8da7313aac6fcbb95d8fffe689ba ]

Sequence number handling assumed that the BIT processor frame number
starts counting at 1, but this is not true for the MPEG-2 decoder,
which starts at 0. Fix the sequence counter offset detection to handle
this.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>

There are 5 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/media/platform/coda/coda-bit.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c
index 717ee9a..1b8024f 100644
--- a/drivers/media/platform/coda/coda-bit.c
+++ b/drivers/media/platform/coda/coda-bit.c
@@ -1581,6 +1581,7 @@ static int __coda_start_decoding(struct coda_ctx *ctx)
        coda_write(dev, 0, CODA_REG_BIT_BIT_STREAM_PARAM);
        return -ETIMEDOUT;
    }
+   ctx->sequence_offset = ~0U;
    ctx->initialized = 1;

    /* Update kfifo out pointer from coda bitstream read pointer */
@@ -1971,7 +1972,9 @@ static void coda_finish_decode(struct coda_ctx *ctx)
        v4l2_err(&dev->v4l2_dev,
             "decoded frame index out of range: %d\n", decoded_idx);
    } else {
-       val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM) - 1;
+       val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM);
+       if (ctx->sequence_offset == -1)
+           ctx->sequence_offset = val;
        val -= ctx->sequence_offset;
        spin_lock_irqsave(&ctx->buffer_meta_lock, flags);
        if (!list_empty(&ctx->buffer_meta_list)) {

Leave a Reply

Your email address will not be published. Required fields are marked *