Skip to content

Commit

Permalink
staging/bcm2835-codec: Add support for pixel aspect ratio
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
6by9 committed Feb 2, 2021
1 parent 7d67faf commit 4de757c
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -1540,6 +1544,14 @@ static int vidioc_g_selection(struct file *file, void *priv,
s->r.width = q_data->crop_width;
s->r.height = q_data->crop_height;
break;
case V4L2_SEL_TGT_CROP_BOUNDS:
case V4L2_SEL_TGT_CROP_DEFAULT:
s->r.left = 0;
s->r.top = 0;
s->r.width = (q_data->bytesperline << 3) /
q_data->fmt->depth;
s->r.height = q_data->height;
break;
default:
return -EINVAL;
}
Expand Down Expand Up @@ -1684,6 +1696,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)
{
Expand Down Expand Up @@ -2109,6 +2144,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,

Expand Down Expand Up @@ -2728,6 +2765,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;
Expand Down

0 comments on commit 4de757c

Please sign in to comment.