media: coda: implement decoder source change event
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 18 Jun 2019 16:45:16 +0000 (12:45 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 24 Jun 2019 18:26:01 +0000 (14:26 -0400)
The stateful decoder API requires decoders to signal detection
of stream dimensions via the V4L2_EVENT_SOURCE_CHANGE event.

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>
drivers/media/platform/coda/coda-common.c

index 3fe374287600dd2788e5c698de85a7d5674e97fc..19e3afa4f24d0a4a4c6e5da8168bea28240d41c6 100644 (file)
@@ -1255,9 +1255,16 @@ static int coda_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
 static int coda_subscribe_event(struct v4l2_fh *fh,
                                const struct v4l2_event_subscription *sub)
 {
+       struct coda_ctx *ctx = fh_to_ctx(fh);
+
        switch (sub->type) {
        case V4L2_EVENT_EOS:
                return v4l2_event_subscribe(fh, sub, 0, NULL);
+       case V4L2_EVENT_SOURCE_CHANGE:
+               if (ctx->inst_type == CODA_INST_DECODER)
+                       return v4l2_event_subscribe(fh, sub, 0, NULL);
+               else
+                       return -EINVAL;
        default:
                return v4l2_ctrl_subscribe_event(fh, sub);
        }
@@ -1642,6 +1649,16 @@ void coda_update_profile_level_ctrls(struct coda_ctx *ctx, u8 profile_idc,
        }
 }
 
+static void coda_queue_source_change_event(struct coda_ctx *ctx)
+{
+       static const struct v4l2_event source_change_event = {
+               .type = V4L2_EVENT_SOURCE_CHANGE,
+               .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
+       };
+
+       v4l2_event_queue_fh(&ctx->fh, &source_change_event);
+}
+
 static void coda_buf_queue(struct vb2_buffer *vb)
 {
        struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
@@ -1696,6 +1713,9 @@ static void coda_buf_queue(struct vb2_buffer *vb)
                                           &ctx->seq_init_work);
                                flush_work(&ctx->seq_init_work);
                        }
+
+                       if (ctx->initialized)
+                               coda_queue_source_change_event(ctx);
                }
        } else {
                if (ctx->inst_type == CODA_INST_ENCODER &&