[FFmpeg-trac] #8815(avformat:new): pssh boxes are ignored when present before trak box
FFmpeg
trac at avcodec.org
Fri Jul 24 17:17:29 EEST 2020
#8815: pssh boxes are ignored when present before trak box
------------------------------------+--------------------------------------
Reporter: panpawel88 | Type: defect
Status: new | Priority: normal
Component: avformat | Version: git-master
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
------------------------------------+--------------------------------------
Summary of the bug:
I would like to extract "Encryption initialization data" from a mp4
container, but the ffmpeg does not parse pssh boxes if they are before any
trak box.
How to reproduce:
{{{
$ ffprobe -show_streams oops_cenc-20121114-142.mp4
ffprobe version N-98270-g29ea4e1b3c Copyright (c) 2007-2020 the FFmpeg
developers
built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
configuration: --disable-optimizations --enable-ffplay
libavutil 56. 55.100 / 56. 55.100
libavcodec 58. 93.100 / 58. 93.100
libavformat 58. 47.100 / 58. 47.100
libavdevice 58. 11.100 / 58. 11.100
libavfilter 7. 86.100 / 7. 86.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'oops_cenc-20121114-142.mp4':
Metadata:
major_brand : dash
minor_version : 0
compatible_brands: iso6avc1mp41
creation_time : 2012-11-14T07:35:10.000000Z
Duration: 00:04:02.70, start: 0.000000, bitrate: 264 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661),
yuv420p(progressive), 426x240, 5 kb/s, 23.97 fps, 23.97 tbr, 90k tbn,
47.95 tbc (default)
Metadata:
creation_time : 2012-11-14T07:35:10.000000Z
handler_name : VideoHandler
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_time_base=1877/90000
codec_tag_string=avc1
codec_tag=0x31637661
width=426
height=240
coded_width=432
coded_height=240
closed_captions=0
has_b_frames=0
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=21
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=progressive
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=45000/1877
avg_frame_rate=45000/1877
time_base=1/90000
start_pts=0
start_time=0.000000
duration_ts=21843105
duration=242.701167
bit_rate=5543
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:creation_time=2012-11-14T07:35:10.000000Z
TAG:language=und
TAG:handler_name=VideoHandler
[/STREAM]
}}}
As you see, ffprobe does not list:
{{{
[SIDE_DATA]
side_data_type=Encryption initialization data
[/SIDE_DATA]
}}}
but a sample content contains PSSH boxes:
{{{
$mp4dump oops_cenc-20121114-142.mp4
...
[moov] size=8+1703
[mvhd] size=12+96
timescale = 90000
duration = 0
duration(ms) = 0
[pssh] size=12+40
system_id = [ed ef 8b a9 79 d6 4a ce a3 c8 27 dc d5 1d 21 ed]
data_size = 20
[pssh] size=12+744
system_id = [9a 04 f0 79 98 40 42 86 ab 92 e6 5b e0 88 5f 95]
data_size = 724
[pssh] size=12+36
system_id = [58 14 7e c8 04 23 46 59 92 e6 f5 2c 5c e8 c3 cc]
data_size = 16
[mvex] size=8+32
[trex] size=12+20
track id = 1
default sample description index = 1
default sample duration = 0
default sample size = 0
default sample flags = 0
[trak] size=8+691
[tkhd] size=12+80, flags=3
enabled = 1
id = 1
duration = 0
width = 426.000000
height = 240.000000
...
}}}
Please take a look at libavformat/mov.c:
{{{
static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVEncryptionInitInfo *info, *old_init_info;
uint8_t **key_ids;
AVStream *st;
uint8_t *side_data, *extra_data, *old_side_data;
size_t side_data_size;
int ret = 0, old_side_data_size;
unsigned int version, kid_count, extra_data_size, alloc_size = 0;
if (c->fc->nb_streams < 1)
return 0;
}}}
When a pssh box is found, the 'c->fc->nb_streams < 1' condition is true,
because a trak box is not yet found.
I'm not sure if the assumption that "a pssh box must be after a trak box"
is correct. IMHO, pssh boxes are related to all streams defined in moov
box, not only the last one, but I cannot find any confirmation in the
specification.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/8815>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list