Re: Identifying MPEG-4 HE-AAC (LATM, LAOS) audio formats
schorpp <[email protected]> Mon, 30 Dec 2024 12:21:18 +0100
| Newsgroups | gmane.linux.vdr |
|---|---|
| Message-ID | <[email protected]> |
Am 30.12.24 um 11:26 schrieb Marko Mäkelä:
> Tue, Dec 10, 2024 at 04:13:21AM +0100, schorpp wrote:
>> Get a 4B at no cost. h.265 h/w decoding supported (at least with
>> libreelec).
>
> Thanks, I already got a Pi 4, but luckily rpihddevice on the Raspberry
> Pi 2 or 3 is sufficient for my needs (the DVB-T2 here only uses H.264).
> My only "production" VDR setup is on the Pi 2; I have a spare setup with
> a Pi 3, but without an MPEG-2 decoding license that would be necessary
> for watching DVB-T recordings. I have been waiting if the requirement to
> buy a license key for the VideoCore 4 firmware would disappear in 2025,
> when the patents will have expired in all jurisdictions.
What? Your PI3/2 software decoders are too slow for h.262 (MPEG2) but
fast enough for h.264 needing ~ x4 cpu/fpu power?
>
>> I've a huge archive of dvd backups here, aac 5.1 sample is attached.
>
> Thank you. I renamed the file to 00001.ts within a directory name that
> VDR recognizes. As expected, there was no audio (or video) output
> whatsoever from VDR+rpihddevice. In Totem, the audio played fine via the
> built-in 2 speakers on my laptop.
Same here with xineliboutput media player, no audio from AAC 5.1 MP4 files.
Latest yt-dlp extracted AAC 2.0 and LATM dvb-c radio broadcasters play fine.
Lyngsat claims HE-AAC, femon plugin says LATM.
https://www.lyngsat.com/muxes/Astra-1M_Europe_10891-H.html
>
> I finally spent some time debugging mediainfo and ffprobe on the 5.1
> channel audio sample that you provided. The mediainfo/libmediainfo code
> base is written in what I would call stereotypical "bloatware C++". Lots
> of objects (including wchar_t strings) are being created, copied, and
> destroyed, which makes it very hard to follow the data flow.
Try an UML Modeling C++ reverse engineering app like e.g. Rational Rose
or Umbrella (Linux) successors.
>
> With "rr record ffprobe 00001.ts" and "rr replay", I got closer to
> determining where the audio format is actually being parsed. It took a
> few distinct data watchpoints ("watch -l") and "reverse-continue",
> because the metadata was being copied a few times:
>
> Hardware watchpoint 5: -location ac->oc[1].ch_layout.nb_channels
>
> Old value = 0x6
> New value = 0x0
> 0x00007fe048c2bb30 in av_channel_layout_from_mask () from /lib/x86_64-
> linux-gnu/libavutil.so.59
> (rr) bt
> #0 0x00007fe048c2bb30 in av_channel_layout_from_mask () from /lib/
> x86_64-linux-gnu/libavutil.so.59
> #1 0x00007fe049e87c5e in ff_aac_output_configure
> (ac=ac@entry=0x55841cc02a00, layout_map=layout_map@entry=0x7fff1e8604e0,
> tags=<optimized out>, oc_type=oc_type@entry=OC_GLOBAL_HDR,
> get_new_frame=get_new_frame@entry=0x0) at src/libavcodec/aac/aacdec.c:508
> #2 0x00007fe049f0b115 in decode_ga_specific_config
> (ac=ac@entry=0x55841cc02a00, avctx=avctx@entry=0x55841cbf2fc0,
> gb=gb@entry=0x7fff1e860850,
> get_bit_alignment=get_bit_alignment@entry=0x0,
> m4ac=m4ac@entry=0x55841cc081d8, channel_config=<optimized out>) at src/
> libavcodec/aac/aacdec.c:890
> #3 0x00007fe049f0bce6 in decode_audio_specific_config_gb
> (ac=0x55841cc02a00, avctx=0x55841cbf2fc0, oc=0x55841cc081d8,
> gb=0x7fff1e860850, get_bit_alignment=0x0, sync_extension=0x1)
> at src/libavcodec/aac/aacdec.c:1040
> #4 decode_audio_specific_config (ac=ac@entry=0x55841cc02a00,
> avctx=avctx@entry=0x55841cbf2fc0, oc=oc@entry=0x55841cc081d8,
> data=<optimized out>, bit_size=<optimized out>, sync_extension=0x1)
> at src/libavcodec/aac/aacdec.c:1095
> #5 0x00007fe049e87ce1 in ff_aac_decode_init (avctx=0x55841cbf2fc0) at
> src/libavcodec/aac/aacdec.c:1189
> #6 0x00007fe049feacc7 in avcodec_open2
> (avctx=avctx@entry=0x55841cbf2fc0, codec=codec@entry=0x7fe04ae07ac0
> <ff_aac_decoder>, options=options@entry=0x55841cbf7580) at src/
> libavcodec/avcodec.c:336
> #7 0x00007fe04b49b982 in avformat_find_stream_info (ic=0x55841cbf21c0,
> options=0x55841cbf7580) at src/libavformat/demux.c:2603
> #8 0x00005583e525791f in open_input_file (ifile=0x7fff1e860ef0,
> filename=0x55841cbeefb0 "00001.ts", print_filename=<optimized out>)
> at src/fftools/ffprobe.c:3901
> #9 probe_file (wctx=0x55841cbef000, filename=0x55841cbeefb0 "00001.ts",
> print_filename=<optimized out>) at src/fftools/ffprobe.c:4011
> #10 main (argc=<optimized out>, argv=<optimized out>) at src/fftools/
> ffprobe.c:4765
>
> Because this watchpoint was hit in "reverse-continue" and not
> "continue", the "Old value" and "New value" are swapped (the number of
> channels was actually changed from 0 to 6 at that point). I didn't
> install libavutil-dbgsym, but it is clear from reading the ffmpeg source
> code that ff_aac_output_configure() and its callers are the more
> interesting part of the call stack.
>
> Once I have fully understood the parsing logic in libavcodec, I will
> determine if I'll improve cRpiAudioDecoder::cParser::Parse() a little,
> or if I'd make it use more of libavcodec, which rpihddevice already
> depends on for the actual decoding.
Cool. The FFMPEG guys will surely appreciate it.
But there're still PCM Multichannel HDMI drivers missing for many devices.
>
> Best regards,
>
> Marko
y
tom