[FFmpeg-devel] [PATCH] avcodec: v4l2_m2m: add MJPEG enc/dec support

Mark Thompson sw at jkqxz.net
Sun Aug 12 20:24:44 EEST 2018


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 <maxi.jourdan at wanadoo.fr>
> ---
>  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:

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) },


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


More information about the ffmpeg-devel mailing list