Opened 5 years ago

Closed 3 years ago

#4231 closed defect (invalid)

cannot produce .y4m files for use in the Chrome browser

Reported by: nha Owned by:
Priority: normal Component: avformat
Version: git-master Keywords: y4m
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description (last modified by cehoyos)

Summary of the bug

cannot produce .y4m files for use in the Chrome browser.

I am trying to convert .mp4 files to .y4m files for use with Chrome as described at https://code.google.com/p/chromium/issues/detail?id=318797.

How to reproduce

I have a set of .y4m files that are working for my use case, taken from http://media.xiph.org/video/derf/y4m/?C=N;O=A. I made the following tests tpecifically with the file http://media.xiph.org/video/derf/y4m/mobile_qcif_7.5fps.y4m.

I also have a .mp4 file (http://techslides.com/demos/sample-videos/small.mp4 file from http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5). I convert small.mp4 to small.y4m using :

ffmpeg -y -i small.mp4 does_not_play_in_chrome.y4m

I also tried (same end result) :

  • ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -y does_not_play_in_chrome.y4m
  • ffmpeg -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -pix_fmt yuv420p -y does_not_play_in_chrome.y4m

To test it, start chrome with the flags --use-file-for-fake-video-capture=does_not_play_in_chrome.y4m --use-fake-device-for-media-stream , and trigger a media access (ex. by accessing https://apprtc.appspot.com/).

Desired result

I would like the resulting file to be accepted by Chrome.
Note that does_not_play_in_chrome.y4m plays fine on VLC.

So

$ head -c 100 does_not_play_in_chrome.y4m 
YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420mpeg2 XYSCSS=420MPEG2
FRAME
9999999999999999999999999999999999

should probably be :

$ head -c 100 does_play_in_chrome.y4m 
YUV4MPEG2 W560 H320 F15:2 Ip A0:0 C420 XYSCSS=420MPEG2
FRAME
9999999999999999999999999999999999

Additionnal information

$ ffmpeg version N-68884-g3ebd76a Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan  6 2015 11:03:21 with gcc 4.8 (Ubuntu/Linaro 4.8.1-10ubuntu9)
  configuration: 
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 19.100 / 56. 19.100
  libavformat    56. 18.100 / 56. 18.100
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  6.100 /  5.  6.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100


Full command output

$ ffmpeg  -v 9 -loglevel 99 -i small.mp4 -vf fps=7.5 -an -c:v rawvideo -f yuv4mpegpipe -y does_not_play_in_chrome.y4m
ffmpeg version N-68884-g3ebd76a Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan  6 2015 11:03:21 with gcc 4.8 (Ubuntu/Linaro 4.8.1-10ubuntu9)
  configuration: 
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 19.100 / 56. 19.100
  libavformat    56. 18.100 / 56. 18.100
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  6.100 /  5.  6.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
Splitting the commandline.
Reading option '-v' ... matched as option 'v' (set logging level) with argument '9'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument '99'.
Reading option '-i' ... matched as input file with argument 'small.mp4'.
Reading option '-vf' ... matched as option 'vf' (set video filters) with argument 'fps=7.5'.
Reading option '-an' ... matched as option 'an' (disable audio) with argument '1'.
Reading option '-c:v' ... matched as option 'c' (codec name) with argument 'rawvideo'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'yuv4mpegpipe'.
Reading option '-y' ... matched as option 'y' (overwrite output files) with argument '1'.
Reading option 'does_not_play_in_chrome.y4m' ... matched as output file.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option v (set logging level) with argument 9.
Applying option y (overwrite output files) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input file small.mp4.
Successfully parsed a group of options.
Opening an input file: small.mp4.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x30f31c0] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x30f31c0] ISO: File Type Major Brand: mp42
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x30f31c0] overread end of atom 'colr' by 1 bytes
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x30f31c0] Before avformat_find_stream_info() pos: 383523 bytes read:36359 seeks:1
[aac @ 0x30f92c0] skip whole frame, skip left: 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x30f31c0] All info found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x30f31c0] After avformat_find_stream_info() pos: 28292 bytes read:69127 seeks:2 frames:5
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'small.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2010-03-20 21:29:11
    encoder         : HandBrake 0.9.4 2009112300
  Duration: 00:00:05.57, start: 0.000000, bitrate: 551 kb/s
    Stream #0:0(und), 4, 1/90000: Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709, left), 560x320, 1/60, 465 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2010-03-20 21:29:11
      encoder         : JVT/AVC Coding
    Stream #0:1(eng), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 83 kb/s (default)
    Metadata:
      creation_time   : 2010-03-20 21:29:11
Successfully opened the file.
Parsing a group of options: output file does_not_play_in_chrome.y4m.
Applying option vf (set video filters) with argument fps=7.5.
Applying option an (disable audio) with argument 1.
Applying option c:v (codec name) with argument rawvideo.
Applying option f (force format) with argument yuv4mpegpipe.
Successfully parsed a group of options.
Opening an output file: does_not_play_in_chrome.y4m.
Successfully opened the file.
detected 2 logical cores
[Parsed_fps_0 @ 0x30f30a0] Setting 'fps' to value '7.5'
[Parsed_fps_0 @ 0x30f30a0] fps=15/2
[graph 0 input from stream 0:0 @ 0x30e8920] Setting 'video_size' to value '560x320'
[graph 0 input from stream 0:0 @ 0x30e8920] Setting 'pix_fmt' to value '0'
[graph 0 input from stream 0:0 @ 0x30e8920] Setting 'time_base' to value '1/90000'
[graph 0 input from stream 0:0 @ 0x30e8920] Setting 'pixel_aspect' to value '0/1'
[graph 0 input from stream 0:0 @ 0x30e8920] Setting 'sws_param' to value 'flags=2'
[graph 0 input from stream 0:0 @ 0x30e8920] Setting 'frame_rate' to value '30/1'
[graph 0 input from stream 0:0 @ 0x30e8920] w:560 h:320 pixfmt:yuv420p tb:1/90000 fr:30/1 sar:0/1 sws_param:flags=2
[AVFilterGraph @ 0x30e8760] query_formats: 3 queried, 2 merged, 0 already done, 0 delayed
Output #0, yuv4mpegpipe, to 'does_not_play_in_chrome.y4m':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    encoder         : Lavf56.18.100
    Stream #0:0(und), 0, 2/15: Video: rawvideo (I420 / 0x30323449), yuv420p(left), 560x320, 2/15, q=2-31, 200 kb/s, 7.50 fps, 7.50 tbn, 7.50 tbc (default)
    Metadata:
      creation_time   : 2010-03-20 21:29:11
      encoder         : Lavc56.19.100 rawvideo
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
[Parsed_fps_0 @ 0x30f30a0] Dropping 1 frame(s).
[yuv4mpegpipe @ 0x30fac80] Encoder did not produce proper pts, making some up.
[Parsed_fps_0 @ 0x30f30a0] Dropping 1 frame(s).
    Last message repeated 122 times
[output stream 0:0 @ 0x30dea80] EOF on sink link output stream 0:0:default.
No more output streams to write to, finishing.
frame=   42 fps=0.0 q=0.0 Lsize=   11025kB time=00:00:05.60 bitrate=16128.4kbits/s    
video:4kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 279907.750000%
Input file #0 (small.mp4):
  Input stream #0:0 (video): 166 packets read (322069 bytes); 166 frames decoded; 
  Input stream #0:1 (audio): 1 packets read (247 bytes); 
  Total: 167 packets (322316 bytes) demuxed
Output file #0 (does_not_play_in_chrome.y4m):
  Output stream #0:0 (video): 0 frames encoded; 42 packets muxed (4032 bytes); 
  Total: 42 packets (4032 bytes) muxed
168 frames successfully decoded, 0 decoding errors
[Parsed_fps_0 @ 0x30f30a0] 166 frames in, 42 frames out; 124 frames dropped, 0 frames duplicated.
[AVIOContext @ 0x30fb6c0] Statistics: 0 seeks, 378 writeouts
[AVIOContext @ 0x30f2b20] Statistics: 419822 bytes read, 2 seeks

Change History (3)

comment:2 Changed 3 years ago by richardpl

  • Description modified (diff)

Is this still reproducible?

comment:3 Changed 3 years ago by cehoyos

  • Component changed from ffmpeg to avformat
  • Description modified (diff)
  • Resolution set to invalid
  • Status changed from new to closed

If it is still reproducible it is a missing feature in Chrome, C420mpeg2 was added a decade ago.

$ yuv4mpeg -x help
yuv4mpeg -x usage: Only the 3 plane formats are actually supported
        420jpeg - 4:2:0 JPEG/MPEG-1 (interstitial)
        420mpeg2 - 4:2:0 MPEG-2 (horiz. cositing)
        420paldv - 4:2:0 PAL-DV (altern. siting)
        444 - 4:4:4 (no subsampling)
        422 - 4:2:2 (horiz. cositing)
        411 - 4:1:1 (horiz. cositing)
        mono - luma plane only
        444alpha - 4:4:4 with alpha channel
Note: See TracTickets for help on using tickets.