@@ -2,8 +2,10 @@ package main
22
33import (
44 "bytes"
5+ "encoding/binary"
56 "encoding/hex"
67 "fmt"
8+ "github.com/coding-socks/matroska/internal/avi"
79 "github.com/coding-socks/matroska/internal/riff"
810 "io"
911 "os"
@@ -23,8 +25,15 @@ func analyzeRIFFPackages(filename string) error {
2325
2426 w := os .Stdout
2527 fmt .Fprintf (w , "%s\n " , fileType )
26- if err := printRIFFDetails (w , r , " " ); err != nil {
27- return err
28+ switch fileType {
29+ default :
30+ if err := printRIFFDetails (w , r , " " ); err != nil {
31+ return err
32+ }
33+ case avi .AVI :
34+ if err := printAVIDetails (w , r , " " ); err != nil {
35+ return err
36+ }
2837 }
2938 return nil
3039}
@@ -40,7 +49,22 @@ func printRIFFDetails(w io.Writer, r *riff.Reader, indent string) error {
4049 if err != nil {
4150 return err
4251 }
43- if id == riff .LIST {
52+ buf .Reset ()
53+ switch id {
54+ default :
55+ _ , err := io .Copy (& buf , rr )
56+ if err != nil {
57+ return fmt .Errorf ("unable to decode data: %w" , err )
58+ }
59+ fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
60+ fmt .Fprintf (w , "%s %.32s\n " , indent , hex .EncodeToString (buf .Bytes ()))
61+ case riff .JUNK :
62+ _ , err := io .Copy (io .Discard , rr )
63+ if err != nil {
64+ return fmt .Errorf ("unable to decode data: %w" , err )
65+ }
66+ fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
67+ case riff .LIST :
4468 listType , rr , err := riff .NewListReader (l , rr )
4569 if err != nil {
4670 return fmt .Errorf ("unable to decode list: %w" , err )
@@ -49,14 +73,81 @@ func printRIFFDetails(w io.Writer, r *riff.Reader, indent string) error {
4973 if err := printRIFFDetails (w , rr , indent + " " ); err != nil {
5074 return err
5175 }
52- } else {
53- buf .Reset ()
76+ }
77+ }
78+
79+ return nil
80+ }
81+
82+ func printAVIDetails (w io.Writer , r * riff.Reader , indent string ) error {
83+ for {
84+ id , l , rr , err := r .Next ()
85+ if err == io .EOF {
86+ break
87+ }
88+ if err != nil {
89+ return err
90+ }
91+ buf .Reset ()
92+ switch id {
93+ default :
5494 _ , err := io .Copy (& buf , rr )
5595 if err != nil {
5696 return fmt .Errorf ("unable to decode data: %w" , err )
5797 }
5898 fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
59- fmt .Fprintf (w , "%s %.30s\n " , indent , hex .EncodeToString (buf .Bytes ()))
99+ fmt .Fprintf (w , "%s %.32s\n " , indent , hex .EncodeToString (buf .Bytes ()))
100+ case riff .JUNK :
101+ _ , err := io .Copy (io .Discard , rr )
102+ if err != nil {
103+ return fmt .Errorf ("unable to decode data: %w" , err )
104+ }
105+ fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
106+ case riff .LIST :
107+ listType , rr , err := riff .NewListReader (l , rr )
108+ if err != nil {
109+ return fmt .Errorf ("unable to decode list: %w" , err )
110+ }
111+ fmt .Fprintf (w , "%s%s listSize %d listType %s\n " , indent , id , l , listType )
112+ if err := printAVIDetails (w , rr , indent + " " ); err != nil {
113+ return err
114+ }
115+ case avi .ChunkAVIH :
116+ _ , err := io .Copy (& buf , rr )
117+ if err != nil {
118+ return fmt .Errorf ("unable to decode data: %w" , err )
119+ }
120+ fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
121+ mh := avi .MainHeader (buf .Bytes ())
122+ fmt .Fprintf (w , "%s %d\n " , indent , mh .MicroSecPerFrame ())
123+ fmt .Fprintf (w , "%s %s\n " , indent , hex .EncodeToString (buf .Bytes ()))
124+ case /*avi.ChunkAVIH, */ avi .ChunkSTRH , avi .ChunkSTRF , avi .ChunkSTRD , avi .ChunkSTRN :
125+ _ , err := io .Copy (& buf , rr )
126+ if err != nil {
127+ return fmt .Errorf ("unable to decode data: %w" , err )
128+ }
129+ fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
130+ fmt .Fprintf (w , "%s %s\n " , indent , hex .EncodeToString (buf .Bytes ()))
131+ case avi .ChunkIDX1 :
132+ _ , err := io .Copy (& buf , rr )
133+ if err != nil {
134+ return fmt .Errorf ("unable to decode data: %w" , err )
135+ }
136+ fmt .Fprintf (w , "%s%s ckSize %d\n " , indent , id , l )
137+ b := buf .Bytes ()
138+ for len (b ) >= 16 {
139+ fmt .Fprintf (w , "%s %s\n " , indent , riff .FourCC (b [0 :4 ]))
140+ fmt .Fprintf (w , "%s flags %x\n " , indent , binary .LittleEndian .Uint32 (b [4 :8 ]))
141+ fmt .Fprintf (w , "%s offset %d\n " , indent , binary .LittleEndian .Uint32 (b [8 :12 ]))
142+ fmt .Fprintf (w , "%s size %d\n " , indent , binary .LittleEndian .Uint32 (b [12 :16 ]))
143+ b = b [16 :]
144+ }
145+ case riff.FourCC {'I' , 'S' , 'F' , 'T' }:
146+ _ , err := io .Copy (& buf , rr )
147+ if err != nil {
148+ return fmt .Errorf ("unable to decode data: %w" , err )
149+ }
150+ fmt .Fprintf (w , "%s %s\n " , indent , buf .String ())
60151 }
61152 }
62153
0 commit comments