Skip to content

Commit 824ad24

Browse files
committed
flac: Add option to see sample details like residuals and verbatim values
1 parent 7c8fa05 commit 824ad24

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

format/flac/flac_frame.go

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func init() {
2020
DecodeFn: frameDecode,
2121
DefaultInArg: format.FLAC_Frame_In{
2222
BitsPerSample: 16, // TODO: maybe should not have a default value?
23+
SampleDetails: false,
2324
},
2425
})
2526
}
@@ -466,25 +467,48 @@ func frameDecode(d *decode.D) any {
466467
n += count
467468
} else {
468469
d.RangeFn(d.Pos(), int64(count*escapeSampleSize), func(d *decode.D) {
469-
d.FieldRawLen("samples", int64(count*escapeSampleSize))
470+
if ffi.SampleDetails {
471+
d.FieldArray("residuals", func(d *decode.D) {
472+
for i := 0; i < count; i++ {
473+
d.FieldS("residual", escapeSampleSize)
474+
}
475+
})
476+
} else {
477+
d.FieldRawLen("residuals", int64(count*escapeSampleSize))
478+
}
470479
})
471480
for j := 0; j < count; j++ {
472481
samples[n] = d.S(escapeSampleSize)
473482
n++
474483
}
475484
}
476485
} else {
477-
samplesStart := d.Pos()
478-
for j := 0; j < count; j++ {
479-
high := d.Unary(0)
480-
low := d.U(riceParameter)
481-
samples[n] = mathex.ZigZag[uint64, int64](high<<riceParameter | low)
482-
n++
486+
if ffi.SampleDetails {
487+
d.FieldArray("residuals", func(d *decode.D) {
488+
for i := 0; i < count; i++ {
489+
d.FieldStruct("residual", func(d *decode.D) {
490+
high := d.FieldUnary("high", 0)
491+
low := d.FieldU("low", riceParameter)
492+
residual := mathex.ZigZag[uint64, int64](high<<riceParameter | low)
493+
d.FieldValueSint("value", residual)
494+
samples[n] = residual
495+
})
496+
n++
497+
}
498+
})
499+
} else {
500+
samplesStart := d.Pos()
501+
for j := 0; j < count; j++ {
502+
high := d.Unary(0)
503+
low := d.U(riceParameter)
504+
samples[n] = mathex.ZigZag[uint64, int64](high<<riceParameter | low)
505+
n++
506+
}
507+
samplesStop := d.Pos()
508+
d.RangeFn(samplesStart, samplesStop-samplesStart, func(d *decode.D) {
509+
d.FieldRawLen("residuals", d.BitsLeft())
510+
})
483511
}
484-
samplesStop := d.Pos()
485-
d.RangeFn(samplesStart, samplesStop-samplesStart, func(d *decode.D) {
486-
d.FieldRawLen("samples", d.BitsLeft())
487-
})
488512
}
489513
})
490514
}
@@ -516,7 +540,15 @@ func frameDecode(d *decode.D) any {
516540
// <n*i> Unencoded subblock; n = frame's bits-per-sample, i = frame's blocksize.
517541
// TODO: refactor into some kind of FieldBitBufLenFn?
518542
d.RangeFn(d.Pos(), int64(blockSize*subframeSampleSize), func(d *decode.D) {
519-
d.FieldRawLen("samples", d.BitsLeft())
543+
if ffi.SampleDetails {
544+
d.FieldArray("samples", func(d *decode.D) {
545+
for i := 0; i < subframeSampleSize; i++ {
546+
d.FieldS("sample", subframeSampleSize)
547+
}
548+
})
549+
} else {
550+
d.FieldRawLen("samples", d.BitsLeft())
551+
}
520552
})
521553

522554
for i := 0; i < blockSize; i++ {
@@ -565,6 +597,14 @@ func frameDecode(d *decode.D) any {
565597
}
566598
}
567599

600+
if ffi.SampleDetails {
601+
d.FieldArray("samples", func(d *decode.D) {
602+
for i := 0; i < len(samples); i++ {
603+
d.FieldValueSint("sample", samples[i])
604+
}
605+
})
606+
}
607+
568608
channelSamples = append(channelSamples, samples)
569609
})
570610
}

format/format.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ type CAFF_In struct {
199199

200200
type FLAC_Frame_In struct {
201201
SamplesBuf []byte
202-
BitsPerSample int `doc:"Bits per sample"`
202+
BitsPerSample int `doc:"Bits per sample"`
203+
SampleDetails bool `doc:"Decode more sample details like residuals etc"`
203204
}
204205

205206
type FLAC_Frame_Out struct {

0 commit comments

Comments
 (0)