1+ from __future__ import annotations
2+
13import argparse
24import io
35import logging
3133}
3234
3335
34- def _validate_samples (
35- path : pathlib .Path , filters : T .Optional [T .Container [bytes ]] = None
36- ):
37- samples : T .List [sample_parser .RawSample ] = []
38-
39- with open (path , "rb" ) as fp :
40- for h , s in sparser .parse_path (
41- fp , [b"moov" , b"trak" , b"mdia" , b"minf" , b"stbl" ]
42- ):
43- (
44- descriptions ,
45- raw_samples ,
46- ) = sample_parser .parse_raw_samples_from_stbl_DEPRECATED (
47- s , maxsize = h .maxsize
48- )
49- samples .extend (
50- sample
51- for sample in raw_samples
52- if filters is None
53- or descriptions [sample .description_idx ]["format" ] in filters
54- )
55- samples .sort (key = lambda s : s .offset )
56- if not samples :
36+ def _validate_samples (path : pathlib .Path , filters : T .Container [bytes ] | None = None ):
37+ raw_samples : list [sample_parser .RawSample ] = []
38+
39+ parser = sample_parser .MovieBoxParser .parse_file (path )
40+ for track in parser .extract_tracks ():
41+ for sample in track .extract_samples ():
42+ if filters is None or sample .description ["format" ] in filters :
43+ raw_samples .append (sample .raw_sample )
44+
45+ raw_samples .sort (key = lambda s : s .offset )
46+ if not raw_samples :
5747 return
48+
5849 last_sample = None
59- last_read = samples [0 ].offset
60- for sample in samples :
61- if sample .offset < last_read :
50+ last_read = raw_samples [0 ].offset
51+ for raw_sample in raw_samples :
52+ if raw_sample .offset < last_read :
6253 LOG .warning (f"overlap found:\n { last_sample } \n { sample } " )
63- elif sample .offset == last_read :
54+ elif raw_sample .offset == last_read :
6455 pass
6556 else :
6657 LOG .warning (f"gap found:\n { last_sample } \n { sample } " )
67- last_read = sample .offset + sample .size
58+ last_read = raw_sample .offset + raw_sample .size
6859 last_sample = sample
6960
7061
@@ -87,7 +78,7 @@ def _parse_structs(fp: T.BinaryIO):
8778 print (margin , header , data )
8879
8980
90- def _dump_box_data_at (fp : T .BinaryIO , box_type_path : T . List [bytes ]):
81+ def _dump_box_data_at (fp : T .BinaryIO , box_type_path : list [bytes ]):
9182 for h , s in sparser .parse_path (fp , box_type_path ):
9283 max_chunk_size = 1024
9384 read = 0
@@ -104,30 +95,26 @@ def _dump_box_data_at(fp: T.BinaryIO, box_type_path: T.List[bytes]):
10495 break
10596
10697
107- def _parse_samples (fp : T .BinaryIO , filters : T .Optional [T .Container [bytes ]] = None ):
108- for h , s in sparser .parse_path (fp , [b"moov" , b"trak" ]):
109- offset = s .tell ()
110- for h1 , s1 in sparser .parse_path (s , [b"mdia" , b"mdhd" ], maxsize = h .maxsize ):
111- box = cparser .MediaHeaderBox .parse (s1 .read (h .maxsize ))
112- LOG .info (box )
113- LOG .info (sample_parser .to_datetime (box .creation_time ))
114- LOG .info (box .duration / box .timescale )
115- s .seek (offset , io .SEEK_SET )
116- for sample in sample_parser .parse_samples_from_trak_DEPRECATED (
117- s , maxsize = h .maxsize
118- ):
98+ def _parse_samples (fp : T .BinaryIO , filters : T .Container [bytes ] | None = None ):
99+ parser = sample_parser .MovieBoxParser .parse_stream (fp )
100+ for track in parser .extract_tracks ():
101+ box = track .extract_mdhd_boxdata ()
102+ LOG .info (box )
103+ LOG .info (sample_parser .to_datetime (box ["creation_time" ]))
104+ LOG .info (box ["duration" ] / box ["timescale" ])
105+
106+ for sample in track .extract_samples ():
119107 if filters is None or sample .description ["format" ] in filters :
120108 print (sample )
121109
122110
123- def _dump_samples (fp : T .BinaryIO , filters : T .Optional [T .Container [bytes ]] = None ):
124- for h , s in sparser .parse_path (fp , [b"moov" , b"trak" ]):
125- for sample in sample_parser .parse_samples_from_trak_DEPRECATED (
126- s , maxsize = h .maxsize
127- ):
111+ def _dump_samples (fp : T .BinaryIO , filters : T .Container [bytes ] | None = None ):
112+ parser = sample_parser .MovieBoxParser .parse_stream (fp )
113+ for track in parser .extract_tracks ():
114+ for sample in track .extract_samples ():
128115 if filters is None or sample .description ["format" ] in filters :
129- fp .seek (sample .offset , io .SEEK_SET )
130- data = fp .read (sample .size )
116+ fp .seek (sample .raw_sample . offset , io .SEEK_SET )
117+ data = fp .read (sample .raw_sample . size )
131118 sys .stdout .buffer .write (data )
132119
133120
0 commit comments