staging/bcm2835-codec: Add support for pixel aspect ratio
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Tue, 2 Feb 2021 15:50:18 +0000 (15:50 +0000)
committerPhil Elwell <8911409+pelwell@users.noreply.github.com>
Fri, 12 Mar 2021 17:02:45 +0000 (17:02 +0000)
If the format is detected by the driver and a V4L2_EVENT_SOURCE_CHANGE
event is generated, then pass on the pixel aspect ratio as well.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c

index 0c4d8bf..46f659e 100644 (file)
@@ -602,6 +602,7 @@ struct bcm2835_codec_q_data {
        unsigned int            crop_width;
        unsigned int            crop_height;
        bool                    selection_set;
+       struct v4l2_fract       aspect_ratio;
 
        unsigned int            sizeimage;
        unsigned int            sequence;
@@ -981,6 +982,9 @@ static void handle_fmt_changed(struct bcm2835_codec_ctx *ctx,
        if (format->es.video.color_space)
                color_mmal2v4l(ctx, format->es.video.color_space);
 
+       q_data->aspect_ratio.numerator = format->es.video.par.num;
+       q_data->aspect_ratio.denominator = format->es.video.par.den;
+
        queue_res_chg_event(ctx);
 }
 
@@ -1657,6 +1661,29 @@ static int vidioc_g_parm(struct file *file, void *priv,
        return 0;
 }
 
+static int vidioc_g_pixelaspect(struct file *file, void *fh, int type,
+                               struct v4l2_fract *f)
+{
+       struct bcm2835_codec_ctx *ctx = file2ctx(file);
+
+       /*
+        * The selection API takes V4L2_BUF_TYPE_VIDEO_CAPTURE and
+        * V4L2_BUF_TYPE_VIDEO_OUTPUT, even if the device implements the MPLANE
+        * API. The V4L2 core will have converted the MPLANE variants to
+        * non-MPLANE.
+        * Open code this instead of using get_q_data in this case.
+        */
+       if (ctx->dev->role != DECODE)
+               return -ENOIOCTLCMD;
+
+       if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+               return -EINVAL;
+
+       *f = ctx->q_data[V4L2_M2M_DST].aspect_ratio;
+
+       return 0;
+}
+
 static int vidioc_subscribe_evt(struct v4l2_fh *fh,
                                const struct v4l2_event_subscription *sub)
 {
@@ -2082,6 +2109,8 @@ static const struct v4l2_ioctl_ops bcm2835_codec_ioctl_ops = {
        .vidioc_g_parm          = vidioc_g_parm,
        .vidioc_s_parm          = vidioc_s_parm,
 
+       .vidioc_g_pixelaspect   = vidioc_g_pixelaspect,
+
        .vidioc_subscribe_event = vidioc_subscribe_evt,
        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
 
@@ -2640,6 +2669,8 @@ static int bcm2835_codec_open(struct file *file)
                              ctx->q_data[V4L2_M2M_DST].crop_width,
                              ctx->q_data[V4L2_M2M_DST].height,
                              ctx->q_data[V4L2_M2M_DST].fmt);
+       ctx->q_data[V4L2_M2M_DST].aspect_ratio.numerator = 1;
+       ctx->q_data[V4L2_M2M_DST].aspect_ratio.denominator = 1;
 
        ctx->colorspace = V4L2_COLORSPACE_REC709;
        ctx->bitrate = 10 * 1000 * 1000;