Files
AnyPS5/docs/dev/debt/libSceAudiodec.md
T
Yunus Shaikh b3b6178347 feat(libSceAudiodec): decode M4AAC with non-delay output enabled
The 28- and 32-byte M4AAC parameter blocks carry two fields at offsets
24 and 28 whose range errors fpPS4 names
SCE_AUDIODEC_ERROR_M4AAC_INVALID_ENABLE_NONDELAY_OUTPUT (0x807F0305) and
SCE_AUDIODEC_ERROR_M4AAC_INVALID_SURROUND_CHANNEL_INTERLEAVE_ORDER
(0x807F0306). shadPS4's AJM AAC decoder outputs every decoded frame from
the first one on when non-delay output is enabled, which is what the
decoder here does, so a decoder created with non-delay output 1 is
accepted and decodes as before. Surround channel interleave orders 1
and 2 still throw, now naming the order: no source says which order
each value selects. Name both errors and test that every access unit
yields its frame from the first one with non-delay output enabled.
2026-10-28 16:03:59 +00:00

2.8 KiB

libSceAudiodec technical debt

Unknown function info

  • M4AAC extended parameters: 28-byte and 32-byte parameter variants add fields at offsets 24 and 28, named by their range errors (0x807F0305 SCE_AUDIODEC_ERROR_M4AAC_INVALID_ENABLE_NONDELAY_OUTPUT, 0x807F0306 SCE_AUDIODEC_ERROR_M4AAC_INVALID_SURROUND_CHANNEL_INTERLEAVE_ORDER, in fpPS4's ps4_libsceaudiodec.pas). Non-delay output 1 decodes every access unit to its own PCM from the first one on, as shadPS4's AJM AAC decoder does with EnableNondelayOutput; without that flag shadPS4 holds back the first 2 frames. Non-delay output 0 still decodes the same way, with no frame held back: no measurement shows whether the console delays it. Surround channel interleave orders 1 and 2 throw: shadPS4 names two AJM orders (ExtlExtrLsRs, LsRsExtlExtr) but uses neither, and no source says which value selects which order or which order 0 is.

  • sceAudiodecDecode (libSceAudiodec) - a raw M4AAC stream carries no channel configuration, so the decoder tries the mono/stereo configuration and then configurations 3 to 7 within ui_max_channels until one decodes the first access unit, and keeps that one. No reference documents how the library picks the layout (shadPS4 maps the channel count straight to the configuration; SharpProspero only describes the maximum). With the stereo configuration a mono raw stream decodes as 2 channels, so 2 is reported, not 1

  • sceAudiodecDecode (libSceAudiodec) - the HE-AAC handling follows one console measurement of an HE-AAC v2 ADTS stream: SBR output at 48 kHz in one channel with ui_enable_heaac 1, the 24 kHz mono core with 0. Not measured: whether the console, like FFmpeg, decodes a stream without SBR data in its first access unit as AAC-LC with ui_enable_heaac 1, and what it reports in ui_sampling_freq and ui_heaac with ui_enable_heaac 0 (here the rate of the returned PCM and 0)

Functional

  • sceAudiodecDecode (libSceAudiodec) - an ADTS stream with channel configuration 0 (layout in a program config element) is still parsed by FFmpeg, so ui_enable_heaac 0 does not remove its SBR and a mono one with Parametric Stereo comes out as stereo.
  • libSceAudiodec accepts only 16-bit PCM, and float PCM for ATRAC9 and M4AAC, as sceAudiodecCreateDecoder did in a payload process on a PS5 (firmware 13.60), which returned ERROR_INVALID_WORD_LENGTH for iBwPcm 0, 3 and -1 with each codec and for float with MP3; other word sizes are assumed to fail the same way. ATRAC9 decoding is covered only by configuration and error tests, as no ATRAC9 encoder is available for a fixture.