[FFmpeg-devel] [PATCH 22/25] avcodec/v4l2_context: set frame SAR using VIDIOC_CROPCAP
Aman Gupta
ffmpeg at tmm1.net
Tue Sep 3 04:02:27 EEST 2019
From: Maxime Jourdan <mjourdan at baylibre.com>
Signed-off-by: Aman Gupta <aman at tmm1.net>
---
libavcodec/v4l2_buffers.c | 3 ++-
libavcodec/v4l2_context.c | 20 ++++++++++++++++++++
libavcodec/v4l2_context.h | 1 +
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
index 33439ddb64..389b5dea8d 100644
--- a/libavcodec/v4l2_buffers.c
+++ b/libavcodec/v4l2_buffers.c
@@ -585,9 +585,10 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
frame->pts = v4l2_get_pts(avbuf);
frame->pkt_dts = AV_NOPTS_VALUE;
- /* these two values are updated also during re-init in v4l2_process_driver_event */
+ /* these values are updated also during re-init in v4l2_process_driver_event */
frame->height = avbuf->context->height;
frame->width = avbuf->context->width;
+ frame->sample_aspect_ratio = avbuf->context->sample_aspect_ratio;
/* 3. report errors upstream */
if (avbuf->buf.flags & V4L2_BUF_FLAG_ERROR) {
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
index 26e06273be..0461a9c7cf 100644
--- a/libavcodec/v4l2_context.c
+++ b/libavcodec/v4l2_context.c
@@ -64,6 +64,24 @@ static inline unsigned int v4l2_get_height(struct v4l2_format *fmt)
return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height;
}
+static AVRational v4l2_get_sar(V4L2Context *ctx)
+{
+ struct AVRational sar = { 1, 1 };
+ struct v4l2_cropcap cropcap;
+ int ret;
+
+ memset(&cropcap, 0, sizeof(cropcap));
+ cropcap.type = ctx->type;
+
+ ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_CROPCAP, &cropcap);
+ if (ret)
+ return sar;
+
+ sar.num = cropcap.pixelaspect.numerator;
+ sar.den = cropcap.pixelaspect.denominator;
+ return sar;
+}
+
static inline unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2_format *fmt2)
{
struct v4l2_format *fmt1 = &ctx->format;
@@ -177,12 +195,14 @@ static int v4l2_handle_event(V4L2Context *ctx)
if (full_reinit) {
s->output.height = v4l2_get_height(&out_fmt);
s->output.width = v4l2_get_width(&out_fmt);
+ s->output.sample_aspect_ratio = v4l2_get_sar(&s->output);
}
reinit = v4l2_resolution_changed(&s->capture, &cap_fmt);
if (reinit) {
s->capture.height = v4l2_get_height(&cap_fmt);
s->capture.width = v4l2_get_width(&cap_fmt);
+ s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture);
}
if (full_reinit || reinit)
diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h
index 64c53d07b5..67ac36c8bf 100644
--- a/libavcodec/v4l2_context.h
+++ b/libavcodec/v4l2_context.h
@@ -70,6 +70,7 @@ typedef struct V4L2Context {
* or accepts (in case of an output context, e.g. when encoding).
*/
int width, height;
+ AVRational sample_aspect_ratio;
/**
* Indexed array of V4L2Buffers
--
2.20.1
More information about the ffmpeg-devel
mailing list