From patchwork Sun Aug 12 17:24:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 9958 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp2319654jad; Sun, 12 Aug 2018 10:32:10 -0700 (PDT) X-Google-Smtp-Source: AA+uWPxvAb8EExf+1nfJo1PBHgmOrLJYQZWxiXgK4yq+bcq/FtM6Le/ql2nS+gSbxxFgJjMystKU X-Received: by 2002:a1c:8f0e:: with SMTP id r14-v6mr6683638wmd.79.1534095130559; Sun, 12 Aug 2018 10:32:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534095130; cv=none; d=google.com; s=arc-20160816; b=VyyaZjskyNH4S2XFvB4x8lK3ED15pn3SF0RqKDadNNzfAHUR3a54Mfs68dLuPmVBBr WCuVHFc1LovFeg0JzQlXqpGYQXjm1JmWOxc9C1I3r2iP/xgN7CoQp1AZm/I5hooNHMyZ ofzjHqokCKrHW1EQ8N/+w79I+oQmBOyo6/B6d2OV6h8jPPJWakYbqSjweTJ3KKorOTS7 J0aXl1SPq4y9f5AHNI98Lmxle+mTjMEmEHuh0IkhIrrJgkk/2/SZUSYX2i951EhaeD/6 DFJHDSKDEzIRl+puAMPwrMWtUJYV5iuMhguoStzDoNgtSzN8havLv9JfNUUcN/Rx/DR2 u2Pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:in-reply-to:mime-version :user-agent:date:message-id:from:references:to:dkim-signature :delivered-to:arc-authentication-results; bh=4fDgA7jjtd0B7z+JGMOF2Bf3oML2N0QqzP/8V/bZ8Ag=; b=0rmNrap56fG0/8rwUUztwp/XWbzioEzv+oa6AXZ/nA56BcSPgdU36eqDimLKPIkuYD bAJkg71kKniCEEN93aAyTUnMjwInvS85ixExM8fM4wEb77m1LQn2MSruxqnDF3N8Q94x mvQBI8QrJF0U9Y03JtKlJHdpmXMFQdMn4eatamz6HXSymffnHwzGOeW9Vn+Aqt0ZZm2u RAGNZQjr7c5afVqOxxPLC/YmeZdAuQ+wYj4laRyXeQ1E+aHsPwF/Hig19CTz1OOLUaTo 5zzRkzeBbAlblaWLw+9gqxTvyHDrmXSVUF35IkVy4e7HqUO6H2F3zajLg8Gk81KaxCeV 0EtA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=qryeCrOE; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o9-v6si10438486wrq.63.2018.08.12.10.32.09; Sun, 12 Aug 2018 10:32:10 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=qryeCrOE; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1BAA168A59F; Sun, 12 Aug 2018 20:31:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 783D568A570 for ; Sun, 12 Aug 2018 20:31:38 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id f12-v6so12289797wrv.12 for ; Sun, 12 Aug 2018 10:32:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=BP5px3NUa1xzrCprKNH/en5hPGqrG20w0eLZV+MgZpY=; b=qryeCrOELso1/nhtRftRfUX5ducUUYlFkZKYkwGxetqQKkes76ikMdpLj2GXmf8QND m+joPrfQUbiRTKVclhoasJo8ZOys7zmSRhRiDNVS0defhtE0MyRt9AM73/KJyBEkml4U VaCpjXT2EeSKjnqdt5LihwTV2sC+/FbZcXEn6MTIY34P2a5JvbsVvQEOHcLPXeU1RsOO 8pKQthn0Su1Z4qPc0Bs3cbN3Oj6rx4fTnyVHNQZ8LK/taSSuYPCmI+cB4ziqa5cTNy64 zD0V5qiispTY/a3rk5Fisbn+N1U03vfaRFQEf6avEnDmwt0pkZHdh9yt/cSw8NsiLgZz xCeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=BP5px3NUa1xzrCprKNH/en5hPGqrG20w0eLZV+MgZpY=; b=MXvnPf922V9S/2CwkRgP3KQLQI8DpWgfd0QZ2VxQXZRXsCi6x9TP2AuRLPMHbSaL3Z VQ5n3U0uH9aWfaa9Dgsuj0HlsWqEEebNEV7QbdRndnUOI+2pOj7LGXIm7HMBZ0xFVgsA PI8MeVrWh6eNn1zoOHGBE1xwWvWSHiWmtTnu3cBqworyZaUQmbL6buK+clZafVYUKfg2 Gj4sl0rXV2kS6ED95hhA10OEzEoPGBmQO/jMt7jbfNKih/MRJzxXzwFkwMBtjgLXQkB3 GMjqwmDq570sVt3HOPpMdfb7Hfb2IL05XtGCIH59VDDE3R59wlTBhAhp0tH4osQE9A3C sM1w== X-Gm-Message-State: AOUpUlFQI2pSlNW5ZsXdFXOU+0CT19ulJAg27xgRHfJ952gfEjFDj6Yv O5o4bbIYEewg1H5egBX/Bq68wO/Kfo0= X-Received: by 2002:a5d:6841:: with SMTP id o1-v6mr9129678wrw.159.1534094686512; Sun, 12 Aug 2018 10:24:46 -0700 (PDT) Received: from [192.168.0.4] (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id b22-v6sm7172136wme.48.2018.08.12.10.24.45 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 12 Aug 2018 10:24:45 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org References: <20180812144035.17956-1-maxi.jourdan@wanadoo.fr> From: Mark Thompson Message-ID: <01e9296a-d2ef-64f8-a501-ddc18f64fbfd@jkqxz.net> Date: Sun, 12 Aug 2018 18:24:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20180812144035.17956-1-maxi.jourdan@wanadoo.fr> Content-Language: en-US Subject: Re: [FFmpeg-devel] [PATCH] avcodec: v4l2_m2m: add MJPEG enc/dec support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" On 12/08/18 15:40, Maxime Jourdan wrote: > Tested on an Odroid-C2 with a V4L2 M2M MJPEG decoder. > > Signed-off-by: Maxime Jourdan > --- > configure | 3 +++ > libavcodec/Makefile | 2 ++ > libavcodec/allcodecs.c | 2 ++ > libavcodec/v4l2_m2m_dec.c | 1 + > libavcodec/v4l2_m2m_enc.c | 1 + > 5 files changed, 9 insertions(+) > > diff --git a/configure b/configure > index e718c1531c..5a5ba1ebcf 100755 > --- a/configure > +++ b/configure > @@ -2939,6 +2939,8 @@ hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC" > hevc_vaapi_encoder_select="cbs_h265 vaapi_encode" > hevc_v4l2m2m_decoder_deps="v4l2_m2m hevc_v4l2_m2m" > hevc_v4l2m2m_encoder_deps="v4l2_m2m hevc_v4l2_m2m" > +mjpeg_v4l2m2m_decoder_deps="v4l2_m2m mjpeg_v4l2_m2m" > +mjpeg_v4l2m2m_encoder_deps="v4l2_m2m mjpeg_v4l2_m2m" > mjpeg_cuvid_decoder_deps="cuvid" > mjpeg_qsv_encoder_deps="libmfx" > mjpeg_qsv_encoder_select="qsvenc" > @@ -6252,6 +6254,7 @@ check_header linux/videodev2.h > test_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete > check_cc v4l2_m2m linux/videodev2.h "int i = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_BUF_FLAG_LAST;" > check_cc vc1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VC1_ANNEX_G;" > +check_cc mjpeg_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MJPEG;" The existing format code unconditionally assumes this value is present (libavcodec/v4l2_fmt.c:54 - it's been around forever for input devices), so the check isn't needed. > check_cc mpeg1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG1;" > check_cc mpeg2_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2;" > check_cc mpeg4_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG4;" > diff --git a/libavcodec/Makefile b/libavcodec/Makefile > index 6e40702947..cd975739ef 100644 > --- a/libavcodec/Makefile > +++ b/libavcodec/Makefile > @@ -415,7 +415,9 @@ OBJS-$(CONFIG_METASOUND_DECODER) += metasound.o metasound_data.o \ > twinvq.o > OBJS-$(CONFIG_MICRODVD_DECODER) += microdvddec.o ass.o > OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o > +OBJS-$(CONFIG_MJPEG_V4L2M2M_DECODER) += v4l2_m2m_dec.o > OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o > +OBJS-$(CONFIG_MJPEG_V4L2M2M_ENCODER) += v4l2_m2m_enc.o Use the same ordering as for other codecs. > OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpegenc_common.o \ > mjpegenc_huffman.o > OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > index ab3ec04251..af4870a54d 100644 > --- a/libavcodec/allcodecs.c > +++ b/libavcodec/allcodecs.c > @@ -173,7 +173,9 @@ extern AVCodec ff_magicyuv_encoder; > extern AVCodec ff_magicyuv_decoder; > extern AVCodec ff_mdec_decoder; > extern AVCodec ff_mimic_decoder; This file gets parsed in order to make the table of decoders/encoders, so: > +extern AVCodec ff_mjpeg_v4l2m2m_encoder; > extern AVCodec ff_mjpeg_encoder; The new entry for the encoder should be in the non-default section at the bottom. > +extern AVCodec ff_mjpeg_v4l2m2m_decoder; > extern AVCodec ff_mjpeg_decoder; The new entry for the decoder should be after the normal decoder. > extern AVCodec ff_mjpegb_decoder; > extern AVCodec ff_mmvideo_decoder; > diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c > index a4e2f02596..80a09f7a43 100644 > --- a/libavcodec/v4l2_m2m_dec.c > +++ b/libavcodec/v4l2_m2m_dec.c > @@ -231,6 +231,7 @@ AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \ > > M2MDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb"); > M2MDEC(hevc, "HEVC", AV_CODEC_ID_HEVC, "hevc_mp4toannexb"); > +M2MDEC(mjpeg, "MJPEG", AV_CODEC_ID_MJPEG, NULL); > M2MDEC(mpeg1, "MPEG1", AV_CODEC_ID_MPEG1VIDEO, NULL); > M2MDEC(mpeg2, "MPEG2", AV_CODEC_ID_MPEG2VIDEO, NULL); > M2MDEC(mpeg4, "MPEG4", AV_CODEC_ID_MPEG4, NULL); > diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c > index 4c9ea1fd92..b025f59275 100644 > --- a/libavcodec/v4l2_m2m_enc.c > +++ b/libavcodec/v4l2_m2m_enc.c > @@ -345,6 +345,7 @@ AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \ > .wrapper_name = "v4l2m2m", \ > }; > > +M2MENC(mjpeg,"MJPEG", AV_CODEC_ID_MJPEG); > M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4); > M2MENC(h263, "H.263", AV_CODEC_ID_H263); > M2MENC(h264, "H.264", AV_CODEC_ID_H264); Since MJPEG is intra-only, it probably wants to avoid setting options like GOP size and B-frames (currently this gives me warnings for each of these options that it failed to set them, visible in log below). > Trying this on an Odroid XU4 (Exynos S5P running Linux 4.14.55), it looks like we need to somehow allow both "MJPG" and "JPEG" as fourccs. Reordering the two lines in libavcodec/v4l2_fmt.c to put "JPEG" first makes it get past that test, but obviously that will stop it from working on an "MJPG" device. So, for testing I used this patch: After getting past that, the decoder seems to hang for me pretty much immediately on a DQBUF call. Input from a UVC webcam (Logitech C920, making 640x480 YUV 4:2:2 JPEGs): $ gdb --args ./ffmpeg_g -y -v 55 -f v4l2 -format mjpeg -framerate 30 -video_size 640x480 -c:v mjpeg_v4l2m2m -i /dev/video0 -f null - ... [video4linux2,v4l2 @ 0x1a19140] All info found Input #0, video4linux2,v4l2, from '/dev/video0': Duration: N/A, start: 4490.517673, bitrate: N/A Stream #0:0, 1, 1/1000000: Video: mjpeg, 1 reference frame, yuvj422p(pc, bt470bg/unknown/unknown, center), 640x480, 0/1, 30 fps, 30 tbr, 1000k tbn, 1000k tbc Successfully opened the file. Parsing a group of options: output url -. Applying option f (force format) with argument null. Successfully parsed a group of options. Opening an output file: -. Successfully opened the file. [mjpeg_v4l2m2m @ 0x1a1a9d0] probing device /dev/video0 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 'uvcvideo' on card 'HD Pro Webcam C920' [mjpeg_v4l2m2m @ 0x1a1a9d0] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1a9d0] probing device /dev/video21 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 'exynos-gsc' on card 'exynos-gsc gscaler' [mjpeg_v4l2m2m @ 0x1a1a9d0] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1a9d0] probing device /dev/video20 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 'exynos-gsc' on card 'exynos-gsc gscaler' [mjpeg_v4l2m2m @ 0x1a1a9d0] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1a9d0] probing device /dev/video11 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 's5p-mfc' on card 's5p-mfc-enc' [mjpeg_v4l2m2m @ 0x1a1a9d0] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1a9d0] probing device /dev/video10 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 's5p-mfc' on card 's5p-mfc-dec' [mjpeg_v4l2m2m @ 0x1a1a9d0] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1a9d0] probing device /dev/video33 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 's5p-jpeg' on card 's5p-jpeg decoder' [mjpeg_v4l2m2m @ 0x1a1a9d0] Using device /dev/video33 [mjpeg_v4l2m2m @ 0x1a1a9d0] driver 's5p-jpeg' on card 's5p-jpeg decoder' [mjpeg_v4l2m2m @ 0x1a1a9d0] output : JPEG 01 buffers initialized: 0000x0000, sizeimage 00230528, bytesperline 00000000 Stream mapping: Stream #0:0 -> #0:0 (mjpeg (mjpeg_v4l2m2m) -> wrapped_avframe (native)) Press [q] to stop, [?] for help cur_dts is invalid (this is harmless if it occurs once at the start per stream) [mjpeg_v4l2m2m @ 0x1a1a9d0] capture: YUYV 01 buffers initialized: 0640x0480, sizeimage 00614400, bytesperline 00001280 [mjpeg_v4l2m2m @ 0x1a1a9d0] output changed (0x0) -> (640x480) [mjpeg_v4l2m2m @ 0x1a1a9d0] /dev/video33 full reinit [mjpeg_v4l2m2m @ 0x1a1a9d0] output : JPEG 01 buffers initialized: 0640x0480, sizeimage 00230528, bytesperline 00000000 cur_dts is invalid (this is harmless if it occurs once at the start per stream) Last message repeated 498 times [mjpeg_v4l2m2m @ 0x1a1a9d0] capture: YUYV 01 buffers initialized: 0640x0480, sizeimage 00614400, bytesperline 00001280 ... [graph 0 input from stream 0:0 @ 0x1a1fa90] Setting 'video_size' to value '640x480' [graph 0 input from stream 0:0 @ 0x1a1fa90] Setting 'pix_fmt' to value '1' [graph 0 input from stream 0:0 @ 0x1a1fa90] Setting 'time_base' to value '1/1000000' [graph 0 input from stream 0:0 @ 0x1a1fa90] Setting 'pixel_aspect' to value '0/1' [graph 0 input from stream 0:0 @ 0x1a1fa90] Setting 'sws_param' to value 'flags=2' [graph 0 input from stream 0:0 @ 0x1a1fa90] Setting 'frame_rate' to value '30/1' [graph 0 input from stream 0:0 @ 0x1a1fa90] w:640 h:480 pixfmt:yuyv422 tb:1/1000000 fr:30/1 sar:0/1 sws_param:flags=2 [AVFilterGraph @ 0x1a1c080] query_formats: 3 queried, 2 merged, 0 already done, 0 delayed Output #0, null, to 'pipe:': Metadata: encoder : Lavf58.17.101 Stream #0:0, 0, 1/30: Video: wrapped_avframe, 1 reference frame, yuyv422(center), 640x480, 0/1, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc Metadata: encoder : Lavc58.22.101 wrapped_avframe Thread 1 "ffmpeg_g" received signal SIGINT, Interrupt. 0xb5d05bf0 in poll () at ../sysdeps/unix/syscall-template.S:84 84 ../sysdeps/unix/syscall-template.S: No such file or directory. (gdb) bt #0 0xb5d05bf0 in poll () at ../sysdeps/unix/syscall-template.S:84 #1 0x00c45266 in v4l2_dequeue_v4l2buf (ctx=0x1a1e2c4, timeout=-1) at src/libavcodec/v4l2_context.c:283 #2 0x00c45b00 in ff_v4l2_context_dequeue_frame (ctx=0x1a1e2c4, frame=0x1a1cf90) at src/libavcodec/v4l2_context.c:583 #3 0x007a05da in v4l2_receive_frame (avctx=0x1a1a9d0, frame=0x1a1cf90) at src/libavcodec/v4l2_m2m_dec.c:160 #4 0x00466d20 in decode_receive_frame_internal (avctx=0x1a1a9d0, frame=0x1a1cf90) at src/libavcodec/decode.c:645 #5 0x00466ed4 in avcodec_send_packet (avctx=0x1a1a9d0, avpkt=0xbeffe930) at src/libavcodec/decode.c:709 #6 0x0002cf0e in decode (avctx=0x1a1a9d0, frame=0x1a1e7a0, got_frame=0xbeffea78, pkt=0xbeffe930) at src/fftools/ffmpeg.c:2238 #7 0x0002d4b2 in decode_video (ist=0x1a1f5a0, pkt=0xbeffea90, got_output=0xbeffea78, duration_pts=0xbeffea88, eof=0, decode_failed=0xbeffea80) at src/fftools/ffmpeg.c:2382 #8 0x0002dfb6 in process_input_packet (ist=0x1a1f5a0, pkt=0xbeffecb0, no_eof=0) at src/fftools/ffmpeg.c:2623 #9 0x00033e30 in process_input (file_index=0) at src/fftools/ffmpeg.c:4505 #10 0x00034256 in transcode_step () at src/fftools/ffmpeg.c:4625 #11 0x00034388 in transcode () at src/fftools/ffmpeg.c:4679 #12 0x00034a38 in main (argc=19, argv=0xbefff654) at src/fftools/ffmpeg.c:4886 (gdb) Input from a file (made with "./ffmpeg_g -y -f lavfi -i 'smptebars=size=640x480:rate=30' -an -pix_fmt yuvj420p -c:v mjpeg -frames:v 10 test.mp4"): $ gdb --args ./ffmpeg_g -v 55 -c:v mjpeg_v4l2m2m -i test.mp4 -f null - ... [mov,mp4,m4a,3gp,3g2,mj2 @ 0x1a19000] All info found [mov,mp4,m4a,3gp,3g2,mj2 @ 0x1a19000] After avformat_find_stream_info() pos: 5758 bytes read:66347 seeks:2 frames:1 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf58.17.101 Duration: 00:00:00.33, start: 0.000000, bitrate: 1363 kb/s Stream #0:0(und), 1, 1/15360: Video: mjpeg, 1 reference frame (mp4v / 0x7634706D), yuvj420p(pc, bt470bg/unknown/unknown, progressive, center), 640x480 [SAR 1:1 DAR 4:3], 0/1, 1345 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default) Metadata: handler_name : VideoHandler Successfully opened the file. Parsing a group of options: output url -. Applying option f (force format) with argument null. Successfully parsed a group of options. Opening an output file: -. Successfully opened the file. [mjpeg_v4l2m2m @ 0x1a1b220] probing device /dev/video0 [mjpeg_v4l2m2m @ 0x1a1b220] driver 'uvcvideo' on card 'HD Pro Webcam C920' [mjpeg_v4l2m2m @ 0x1a1b220] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1b220] probing device /dev/video21 [mjpeg_v4l2m2m @ 0x1a1b220] driver 'exynos-gsc' on card 'exynos-gsc gscaler' [mjpeg_v4l2m2m @ 0x1a1b220] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1b220] probing device /dev/video20 [mjpeg_v4l2m2m @ 0x1a1b220] driver 'exynos-gsc' on card 'exynos-gsc gscaler' [mjpeg_v4l2m2m @ 0x1a1b220] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1b220] probing device /dev/video11 [mjpeg_v4l2m2m @ 0x1a1b220] driver 's5p-mfc' on card 's5p-mfc-enc' [mjpeg_v4l2m2m @ 0x1a1b220] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1b220] probing device /dev/video10 [mjpeg_v4l2m2m @ 0x1a1b220] driver 's5p-mfc' on card 's5p-mfc-dec' [mjpeg_v4l2m2m @ 0x1a1b220] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a1b220] probing device /dev/video33 [mjpeg_v4l2m2m @ 0x1a1b220] driver 's5p-jpeg' on card 's5p-jpeg decoder' [mjpeg_v4l2m2m @ 0x1a1b220] Using device /dev/video33 [mjpeg_v4l2m2m @ 0x1a1b220] driver 's5p-jpeg' on card 's5p-jpeg decoder' [mjpeg_v4l2m2m @ 0x1a1b220] output : JPEG 01 buffers initialized: 0000x0000, sizeimage 00230528, bytesperline 00000000 Stream mapping: Stream #0:0 -> #0:0 (mjpeg (mjpeg_v4l2m2m) -> wrapped_avframe (native)) Press [q] to stop, [?] for help cur_dts is invalid (this is harmless if it occurs once at the start per stream) [mjpeg_v4l2m2m @ 0x1a1b220] capture: YUYV 01 buffers initialized: 0640x0480, sizeimage 00614400, bytesperline 00001280 [mjpeg_v4l2m2m @ 0x1a1b220] output changed (0x0) -> (640x480) [mjpeg_v4l2m2m @ 0x1a1b220] /dev/video33 full reinit [mjpeg_v4l2m2m @ 0x1a1b220] output : JPEG 01 buffers initialized: 0640x0480, sizeimage 00230528, bytesperline 00000000 cur_dts is invalid (this is harmless if it occurs once at the start per stream) [mjpeg_v4l2m2m @ 0x1a1b220] capture: YUYV 01 buffers initialized: 0640x0480, sizeimage 00614400, bytesperline 00001280 ... [graph 0 input from stream 0:0 @ 0x1a1fe10] Setting 'video_size' to value '640x480' [graph 0 input from stream 0:0 @ 0x1a1fe10] Setting 'pix_fmt' to value '1' [graph 0 input from stream 0:0 @ 0x1a1fe10] Setting 'time_base' to value '1/15360' [graph 0 input from stream 0:0 @ 0x1a1fe10] Setting 'pixel_aspect' to value '1/1' [graph 0 input from stream 0:0 @ 0x1a1fe10] Setting 'sws_param' to value 'flags=2' [graph 0 input from stream 0:0 @ 0x1a1fe10] Setting 'frame_rate' to value '30/1' [graph 0 input from stream 0:0 @ 0x1a1fe10] w:640 h:480 pixfmt:yuyv422 tb:1/15360 fr:30/1 sar:1/1 sws_param:flags=2 [AVFilterGraph @ 0x1a1ad50] query_formats: 3 queried, 2 merged, 0 already done, 0 delayed Output #0, null, to 'pipe:': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf58.17.101 Stream #0:0(und), 0, 1/30: Video: wrapped_avframe, 1 reference frame, yuyv422(center), 640x480 [SAR 1:1 DAR 4:3], 0/1, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc (default) Metadata: handler_name : VideoHandler encoder : Lavc58.22.101 wrapped_avframe Thread 1 "ffmpeg_g" received signal SIGINT, Interrupt. 0xb5d05bf0 in poll () at ../sysdeps/unix/syscall-template.S:84 84 ../sysdeps/unix/syscall-template.S: No such file or directory. (gdb) bt #0 0xb5d05bf0 in poll () at ../sysdeps/unix/syscall-template.S:84 #1 0x00c45266 in v4l2_dequeue_v4l2buf (ctx=0x1a1cd14, timeout=-1) at src/libavcodec/v4l2_context.c:283 #2 0x00c45b00 in ff_v4l2_context_dequeue_frame (ctx=0x1a1cd14, frame=0x1a1ba20) at src/libavcodec/v4l2_context.c:583 #3 0x007a05da in v4l2_receive_frame (avctx=0x1a1b220, frame=0x1a1ba20) at src/libavcodec/v4l2_m2m_dec.c:160 #4 0x00466d20 in decode_receive_frame_internal (avctx=0x1a1b220, frame=0x1a1ba20) at src/libavcodec/decode.c:645 #5 0x00466ed4 in avcodec_send_packet (avctx=0x1a1b220, avpkt=0xbeffe990) at src/libavcodec/decode.c:709 #6 0x0002cf0e in decode (avctx=0x1a1b220, frame=0x1a1d1f0, got_frame=0xbeffead8, pkt=0xbeffe990) at src/fftools/ffmpeg.c:2238 #7 0x0002d4b2 in decode_video (ist=0x1a1b090, pkt=0xbeffeaf0, got_output=0xbeffead8, duration_pts=0xbeffeae8, eof=0, decode_failed=0xbeffeae0) at src/fftools/ffmpeg.c:2382 #8 0x0002dfb6 in process_input_packet (ist=0x1a1b090, pkt=0xbeffed10, no_eof=0) at src/fftools/ffmpeg.c:2623 #9 0x00033e30 in process_input (file_index=0) at src/fftools/ffmpeg.c:4505 #10 0x00034256 in transcode_step () at src/fftools/ffmpeg.c:4625 #11 0x00034388 in transcode () at src/fftools/ffmpeg.c:4679 #12 0x00034a38 in main (argc=10, argv=0xbefff6b4) at src/fftools/ffmpeg.c:4886 (gdb) For the second run it looks suspicious that it's making a YUYV (4:2:2) output from a YUV420P (4:2:0) input file, but given that it fails in the same way as the first one I'm not sure that's actually relevant. Is there anything else I should be trying here? The encoder does work, but seems to have a similar problem where it hangs at end-of-file: $ gdb --args ./ffmpeg_g -y -v 55 -f lavfi -i 'smptebars=size=640x480:rate=30' -an -pix_fmt yuyv422 -c:v mjpeg_v4l2m2m -frames:v 10 out.mjpeg ... [lavfi @ 0x1a19050] All info found Input #0, lavfi, from 'smptebars=size=640x480:rate=30': Duration: N/A, start: 0.000000, bitrate: N/A Stream #0:0, 1, 1/30: Video: rawvideo, 1 reference frame (I420 / 0x30323449), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 0/1, 30 tbr, 30 tbn, 30 tbc Successfully opened the file. Parsing a group of options: output url out.mjpeg. Applying option an (disable audio) with argument 1. Applying option pix_fmt (set pixel format) with argument yuyv422. Applying option c:v (codec name) with argument mjpeg_v4l2m2m. Applying option frames:v (set the number of frames to output) with argument 10. Successfully parsed a group of options. Opening an output file: out.mjpeg. [file @ 0x1a43840] Setting default whitelist 'file,crypto' Successfully opened the file. Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> mjpeg (mjpeg_v4l2m2m)) Press [q] to stop, [?] for help cur_dts is invalid (this is harmless if it occurs once at the start per stream) [rawvideo @ 0x1a41c80] PACKET SIZE: 460800, STRIDE: 960 ... [graph 0 input from stream 0:0 @ 0x1a45210] Setting 'video_size' to value '640x480' [graph 0 input from stream 0:0 @ 0x1a45210] Setting 'pix_fmt' to value '0' [graph 0 input from stream 0:0 @ 0x1a45210] Setting 'time_base' to value '1/30' [graph 0 input from stream 0:0 @ 0x1a45210] Setting 'pixel_aspect' to value '1/1' [graph 0 input from stream 0:0 @ 0x1a45210] Setting 'sws_param' to value 'flags=2' [graph 0 input from stream 0:0 @ 0x1a45210] Setting 'frame_rate' to value '30/1' [graph 0 input from stream 0:0 @ 0x1a45210] w:640 h:480 pixfmt:yuv420p tb:1/30 fr:30/1 sar:1/1 sws_param:flags=2 [format @ 0x1a45890] Setting 'pix_fmts' to value 'yuyv422' [auto_scaler_0 @ 0x1a45a80] Setting 'flags' to value 'bicubic' [auto_scaler_0 @ 0x1a45a80] w:iw h:ih flags:'bicubic' interl:0 [format @ 0x1a45890] auto-inserting filter 'auto_scaler_0' between the filter 'Parsed_null_0' and the filter 'format' [AVFilterGraph @ 0x1a448f0] query_formats: 4 queried, 2 merged, 1 already done, 0 delayed [auto_scaler_0 @ 0x1a45a80] w:640 h:480 fmt:yuv420p sar:1/1 -> w:640 h:480 fmt:yuyv422 sar:1/1 flags:0x4 [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video0 [mjpeg_v4l2m2m @ 0x1a42f70] driver 'uvcvideo' on card 'HD Pro Webcam C920' [mjpeg_v4l2m2m @ 0x1a42f70] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video21 [mjpeg_v4l2m2m @ 0x1a42f70] driver 'exynos-gsc' on card 'exynos-gsc gscaler' [mjpeg_v4l2m2m @ 0x1a42f70] v4l2 capture format not supported [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video20 [mjpeg_v4l2m2m @ 0x1a42f70] driver 'exynos-gsc' on card 'exynos-gsc gscaler' [mjpeg_v4l2m2m @ 0x1a42f70] v4l2 capture format not supported [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video11 [mjpeg_v4l2m2m @ 0x1a42f70] driver 's5p-mfc' on card 's5p-mfc-enc' [mjpeg_v4l2m2m @ 0x1a42f70] v4l2 capture format not supported [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video10 [mjpeg_v4l2m2m @ 0x1a42f70] driver 's5p-mfc' on card 's5p-mfc-dec' [mjpeg_v4l2m2m @ 0x1a42f70] v4l2 output format not supported [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video33 [mjpeg_v4l2m2m @ 0x1a42f70] driver 's5p-jpeg' on card 's5p-jpeg decoder' [mjpeg_v4l2m2m @ 0x1a42f70] v4l2 capture format not supported [mjpeg_v4l2m2m @ 0x1a42f70] probing device /dev/video32 [mjpeg_v4l2m2m @ 0x1a42f70] driver 's5p-jpeg' on card 's5p-jpeg encoder' [mjpeg_v4l2m2m @ 0x1a42f70] Using device /dev/video32 [mjpeg_v4l2m2m @ 0x1a42f70] driver 's5p-jpeg' on card 's5p-jpeg encoder' [mjpeg_v4l2m2m @ 0x1a42f70] output : YUYV 16 buffers initialized: 0640x0480, sizeimage 00614400, bytesperline 00001280 [mjpeg_v4l2m2m @ 0x1a42f70] capture: JPEG 04 buffers initialized: 0640x0480, sizeimage 00233472, bytesperline 00000000 [mjpeg_v4l2m2m @ 0x1a42f70] Failed to set number of B-frames Last message repeated 1 times [mjpeg_v4l2m2m @ 0x1a42f70] Failed to set timeperframeFailed to set header mode [mjpeg_v4l2m2m @ 0x1a42f70] Failed to set bit rate [mjpeg_v4l2m2m @ 0x1a42f70] Failed to set gop size [mjpeg_v4l2m2m @ 0x1a42f70] Encoder Context: id (7), profile (-99), frame rate(30/1), number b-frames (0), gop size (12), bit rate (200000), qmin (2), qmax (31) Output #0, mjpeg, to 'out.mjpeg': Metadata: encoder : Lavf58.17.101 Stream #0:0, 0, 1/30: Video: mjpeg (mjpeg_v4l2m2m), 1 reference frame, yuyv422, 640x480 [SAR 1:1 DAR 4:3], 0/1, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc Metadata: encoder : Lavc58.22.101 mjpeg_v4l2m2m Clipping frame in rate conversion by 0.000008 [rawvideo @ 0x1a41c80] PACKET SIZE: 460800, STRIDE: 960 Last message repeated 3 times [rawvideo @ 0x1a41c80] PACKET SIZE: 460800, STRIDE: 9600.16 bitrate=3769.2kbits/s speed=0.299x Last message repeated 4 times No more output streams to write to, finishing. Thread 1 "ffmpeg_g" received signal SIGINT, Interrupt. 0xb5d05bf0 in poll () at ../sysdeps/unix/syscall-template.S:84 84 ../sysdeps/unix/syscall-template.S: No such file or directory. (gdb) bt #0 0xb5d05bf0 in poll () at ../sysdeps/unix/syscall-template.S:84 #1 0x00c45266 in v4l2_dequeue_v4l2buf (ctx=0x1a64834, timeout=-1) at src/libavcodec/v4l2_context.c:283 #2 0x00c45b4c in ff_v4l2_context_dequeue_packet (ctx=0x1a64834, pkt=0xbeffeef8) at src/libavcodec/v4l2_context.c:603 #3 0x007a0dd2 in v4l2_receive_packet (avctx=0x1a42f70, avpkt=0xbeffeef8) at src/libavcodec/v4l2_m2m_enc.c:278 #4 0x004a50fa in avcodec_receive_packet (avctx=0x1a42f70, avpkt=0xbeffeef8) at src/libavcodec/encode.c:430 #5 0x0002c260 in flush_encoders () at src/fftools/ffmpeg.c:1938 #6 0x0003444e in transcode () at src/fftools/ffmpeg.c:4699 #7 0x00034a38 in main (argc=16, argv=0xbefff654) at src/fftools/ffmpeg.c:4886 (gdb) The output file is correct here, though it's truncated because libavformat doesn't get an opportunity to finish it. (I had to give it a YUYV input explicitly - the output is messed up with another input format, but I don't think that's related to this patch.) Thanks, - Mark diff --git a/libavcodec/v4l2_fmt.c b/libavcodec/v4l2_fmt.c index 6df47e3..06b57db 100644 --- a/libavcodec/v4l2_fmt.c +++ b/libavcodec/v4l2_fmt.c @@ -51,8 +51,8 @@ static const struct fmt_conversion { { AV_FMT(YUV410P), AV_CODEC(RAWVIDEO), V4L2_FMT(YUV410) }, { AV_FMT(YUV410P), AV_CODEC(RAWVIDEO), V4L2_FMT(YVU410) }, { AV_FMT(NV12), AV_CODEC(RAWVIDEO), V4L2_FMT(NV12) }, - { AV_FMT(NONE), AV_CODEC(MJPEG), V4L2_FMT(MJPEG) }, { AV_FMT(NONE), AV_CODEC(MJPEG), V4L2_FMT(JPEG) }, + { AV_FMT(NONE), AV_CODEC(MJPEG), V4L2_FMT(MJPEG) }, #ifdef V4L2_PIX_FMT_SRGGB8 { AV_FMT(BAYER_BGGR8), AV_CODEC(RAWVIDEO), V4L2_FMT(SBGGR8) }, { AV_FMT(BAYER_GBRG8), AV_CODEC(RAWVIDEO), V4L2_FMT(SGBRG8) },