Opened 5 years ago
Closed 5 years ago
#8049 closed defect (fixed)
dash muxer does not specify full codec string parameters for AV1
Reported by: | Brion Vibber | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avformat |
Version: | git-master | Keywords: | av1 dash |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | yes | |
Analyzed by developer: | yes |
Description
Summary of the bug:
When using the dash muxer to produce DASH output containing an AV1 video stream, the codec string is listed only as "av01" without the full parameters, such as "av01.0.04M.08".
This results in failure to play in Chrome, where MediaSource.isTypeSupported('video/mp4; codecs="av01"') without those parameters returns false.
The parameters should be extracted from the extradata per https://aomediacodec.github.io/av1-isobmff/#codecsparam
How to reproduce:
% $ ffmpeg -t 1 -i crowd_run_1080p50.y4m -s 640x360 -strict -2 -c:v libaom-av1 -cpu-used 8 -tile-columns 2 -g 50 -keyint_min 50 -f dash foo.mpd ffmpeg version 4.1.4 Copyright (c) 2000-2019 the FFmpeg developers built with Apple LLVM version 10.0.1 (clang-1001.0.46.4) configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1.4_1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr libavutil 56. 22.100 / 56. 22.100 libavcodec 58. 35.100 / 58. 35.100 libavformat 58. 20.100 / 58. 20.100 libavdevice 58. 5.100 / 58. 5.100 libavfilter 7. 40.101 / 7. 40.101 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 3.100 / 5. 3.100 libswresample 3. 3.100 / 3. 3.100 libpostproc 55. 3.100 / 55. 3.100 Input #0, yuv4mpegpipe, from 'crowd_run_1080p50.y4m': Duration: 00:00:10.00, start: 0.000000, bitrate: 1244162 kb/s Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 1920x1080, SAR 1:1 DAR 16:9, 50 fps, 50 tbr, 50 tbn, 50 tbc Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> av1 (libaom-av1)) Press [q] to stop, [?] for help [libaom-av1 @ 0x7fb83f002a00] 1.0.0 [dash @ 0x7fb83f012a00] Opening 'init-stream0.m4s' for writing Output #0, dash, to 'foo.mpd': Metadata: encoder : Lavf58.20.100 Stream #0:0: Video: av1 (libaom-av1), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 200 kb/s, 50 fps, 12800 tbn, 50 tbc Metadata: encoder : Lavc58.35.100 libaom-av1 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 [dash @ 0x7fb83f012a00] Opening 'chunk-stream0-00001.m4s.tmp' for writing [dash @ 0x7fb83f012a00] Opening 'foo.mpd.tmp' for writingate=N/A speed=0.0205x frame= 50 fps=1.0 q=-0.0 Lsize=N/A time=00:00:00.98 bitrate=N/A speed=0.02x video:88kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown % $ cat foo.mpd <?xml version="1.0" encoding="utf-8"?> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT1.0S" minBufferTime="PT2.0S"> <ProgramInformation> </ProgramInformation> <Period id="0" start="PT0.0S"> <AdaptationSet id="0" contentType="video" segmentAlignment="true" bitstreamSwitching="true"> <Representation id="0" mimeType="video/mp4" codecs="av01" bandwidth="200000" width="640" height="360" frameRate="50/1"> <SegmentTemplate timescale="12800" initialization="init-stream$RepresentationID$.m4s" media="chunk-stream$RepresentationID$-$Number%05d$.m4s" startNumber="1"> <SegmentTimeline> <S t="0" d="12800" /> </SegmentTimeline> </SegmentTemplate> </Representation> </AdaptationSet> </Period> </MPD>
Change History (4)
comment:1 by , 5 years ago
Keywords: | av1,dash → av1 dash |
---|---|
Priority: | normal → minor |
comment:2 by , 5 years ago
Analyzed by developer: | set |
---|---|
Component: | undetermined → avformat |
Priority: | minor → normal |
Reproduced by developer: | set |
Status: | new → open |
Version: | unspecified → git-master |
The dash muxer is effectively not setting the codec string with the minimum required values beyond the sample entry 4CC.
Unfortunately, even if we were to make the muxer look at the stream's extradata to get the required information, the libaom encoder is currently not propagating said extradata to begin with because of a known bug[1] in their API that hasn't been fixed in almost a year now. It would work only in remuxing scenarios until that's solved.
[1] https://bugs.chromium.org/p/aomedia/issues/detail?id=2208
comment:4 by , 5 years ago
Resolution: | → fixed |
---|---|
Status: | open → closed |
Turns out the dash muxer can use extradata propagated late during the muxing process. It just wasn't looking at the correct place for it.
Fixed that in ce6a98e8306105b07bd7653f4f10c23fd75914ee, and the codec string for AV1 streams in 1cf2f040e34bbfedde60ff3d91b2f7b770aca85b.
Is this issue reproducible with current FFmpeg git head?