FranceBB
7th May 2021, 08:37
Hi there,
I've received some Slog3 HDR H.264 4:2:2 10bit planar FULL HD masterfiles with IPCM audio muxed in MP4.
https://i.imgur.com/dJyC16v.png
IPCM is essentially a way of transporting a pcm_s24be (PCM signed 24-bit big-endian), so, technically speaking, it shouldn't be a big deal, however that's not the case.
By default, LWLibavAudioSource and FFAudioSource fail to decode it, in fact:
video=LWLibavVideoSource("Z:\IPCM_Sample.MP4")
audio=LWLibavAudioSource("Z:\IPCM_Sample.MP4")
AudioDub(video, audio)
outputs: LWLibavAudioSource failed to get audio track
and
video=FFVideoSource("Z:\IPCM_Sample.MP4")
audio=FFAudioSource("Z:\IPCM_Sample.MP4")
AudioDub(video, audio)
outputs: FFAudioSource audio codec not found
The expected behavior would be to decode IPCM as pcm_s24be (PCM signed 24-bit big-endian) but instead they both failed.
I turned to FFMpeg and to my surprise it also failed.
ffmpeg.exe -i %1 -acodec pcm_s24le -ar 48000 -ac 2 -y out1.wav
Error - Decoder (codec none) not found for input stream #0:1
The full logs are:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Z:\IPCM_Sample.MP4':
Metadata:
major_brand : XAVC
minor_version : 17440767
compatible_brands: XAVCmp42iso2
creation_time : 2021-05-04T04:54:00.000000Z
Duration: 00:00:10.08, start: 0.000000, bitrate: 80002 kb/s
Stream #0:0(und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(pc), 1920x1080 [SAR 1:1 DAR 16:9], 46772 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(und): Audio: none (ipcm / 0x6D637069), 48000 Hz, stereo (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
Stream #0:2(und): Data: none (rtmd / 0x646D7472), 4505 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Timed Metadata Media Handler
timecode : 01:24:55:10
Stream mapping:
Stream #0:1 -> #0:0 (? (?) -> pcm_s24le (native))
Decoder (codec none) not found for input stream #0:1
ffmpeg version 2021-05-05-git-7c451b609c
built on 05/05/2021 12:29 PM UTC+01:00
Actual workaround: manually setting the decoder to pcm_s24be PCM signed 24-bit big-endian makes it possible to decode the file correctly.
So this:
ffmpeg.exe -c:a pcm_s24be -i %1 -acodec pcm_s24le -ar 48000 -ac 2 -y out1.wav
works just fine:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Z:\IPCM_Sample.MP4':
Metadata:
major_brand : XAVC
minor_version : 17440767
compatible_brands: XAVCmp42iso2
creation_time : 2021-05-04T04:54:00.000000Z
Duration: 00:00:10.08, start: 0.000000, bitrate: 80002 kb/s
Stream #0:0(und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(pc), 1920x1080 [SAR 1:1 DAR 16:9], 46772 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(und): Audio: pcm_s24be (ipcm / 0x6D637069), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
Stream #0:2(und): Data: none (rtmd / 0x646D7472), 4505 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Timed Metadata Media Handler
timecode : 01:24:55:10
Stream mapping:
Stream #0:1 -> #0:0 (pcm_s24be (native) -> pcm_s24le (native))
Press [q] to stop, [?] for help
Output #0, wav, to 'out1.wav':
Metadata:
major_brand : XAVC
minor_version : 17440767
compatible_brands: XAVCmp42iso2
ISFT : Lavf58.65.101
Stream #0:0(und): Audio: pcm_s24le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
encoder : Lavc58.119.100 pcm_s24le
size= 2835kB time=00:00:10.06 bitrate=2306.5kbits/s speed= 196x
video:0kB audio:2835kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.003514%
IPCM Sample: https://we.tl/t-UkEK5c94if
Decoded and re-encoded to PCM 24bit little endian audio: https://we.tl/t-4yTKInyzmt
After opening the bugs on both the LSMASH Works (https://github.com/HolyWu/L-SMASH-Works/issues/20) and FFMS2 (https://github.com/FFMS/ffms2/issues/381) GitHub repositories, I headed to the FFMpeg bug tracker (https://trac.ffmpeg.org/ticket/9219) in which I opened a ticket (https://trac.ffmpeg.org/ticket/9219)to report the bug...
I've already made a BAT to work around this but I wanted to share awareness if you receive an IPCM file so now you know what to do instead of wondering how you could decode it like I did for a few hours yesterday.
Hopefully it will be fixed in FFMpeg avformat and, as a consequence, in LWLibav and FFAudio as well and this little "guide" won't be needed anymore, but for the time being I hope it's gonna help.
Cheers,
Frank
I've received some Slog3 HDR H.264 4:2:2 10bit planar FULL HD masterfiles with IPCM audio muxed in MP4.
https://i.imgur.com/dJyC16v.png
IPCM is essentially a way of transporting a pcm_s24be (PCM signed 24-bit big-endian), so, technically speaking, it shouldn't be a big deal, however that's not the case.
By default, LWLibavAudioSource and FFAudioSource fail to decode it, in fact:
video=LWLibavVideoSource("Z:\IPCM_Sample.MP4")
audio=LWLibavAudioSource("Z:\IPCM_Sample.MP4")
AudioDub(video, audio)
outputs: LWLibavAudioSource failed to get audio track
and
video=FFVideoSource("Z:\IPCM_Sample.MP4")
audio=FFAudioSource("Z:\IPCM_Sample.MP4")
AudioDub(video, audio)
outputs: FFAudioSource audio codec not found
The expected behavior would be to decode IPCM as pcm_s24be (PCM signed 24-bit big-endian) but instead they both failed.
I turned to FFMpeg and to my surprise it also failed.
ffmpeg.exe -i %1 -acodec pcm_s24le -ar 48000 -ac 2 -y out1.wav
Error - Decoder (codec none) not found for input stream #0:1
The full logs are:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Z:\IPCM_Sample.MP4':
Metadata:
major_brand : XAVC
minor_version : 17440767
compatible_brands: XAVCmp42iso2
creation_time : 2021-05-04T04:54:00.000000Z
Duration: 00:00:10.08, start: 0.000000, bitrate: 80002 kb/s
Stream #0:0(und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(pc), 1920x1080 [SAR 1:1 DAR 16:9], 46772 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(und): Audio: none (ipcm / 0x6D637069), 48000 Hz, stereo (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
Stream #0:2(und): Data: none (rtmd / 0x646D7472), 4505 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Timed Metadata Media Handler
timecode : 01:24:55:10
Stream mapping:
Stream #0:1 -> #0:0 (? (?) -> pcm_s24le (native))
Decoder (codec none) not found for input stream #0:1
ffmpeg version 2021-05-05-git-7c451b609c
built on 05/05/2021 12:29 PM UTC+01:00
Actual workaround: manually setting the decoder to pcm_s24be PCM signed 24-bit big-endian makes it possible to decode the file correctly.
So this:
ffmpeg.exe -c:a pcm_s24be -i %1 -acodec pcm_s24le -ar 48000 -ac 2 -y out1.wav
works just fine:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Z:\IPCM_Sample.MP4':
Metadata:
major_brand : XAVC
minor_version : 17440767
compatible_brands: XAVCmp42iso2
creation_time : 2021-05-04T04:54:00.000000Z
Duration: 00:00:10.08, start: 0.000000, bitrate: 80002 kb/s
Stream #0:0(und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(pc), 1920x1080 [SAR 1:1 DAR 16:9], 46772 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1(und): Audio: pcm_s24be (ipcm / 0x6D637069), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
Stream #0:2(und): Data: none (rtmd / 0x646D7472), 4505 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Timed Metadata Media Handler
timecode : 01:24:55:10
Stream mapping:
Stream #0:1 -> #0:0 (pcm_s24be (native) -> pcm_s24le (native))
Press [q] to stop, [?] for help
Output #0, wav, to 'out1.wav':
Metadata:
major_brand : XAVC
minor_version : 17440767
compatible_brands: XAVCmp42iso2
ISFT : Lavf58.65.101
Stream #0:0(und): Audio: pcm_s24le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s (default)
Metadata:
creation_time : 2021-05-04T04:54:00.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
encoder : Lavc58.119.100 pcm_s24le
size= 2835kB time=00:00:10.06 bitrate=2306.5kbits/s speed= 196x
video:0kB audio:2835kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.003514%
IPCM Sample: https://we.tl/t-UkEK5c94if
Decoded and re-encoded to PCM 24bit little endian audio: https://we.tl/t-4yTKInyzmt
After opening the bugs on both the LSMASH Works (https://github.com/HolyWu/L-SMASH-Works/issues/20) and FFMS2 (https://github.com/FFMS/ffms2/issues/381) GitHub repositories, I headed to the FFMpeg bug tracker (https://trac.ffmpeg.org/ticket/9219) in which I opened a ticket (https://trac.ffmpeg.org/ticket/9219)to report the bug...
I've already made a BAT to work around this but I wanted to share awareness if you receive an IPCM file so now you know what to do instead of wondering how you could decode it like I did for a few hours yesterday.
Hopefully it will be fixed in FFMpeg avformat and, as a consequence, in LWLibav and FFAudio as well and this little "guide" won't be needed anymore, but for the time being I hope it's gonna help.
Cheers,
Frank