From a2dd092b93f5e518dab8330a1e956b582e7c7b77 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(+) diff --git a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c index 80c73fff4fb742..5cbc7213c77529 100644 --- 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 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); } @@ -1684,6 +1688,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) { @@ -2109,6 +2136,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, @@ -2727,6 +2756,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;