@@ -165,7 +165,7 @@ pub struct HdlrData {
165165/// A decoder is responsible for interpreting the payload of a specific box
166166/// (identified by a [`BoxKey`]) and returning a [`BoxValue`].
167167pub trait BoxDecoder : Send + Sync {
168- fn decode ( & self , r : & mut dyn Read , hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > ;
168+ fn decode ( & self , r : & mut dyn Read , hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > ;
169169}
170170
171171/// Registry of decoders keyed by `BoxKey` (4CC or UUID).
@@ -211,8 +211,10 @@ impl Registry {
211211 key : & BoxKey ,
212212 r : & mut dyn Read ,
213213 hdr : & BoxHeader ,
214+ version : Option < u8 > ,
215+ flags : Option < u32 > ,
214216 ) -> Option < anyhow:: Result < BoxValue > > {
215- self . map . get ( key) . map ( |d| d. inner . decode ( r, hdr) )
217+ self . map . get ( key) . map ( |d| d. inner . decode ( r, hdr, version , flags ) )
216218 }
217219}
218220
@@ -246,7 +248,7 @@ fn lang_from_u16(code: u16) -> String {
246248pub struct FtypDecoder ;
247249
248250impl BoxDecoder for FtypDecoder {
249- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
251+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , _version : Option < u8 > , _flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
250252 let buf = read_all ( r) ?;
251253 if buf. len ( ) < 8 {
252254 return Ok ( BoxValue :: Text ( format ! (
@@ -280,7 +282,7 @@ impl BoxDecoder for FtypDecoder {
280282pub struct MvhdDecoder ;
281283
282284impl BoxDecoder for MvhdDecoder {
283- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
285+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , _version : Option < u8 > , _flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
284286 let buf = read_all ( r) ?;
285287 let mut cur = Cursor :: new ( & buf) ;
286288
@@ -316,7 +318,7 @@ impl BoxDecoder for MvhdDecoder {
316318pub struct TkhdDecoder ;
317319
318320impl BoxDecoder for TkhdDecoder {
319- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
321+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , _version : Option < u8 > , _flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
320322 let buf = read_all ( r) ?;
321323 if buf. len ( ) < 4 {
322324 return Ok ( BoxValue :: Text ( format ! (
@@ -426,7 +428,7 @@ impl BoxDecoder for TkhdDecoder {
426428pub struct MdhdDecoder ;
427429
428430impl BoxDecoder for MdhdDecoder {
429- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
431+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
430432 let creation_time = r. read_u32 :: < BigEndian > ( ) ?;
431433 let modification_time = r. read_u32 :: < BigEndian > ( ) ?;
432434 let timescale = r. read_u32 :: < BigEndian > ( ) ?;
@@ -437,8 +439,8 @@ impl BoxDecoder for MdhdDecoder {
437439 let lang = lang_from_u16 ( language_code) ;
438440
439441 let data = MdhdData {
440- version : 0 , // Version/flags are handled by the FullBox parsing layer
441- flags : 0 ,
442+ version : version . unwrap_or ( 0 ) ,
443+ flags : flags . unwrap_or ( 0 ) ,
442444 creation_time,
443445 modification_time,
444446 timescale,
@@ -454,7 +456,7 @@ impl BoxDecoder for MdhdDecoder {
454456pub struct HdlrDecoder ;
455457
456458impl BoxDecoder for HdlrDecoder {
457- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
459+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
458460 use byteorder:: { BigEndian , ReadBytesExt } ;
459461
460462 // pre_defined (4 bytes) + handler_type (4 bytes)
@@ -478,8 +480,8 @@ impl BoxDecoder for HdlrDecoder {
478480 let handler_str = std:: str:: from_utf8 ( & handler_type) . unwrap_or ( "????" ) ;
479481
480482 let data = HdlrData {
481- version : 0 , // Version/flags are handled by the FullBox parsing layer
482- flags : 0 ,
483+ version : version . unwrap_or ( 0 ) ,
484+ flags : flags . unwrap_or ( 0 ) ,
483485 handler_type : handler_str. to_string ( ) ,
484486 name,
485487 } ;
@@ -492,7 +494,7 @@ impl BoxDecoder for HdlrDecoder {
492494pub struct SidxDecoder ;
493495
494496impl BoxDecoder for SidxDecoder {
495- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
497+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , _version : Option < u8 > , _flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
496498 let buf = read_all ( r) ?;
497499 let mut cur = Cursor :: new ( & buf) ;
498500
@@ -531,7 +533,7 @@ impl BoxDecoder for SidxDecoder {
531533pub struct StsdDecoder ;
532534
533535impl BoxDecoder for StsdDecoder {
534- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
536+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , _version : Option < u8 > , _flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
535537 use byteorder:: { BigEndian , ReadBytesExt } ;
536538
537539 // stsd is a FullBox; our reader is already positioned at payload:
@@ -613,7 +615,7 @@ impl BoxDecoder for StsdDecoder {
613615pub struct SttsDecoder ;
614616
615617impl BoxDecoder for SttsDecoder {
616- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
618+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
617619 let buf = read_all ( r) ?;
618620 let mut cur = Cursor :: new ( & buf) ;
619621
@@ -631,11 +633,9 @@ impl BoxDecoder for SttsDecoder {
631633 } ) ;
632634 }
633635
634- // Note: We don't have access to the actual version/flags here since they're
635- // parsed separately. We use placeholder values.
636636 let data = SttsData {
637- version : 0 , // Placeholder - actual version parsed separately
638- flags : 0 , // Placeholder - actual flags parsed separately
637+ version : version . unwrap_or ( 0 ) ,
638+ flags : flags . unwrap_or ( 0 ) ,
639639 entry_count,
640640 entries,
641641 } ;
@@ -650,7 +650,7 @@ impl BoxDecoder for SttsDecoder {
650650pub struct StssDecoder ;
651651
652652impl BoxDecoder for StssDecoder {
653- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
653+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
654654 let buf = read_all ( r) ?;
655655 let mut cur = Cursor :: new ( & buf) ;
656656
@@ -663,8 +663,8 @@ impl BoxDecoder for StssDecoder {
663663 }
664664
665665 let data = StssData {
666- version : 0 , // Placeholder - actual version parsed separately
667- flags : 0 , // Placeholder - actual flags parsed separately
666+ version : version . unwrap_or ( 0 ) ,
667+ flags : flags . unwrap_or ( 0 ) ,
668668 entry_count,
669669 sample_numbers,
670670 } ;
@@ -677,7 +677,7 @@ impl BoxDecoder for StssDecoder {
677677pub struct CttsDecoder ;
678678
679679impl BoxDecoder for CttsDecoder {
680- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
680+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
681681 let buf = read_all ( r) ?;
682682 let mut cur = Cursor :: new ( & buf) ;
683683
@@ -697,8 +697,8 @@ impl BoxDecoder for CttsDecoder {
697697 }
698698
699699 let data = CttsData {
700- version : 0 , // Placeholder - actual version parsed separately
701- flags : 0 , // Placeholder - actual flags parsed separately
700+ version : version . unwrap_or ( 0 ) ,
701+ flags : flags . unwrap_or ( 0 ) ,
702702 entry_count,
703703 entries,
704704 } ;
@@ -713,7 +713,7 @@ impl BoxDecoder for CttsDecoder {
713713pub struct StscDecoder ;
714714
715715impl BoxDecoder for StscDecoder {
716- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
716+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
717717 let buf = read_all ( r) ?;
718718 let mut cur = Cursor :: new ( & buf) ;
719719
@@ -733,8 +733,8 @@ impl BoxDecoder for StscDecoder {
733733 }
734734
735735 let data = StscData {
736- version : 0 , // Placeholder - actual version parsed separately
737- flags : 0 , // Placeholder - actual flags parsed separately
736+ version : version . unwrap_or ( 0 ) ,
737+ flags : flags . unwrap_or ( 0 ) ,
738738 entry_count,
739739 entries,
740740 } ;
@@ -747,7 +747,7 @@ impl BoxDecoder for StscDecoder {
747747pub struct StszDecoder ;
748748
749749impl BoxDecoder for StszDecoder {
750- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
750+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
751751 let buf = read_all ( r) ?;
752752 let mut cur = Cursor :: new ( & buf) ;
753753
@@ -764,8 +764,8 @@ impl BoxDecoder for StszDecoder {
764764 }
765765
766766 let data = StszData {
767- version : 0 , // Placeholder - actual version parsed separately
768- flags : 0 , // Placeholder - actual flags parsed separately
767+ version : version . unwrap_or ( 0 ) ,
768+ flags : flags . unwrap_or ( 0 ) ,
769769 sample_size,
770770 sample_count,
771771 sample_sizes,
@@ -779,7 +779,7 @@ impl BoxDecoder for StszDecoder {
779779pub struct StcoDecoder ;
780780
781781impl BoxDecoder for StcoDecoder {
782- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
782+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
783783 let buf = read_all ( r) ?;
784784 let mut cur = Cursor :: new ( & buf) ;
785785
@@ -792,8 +792,8 @@ impl BoxDecoder for StcoDecoder {
792792 }
793793
794794 let data = StcoData {
795- version : 0 , // Placeholder - actual version parsed separately
796- flags : 0 , // Placeholder - actual flags parsed separately
795+ version : version . unwrap_or ( 0 ) ,
796+ flags : flags . unwrap_or ( 0 ) ,
797797 entry_count,
798798 chunk_offsets,
799799 } ;
@@ -806,7 +806,7 @@ impl BoxDecoder for StcoDecoder {
806806pub struct Co64Decoder ;
807807
808808impl BoxDecoder for Co64Decoder {
809- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
809+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , version : Option < u8 > , flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
810810 let buf = read_all ( r) ?;
811811 let mut cur = Cursor :: new ( & buf) ;
812812
@@ -819,8 +819,8 @@ impl BoxDecoder for Co64Decoder {
819819 }
820820
821821 let data = Co64Data {
822- version : 0 , // Placeholder - actual version parsed separately
823- flags : 0 , // Placeholder - actual flags parsed separately
822+ version : version . unwrap_or ( 0 ) ,
823+ flags : flags . unwrap_or ( 0 ) ,
824824 entry_count,
825825 chunk_offsets,
826826 } ;
@@ -833,7 +833,7 @@ impl BoxDecoder for Co64Decoder {
833833pub struct ElstDecoder ;
834834
835835impl BoxDecoder for ElstDecoder {
836- fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader ) -> anyhow:: Result < BoxValue > {
836+ fn decode ( & self , r : & mut dyn Read , _hdr : & BoxHeader , _version : Option < u8 > , _flags : Option < u32 > ) -> anyhow:: Result < BoxValue > {
837837 let buf = read_all ( r) ?;
838838 if buf. len ( ) < 8 {
839839 return Ok ( BoxValue :: Text ( format ! (
0 commit comments