]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/v4l2_context: set frame SAR using VIDIOC_CROPCAP
authorMaxime Jourdan <mjourdan@baylibre.com>
Fri, 30 Aug 2019 21:19:12 +0000 (14:19 -0700)
committerAman Gupta <aman@tmm1.net>
Wed, 11 Sep 2019 20:07:42 +0000 (13:07 -0700)
Signed-off-by: Aman Gupta <aman@tmm1.net>
libavcodec/v4l2_buffers.c
libavcodec/v4l2_context.c
libavcodec/v4l2_context.h

index 0b7a7959774f24e8c38973850b3c23d7cf834fef..ca8045f8d1863a6376fe7725231e82b8f3b6b691 100644 (file)
@@ -428,9 +428,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) {
index 862b3822335031c2cc081cc9c3fc5a29850116e7..874761752cb518d49cedcd1538f2bd4f41d5374f 100644 (file)
@@ -63,6 +63,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 = { 0, 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;
@@ -172,12 +190,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)
index 1026f5b8e1a09dd0e1fa334ce3101cd4754fc398..22a9532444b9b6a3a15fe301eaaf73889068b917 100644 (file)
@@ -69,6 +69,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