avcodec/v4l2_context: set frame SAR using VIDIOC_CROPCAP
Signed-off-by: Aman Gupta <aman@tmm1.net>
This commit is contained in:
		
							parent
							
								
									0085c4d478
								
							
						
					
					
						commit
						b81a1c5bea
					
				@ -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) {
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user