#10599: hls: Broken handling of partially encrypted http-streams
-------------------------------------+-------------------------------------
Reporter: hbehe | Type: defect
Status: new | Priority: normal
Component: | Version: git-
undetermined | master
Keywords: HLS AAC | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
When parsing a HLS file with an unencrypted file, followed by an encrypted
file, decryption is skipped once. This only occurs with http due to broken
keep-alive handling.
How to reproduce:
Given a m3u8/hls playlist description like
{{{
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-TARGETDURATION:7
#EXT-X-KEY:METHOD=NONE
#EXTINF:6.014,title="Repro"
./chapter_01_0.aac
#EXT-X-KEY:METHOD=AES-128,URI="repro.key",IV=0x0665781e80339d0247b4d511e20996db
#EXTINF:5.991,title="Repro"
./chapter_01_1.aac
#EXT-X-ENDLIST
}}}
Parsing this as a local file works fine.
{{{
% ffmpeg -allowed_extensions ALL -i repro.m3u8 -c:v none -c:a copy
repro.m4a
[hls @ 0x555caffef640] Skip ('#EXT-X-VERSION:3')
[hls @ 0x555caffef640] Opening './chapter_01_0.aac' for reading
Input #0, hls, from 'repro.m3u8':
Duration: 00:00:12.01, bitrate: 0 kb/s
Program 0
Metadata:
variant_bitrate : 0
Stream #0:0: Audio: aac (LC), 44100 Hz, mono, fltp
Metadata:
variant_bitrate : 0
Output #0, ipod, to 'repro.m4a':
Metadata:
encoder : Lavf60.13.100
Stream #0:0: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp
Metadata:
variant_bitrate : 0
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[hls @ 0x555caffef640] Opening 'repro.key' for reading
[hls @ 0x555caffef640] Opening 'crypto:./chapter_01_1.aac' for reading
[out#0/ipod @ 0x555cb0000440] video:0kB audio:100kB subtitle:0kB other
streams:0kB global headers:0kB muxing overhead: unknown
}}}
Opening this via a http server fails
{{{
% ffmpeg -i http://127.0.0.1:8000/repro.m3u8 -c:v none -c:a copy repro.m4a
ffmpeg version N-112173-gfb05bc8eee Copyright (c) 2000-2023 the FFmpeg
developers
built with gcc 13.2.1 (GCC) 20230801
configuration: --enable-debug --enable-openssl --optflags=0
libavutil 58. 25.100 / 58. 25.100
libavcodec 60. 27.100 / 60. 27.100
libavformat 60. 13.100 / 60. 13.100
libavdevice 60. 2.101 / 60. 2.101
libavfilter 9. 11.100 / 9. 11.100
libswscale 7. 3.100 / 7. 3.100
libswresample 4. 11.100 / 4. 11.100
mime type is not rfc8216 compliant
[hls @ 0x55569dd3f580] Skip ('#EXT-X-VERSION:3')
[hls @ 0x55569dd3f580] Opening 'http://127.0.0.1:8000/chapter_01_0.aac'
for reading
Input #0, hls, from 'http://127.0.0.1:8000/repro.m3u8':
Duration: 00:00:12.01, bitrate: 0 kb/s
Program 0
Metadata:
variant_bitrate : 0
Stream #0:0: Audio: aac (LC), 44100 Hz, mono, fltp
Metadata:
variant_bitrate : 0
Output #0, ipod, to 'repro.m4a':
Metadata:
encoder : Lavf60.13.100
Stream #0:0: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp
Metadata:
variant_bitrate : 0
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[hls @ 0x55569dd3f580] Opening 'http://127.0.0.1:8000/repro.key' for
reading
[http @ 0x55569dd46340] Opening
'crypto+http://127.0.0.1:8000/chapter_01_1.aac' for reading
[aac_adtstoasc @ 0x7fb5240009c0] Error parsing ADTS frame header!
[ipod @ 0x55569dd59e40] Error applying bitstream filters to an output
packet for stream #0: Invalid data found when processing input
[aost#0:0/copy @ 0x55569dd4a600] Error submitting a packet to the muxer:
Invalid data found when processing input
[out#0/ipod @ 0x55569dd4a200] Error muxing a packet
[out#0/ipod @ 0x55569dd4a200] video:0kB audio:64kB subtitle:0kB other
streams:0kB global headers:0kB muxing overhead: unknown
}}}
Setting `-http_persistent 0` makes it work again.
The error `Error parsing ADTS frame header!` in aac_adtstoasc stems from
the second file not being decrypted at all and `aacdec.c` by chance
finding 12 bits being 1.
There are various ways to make this "work", like closing the previous
AVIOContext when encountering an encrypted file in `open_url`.
I wouldn't be happy writing such a patch and I don't think other
maintainers would like another one of these hacks being piled on `hls.c`.
Related issue: https://trac.ffmpeg.org/ticket/8546
Tested with ffmpeg n6.0 and git from 2023-08-25
ffmpeg version N-112173-gfb05bc8eee Copyright (c) 2000-2023 the FFmpeg
developers
built with gcc 13.2.1 (GCC) 20230801
--
Ticket URL: <https://trac.ffmpeg.org/ticket/10599>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac
To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".