@@ -122,14 +122,23 @@ func (d *Decoder) Decode(v interface{}) error {
122122 if d .el == nil {
123123 return fmt .Errorf ("ebml: missing decoded element (forgotten call Next?)" )
124124 }
125+ d .skippedErrs = nil
125126 err := d .decodeSingle (* d .el , val .Elem ())
126127 d .el = nil
127- if err == nil && d . elOverflow {
128- return ErrElementOverflow
128+ if d . skippedErrs != nil {
129+ err = errors . Join ( err , d . skippedErrs )
129130 }
130131 return err
131132}
132133
134+ // callVisitor calls the visitor if there is any and subtracts the header length from the offset.
135+ func (d * Decoder ) callVisitor (el Element , offset int64 , headerSize int , val any ) {
136+ if d .visitor == nil {
137+ return
138+ }
139+ d .visitor = d .visitor .Visit (el , offset - int64 (headerSize ), headerSize , val )
140+ }
141+
133142var (
134143 typeTime = reflect .TypeOf (time.Time {})
135144 typeDuration = reflect .TypeOf (time .Duration (0 ))
@@ -188,63 +197,9 @@ func (d *Decoder) decodeMaster(val reflect.Value, current Element) error {
188197 d .typeInfos [typ ] = tinfo
189198 }
190199
191- occurrences := make (map [schema.ElementID ]int )
192- offset := int64 (0 )
193- for {
194- el , n , err := d .NextOf (current , offset )
195- offset += int64 (n )
196- if errors .Is (err , ErrInvalidVINTLength ) {
197- d .r .Seek (1 , io .SeekCurrent )
198- offset += 1
199- continue
200- }
201- if err == io .EOF {
202- break
203- }
204- if err != nil {
205- return err
206- }
207- if current .DataSize != - 1 {
208- // detect element overflow early to pretend the element is smaller
209- if current .DataSize < offset + el .DataSize {
210- el .DataSize = current .DataSize - offset
211- d .elOverflow = true
212- }
213- offset += el .DataSize
214- }
215- def , _ := d .def .Get (el .ID )
216- occurrences [el .ID ]++
217- fieldv , found := findField (val , tinfo , def .Name )
218- if ! found {
219- if el .DataSize != - 1 {
220- if _ , err := d .Seek (el .DataSize , io .SeekCurrent ); err != nil {
221- return fmt .Errorf ("ebml: failed to skip element: %w" , err )
222- }
223- continue
224- } else if def .Type == TypeMaster {
225- if err := d .decodeMaster (val , el ); err != nil {
226- return err
227- }
228- continue
229- } else {
230- return errors .New ("ebml: only a master element is allowed to be of unknown size" )
231- }
232- }
233-
234- if err := d .decodeSingle (el , fieldv ); err != nil {
235- if e , ok := err .(* DecodeTypeError ); ok {
236- e .extendError (val .Type ().Name ())
237- }
238- return err
239- }
240- }
241-
242- if current .DataSize != - 1 && offset < current .DataSize {
243- return io .ErrUnexpectedEOF
244- }
245-
246- for sel := range d .def .All () {
247- if sel .Default == nil || occurrences [sel .ID ] > 0 {
200+ // Prepopulate the default values, they will be overwritten when defined.
201+ for sel := range d .def .Fields (current .Schema .Path ) {
202+ if sel .Default == nil {
248203 continue
249204 }
250205 fieldv , found := findField (val , tinfo , sel .Name )
@@ -294,6 +249,59 @@ func (d *Decoder) decodeMaster(val reflect.Value, current Element) error {
294249 return fmt .Errorf ("default not supported: %s" , sel .Type )
295250 }
296251 }
252+
253+ offset := int64 (0 )
254+ for {
255+ el , n , err := d .NextOf (current , offset )
256+ offset += int64 (n )
257+ if errors .Is (err , ErrInvalidVINTLength ) {
258+ d .r .Seek (1 , io .SeekCurrent )
259+ offset += 1
260+ continue
261+ }
262+ if err == io .EOF {
263+ break
264+ }
265+ // detect element overflow early to pretend the element is smaller
266+ if errors .Is (err , ErrElementOverflow ) {
267+ el .DataSize = current .DataSize - offset
268+ // This can be skipped
269+ d .skippedErrs = errors .Join (err , d .skippedErrs )
270+ } else if err != nil {
271+ return err
272+ }
273+ if current .DataSize != - 1 {
274+ offset += el .DataSize
275+ }
276+ fieldv , found := findField (val , tinfo , el .Schema .Name )
277+ if ! found {
278+ if el .DataSize != - 1 {
279+ if _ , err := d .Seek (el .DataSize , io .SeekCurrent ); err != nil {
280+ return fmt .Errorf ("ebml: failed to skip element: %w" , err )
281+ }
282+ continue
283+ } else if el .Schema .Type == TypeMaster {
284+ if err := d .decodeMaster (val , el ); err != nil {
285+ return err
286+ }
287+ continue
288+ } else {
289+ return errors .New ("ebml: only a master element is allowed to be of unknown size" )
290+ }
291+ }
292+
293+ if err := d .decodeSingle (el , fieldv ); err != nil {
294+ var e * DecodeTypeError
295+ if errors .As (err , & e ) {
296+ e .extendError (val .Type ().Name ())
297+ }
298+ return err
299+ }
300+ }
301+
302+ if current .DataSize != - 1 && offset < current .DataSize {
303+ return io .ErrUnexpectedEOF
304+ }
297305 return nil
298306}
299307
@@ -374,32 +382,34 @@ func validateReflectType(v reflect.Value, def schema.Element, position int64) er
374382var DefaultAllocationWindow = int64 (1 << 24 ) - 1
375383
376384func (d * Decoder ) decodeSingle (el Element , val reflect.Value ) error {
377- def , _ := d .def .Get (el .ID )
378385 if val .Kind () == reflect .Ptr {
379386 if val .IsNil () {
380387 val .Set (reflect .New (val .Type ().Elem ()))
381388 }
382389 val = val .Elem ()
383390 }
391+ sch := el .Schema
384392 if v := val ; v .Kind () == reflect .Slice {
385393 e := v .Type ().Elem ()
386- if ! (def .Type == TypeBinary && e .Kind () == reflect .Uint8 ) {
394+ if ! (sch .Type == TypeBinary && e .Kind () == reflect .Uint8 ) {
387395 n := v .Len ()
388396 v .Set (reflect .Append (v , reflect .Zero (e )))
389397 val = v .Index (n )
390398 }
391399 }
392- if err := validateReflectType (val , def , 0 ); err != nil {
400+ if err := validateReflectType (val , sch , 0 ); err != nil {
393401 if e , ok := err .(* DecodeTypeError ); ok {
394- e .extendError (def .Name )
402+ e .extendError (sch .Name )
395403 }
396404 return err
397405 }
398406
399- if def .Type == TypeMaster {
407+ if sch .Type == TypeMaster {
400408 return d .decodeMaster (val , el )
401409 }
402410
411+ pos := d .r .InputOffset ()
412+
403413 if int64 (cap (d .window )) < el .DataSize {
404414 n := DefaultAllocationWindow
405415 for n < el .DataSize {
@@ -412,7 +422,7 @@ func (d *Decoder) decodeSingle(el Element, val reflect.Value) error {
412422 return err
413423 }
414424
415- switch def .Type {
425+ switch sch .Type {
416426 case TypeBinary :
417427 switch val .Type () {
418428 default :
@@ -470,5 +480,7 @@ func (d *Decoder) decodeSingle(el Element, val reflect.Value) error {
470480 }
471481 val .SetString (str )
472482 }
483+
484+ d .callVisitor (el , pos , d .n , val .Interface ())
473485 return nil
474486}
0 commit comments