From 5a1f76940af2691627837bb4f181a672abfaffa2 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 2 Feb 2021 15:50:18 +0000 Subject: [PATCH] staging/bcm2835-codec: Add support for pixel aspect ratio 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 --- .../bcm2835-codec/bcm2835-v4l2-codec.c | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) --- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c +++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c @@ -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 bc 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 *fi 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 bcm28 .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 fil 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;