ImmortalWrt/target/linux/bcm27xx/patches-5.15/950-0356-staging-bcm2835-codec-Add-support-for-pixel-aspect-r.patch
Álvaro Fernández Rojas 20ea6adbf1 bcm27xx: add support for linux v5.15
Build system: x86_64
Build-tested: bcm2708, bcm2709, bcm2710, bcm2711
Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B

Signed-off-by: Marty Jones <mj8263788@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2022-05-17 15:11:22 +02:00

83 lines
2.7 KiB
Diff

From 9fd39b1fe86a26b942fc0ebf2138076758547c44 Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
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 <dave.stevenson@raspberrypi.com>
---
.../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;