main
Steve Ayerhart 2022-08-01 16:59:46 -04:00
parent 8298edfa46
commit ea2e1177b5
No known key found for this signature in database
GPG Key ID: 4CB33EB9BB156C97
4 changed files with 57 additions and 6 deletions

View File

@ -95,7 +95,10 @@
(%make-subframe-verbatim (%make-subframe-verbatim
(list-ec (: b blocksize) (bitwise-arithmetic-shift (flac-read-sint sample-depth) wasted-bits)))) (list-ec (: b blocksize) (bitwise-arithmetic-shift (flac-read-sint sample-depth) wasted-bits))))
(define (read-subframe-fixed) #f) (define (read-subframe-fixed predictor-order blocksize sample-depth)
(format #t "bitdepth: ~a\n" sample-depth)
(let ((warmup ((list-ec (: o predictor-order) (flac-read-sint sample-depth)))))
raw))
(define (read-subframe-lpc) #f) (define (read-subframe-lpc) #f)
@ -108,11 +111,12 @@
;;; 1xxxxx lpc xxxxx = order - 1 ;;; 1xxxxx lpc xxxxx = order - 1
(define (read-subframe-type) (define (read-subframe-type)
(let ([raw (flac-read-uint 6)]) (let ([raw (flac-read-uint 6)])
(format #t "raw: ~a\n" raw)
(cond (cond
[(= raw #b000000) (values #f 'constant)] [(= raw #b000000) (values #f 'constant)]
[(= raw #b000001) (values #f 'verbatim)] [(= raw #b000001) (values #f 'verbatim)]
[(between? raw #b0010000 #b001100) (values (bit-extract raw 0 4) 'fixed)] [(between? raw #b001000 #b001100) (values (bit-extract raw 0 3) 'fixed)]
[(between? raw #b1000000 #b111111) (values (bit-extract raw 0 6) 'lpc)] [(between? raw #b100000 #b111111) (values (bit-extract raw 0 6) 'lpc)]
(else (values #f #f))))) (else (values #f #f)))))
(define (read-subframe-header) (define (read-subframe-header)
@ -124,18 +128,20 @@
(define (read-subframe frame-header channel) (define (read-subframe frame-header channel)
(let* ([subframe-header (read-subframe-header)] (let* ([subframe-header (read-subframe-header)]
[wasted-bits (subframe-header-wasted-bits subframe-header)] [wasted-bits (subframe-header-wasted-bits subframe-header)]
[predictor-order (subframe-header-predictor-order subframe-header)]
[sample-depth (calculate-sample-depth [sample-depth (calculate-sample-depth
(frame-header-bits-per-sample frame-header) (frame-header-bits-per-sample frame-header)
wasted-bits wasted-bits
(frame-header-channel-assignment frame-header) (frame-header-channel-assignment frame-header)
channel)] channel)]
[blocksize (frame-header-blocksize frame-header)]) [blocksize (frame-header-blocksize frame-header)])
(format #t "sf: ~a\n" subframe-header)
(%make-subframe (%make-subframe
subframe-header subframe-header
(match (subframe-header-subframe-type subframe-header) (match (subframe-header-subframe-type subframe-header)
('constant (read-subframe-constant blocksize sample-depth wasted-bits)) ('constant (read-subframe-constant blocksize sample-depth wasted-bits))
('verbatim (read-subframe-verbatim blocksize sample-depth wasted-bits)) ('verbatim (read-subframe-verbatim blocksize sample-depth wasted-bits))
('fixed (read-subframe-fixed)) ('fixed (read-subframe-fixed predictor-order blocksize sample-depth))
('lpx (read-subframe-lpc)))))) ('lpx (read-subframe-lpc))))))
(define (read-subframes stream-info frame-header) (define (read-subframes stream-info frame-header)

View File

@ -32,9 +32,22 @@
%make-subframe-constant %make-subframe-constant
subframe-constant-value subframe-constant-value
%make-subframe-verbatim %make-subframe-verbatim
subframe-verbatim-data subframe-verbatim-data
%make-partitioned-rice
partitioned-rice-order partitioned-rice-contents
%make-entropy-coding-method
entropy-coding-method-type entropy-coding-method-data
%make-subframe-fixed
subframe-fixed-entropy-coding-method
subframe-fixed-predictor-order
subframe-fixed-warmup
subframe-fixed-residual
make-metadata-block-header make-metadata-block-header
metadata-block-header-last? metadata-block-header-last?
metadata-block-header-type metadata-block-header-type
@ -116,6 +129,26 @@ make-metadata-stream-info metadata-stream-info?
subframe-constant? subframe-constant?
(value subframe-constant-value)) (value subframe-constant-value))
(define-record-type <rice-partition>
(%make-rice-partition order contents)
rice-partition?
(order rice-partition-order)
(contents rice-partition-contents))
(define-record-type <entropy-coding-method>
(%make-entropy-coding-method type data)
entropy-coding-method?
(type entropy-coding-method-type)
(data entropy-coding-method-data))
(define-record-type <subframe-fixed>
(%make-subframe-fixed entropy-coding-method predictor-order warmup residual)
subframe-fixed?
(entropy-coding-method subframe-fixed-entropy-coding-method)
(predictor-order subframe-fix-predictor-order)
(warmup subframe-fixed-warmup)
(residual subframe-fixed-residual))
(define-record-type <frame-header> (define-record-type <frame-header>
(make-frame-header blocking-strategy blocksize sample-rate channel-assignment bits-per-sample frame/sample-number crc) (make-frame-header blocking-strategy blocksize sample-rate channel-assignment bits-per-sample frame/sample-number crc)
frame-header? frame-header?
@ -292,7 +325,7 @@ make-metadata-stream-info metadata-stream-info?
<flac-metadata> <flac-metadata>
(λ (record port) (λ (record port)
(format port "#<<flac-metadata>") (format port "#<<flac-metadata>")
(let ((getters '(flac-metadata-stream-info flac-metadata-vorbis-comment flac-metadata-application flac-metadata-cuesheet flac-metadata-pictures flac-metadata-seek-table))) (let ((getters '(flac-metadata-stream-info flac-metadata-vorbis-comment flac-metadata-application flac-metadata-cuesheet flac-metadata-pictures flac-metadata-seek-table flac-metadata-padding)))
(for-each (λ (getter) (for-each (λ (getter)
(when ((primitive-eval getter) record) (when ((primitive-eval getter) record)
(regexp-substitute/global port "flac-metadata-" (symbol->string getter) 'pre " " 'post))) (regexp-substitute/global port "flac-metadata-" (symbol->string getter) 'pre " " 'post)))

View File

@ -44,7 +44,7 @@
(map (λ (_) (string-split (utf8->string (flac-read-bytes (read-native-u32))) #\=)) (iota (read-native-u32))))) (map (λ (_) (string-split (utf8->string (flac-read-bytes (read-native-u32))) #\=)) (iota (read-native-u32)))))
(define (read-metadata-block-padding length) (define (read-metadata-block-padding length)
(flac-read-uint length) (flac-read-bytes length)
(make-metadata-padding length)) (make-metadata-padding length))
(define (read-metadata-block-picture) (define (read-metadata-block-picture)

View File

@ -11,6 +11,7 @@
flac-read-sint flac-read-sint
flac-read-bytes flac-read-bytes
flac-read-coded-number flac-read-coded-number
flac-read-rice-sint
with-flac-input-port with-flac-input-port
new-flac-reader new-flac-reader
make-flac-reader make-flac-reader
@ -66,6 +67,17 @@
(let ([uint (flac-read-uint bits)]) (let ([uint (flac-read-uint bits)])
(- uint (bitwise-arithmetic-shift (bitwise-arithmetic-shift-right uint (- bits 1)) bits)))) (- uint (bitwise-arithmetic-shift (bitwise-arithmetic-shift-right uint (- bits 1)) bits))))
(define (flac-read-rice-sint param)
(let rice-loop ([val 0])
(if (= 0 (flac-read-uint 1))
(rice-loop (+ 1 val))
(let ([val (bitwise-ior
(bitwise-arithmetic-shift val param)
(flac-read-uint param))])
(bitwise-xor
(bitwise-arithmetic-shift-left val 1)
(* -1 (bitwise-and val 1)))))))
(define (flac-read/assert-magic) (define (flac-read/assert-magic)
(unless (= FLAC-MAGIC (flac-read-uint 32)) (unless (= FLAC-MAGIC (flac-read-uint 32))
#f)) #f))