1
1
mirror of https://github.com/wader/fq.git synced 2024-11-22 07:16:49 +03:00
This commit is contained in:
Mattias Wadman 2020-06-08 02:29:51 +02:00
commit 970465996c
329 changed files with 53183 additions and 0 deletions

29
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: CI
on:
push:
branches:
- 'master'
pull_request:
env:
GOLANGCILINT_VERSION: 1.41.1
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup go
uses: actions/setup-go@v2
with:
go-version: 1.16.6
- name: Lint
uses: golangci/golangci-lint-action@v2
with:
version: v${{ env.GOLANGCILINT_VERSION }}
- name: Test
run: make test

30
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,30 @@
name: Release
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup go
uses: actions/setup-go@v2
with:
go-version: 1.16.6
- name: Run goreleaser
uses: goreleaser/goreleaser-action@v2
with:
distribution: goreleaser
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}

35
.golangci.yml Normal file
View File

@ -0,0 +1,35 @@
linters:
enable:
- goimports
- nilerr
- forcetypeassert
- asciicheck
- bodyclose
- durationcheck
- errorlint
- noctx
- misspell
- exportloopref
- unconvert
- unparam
- wastedassign
- makezero
- exhaustive
- gosec
- nolintlint
- nakedret
- predeclared
- tagliatelle
linters-settings:
misspell:
ignore-words:
# elf RELA
- rela
- equalisation
- synchronisation
gosec:
excludes:
# allow md5
- G401
- G501

57
.goreleaser.yml Normal file
View File

@ -0,0 +1,57 @@
project_name: fq
before:
hooks:
- go mod download
builds:
- env:
- CGO_ENABLED=0
goarch:
- amd64
- arm64
goos:
- linux
- windows
- darwin
flags:
- -trimpath
ldflags:
# omit symbol table and debug information
- -s -w
- -X main.version={{.Version}}
- -X main.commit={{.Commit}}
- -X main.date={{.CommitDate}}
- -X main.builtBy=goreleaser
checksum:
name_template: 'checksums.txt'
archives:
- files:
- none*
format_overrides:
- goos: windows
format: zip
replacements:
darwin: macos
snapshot:
name_template: "{{.Tag}}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
brews:
- tap:
owner: wader
name: homebrew-tap
folder: Formula
homepage: https://github.com/wader/fq
description: jq for binaries
license: MIT
test: |
system "#{bin}/fq -v"

131
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,131 @@
{
"cSpell.words": [
"AACSSR",
"APETAGEX",
"APEV",
"APIC",
"Arity",
"BCDU",
"CCIT",
"CLLID",
"Equalisation",
"Errorer",
"Exif",
"Exiter",
"FALLID",
"GOPATH",
"HEIC",
"HEVC",
"Horz",
"IDID",
"IEND",
"IHDR",
"Linearization",
"MJPEG",
"OSFS",
"Packetized",
"RDBs",
"RELA",
"SMPTE",
"TSSE",
"UIDID",
"UTCID",
"Uinteger",
"Unsychronized",
"WEBP",
"Xiph",
"acsp",
"bzip",
"chzyer",
"coef",
"colorjson",
"cpus",
"ctxreadseeker",
"ctxstack",
"demuxed",
"descr",
"dumpaddr",
"elif",
"endians",
"esds",
"fpbits",
"fqtest",
"ftyp",
"funcs",
"goarch",
"gofmt",
"goimports",
"gojq",
"gojqextra",
"golangci",
"gosec",
"gosimple",
"iinf",
"iloc",
"ilst",
"inband",
"infe",
"interp",
"ioextra",
"ipco",
"iprint",
"iprp",
"itchyny",
"ldflags",
"libavformat",
"localizable",
"luma",
"matroska",
"mfhd",
"mfra",
"mfro",
"moof",
"moov",
"mvex",
"nals",
"nalu",
"nalus",
"noctx",
"nolint",
"obus",
"origptr",
"pcap",
"pmezard",
"println",
"protobuf",
"randomised",
"recoverfn",
"rpad",
"sels",
"shquote",
"sidx",
"stco",
"stedolan",
"struct",
"structcheck",
"stsc",
"stsd",
"stsz",
"stts",
"synchronisation",
"syncmapl",
"tfdt",
"tfhd",
"tfra",
"tmpl",
"toimage",
"tojvalue",
"tovalue",
"traf",
"trex",
"trun",
"udta",
"ufffd",
"unconvert",
"unparam",
"xrange"
],
"editor.formatOnSave": true,
"cSpell.allowCompoundWords": true,
"cSpell.enabled": true,
}

6
Bumpfile Normal file
View File

@ -0,0 +1,6 @@
Dockerfile
go.mod
workflows-golang /go-version: ([\d.]+)/ git:https://github.com/actions/go-versions.git|/(.*)-.*/$1/|^1
workflow-golangcilint /GOLANGCILINT_VERSION: ([\d.]+)/ git:https://github.com/golangci/golangci-lint.git|^1
.github/workflows/*.yml

27
Dockerfile Normal file
View File

@ -0,0 +1,27 @@
# bump: golang /FROM golang:([\d.]+)/ docker:golang|^1
FROM golang:1.16.6 AS base
# docker build --target dev -t fq-dev - < Dockerfile && docker run --rm -ti -v "$PWD:/$PWD" -w "$PWD" fq-dev
FROM base AS dev
# bump: golangcilint /GOLANGCILINT_VERSION=([\d.]+)/ git:https://github.com/golangci/golangci-lint.git|^1
ARG GOLANGCILINT_VERSION=1.41.1
RUN \
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | \
sh -s -- -b /usr/local/bin v$GOLANGCILINT_VERSION
FROM base AS builder
WORKDIR $GOPATH/src/fq
COPY go.mod go.sum ./
RUN go mod download
COPY Makefile main.go ./
COPY pkg pkg
COPY internal internal
RUN make test fq
RUN cp fq /fq
FROM scratch
COPY --from=builder /fq /fq
RUN ["/fq", "--version"]
ENTRYPOINT ["/fq"]

19
LICENSE Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2021 Mattias Wadman
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

75
Makefile Normal file
View File

@ -0,0 +1,75 @@
all: test
.PHONY: fq
fq:
go build -ldflags "-X main.version=$$(git describe --all --long --dirty || echo nogit)" -trimpath -o fq .
.PHONY: test
test: jqtest
go test -v -cover -race -coverpkg=./... -coverprofile=cover.out ./...
go tool cover -html=cover.out -o cover.out.html
cat cover.out.html | grep '<option value="file' | sed -E 's/.*>(.*) \((.*)%\)<.*/\2 \1/' | sort -rn
rm -f cover.out cover.out.html
testwrite: export WRITE_ACTUAL=1
testwrite: test
.PHONY: jqtest
jqtest:
@for f in $$(find . -name "*_test.jq"); do \
echo $$f ; \
jq -L "$$(dirname $$f)" -f "$$f" -n -r ; \
done
.PHONY: doc
doc: doc/file.mp3 doc/file.mp4
$(eval REPODIR=$(shell pwd))
$(eval TEMPDIR=$(shell mktemp -d))
@cp -a doc/* "${TEMPDIR}"
@go build -o "${TEMPDIR}/fq" main.go
@for f in *.md doc/*.md ; do \
cd "${TEMPDIR}" ; \
echo $$f ; \
mkdir -p $$(dirname "${TEMPDIR}/$$f") ; \
cat "${REPODIR}/$$f" | PATH="${TEMPDIR}:${PATH}" go run "${REPODIR}/doc/mdsh.go" > "${TEMPDIR}/$$f" ; \
mv "${TEMPDIR}/$$f" "${REPODIR}/$$f" ; \
done
@rm -rf "${TEMPDIR}"
doc/file.mp3: Makefile
ffmpeg -y -f lavfi -i sine -f lavfi -i testsrc -map 0:0 -map 1:0 -t 20ms "$@"
doc/file.mp4: Makefile
ffmpeg -y -f lavfi -i sine -f lavfi -i testsrc -c:a aac -c:v h264 -f mp4 -t 20ms "$@"
.PHONY: gogenerate
gogenerate:
go generate -x ./...
.PHONY: lint
lint:
golangci-lint run
.PHONY: depgraph.svg
depgraph.svg:
godepgraph -s main.go | dot -Tsvg -o godepgraph.svg
.PHONY: formats.svg
formats.svg:
dev/formats_dot.jq | dot -Tsvg -o formats.svg
.PHONY: prof
prof:
go build -o fq.prof main.go
CPUPROFILE=fq.cpu.prof MEMPROFILE=fq.mem.prof ./fq.prof "${ARGS}"
.PHONY: memprof
memprof: prof
go tool pprof -http :5555 fq.prof fq.mem.prof
.PHONY: cpuprof
cpuprof: prof
go tool pprof -http :5555 fq.prof fq.cpu.prof
.PHONY: update-gomodreplace
update-gomodreplace:
go mod edit -replace github.com/chzyer/readline=github.com/wader/readline@fq && GOPROXY=direct go mod download github.com/chzyer/readline && go mod tidy
go mod edit -replace github.com/itchyny/gojq=github.com/wader/gojq@fq && GOPROXY=direct go mod download github.com/itchyny/gojq && go mod tidy

115
README.md Normal file
View File

@ -0,0 +1,115 @@
# fq
Tool, language and decoders for querying and exploring binary data.
<sub>
<pre sh>
<b># Overview of mp3 file</b> 
$ fq . file.mp3 
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} file.mp3 (mp3)
0x000|49 44 33 04 00 00 00 00 15 39 54 53 53 45 00 00|ID3......9TSSE..| headers: [1]
* |until 0xac2.7 (2755) | |
0xac0| ff fb 40 c0 00 00 00 00 00 00 00 00 00| ..@..........| frames: [3]
0xad0|00 00 00 00 00 00 00 00 49 6e 66 6f 00 00 00 0f|........Info....|
* |until 0xd19.7 (end) (599) | |
| | | footers: [0]
 
<b># Show ID3v2 APIC frame</b> 
$ fq '.headers[].frames[] | select(.id == "APIC")' file.mp3 
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.headers[0].frames[1]: {}
0x020| 41 50 49 43 | APIC | id: "APIC" (Attached picture)
0x020| 00 00 15 0c | .... | size: 2700
0x020| 00 00 | .. | flags: {}
0x020| 03 | . | text_encoding: UTF-8 (3)
0x020| 69 6d| im| mime_type: "image/png"
0x030|61 67 65 2f 70 6e 67 00 |age/png. |
0x030| 00 | . | picture_type: 0
0x030| 00 | . | description: ""
0x030| 89 50 4e 47 0d 0a| .PNG..| picture: {} (png)
0x040|1a 0a 00 00 00 0d 49 48 44 52 00 00 01 40 00 00|......IHDR...@..|
* |until 0xab8.7 (2687) | |
 
<b># Resolution of embedded PNG file</b> 
$ fq '.headers[].frames[] | select(.id == "APIC").picture.chunks[] | select(.type == "IHDR") | {width, height}' file.mp3 
{
"height": 240,
"width": 320
}
 
<b># Extract PNG file</b> 
$ fq '.headers[].frames[] | select(.id == "APIC")?.picture._bits' file.mp3 > file.png 
$ file file.png 
file.png: PNG image data, 320 x 240, 8-bit/color RGB, non-interlaced
 
<b># Codecs in a mp4 file</b> 
$ fq '[.. | select(.type == "stsd")?.boxes[].type]' file.mp4 
[
"avc1",
"mp4a"
]
</pre>
</sub>
## Install
Download archive from [releases](https://github.com/wader/fq/releases) page for your
platform, unarchive and move the executable to `PATH`.
### Homebrew
```sh
# install latest release
brew install wader/tap/fq
```
### Build from source
Make sure you have go 1.16 or later then do:
```sh
# build latest master
go install github.com/wader/fq@latest
```
and the binary should end up at `$GOPATH/bin/fq`.
## Usage
Basic usage is:
[fq -h | grep Usage: | sed 's/\(.*\)/<pre>\1<\/pre>/']: sh-start
<pre>Usage: fq [OPTIONS] [EXPR] [FILE...]</pre>
[#]: sh-end
For more usage details see [usage.md](doc/usage.md).
## Supported formats
[./formats_list.jq]: sh-start
aac_frame, adts, adts_frame, apev2, av1_ccr, av1_frame, av1_obu, avc_au, avc_dcr, avc_nalu, avc_pps, avc_sei, avc_sps, bzip2, dns, elf, exif, flac, flac_frame, flac_metadatablock, flac_picture, gif, gzip, hevc_au, hevc_dcr, hevc_nalu, icc_profile, id3v1, id3v11, id3v2, jpeg, json, matroska, mp3, mp3_frame, mp4, mpeg_asc, mpeg_es, mpeg_pes, mpeg_pes_packet, mpeg_spu, mpeg_ts, ogg, ogg_page, opus_packet, png, protobuf, protobuf_widevine, raw, tar, tiff, vorbis_comment, vorbis_packet, vp8_frame, vp9_cfm, vp9_frame, vpx_ccr, wav, webp, xing
[#]: sh-end
For more format details see [usage.md](doc/usage.md).
## TODO and ideas
See [TODO.md](doc/TODO.md)
## Development
See [dev.md](doc/dev.md)
## Thanks and related projects
This project would not be possible without [itchyny](https://github.com/itchyny)'s
jq implementation [gojq](https://github.com/itchyny/gojq). Also want to thank
[HexFiend](https://github.com/HexFiend/HexFiend) for inspiration and ideas and [stedolan](https://github.com/stedolan)
for inventing the [jq](https://github.com/stedolan/jq) language.
Similar projects:
- https://github.com/HexFiend/HexFiend
- https://github.com/binspector/binspector
- https://kaitai.io

49
dev/editlist.jq Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env fq -d mp4 -f
# TODO: esds, make fancy printer? shared?
# TODO: handle -1 media_time
# TODO: fragmented mp4
# root
# moov
# mvhd (movie header)
# trak (track)
# mdia
# mdhd (media header)
# hdlr (handler?)
# minf
# stbl
# stsd (sample description)
# elst (edit list)
( first(.boxes[] | select(.type == "moov")?)
| first(.boxes[] | select(.type == "mvhd")?) as $mvhd
| {
duration: $mvhd.duration,
time_scale: $mvhd.time_scale,
duration_s: ($mvhd.duration / $mvhd.time_scale),
tracks:
[ .boxes[]
| select(.type == "trak")
| first(.. | select(.type == "mdhd")?) as $mdhd
| first(.. | select(.type == "hdlr")?) as $hdlr
| first(.. | select(.type == "stsd")?) as $stsd
| first(.. | select(.type == "elst")?) as $elst
| {
component_type: $hdlr.component_subtype,
data_format: $stsd.sample_descriptions[0].data_format,
media_scale: $mdhd.time_scale,
edit_list:
[ $elst.table[]
| {
time_scale: $mdhd.time_scale,
track_duration: .track_duration,
media_time: .media_time,
track_duration_s: (.track_duration / $mvhd.time_scale),
media_time_s: (.media_time / $mdhd.time_scale)
}
]
}
]
}
)

42
dev/formats_dot.jq Executable file
View File

@ -0,0 +1,42 @@
#!/usr/bin/env fq -rnf
def _formats_dot:
def _record($title; $fields):
[ "<"
, "<table bgcolor=\"paleturquoise\" border=\"0\" cellspacing=\"0\">"
, "<tr><td port=\"\($title)\">\($title)</td></tr>"
, [$fields | flatten | map("<tr><td align=\"left\" bgcolor=\"lightgrey\" port=\"\(.)\">\(.)</td></tr>")]
, "</table>"
, ">"
] | flatten | join("");
( "# ... | dot -Tsvg -o formats.svg"
, "digraph formats {"
, " concentrate=True"
, " rankdir=TB"
, " graph ["
, " ]"
, " node [shape=\"none\"style=\"\"]"
, " edge [arrowsize=\"0.7\"]"
, ( .[]
| . as $f
| .dependencies
| flatten?
| .[]
| " \"\($f.name)\":\(.) -> \(.)"
)
, ( .[]
| .name as $name
| .groups[]?
| " \(.) -> \"\($name)\":\($name)"
)
, ( to_entries[]
| " \(.key) [color=\"paleturquoise\", label=\(_record(.key; (.value.dependencies // [])))]"
)
, ( [.[].groups[]?]
| unique[]
| " \(.) [shape=\"record\",style=\"rounded,filled\",color=\"palegreen\"]"
)
, "}"
);
formats | _formats_dot

92
dev/snippets.jq Normal file
View File

@ -0,0 +1,92 @@
# same as group_by but counts
def count_by(exp):
group_by(exp) | map([(.[0] | exp), length]);
def protobuf_to_value:
.fields | map({(.name | tostring): (.enum // .value)}) | add;
# hack to parse just a box
# <binary> | mp4_box
def mp4_box:
[0, 0, 0, 16, "ftyp", "isom", 0, 0 , 2 , 0, .] | mp4.boxes;
def flac_dump:
[ "fLaC"
, first(.. | select(._format == "flac_metadatablock"))
, (.. | select(._format == "flac_frame"))
] | bits;
def radix62sp: radix(62; "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; {
"0": 0, "1": 1, "2": 2, "3": 3,"4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9,
"a": 10, "b": 11, "c": 12, "d": 13, "e": 14, "f": 15, "g": 16,
"h": 17, "i": 18, "j": 19, "k": 20, "l": 21, "m": 22, "n": 23,
"o": 24, "p": 25, "q": 26, "r": 27, "s": 28, "t": 29, "u": 30,
"v": 31, "w": 32, "x": 33, "y": 34, "z": 35,
"A": 36, "B": 37, "C": 38, "D": 39, "E": 40, "F": 41, "G": 42,
"H": 43, "I": 44, "J": 45, "K": 46, "L": 47, "M": 48, "N": 49,
"O": 50, "P": 51, "Q": 52, "R": 53, "S": 54, "T": 55, "U": 56,
"V": 57, "W": 58, "X": 59, "Y": 60, "Z": 61
});
# "01:09:55.76" -> 4195.76 ->
# 4195.76 -> "01:09:55.76"
def duration:
def lpad($s; $w): ($s * ($w+1-length))[1:] + .;
def _string:
( split(":")
| map(tonumber)
| reverse
| [foreach .[] as $n (0; . + 1; pow(60; .-1) * $n)]
# sum smallest to largest seem to improve precision
| sort
| reverse
| add
);
def _number:
if . == 0 then 0
else
[ ( [ (recurse(if . > 0 then . div 60 else empty end) | . % 60)]
| reverse
| .[1:]
| map(tostring | lpad("0"; 2))
| join(":")
)
# ugly but float is not accurate enough
, ( tostring
| split(".")[1] // empty
| ".", .
)
] | join("")
end;
if . | type == "string" then _string
elif . | type == "number" then _number
else error("expected string or number") end;
# def recurse_foreach(init; update; extract):
# def _recurse_foreach($state; $c):
# (. as $c | ["_recurse_foreach $state", $state] | debug | $c) |
# (. as $b | ["_recurse_foreach $c", $c] | debug | $b) |
# foreach $c[]? as $e (
# $state
# ;
# (. as $c | ["update $state", $state] | debug | $c) |
# (. as $b | ["update $e", $e] | debug | $b) |
# null | _recurse_foreach({state: $state, e: $e} | update; $e)
# ;
# (. as $c | ["extract $state", $state] | debug | $c) |
# (. as $b | ["extract $e", $e] | debug | $b) |
# {state: $state, e: .} |
# extract
# )
# // $c;
# _recurse_foreach(init; .);
# # TODO: split? can't really switch on type
# def grep(f):
# if f | type == "string" then
# .. | select((._name | contains(f)) or (._value | contains(f)? // false))
# elif f | type == "number" then
# .. | select(._value == f)
# else
# .. | debug | select(f)?
# end;

66
dev/tmpl.go Normal file
View File

@ -0,0 +1,66 @@
package main
import (
"encoding/json"
"errors"
"io/ioutil"
"log"
"os"
"text/template"
)
func toInt(v interface{}) int {
switch v := v.(type) {
case float64:
return int(v)
case int:
return v
default:
return 0
}
}
func main() {
funcMap := template.FuncMap{
"xrange": func(args ...interface{}) (interface{}, error) {
if len(args) < 2 {
return nil, errors.New("need min and max argument")
}
min := toInt(args[0])
max := toInt(args[1])
var v []int
for i := min; i <= max; i++ {
v = append(v, i)
}
return v, nil
},
}
data := map[string]interface{}{}
if len(os.Args) > 1 {
r, err := os.Open(os.Args[1])
if err != nil {
log.Fatalf("%s: %s", os.Args[1], err)
}
defer r.Close()
_ = json.NewDecoder(r).Decode(&data)
}
templateBytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
panic(err)
}
templateStr := string(templateBytes)
tmpl, err := template.New("").Funcs(funcMap).Parse(templateStr)
if err != nil {
log.Fatalf("template.New: %s", err)
}
err = tmpl.Execute(os.Stdout, &data)
if err != nil {
log.Fatalf("tmpl.Execute: %s", err)
}
}

20
dev/x264sei.jq Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env fq -rf
# find and parse a x264 SEI payload
# looks like this:
# x264 - core 161 r3020 d198931 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
( ..
| select(._format == "avc_sei" and .uuid._symbol == "x264")
| .data
| string[0:-1]
| . as $full
| split("options: ")[1]
| ( [ .
| split(" ")[]
| split("=")
| {key: .[0], value: .[1]}
] | from_entries
) + {
full: $full
}
) // "No x264 SEI found"

136
doc/TODO.md Normal file
View File

@ -0,0 +1,136 @@
### TODO and ideas
#### CLI and REPL
- ctxstack index cancel wrong order skip?
- Pager for long output. Configurable? `$PAGER`? only explicit with some kind of syntax? `.. | less` but how?
- Nicer context cancel message
- `dump` cancel output of large root value, ex: `.frames`. Problem is dump is done by parent repl.
- Error position "^" pointer?
- Configurable history file/name?
- Reset color at prompt? context cancel
- Auto complete $variables
#### Language
- Variables somehow? global `$VAR`?
- Cleanup/Make binary buffers make sense.
- gojq uses golang `int` for slice indexes, might be issue for non-64bit cpus
#### Functions
- buffer truncate, left/right pad?
- `toimage`? can be done in CLI with "\x1b]1337" but maybe something for a UI?
- `toplot`?
- `dump` should handle binary, make column code more generic? share with `hexdump`? (bindump also?)
- `dump` colorize/notify row range discontinuity
- `dump` truncate long arrays in output unless verbose? `dd`?
- `hexdump` etc should handle binary non byte aligned data
- `tojvalue` handle binary somehow, base64 string, truncate? md5 digest etc? configurable? `{binarystring: "md5"}`
- Function to search in binary data, regexp?
- `grep` like function somehow?
- Cleanup rework cipher functions, `ctr(aes("key"), "iv")` or `cipher(ctr("iv"), aes("key))`?
- `open` when to close file?
- Safe mode interpreter?
- Allow/deny `open` in autocomplete
- `open` leak, file and ctxreadseeker
### Tests
- WRITE_ACTUAL does not preserve comment order
- empty file test
- CLI tests, raw write, colors?
- Interactive tests
- Completion tests
#### Documentation
- Nicer README, repl example (generate somehow)
- `help("topic")`?
- Generate from source
- `-n`, `inputs/0` and `input/0` behavior. Same as jq.
- Mention `empty.something`?
- `repl` behavior
- `1,2,3 | repl` will start 3 repl:s
- Behave same as CLi expres: iterate over all inputs `[1,2,3] | repl({}; .[])`
- Known issus and confusing things
- Symbolic number has to use `._symbol` for now. For example matroska ids are number ID:s that have symbolic string names.
- Use https://github.com/fadado/JBOL/blob/master/doc/JQ-Distilled.md notation
- Decoder write guide
- Endian inherited per buffer, reset on new buffer
- Invalid on zero length input, assert one valid frame etc
- Try validate input to make it not ambiguous with other decoders
- Try to not seek and read at end while validating or early, will break progress indicator if not
- Split bit flags etc into a field with subfields for each bit
- Try keep code as declarative as possible
- Split into multiple sub formats if possible
- See the decoded tree as user interface but still has to represent the actual bit structure
#### Decode
- Store original filename somewhere? root description?
- Nicer DSL
- More optional things? optional args or return value to modify?
- nicer "synthetic" values? now zero length
- Value should have raw, tranlated, symbolic and description? struct of map functions?
- If symbolic should resolve to string? would make `.field == "abc"` work instead of now `.field._symbolic`
- Array as root value, adts, avc_au etc
- Decode framed/limited? framed adds unknown fields?
- Add unknown for arrays?
- Cleanup and rethink nested buffers (zip, muxed like ogg)
- Root of nested buffer, what range?
- `dump` has some bug not showing buffer "nesting" level in the address column
- Endian bitfield helper (elf etc)
- Cleanup checksums, should just be fields and add warning if mismatch?
- Decoder in jq
- Use jq array/object syntax and pass around decode context, collect fields and build tree
- Somehow control/limit nested decoding, depth/exclude/include? `probe({depth:1})` etc? per format skip options?
- `json` decoder?
- Can't use range while decoding, not calculated yet
- Keep track of encoding for values, u16le, utf8, varint etc
#### Formats
- Pass argument to format
- Move format helpers like `mp4_path` to mp4 format code?
- Value decoder in jq `u(32)`, `u32`?
- Warnings and errors
- `mp4` sample counts
- `flac` truncated picture, mix sample rate, bitdepth etc?
- `protobuf` schema?
- `matroska` crc
- `mp4` styp segment test
- Document maturity/completeness
- Refactor *[]decode.Format into something more abstract, group?
- Add `dsf` format
- Make `json` format more normal? is a bit a of a special case now
#### Scripts
- Summary script, tree with format specific summaries like codec, sample count etc etc?
- Probe tool with common field names
- MIME codec encode/decoder "avc1.PPCCLL" etc https://tools.ietf.org/html/rfc6381#section-3.3
- Validate scripts for mp4, matroska
#### gojq
- `JQValue` tests
- Common errors with gojq? re-implemented now
- `JQValue` update/assign function in interface, proper or just one to return error for now
- `join` can be exponential, try add with strings faster, use add `["a","b","c"] | add`?
- `0b` -> `1.7976931348623157e+308` something fishy with bin/hex/... literals change
- Do something similar to `builtin.go` in gojq to speedup a bit
- remove `scopedump`?
#### Readline
- Use something else than `github.com/chzyer/readline`?
- Fix backspace as start clears whole line bug
- Undo ctrl+_ would be nice
#### Big things
- UI, web interface? multiple repl windows? nicer way of showing overlapping fiends in hex etc?
- jupyter notebook integration
- FUSE interface
- Lazy decode, should work on known sizes? could also save memory be re-decode?

24
doc/dev.md Normal file
View File

@ -0,0 +1,24 @@
# Implementation details
- fq uses a gojq fork that can be found at https://github.com/wader/gojq/tree/fq (the "fq" branch)
- cli readline uses raw mode so blocks ctrl-c to become a SIGINT
- TODO: `scope` and `scopedump` functions used to implement REPL completion
- TODO: Custom object interface used to traverse fq's field tree and to allowing a terse
syntax for comparing and working with fields, accessing child fields and special properties like `_range`.
## Decoder implementation help
- Main goal in the end is to produce a tree that is user-friendly and easy to work with.
So there are always excepts to these rules and sometimes it might be better to let the
decoder code be a bit ugly over producing a tree that is hard to understand.
- Try use same names, symbols, constant number base etc as in specification
- TODO: Decode only what you know. If possible let "parent" decide what to do with unknown bits by using `*Decode*Len/Range/Limit` funcitions
- Use sub decoders if possible for frames, metadata etc. You can pass data between them. Also makes it possible to call them separately
- Try to no decode to much as one field or value. A length encoded int could be two fields, a flags byte can be struct with bit fields.
- Try to have add symbols for all named constants.

BIN
doc/file.mp3 Normal file

Binary file not shown.

BIN
doc/file.mp4 Normal file

Binary file not shown.

2
doc/formats_list.jq Executable file
View File

@ -0,0 +1,2 @@
#!/usr/bin/env fq -rnf
[formats[] | "\(.name)"] | join(", ")

49
doc/formats_table.jq Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env fq -rnf
def code: "`\(.)`";
def nbsp: gsub(" "; "&nbsp;");
[ {
name: "Name",
desc: "Description",
uses: "Uses"
},
{
name: "-",
desc: "-",
uses: "-"
},
( formats
| to_entries[]
| {
name: ((.key | code) + " "),
desc: ((.value.description | nbsp) + " "),
uses: "<sub>\((((.value.dependencies | flatten | map(code)) | join(" "))? // ""))</sub>"
}
),
( [ formats
| to_entries[]
| . as $e
| select(.value.groups)
| .value.groups[] | {key: ., value: $e.key}
]
| reduce .[] as $e ({}; .[$e.key] += [$e.value])
| to_entries[]
| {
name: ((.key | code) + " "),
desc: "Group",
uses: "<sub>\(((.value | map(code)) | join(" ")))</sub>"
}
)
]
| table(
[.name, .desc, .uses];
[ ""
, (.[0] | . as $rc | $rc.string | rpad(" "; $rc.maxwidth))
, (.[1] | . as $rc | $rc.string | rpad(" "; $rc.maxwidth))
, .[2].string
, ""
] | join("|")
)

108
doc/mdsh.go Normal file
View File

@ -0,0 +1,108 @@
// Takes markdown on stdin and outputs same markdown with shell commands expanded
// lines inside sh sections ending with non-breaking-space " " will be kept and
// those starting with $ will also be exected as shell commands and output will
// be inserted.
// <pre sh>
// # comment
// $ echo test
// will be replaced
// </pre>
// Becomes:
// <pre sh>
// # comment
// $ echo test
// test
// </pre>
//
// ```sh (sh)
// # comment
// $ echo test
// will be replaced
// ```
// Becomes:
// ```sh (sh)
// # comment
// $ echo test
// test
// ```
//
// [echo test]: sh-start
// will be replaced
// [#]: sh-end
// Becomes:
// [echo test]: sh-start
// test
// [#]: sh-end
//nolint:gosec
package main
import (
"bufio"
"fmt"
"os"
"os/exec"
"regexp"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
nextLine := func() (string, bool) {
ok := scanner.Scan()
return scanner.Text(), ok
}
preShRe := regexp.MustCompile("<pre sh>")
shRe := regexp.MustCompile("```.* \\(sh\\)")
const nonBreakingSpace = rune(0xa0) // -> " "
shStartRe := regexp.MustCompile(`\[(.*)\]: sh-start`)
shEnd := "[#]: sh-end"
for {
l, ok := nextLine()
if !ok {
break
}
preShReMatches := preShRe.MatchString(l)
shReMatches := shRe.MatchString(l)
if preShReMatches || shReMatches {
fmt.Println(l)
for {
l, ok := nextLine()
if !ok || ((shReMatches && l == "```") || preShReMatches && l == "</pre>") {
fmt.Println(l)
break
}
rl := []rune(l)
if len(rl) >= 1 && rl[len(rl)-1] == nonBreakingSpace {
fmt.Println(l)
if strings.HasPrefix(l, "$") {
cmd := exec.Command("sh", "-c", l[1:len(l)-2])
o, _ := cmd.CombinedOutput()
fmt.Print(string(o))
}
}
}
} else if sm := shStartRe.FindStringSubmatch(l); sm != nil {
fmt.Println(l)
fmt.Println()
for {
l, ok := nextLine()
if !ok || l == shEnd {
break
}
}
cmd := exec.Command("sh", "-c", sm[1])
o, _ := cmd.CombinedOutput()
fmt.Print(string(o))
fmt.Println()
fmt.Println(shEnd)
} else {
fmt.Println(l)
}
}
}

247
doc/usage.md Normal file
View File

@ -0,0 +1,247 @@
### Arguments
<pre sh>
$ fq -h 
Usage: fq [OPTIONS] [EXPR] [FILE...]
--compact,-c Compact output
--decode,-d=NAME Decode format (probe)
--file,-f=PATH Read script from file
--formats Show supported formats
--help,-h Show help
--join-output,-j No newline between outputs
--null-output,-0 Null byte between outputs
--null-input,-n Null input (can still use input/0 or inputs/0)
--option,-o=KEY=VALUE,... Set option, eg: color=true
addrbase=16
bytecolors=0-0xff=brightwhite,0=brightblack,32-126:9-13=white
color=false
colors=array=white,dumpaddr=yellow,dumpheader=yellow+underline,error=brightred,false=yellow,index=white,null=brightblack,number=cyan,object=white,objectkey=brightblue,string=green,true=yellow,value=white
decodeprogress=true
depth=0
displaybytes=16
linebytes=16
raw=true
sizebase=10
unicode=false
verbose=false
--raw-output,-r Raw string output (without quotes)
--repl,-i Interactive REPL
--slurp,-s Read (slurp) all inputs into an array
--version,-v Show version (dev)
</pre>
- TODO: null input
- TODO: expressions
### Running
- TODO: stdin/stdout
### Interactive REPL
- TODO: tab completion, ctrl-d, ctrl-d, help
- TODO: nested, nested with generator
### Script
- TODO: #!
## Langauge
fq is based on the [jq language](https://stedolan.github.io/jq/) and for basic usage its syntax
is similar to how object and array access looks in JavaScript or JSON path, `.food[10]` etc.
To get the most out of fq it's recommended to learn more about jq, here are some good starting points:
- [jq manual](https://stedolan.github.io/jq/manual/)
- [jq Cookbook](https://github.com/stedolan/jq/wiki/Cookbook),
[FAQ](https://github.com/stedolan/jq/wiki/FAQ),
[Pitfalls](https://github.com/stedolan/jq/wiki/How-to:-Avoid-Pitfalls)
The most common beginner gotcha is probably jq's use of `;` and `,`. jq uses `;` as argument separator.
To call `f` with two arguments use `f(a; b)`. If you do `f(a, b)` you will pass a single generator
expression `a, b` to `f`.
### Differences to jq
- [gojq's differences to jq](https://github.com/itchyny/gojq#difference-to-jq),
notable is support for arbitrary-precision integers.
- Supports hexdecimal `0xab`, octal `0o77` and binary `0b101` integer literals
- Has bitwise operations, `band`, `bor`, `bxor`, `bsl`, `bsr`, `bnot`
- Has `div` integer division operator
- Try include `include "file?";` that don't fail if file is missing
- Possible for a value to act as a object with keys even when it's an array, number etc.
- There can be keys hidden from `keys` and `[]`. Used for, `_format`, `_bytes` etc.
- Some values do not support to be updated
### Functions
- All standard library functions from jq
- `open` open file for reading
- `probe` or `decode` try to automatically detect format and decode
- `mp3`, `matroska`, ..., `<name>`, `decode([name])` try decode as format
- `d`/`display` display value
- `v`/`verbose` display value verbosely
- `p`/`preview` show preview of field tree
- `hd`/`hexdump` hexdump value
- `repl` nested REPL
### Decoded values (TODO: better name?)
When you decode something successfully in fq you will get a value. A value work a bit like
jq object with special abilities and is used to represent a tree structure of the decoded
binary data. Each value always has a name, type and a bit range.
A value has these special keys:
- `_name` name of value
- `_value` jq value of value
- `_start` bit range start
- `_stop` bit range stop
- `_len` bit range length (TODO: rename)
- `_bits` bits in range as a binary
- `_bytes` bits in range as binary using byte units
- `_path` jq path to value
- `_unknown` value is un-decoded gap
- `_symbol` symbolic string representation of value (optional)
- `_description` longer description of value (optional)
- `_format` name of decoded format (optional)
- `_error` error message (optional)
- TODO: unknown gaps
### Binary and IO lists
- TODO: similar to erlang io lists, [], binary, string (utf8) and numbers
## Configuration
To add own functions you can use `init.fq` that will be read from
- `$HOME/Library/Application Support/fq/init.jq` on macOS
- `$HOME/.config/fq/init.jq` on Linux, BSD etc
- `%AppData%\fq\init.jq` on Windows (TODO: not tested)
## Decoders
[./formats_table.jq]: sh-start
|Name |Description |Uses|
|- |- |-|
|`aac_frame` |Advanced&nbsp;Audio&nbsp;Coding&nbsp;frame |<sub></sub>|
|`adts` |Audio&nbsp;Data&nbsp;Transport&nbsp;Stream |<sub>`adts_frame`</sub>|
|`adts_frame` |Audio&nbsp;Data&nbsp;Transport&nbsp;Stream&nbsp;frame |<sub>`aac_frame`</sub>|
|`apev2` |APEv2&nbsp;metadata&nbsp;tag |<sub>`image`</sub>|
|`av1_ccr` |AV1&nbsp;Codec&nbsp;Configuration&nbsp;Record |<sub></sub>|
|`av1_frame` |AV1&nbsp;frame |<sub>`av1_obu`</sub>|
|`av1_obu` |AV1&nbsp;Open&nbsp;Bitstream&nbsp;Unit |<sub></sub>|
|`avc_au` |H.264/AVC&nbsp;Access&nbsp;Unit |<sub>`avc_nalu`</sub>|
|`avc_dcr` |H.264/AVC&nbsp;Decoder&nbsp;Configuration&nbsp;Record |<sub>`avc_nalu`</sub>|
|`avc_nalu` |H.264/AVC&nbsp;Network&nbsp;Access&nbsp;Layer&nbsp;Unit |<sub>`avc_sps` `avc_pps` `avc_sei`</sub>|
|`avc_pps` |H.264/AVC&nbsp;Picture&nbsp;Parameter&nbsp;Set |<sub></sub>|
|`avc_sei` |H.264/AVC&nbsp;Supplemental&nbsp;Enhancement&nbsp;Information |<sub></sub>|
|`avc_sps` |H.264/AVC&nbsp;Sequence&nbsp;Parameter&nbsp;Set |<sub></sub>|
|`bzip2` |bzip2&nbsp;compression |<sub>`probe`</sub>|
|`dns` |DNS&nbsp;packet |<sub></sub>|
|`elf` |Executable&nbsp;and&nbsp;Linkable&nbsp;Format |<sub></sub>|
|`exif` |Exchangeable&nbsp;Image&nbsp;File&nbsp;Format |<sub></sub>|
|`flac` |Free&nbsp;Lossless&nbsp;Audio&nbsp;Codec&nbsp;file |<sub>`flac_metadatablock` `flac_frame`</sub>|
|`flac_frame` |FLAC&nbsp;frame |<sub></sub>|
|`flac_metadatablock` |FLAC&nbsp;metadatablock |<sub>`flac_picture` `vorbis_comment`</sub>|
|`flac_picture` |FLAC&nbsp;metadatablock&nbsp;picture |<sub>`image`</sub>|
|`gif` |Graphics&nbsp;Interchange&nbsp;Format |<sub></sub>|
|`gzip` |gzip&nbsp;compression |<sub>`probe`</sub>|
|`hevc_au` |H.265/HEVC&nbsp;Access&nbsp;Unit |<sub>`hevc_nalu`</sub>|
|`hevc_dcr` |H.265/HEVC&nbsp;Decoder&nbsp;Configuration&nbsp;Record |<sub>`hevc_nalu`</sub>|
|`hevc_nalu` |H.265/HEVC&nbsp;Network&nbsp;Access&nbsp;Layer&nbsp;Unit |<sub></sub>|
|`icc_profile` |International&nbsp;Color&nbsp;Consortium&nbsp;profile |<sub></sub>|
|`id3v1` |ID3v1&nbsp;metadata |<sub></sub>|
|`id3v11` |ID3v1.1&nbsp;metadata |<sub></sub>|
|`id3v2` |ID3v2&nbsp;metadata |<sub>`image`</sub>|
|`jpeg` |Joint&nbsp;Photographic&nbsp;Experts&nbsp;Group&nbsp;file |<sub>`exif` `icc_profile`</sub>|
|`json` |JSON |<sub></sub>|
|`matroska` |Matroska&nbsp;file |<sub>`aac_frame` `av1_ccr` `av1_frame` `avc_au` `avc_dcr` `flac_frame` `flac_metadatablock` `hevc_au` `hevc_dcr` `image` `mp3_frame` `mpeg_asc` `mpeg_pes_packet` `mpeg_spu` `opus_packet` `vorbis_packet` `vp8_frame` `vp9_cfm` `vp9_frame`</sub>|
|`mp3` |MP3&nbsp;file |<sub>`id3v2` `id3v1` `id3v11` `apev2` `mp3_frame`</sub>|
|`mp3_frame` |MPEG&nbsp;audio&nbsp;layer&nbsp;3&nbsp;frame |<sub>`xing`</sub>|
|`mp4` |MPEG-4&nbsp;file&nbsp;and&nbsp;similar |<sub>`aac_frame` `av1_ccr` `av1_frame` `flac_frame` `flac_metadatablock` `id3v2` `image` `jpeg` `mp3_frame` `avc_au` `avc_dcr` `mpeg_es` `hevc_au` `hevc_dcr` `mpeg_pes_packet` `opus_packet` `protobuf_widevine` `vorbis_packet` `vp9_frame` `vpx_ccr`</sub>|
|`mpeg_asc` |MPEG-4&nbsp;Audio&nbsp;Specific&nbsp;Config |<sub></sub>|
|`mpeg_es` |MPEG&nbsp;Elementary&nbsp;Stream |<sub>`mpeg_asc` `vorbis_packet`</sub>|
|`mpeg_pes` |MPEG&nbsp;Packetized&nbsp;elementary&nbsp;stream |<sub>`mpeg_pes_packet` `mpeg_spu`</sub>|
|`mpeg_pes_packet` |MPEG&nbsp;Packetized&nbsp;elementary&nbsp;stream&nbsp;packet |<sub></sub>|
|`mpeg_spu` |Sub&nbsp;Picture&nbsp;Unit&nbsp;(DVD&nbsp;subtitle) |<sub></sub>|
|`mpeg_ts` |MPEG&nbsp;Transport&nbsp;Stream |<sub></sub>|
|`ogg` |OGG&nbsp;file |<sub>`ogg_page` `vorbis_packet` `opus_packet`</sub>|
|`ogg_page` |OGG&nbsp;page |<sub></sub>|
|`opus_packet` |Opus&nbsp;packet |<sub>`vorbis_comment`</sub>|
|`png` |Portable&nbsp;Network&nbsp;Graphics&nbsp;file |<sub>`icc_profile` `exif`</sub>|
|`protobuf` |Protobuf |<sub></sub>|
|`protobuf_widevine` |Widevine&nbsp;protobuf |<sub>`protobuf`</sub>|
|`raw` |Raw&nbsp;bits |<sub></sub>|
|`tar` |Tar&nbsp;archive |<sub>`probe`</sub>|
|`tiff` |Tag&nbsp;Image&nbsp;File&nbsp;Format |<sub>`icc_profile`</sub>|
|`vorbis_comment` |Vorbis&nbsp;comment |<sub>`flac_picture`</sub>|
|`vorbis_packet` |Vorbis&nbsp;packet |<sub>`vorbis_comment`</sub>|
|`vp8_frame` |VP8&nbsp;frame |<sub></sub>|
|`vp9_cfm` |VP9&nbsp;Codec&nbsp;Feature&nbsp;Metadata |<sub></sub>|
|`vp9_frame` |VP9&nbsp;frame |<sub></sub>|
|`vpx_ccr` |VPX&nbsp;Codec&nbsp;Configuration&nbsp;Record |<sub></sub>|
|`wav` |WAV&nbsp;file |<sub>`id3v2` `id3v1` `id3v11`</sub>|
|`webp` |WebP&nbsp;image |<sub>`vp8_frame`</sub>|
|`xing` |Xing&nbsp;header |<sub></sub>|
|`image` |Group |<sub>`gif` `jpeg` `png` `tiff` `webp`</sub>|
|`probe` |Group |<sub>`adts` `bzip2` `elf` `flac` `gif` `gzip` `jpeg` `json` `matroska` `mp3` `mp4` `mpeg_ts` `ogg` `png` `tar` `tiff` `wav` `webp`</sub>|
[#]: sh-end
TODO: format graph?
## Own decoders and use as library
TODO
### Useful tricks
#### `.. | select(...)` fails with `expected an ... but got: ...`
Try add `select(...)?` the select expression assumes it will get and object etc.
#### Manual decode
Sometimes fq fails to decode or you know there is valid data buried inside some binary or maybe
you know the format of some unknown value. Then you can decode manually.
<pre>
# try decode a `mp3_frame` that failed to decode
$ fq file.mp3 .unknown0 mp3_frame
# skip first 10 bytes then decode as `mp3_frame`
$ fq file.mp3 .unknown0._bytes[10:] mp3_frame
</pre>
#### appending to array is slow
Try to use `map` or `foreach` instead.
#### Use `print` and `println` to produce more friendly compact output
```
> [[0,"a"],[1,"b"]]
[
[
0,
"a"
],
[
1,
"b"
]
]
> [[0,"a"],[1,"b"]] | .[] | "\(.[0]): \(.[1])" | println
0: a
1: b
```
#### Run interactive mode with no input
```sh
fq -i
null>
```

32
format/all/all.go Normal file
View File

@ -0,0 +1,32 @@
// Package all imports all standard formats
package all
import (
_ "fq/format/ape"
_ "fq/format/av1"
_ "fq/format/bzip2"
_ "fq/format/dns"
_ "fq/format/elf"
_ "fq/format/flac"
_ "fq/format/gif"
_ "fq/format/gzip"
_ "fq/format/icc"
_ "fq/format/id3"
_ "fq/format/jpeg"
_ "fq/format/json"
_ "fq/format/matroska"
_ "fq/format/mp3"
_ "fq/format/mp4"
_ "fq/format/mpeg"
_ "fq/format/ogg"
_ "fq/format/opus"
_ "fq/format/png"
_ "fq/format/protobuf"
_ "fq/format/raw"
_ "fq/format/tar"
_ "fq/format/tiff"
_ "fq/format/vorbis"
_ "fq/format/vpx"
_ "fq/format/wav"
_ "fq/format/webp"
)

76
format/ape/ape.go Normal file
View File

@ -0,0 +1,76 @@
package ape
// http://wiki.hydrogenaud.io/index.php?title=APE_Tags_Header
// TODO: havent been tested after refactor
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
var imageFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.APEV2,
Description: "APEv2 metadata tag",
DecodeFn: apev2Decode,
Dependencies: []decode.Dependency{
{Names: []string{format.IMAGE}, Formats: &imageFormat},
},
})
}
func apev2Decode(d *decode.D, in interface{}) interface{} {
d.Endian = decode.LittleEndian
headerFooterFn := func(d *decode.D, name string) uint64 {
var tagCount uint64
d.FieldStructFn(name, func(d *decode.D) {
d.FieldValidateUTF8("preamble", "APETAGEX")
d.FieldU32("version")
d.FieldU32("tag_size")
tagCount = d.FieldU32("item_count")
d.FieldU32("flags")
d.FieldValidateZeroPadding("reserved", 64)
})
return tagCount
}
tagCount := headerFooterFn(d, "header")
d.FieldArrayFn("tags", func(d *decode.D) {
for i := uint64(0); i < tagCount; i++ {
d.FieldStructFn("tag", func(d *decode.D) {
itemSize := d.FieldU32("item_size")
var binaryItem bool
d.FieldStructFn("item_flags", func(d *decode.D) {
d.FieldU6("unused0")
binaryItem = d.FieldBool("binary")
d.FieldU25("unused1")
})
keyLen := d.PeekFindByte(0, -1)
d.FieldUTF8("key", int(keyLen))
d.FieldU8("key_terminator")
if binaryItem {
d.DecodeLenFn(int64(itemSize)*8, func(d *decode.D) {
d.FieldStrNullTerminated("filename")
// assume image if binary
dv, _, _ := d.FieldTryDecode("value", imageFormat)
if dv == nil {
// TODO: framed and unknown instead?
d.FieldBitBufLen("value", d.BitsLeft())
}
})
} else {
d.FieldUTF8("value", int(itemSize))
}
})
}
})
// TODO: check footer flag
headerFooterFn(d, "footer")
return nil
}

45
format/av1/ccr.go Normal file
View File

@ -0,0 +1,45 @@
package av1
// https://aomediacodec.github.io/av1-spec/av1-spec.pdf
// https://github.com/ietf-wg-cellar/matroska-specification/blob/master/codec/av1.md
// https://cdn.rawgit.com/AOMediaCodec/av1-isobmff/v1.0.0/
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.AV1_CCR,
Description: "AV1 Codec Configuration Record",
DecodeFn: ccrDecode,
})
}
func ccrDecode(d *decode.D, in interface{}) interface{} {
d.FieldU1("marker")
d.FieldU7("version")
d.FieldU3("seq_profile")
d.FieldU5("seq_level_idx_0")
d.FieldU1("seq_tier_0")
d.FieldU1("high_bitdepth")
d.FieldU1("twelve_bit")
d.FieldU1("monochrome")
d.FieldU1("chroma_subsampling_x")
d.FieldU1("chroma_subsampling_y")
d.FieldU2("chroma_sample_position")
d.FieldU3("reserved = 0")
initalPreDelay := d.FieldBool("initial_presentation_delay_present")
if initalPreDelay {
d.FieldU4("initial_presentation_delay_minus_one")
} else {
d.FieldU4("reserved")
}
if d.BitsLeft() > 0 {
d.FieldBitBufLen("config_obus", d.BitsLeft())
}
return nil
}

34
format/av1/frame.go Normal file
View File

@ -0,0 +1,34 @@
package av1
// matroska "Low Overhead Bitstream Format syntax" format
// "Each Block contains one Temporal Unit containing one or more OBUs. Each OBU stored in the Block MUST contain its header and its payload."
// "The OBUs in the Block follow the [Low Overhead Bitstream Format syntax]. They MUST have the [obu_has_size_field] set to 1 except for the last OBU in the frame, for which [obu_has_size_field] MAY be set to 0, in which case it is assumed to fill the remainder of the frame."
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
var obuFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.AV1_FRAME,
Description: "AV1 frame",
DecodeFn: frameDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.AV1_OBU}, Formats: &obuFormat},
},
})
}
func frameDecode(d *decode.D, in interface{}) interface{} {
d.FieldArrayFn("frame", func(d *decode.D) {
for d.NotEnd() {
d.FieldDecode("obu", obuFormat)
}
})
return nil
}

94
format/av1/obu.go Normal file
View File

@ -0,0 +1,94 @@
package av1
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.AV1_OBU,
Description: "AV1 Open Bitstream Unit",
DecodeFn: obuDecode,
})
}
const (
OBU_SEQUENCE_HEADER = 1
OBU_TEMPORAL_DELIMITER = 2
OBU_FRAME_HEADER = 3
OBU_TILE_GROUP = 4
OBU_METADATA = 5
OBU_FRAME = 6
OBU_REDUNDANT_FRAME_HEADER = 7
OBU_TILE_LIST = 8
OBU_PADDING = 15
)
var obuTypeNames = map[uint64]string{
OBU_SEQUENCE_HEADER: "OBU_SEQUENCE_HEADER",
OBU_TEMPORAL_DELIMITER: "OBU_TEMPORAL_DELIMITER",
OBU_FRAME_HEADER: "OBU_FRAME_HEADER",
OBU_TILE_GROUP: "OBU_TILE_GROUP",
OBU_METADATA: "OBU_METADATA",
OBU_FRAME: "OBU_FRAME",
OBU_REDUNDANT_FRAME_HEADER: "OBU_REDUNDANT_FRAME_HEADER",
OBU_TILE_LIST: "OBU_TILE_LIST",
OBU_PADDING: "OBU_PADDING",
}
func leb128(d *decode.D) uint64 {
var v uint64
for i := 0; i < 8; i++ {
b := d.U8()
v = v | (b&0x7f)<<(i*7)
if b&0x80 == 0 {
break
}
}
return v
}
func fieldLeb128(d *decode.D, name string) uint64 {
return d.FieldUFn(name, func() (uint64, decode.DisplayFormat, string) {
return leb128(d), decode.NumberDecimal, ""
})
}
func obuDecode(d *decode.D, in interface{}) interface{} {
var obuType uint64
var obuSize int64
hasExtension := false
hasSizeField := false
d.FieldStructFn("header", func(d *decode.D) {
d.FieldU1("forbidden_bit")
obuType, _ = d.FieldStringMapFn("type", obuTypeNames, "Reserved", d.U4, decode.NumberDecimal)
hasExtension = d.FieldBool("extension_flag")
hasSizeField = d.FieldBool("has_size_field")
d.FieldU1("reserved_1bit")
if hasExtension {
d.FieldU3("temporal_id")
d.FieldU2("spatial_id")
d.FieldU3("extension_header_reserved_3bits")
}
})
if hasSizeField {
obuSize = int64(fieldLeb128(d, "size"))
} else {
obuSize = d.BitsLeft() / 8
if hasExtension {
obuSize--
}
}
_ = obuType
if d.BitsLeft() > 0 {
d.FieldBitBufLen("data", obuSize*8)
}
return nil
}

120
format/bzip2/bzip2.go Normal file
View File

@ -0,0 +1,120 @@
package bzip2
// https://en.wikipedia.org/wiki/Bzip2
// https://github.com/dsnet/compress/blob/master/doc/bzip2-format.pdf
// TODO: multiple streams, possible to figure out length of compressed? use footer magic?
// TODO: empty file, no streams
import (
"bytes"
"compress/bzip2"
"fq/format"
"fq/format/registry"
"fq/pkg/bitio"
"fq/pkg/decode"
"hash/crc32"
"io"
)
var probeFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.BZIP2,
Description: "bzip2 compression",
Groups: []string{format.PROBE},
DecodeFn: gzDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.PROBE}, Formats: &probeFormat},
},
})
}
func gzDecode(d *decode.D, in interface{}) interface{} {
// moreStreams := true
// d.FieldArrayFn("streams", func(d *decode.D) {
// for moreStreams {
// d.FieldStructFn("stream", func(d *decode.D) {
d.FieldValidateUTF8("magic", "BZ")
d.FieldU8("version")
d.FieldU8("hundred_k_blocksize")
d.FieldStructFn("block", func(d *decode.D) {
const blockHeaderMagic = 0x31_41_59_26_53_59
// if d.PeekBits(48) != blockHeaderMagic {
// moreStreams = false
// return
// }
d.FieldValidateUFn("compressed_magic", blockHeaderMagic, d.U48)
d.FieldU32("crc")
d.FieldU1("randomised")
d.FieldU24("origptr")
d.FieldU16("syncmapl1")
d.SeekRel(-16)
ranges := 0
for i := 0; i < 16; i++ {
if d.Bool() {
ranges++
}
}
d.FieldBitBufLen("syncmapl2", int64(ranges)*16)
numTrees := d.FieldU3("num_trees")
selectorsUsed := d.FieldU15("num_sels")
selectorsI := uint64(0)
d.FieldArrayLoopFn("selector_list", func() bool { return selectorsI < selectorsUsed }, func(d *decode.D) {
d.FieldU1("selector")
selectorsI++
})
treesI := uint64(0)
d.FieldArrayLoopFn("trees", func() bool { return treesI < numTrees }, func(d *decode.D) {
d.FieldUFn("tree", func() (uint64, decode.DisplayFormat, string) {
l := d.U5()
if !d.Bool() {
return l, decode.NumberDecimal, ""
}
if d.Bool() {
l--
} else {
l++
}
return l, decode.NumberDecimal, ""
})
treesI++
})
})
compressedBB := d.BitBufRange(0, d.Len())
deflateR := bzip2.NewReader(compressedBB)
uncompressed := &bytes.Buffer{}
crc32W := crc32.NewIEEE()
if _, err := io.Copy(io.MultiWriter(uncompressed, crc32W), deflateR); err != nil { //nolint:gosec
d.Invalid(err.Error())
}
// calculatedCRC32 := crc32W.Sum(nil)
uncompressedBB := bitio.NewBufferFromBytes(uncompressed.Bytes(), -1)
dv, _, _ := d.FieldTryDecodeBitBuf("uncompressed", uncompressedBB, probeFormat)
if dv == nil {
d.FieldRootBitBuf("uncompressed", uncompressedBB)
}
// if calculatedCRC32 != nil {
// d.FieldChecksumLen("crc32", 32, calculatedCRC32, decode.LittleEndian)
// } else {
// d.FieldU32LE("crc32")
// }
// d.FieldU48("footer_magic")
// d.FieldU32("crc")
// byte align padding
// })
// moreStreams = false
// }
// })
return nil
}

339
format/default.go Normal file
View File

@ -0,0 +1,339 @@
package format
import (
"fq/pkg/bitio"
"fq/pkg/ranges"
)
const (
ALL = "all"
PROBE = "probe"
RAW = "raw"
// TODO: rename PROBE_* something?
IMAGE = "image"
JSON = "json"
AAC_FRAME = "aac_frame"
ADTS = "adts"
ADTS_FRAME = "adts_frame"
APEV2 = "apev2"
AV1_CCR = "av1_ccr"
AV1_FRAME = "av1_frame"
AV1_OBU = "av1_obu"
BZIP2 = "bzip2"
DNS = "dns"
ELF = "elf"
EXIF = "exif"
FLAC = "flac"
FLAC_FRAME = "flac_frame"
FLAC_METADATABLOCK = "flac_metadatablock"
FLAC_PICTURE = "flac_picture"
FLV = "flv" // TODO:
GIF = "gif"
GZIP = "gzip"
ICC_PROFILE = "icc_profile"
ID3V1 = "id3v1"
ID3V11 = "id3v11"
ID3V2 = "id3v2"
JPEG = "jpeg"
MATROSKA = "matroska"
MP3 = "mp3"
MP3_FRAME = "mp3_frame"
XING = "xing"
MP4 = "mp4"
MPEG_ASC = "mpeg_asc"
AVC_DCR = "avc_dcr"
AVC_SPS = "avc_sps"
AVC_PPS = "avc_pps"
AVC_SEI = "avc_sei"
AVC_NALU = "avc_nalu"
AVC_AU = "avc_au"
HEVC_AU = "hevc_au"
HEVC_NALU = "hevc_nalu"
HEVC_DCR = "hevc_dcr"
MPEG_ES = "mpeg_es"
MPEG_PES = "mpeg_pes"
MPEG_PES_PACKET = "mpeg_pes_packet"
MPEG_SPU = "mpeg_spu"
MPEG_TS = "mpeg_ts"
OGG = "ogg"
OGG_PAGE = "ogg_page"
OPUS_PACKET = "opus_packet"
PNG = "png"
PROTOBUF = "protobuf"
PROTOBUF_WIDEVINE = "protobuf_widevine"
TAR = "tar"
TIFF = "tiff"
VORBIS_COMMENT = "vorbis_comment"
VORBIS_PACKET = "vorbis_packet"
VP8_FRAME = "vp8_frame"
VP9_FRAME = "vp9_frame"
VP9_CFM = "vp9_cfm"
VPX_CCR = "vpx_ccr"
WAV = "wav"
WEBP = "webp"
)
type FlacMetadatablockStreamInfo struct {
SampleRate uint64
BitPerSample uint64
TotalSamplesInStream uint64
MD5Range ranges.Range
}
type FlacMetadatablockOut struct {
IsLastBlock bool
HasStreamInfo bool
StreamInfo FlacMetadatablockStreamInfo
}
type FlacFrameIn struct {
SamplesBuf []byte
StreamInfo FlacMetadatablockStreamInfo
}
type FlacFrameOut struct {
SamplesBuf []byte
Samples uint64
Channels int
BitsPerSample int
}
type OggPageOut struct {
IsLastPage bool
IsFirstPage bool
IsContinuedPacket bool
StreamSerialNumber uint32
SequenceNo uint32
Segments []*bitio.Buffer // TODO: bitio.Reader (bitio.MultiReader internally?)
}
type AvcIn struct {
LengthSize uint64
}
type AvcDcrOut struct {
LengthSize uint64
}
type HevcIn struct {
LengthSize uint64
}
type HevcDcrOut struct {
LengthSize uint64
}
// based on ffmpeg libavformat/isom.c ff_mp4_obj_type
const (
MPEGObjectTypeMOV_TEXT = 0x08
MPEGObjectTypeMPEG4 = 0x20
MPEGObjectTypeH264 = 0x21
MPEGObjectTypeHEVC = 0x23
MPEGObjectTypeAAC = 0x40
MPEGObjectTypeMPEG2VideoMain = 0x61 /* MPEG-2 Main */
MPEGObjectTypeMPEG2VideoSimple = 0x60 /* MPEG-2 Simple */
MPEGObjectTypeMPEG2VideoSNR = 0x62 /* MPEG-2 SNR */
MPEGObjectTypeMPEG2VideoSpatial = 0x63 /* MPEG-2 Spatial */
MPEGObjectTypeMPEG2VideoHigh = 0x64 /* MPEG-2 High */
MPEGObjectTypeMPEG2Video422 = 0x65 /* MPEG-2 422 */
MPEGObjectTypeAACMain = 0x66 /* MPEG-2 AAC Main */
MPEGObjectTypeAACLow = 0x67 /* MPEG-2 AAC Low */
MPEGObjectTypeAACSSR = 0x68 /* MPEG-2 AAC SSR */
MPEGObjectTypeMP32MP3 = 0x69 /* 13818-3 */
MPEGObjectTypeMPEG1VIDEO = 0x6a /* 11172-2 */
MPEGObjectTypeMP3 = 0x6b /* 11172-3 */
MPEGObjectTypeMJPEG = 0x6c /* 10918-1 */
MPEGObjectTypePNG = 0x6d
MPEGObjectTypeJPEG2000 = 0x6e /* 15444-1 */
MPEGObjectTypeVC1 = 0xa3
MPEGObjectTypeDIRAC = 0xa4
MPEGObjectTypeAC3 = 0xa5
MPEGObjectTypeEAC3 = 0xa6
MPEGObjectTypeDTS = 0xa9 /* mp4ra.org */
MPEGObjectTypeOPUS = 0xad /* mp4ra.org */
MPEGObjectTypeVP9 = 0xb1 /* mp4ra.org */
MPEGObjectTypeFLAC = 0xc1 /* nonstandard, update when there is a standard value */
MPEGObjectTypeTSCC2 = 0xd0 /* nonstandard, camtasia uses it */
MPEGObjectTypeEVRC = 0xd1 /* nonstandard, pvAuthor uses it */
MPEGObjectTypeVORBIS = 0xdd /* nonstandard, gpac uses it */
MPEGObjectTypeDVDSubtitle = 0xe0 /* nonstandard, see unsupported-embedded-subs-2.mp4 */
MPEGObjectTypeQCELP = 0xe1
MPEGObjectTypeMPEG4SYSTEMS1 = 0x01
MPEGObjectTypeMPEG4SYSTEMS2 = 0x02
MPEGObjectTypeNONE = 0
)
var MpegObjectTypeNames = map[uint64]string{
MPEGObjectTypeMOV_TEXT: "MPEGObjectTypeMOV_TEXT",
MPEGObjectTypeMPEG4: "MPEGObjectTypeMPEG4",
MPEGObjectTypeH264: "MPEGObjectTypeH264",
MPEGObjectTypeHEVC: "MPEGObjectTypeHEVC",
MPEGObjectTypeAAC: "MPEGObjectTypeAAC",
MPEGObjectTypeMPEG2VideoMain: "MPEGObjectTypeMPEG2VideoMain",
MPEGObjectTypeMPEG2VideoSimple: "MPEGObjectTypeMPEG2VideoSimple",
MPEGObjectTypeMPEG2VideoSNR: "MPEGObjectTypeMPEG2VideoSNR",
MPEGObjectTypeMPEG2VideoSpatial: "MPEGObjectTypeMPEG2VideoSpatial",
MPEGObjectTypeMPEG2VideoHigh: "MPEGObjectTypeMPEG2VideoHigh",
MPEGObjectTypeMPEG2Video422: "MPEGObjectTypeMPEG2Video422",
MPEGObjectTypeAACMain: "MPEGObjectTypeAACMain",
MPEGObjectTypeAACLow: "MPEGObjectTypeAACLow",
MPEGObjectTypeAACSSR: "MPEGObjectTypeAACSSR",
MPEGObjectTypeMP32MP3: "MPEGObjectTypeMP32MP3",
MPEGObjectTypeMPEG1VIDEO: "MPEGObjectTypeMPEG1VIDEO",
MPEGObjectTypeMP3: "MPEGObjectTypeMP3",
MPEGObjectTypeMJPEG: "MPEGObjectTypeMJPEG",
MPEGObjectTypePNG: "MPEGObjectTypePNG",
MPEGObjectTypeJPEG2000: "MPEGObjectTypeJPEG2000",
MPEGObjectTypeVC1: "MPEGObjectTypeVC1",
MPEGObjectTypeDIRAC: "MPEGObjectTypeDIRAC",
MPEGObjectTypeAC3: "MPEGObjectTypeAC3",
MPEGObjectTypeEAC3: "MPEGObjectTypeEAC3",
MPEGObjectTypeDTS: "MPEGObjectTypeDTS",
MPEGObjectTypeOPUS: "MPEGObjectTypeOPUS",
MPEGObjectTypeVP9: "MPEGObjectTypeVP9",
MPEGObjectTypeFLAC: "MPEGObjectTypeFLAC",
MPEGObjectTypeTSCC2: "MPEGObjectTypeTSCC2",
MPEGObjectTypeEVRC: "MPEGObjectTypeEVRC",
MPEGObjectTypeVORBIS: "MPEGObjectTypeVORBIS",
MPEGObjectTypeDVDSubtitle: "MPEGObjectTypeDVDSubtitle",
MPEGObjectTypeQCELP: "MPEGObjectTypeQCELP",
MPEGObjectTypeMPEG4SYSTEMS1: "MPEGObjectTypeMPEG4SYSTEMS1",
MPEGObjectTypeMPEG4SYSTEMS2: "MPEGObjectTypeMPEG4SYSTEMS2",
MPEGObjectTypeNONE: "MPEGObjectTypeNONE",
}
type MpegDecoderConfig struct {
ObjectType int
ASCObjectType int
}
type MpegEsOut struct {
DecoderConfigs []MpegDecoderConfig
}
type ProtoBufType int
const (
ProtoBufTypeInt32 = iota
ProtoBufTypeInt64
ProtoBufTypeUInt32
ProtoBufTypeUInt64
ProtoBufTypeSInt32
ProtoBufTypeSInt64
ProtoBufTypeBool
ProtoBufTypeEnum
ProtoBufTypeFixed64
ProtoBufTypeSFixed64
ProtoBufTypeDouble
ProtoBufTypeString
ProtoBufTypeBytes
ProtoBufTypeMessage
ProtoBufTypePackedRepeated
ProtoBufTypeFixed32
ProtoBufTypeSFixed32
ProtoBufTypeFloat
)
var ProtoBufTypeNames = map[uint64]string{
ProtoBufTypeInt32: "Int32",
ProtoBufTypeInt64: "Int64",
ProtoBufTypeUInt32: "UInt32",
ProtoBufTypeUInt64: "UInt64",
ProtoBufTypeSInt32: "SInt32",
ProtoBufTypeSInt64: "SInt64",
ProtoBufTypeBool: "Bool",
ProtoBufTypeEnum: "Enum",
ProtoBufTypeFixed64: "Fixed64",
ProtoBufTypeSFixed64: "SFixed64",
ProtoBufTypeDouble: "Double",
ProtoBufTypeString: "String",
ProtoBufTypeBytes: "Bytes",
ProtoBufTypeMessage: "Message",
ProtoBufTypePackedRepeated: "PackedRepeated",
ProtoBufTypeFixed32: "Fixed32",
ProtoBufTypeSFixed32: "SFixed32",
ProtoBufTypeFloat: "Float",
}
type ProtoBufField struct {
Type int
Name string
Message ProtoBufMessage
Enums map[uint64]string
}
type ProtoBufMessage map[int]ProtoBufField
type ProtoBufIn struct {
Message ProtoBufMessage
}
const (
MPEGAudioObjectTypeMain = 1
MPEGAudioObjectTypeLC = 2
MPEGAudioObjectTypeSSR = 3
MPEGAudioObjectTypeLTP = 4
MPEGAudioObjectTypeSBR = 5
MPEGAudioObjectTypeER_AAC_LD = 23
)
var MPEGAudioObjectTypeNames = map[uint64]string{
0: "Null",
MPEGAudioObjectTypeMain: "AAC Main",
MPEGAudioObjectTypeLC: "AAC LC (Low Complexity)",
MPEGAudioObjectTypeSSR: "AAC SSR (Scalable Sample Rate)",
MPEGAudioObjectTypeLTP: "AAC LTP (Long Term Prediction)",
MPEGAudioObjectTypeSBR: "SBR (Spectral Band Replication)",
6: "AAC Scalable",
7: "TwinVQ",
8: "CELP (Code Excited Linear Prediction)",
9: "HXVC (Harmonic Vector eXcitation Coding)",
10: "Reserved",
11: "Reserved",
12: "TTSI (Text-To-Speech Interface)",
13: "Main Synthesis",
14: "Wavetable Synthesis",
15: "General MIDI",
16: "Algorithmic Synthesis and Audio Effects",
17: "ER (Error Resilient) AAC LC",
18: "Reserved",
19: "ER AAC LTP",
20: "ER AAC Scalable",
21: "ER TwinVQ",
22: "ER BSAC (Bit-Sliced Arithmetic Coding)",
MPEGAudioObjectTypeER_AAC_LD: "ER AAC LD (Low Delay)",
24: "ER CELP",
25: "ER HVXC",
26: "ER HILN (Harmonic and Individual Lines plus Noise)",
27: "ER Parametric",
28: "SSC (SinuSoidal Coding)",
29: "PS (Parametric Stereo)",
30: "MPEG Surround",
31: "(Escape value)",
32: "Layer-1",
33: "Layer-2",
34: "Layer-3",
35: "DST (Direct Stream Transfer)",
36: "ALS (Audio Lossless)",
37: "SLS (Scalable LosslesS)",
38: "SLS non-core",
39: "ER AAC ELD (Enhanced Low Delay)",
40: "SMR (Symbolic Music Representation) Simple",
41: "SMR Main",
42: "USAC (Unified Speech and Audio Coding) (no SBR)",
43: "SAOC (Spatial Audio Object Coding)",
44: "LD MPEG Surround",
45: "USAC",
}
type MPEGASCOut struct {
ObjectType int
}
type AACFrameIn struct {
ObjectType int
}

198
format/dns/dns.go Normal file
View File

@ -0,0 +1,198 @@
package dns
// TODO: https://github.com/Forescout/namewreck/blob/main/rfc/draft-dashevskyi-dnsrr-antipatterns-00.txt
import (
"fmt"
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
"strings"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.DNS,
Description: "DNS packet",
DecodeFn: dnsDecode,
})
}
// TODO: type consts
// TODO: aaaa,a rddata
var classNames = map[[2]uint64]string{
{0x0000, 0x0000}: "Reserved",
{0x0001, 0x0001}: "IN",
{0x0002, 0x0002}: "Unassigned",
{0x0003, 0x0003}: "Chaos",
{0x0004, 0x0004}: "Hesiod",
{0x0005, 0x00fd}: "Unassigned",
{0x00fe, 0x00fe}: "QCLASS NONE",
{0x00ff, 0x00ff}: "QCLASS ANY",
{0x0100, 0xfeff}: "Unassigned",
{0xff00, 0xfffe}: "Reserved for Private Use",
{0xffff, 0xffff}: "Reserved",
}
const (
typeCNAME = 5
)
var typeNames = map[uint64]string{
1: "A",
28: "AAAA",
18: "AFSDB",
42: "APL",
257: "CAA",
60: "CDNSKEY",
59: "CDS",
37: "CERT",
typeCNAME: "CNAME",
62: "CSYNC",
49: "DHCID",
32769: "DLV",
39: "DNAME",
48: "DNSKEY",
43: "DS",
108: "EUI48",
109: "EUI64",
13: "HINFO",
55: "HIP",
45: "IPSECKEY",
25: "KEY",
36: "KX",
29: "LOC",
15: "MX",
35: "NAPTR",
2: "NS",
47: "NSEC",
50: "NSEC3",
51: "NSEC3PARAM",
61: "OPENPGPKEY",
12: "PTR",
46: "RRSIG",
17: "RP",
24: "SIG",
53: "SMIMEA",
6: "SOA",
33: "SRV",
44: "SSHFP",
32768: "TA",
249: "TKEY",
52: "TLSA",
250: "TSIG",
16: "TXT",
256: "URI",
63: "ZONEMD",
64: "SVCB",
65: "HTTPS",
}
var rcodeNames = map[uint64]string{
0: "No error",
1: "Format error",
2: "Server failure",
3: "Name error",
4: "Not implemented",
5: "Refused",
}
func fieldDecodeLabel(d *decode.D, name string) {
var endPos int64
const maxJumps = 1000
jumpCount := 0
d.FieldStructFn(name, func(d *decode.D) {
var ls []string
d.FieldArrayFn("labels", func(d *decode.D) {
seenTermintor := false
for !seenTermintor {
d.FieldStructFn("label", func(d *decode.D) {
if d.PeekBits(2) == 0b11 {
d.FieldU2("is_pointer")
pointer := d.FieldU14("pointer")
if endPos == 0 {
endPos = d.Pos()
}
jumpCount++
if jumpCount > maxJumps {
d.Invalid(fmt.Sprintf("label has more than %d jumps", maxJumps))
}
d.SeekAbs(int64(pointer * 8))
}
l := d.FieldU8("length")
if l == 0 {
seenTermintor = true
return
}
ls = append(ls, d.FieldUTF8("value", int(l)))
})
}
})
d.FieldValueStr("value", strings.Join(ls, "."), "")
})
if endPos != 0 {
d.SeekAbs(endPos)
}
}
func fieldDecodeRR(d *decode.D, count uint64, name string, structName string) {
d.FieldArrayFn(name, func(d *decode.D) {
for i := uint64(0); i < count; i++ {
d.FieldStructFn(structName, func(d *decode.D) {
fieldDecodeLabel(d, "name")
typ, _ := d.FieldStringMapFn("type", typeNames, "Unknown", d.U16, decode.NumberDecimal)
d.FieldStringRangeMapFn("class", classNames, "Unknown", d.U16, decode.NumberDecimal)
d.FieldU32("ttl")
// TODO: pointer?
rdLength := d.FieldU16("rd_length")
switch typ {
case typeCNAME:
fieldDecodeLabel(d, "cname")
default:
d.FieldUTF8("rddata", int(rdLength))
}
})
}
})
}
func dnsDecode(d *decode.D, in interface{}) interface{} {
d.FieldStructFn("header", func(d *decode.D) {
d.FieldU16("id")
d.FieldBool("query")
d.FieldU4("opcode")
d.FieldBool("authoritative_answer")
d.FieldBool("truncation")
d.FieldBool("recursion_desired")
d.FieldBool("recursion_available")
d.FieldU3("z")
d.FieldStringMapFn("rcode", rcodeNames, "Unknown", d.U4, decode.NumberDecimal)
})
qdCount := d.FieldU16("qd_count")
anCount := d.FieldU16("an_count")
nsCount := d.FieldU16("ns_count")
arCount := d.FieldU16("ar_count")
d.FieldArrayFn("questions", func(d *decode.D) {
for i := uint64(0); i < qdCount; i++ {
d.FieldStructFn("question", func(d *decode.D) {
fieldDecodeLabel(d, "name")
d.FieldStringMapFn("type", typeNames, "Unknown", d.U16, decode.NumberDecimal)
d.FieldStringRangeMapFn("class", classNames, "Unknown", d.U16, decode.NumberDecimal)
})
}
})
fieldDecodeRR(d, anCount, "answers", "answer")
fieldDecodeRR(d, nsCount, "nameservers", "nameserver")
fieldDecodeRR(d, arCount, "additionals", "additional")
return nil
}

491
format/elf/elf.go Normal file
View File

@ -0,0 +1,491 @@
package elf
// https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
// https://man7.org/linux/man-pages/man5/elf.5.html
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
"strings"
)
// TODO: p_type hi/lo
func init() {
registry.MustRegister(&decode.Format{
Name: format.ELF,
Description: "Executable and Linkable Format",
Groups: []string{format.PROBE},
DecodeFn: elfDecode,
})
}
const (
SHT_NULL = 0x0
SHT_PROGBITS = 0x1
SHT_SYMTAB = 0x2
SHT_STRTAB = 0x3
SHT_RELA = 0x4
SHT_HASH = 0x5
SHT_DYNAMIC = 0x6
SHT_NOTE = 0x7
SHT_NOBITS = 0x8
SHT_REL = 0x9
SHT_SHLIB = 0x0a
SHT_DYNSYM = 0x0b
SHT_INIT_ARRAY = 0x0e
SHT_FINI_ARRAY = 0x0f
SHT_PREINIT_ARRAY = 0x10
SHT_GROUP = 0x11
SHT_SYMTAB_SHNDX = 0x12
SHT_NUM = 0x13
SHT_LOOS = 0x60000000
)
var shTypeNames = map[uint64]string{
SHT_NULL: "SHT_NULL",
SHT_PROGBITS: "SHT_PROGBITS",
SHT_SYMTAB: "SHT_SYMTAB",
SHT_STRTAB: "SHT_STRTAB",
SHT_RELA: "SHT_RELA",
SHT_HASH: "SHT_HASH",
SHT_DYNAMIC: "SHT_DYNAMIC",
SHT_NOTE: "SHT_NOTE",
SHT_NOBITS: "SHT_NOBITS",
SHT_REL: "SHT_REL",
SHT_SHLIB: "SHT_SHLIB",
SHT_DYNSYM: "SHT_DYNSYM",
SHT_INIT_ARRAY: "SHT_INIT_ARRAY",
SHT_FINI_ARRAY: "SHT_FINI_ARRAY",
SHT_PREINIT_ARRAY: "SHT_PREINIT_ARRAY",
SHT_GROUP: "SHT_GROUP",
SHT_SYMTAB_SHNDX: "SHT_SYMTAB_SHNDX",
SHT_NUM: "SHT_NUM",
SHT_LOOS: "SHT_LOOS",
}
func strIndexNull(idx int, s string) string {
if idx > len(s) {
return ""
}
i := strings.IndexByte(s[idx:], 0)
if i == -1 {
return s
}
return s[idx : idx+i]
}
func fieldStringStrIndexFn(d *decode.D, name string, strTable string, fn func() uint64) string {
return d.FieldFn(name, func() *decode.Value {
idx := fn()
return &decode.Value{V: idx, Symbol: strIndexNull(int(idx), strTable)}
}).Symbol
}
func elfDecode(d *decode.D, in interface{}) interface{} {
d.ValidateAtLeastBitsLeft(128 * 8)
rootD := d
var archBits int
d.FieldStructFn("ident", func(d *decode.D) {
d.FieldValidateUTF8("magic", "\x7fELF")
archBits = int(d.FieldUFn("class", func() (uint64, decode.DisplayFormat, string) {
switch d.U8() {
case 1:
return 32, decode.NumberDecimal, ""
case 2:
return 64, decode.NumberDecimal, ""
default:
//d.Invalid()
}
panic("unreachable")
}))
d.FieldUFn("data", func() (uint64, decode.DisplayFormat, string) {
switch d.U8() {
case 1:
rootD.Endian = decode.LittleEndian
return 1, decode.NumberDecimal, "Little-endian"
case 2:
rootD.Endian = decode.BigEndian
return 2, decode.NumberDecimal, "Big-endian"
default:
//d.Invalid()
}
panic("unreachable")
})
d.FieldU8("version")
d.FieldStringMapFn("os_abi", map[uint64]string{
0: "Sysv",
1: "HPUX",
2: "NetBSD",
3: "Linux",
4: "Hurd",
5: "86open",
6: "Solaris",
7: "Monterey",
8: "Irix",
9: "FreeBSD",
10: "Tru64",
11: "Modesto",
12: "OpenBSD",
97: "Arm",
255: "Standalone",
}, "Unknown", d.U8, decode.NumberDecimal)
d.FieldU8("abi_version")
d.FieldValidateZeroPadding("pad", 7*8)
})
// TODO: hex functions?
d.FieldStringMapFn("type", map[uint64]string{
0x00: "None",
0x01: "Rel",
0x02: "Exec",
0x03: "Dyn",
0x04: "Core",
0xfe00: "Loos",
0xfeff: "Hios",
0xff00: "Loproc",
0xffff: "Hiproc",
}, "Unknown", d.U16, decode.NumberHex)
d.FieldStringMapFn("machine", map[uint64]string{
0x00: "No specific instruction set",
0x01: "AT&T WE 32100",
0x02: "SPARC",
0x03: "x86",
0x04: "Motorola 68000 (M68k)",
0x05: "Motorola 88000 (M88k)",
0x06: "Intel MCU",
0x07: "Intel 80860",
0x08: "MIPS",
0x09: "IBM_System/370",
0x0a: "MIPS RS3000 Little-endian",
0x0e: "Hewlett-Packard PA-RISC",
0x0f: "Reserved for future use",
0x13: "Intel 80960",
0x14: "PowerPC",
0x15: "PowerPC (64-bit)",
0x16: "S390, including S390x",
0x17: "IBM SPU/SPC",
0x24: "NEC V800",
0x25: "Fujitsu FR20",
0x26: "TRW RH-32",
0x27: "Motorola RCE",
0x28: "ARM (up to ARMv7/Aarch32)",
0x29: "Digital Alpha",
0x2a: "SuperH",
0x2b: "SPARC Version 9",
0x2c: "Siemens TriCore embedded processor",
0x2d: "Argonaut RISC Core",
0x2e: "Hitachi H8/300",
0x2f: "Hitachi H8/300H",
0x30: "Hitachi H8S",
0x31: "Hitachi H8/500",
0x32: "IA-64",
0x33: "Stanford MIPS-X",
0x34: "Motorola ColdFire",
0x35: "Motorola M68HC12",
0x36: "Fujitsu MMA Multimedia Accelerator",
0x37: "Siemens PCP",
0x38: "Sony nCPU embedded RISC processor",
0x39: "Denso NDR1 microprocessor",
0x3a: "Motorola Star*Core processor",
0x3b: "Toyota ME16 processor",
0x3c: "STMicroelectronics ST100 processor",
0x3d: "Advanced Logic Corp. TinyJ embedded processor family",
0x3e: "AMD x86-64",
0x8c: "TMS320C6000 Family",
0xb7: "ARM 64-bits (ARMv8/Aarch64)",
0xf3: "RISC-V",
0xf7: "Berkeley Packet Filter",
0x101: "WDC 65C816",
}, "Unknown", d.U16, decode.NumberHex)
d.FieldU32("version")
d.FieldU("entry", archBits)
phoff := d.FieldU("phoff", archBits)
shoff := d.FieldU("shoff", archBits)
d.FieldU32("flags")
d.FieldU16("ehsize")
phsize := d.FieldU16("phentsize")
phnum := d.FieldU16("phnum")
shentsize := d.FieldU16("shentsize")
shnum := d.FieldU16("shnum")
shstrndx := d.FieldU16("shstrndx")
// TODO: make this nicer, API to update fields?
// TODO: is wrong: string table is one large string to index into
// TODO: and string can overlap
var strIndexTable string
if shstrndx != 0 {
var strTableOffset uint64
var strTableSize uint64
d.DecodeRangeFn(int64((shoff+shstrndx*shentsize)*8), int64(shentsize*8), func(d *decode.D) {
d.SeekRel(32)
d.SeekRel(32)
d.SeekRel(int64(archBits))
d.SeekRel(int64(archBits))
strTableOffset = d.U(archBits)
strTableSize = d.U(archBits)
_ = strIndexTable
})
strIndexTable = string(d.BytesRange(int64(strTableOffset*8), int(strTableSize)*8))
}
// d.DecodeRangeFn(int64(phoff)*8, int64(phnum*phsize*8), func(d *decode.D) {
d.FieldArrayFn("program_headers", func(d *decode.D) {
for i := uint64(0); i < phnum; i++ {
d.SeekAbs(int64(phoff*8) + int64(i*phsize*8))
pTypeNames := map[uint64]string{
0x00000000: "PT_NULL",
0x00000001: "PT_LOAD",
0x00000002: "PT_DYNAMIC",
0x00000003: "PT_INTERP",
0x00000004: "PT_NOTE",
0x00000005: "PT_SHLIB",
0x00000006: "PT_PHDR",
0x00000007: "PT_TLS",
0x60000000: "PT_LOOS",
0x6fffffff: "PT_HIOS",
0x70000000: "PT_LOPROC",
0x7fffffff: "PT_HIPROC",
}
pFlags := func(d *decode.D) {
d.FieldStructFn("p_flags", func(d *decode.D) {
if d.Endian == decode.LittleEndian {
d.FieldU5("unused0")
d.FieldBool("PF_R")
d.FieldBool("PF_W")
d.FieldBool("PF_X")
d.FieldU24("unused1")
} else {
d.FieldU29("unused0")
d.FieldBool("PF_R")
d.FieldBool("PF_W")
d.FieldBool("PF_X")
}
})
}
d.FieldStructFn("program_header", func(d *decode.D) {
var offset uint64
var size uint64
switch archBits {
case 32:
d.FieldStringMapFn("p_type", pTypeNames, "Unknown", func() uint64 { return d.U32() & 0xf }, decode.NumberDecimal)
offset = d.FieldU("p_offset", archBits)
d.FieldU("p_vaddr", archBits)
d.FieldU("p_paddr", archBits)
size = d.FieldU32("p_filesz")
d.FieldU32("p_memsz")
pFlags(d)
d.FieldU32("p_align")
case 64:
d.FieldStringMapFn("p_type", pTypeNames, "Unknown", func() uint64 { return d.U32() & 0xf }, decode.NumberDecimal)
pFlags(d)
offset = d.FieldU("p_offset", archBits)
d.FieldU("p_vaddr", archBits)
d.FieldU("p_paddr", archBits)
size = d.FieldU64("p_filesz")
d.FieldU64("p_memsz")
d.FieldU64("p_align")
}
d.FieldBitBufRange("data", int64(offset*8), int64(size*8))
})
}
})
// })
// d.DecodeRangeFn(int64(shoff)*8, int64(shnum*shentsize*8), func(d *decode.D) {
d.FieldArrayFn("section_headers", func(d *decode.D) {
for i := uint64(0); i < shnum; i++ {
d.SeekAbs(int64(shoff*8) + int64(i*shentsize*8))
shFlags := func(d *decode.D, archBits int) {
d.FieldStructFn("sh_flags", func(d *decode.D) {
if d.Endian == decode.LittleEndian {
d.FieldBool("SHF_LINK_ORDER")
d.FieldBool("SHF_INFO_LINK")
d.FieldBool("SHF_STRINGS")
d.FieldBool("SHF_MERGE")
d.FieldU1("unused0")
d.FieldBool("SHF_EXECINSTR")
d.FieldBool("SHF_ALLOC")
d.FieldBool("SHF_WRITE")
d.FieldBool("SHF_TLS")
d.FieldBool("SHF_GROUP")
d.FieldBool("SHF_OS_NONCONFORMING")
d.FieldU9("unused1")
d.FieldU8("os_specific")
d.FieldU4("processor_specific")
if archBits == 64 {
d.FieldU32("unused2")
}
} else {
// TODO: add d.FieldUnused that is per decoder?
if archBits == 64 {
d.FieldU32("unused0")
}
d.FieldU4("processor_specific")
d.FieldU8("os_specific")
d.FieldU9("unused1")
d.FieldBool("SHF_TLS")
d.FieldBool("SHF_GROUP")
d.FieldBool("SHF_OS_NONCONFORMING")
d.FieldBool("SHF_LINK_ORDER")
d.FieldBool("SHF_INFO_LINK")
d.FieldBool("SHF_STRINGS")
d.FieldBool("SHF_MERGE")
d.FieldU1("unused2")
d.FieldBool("SHF_EXECINSTR")
d.FieldBool("SHF_ALLOC")
d.FieldBool("SHF_WRITE")
// 0x1 SHF_WRITE Writable
// 0x2 SHF_ALLOC Occupies memory during execution
// 0x4 SHF_EXECINSTR Executable
// 0x10 SHF_MERGE Might be merged
// 0x20 SHF_STRINGS Contains null-terminated strings
// 0x40 SHF_INFO_LINK 'sh_info' contains SHT index
// 0x80 SHF_LINK_ORDER Preserve order after combining
// 0x100 SHF_OS_NONCONFORMING Non-standard OS specific handling required
// 0x200 SHF_GROUP Section is member of a group
// 0x400 SHF_TLS Section hold thread-local data
// 0x0ff00000 SHF_MASKOS OS-specific
// 0xf0000000 SHF_MASKPROC Processor-specific
// 0x4000000 SHF_ORDERED Special ordering requirement (Solaris)
// 0x8000000 SHF_EXCLUDE Section is excluded unless referenced or allocated (Solaris)
}
})
}
d.FieldStructFn("section_header", func(d *decode.D) {
var offset uint64
var size uint64
var shname string
var typ uint64
const (
DT_NULL = 0
DT_NEEDED = 1
DT_PLTRELSZ = 2
DT_PLTGOT = 3
DT_HASH = 4
DT_STRTAB = 5
DT_SYMTAB = 6
DT_RELA = 7
DT_RELASZ = 8
DT_RELAENT = 9
DT_STRSZ = 10
DT_SYMENT = 11
DT_INIT = 12
DT_FINI = 13
DT_SONAME = 14
DT_RPATH = 15
DT_SYMBOLIC = 16
DT_REL = 17
DT_RELSZ = 18
DT_RELENT = 19
DT_PLTREL = 20
DT_DEBUG = 21
DT_TEXTREL = 22
DT_JMPREL = 23
DT_ENCODING = 32
)
var dtNames = map[uint64]string{
DT_NULL: "DT_NULL",
DT_NEEDED: "DT_NEEDED",
DT_PLTRELSZ: "DT_PLTRELSZ",
DT_PLTGOT: "DT_PLTGOT",
DT_HASH: "DT_HASH",
DT_STRTAB: "DT_STRTAB",
DT_SYMTAB: "DT_SYMTAB",
DT_RELA: "DT_RELA",
DT_RELASZ: "DT_RELASZ",
DT_RELAENT: "DT_RELAENT",
DT_STRSZ: "DT_STRSZ",
DT_SYMENT: "DT_SYMENT",
DT_INIT: "DT_INIT",
DT_FINI: "DT_FINI",
DT_SONAME: "DT_SONAME",
DT_RPATH: "DT_RPATH",
DT_SYMBOLIC: "DT_SYMBOLIC",
DT_REL: "DT_REL",
DT_RELSZ: "DT_RELSZ",
DT_RELENT: "DT_RELENT",
DT_PLTREL: "DT_PLTREL",
DT_DEBUG: "DT_DEBUG",
DT_TEXTREL: "DT_TEXTREL",
DT_JMPREL: "DT_JMPREL",
DT_ENCODING: "DT_ENCODING",
}
switch archBits {
case 32:
shname = fieldStringStrIndexFn(d, "sh_name", strIndexTable, d.U32)
typ, _ = d.FieldStringMapFn("sh_type", shTypeNames, "Unknown", d.U32, decode.NumberHex)
shFlags(d, archBits)
d.FieldU("sh_addr", archBits)
offset = d.FieldU("sh_offset", archBits)
size = d.FieldU32("sh_size")
d.FieldU32("sh_link")
d.FieldU32("sh_info")
d.FieldU32("sh_addralign")
d.FieldU32("sh_entsize")
case 64:
shname = fieldStringStrIndexFn(d, "sh_name", strIndexTable, d.U32)
typ, _ = d.FieldStringMapFn("sh_type", shTypeNames, "Unknown", d.U32, decode.NumberHex)
shFlags(d, archBits)
d.FieldU("sh_addr", archBits)
offset = d.FieldU("sh_offset", archBits)
size = d.FieldU64("sh_size")
d.FieldU32("sh_link")
d.FieldU32("sh_info")
d.FieldU64("sh_addralign")
d.FieldU64("sh_entsize")
}
// SHT_NOBITS:
// "Identifies a section that occupies no space in the file but otherwise resembles SHT_PROGBITS. Although this section contains no bytes, the sh_offset member contains the conceptual file offset."
if typ != SHT_NOBITS {
d.FieldBitBufRange("data", int64(offset*8), int64(size*8))
d.DecodeRangeFn(int64(offset)*8, int64(size*8), func(d *decode.D) {
switch shname {
// TODO: PT_DYNAMIC?
case ".dynamic":
d.FieldArrayFn("dynamic_tags", func(d *decode.D) {
for d.NotEnd() {
d.FieldStructFn("tag", func(d *decode.D) {
tag, _ := d.FieldStringMapFn("tag", dtNames, "Unknown", func() uint64 { return d.U(archBits) }, decode.NumberHex)
switch tag {
case DT_NEEDED:
// TODO: DT_STRTAB
fieldStringStrIndexFn(d, "val", strIndexTable, func() uint64 { return d.U(archBits) })
default:
d.FieldU("d_un", archBits)
}
})
}
})
}
})
}
})
}
})
// })
return nil
}

95
format/flac/flac.go Normal file
View File

@ -0,0 +1,95 @@
package flac
// https://xiph.org/flac/format.html
// TODO: reuse samples buffer
// TODO: mime audio/x-flac
import (
"bytes"
"crypto/md5"
"fmt"
"fq/format"
"fq/format/registry"
"fq/internal/num"
"fq/pkg/decode"
)
var flacMetadatablockFormat []*decode.Format
var flacFrameFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.FLAC,
Description: "Free Lossless Audio Codec file",
Groups: []string{format.PROBE},
DecodeFn: flacDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.FLAC_METADATABLOCK}, Formats: &flacMetadatablockFormat},
{Names: []string{format.FLAC_FRAME}, Formats: &flacFrameFormat},
},
})
}
func flacDecode(d *decode.D, in interface{}) interface{} {
d.FieldValidateUTF8("magic", "fLaC")
var streamInfo format.FlacMetadatablockStreamInfo
var flacFrameIn format.FlacFrameIn
var framesNDecodedSamples uint64
var streamTotalSamples uint64
var streamDecodedSamples uint64
d.FieldArrayFn("metadatablocks", func(d *decode.D) {
for {
_, v := d.FieldDecode("metadatablock", flacMetadatablockFormat)
flacMetadatablockOut, ok := v.(format.FlacMetadatablockOut)
if !ok {
panic(fmt.Sprintf("expected FlacMetadatablockOut got %#+v", v))
}
if flacMetadatablockOut.HasStreamInfo {
streamInfo = flacMetadatablockOut.StreamInfo
streamTotalSamples = streamInfo.TotalSamplesInStream
flacFrameIn = format.FlacFrameIn{StreamInfo: streamInfo}
}
if flacMetadatablockOut.IsLastBlock {
return
}
}
})
md5Samples := md5.New()
d.FieldArrayFn("frames", func(d *decode.D) {
for d.NotEnd() {
// flac frame might need some fields from stream info to decode
_, v := d.FieldDecode("frame", flacFrameFormat, decode.FormatOptions{InArg: flacFrameIn})
ffo, ok := v.(format.FlacFrameOut)
if !ok {
panic(fmt.Sprintf("expected FlacFrameOut got %#+v", v))
}
frameStreamSamplesBuf := ffo.SamplesBuf
if streamTotalSamples > 0 {
samplesInFrame := num.MinUInt64(streamTotalSamples-streamDecodedSamples, ffo.Samples)
frameStreamSamplesBuf = frameStreamSamplesBuf[0 : samplesInFrame*uint64(ffo.Channels*ffo.BitsPerSample/8)]
framesNDecodedSamples += ffo.Samples
}
decode.MustCopy(md5Samples, bytes.NewReader(frameStreamSamplesBuf))
streamDecodedSamples += ffo.Samples
// reuse buffer if possible
flacFrameIn.SamplesBuf = ffo.SamplesBuf
}
})
_ = streamInfo
// if streamInfo.D != nil {
// md5Value := streamInfo.D.FieldGet("md5")
// d.FieldChecksumRange("md5_calculated", md5Value.Range.Start, md5Value.Range.Len, md5Samples.Sum(nil), decode.BigEndian)
// }
d.FieldValueBytes("md5_calculated", md5Samples.Sum(nil), "")
d.FieldValueU("decoded_samples", framesNDecodedSamples, "")
return nil
}

658
format/flac/frame.go Normal file
View File

@ -0,0 +1,658 @@
package flac
// TODO: reuse samples buffer. pass in buf?
import (
"encoding/binary"
"fmt"
"fq/format"
"fq/format/registry"
"fq/internal/num"
"fq/pkg/crc"
"fq/pkg/decode"
"math/bits"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.FLAC_FRAME,
Description: "FLAC frame",
DecodeFn: frameDecode,
})
}
const (
BlockingStrategyFixed = iota
BlockingStrategyVariable
)
var BlockingStrategyNames = map[uint]string{
BlockingStrategyFixed: "Fixed",
BlockingStrategyVariable: "Variable",
}
const (
SubframeConstant = iota
SubframeVerbatim
SubframeFixed
SubframeLPC
)
var SubframeTypeNames = map[uint]string{
SubframeConstant: "Constant",
SubframeVerbatim: "Verbatim",
SubframeFixed: "Fixed",
SubframeLPC: "LPC",
}
const (
ChannelLeftSide = 0b1000
ChannelSideRight = 0b1001
ChannelMidSide = 0b1010
)
// TODO: generic enough?
func utf8Uint(d *decode.D) uint64 {
n := d.U8()
// leading ones, bit negate and count zeroes
c := bits.LeadingZeros8(^uint8(n))
switch c {
case 0:
// nop
case 1:
// TODO: error
panic("invalid UTF8Uint")
default:
n = n & ((1 << (8 - c - 1)) - 1)
for i := 1; i < c; i++ {
n = n<<6 | d.U8()&0x3f
}
}
return n
}
// in argument is an optional FlacFrameIn struct with stream info
func frameDecode(d *decode.D, in interface{}) interface{} {
var inStreamInfo *format.FlacMetadatablockStreamInfo
ffi, ok := in.(format.FlacFrameIn)
if ok {
inStreamInfo = &ffi.StreamInfo
}
frameStart := d.Pos()
var channels uint64
sampleSize := 0
blockSize := 0
channelAssignment := -1
sideChannelIndex := -1
d.FieldStructFn("header", func(d *decode.D) {
// <14> 11111111111110
d.FieldValidateUFn("sync", 0b11111111111110, d.U14)
// <1> Reserved
// 0 : mandatory value
// 1 : reserved for future use
d.FieldValidateUFn("reserved0", 0, d.U1)
// <1> Blocking strategy:
// 0 : fixed-blocksize stream; frame header encodes the frame number
// 1 : variable-blocksize stream; frame header encodes the sample number
blockingStrategy := d.FieldUFn("blocking_strategy", func() (uint64, decode.DisplayFormat, string) {
switch d.U1() {
case 0:
return BlockingStrategyFixed, decode.NumberDecimal, BlockingStrategyNames[BlockingStrategyFixed]
default:
return BlockingStrategyVariable, decode.NumberDecimal, BlockingStrategyNames[BlockingStrategyVariable]
}
})
// <4> Block size in inter-channel samples:
// 0000 : reserved
// 0001 : 192 samples
// 0010-0101 : 576 * (2^(n-2)) samples, i.e. 576/1152/2304/4608
// 0110 : get 8 bit (blocksize-1) from end of header
// 0111 : get 16 bit (blocksize-1) from end of header
// 1000-1111 : 256 * (2^(n-8)) samples, i.e. 256/512/1024/2048/4096/8192/16384/32768
var blockSizeBits uint64
blockSize = int(d.FieldUFn("block_size", func() (uint64, decode.DisplayFormat, string) {
blockSizeBits = d.U4()
switch blockSizeBits {
case 0b0000:
return 0, decode.NumberDecimal, "reserved"
case 0b0001:
return 192, decode.NumberDecimal, ""
case 0b0010, 0b0011, 0b0100, 0b0101:
return 576 * (1 << (blockSizeBits - 2)), decode.NumberDecimal, ""
case 0b0110:
return 0, decode.NumberDecimal, "end of header (8 bit)"
case 0b0111:
return 0, decode.NumberDecimal, "end of header (16 bit)"
default:
return 256 * (1 << (blockSizeBits - 8)), decode.NumberDecimal, ""
}
}))
// <4> Sample rate:
// 0000 : get from STREAMINFO metadata block
// 0001 : 88.2kHz
// 0010 : 176.4kHz
// 0011 : 192kHz
// 0100 : 8kHz
// 0101 : 16kHz
// 0110 : 22.05kHz
// 0111 : 24kHz
// 1000 : 32kHz
// 1001 : 44.1kHz
// 1010 : 48kHz
// 1011 : 96kHz
// 1100 : get 8 bit sample rate (in kHz) from end of header
// 1101 : get 16 bit sample rate (in Hz) from end of header
// 1110 : get 16 bit sample rate (in tens of Hz) from end of header
// 1111 : invalid, to prevent sync-fooling string of 1s
var sampleRateBits uint64
d.FieldUFn("sample_rate", func() (uint64, decode.DisplayFormat, string) {
sampleRateBits = d.U4()
switch sampleRateBits {
case 0:
if inStreamInfo == nil {
d.Invalid("streaminfo required for sample rate")
}
return inStreamInfo.SampleRate, decode.NumberDecimal, "streaminfo"
case 0b0001:
return 88200, decode.NumberDecimal, ""
case 0b0010:
return 176000, decode.NumberDecimal, ""
case 0b0011:
return 19200, decode.NumberDecimal, ""
case 0b0100:
return 800, decode.NumberDecimal, ""
case 0b0101:
return 1600, decode.NumberDecimal, ""
case 0b0110:
return 22050, decode.NumberDecimal, ""
case 0b0111:
return 44100, decode.NumberDecimal, ""
case 0b1000:
return 32000, decode.NumberDecimal, ""
case 0b1001:
return 44100, decode.NumberDecimal, ""
case 0b1010:
return 48000, decode.NumberDecimal, ""
case 0b1011:
return 96000, decode.NumberDecimal, ""
case 0b1100:
return 0, decode.NumberDecimal, "end of header (8 bit*1000)"
case 0b1101:
return 0, decode.NumberDecimal, "end of header (16 bit)"
case 0b1110:
return 0, decode.NumberDecimal, "end of header (16 bit*10)"
default:
return 0, decode.NumberDecimal, "invalid"
}
})
// <4> Channel assignment
// 0000-0111 : (number of independent channels)-1. Where defined, the channel order follows SMPTE/ITU-R recommendations. The assignments are as follows:
// 1 channel: mono
// 2 channels: left, right
// 3 channels: left, right, center
// 4 channels: front left, front right, back left, back right
// 5 channels: front left, front right, front center, back/surround left, back/surround right
// 6 channels: front left, front right, front center, LFE, back/surround left, back/surround right
// 7 channels: front left, front right, front center, LFE, back center, side left, side right
// 8 channels: front left, front right, front center, LFE, back left, back right, side left, side right
// 1000 : left/side stereo: channel 0 is the left channel, channel 1 is the side(difference) channel
// 1001 : right/side stereo: channel 0 is the side(difference) channel, channel 1 is the right channel
// 1010 : mid/side stereo: channel 0 is the mid(average) channel, channel 1 is the side(difference) channel
// 1011-1111 : reserved
channels = d.FieldUFn("channel_assignment", func() (uint64, decode.DisplayFormat, string) {
ca, u, disp := func() (uint64, uint64, string) {
v := d.U4()
switch v {
case 0:
return v, 1, "mono"
case 1:
return v, 2, "left, right"
case 2:
return v, 3, "left, right, center"
case 3:
return v, 4, "front left, front right, back left, back right"
case 4:
return v, 5, "front left, front right, front center, back/surround left, back/surround right"
case 5:
return v, 6, "front left, front right, front center, LFE, back/surround left, back/surround right"
case 6:
return v, 7, "front left, front right, front center, LFE, back center, side left, side right"
case 7:
return v, 8, "front left, front right, front center, LFE, back left, back right, side left, side right"
case 0b1000:
sideChannelIndex = 1
return v, 2, "left/side"
case 0b1001:
sideChannelIndex = 0
return v, 2, "side/right"
case 0b1010:
sideChannelIndex = 1
return v, 2, "mid/side"
default:
return v, 0, "reserved"
}
}()
channelAssignment = int(ca)
if sideChannelIndex != -1 {
d.FieldUFn("side_channel_index", func() (uint64, decode.DisplayFormat, string) {
return uint64(sideChannelIndex), decode.NumberDecimal, ""
})
}
return u, decode.NumberDecimal, disp
})
// <3> Sample size in bits:
// 000 : get from STREAMINFO metadata block
// 001 : 8 bits per sample
// 010 : 12 bits per sample
// 011 : reserved
// 100 : 16 bits per sample
// 101 : 20 bits per sample
// 110 : 24 bits per sample
// 111 : reserved
sampleSize = int(d.FieldUFn("sample_size", func() (uint64, decode.DisplayFormat, string) {
switch d.U3() {
case 0b000:
if inStreamInfo == nil {
d.Invalid("streaminfo required for bit per sample")
}
return inStreamInfo.BitPerSample, decode.NumberDecimal, "streaminfo"
case 0b001:
return 8, decode.NumberDecimal, ""
case 0b010:
return 12, decode.NumberDecimal, ""
case 0b011:
return 0, decode.NumberDecimal, "reserved"
case 0b100:
return 16, decode.NumberDecimal, ""
case 0b101:
return 20, decode.NumberDecimal, ""
case 0b110:
return 24, decode.NumberDecimal, ""
case 0b111:
return 0, decode.NumberDecimal, "reserved"
}
panic("unreachable")
}))
// <1> Reserved:
// 0 : mandatory value
// 1 : reserved for future use
d.FieldValidateUFn("reserved1", 0, d.U1)
d.FieldStructFn("end_of_header", func(d *decode.D) {
// if(variable blocksize)
// <8-56>:"UTF-8" coded sample number (decoded number is 36 bits) [4]
// else
// <8-48>:"UTF-8" coded frame number (decoded number is 31 bits) [4]
switch blockingStrategy {
case BlockingStrategyVariable:
d.FieldUFn("sample_number", func() (uint64, decode.DisplayFormat, string) {
return utf8Uint(d), decode.NumberDecimal, ""
})
case BlockingStrategyFixed:
d.FieldUFn("frame_number", func() (uint64, decode.DisplayFormat, string) {
return utf8Uint(d), decode.NumberDecimal, ""
})
}
// if(blocksize bits == 011x)
// 8/16 bit (blocksize-1)
switch blockSizeBits {
case 0b0110:
blockSize = int(d.FieldUFn("block_size", func() (uint64, decode.DisplayFormat, string) {
return d.U8() + 1, decode.NumberDecimal, ""
}))
case 0b0111:
blockSize = int(d.FieldUFn("block_size", func() (uint64, decode.DisplayFormat, string) {
return d.U16() + 1, decode.NumberDecimal, ""
}))
}
// if(sample rate bits == 11xx)
// 8/16 bit sample rate
switch sampleRateBits {
case 0b1100:
d.FieldUFn("sample_rate", func() (uint64, decode.DisplayFormat, string) {
return d.U8() * 1000, decode.NumberDecimal, ""
})
case 0b1101:
d.FieldUFn("sample_rate", func() (uint64, decode.DisplayFormat, string) {
return d.U16(), decode.NumberDecimal, ""
})
case 0b1110:
d.FieldUFn("sample_rate", func() (uint64, decode.DisplayFormat, string) {
return d.U16() * 10, decode.NumberDecimal, ""
})
case 0b1111:
// TODO: reserved?
}
})
headerCRC := &crc.CRC{Bits: 8, Table: crc.ATM8Table}
decode.MustCopy(headerCRC, d.BitBufRange(frameStart, d.Pos()-frameStart))
d.FieldChecksumLen("crc", 8, headerCRC.Sum(nil), decode.BigEndian)
})
var channelSamples [][]int64
d.FieldArrayFn("subframes", func(d *decode.D) {
for channelIndex := 0; channelIndex < int(channels); channelIndex++ {
d.FieldStructFn("subframe", func(d *decode.D) {
// <1> Zero bit padding, to prevent sync-fooling string of 1s
d.FieldValidateUFn("zero_bit", 0, d.U1)
// <6> Subframe type:
// 000000 : SUBFRAME_CONSTANT
// 000001 : SUBFRAME_VERBATIM
// 00001x : reserved
// 0001xx : reserved
// 001xxx : if(xxx <= 4) SUBFRAME_FIXED, xxx=order ; else reserved
// 01xxxx : reserved
// 1xxxxx : SUBFRAME_LPC, xxxxx=order-1
var lpcOrder int
subframeType := d.FieldUFn("subframe_type", func() (uint64, decode.DisplayFormat, string) {
u, disp := func() (uint64, string) {
bits := d.U6()
switch bits {
case 0b000000:
return SubframeConstant, SubframeTypeNames[SubframeConstant]
case 0b000001:
return SubframeVerbatim, SubframeTypeNames[SubframeVerbatim]
case 0b001000, 0b001001, 0b001010, 0b001011, 0b001100:
lpcOrder = int(bits & 0x7)
return SubframeFixed, SubframeTypeNames[SubframeFixed]
default:
if bits&0x20 > 0 {
lpcOrder = int((bits & 0x1f) + 1)
} else {
return 0, "reserved"
}
return SubframeLPC, SubframeTypeNames[SubframeLPC]
}
}()
d.FieldUFn("lpc_order", func() (uint64, decode.DisplayFormat, string) {
return uint64(lpcOrder), decode.NumberDecimal, ""
})
return u, decode.NumberDecimal, disp
})
// 'Wasted bits-per-sample' flag:
// 0 : no wasted bits-per-sample in source subblock, k=0
// 1 : k wasted bits-per-sample in source subblock, k-1 follows, unary coded; e.g. k=3 => 001 follows, k=7 => 0000001 follows.
wastedBitsFlag := d.FieldU1("wasted_bits_flag")
var wastedBitsK int
if wastedBitsFlag != 0 {
wastedBitsK = int(d.FieldUFn("wasted_bits_k", func() (uint64, decode.DisplayFormat, string) {
return d.Unary(0) + 1, decode.NumberDecimal, ""
}))
}
subframeSampleSize := sampleSize - wastedBitsK
if subframeSampleSize < 0 {
d.Invalid(fmt.Sprintf("negative subframeSampleSize %d", subframeSampleSize))
}
// if channel is side, add en extra sample bit
// https://github.com/xiph/flac/blob/37e675b777d4e0de53ac9ff69e2aea10d92e729c/src/libFLAC/stream_decoder.c#L2040
if channelIndex == sideChannelIndex {
subframeSampleSize++
}
d.FieldValueU("subframe_sample_size", uint64(subframeSampleSize), "")
decodeWarmupSamples := func(n int, sampleSize int) []int64 {
var ss []int64
d.FieldArrayFn("warmup_samples", func(d *decode.D) {
for i := 0; i < n; i++ {
ss = append(ss, d.FieldS("value", sampleSize))
}
})
return ss
}
decodeResiduals := func() []int64 {
// is less than blockSize
rs := make([]int64, 0, blockSize)
// <2> Residual coding method:
// 00 : partitioned Rice coding with 4-bit Rice parameter; RESIDUAL_CODING_METHOD_PARTITIONED_RICE follows
// 01 : partitioned Rice coding with 5-bit Rice parameter; RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 follows
// 10-11 : reserved
var riceEscape int
riceBits := int(d.FieldUFn("residual_coding_method", func() (uint64, decode.DisplayFormat, string) {
switch d.U2() {
case 0:
riceEscape = 15
return 4, decode.NumberDecimal, "rice"
case 1:
riceEscape = 31
return 5, decode.NumberDecimal, "rice2"
default:
return 0, decode.NumberDecimal, "reserved"
}
}))
// <4> Partition order.
partitionOrder := int(d.FieldU4("partition_order"))
// There will be 2^order partitions.
ricePartitions := 1 << partitionOrder
d.FieldValueU("rice_partitions", uint64(ricePartitions), "")
d.FieldArrayFn("partitions", func(d *decode.D) {
for i := 0; i < ricePartitions; i++ {
d.FieldStructFn("partition", func(d *decode.D) {
// Encoding parameter:
// <4(+5)> Encoding parameter:
// 0000-1110 : Rice parameter.
// 1111 : Escape code, meaning the partition is in unencoded binary form using n bits per sample; n follows as a 5-bit number.
// Or:
// <5(+5)> Encoding parameter:
// 00000-11110 : Rice parameter.
// 11111 : Escape code, meaning the partition is in unencoded binary form using n bits per sample; n follows as a 5-bit number.
// Encoded residual. The number of samples (n) in the partition is determined as follows:
// if the partition order is zero, n = frame's blocksize - predictor order
// else if this is not the first partition of the subframe, n = (frame's blocksize / (2^partition order))
// else n = (frame's blocksize / (2^partition order)) - predictor order
var count int
if partitionOrder == 0 {
count = blockSize - lpcOrder
} else if i != 0 {
count = blockSize / ricePartitions
} else {
count = (blockSize / ricePartitions) - lpcOrder
}
d.FieldValueU("count", uint64(count), "")
riceParameter := int(d.FieldU("rice_parameter", riceBits))
if riceParameter == riceEscape {
escapeSampleSize := int(d.FieldU5("escape_sample_size"))
d.FieldBitBufLen("samples", int64(count*escapeSampleSize*8))
} else {
samplesStart := d.Pos()
for j := 0; j < count; j++ {
high := d.Unary(0)
_ = high
low := d.U(riceParameter)
_ = low
rs = append(rs, num.ZigZag(high<<riceParameter|low))
}
samplesStop := d.Pos()
d.FieldBitBufRange("samples", samplesStart, samplesStop-samplesStart)
}
})
}
})
return rs
}
// modifies input samples slice and returns it
decodeLPC := func(lpcOrder int, samples []int64, coeffs []int64, shift int64) []int64 {
for i := lpcOrder; i < len(samples); i++ {
r := int64(0)
for j := 0; j < len(coeffs); j++ {
c := coeffs[j]
s := samples[i-j-1]
r += c * s
}
samples[i] = samples[i] + (r >> shift)
}
return samples
}
var samples []int64 //nolint:makezero
switch subframeType {
case SubframeConstant:
samples = make([]int64, blockSize)
// <n> Unencoded constant value of the subblock, n = frame's bits-per-sample.
v := d.FieldS("value", subframeSampleSize)
for i := 0; i < blockSize; i++ {
samples[i] = v
}
case SubframeVerbatim:
samples = make([]int64, blockSize)
// <n*i> Unencoded subblock; n = frame's bits-per-sample, i = frame's blocksize.
// TODO: refactor into some kind of FieldBitBufLenFn?
d.FieldBitBufRange("samples", d.Pos(), int64(blockSize*subframeSampleSize))
for i := 0; i < blockSize; i++ {
samples[i] = d.S(subframeSampleSize)
}
case SubframeFixed:
// <n> Unencoded warm-up samples (n = frame's bits-per-sample * predictor order).
warmupSamples := decodeWarmupSamples(lpcOrder, subframeSampleSize)
// Encoded residual
residuals := decodeResiduals()
// http://www.hpl.hp.com/techreports/1999/HPL-1999-144.pdf
fixedCoeffs := [][]int64{
{},
{1},
{2, -1},
{3, -3, 1},
{4, -6, 4, -1},
}
coeffs := fixedCoeffs[lpcOrder]
samples = make([]int64, 0, blockSize)
samples = append(samples, warmupSamples...)
samples = append(samples, residuals...)
samples = decodeLPC(lpcOrder, samples, coeffs, 0)
case SubframeLPC:
// <n> Unencoded warm-up samples (n = frame's bits-per-sample * lpc order).
warmupSamples := decodeWarmupSamples(lpcOrder, subframeSampleSize)
// <4> (Quantized linear predictor coefficients' precision in bits)-1 (1111 = invalid).
precision := int(d.FieldUFn("precision", func() (uint64, decode.DisplayFormat, string) {
return d.U4() + 1, decode.NumberDecimal, ""
}))
// <5> Quantized linear predictor coefficient shift needed in bits (NOTE: this number is signed two's-complement).
shift := d.FieldS5("shift")
if shift < 0 {
d.Invalid(fmt.Sprintf("negative LPC shift %d", shift))
}
// <n> Unencoded predictor coefficients (n = qlp coeff precision * lpc order) (NOTE: the coefficients are signed two's-complement).
var coeffs []int64
d.FieldArrayFn("coefficients", func(d *decode.D) {
for i := 0; i < lpcOrder; i++ {
coeffs = append(coeffs, d.FieldS("value", precision))
}
})
// Encoded residual
residuals := decodeResiduals()
samples = make([]int64, 0, blockSize)
samples = append(samples, warmupSamples...)
samples = append(samples, residuals...)
samples = decodeLPC(lpcOrder, samples, coeffs, shift)
}
if wastedBitsK != 0 {
for i := 0; i < len(samples); i++ {
samples[i] <<= wastedBitsK
}
}
channelSamples = append(channelSamples, samples)
})
}
})
// <?> Zero-padding to byte alignment.
d.FieldValidateUFn("byte_align", 0, func() uint64 { return d.U(d.ByteAlignBits()) })
// <16> CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with 0) of everything before the crc, back to and including the frame header sync code
footerCRC := &crc.CRC{Bits: 16, Table: crc.ANSI16Table}
decode.MustCopy(footerCRC, d.BitBufRange(frameStart, d.Pos()-frameStart))
d.FieldChecksumLen("footer_crc", 16, footerCRC.Sum(nil), decode.BigEndian)
streamSamples := len(channelSamples[0])
for j := 0; j < len(channelSamples); j++ {
if streamSamples > len(channelSamples[j]) {
d.Invalid(fmt.Sprintf("different amount of samples in channels %d >= %d", streamSamples, len(channelSamples[j])))
}
}
// Transform mid/side channels into left, right
// mid = (left + right)/2
// side = left - right
switch channelAssignment {
case ChannelLeftSide:
for i := 0; i < len(channelSamples[0]); i++ {
channelSamples[1][i] = channelSamples[0][i] - channelSamples[1][i]
}
case ChannelSideRight:
for i := 0; i < len(channelSamples[0]); i++ {
channelSamples[0][i] = channelSamples[1][i] + channelSamples[0][i]
}
case ChannelMidSide:
for i := 0; i < len(channelSamples[0]); i++ {
m := channelSamples[0][i]
s := channelSamples[1][i]
m = m<<1 | s&1
channelSamples[0][i] = (m + s) >> 1
channelSamples[1][i] = (m - s) >> 1
}
default:
// no side channel
}
bytesPerSample := sampleSize / 8
p := 0
le := binary.LittleEndian
interleavedSamplesBuf := ffi.SamplesBuf
interleavedSamplesBufLen := len(channelSamples) * streamSamples * bytesPerSample
// reuse buffer if possible
if interleavedSamplesBuf == nil || len(interleavedSamplesBuf) < interleavedSamplesBufLen {
interleavedSamplesBuf = make([]byte, interleavedSamplesBufLen)
}
// TODO: speedup by using more cache friendly memory layout for samples
for i := 0; i < streamSamples; i++ {
for j := 0; j < len(channelSamples); j++ {
s := channelSamples[j][i]
switch sampleSize {
case 8:
interleavedSamplesBuf[p] = byte(s)
case 16:
le.PutUint16(interleavedSamplesBuf[p:], uint16(s))
case 24:
interleavedSamplesBuf[p] = byte(s)
le.PutUint16(interleavedSamplesBuf[p+1:], uint16(s>>8))
case 32:
le.PutUint32(interleavedSamplesBuf[p:], uint32(s))
}
p += bytesPerSample
}
}
return format.FlacFrameOut{
SamplesBuf: interleavedSamplesBuf,
Samples: uint64(streamSamples),
Channels: int(channels),
BitsPerSample: sampleSize,
}
}

View File

@ -0,0 +1,112 @@
package flac
// TODO: 24 bit picture length truncate warning
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
"fq/pkg/ranges"
)
var flacPicture []*decode.Format
var vorbisCommentFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.FLAC_METADATABLOCK,
Description: "FLAC metadatablock",
DecodeFn: metadatablockDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.FLAC_PICTURE}, Formats: &flacPicture},
{Names: []string{format.VORBIS_COMMENT}, Formats: &vorbisCommentFormat},
},
})
}
const (
MetadataBlockStreaminfo = 0
MetadataBlockPadding = 1
MetadataBlockApplication = 2
MetadataBlockSeektable = 3
MetadataBlockVorbisComment = 4
MetadataBlockCuesheet = 5
MetadataBlockPicture = 6
)
var metadataBlockNames = map[uint]string{
MetadataBlockStreaminfo: "Streaminfo",
MetadataBlockPadding: "Padding",
MetadataBlockApplication: "Application",
MetadataBlockSeektable: "Seektable",
MetadataBlockVorbisComment: "Vorbis comment",
MetadataBlockCuesheet: "Cuesheet",
MetadataBlockPicture: "Picture",
}
func metadatablockDecode(d *decode.D, in interface{}) interface{} {
mb := format.FlacMetadatablockOut{}
mb.IsLastBlock = d.FieldBool("last_block")
typ := d.FieldUFn("type", func() (uint64, decode.DisplayFormat, string) {
t := d.U7()
name := "Unknown"
if s, ok := metadataBlockNames[uint(t)]; ok {
name = s
}
return t, decode.NumberDecimal, name
})
length := d.FieldU24("length")
switch typ {
case MetadataBlockStreaminfo:
d.FieldU16("minimum_block_size")
d.FieldU16("maximum_block_size")
d.FieldU24("minimum_frame_size")
d.FieldU24("maximum_frame_size")
sampleRate := d.FieldU("sample_rate", 20)
// <3> (number of channels)-1. FLAC supports from 1 to 8 channels
d.FieldUFn("channels", func() (uint64, decode.DisplayFormat, string) { return d.U3() + 1, decode.NumberDecimal, "" })
// <5> (bits per sample)-1. FLAC supports from 4 to 32 bits per sample. Currently the reference encoder and decoders only support up to 24 bits per sample.
bitPerSample := d.FieldUFn("bits_per_sample", func() (uint64, decode.DisplayFormat, string) {
return d.U5() + 1, decode.NumberDecimal, ""
})
totalSamplesInStream := d.FieldU("total_samples_in_stream", 36)
md5Range := ranges.Range{Start: d.Pos(), Len: 16 * 8}
d.FieldBitBufLen("md5", 16*8)
mb.StreamInfo = format.FlacMetadatablockStreamInfo{
SampleRate: sampleRate,
BitPerSample: bitPerSample,
TotalSamplesInStream: totalSamplesInStream,
MD5Range: md5Range,
}
mb.HasStreamInfo = true
case MetadataBlockVorbisComment:
d.FieldDecodeLen("comment", int64(length*8), vorbisCommentFormat)
case MetadataBlockPicture:
d.FieldDecodeLen("picture", int64(length*8), flacPicture)
case MetadataBlockSeektable:
seektableCount := length / 18
d.FieldArrayFn("seekpoints", func(d *decode.D) {
for i := uint64(0); i < seektableCount; i++ {
d.FieldStructFn("seekpoint", func(d *decode.D) {
d.FieldUFn("sample_number", func() (uint64, decode.DisplayFormat, string) {
n := d.U64()
d := ""
if n == 0xffffffffffffffff {
d = "Placeholder"
}
return n, decode.NumberDecimal, d
})
d.FieldU64("offset")
d.FieldU16("number_of_samples")
})
}
})
default:
d.FieldBitBufLen("data", int64(length*8))
}
return mb
}

38
format/flac/picture.go Normal file
View File

@ -0,0 +1,38 @@
package flac
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
var images []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.FLAC_PICTURE,
Description: "FLAC metadatablock picture",
DecodeFn: pictureDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.IMAGE}, Formats: &images},
},
})
}
func pictureDecode(d *decode.D, in interface{}) interface{} {
lenStr := func(name string) string { //nolint:unparam
l := d.FieldU32(name + "_length")
return d.FieldUTF8(name, int(l))
}
d.FieldU32("picture_type")
lenStr("mime")
lenStr("description")
d.FieldU32("width")
d.FieldU32("height")
d.FieldU32("color_depth")
d.FieldU32("number_of_index_colors")
pictureLen := d.FieldU32("picture_length")
d.FieldDecodeLen("picture_data", int64(pictureLen)*8, images)
return nil
}

BIN
format/flac/testdata/frame vendored Normal file

Binary file not shown.

59
format/flac/testdata/frame.fqtest vendored Normal file
View File

@ -0,0 +1,59 @@
# test decode separate frame
# ffmpeg -f lavfi -i sine -t 0.01s -f flac pipe:1 | fq - '.frames[0]._bytes' > frame
/frame:
> fq -d flac_frame verbose /frame
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /frame (flac_frame) 0x0-0x1ff.7 (512)
| | | header: {} 0x0-0x7.7 (8)
0x000|ff f8 |.. | sync: Correct (0x3ffe) 0x0-0x1.5 (1.6)
0x000| f8 | . | reserved0: Correct (0x0) 0x1.6-0x1.6 (0.1)
0x000| f8 | . | blocking_strategy: Fixed (0) 0x1.7-0x1.7 (0.1)
0x000| 79 | y | block_size: end of header (16 bit) (0) 0x2-0x2.3 (0.4)
0x000| 79 | y | sample_rate: 44100 0x2.4-0x2.7 (0.4)
0x000| 08 | . | channel_assignment: mono (1) 0x3-0x3.3 (0.4)
0x000| 08 | . | sample_size: 16 0x3.4-0x3.6 (0.3)
0x000| 08 | . | reserved1: Correct (0x0) 0x3.7-0x3.7 (0.1)
| | | end_of_header: {} 0x4-0x6.7 (3)
0x000| 00 | . | frame_number: 0 0x4-0x4.7 (1)
0x000| 01 b8 | .. | block_size: 441 0x5-0x6.7 (2)
0x000| 55 | U | crc: Correct (55) 0x7-0x7.7 (1)
| | | subframes: [1] 0x8-0x1fd.2 (501.3)
| | | [0]: subframe {} 0x8-0x1fd.2 (501.3)
0x000| 4e | N | zero_bit: Correct (0x0) 0x8-0x8 (0.1)
0x000| 4e | N | subframe_type: LPC (3) 0x8.1-0x8.6 (0.6)
| | | lpc_order: 8 0x8.7-NA (0)
0x000| 4e | N | wasted_bits_flag: 0 0x8.7-0x8.7 (0.1)
| | | subframe_sample_size: 16 0x9-NA (0)
| | | warmup_samples: [8] 0x9-0x18.7 (16)
0x000| 00 00 | .. | [0]: value 0 0x9-0xa.7 (2)
0x000| 01 00 | .. | [1]: value 256 0xb-0xc.7 (2)
0x000| 01 ff | .. | [2]: value 511 0xd-0xe.7 (2)
0x000| 02| .| [3]: value 765 0xf-0x10.7 (2)
0x010|fd |. |
0x010| 03 f8 | .. | [4]: value 1016 0x11-0x12.7 (2)
0x010| 04 ee | .. | [5]: value 1262 0x13-0x14.7 (2)
0x010| 05 e0 | .. | [6]: value 1504 0x15-0x16.7 (2)
0x010| 06 cc | .. | [7]: value 1740 0x17-0x18.7 (2)
0x010| e7 | . | precision: 15 0x19-0x19.3 (0.4)
0x010| e7 b7 | .. | shift: 15 0x19.4-0x1a (0.5)
| | | coefficients: [8] 0x1a.1-0x29 (15)
0x010| b7 52 | .R | [0]: value 14162 0x1a.1-0x1b.7 (1.7)
0x010| 5c 9c | \. | [1]: value 11854 0x1c-0x1d.6 (1.7)
0x010| 9c 8d e8| ...| [2]: value 9082 0x1d.7-0x1f.5 (1.7)
0x010| e8| .| [3]: value 5975 0x1f.6-0x21.4 (1.7)
0x020|ba b8 |.. |
0x020| b8 a5 df | ... | [4]: value 2653 0x21.5-0x23.3 (1.7)
0x020| df a3 fc | ... | [5]: value -737 0x23.4-0x25.2 (1.7)
0x020| fc 03 71 | ..q | [6]: value -4083 0x25.3-0x27.1 (1.7)
0x020| 71 e5 80 | q.. | [7]: value -7221 0x27.2-0x29 (1.7)
0x020| 80 | . | residual_coding_method: rice (4) 0x29.1-0x29.2 (0.2)
0x020| 80 | . | partition_order: 0 0x29.3-0x29.6 (0.4)
| | | rice_partitions: 1 0x29.7-NA (0)
| | | partitions: [1] 0x29.7-0x1fd.2 (467.4)
| | | [0]: partition {} 0x29.7-0x1fd.2 (467.4)
| | | count: 433 0x29.7-NA (0)
0x020| 80 ee | .. | rice_parameter: 7 0x29.7-0x2a.2 (0.4)
0x020| ee e7 63 a9 cc e0| ..c...| samples: 773b1d4e670369a8cc612e164a64d239... 0x2a.3-0x1fd.2 (467)
0x030|6d 35 19 8c 25 c2 c9 4c 9a 47 20 bd ba 36 b3 2f|m5..%..L.G ..6./|
* |until 0x1fd.2 (467) | |
0x1f0| 20 | | byte_align: Correct (0x0) 0x1fd.3-0x1fd.7 (0.5)
0x1f0| 7f ab| ..| footer_crc: Correct (7fab) 0x1fe-0x1ff.7 (2)

44
format/flac/testdata/gen vendored Normal file
View File

@ -0,0 +1,44 @@
ffmpeg \
-y \
-t 100ms -f lavfi -i anullsrc=cl=stereo:sample_rate=44100 \
-t 100ms -f lavfi -i anullsrc=cl=mono:sample_rate=44100 \
-t 100ms -f lavfi -i sine=sample_rate=44100:frequency=100 \
-t 100ms -f lavfi -i sine=sample_rate=44100:frequency=600 \
-t 100ms -f lavfi -i anoisesrc=sample_rate=44100:seed=1 \
-t 100ms -f lavfi -i anoisesrc=sample_rate=44100:seed=2 \
-t 100ms -f lavfi -i sine=sample_rate=44100:frequency=600 \
-t 100ms -f lavfi -i sine=sample_rate=44100:frequency=50 \
-t 100ms -f lavfi -i anoisesrc=sample_rate=44100:seed=3 \
-t 100ms -f lavfi -i sine=sample_rate=44100:frequency=20 \
-filter_complex \
'[0:0][1:0]amerge=inputs=2[merge0];
[2:0][3:0]amerge=inputs=2[merge1];
[4:0][5:0]amerge=inputs=2[merge2];
[6:0][7:0]amerge=inputs=2[merge3];
[8:0][9:0]amerge=inputs=2[merge4];
[merge0][merge1][merge2][merge3][merge4]concat=n=5:v=0:a=1[concat0];
[concat0]asplit=outputs=6[out0][out1][out2][out3][out4][out5]' \
-map '[out0]' -ar 44100 -ac 1 -c:a pcm_u8 -f wav mono8.wav \
-map '[out1]' -ar 44100 -ac 1 -c:a pcm_s16le -f wav mono16.wav \
-map '[out2]' -ar 44100 -ac 1 -c:a pcm_s24le -f wav mono24.wav \
-map '[out3]' -ar 44100 -ac 2 -c:a pcm_u8 -f wav stereo8.wav \
-map '[out4]' -ar 44100 -ac 2 -c:a pcm_s16le -f wav stereo16.wav \
-map '[out5]' -ar 44100 -ac 2 -c:a pcm_s24le -f wav stereo24.wav
flac -fo mono8.flac mono8.wav
flac -fo mono16.flac mono16.wav
flac -fo mono24.flac mono24.wav
flac -fo stereo8.flac stereo8.wav
flac -fo stereo16.flac stereo16.wav
flac -fo stereo24.flac stereo24.wav
rm -f mono8.wav mono16.wav mono24.wav
rm -f stereo8.wav stereo16.wav stereo24.wav
ffmpeg -y -t 10ms -f lavfi -i sine picture_seek_gain.flac
convert -size 4x4 "xc:#000" 4x4.png
metaflac --add-replay-gain --add-seekpoint=10 --import-picture-from 4x4.png picture_seek_gain.flac
rm 4x4.png
for i in mono8 mono16 mono24 stereo8 stereo16 stereo24 picture_seek_gain ; do
echo "/$i.flac:" > $i.fqtest
echo "> fq -d flac $i.flac verbose" >> $i.fqtest
done

BIN
format/flac/testdata/mono16.flac vendored Normal file

Binary file not shown.

634
format/flac/testdata/mono16.fqtest vendored Normal file
View File

@ -0,0 +1,634 @@
/mono16.flac:
> fq -d flac verbose /mono16.flac
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /mono16.flac (flac) 0x0-0x8597.7 (34200)
0x0000|66 4c 61 43 |fLaC | magic: "fLaC" (Correct) 0x0-0x3.7 (4)
| | | metadatablocks: [4] 0x4-0x206f.7 (8300)
| | | [0]: metadatablock {} (flac_metadatablock) 0x4-0x29.7 (38)
0x0000| 00 | . | last_block: false 0x4-0x4 (0.1)
0x0000| 00 | . | type: Streaminfo (0) 0x4.1-0x4.7 (0.7)
0x0000| 00 00 22 | .." | length: 34 0x5-0x7.7 (3)
0x0000| 10 00 | .. | minimum_block_size: 4096 0x8-0x9.7 (2)
0x0000| 10 00 | .. | maximum_block_size: 4096 0xa-0xb.7 (2)
0x0000| 00 00 0b | ... | minimum_frame_size: 11 0xc-0xe.7 (3)
0x0000| 00| .| maximum_frame_size: 7947 0xf-0x11.7 (3)
0x0010|1f 0b |.. |
0x0010| 0a c4 40 | ..@ | sample_rate: 44100 0x12-0x14.3 (2.4)
0x0010| 40 | @ | channels: 1 0x14.4-0x14.6 (0.3)
0x0010| 40 f0 | @. | bits_per_sample: 16 0x14.7-0x15.3 (0.5)
0x0010| f0 00 00 56 22 | ...V" | total_samples_in_stream: 22050 0x15.4-0x19.7 (4.4)
0x0010| 29 cf 8e b6 22 e9| )...".| md5: 29cf8eb622e9be01808ecafe817d17a6 0x1a-0x29.7 (16)
0x0020|be 01 80 8e ca fe 81 7d 17 a6 |.......}.. |
| | | [1]: metadatablock {} (flac_metadatablock) 0x2a-0x3f.7 (22)
0x0020| 03 | . | last_block: false 0x2a-0x2a (0.1)
0x0020| 03 | . | type: Seektable (3) 0x2a.1-0x2a.7 (0.7)
0x0020| 00 00 12 | ... | length: 18 0x2b-0x2d.7 (3)
| | | seekpoints: [1] 0x2e-0x3f.7 (18)
| | | [0]: seekpoint {} 0x2e-0x3f.7 (18)
0x0020| 00 00| ..| sample_number: 0 0x2e-0x35.7 (8)
0x0030|00 00 00 00 00 00 |...... |
0x0030| 00 00 00 00 00 00 00 00 | ........ | offset: 0 0x36-0x3d.7 (8)
0x0030| 10 00| ..| number_of_samples: 4096 0x3e-0x3f.7 (2)
| | | [2]: metadatablock {} (flac_metadatablock) 0x40-0x6b.7 (44)
0x0040|04 |. | last_block: false 0x40-0x40 (0.1)
0x0040|04 |. | type: Vorbis comment (4) 0x40.1-0x40.7 (0.7)
0x0040| 00 00 28 | ..( | length: 40 0x41-0x43.7 (3)
| | | comment: {} (vorbis_comment) 0x44-0x6b.7 (40)
0x0040| 20 00 00 00 | ... | vendor_length: 32 0x44-0x47.7 (4)
0x0040| 72 65 66 65 72 65 6e 63| referenc| vendor: "reference libFLAC 1.3.3 20190804" 0x48-0x67.7 (32)
0x0050|65 20 6c 69 62 46 4c 41 43 20 31 2e 33 2e 33 20|e libFLAC 1.3.3 |
0x0060|32 30 31 39 30 38 30 34 |20190804 |
0x0060| 00 00 00 00 | .... | user_comment_list_length: 0 0x68-0x6b.7 (4)
| | | user_comments: [0] 0x6c-NA (0)
| | | [3]: metadatablock {} (flac_metadatablock) 0x6c-0x206f.7 (8196)
0x0060| 81 | . | last_block: true 0x6c-0x6c (0.1)
0x0060| 81 | . | type: Padding (1) 0x6c.1-0x6c.7 (0.7)
0x0060| 00 20 00| . .| length: 8192 0x6d-0x6f.7 (3)
0x0070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| data: 00000000000000000000000000000000... 0x70-0x206f.7 (8192)
* |until 0x206f.7 (8192) | |
| | | frames: [6] 0x2070-0x8597.7 (25896)
| | | [0]: frame {} (flac_frame) 0x2070-0x207a.7 (11)
| | | header: {} 0x2070-0x2075.7 (6)
0x2070|ff f8 |.. | sync: Correct (0x3ffe) 0x2070-0x2071.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x2071.6-0x2071.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x2071.7-0x2071.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x2072-0x2072.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x2072.4-0x2072.7 (0.4)
0x2070| 08 | . | channel_assignment: mono (1) 0x2073-0x2073.3 (0.4)
0x2070| 08 | . | sample_size: 16 0x2073.4-0x2073.6 (0.3)
0x2070| 08 | . | reserved1: Correct (0x0) 0x2073.7-0x2073.7 (0.1)
| | | end_of_header: {} 0x2074-0x2074.7 (1)
0x2070| 00 | . | frame_number: 0 0x2074-0x2074.7 (1)
0x2070| 95 | . | crc: Correct (95) 0x2075-0x2075.7 (1)
| | | subframes: [1] 0x2076-0x2078.7 (3)
| | | [0]: subframe {} 0x2076-0x2078.7 (3)
0x2070| 00 | . | zero_bit: Correct (0x0) 0x2076-0x2076 (0.1)
0x2070| 00 | . | subframe_type: Constant (0) 0x2076.1-0x2076.6 (0.6)
| | | lpc_order: 0 0x2076.7-NA (0)
0x2070| 00 | . | wasted_bits_flag: 0 0x2076.7-0x2076.7 (0.1)
| | | subframe_sample_size: 16 0x2077-NA (0)
0x2070| 00 00 | .. | value: 0 0x2077-0x2078.7 (2)
| | | byte_align: Correct (0x0) 0x2079-NA (0)
0x2070| 21 bd | !. | footer_crc: Correct (21bd) 0x2079-0x207a.7 (2)
| | | [1]: frame {} (flac_frame) 0x207b-0x26d7.7 (1629)
| | | header: {} 0x207b-0x2080.7 (6)
0x2070| ff f8 | .. | sync: Correct (0x3ffe) 0x207b-0x207c.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x207c.6-0x207c.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x207c.7-0x207c.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x207d-0x207d.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x207d.4-0x207d.7 (0.4)
0x2070| 08 | . | channel_assignment: mono (1) 0x207e-0x207e.3 (0.4)
0x2070| 08 | . | sample_size: 16 0x207e.4-0x207e.6 (0.3)
0x2070| 08 | . | reserved1: Correct (0x0) 0x207e.7-0x207e.7 (0.1)
| | | end_of_header: {} 0x207f-0x207f.7 (1)
0x2070| 01| .| frame_number: 1 0x207f-0x207f.7 (1)
0x2080|92 |. | crc: Correct (92) 0x2080-0x2080.7 (1)
| | | subframes: [1] 0x2081-0x26d5.7 (1621)
| | | [0]: subframe {} 0x2081-0x26d5.7 (1621)
0x2080| 16 | . | zero_bit: Correct (0x0) 0x2081-0x2081 (0.1)
0x2080| 16 | . | subframe_type: Fixed (2) 0x2081.1-0x2081.6 (0.6)
| | | lpc_order: 3 0x2081.7-NA (0)
0x2080| 16 | . | wasted_bits_flag: 0 0x2081.7-0x2081.7 (0.1)
| | | subframe_sample_size: 16 0x2082-NA (0)
| | | warmup_samples: [3] 0x2082-0x2087.7 (6)
0x2080| 00 00 | .. | [0]: value 0 0x2082-0x2083.7 (2)
0x2080| 00 00 | .. | [1]: value 0 0x2084-0x2085.7 (2)
0x2080| 00 00 | .. | [2]: value 0 0x2086-0x2087.7 (2)
0x2080| 10 | . | residual_coding_method: rice (4) 0x2088-0x2088.1 (0.2)
0x2080| 10 | . | partition_order: 4 0x2088.2-0x2088.5 (0.4)
| | | rice_partitions: 16 0x2088.6-NA (0)
| | | partitions: [16] 0x2088.6-0x26d5.7 (1613.2)
| | | [0]: partition {} 0x2088.6-0x20a8.6 (32.1)
| | | count: 253 0x2088.6-NA (0)
0x2080| 10 3f | .? | rice_parameter: 0 0x2088.6-0x2089.1 (0.4)
0x2080| 3f ff ff ff ff ff ff| ?......| samples: ffffffffffffffffffffffffffffffff... 0x2089.2-0x20a8.6 (31.5)
0x2090|ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff|................|
0x20a0|ff ff ff ff ff ff ff ff fe |......... |
| | | [1]: partition {} 0x20a8.7-0x212b.7 (131.1)
| | | count: 256 0x20a8.7-NA (0)
0x20a0| fe 52 | .R | rice_parameter: 2 0x20a8.7-0x20a9.2 (0.4)
0x20a0| 52 49 24 92 49 24 92| RI$.I$.| samples: 92492492492492492492492492492492... 0x20a9.3-0x212b.7 (130.5)
0x20b0|49 24 92 49 24 92 49 24 92 49 24 92 49 24 92 40|I$.I$.I$.I$.I$.@|
* |until 0x212b.7 (131) | |
| | | [2]: partition {} 0x212c-0x2193.3 (103.4)
| | | count: 256 0x212c-NA (0)
0x2120| 11 | . | rice_parameter: 1 0x212c-0x212c.3 (0.4)
0x2120| 11 62 71 38| .bq8| samples: 16271388d7df98835b184373f9fcc9b1... 0x212c.4-0x2193.3 (103)
0x2130|8d 7d f9 88 35 b1 84 37 3f 9f cc 9b 11 93 11 84|.}..5..7?.......|
* |until 0x2193.3 (103) | |
| | | [3]: partition {} 0x2193.4-0x21fd (105.5)
| | | count: 256 0x2193.4-NA (0)
0x2190| f1 | . | rice_parameter: 1 0x2193.4-0x2193.7 (0.4)
0x2190| 5b 5a 64 d2 5a 49 45 0a 82 c8 89 88| [Zd.ZIE.....| samples: 5b5a64d25a49450a82c88988a44b1691... 0x2194-0x21fd (105.1)
0x21a0|a4 4b 16 91 0c 27 11 ad 3f 43 59 a6 e3 a1 ce 8e|.K...'..?CY.....|
* |until 0x21fd (106) | |
| | | [4]: partition {} 0x21fd.1-0x2261.5 (100.5)
| | | count: 256 0x21fd.1-NA (0)
0x21f0| 0a | . | rice_parameter: 1 0x21fd.1-0x21fd.4 (0.4)
0x21f0| 0a 61 69| .ai| samples: 4c2d308d28d235bbcd67668ff41a9f5e... 0x21fd.5-0x2261.5 (100.1)
0x2200|84 69 46 91 ad de 6b 3b 34 7f a0 d4 fa f2 32 aa|.iF...k;4.....2.|
* |until 0x2261.5 (101) | |
| | | [5]: partition {} 0x2261.6-0x22cb (105.3)
| | | count: 256 0x2261.6-NA (0)
0x2260| 8c 66 | .f | rice_parameter: 1 0x2261.6-0x2262.1 (0.4)
0x2260| 66 9a 32 f5 65 65 22 c9 16 24 a0 b1 62 4a| f.2.ee"..$..bJ| samples: 9a68cbd595948b24589282c589289489... 0x2262.2-0x22cb (104.7)
0x2270|25 22 62 e8 9e 4e 43 21 88 cc 43 f8 e3 43 23 f9|%"b..NC!..C..C#.|
* |until 0x22cb (105) | |
| | | [6]: partition {} 0x22cb.1-0x2330.7 (101.7)
| | | count: 256 0x22cb.1-NA (0)
0x22c0| 0a | . | rice_parameter: 1 0x22cb.1-0x22cb.4 (0.4)
0x22c0| 0a 2c 96 59 72| .,.Yr| samples: 4592cb2e5eb434868d3dc778c8f43598... 0x22cb.5-0x2330.7 (101.3)
0x22d0|f5 a1 a4 34 69 ee 3b c6 47 a1 ac c4 6b 65 31 32|...4i.;.G...ke12|
* |until 0x2330.7 (102) | |
| | | [7]: partition {} 0x2331-0x239a.3 (105.4)
| | | count: 256 0x2331-NA (0)
0x2330| 1f | . | rice_parameter: 1 0x2331-0x2331.3 (0.4)
0x2330| 1f 9e 9e bc 9a 88 c5 13 12 51 16 24 90 98 4b| .........Q.$..K| samples: f9e9ebc9a88c5131251162490984b098... 0x2331.4-0x239a.3 (105)
0x2340|09 84 c2 31 62 71 38 8d 7d f9 88 35 b1 84 37 3f|...1bq8.}..5..7?|
* |until 0x239a.3 (105) | |
| | | [8]: partition {} 0x239a.4-0x2401 (102.5)
| | | count: 256 0x239a.4-NA (0)
0x2390| b1 | . | rice_parameter: 1 0x239a.4-0x239a.7 (0.4)
0x2390| 14 52 49 30 99| .RI0.| samples: 1452493099348c4d938d6f8e7bb3b76f... 0x239b-0x2401 (102.1)
0x23a0|34 8c 4d 93 8d 6f 8e 7b b3 b7 6f 5b 5a 64 d2 5a|4.M..o.{..o[Zd.Z|
* |until 0x2401 (103) | |
| | | [9]: partition {} 0x2401.1-0x2467.5 (102.5)
| | | count: 256 0x2401.1-NA (0)
0x2400| 0b | . | rice_parameter: 1 0x2401.1-0x2401.4 (0.4)
0x2400| 0b f9 fc c9 b1 19 31 18 4e 22 d1 42 60 99 09| ......1.N".B`..| samples: 7f3f993623262309c45a284c13212604... 0x2401.5-0x2467.5 (102.1)
0x2410|30 26 2c 4b 12 61 69 84 69 46 91 ad de 6b 3b 34|0&,K.ai.iF...k;4|
* |until 0x2467.5 (103) | |
| | | [10]: partition {} 0x2467.6-0x24d1.3 (105.6)
| | | count: 256 0x2467.6-NA (0)
0x2460| 88 58 | .X | rice_parameter: 1 0x2467.6-0x2468.1 (0.4)
0x2460| 58 8a 44 b1 69 10 c2 71| X.D.i..q| samples: 622912c5a44309c46b4fd0d669b8e873... 0x2468.2-0x24d1.3 (105.2)
0x2470|1a d3 f4 35 9a 6e 3a 1c e8 e6 9a 32 f5 65 65 22|...5.n:....2.ee"|
* |until 0x24d1.3 (106) | |
| | | [11]: partition {} 0x24d1.4-0x2535.3 (100)
| | | count: 256 0x24d1.4-NA (0)
0x24d0| 31 | 1 | rice_parameter: 1 0x24d1.4-0x24d1.7 (0.4)
0x24d0| 47 fa 0d 4f af 23 2a a4 94 8a 44 b0 5a 12| G..O.#*...D.Z.| samples: 47fa0d4faf232aa4948a44b05a12604c... 0x24d2-0x2535.3 (99.4)
0x24e0|60 4c 92 2c 96 59 72 f5 a1 a4 34 69 ee 3b c6 47|`L.,.Yr...4i.;.G|
* |until 0x2535.3 (100) | |
| | | [12]: partition {} 0x2535.4-0x259e.7 (105.4)
| | | count: 256 0x2535.4-NA (0)
0x2530| a1 | . | rice_parameter: 1 0x2535.4-0x2535.7 (0.4)
0x2530| 0b 16 24 a2 52 26 2e 89 e4 e4| ..$.R&....| samples: 0b1624a252262e89e4e432188cc43f8e... 0x2536-0x259e.7 (105)
0x2540|32 18 8c c4 3f 8e 34 32 3f 9e 9e bc 9a 88 c5 13|2...?.42?.......|
* |until 0x259e.7 (105) | |
| | | [13]: partition {} 0x259f-0x2604.6 (101.7)
| | | count: 256 0x259f-NA (0)
0x2590| 13| .| rice_parameter: 1 0x259f-0x259f.3 (0.4)
0x2590| 13| .| samples: 3bc647a1acc46b653132b22d098908c1... 0x259f.4-0x2604.6 (101.3)
0x25a0|bc 64 7a 1a cc 46 b6 53 13 2b 22 d0 98 90 8c 16|.dz..F.S.+".....|
* |until 0x2604.6 (102) | |
| | | [14]: partition {} 0x2604.7-0x266f.1 (106.3)
| | | count: 256 0x2604.7-NA (0)
0x2600| 16 22 | ." | rice_parameter: 1 0x2604.7-0x2605.2 (0.4)
0x2600| 22 49 09 84 b0 98 4c 23 16 27 13| "I....L#.'.| samples: 12484c2584c26118b1389c46befcc41a... 0x2605.3-0x266f.1 (105.7)
0x2610|88 d7 df 98 83 5b 18 43 73 f9 fc c9 b1 19 31 18|.....[.Cs.....1.|
* |until 0x266f.1 (106) | |
| | | [15]: partition {} 0x266f.2-0x26d5.7 (102.6)
| | | count: 256 0x266f.2-NA (0)
0x2660| 84| .| rice_parameter: 1 0x266f.2-0x266f.5 (0.4)
0x2660| 84| .| samples: 39eeceddbd6d6993496925142a0b2226... 0x266f.6-0x26d5.7 (102.2)
0x2670|e7 bb 3b 76 f5 b5 a6 4d 25 a4 94 50 a8 2c 88 98|..;v...M%..P.,..|
* |until 0x26d5.7 (103) | |
| | | byte_align: Correct (0x0) 0x26d6-NA (0)
0x26d0| 73 a5 | s. | footer_crc: Correct (73a5) 0x26d6-0x26d7.7 (2)
| | | [2]: frame {} (flac_frame) 0x26d8-0x45e2.7 (7947)
| | | header: {} 0x26d8-0x26dd.7 (6)
0x26d0| ff f8 | .. | sync: Correct (0x3ffe) 0x26d8-0x26d9.5 (1.6)
0x26d0| f8 | . | reserved0: Correct (0x0) 0x26d9.6-0x26d9.6 (0.1)
0x26d0| f8 | . | blocking_strategy: Fixed (0) 0x26d9.7-0x26d9.7 (0.1)
0x26d0| c9 | . | block_size: 4096 0x26da-0x26da.3 (0.4)
0x26d0| c9 | . | sample_rate: 44100 0x26da.4-0x26da.7 (0.4)
0x26d0| 08 | . | channel_assignment: mono (1) 0x26db-0x26db.3 (0.4)
0x26d0| 08 | . | sample_size: 16 0x26db.4-0x26db.6 (0.3)
0x26d0| 08 | . | reserved1: Correct (0x0) 0x26db.7-0x26db.7 (0.1)
| | | end_of_header: {} 0x26dc-0x26dc.7 (1)
0x26d0| 02 | . | frame_number: 2 0x26dc-0x26dc.7 (1)
0x26d0| 9b | . | crc: Correct (9b) 0x26dd-0x26dd.7 (1)
| | | subframes: [1] 0x26de-0x45e0.6 (7938.7)
| | | [0]: subframe {} 0x26de-0x45e0.6 (7938.7)
0x26d0| 10 | . | zero_bit: Correct (0x0) 0x26de-0x26de (0.1)
0x26d0| 10 | . | subframe_type: Fixed (2) 0x26de.1-0x26de.6 (0.6)
| | | lpc_order: 0 0x26de.7-NA (0)
0x26d0| 10 | . | wasted_bits_flag: 0 0x26de.7-0x26de.7 (0.1)
| | | subframe_sample_size: 16 0x26df-NA (0)
| | | warmup_samples: [0] 0x26df-NA (0)
0x26d0| 16| .| residual_coding_method: rice (4) 0x26df-0x26df.1 (0.2)
0x26d0| 16| .| partition_order: 5 0x26df.2-0x26df.5 (0.4)
| | | rice_partitions: 32 0x26df.6-NA (0)
| | | partitions: [32] 0x26df.6-0x45e0.6 (7937.1)
| | | [0]: partition {} 0x26df.6-0x27b8.2 (216.5)
| | | count: 128 0x26df.6-NA (0)
0x26d0| 16| .| rice_parameter: 11 0x26df.6-0x26e0.1 (0.4)
0x26e0|eb |. |
0x26e0|eb d7 1e f8 27 e6 d2 56 ab 76 21 b7 0d e7 64 52|....'..V.v!...dR| samples: af5c7be09f9b495aadd886dc379d914a... 0x26e0.2-0x27b8.2 (216.1)
0x26f0|94 06 5a 79 90 e6 d6 9d 76 7d 78 88 d1 29 a2 7c|..Zy....v}x..).||
* |until 0x27b8.2 (217) | |
| | | [1]: partition {} 0x27b8.3-0x2885 (204.6)
| | | count: 128 0x27b8.3-NA (0)
0x27b0| d7 | . | rice_parameter: 11 0x27b8.3-0x27b8.6 (0.4)
0x27b0| d7 66 97 81 86 19 01 96| .f......| samples: b34bc0c30c80cb4ccccc4ca2c62c08b9... 0x27b8.7-0x2885 (204.2)
0x27c0|99 99 98 99 45 8c 58 11 72 96 09 4b 93 41 19 d0|....E.X.r..K.A..|
* |until 0x2885 (205) | |
| | | [2]: partition {} 0x2885.1-0x295d.6 (216.6)
| | | count: 128 0x2885.1-NA (0)
0x2880| 5f | _ | rice_parameter: 11 0x2885.1-0x2885.4 (0.4)
0x2880| 5f a8 22 e1 45 4b a2 68 e3 a6 08| _.".EK.h...| samples: f5045c28a9744d1c74c10204c215e862... 0x2885.5-0x295d.6 (216.2)
0x2890|10 26 10 af 43 16 0d b0 3b e0 41 80 95 81 4d 42|.&..C...;.A...MB|
* |until 0x295d.6 (217) | |
| | | [3]: partition {} 0x295d.7-0x2a2d.1 (207.3)
| | | count: 128 0x295d.7-NA (0)
0x2950| bf 69 | .i | rice_parameter: 11 0x295d.7-0x295e.2 (0.4)
0x2950| 69 39| i9| samples: 49ca7dd536b1f5c3af4d7fec0f601af5... 0x295e.3-0x2a2d.1 (206.7)
0x2960|4f ba a6 d6 3e b8 75 e9 af fd 81 ec 03 5e ba e4|O...>.u......^..|
* |until 0x2a2d.1 (207) | |
| | | [4]: partition {} 0x2a2d.2-0x2b09.6 (220.5)
| | | count: 128 0x2a2d.2-NA (0)
0x2a20| 73 | s | rice_parameter: 12 0x2a2d.2-0x2a2d.5 (0.4)
0x2a20| 73 0c 79| s.y| samples: c31e68f5dbc3fecdfbdd05546cd30b51... 0x2a2d.6-0x2b09.6 (220.1)
0x2a30|a3 d7 6f 0f fb 37 ef 74 15 51 b3 4c 2d 45 b5 69|..o..7.t.Q.L-E.i|
* |until 0x2b09.6 (221) | |
| | | [5]: partition {} 0x2b09.7-0x2c05.3 (251.5)
| | | count: 128 0x2b09.7-NA (0)
0x2b00| 07 c5 | .. | rice_parameter: 14 0x2b09.7-0x2b0a.2 (0.4)
0x2b00| c5 c8 23 cc 14 1f| ..#...| samples: 2e411e60a0ff2b9bb640b05df5c9bcaa... 0x2b0a.3-0x2c05.3 (251.1)
0x2b10|e5 73 76 c8 16 0b be b9 37 95 5d 27 e8 97 36 eb|.sv.....7.]'..6.|
* |until 0x2c05.3 (252) | |
| | | [6]: partition {} 0x2c05.4-0x2d04.6 (255.3)
| | | count: 128 0x2c05.4-NA (0)
0x2c00| ce | . | rice_parameter: 14 0x2c05.4-0x2c05.7 (0.4)
0x2c00| b1 82 ee 75 1d b8 e4 b3 41 a9| ...u....A.| samples: b182ee751db8e4b341a91965cdd10182... 0x2c06-0x2d04.6 (254.7)
0x2c10|19 65 cd d1 01 82 5c 3a 76 aa b9 29 77 ea 2f 51|.e....\:v..)w./Q|
* |until 0x2d04.6 (255) | |
| | | [7]: partition {} 0x2d04.7-0x2e03.4 (254.6)
| | | count: 128 0x2d04.7-NA (0)
0x2d00| 17 c3 | .. | rice_parameter: 14 0x2d04.7-0x2d05.2 (0.4)
0x2d00| c3 28 43 b8 0a d3 7b dd 45 49 c9| .(C...{.EI.| samples: 19421dc0569bdeea2a4e4854ef5c8fc1... 0x2d05.3-0x2e03.4 (254.2)
0x2d10|0a 9d eb 91 f8 33 e4 62 1a 4e bd de 96 4f 45 af|.....3.b.N...OE.|
* |until 0x2e03.4 (255) | |
| | | [8]: partition {} 0x2e03.5-0x2f00.3 (252.7)
| | | count: 128 0x2e03.5-NA (0)
0x2e00| 4f 4e | ON | rice_parameter: 14 0x2e03.5-0x2e04 (0.4)
0x2e00| 4e 12 8a 82 ea 82 61 e7 d5 fa 77 ab| N.....a...w.| samples: 9c251505d504c3cfabf4ef57aef97aab... 0x2e04.1-0x2f00.3 (252.3)
0x2e10|d7 7c bd 55 8f f0 52 29 db 56 58 a0 85 d1 5a a9|.|.U..R).VX...Z.|
* |until 0x2f00.3 (253) | |
| | | [9]: partition {} 0x2f00.4-0x2ffe (253.5)
| | | count: 128 0x2f00.4-NA (0)
0x2f00|7e |~ | rice_parameter: 14 0x2f00.4-0x2f00.7 (0.4)
0x2f00| e0 c4 f9 9e 64 84 4c 0b 9b 11 d7 02 0e c9 2e| ....d.L........| samples: e0c4f99e64844c0b9b11d7020ec92eab... 0x2f01-0x2ffe (253.1)
0x2f10|ab ed 71 29 a5 b0 55 40 6c f4 7d 74 aa 30 49 21|..q)..U@l.}t.0I!|
* |until 0x2ffe (254) | |
| | | [10]: partition {} 0x2ffe.1-0x30fd.5 (255.5)
| | | count: 128 0x2ffe.1-NA (0)
0x2ff0| 73 | s | rice_parameter: 14 0x2ffe.1-0x2ffe.4 (0.4)
0x2ff0| 73 c5| s.| samples: 78a04ed7bc5a9d3045f68bb77b30ca45... 0x2ffe.5-0x30fd.5 (255.1)
0x3000|02 76 bd e2 d4 e9 82 2f b4 5d bb d9 86 52 2e 11|.v...../.]...R..|
* |until 0x30fd.5 (256) | |
| | | [11]: partition {} 0x30fd.6-0x31fb.3 (253.6)
| | | count: 128 0x30fd.6-NA (0)
0x30f0| cb 93 | .. | rice_parameter: 14 0x30fd.6-0x30fe.1 (0.4)
0x30f0| 93 e8| ..| samples: 4fa3bbc710e4c07a2dce1cee8d75aeaa... 0x30fe.2-0x31fb.3 (253.2)
0x3100|ee f1 c4 39 30 1e 8b 73 87 3b a3 5d 6b aa a3 e5|...90..s.;.]k...|
* |until 0x31fb.3 (254) | |
| | | [12]: partition {} 0x31fb.4-0x32fb.2 (255.7)
| | | count: 128 0x31fb.4-NA (0)
0x31f0| ce | . | rice_parameter: 14 0x31fb.4-0x31fb.7 (0.4)
0x31f0| 8f ba c7 ae| ....| samples: 8fbac7aefa415a69d795e0f1a6db88ac... 0x31fc-0x32fb.2 (255.3)
0x3200|fa 41 5a 69 d7 95 e0 f1 a6 db 88 ac f2 89 c0 8e|.AZi............|
* |until 0x32fb.2 (256) | |
| | | [13]: partition {} 0x32fb.3-0x33f8.5 (253.3)
| | | count: 128 0x32fb.3-NA (0)
0x32f0| 5d | ] | rice_parameter: 14 0x32fb.3-0x32fb.6 (0.4)
0x32f0| 5d 5d 1c 8f 7d| ]]..}| samples: ae8e47bec8aa72b0943199526289a9b0... 0x32fb.7-0x33f8.5 (252.7)
0x3300|91 54 e5 61 28 63 32 a4 c5 13 53 60 dd af 51 84|.T.a(c2...S`..Q.|
* |until 0x33f8.5 (253) | |
| | | [14]: partition {} 0x33f8.6-0x34f6.5 (254)
| | | count: 128 0x33f8.6-NA (0)
0x33f0| 4f 95 | O. | rice_parameter: 14 0x33f8.6-0x33f9.1 (0.4)
0x33f0| 95 28 8e d0 0b 96 0c| .(.....| samples: 54a23b402e5833b32b8b196def222586... 0x33f9.2-0x34f6.5 (253.4)
0x3400|ec ca e2 c6 5b 7b c8 89 61 b9 b1 c6 f5 b4 45 63|....[{..a.....Ec|
* |until 0x34f6.5 (254) | |
| | | [15]: partition {} 0x34f6.6-0x35f4.5 (254)
| | | count: 128 0x34f6.6-NA (0)
0x34f0| a3 b2 | .. | rice_parameter: 14 0x34f6.6-0x34f7.1 (0.4)
0x34f0| b2 9c b5 9e 21 54 a6 d3 54| ....!T..T| samples: ca72d67885529b4d50706a8b4627a2b0... 0x34f7.2-0x35f4.5 (253.4)
0x3500|1c 1a a2 d1 89 e8 ac 1e 23 df fd 13 86 89 19 07|........#.......|
* |until 0x35f4.5 (254) | |
| | | [16]: partition {} 0x35f4.6-0x36f1.6 (253.1)
| | | count: 128 0x35f4.6-NA (0)
0x35f0| f3 97 | .. | rice_parameter: 14 0x35f4.6-0x35f5.1 (0.4)
0x35f0| 97 7f eb f2 c8 3a 34 77 15 e0 95| .....:4w...| samples: 5dffafcb20e8d1dc57825716742cae8e... 0x35f5.2-0x36f1.6 (252.5)
0x3600|c5 9d 0b 2b a3 be f4 ca d8 d8 e4 bf 2d 8e 2c 8d|...+........-.,.|
* |until 0x36f1.6 (253) | |
| | | [17]: partition {} 0x36f1.7-0x37ef.6 (254)
| | | count: 128 0x36f1.7-NA (0)
0x36f0| 17 c4 | .. | rice_parameter: 14 0x36f1.7-0x36f2.2 (0.4)
0x36f0| c4 53 98 12 28 eb 96 da 32 18 a5 89 c1 59| .S..(...2....Y| samples: 229cc091475cb6d190c52c4e0acfc5d3... 0x36f2.3-0x37ef.6 (253.4)
0x3700|f8 ba 75 a7 38 30 de 16 36 c3 7a 6c 9a a0 4e fe|..u.80..6.zl..N.|
* |until 0x37ef.6 (254) | |
| | | [18]: partition {} 0x37ef.7-0x38ee.6 (255)
| | | count: 128 0x37ef.7-NA (0)
0x37e0| 27| '| rice_parameter: 14 0x37ef.7-0x37f0.2 (0.4)
0x37f0|ce |. |
0x37f0|ce 0d 92 32 c5 a5 3c 9a 0c 79 79 0d f8 49 a1 35|...2..<..yy..I.5| samples: 706c91962d29e4d063cbc86fc24d09ae... 0x37f0.3-0x38ee.6 (254.4)
0x3800|c4 b4 1e 1c e3 67 93 54 70 79 0d d2 92 81 e2 5c|.....g.Tpy.....\|
* |until 0x38ee.6 (255) | |
| | | [19]: partition {} 0x38ee.7-0x39ee (255.2)
| | | count: 128 0x38ee.7-NA (0)
0x38e0| 37 c8| 7.| rice_parameter: 14 0x38ee.7-0x38ef.2 (0.4)
0x38e0| c8| .| samples: 449714990b1dc246774eabbbf11a2805... 0x38ef.3-0x39ee (254.6)
0x38f0|92 e2 93 21 63 b8 48 ce e9 d5 77 7e 23 45 00 a3|...!c.H...w~#E..|
* |until 0x39ee (255) | |
| | | [20]: partition {} 0x39ee.1-0x3aee (256)
| | | count: 128 0x39ee.1-NA (0)
0x39e0| f6 | . | rice_parameter: 14 0x39ee.1-0x39ee.4 (0.4)
0x39e0| f6 77| .w| samples: cee2aa60916e78d999c2f931245b3a1a... 0x39ee.5-0x3aee (255.4)
0x39f0|15 53 04 8b 73 c6 cc ce 17 c9 89 22 d9 d0 d2 24|.S..s......"...$|
* |until 0x3aee (256) | |
| | | [21]: partition {} 0x3aee.1-0x3bee.3 (256.3)
| | | count: 128 0x3aee.1-NA (0)
0x3ae0| f6 | . | rice_parameter: 14 0x3aee.1-0x3aee.4 (0.4)
0x3ae0| f6 ef| ..| samples: ddfcb2ed17a23389658947a8e07f526c... 0x3aee.5-0x3bee.3 (255.7)
0x3af0|e5 97 68 bd 11 9c 4b 2c 4a 3d 47 03 fa 93 62 14|..h...K,J=G...b.|
* |until 0x3bee.3 (256) | |
| | | [22]: partition {} 0x3bee.4-0x3ced.3 (255)
| | | count: 128 0x3bee.4-NA (0)
0x3be0| 5e | ^ | rice_parameter: 14 0x3bee.4-0x3bee.7 (0.4)
0x3be0| 9a| .| samples: 9abec701ee60a42f16e969a4e9355314... 0x3bef-0x3ced.3 (254.4)
0x3bf0|be c7 01 ee 60 a4 2f 16 e9 69 a4 e9 35 53 14 bd|....`./..i..5S..|
* |until 0x3ced.3 (255) | |
| | | [23]: partition {} 0x3ced.4-0x3deb.1 (253.6)
| | | count: 128 0x3ced.4-NA (0)
0x3ce0| 3e | > | rice_parameter: 14 0x3ced.4-0x3ced.7 (0.4)
0x3ce0| e8 c8| ..| samples: e8c870e04f83320a3d8aa5fcf9992175... 0x3cee-0x3deb.1 (253.2)
0x3cf0|70 e0 4f 83 32 0a 3d 8a a5 fc f9 99 21 75 c9 1c|p.O.2.=.....!u..|
* |until 0x3deb.1 (254) | |
| | | [24]: partition {} 0x3deb.2-0x3eea.2 (255.1)
| | | count: 128 0x3deb.2-NA (0)
0x3de0| fb | . | rice_parameter: 14 0x3deb.2-0x3deb.5 (0.4)
0x3de0| fb be 7e 4c 67| ..~Lg| samples: ef9f9319c9d8ac8661b75d852d5f10c8... 0x3deb.6-0x3eea.2 (254.5)
0x3df0|27 62 b2 19 86 dd 76 14 b5 7c 43 21 18 da c4 01|'b....v..|C!....|
* |until 0x3eea.2 (255) | |
| | | [25]: partition {} 0x3eea.3-0x3fe7.6 (253.4)
| | | count: 128 0x3eea.3-NA (0)
0x3ee0| bd | . | rice_parameter: 14 0x3eea.3-0x3eea.6 (0.4)
0x3ee0| bd 06 86 04 a6 1a| ......| samples: 834302530d4a852d71d2d5a9782a2894... 0x3eea.7-0x3fe7.6 (253)
0x3ef0|95 0a 5a e3 a5 ab 52 f0 54 51 29 a6 64 72 3e b1|..Z...R.TQ).dr>.|
* |until 0x3fe7.6 (253) | |
| | | [26]: partition {} 0x3fe7.7-0x40e5.3 (253.5)
| | | count: 128 0x3fe7.7-NA (0)
0x3fe0| c1 c6 | .. | rice_parameter: 14 0x3fe7.7-0x3fe8.2 (0.4)
0x3fe0| c6 90 18 6c ca 4b 6d e7| ...l.Km.| samples: 3480c366525b6f3917ed5eef2639bb6c... 0x3fe8.3-0x40e5.3 (253.1)
0x3ff0|22 fd ab dd e4 c7 37 6d 9b fc e2 5b 4b f8 b2 10|".....7m...[K...|
* |until 0x40e5.3 (254) | |
| | | [27]: partition {} 0x40e5.4-0x41e4.2 (254.7)
| | | count: 128 0x40e5.4-NA (0)
0x40e0| 5e | ^ | rice_parameter: 14 0x40e5.4-0x40e5.7 (0.4)
0x40e0| 81 af dd 83 f9 8c f0 c1 2d 7a| ........-z| samples: 81afdd83f98cf0c12d7a1ef3e89c8d81... 0x40e6-0x41e4.2 (254.3)
0x40f0|1e f3 e8 9c 8d 81 70 21 26 31 1e 80 ec a6 d0 e6|......p!&1......|
* |until 0x41e4.2 (255) | |
| | | [28]: partition {} 0x41e4.3-0x42e3.2 (255)
| | | count: 128 0x41e4.3-NA (0)
0x41e0| 7d | } | rice_parameter: 14 0x41e4.3-0x41e4.6 (0.4)
0x41e0| 7d d2 2d b6 06 2c de 62 4e 04 cb 9a| }.-..,.bN...| samples: e916db03166f31270265cd6d7b861dc2... 0x41e4.7-0x42e3.2 (254.4)
0x41f0|da f7 0c 3b 84 dc b2 e9 8c 4a 31 c0 cf 7e b1 70|...;.....J1..~.p|
* |until 0x42e3.2 (255) | |
| | | [29]: partition {} 0x42e3.3-0x43e3.3 (256.1)
| | | count: 128 0x42e3.3-NA (0)
0x42e0| 7d | } | rice_parameter: 14 0x42e3.3-0x42e3.6 (0.4)
0x42e0| 7d d3 81 c6 21 49 0a f8 8e 73 e4 ba b1| }...!I...s...| samples: e9c0e310a4857c4739f25d58ac506095... 0x42e3.7-0x43e3.3 (255.5)
0x42f0|58 a0 c1 2a 8c ab 7e f8 fc 8a c9 52 67 6e 45 ee|X..*..~....RgnE.|
* |until 0x43e3.3 (256) | |
| | | [30]: partition {} 0x43e3.4-0x44e3.1 (255.6)
| | | count: 128 0x43e3.4-NA (0)
0x43e0| ee | . | rice_parameter: 14 0x43e3.4-0x43e3.7 (0.4)
0x43e0| 8f 48 26 d2 cb 12 56 77 44 20 1a 80| .H&...VwD ..| samples: 8f4826d2cb12567744201a80f1f26b6b... 0x43e4-0x44e3.1 (255.2)
0x43f0|f1 f2 6b 6b 52 15 e0 a4 88 57 23 b4 c3 ce 2e 5f|..kkR....W#...._|
* |until 0x44e3.1 (256) | |
| | | [31]: partition {} 0x44e3.2-0x45e0.6 (253.5)
| | | count: 128 0x44e3.2-NA (0)
0x44e0| 3a | : | rice_parameter: 14 0x44e3.2-0x44e3.5 (0.4)
0x44e0| 3a be fc 2d 0f 07 f7 b3 be 0e 4f 56 48| :..-......OVH| samples: afbf0b43c1fdecef8393d5922aaa4454... 0x44e3.6-0x45e0.6 (253.1)
0x44f0|aa a9 11 51 18 8b b1 10 64 b0 c5 d6 55 36 61 d0|...Q....d...U6a.|
* |until 0x45e0.6 (254) | |
0x45e0|a4 |. | byte_align: Correct (0x0) 0x45e0.7-0x45e0.7 (0.1)
0x45e0| 47 d4 | G. | footer_crc: Correct (47d4) 0x45e1-0x45e2.7 (2)
| | | [3]: frame {} (flac_frame) 0x45e3-0x5beb.7 (5641)
| | | header: {} 0x45e3-0x45e8.7 (6)
0x45e0| ff f8 | .. | sync: Correct (0x3ffe) 0x45e3-0x45e4.5 (1.6)
0x45e0| f8 | . | reserved0: Correct (0x0) 0x45e4.6-0x45e4.6 (0.1)
0x45e0| f8 | . | blocking_strategy: Fixed (0) 0x45e4.7-0x45e4.7 (0.1)
0x45e0| c9 | . | block_size: 4096 0x45e5-0x45e5.3 (0.4)
0x45e0| c9 | . | sample_rate: 44100 0x45e5.4-0x45e5.7 (0.4)
0x45e0| 08 | . | channel_assignment: mono (1) 0x45e6-0x45e6.3 (0.4)
0x45e0| 08 | . | sample_size: 16 0x45e6.4-0x45e6.6 (0.3)
0x45e0| 08 | . | reserved1: Correct (0x0) 0x45e6.7-0x45e6.7 (0.1)
| | | end_of_header: {} 0x45e7-0x45e7.7 (1)
0x45e0| 03 | . | frame_number: 3 0x45e7-0x45e7.7 (1)
0x45e0| 9c | . | crc: Correct (9c) 0x45e8-0x45e8.7 (1)
| | | subframes: [1] 0x45e9-0x5be9.6 (5632.7)
| | | [0]: subframe {} 0x45e9-0x5be9.6 (5632.7)
0x45e0| 12 | . | zero_bit: Correct (0x0) 0x45e9-0x45e9 (0.1)
0x45e0| 12 | . | subframe_type: Fixed (2) 0x45e9.1-0x45e9.6 (0.6)
| | | lpc_order: 1 0x45e9.7-NA (0)
0x45e0| 12 | . | wasted_bits_flag: 0 0x45e9.7-0x45e9.7 (0.1)
| | | subframe_sample_size: 16 0x45ea-NA (0)
| | | warmup_samples: [1] 0x45ea-0x45eb.7 (2)
0x45e0| e8 31 | .1 | [0]: value -6095 0x45ea-0x45eb.7 (2)
0x45e0| 0b | . | residual_coding_method: rice (4) 0x45ec-0x45ec.1 (0.2)
0x45e0| 0b | . | partition_order: 2 0x45ec.2-0x45ec.5 (0.4)
| | | rice_partitions: 4 0x45ec.6-NA (0)
| | | partitions: [4] 0x45ec.6-0x5be9.6 (5629.1)
| | | [0]: partition {} 0x45ec.6-0x4e0e.3 (2081.6)
| | | count: 1023 0x45ec.6-NA (0)
0x45e0| 0b ad | .. | rice_parameter: 14 0x45ec.6-0x45ed.1 (0.4)
0x45e0| ad 41 1b| .A.| samples: b5046d9c08b5282d2bab1e04ae60b3d2... 0x45ed.2-0x4e0e.3 (2081.2)
0x45f0|67 02 2d 4a 0b 4a ea c7 81 2b 98 2c f4 90 ea c4|g.-J.J...+.,....|
* |until 0x4e0e.3 (2082) | |
| | | [1]: partition {} 0x4e0e.4-0x52ac.7 (1182.4)
| | | count: 1024 0x4e0e.4-NA (0)
0x4e00| c7 | . | rice_parameter: 7 0x4e0e.4-0x4e0e.7 (0.4)
0x4e00| 29| )| samples: 298947f3999cb44b7d706051434cdbe9... 0x4e0f-0x52ac.7 (1182)
0x4e10|89 47 f3 99 9c b4 4b 7d 70 60 51 43 4c db e9 f7|.G....K}p`QCL...|
* |until 0x52ac.7 (1182) | |
| | | [2]: partition {} 0x52ad-0x574b.2 (1182.3)
| | | count: 1024 0x52ad-NA (0)
0x52a0| 73 | s | rice_parameter: 7 0x52ad-0x52ad.3 (0.4)
0x52a0| 73 48 ca| sH.| samples: 348ca2f8b02788e7d39194b44c7e7162... 0x52ad.4-0x574b.2 (1181.7)
0x52b0|2f 8b 02 78 8e 7d 39 19 4b 44 c7 e7 16 25 34 44|/..x.}9.KD...%4D|
* |until 0x574b.2 (1182) | |
| | | [3]: partition {} 0x574b.3-0x5be9.6 (1182.4)
| | | count: 1024 0x574b.3-NA (0)
0x5740| 4e | N | rice_parameter: 7 0x574b.3-0x574b.6 (0.4)
0x5740| 4e 60 18 86 11| N`...| samples: 300c4308c4300ba2c0a4260867a39198... 0x574b.7-0x5be9.6 (1182)
0x5750|88 60 17 45 81 48 4c 10 cf 47 23 31 68 9a 40 73|.`.E.HL..G#1h.@s|
* |until 0x5be9.6 (1182) | |
0x5be0| e8 | . | byte_align: Correct (0x0) 0x5be9.7-0x5be9.7 (0.1)
0x5be0| 82 34 | .4 | footer_crc: Correct (8234) 0x5bea-0x5beb.7 (2)
| | | [4]: frame {} (flac_frame) 0x5bec-0x79a1.7 (7606)
| | | header: {} 0x5bec-0x5bf1.7 (6)
0x5be0| ff f8 | .. | sync: Correct (0x3ffe) 0x5bec-0x5bed.5 (1.6)
0x5be0| f8 | . | reserved0: Correct (0x0) 0x5bed.6-0x5bed.6 (0.1)
0x5be0| f8 | . | blocking_strategy: Fixed (0) 0x5bed.7-0x5bed.7 (0.1)
0x5be0| c9 | . | block_size: 4096 0x5bee-0x5bee.3 (0.4)
0x5be0| c9 | . | sample_rate: 44100 0x5bee.4-0x5bee.7 (0.4)
0x5be0| 08| .| channel_assignment: mono (1) 0x5bef-0x5bef.3 (0.4)
0x5be0| 08| .| sample_size: 16 0x5bef.4-0x5bef.6 (0.3)
0x5be0| 08| .| reserved1: Correct (0x0) 0x5bef.7-0x5bef.7 (0.1)
| | | end_of_header: {} 0x5bf0-0x5bf0.7 (1)
0x5bf0|04 |. | frame_number: 4 0x5bf0-0x5bf0.7 (1)
0x5bf0| 89 | . | crc: Correct (89) 0x5bf1-0x5bf1.7 (1)
| | | subframes: [1] 0x5bf2-0x799f (7597.1)
| | | [0]: subframe {} 0x5bf2-0x799f (7597.1)
0x5bf0| 40 | @ | zero_bit: Correct (0x0) 0x5bf2-0x5bf2 (0.1)
0x5bf0| 40 | @ | subframe_type: LPC (3) 0x5bf2.1-0x5bf2.6 (0.6)
| | | lpc_order: 1 0x5bf2.7-NA (0)
0x5bf0| 40 | @ | wasted_bits_flag: 0 0x5bf2.7-0x5bf2.7 (0.1)
| | | subframe_sample_size: 16 0x5bf3-NA (0)
| | | warmup_samples: [1] 0x5bf3-0x5bf4.7 (2)
0x5bf0| f8 1c | .. | [0]: value -2020 0x5bf3-0x5bf4.7 (2)
0x5bf0| b7 | . | precision: 12 0x5bf5-0x5bf5.3 (0.4)
0x5bf0| b7 a8 | .. | shift: 15 0x5bf5.4-0x5bf6 (0.5)
| | | coefficients: [1] 0x5bf6.1-0x5bf7.4 (1.4)
0x5bf0| a8 98 | .. | [0]: value 1299 0x5bf6.1-0x5bf7.4 (1.4)
0x5bf0| 98 | . | residual_coding_method: rice (4) 0x5bf7.5-0x5bf7.6 (0.2)
0x5bf0| 98 96 | .. | partition_order: 4 0x5bf7.7-0x5bf8.2 (0.4)
| | | rice_partitions: 16 0x5bf8.3-NA (0)
| | | partitions: [16] 0x5bf8.3-0x799f (7590.6)
| | | [0]: partition {} 0x5bf8.3-0x5d9c.7 (420.5)
| | | count: 255 0x5bf8.3-NA (0)
0x5bf0| 96 | . | rice_parameter: 11 0x5bf8.3-0x5bf8.6 (0.4)
0x5bf0| 96 e1 16 7a af 4d 54 a9| ...z.MT.| samples: 708b3d57a6aa54b8a0efc1773726edb6... 0x5bf8.7-0x5d9c.7 (420.1)
0x5c00|71 41 df 82 ee 6e 4d db 6d 24 c9 6c 10 c6 d4 e3|qA...nM.m$.l....|
* |until 0x5d9c.7 (421) | |
| | | [1]: partition {} 0x5d9d-0x5f3b.7 (415)
| | | count: 256 0x5d9d-NA (0)
0x5d90| ba | . | rice_parameter: 11 0x5d9d-0x5d9d.3 (0.4)
0x5d90| ba 07 b0| ...| samples: a07b07c17d31e57f8745fa7ed66ec736... 0x5d9d.4-0x5f3b.7 (414.4)
0x5da0|7c 17 d3 1e 57 f8 74 5f a7 ed 66 ec 73 6d 5b b7||...W.t_..f.sm[.|
* |until 0x5f3b.7 (415) | |
| | | [2]: partition {} 0x5f3c-0x60e7 (427.1)
| | | count: 256 0x5f3c-NA (0)
0x5f30| ba | . | rice_parameter: 11 0x5f3c-0x5f3c.3 (0.4)
0x5f30| ba 26 b2 ec| .&..| samples: a26b2ec4cd7ceb4ffa4a72a91800d5a7... 0x5f3c.4-0x60e7 (426.5)
0x5f40|4c d7 ce b4 ff a4 a7 2a 91 80 0d 5a 75 d1 02 c4|L......*...Zu...|
* |until 0x60e7 (427) | |
| | | [3]: partition {} 0x60e7.1-0x6288.4 (417.4)
| | | count: 256 0x60e7.1-NA (0)
0x60e0| 59 | Y | rice_parameter: 11 0x60e7.1-0x60e7.4 (0.4)
0x60e0| 59 1a 4f d4 76 23 67 98 d0| Y.O.v#g..| samples: 2349fa8ec46cf31a164c9d643e78c6d9... 0x60e7.5-0x6288.4 (417)
0x60f0|b2 64 eb 21 f3 c6 36 cb 12 2b 72 5c a0 3a 53 ea|.d.!..6..+r\.:S.|
* |until 0x6288.4 (417) | |
| | | [4]: partition {} 0x6288.5-0x643d.5 (437.1)
| | | count: 256 0x6288.5-NA (0)
0x6280| de 38 | .8 | rice_parameter: 12 0x6288.5-0x6289 (0.4)
0x6280| 38 1e da 5b 4d ec bf| 8..[M..| samples: 703db4b69bd97f61ed767590d5114f55... 0x6289.1-0x643d.5 (436.5)
0x6290|b0 f6 bb 3a c8 6a 88 a7 aa 94 7a 28 bf f5 f5 2f|...:.j....z(.../|
* |until 0x643d.5 (437) | |
| | | [5]: partition {} 0x643d.6-0x6631.5 (500)
| | | count: 256 0x643d.6-NA (0)
0x6430| cb b6 | .. | rice_parameter: 14 0x643d.6-0x643e.1 (0.4)
0x6430| b6 e5| ..| samples: db95caf55bc5bccadd460276503d96ee... 0x643e.2-0x6631.5 (499.4)
0x6440|72 bd 56 f1 6f 32 b7 51 80 9d 94 0f 65 bb ae e3|r.V.o2.Q....e...|
* |until 0x6631.5 (500) | |
| | | [6]: partition {} 0x6631.6-0x681e.4 (492.7)
| | | count: 256 0x6631.6-NA (0)
0x6630| c3 5e | .^ | rice_parameter: 13 0x6631.6-0x6632.1 (0.4)
0x6630| 5e 78 b7 72 64 d8 26 8a 96 a4 e7 4a 75 73| ^x.rd.&....Jus| samples: 79e2ddc993609a2a5a939d29d5cf3fc2... 0x6632.2-0x681e.4 (492.3)
0x6640|cf f0 93 79 11 e9 b5 7e 93 bb f3 12 30 1f 46 1c|...y...~....0.F.|
* |until 0x681e.4 (493) | |
| | | [7]: partition {} 0x681e.5-0x6a0f (496.4)
| | | count: 256 0x681e.5-NA (0)
0x6810| 7e b1| ~.| rice_parameter: 13 0x681e.5-0x681f (0.4)
0x6810| b1| .| samples: 62002cfa280c08b38638387e0aba8a8c... 0x681f.1-0x6a0f (496)
0x6820|00 16 7d 14 06 04 59 c3 1c 1c 3f 05 5d 45 46 52|..}...Y...?.]EFR|
* |until 0x6a0f (496) | |
| | | [8]: partition {} 0x6a0f.1-0x6c01.5 (498.5)
| | | count: 256 0x6a0f.1-NA (0)
0x6a00| f5| .| rice_parameter: 14 0x6a0f.1-0x6a0f.4 (0.4)
0x6a00| f5| .| samples: bb42863ba33f3ab211c64664993818ad... 0x6a0f.5-0x6c01.5 (498.1)
0x6a10|da 14 31 dd 19 f9 d5 90 8e 32 33 24 c9 c0 c5 6f|..1......23$...o|
* |until 0x6c01.5 (499) | |
| | | [9]: partition {} 0x6c01.6-0x6df3.2 (497.5)
| | | count: 256 0x6c01.6-NA (0)
0x6c00| 17 a8 | .. | rice_parameter: 14 0x6c01.6-0x6c02.1 (0.4)
0x6c00| a8 05 37 26 6f cf ae 1b dd 7f 96 9b 1b 33| ..7&o........3| samples: a014dc99bf3eb86f75fe5a6c6ccf7f8e... 0x6c02.2-0x6df3.2 (497.1)
0x6c10|df e3 ba 04 95 f6 82 17 58 58 06 72 11 7d 4e 58|........XX.r.}NX|
* |until 0x6df3.2 (498) | |
| | | [10]: partition {} 0x6df3.3-0x6fe5.5 (498.3)
| | | count: 256 0x6df3.3-NA (0)
0x6df0| 1c | . | rice_parameter: 14 0x6df3.3-0x6df3.6 (0.4)
0x6df0| 1c 8d ce eb 01 fb f2 1c 62 62 25 99 c5| ........bb%..| samples: 46e77580fdf90e313112cce2f13bc802... 0x6df3.7-0x6fe5.5 (497.7)
0x6e00|e2 77 90 04 e0 c4 62 7b 03 93 4a a2 af ef 1a e6|.w....b{..J.....|
* |until 0x6fe5.5 (498) | |
| | | [11]: partition {} 0x6fe5.6-0x71d7.5 (498)
| | | count: 256 0x6fe5.6-NA (0)
0x6fe0| eb 96 | .. | rice_parameter: 14 0x6fe5.6-0x6fe6.1 (0.4)
0x6fe0| 96 ef b9 6e 13 94 e1 d2 b4 56| ...n.....V| samples: 5bbee5b84e53874ad158cd0580f5ab45... 0x6fe6.2-0x71d7.5 (497.4)
0x6ff0|33 41 60 3d 6a d1 73 fc fc 02 8f 22 81 b7 50 75|3A`=j.s...."..Pu|
* |until 0x71d7.5 (498) | |
| | | [12]: partition {} 0x71d7.6-0x73c9.7 (498.2)
| | | count: 256 0x71d7.6-NA (0)
0x71d0| 5b b5 | [. | rice_parameter: 14 0x71d7.6-0x71d8.1 (0.4)
0x71d0| b5 7c 22 b5 a0 2b 12 d6| .|"..+..| samples: d5f08ad680ac4b594203e328815da48a... 0x71d8.2-0x73c9.7 (497.6)
0x71e0|50 80 f8 ca 20 57 69 22 9a db c4 a6 cb 87 6d fa|P... Wi"......m.|
* |until 0x73c9.7 (498) | |
| | | [13]: partition {} 0x73ca-0x75ba (496.1)
| | | count: 256 0x73ca-NA (0)
0x73c0| d6 | . | rice_parameter: 13 0x73ca-0x73ca.3 (0.4)
0x73c0| d6 16 75 22 37 5b| ..u"7[| samples: 6167522375b79b621473e8c184b9d99a... 0x73ca.4-0x75ba (495.5)
0x73d0|79 b6 21 47 3e 8c 18 4b 9d 99 ae a0 e3 58 4b e0|y.!G>..K.....XK.|
* |until 0x75ba (496) | |
| | | [14]: partition {} 0x75ba.1-0x77ac.4 (498.4)
| | | count: 256 0x75ba.1-NA (0)
0x75b0| 77 | w | rice_parameter: 14 0x75ba.1-0x75ba.4 (0.4)
0x75b0| 77 ff 89 99 5d 95| w...].| samples: fff1332bb2ad8becb709e2d30a5c6c30... 0x75ba.5-0x77ac.4 (498)
0x75c0|6c 5f 65 b8 4f 16 98 52 e3 61 83 8a 20 d7 7e 8d|l_e.O..R.a.. .~.|
* |until 0x77ac.4 (498) | |
| | | [15]: partition {} 0x77ac.5-0x799f (498.4)
| | | count: 256 0x77ac.5-NA (0)
0x77a0| f7 5d | .] | rice_parameter: 14 0x77ac.5-0x77ad (0.4)
0x77a0| 5d 85 ca| ]..| samples: bb0b95c9b13eee1dbcceeeb8d2d931d7... 0x77ad.1-0x799f (498)
0x77b0|e4 d8 9f 77 0e de 67 77 5c 69 6c 98 eb c5 4d 68|...w..gw\il...Mh|
* |until 0x799f (498) | |
0x7990| 00| .| byte_align: Correct (0x0) 0x799f.1-0x799f.7 (0.7)
0x79a0|32 53 |2S | footer_crc: Correct (3253) 0x79a0-0x79a1.7 (2)
| | | [5]: frame {} (flac_frame) 0x79a2-0x8597.7 (3062)
| | | header: {} 0x79a2-0x79a9.7 (8)
0x79a0| ff f8 | .. | sync: Correct (0x3ffe) 0x79a2-0x79a3.5 (1.6)
0x79a0| f8 | . | reserved0: Correct (0x0) 0x79a3.6-0x79a3.6 (0.1)
0x79a0| f8 | . | blocking_strategy: Fixed (0) 0x79a3.7-0x79a3.7 (0.1)
0x79a0| 79 | y | block_size: end of header (16 bit) (0) 0x79a4-0x79a4.3 (0.4)
0x79a0| 79 | y | sample_rate: 44100 0x79a4.4-0x79a4.7 (0.4)
0x79a0| 08 | . | channel_assignment: mono (1) 0x79a5-0x79a5.3 (0.4)
0x79a0| 08 | . | sample_size: 16 0x79a5.4-0x79a5.6 (0.3)
0x79a0| 08 | . | reserved1: Correct (0x0) 0x79a5.7-0x79a5.7 (0.1)
| | | end_of_header: {} 0x79a6-0x79a8.7 (3)
0x79a0| 05 | . | frame_number: 5 0x79a6-0x79a6.7 (1)
0x79a0| 06 21 | .! | block_size: 1570 0x79a7-0x79a8.7 (2)
0x79a0| 38 | 8 | crc: Correct (38) 0x79a9-0x79a9.7 (1)
| | | subframes: [1] 0x79aa-0x8595.7 (3052)
| | | [0]: subframe {} 0x79aa-0x8595.7 (3052)
0x79a0| 10 | . | zero_bit: Correct (0x0) 0x79aa-0x79aa (0.1)
0x79a0| 10 | . | subframe_type: Fixed (2) 0x79aa.1-0x79aa.6 (0.6)
| | | lpc_order: 0 0x79aa.7-NA (0)
0x79a0| 10 | . | wasted_bits_flag: 0 0x79aa.7-0x79aa.7 (0.1)
| | | subframe_sample_size: 16 0x79ab-NA (0)
| | | warmup_samples: [0] 0x79ab-NA (0)
0x79a0| 03 | . | residual_coding_method: rice (4) 0x79ab-0x79ab.1 (0.2)
0x79a0| 03 | . | partition_order: 0 0x79ab.2-0x79ab.5 (0.4)
| | | rice_partitions: 1 0x79ab.6-NA (0)
| | | partitions: [1] 0x79ab.6-0x8595.7 (3050.2)
| | | [0]: partition {} 0x79ab.6-0x8595.7 (3050.2)
| | | count: 1570 0x79ab.6-NA (0)
0x79a0| 03 4b | .K | rice_parameter: 13 0x79ab.6-0x79ac.1 (0.4)
0x79a0| 4b 7e 8d 4a| K~.J| samples: 2dfa352a08b789dd8474a5cd68d34540... 0x79ac.2-0x8595.7 (3049.6)
0x79b0|82 2d e2 77 61 1d 29 73 5a 34 d1 50 25 c5 49 94|.-.wa.)sZ4.P%.I.|
* |until 0x8595.7 (3050) | |
| | | byte_align: Correct (0x0) 0x8596-NA (0)
0x8590| ce 60| | .`| | footer_crc: Correct (ce60) 0x8596-0x8597.7 (2)
| | | md5_calculated: 29cf8eb622e9be01808ecafe817d17a6 0x8598-NA (0)
| | | decoded_samples: 22050 0x8598-NA (0)

BIN
format/flac/testdata/mono24.flac vendored Normal file

Binary file not shown.

736
format/flac/testdata/mono24.fqtest vendored Normal file
View File

@ -0,0 +1,736 @@
/mono24.flac:
> fq -d flac verbose /mono24.flac
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /mono24.flac (flac) 0x0-0xbcca.7 (48331)
0x0000|66 4c 61 43 |fLaC | magic: "fLaC" (Correct) 0x0-0x3.7 (4)
| | | metadatablocks: [4] 0x4-0x209b.7 (8344)
| | | [0]: metadatablock {} (flac_metadatablock) 0x4-0x29.7 (38)
0x0000| 00 | . | last_block: false 0x4-0x4 (0.1)
0x0000| 00 | . | type: Streaminfo (0) 0x4.1-0x4.7 (0.7)
0x0000| 00 00 22 | .." | length: 34 0x5-0x7.7 (3)
0x0000| 10 00 | .. | minimum_block_size: 4096 0x8-0x9.7 (2)
0x0000| 10 00 | .. | maximum_block_size: 4096 0xa-0xb.7 (2)
0x0000| 00 00 0c | ... | minimum_frame_size: 12 0xc-0xe.7 (3)
0x0000| 00| .| maximum_frame_size: 12047 0xf-0x11.7 (3)
0x0010|2f 0f |/. |
0x0010| 0a c4 41 | ..A | sample_rate: 44100 0x12-0x14.3 (2.4)
0x0010| 41 | A | channels: 1 0x14.4-0x14.6 (0.3)
0x0010| 41 70 | Ap | bits_per_sample: 24 0x14.7-0x15.3 (0.5)
0x0010| 70 00 00 56 22 | p..V" | total_samples_in_stream: 22050 0x15.4-0x19.7 (4.4)
0x0010| 73 2e b0 36 53 c4| s..6S.| md5: 732eb03653c4c7d237fda4f06a16db0e 0x1a-0x29.7 (16)
0x0020|c7 d2 37 fd a4 f0 6a 16 db 0e |..7...j... |
| | | [1]: metadatablock {} (flac_metadatablock) 0x2a-0x3f.7 (22)
0x0020| 03 | . | last_block: false 0x2a-0x2a (0.1)
0x0020| 03 | . | type: Seektable (3) 0x2a.1-0x2a.7 (0.7)
0x0020| 00 00 12 | ... | length: 18 0x2b-0x2d.7 (3)
| | | seekpoints: [1] 0x2e-0x3f.7 (18)
| | | [0]: seekpoint {} 0x2e-0x3f.7 (18)
0x0020| 00 00| ..| sample_number: 0 0x2e-0x35.7 (8)
0x0030|00 00 00 00 00 00 |...... |
0x0030| 00 00 00 00 00 00 00 00 | ........ | offset: 0 0x36-0x3d.7 (8)
0x0030| 10 00| ..| number_of_samples: 4096 0x3e-0x3f.7 (2)
| | | [2]: metadatablock {} (flac_metadatablock) 0x40-0x97.7 (88)
0x0040|04 |. | last_block: false 0x40-0x40 (0.1)
0x0040|04 |. | type: Vorbis comment (4) 0x40.1-0x40.7 (0.7)
0x0040| 00 00 54 | ..T | length: 84 0x41-0x43.7 (3)
| | | comment: {} (vorbis_comment) 0x44-0x97.7 (84)
0x0040| 20 00 00 00 | ... | vendor_length: 32 0x44-0x47.7 (4)
0x0040| 72 65 66 65 72 65 6e 63| referenc| vendor: "reference libFLAC 1.3.3 20190804" 0x48-0x67.7 (32)
0x0050|65 20 6c 69 62 46 4c 41 43 20 31 2e 33 2e 33 20|e libFLAC 1.3.3 |
0x0060|32 30 31 39 30 38 30 34 |20190804 |
0x0060| 01 00 00 00 | .... | user_comment_list_length: 1 0x68-0x6b.7 (4)
| | | user_comments: [1] 0x6c-0x97.7 (44)
| | | [0]: user_comment {} 0x6c-0x97.7 (44)
0x0060| 28 00 00 00| (...| length: 40 0x6c-0x6f.7 (4)
0x0070|57 41 56 45 46 4f 52 4d 41 54 45 58 54 45 4e 53|WAVEFORMATEXTENS| vendor: "WAVEFORMATEXTENSIBLE_CHANNEL_MASK=0x0004" 0x70-0x97.7 (40)
* |until 0x97.7 (40) | |
| | | [3]: metadatablock {} (flac_metadatablock) 0x98-0x209b.7 (8196)
0x0090| 81 | . | last_block: true 0x98-0x98 (0.1)
0x0090| 81 | . | type: Padding (1) 0x98.1-0x98.7 (0.7)
0x0090| 00 20 00 | . . | length: 8192 0x99-0x9b.7 (3)
0x0090| 00 00 00 00| ....| data: 00000000000000000000000000000000... 0x9c-0x209b.7 (8192)
0x00a0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0x209b.7 (8192) | |
| | | frames: [6] 0x209c-0xbcca.7 (39983)
| | | [0]: frame {} (flac_frame) 0x209c-0x20a7.7 (12)
| | | header: {} 0x209c-0x20a1.7 (6)
0x2090| ff f8 | .. | sync: Correct (0x3ffe) 0x209c-0x209d.5 (1.6)
0x2090| f8 | . | reserved0: Correct (0x0) 0x209d.6-0x209d.6 (0.1)
0x2090| f8 | . | blocking_strategy: Fixed (0) 0x209d.7-0x209d.7 (0.1)
0x2090| c9 | . | block_size: 4096 0x209e-0x209e.3 (0.4)
0x2090| c9 | . | sample_rate: 44100 0x209e.4-0x209e.7 (0.4)
0x2090| 0c| .| channel_assignment: mono (1) 0x209f-0x209f.3 (0.4)
0x2090| 0c| .| sample_size: 24 0x209f.4-0x209f.6 (0.3)
0x2090| 0c| .| reserved1: Correct (0x0) 0x209f.7-0x209f.7 (0.1)
| | | end_of_header: {} 0x20a0-0x20a0.7 (1)
0x20a0|00 |. | frame_number: 0 0x20a0-0x20a0.7 (1)
0x20a0| c1 | . | crc: Correct (c1) 0x20a1-0x20a1.7 (1)
| | | subframes: [1] 0x20a2-0x20a5.7 (4)
| | | [0]: subframe {} 0x20a2-0x20a5.7 (4)
0x20a0| 00 | . | zero_bit: Correct (0x0) 0x20a2-0x20a2 (0.1)
0x20a0| 00 | . | subframe_type: Constant (0) 0x20a2.1-0x20a2.6 (0.6)
| | | lpc_order: 0 0x20a2.7-NA (0)
0x20a0| 00 | . | wasted_bits_flag: 0 0x20a2.7-0x20a2.7 (0.1)
| | | subframe_sample_size: 24 0x20a3-NA (0)
0x20a0| 00 00 00 | ... | value: 0 0x20a3-0x20a5.7 (3)
| | | byte_align: Correct (0x0) 0x20a6-NA (0)
0x20a0| a1 e6 | .. | footer_crc: Correct (a1e6) 0x20a6-0x20a7.7 (2)
| | | [1]: frame {} (flac_frame) 0x20a8-0x27df.7 (1848)
| | | header: {} 0x20a8-0x20ad.7 (6)
0x20a0| ff f8 | .. | sync: Correct (0x3ffe) 0x20a8-0x20a9.5 (1.6)
0x20a0| f8 | . | reserved0: Correct (0x0) 0x20a9.6-0x20a9.6 (0.1)
0x20a0| f8 | . | blocking_strategy: Fixed (0) 0x20a9.7-0x20a9.7 (0.1)
0x20a0| c9 | . | block_size: 4096 0x20aa-0x20aa.3 (0.4)
0x20a0| c9 | . | sample_rate: 44100 0x20aa.4-0x20aa.7 (0.4)
0x20a0| 0c | . | channel_assignment: mono (1) 0x20ab-0x20ab.3 (0.4)
0x20a0| 0c | . | sample_size: 24 0x20ab.4-0x20ab.6 (0.3)
0x20a0| 0c | . | reserved1: Correct (0x0) 0x20ab.7-0x20ab.7 (0.1)
| | | end_of_header: {} 0x20ac-0x20ac.7 (1)
0x20a0| 01 | . | frame_number: 1 0x20ac-0x20ac.7 (1)
0x20a0| c6 | . | crc: Correct (c6) 0x20ad-0x20ad.7 (1)
| | | subframes: [1] 0x20ae-0x27dd.1 (1839.2)
| | | [0]: subframe {} 0x20ae-0x27dd.1 (1839.2)
0x20a0| 17 | . | zero_bit: Correct (0x0) 0x20ae-0x20ae (0.1)
0x20a0| 17 | . | subframe_type: Fixed (2) 0x20ae.1-0x20ae.6 (0.6)
| | | lpc_order: 3 0x20ae.7-NA (0)
0x20a0| 17 | . | wasted_bits_flag: 1 0x20ae.7-0x20ae.7 (0.1)
0x20a0| 02| .| wasted_bits_k: 7 0x20af-0x20af.6 (0.7)
| | | subframe_sample_size: 17 0x20af.7-NA (0)
| | | warmup_samples: [3] 0x20af.7-0x20b6.1 (6.3)
0x20a0| 02| .| [0]: value 0 0x20af.7-0x20b1.7 (2.1)
0x20b0|00 00 |.. |
0x20b0| 00 00 00 | ... | [1]: value 0 0x20b2-0x20b4 (2.1)
0x20b0| 00 00 05 | ... | [2]: value 0 0x20b4.1-0x20b6.1 (2.1)
0x20b0| 05 | . | residual_coding_method: rice (4) 0x20b6.2-0x20b6.3 (0.2)
0x20b0| 05 | . | partition_order: 5 0x20b6.4-0x20b6.7 (0.4)
| | | rice_partitions: 32 0x20b7-NA (0)
| | | partitions: [32] 0x20b7-0x27dd.1 (1830.2)
| | | [0]: partition {} 0x20b7-0x20c7 (16.1)
| | | count: 125 0x20b7-NA (0)
0x20b0| 0f | . | rice_parameter: 0 0x20b7-0x20b7.3 (0.4)
0x20b0| 0f ff ff ff ff ff ff ff ff| .........| samples: fffffffffffffffffffffffffffffff8 0x20b7.4-0x20c7 (15.5)
0x20c0|ff ff ff ff ff ff ff 87 |........ |
| | | [1]: partition {} 0x20c7.1-0x20d7.4 (16.4)
| | | count: 128 0x20c7.1-NA (0)
0x20c0| 87 | . | rice_parameter: 0 0x20c7.1-0x20c7.4 (0.4)
0x20c0| 87 ff ff ff ff ff ff ff ff| .........| samples: ffffffffffffffffffffffffffffffff 0x20c7.5-0x20d7.4 (16)
0x20d0|ff ff ff ff ff ff ff f9 |........ |
| | | [2]: partition {} 0x20d7.5-0x2132.7 (91.3)
| | | count: 128 0x20d7.5-NA (0)
0x20d0| f9 c4 | .. | rice_parameter: 3 0x20d7.5-0x20d8 (0.4)
0x20d0| c4 44 44 44 44 44 44 44| .DDDDDDD| samples: 88888888888888888888888888888888... 0x20d8.1-0x2132.7 (90.7)
0x20e0|44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44|DDDDDDDDDDDDDDDD|
* |until 0x2132.7 (91) | |
| | | [3]: partition {} 0x2133-0x216f.4 (60.5)
| | | count: 128 0x2133-NA (0)
0x2130| 23 | # | rice_parameter: 2 0x2133-0x2133.3 (0.4)
0x2130| 23 c5 57 8a ab fb e7 ab 6c f6 cd 2e 49| #.W.....l...I| samples: 3c5578aabfbe7ab6cf6cd2e49b2139a1... 0x2133.4-0x216f.4 (60.1)
0x2140|b2 13 9a 12 1b 13 32 11 33 32 24 64 d1 94 cb b2|......2.32$d....|
* |until 0x216f.4 (61) | |
| | | [4]: partition {} 0x216f.5-0x21a9.1 (57.5)
| | | count: 128 0x216f.5-NA (0)
0x2160| a1| .| rice_parameter: 2 0x216f.5-0x2170 (0.4)
0x2170|24 |$ |
0x2170|24 6e 92 7d 3d bf c7 f0 b7 a9 50 ab 5e be 7f e2|$n.}=.....P.^...| samples: 48dd24fa7b7f8fe16f52a156bd7cffc5... 0x2170.1-0x21a9.1 (57.1)
0x2180|ea |. |
* |until 0x21a9.1 (58) | |
| | | [5]: partition {} 0x21a9.2-0x21e3 (57.7)
| | | count: 128 0x21a9.2-NA (0)
0x21a0| 8b | . | rice_parameter: 2 0x21a9.2-0x21a9.5 (0.4)
0x21a0| 8b 13 21 11 18 94 48| ..!...H| samples: c4c8444625123236c4b936b34f27f6f5... 0x21a9.6-0x21e3 (57.3)
0x21b0|c8 db 12 e4 da cd 3c 9f db d7 c3 e2 c3 e7 5e f8|......<.......^.|
* |until 0x21e3 (58) | |
| | | [6]: partition {} 0x21e3.1-0x221e.5 (59.5)
| | | count: 128 0x21e3.1-NA (0)
0x21e0| 95 | . | rice_parameter: 2 0x21e3.1-0x21e3.4 (0.4)
0x21e0| 95 cf 27 4b 29 2e cd c6 e4 c4 d8 c9 8c| ..'K)........| samples: b9e4e96525d9b8dc989b1931921921b3... 0x21e3.5-0x221e.5 (59.1)
0x21f0|90 c9 0d 9b 89 63 27 8c a8 a8 ec 58 b8 bf 1e 2a|.....c'....X...*|
* |until 0x221e.5 (60) | |
| | | [7]: partition {} 0x221e.6-0x225a.6 (60.1)
| | | count: 128 0x221e.6-NA (0)
0x2210| 90 8a| ..| rice_parameter: 2 0x221e.6-0x221f.1 (0.4)
0x2210| 8a| .| samples: 2958ab557ad3e78ffe2a2ddf4b995922... 0x221f.2-0x225a.6 (59.5)
0x2220|56 2a d5 5e b4 f9 e3 ff 8a 8b 77 d2 e6 56 48 8d|V*.^......w..VH.|
* |until 0x225a.6 (60) | |
| | | [8]: partition {} 0x225a.7-0x2292.3 (55.5)
| | | count: 128 0x225a.7-NA (0)
0x2250| 08 39 | .9 | rice_parameter: 1 0x225a.7-0x225b.2 (0.4)
0x2250| 39 05 ac 10 62| 9...b| samples: c82d608315fcda0e667187199c0e1a0f... 0x225b.3-0x2292.3 (55.1)
0x2260|bf 9b 41 cc ce 30 e3 33 81 c3 41 ed f3 fa 5e 13|..A..0.3..A...^.|
* |until 0x2292.3 (56) | |
| | | [9]: partition {} 0x2292.4-0x22ce.1 (59.6)
| | | count: 128 0x2292.4-NA (0)
0x2290| 22 | " | rice_parameter: 2 0x2292.4-0x2292.7 (0.4)
0x2290| e2 52 63 53 35 13 12 31 23 64 c4 56 8c| .RcS5..1#d.V.| samples: e2526353351312312364c4568ce9bc8f... 0x2293-0x22ce.1 (59.2)
0x22a0|e9 bc 8f af 58 af 29 ef 55 f4 f3 bc 5f ee 79 3a|....X.).U..._.y:|
* |until 0x22ce.1 (60) | |
| | | [10]: partition {} 0x22ce.2-0x2309.7 (59.6)
| | | count: 128 0x22ce.2-NA (0)
0x22c0| ca | . | rice_parameter: 2 0x22ce.2-0x22ce.5 (0.4)
0x22c0| ca ad| ..| samples: ab6cf6cd2e49b2139a121b1332113332... 0x22ce.6-0x2309.7 (59.2)
0x22d0|b3 db 34 b9 26 c8 4e 68 48 6c 4c c8 44 cc c8 91|..4.&.NhHlL.D...|
* |until 0x2309.7 (60) | |
| | | [11]: partition {} 0x230a-0x2345 (59.1)
| | | count: 128 0x230a-NA (0)
0x2300| 2f | / | rice_parameter: 2 0x230a-0x230a.3 (0.4)
0x2300| 2f 1f c2 de a5 42| /....B| samples: f1fc2dea542ad7af9ff8babb7936d511... 0x230a.4-0x2345 (58.5)
0x2310|ad 7a f9 ff 8b ab b7 93 6d 51 13 26 22 50 95 0d|.z......mQ.&"P..|
* |until 0x2345 (59) | |
| | | [12]: partition {} 0x2345.1-0x237d.3 (56.3)
| | | count: 128 0x2345.1-NA (0)
0x2340| 08 | . | rice_parameter: 1 0x2345.1-0x2345.4 (0.4)
0x2340| 08 92 0b 44 97 29 d3 7e cd c0 d0| ...D.).~...| samples: 12416892e53a6fd9b81a0e06866c683d... 0x2345.5-0x237d.3 (55.7)
0x2350|70 34 33 63 41 ed b7 6e 6a a8 5c 09 82 60 58 48|p43cA..nj.\..`XH|
* |until 0x237d.3 (56) | |
| | | [13]: partition {} 0x237d.4-0x23ba.2 (60.7)
| | | count: 128 0x237d.4-NA (0)
0x2370| 22 | " | rice_parameter: 2 0x237d.4-0x237d.7 (0.4)
0x2370| 6e 37| n7| samples: 6e372626c64c6486486cdc4b193c6545... 0x237e-0x23ba.2 (60.3)
0x2380|26 26 c6 4c 64 86 48 6c dc 4b 19 3c 65 45 47 62|&&.Ld.Hl.K.<eEGb|
* |until 0x23ba.2 (61) | |
| | | [14]: partition {} 0x23ba.3-0x23f5.5 (59.3)
| | | count: 128 0x23ba.3-NA (0)
0x23b0| e5 | . | rice_parameter: 2 0x23ba.3-0x23ba.6 (0.4)
0x23b0| e5 1f fc 54 5b be| ...T[.| samples: 8ffe2a2ddf4b9959223646c650dc8465... 0x23ba.7-0x23f5.5 (58.7)
0x23c0|97 32 b2 44 6c 8d 8c a1 b9 08 ca 1a e1 22 66 89|.2.Dl........"f.|
* |until 0x23f5.5 (59) | |
| | | [15]: partition {} 0x23f5.6-0x242f.1 (57.4)
| | | count: 128 0x23f5.6-NA (0)
0x23f0| b0 bf | .. | rice_parameter: 2 0x23f5.6-0x23f6.1 (0.4)
0x23f0| bf c5 9d 56 29 62 aa c3 c7 c5| ...V)b....| samples: ff167558a58aab0f1f16ff67b64d693b... 0x23f6.2-0x242f.1 (57)
0x2400|bf d9 ed 93 5a 4e da 32 66 c4 c8 44 46 25 12 32|....ZN.2f..DF%.2|
* |until 0x242f.1 (57) | |
| | | [16]: partition {} 0x242f.2-0x2469.2 (58.1)
| | | count: 128 0x242f.2-NA (0)
0x2420| 09| .| rice_parameter: 2 0x242f.2-0x242f.5 (0.4)
0x2420| 09| .| samples: 6246c988ad19d3791f5eb15e53deabe9... 0x242f.6-0x2469.2 (57.5)
0x2430|89 1b 26 22 b4 67 4d e4 7d 7a c5 79 4f 7a af a7|..&".gM.}z.yOz..|
* |until 0x2469.2 (58) | |
| | | [17]: partition {} 0x2469.3-0x24a6 (60.6)
| | | count: 128 0x2469.3-NA (0)
0x2460| 85 | . | rice_parameter: 2 0x2469.3-0x2469.6 (0.4)
0x2460| 85 36 42 73 42 43 62| .6BsBCb| samples: 9b2139a121b13321133322464d194cbb... 0x2469.7-0x24a6 (60.2)
0x2470|66 42 26 66 44 8c 9a 32 99 76 54 ff 3a 0a 42 95|fB&fD..2.vT.:.B.|
* |until 0x24a6 (61) | |
| | | [18]: partition {} 0x24a6.1-0x24e0.3 (58.3)
| | | count: 128 0x24a6.1-NA (0)
0x24a0| 93 | . | rice_parameter: 2 0x24a6.1-0x24a6.4 (0.4)
0x24a0| 93 d7 cf fc 5d 5d bc 9b 6a 88| ....]]..j.| samples: 7af9ff8babb7936d5113262250950d90... 0x24a6.5-0x24e0.3 (57.7)
0x24b0|99 31 12 84 a8 6c 86 c9 02 74 25 42 5d 4c 56 96|.1...l...t%B]LV.|
* |until 0x24e0.3 (58) | |
| | | [19]: partition {} 0x24e0.4-0x251a.1 (57.6)
| | | count: 128 0x24e0.4-NA (0)
0x24e0|72 |r | rice_parameter: 2 0x24e0.4-0x24e0.7 (0.4)
0x24e0| 93 fb 7a f8 7c 58 7c eb df 16 ff fc be 7d 24| ..z.|X|......}$| samples: 93fb7af87c587cebdf16fffcbe7d248d... 0x24e1-0x251a.1 (57.2)
0x24f0|8d 61 b9 b8 94 98 d4 cd 44 c4 8c 48 d9 31 15 a3|.a......D..H.1..|
* |until 0x251a.1 (58) | |
| | | [20]: partition {} 0x251a.2-0x2555.7 (59.6)
| | | count: 128 0x251a.2-NA (0)
0x2510| 0a | . | rice_parameter: 2 0x251a.2-0x251a.5 (0.4)
0x2510| 0a 19 21 b3 71 2c| ..!.q,| samples: 86486cdc4b193c65454762c5c5f8f155... 0x251a.6-0x2555.7 (59.2)
0x2520|64 f1 95 15 1d 8b 17 17 e3 c5 57 8a ab fb e7 ab|d.........W.....|
* |until 0x2555.7 (60) | |
| | | [21]: partition {} 0x2556-0x2591.4 (59.5)
| | | count: 128 0x2556-NA (0)
0x2550| 2c | , | rice_parameter: 2 0x2556-0x2556.3 (0.4)
0x2550| 2c ca c9 11 b2 36 24 12 90 8c| ,....6$...| samples: ccac911b2362412908ca1ae12266891b... 0x2556.4-0x2591.4 (59.1)
0x2560|a1 ae 12 26 68 91 ba 49 f4 f6 ff 1f c2 de a5 42|...&h..I.......B|
* |until 0x2591.4 (60) | |
| | | [22]: partition {} 0x2591.5-0x25cb.3 (57.7)
| | | count: 128 0x2591.5-NA (0)
0x2590| a9 2c | ., | rice_parameter: 2 0x2591.5-0x2592 (0.4)
0x2590| 2c 3c 7c 5b fd 9e d9 35 a4 ed a3 26 6c 4c| ,<|[...5...&lL| samples: 5878f8b7fb3db26b49db464cd8990888... 0x2592.1-0x25cb.3 (57.3)
0x25a0|84 44 62 51 23 23 6c 4b 93 6b 34 f2 7f 6f 5f 0f|.DbQ##lK.k4..o_.|
* |until 0x25cb.3 (58) | |
| | | [23]: partition {} 0x25cb.4-0x2605.3 (58)
| | | count: 128 0x25cb.4-NA (0)
0x25c0| 42 | B | rice_parameter: 2 0x25cb.4-0x25cb.7 (0.4)
0x25c0| de 47 d7 ac| .G..| samples: de47d7ac5794f7aafa79de2ff73c9d2c... 0x25cc-0x2605.3 (57.4)
0x25d0|57 94 f7 aa fa 79 de 2f f7 3c 9d 2c a4 bb 37 1b|W....y./.<.,..7.|
* |until 0x2605.3 (58) | |
| | | [24]: partition {} 0x2605.4-0x2641.2 (59.7)
| | | count: 128 0x2605.4-NA (0)
0x2600| 62 | b | rice_parameter: 2 0x2605.4-0x2605.7 (0.4)
0x2600| 64 22 66 64 48 c9 a3 29 97 65| d"fdH..).e| samples: 6422666448c9a32997654ff3a0a42958... 0x2606-0x2641.2 (59.3)
0x2610|4f f3 a0 a4 29 58 ab 55 7a d3 e7 8f fe 2a 2d df|O...)X.Uz....*-.|
* |until 0x2641.2 (60) | |
| | | [25]: partition {} 0x2641.3-0x267b.2 (58)
| | | count: 128 0x2641.3-NA (0)
0x2640| e3 | . | rice_parameter: 1 0x2641.3-0x2641.6 (0.4)
0x2640| e3 49 2c 88 91 20 8b 00 b2 04 88 12 28 02 64| .I,.. ......(.d| samples: a4964448904580590244091401320b20... 0x2641.7-0x267b.2 (57.4)
0x2650|16 41 6b 04 18 af e6 d0 73 33 8c 38 cc e0 70 d0|.Ak.....s3.8..p.|
* |until 0x267b.2 (58) | |
| | | [26]: partition {} 0x267b.3-0x26b5.6 (58.4)
| | | count: 128 0x267b.3-NA (0)
0x2670| c4 | . | rice_parameter: 2 0x267b.3-0x267b.6 (0.4)
0x2670| c4 7c eb df 16| .|...| samples: 3e75ef8b7ffe5f3e9246b0dcdc4a4c6a... 0x267b.7-0x26b5.6 (58)
0x2680|ff fc be 7d 24 8d 61 b9 b8 94 98 d4 cd 44 c4 8c|...}$.a......D..|
* |until 0x26b5.6 (58) | |
| | | [27]: partition {} 0x26b5.7-0x26f1.3 (59.5)
| | | count: 128 0x26b5.7-NA (0)
0x26b0| 4e 51 | NQ | rice_parameter: 2 0x26b5.7-0x26b6.2 (0.4)
0x26b0| 51 95 15 1d 8b 17 17 e3 c5 57| Q........W| samples: 8ca8a8ec58b8bf1e2abc555fdf3d5b67... 0x26b6.3-0x26f1.3 (59.1)
0x26c0|8a ab fb e7 ab 6c f6 cd 2e 49 b2 13 9a 12 1b 13|.....l...I......|
* |until 0x26f1.3 (60) | |
| | | [28]: partition {} 0x26f1.4-0x272c.4 (59.1)
| | | count: 128 0x26f1.4-NA (0)
0x26f0| 42 | B | rice_parameter: 2 0x26f1.4-0x26f1.7 (0.4)
0x26f0| 12 90 8c a1 ae 12 26 68 91 ba 49 f4 f6 ff| ......&h..I...| samples: 12908ca1ae12266891ba49f4f6ff1fc2... 0x26f2-0x272c.4 (58.5)
0x2700|1f c2 de a5 42 ad 7a f9 ff 8b ab b7 93 6d 51 13|....B.z......mQ.|
* |until 0x272c.4 (59) | |
| | | [29]: partition {} 0x272c.5-0x2766.7 (58.3)
| | | count: 128 0x272c.5-NA (0)
0x2720| e8 f4 | .. | rice_parameter: 1 0x272c.5-0x272d (0.4)
0x2720| f4 bc 26| ..&| samples: e9784c4a11212091044420b028442482... 0x272d.1-0x2766.7 (57.7)
0x2730|25 08 90 90 48 82 22 10 58 14 22 12 41 68 92 e5|%...H.".X.".Ah..|
* |until 0x2766.7 (58) | |
| | | [30]: partition {} 0x2767-0x27a1.6 (58.7)
| | | count: 128 0x2767-NA (0)
0x2760| 23 | # | rice_parameter: 2 0x2767-0x2767.3 (0.4)
0x2760| 23 de ab e9 e7 78 bf dc f2| #....x...| samples: 3deabe9e778bfdcf274b292ecdc6e4c4... 0x2767.4-0x27a1.6 (58.3)
0x2770|74 b2 92 ec dc 6e 4c 4d 8c 98 c9 0c 90 d9 b8 96|t....nLM........|
* |until 0x27a1.6 (59) | |
| | | [31]: partition {} 0x27a1.7-0x27dd.1 (59.3)
| | | count: 128 0x27a1.7-NA (0)
0x27a0| 68 4c | hL | rice_parameter: 2 0x27a1.7-0x27a2.2 (0.4)
0x27a0| 4c a6 5d 95 3f ce 82 90 a5 62 ad 55 eb 4f| L.].?....b.U.O| samples: 6532eca9fe7414852b156aaf5a7cf1ff... 0x27a2.3-0x27dd.1 (58.7)
0x27b0|9e 3f f8 a8 b7 7d 2e 65 64 88 d9 1b 12 09 48 46|.?...}.ed.....HF|
* |until 0x27dd.1 (59) | |
0x27d0| 00 | . | byte_align: Correct (0x0) 0x27dd.2-0x27dd.7 (0.6)
0x27d0| 07 2d| .-| footer_crc: Correct (072d) 0x27de-0x27df.7 (2)
| | | [2]: frame {} (flac_frame) 0x27e0-0x56ee.7 (12047)
| | | header: {} 0x27e0-0x27e5.7 (6)
0x27e0|ff f8 |.. | sync: Correct (0x3ffe) 0x27e0-0x27e1.5 (1.6)
0x27e0| f8 | . | reserved0: Correct (0x0) 0x27e1.6-0x27e1.6 (0.1)
0x27e0| f8 | . | blocking_strategy: Fixed (0) 0x27e1.7-0x27e1.7 (0.1)
0x27e0| c9 | . | block_size: 4096 0x27e2-0x27e2.3 (0.4)
0x27e0| c9 | . | sample_rate: 44100 0x27e2.4-0x27e2.7 (0.4)
0x27e0| 0c | . | channel_assignment: mono (1) 0x27e3-0x27e3.3 (0.4)
0x27e0| 0c | . | sample_size: 24 0x27e3.4-0x27e3.6 (0.3)
0x27e0| 0c | . | reserved1: Correct (0x0) 0x27e3.7-0x27e3.7 (0.1)
| | | end_of_header: {} 0x27e4-0x27e4.7 (1)
0x27e0| 02 | . | frame_number: 2 0x27e4-0x27e4.7 (1)
0x27e0| cf | . | crc: Correct (cf) 0x27e5-0x27e5.7 (1)
| | | subframes: [1] 0x27e6-0x56ec.6 (12038.7)
| | | [0]: subframe {} 0x27e6-0x56ec.6 (12038.7)
0x27e0| 10 | . | zero_bit: Correct (0x0) 0x27e6-0x27e6 (0.1)
0x27e0| 10 | . | subframe_type: Fixed (2) 0x27e6.1-0x27e6.6 (0.6)
| | | lpc_order: 0 0x27e6.7-NA (0)
0x27e0| 10 | . | wasted_bits_flag: 0 0x27e6.7-0x27e6.7 (0.1)
| | | subframe_sample_size: 24 0x27e7-NA (0)
| | | warmup_samples: [0] 0x27e7-NA (0)
0x27e0| 56 | V | residual_coding_method: rice2 (5) 0x27e7-0x27e7.1 (0.2)
0x27e0| 56 | V | partition_order: 5 0x27e7.2-0x27e7.5 (0.4)
| | | rice_partitions: 32 0x27e7.6-NA (0)
| | | partitions: [32] 0x27e7.6-0x56ec.6 (12037.1)
| | | [0]: partition {} 0x27e7.6-0x2940.3 (344.6)
| | | count: 128 0x27e7.6-NA (0)
0x27e0| 56 75 | Vu | rice_parameter: 19 0x27e7.6-0x27e8.2 (0.5)
0x27e0| 75 eb ff 8f 9f fc 13 ff| u.......| samples: af5ffc7cffe09fff9aff4957faae3fd8... 0x27e8.3-0x2940.3 (344.1)
0x27f0|f3 5f e9 2a ff 55 c7 fb 10 bf db 87 fe f3 af f2|._.*.U..........|
* |until 0x2940.3 (345) | |
| | | [1]: partition {} 0x2940.4-0x2a8d.2 (332.7)
| | | count: 128 0x2940.4-NA (0)
0x2940|09 d9 |.. | rice_parameter: 19 0x2940.4-0x2941 (0.5)
0x2940| d9 a8 05 e0 00 61 78 06 40 00 65 a0 06 65 80| .....ax.@.e..e.| samples: b3500bc000c2f00c8000cb400ccb00cc... 0x2941.1-0x2a8d.2 (332.2)
0x2950|66 28 06 51 00 63 10 06 04 00 5c 98 05 81 80 52|f(.Q.c....\....R|
* |until 0x2a8d.2 (333) | |
| | | [2]: partition {} 0x2a8d.3-0x2be6.1 (344.7)
| | | count: 128 0x2a8d.3-NA (0)
0x2a80| 13 | . | rice_parameter: 19 0x2a8d.3-0x2a8d.7 (0.5)
0x2a80| f4 f0| ..| samples: f4f0045c0028a80174400d1d0074b801... 0x2a8e-0x2be6.1 (344.2)
0x2a90|04 5c 00 28 a8 01 74 40 0d 1d 00 74 b8 01 02 00|.\.(..t@...t....|
* |until 0x2be6.1 (345) | |
| | | [3]: partition {} 0x2be6.2-0x2d35.5 (335.4)
| | | count: 128 0x2be6.2-NA (0)
0x2be0| e6 | . | rice_parameter: 19 0x2be6.2-0x2be6.6 (0.5)
0x2be0| e6 93 9f f4 fb ff aa 6b fd 63| .......k.c| samples: 49cffa7dffd535feb1fff5c47faf4ffd... 0x2be6.7-0x2d35.5 (334.7)
0x2bf0|ff eb 88 ff 5e 9f fb 00 3f d8 1f fe c0 2f f5 ec|....^...?..../..|
* |until 0x2d35.5 (335) | |
| | | [4]: partition {} 0x2d35.6-0x2e92.3 (348.6)
| | | count: 128 0x2d35.6-NA (0)
0x2d30| fe 98 | .. | rice_parameter: 20 0x2d35.6-0x2d36.2 (0.5)
0x2d30| 98 63 ff cd 1f fe bb 7f f8 81| .c........| samples: c31ffe68fff5dbffc40ffecd7ffbdffd... 0x2d36.3-0x2e92.3 (348.1)
0x2d40|ff d9 af ff 7b ff a0 ab fe 8d 97 fa 61 7f ea 2e|....{.......a...|
* |until 0x2e92.3 (349) | |
| | | [5]: partition {} 0x2e92.4-0x300e.1 (379.6)
| | | count: 128 0x2e92.4-NA (0)
0x2e90| fb 17 | .. | rice_parameter: 22 0x2e92.4-0x2e93 (0.5)
0x2e90| 17 20 47 0f 30 57 90 7f 80 15 cd df 5b| . G.0W......[| samples: 2e408e1e60af20ff002b9bbeb64095b0... 0x2e93.1-0x300e.1 (379.1)
0x2ea0|20 4a d8 2f 21 7a e4 c2 de 56 7f 74 a0 97 a2 5b| J./!z...V.t...[|
* |until 0x300e.1 (380) | |
| | | [6]: partition {} 0x300e.2-0x318d.5 (383.4)
| | | count: 128 0x300e.2-NA (0)
0x3000| ad | . | rice_parameter: 22 0x300e.2-0x300e.6 (0.5)
0x3000| ad 63| .c| samples: b185f2ee72711dba80e4b44341a81919... 0x300e.7-0x318d.5 (382.7)
0x3010|0b e5 dc e4 e2 3b 75 01 c9 68 86 83 50 32 32 cd|.....;u..h..P22.|
* |until 0x318d.5 (383) | |
| | | [7]: partition {} 0x318d.6-0x330c.4 (382.7)
| | | count: 128 0x318d.6-NA (0)
0x3180| 6e c3 | n. | rice_parameter: 22 0x318d.6-0x318e.2 (0.5)
0x3180| c3 28| .(| samples: 1942209dc05f569bc55ee9ca2a4e4e48... 0x318e.3-0x330c.4 (382.2)
0x3190|44 13 b8 0b ea d3 78 ab dd 39 45 49 c9 c9 0a 77|D.....x..9EI...w|
* |until 0x330c.4 (383) | |
| | | [8]: partition {} 0x330c.5-0x3489.4 (381)
| | | count: 128 0x330c.5-NA (0)
0x3300| fd a7 | .. | rice_parameter: 22 0x330c.5-0x330d.1 (0.5)
0x3300| a7 08 86| ...| samples: 9c2219150b95d50abcc3d123abf774ef... 0x330d.2-0x3489.4 (380.3)
0x3310|45 42 e5 75 42 af 30 f4 48 ea fd dd 3b d6 5e eb|EB.uB.0.H...;.^.|
* |until 0x3489.4 (381) | |
| | | [9]: partition {} 0x3489.5-0x3607.2 (381.6)
| | | count: 128 0x3489.5-NA (0)
0x3480| 0d b8 | .. | rice_parameter: 22 0x3489.5-0x348a.1 (0.5)
0x3480| b8 31 72 3e 67 bd| .1r>g.| samples: e0c5c8f99ef66483bc4c0b179b11d9d6... 0x348a.2-0x3607.2 (381.1)
0x3490|99 20 ef 13 02 c5 e6 c4 76 75 bf 9c 83 b4 4e 4b|. ......vu....NK|
* |until 0x3607.2 (382) | |
| | | [10]: partition {} 0x3607.3-0x3787 (383.6)
| | | count: 128 0x3607.3-NA (0)
0x3600| 96 | . | rice_parameter: 22 0x3607.3-0x3607.7 (0.5)
0x3600| 78 9f 54 4e d7 51 bc 5c| x.TN.Q.\| samples: 789f544ed751bc5cfe9d318c45f5ca8b... 0x3608-0x3787 (383.1)
0x3610|fe 9d 31 8c 45 f5 ca 8b b7 c7 7b 33 30 ca 42 a9|..1.E.....{30.B.|
* |until 0x3787 (384) | |
| | | [11]: partition {} 0x3787.1-0x3904.7 (381.7)
| | | count: 128 0x3787.1-NA (0)
0x3780| 59 | Y | rice_parameter: 22 0x3787.1-0x3787.5 (0.5)
0x3780| 59 3e 8e 9e ef 21 3c 43 a3| Y>...!<C.| samples: 4fa3a7bbc84f10e8ecc07dfa2dcdc71c... 0x3787.6-0x3904.7 (381.2)
0x3790|b3 01 f7 e8 b7 37 1c 73 ba 4a 35 d7 0b ba a9 e2|.....7.s.J5.....|
* |until 0x3904.7 (382) | |
| | | [12]: partition {} 0x3905-0x3a84.7 (384)
| | | count: 128 0x3905-NA (0)
0x3900| b4 | . | rice_parameter: 22 0x3905-0x3905.4 (0.5)
0x3900| b4 7d e0 56 3d 75 97 d2 02 8a d3| .}.V=u.....| samples: 8fbc0ac7aeb2fa40515a6451d797e5e0... 0x3905.5-0x3a84.7 (383.3)
0x3910|22 8e bc bf 2f 07 85 0d 36 b7 dc 45 54 e7 93 a6|".../...6..ET...|
* |until 0x3a84.7 (384) | |
| | | [13]: partition {} 0x3a85-0x3c02.3 (381.4)
| | | count: 128 0x3a85-NA (0)
0x3a80| b5 | . | rice_parameter: 22 0x3a85-0x3a85.4 (0.5)
0x3a80| b5 74 8d 12 3d eb 46 45 57 b3 95| .t..=.FEW..| samples: ae91a247bd68c8aaf672af00942fb999... 0x3a85.5-0x3c02.3 (380.7)
0x3a90|78 04 a1 7d cc ca 83 d3 14 44 cd 4d 99 43 76 bc|x..}.....D.M.Cv.|
* |until 0x3c02.3 (381) | |
| | | [14]: partition {} 0x3c02.4-0x3d80.4 (382.1)
| | | count: 128 0x3c02.4-NA (0)
0x3c00| 3b 2a | ;* | rice_parameter: 22 0x3c02.4-0x3c03 (0.5)
0x3c00| 2a 51 1c 1d a0 1e 97 2c 13 99 d9 90 95| *Q.....,.....| samples: 54a2383b403d2e582733b3212b8ab919... 0x3c03.1-0x3d80.4 (381.4)
0x3c10|c5 5c 8c b6 e0 f7 91 1d 92 c3 51 f3 64 30 8d eb|.\........Q.d0..|
* |until 0x3d80.4 (382) | |
| | | [15]: partition {} 0x3d80.5-0x3efe.5 (382.1)
| | | count: 128 0x3d80.5-NA (0)
0x3d80|15 b2 |.. | rice_parameter: 22 0x3d80.5-0x3d81.1 (0.5)
0x3d80| b2 9d 12 b5 9d b4 21 54 c1 a6 d3 3e 54 1c 04| ......!T...>T..| samples: ca744ad676d08553069b4cf95070106a... 0x3d81.2-0x3efe.5 (381.4)
0x3d90|1a a3 18 d1 8a 13 e8 ac 4c 1e 24 0d df fc e1 93|........L.$.....|
* |until 0x3efe.5 (382) | |
| | | [16]: partition {} 0x3efe.6-0x407b.7 (381.2)
| | | count: 128 0x3efe.6-NA (0)
0x3ef0| aa cb| ..| rice_parameter: 22 0x3efe.6-0x3eff.2 (0.5)
0x3ef0| cb| .| samples: 5e00dfafcdcb20ea58d1da6457814857... 0x3eff.3-0x407b.7 (380.5)
0x3f00|c0 1b f5 f9 b9 64 1d 4b 1a 3b 4c 8a f0 29 0a e2|.....d.K.;L..)..|
* |until 0x407b.7 (381) | |
| | | [17]: partition {} 0x407c-0x41fa (382.1)
| | | count: 128 0x407c-NA (0)
0x4070| b1 | . | rice_parameter: 22 0x407c-0x407c.4 (0.5)
0x4070| b1 14 e6 26| ...&| samples: 229cc4c091fd475c54b6d03990c5752c... 0x407c.5-0x41fa (381.4)
0x4080|04 8f ea 3a e2 a5 b6 81 cc 86 2b a9 62 83 30 56|...:......+.b.0V|
* |until 0x41fa (382) | |
| | | [18]: partition {} 0x41fa.1-0x4379.1 (383.1)
| | | count: 128 0x41fa.1-NA (0)
0x41f0| d9 | . | rice_parameter: 22 0x41fa.1-0x41fa.5 (0.5)
0x41f0| d9 c1 ae d2 46 58| ....FX| samples: 706bb491960e2d2a5ce4d04663cc27c8... 0x41fa.6-0x4379.1 (382.4)
0x4200|38 b4 a9 73 93 41 19 8f 30 9f 21 bd ef 09 37 b4|8..s.A..0.!...7.|
* |until 0x4379.1 (383) | |
| | | [19]: partition {} 0x4379.2-0x44f8.4 (383.3)
| | | count: 128 0x4379.2-NA (0)
0x4370| 6c | l | rice_parameter: 22 0x4379.2-0x4379.6 (0.5)
0x4370| 6c 89 31 2a 29 31 fd| l.1*)1.| samples: 4498951498fe8b1dc8824673a74e9d0b... 0x4379.7-0x44f8.4 (382.6)
0x4380|16 3b 91 04 8c e7 4e 9d 3a 17 77 d0 62 33 ab 50|.;....N.:.w.b3.P|
* |until 0x44f8.4 (383) | |
| | | [20]: partition {} 0x44f8.5-0x4678.5 (384.1)
| | | count: 128 0x44f8.5-NA (0)
0x44f0| 4d b3 | M. | rice_parameter: 22 0x44f8.5-0x44f9.1 (0.5)
0x44f0| b3 b9 55 aa 98 6a 24| ..U..j$| samples: cee556aa61a8916ece78d9e799c37ef9... 0x44f9.2-0x4678.5 (383.4)
0x4500|5b b3 9e 36 79 e6 70 df be 4b ca 49 15 3e ce 86|[..6y.p..K.I.>..|
* |until 0x4678.5 (384) | |
| | | [21]: partition {} 0x4678.6-0x47f9.1 (384.4)
| | | count: 128 0x4678.6-NA (0)
0x4670| a6 db | .. | rice_parameter: 22 0x4678.6-0x4679.2 (0.5)
0x4670| db bf b1 16 5d 5e 22| ....]^"| samples: ddfd88b2eaf117a202338e796584b947... 0x4679.3-0x47f9.1 (383.7)
0x4680|f4 40 46 71 cf 2c b0 97 28 f4 84 1c 0f ca ea 4d|.@Fq.,..(......M|
* |until 0x47f9.1 (384) | |
| | | [22]: partition {} 0x47f9.2-0x4978.2 (383.1)
| | | count: 128 0x47f9.2-NA (0)
0x47f0| ed | . | rice_parameter: 22 0x47f9.2-0x47f9.6 (0.5)
0x47f0| ed 35 83 9d 8d fc 6b| .5....k| samples: 9ac1cec6fe35ee5d08a4306f16e7a969... 0x47f9.7-0x4978.2 (382.4)
0x4800|dc ba 11 48 60 de 2d cf 52 d3 4b e9 d2 6b 02 a6|...H`.-.R.K..k..|
* |until 0x4978.2 (383) | |
| | | [23]: partition {} 0x4978.3-0x4af6.1 (381.7)
| | | count: 128 0x4978.3-NA (0)
0x4970| 76 | v | rice_parameter: 22 0x4978.3-0x4978.7 (0.5)
0x4970| e8 c6 e8 70 e0 aa 4f| ...p..O| samples: e8c6e870e0aa4f84f7320a0f3d8b1fa5... 0x4979-0x4af6.1 (381.2)
0x4980|84 f7 32 0a 0f 3d 8b 1f a5 fd 51 f9 9a 3d 21 76|..2..=....Q..=!v|
* |until 0x4af6.1 (382) | |
| | | [24]: partition {} 0x4af6.2-0x4c75.3 (383.2)
| | | count: 128 0x4af6.2-NA (0)
0x4af0| 6d | m | rice_parameter: 22 0x4af6.2-0x4af6.6 (0.5)
0x4af0| 6d df 40 77 26 2a f3 93 b0 51| m.@w&*...Q| samples: efa03b931579c9d828ac865261b7bd5d... 0x4af6.7-0x4c75.3 (382.5)
0x4b00|59 0c a4 c3 6f 7a bb 0d 1a 5a be a2 21 91 22 8c|Y...oz...Z..!.".|
* |until 0x4c75.3 (383) | |
| | | [25]: partition {} 0x4c75.4-0x4df3 (381.5)
| | | count: 128 0x4c75.4-NA (0)
0x4c70| db 41 | .A | rice_parameter: 22 0x4c75.4-0x4c76 (0.5)
0x4c70| 41 a1 db 81 26 61 86 a4 ad 42| A...&a...B| samples: 8343b7024cc30d495a852d2d71ea52d5... 0x4c76.1-0x4df3 (381)
0x4c80|96 96 b8 f5 29 6a d5 2c bc 12 4d 14 4a 7a 69 9e|....)j.,..M.Jzi.|
* |until 0x4df3 (381) | |
| | | [26]: partition {} 0x4df3.1-0x4f70.6 (381.6)
| | | count: 128 0x4df3.1-NA (0)
0x4df0| 58 | X | rice_parameter: 22 0x4df3.1-0x4df3.5 (0.5)
0x4df0| 58 d2 02 83 0d 98 c1 49 70 25 bc e8 64| X......Ip%..d| samples: 3480a0c36630525c096f3a1917ed47de... 0x4df3.6-0x4f70.6 (381.1)
0x4e00|5f b5 1f 7b bb 7e 98 e8 8e ed b4 17 7f a1 34 4b|_..{.~........4K|
* |until 0x4f70.6 (382) | |
| | | [27]: partition {} 0x4f70.7-0x50ef.6 (383)
| | | count: 128 0x4f70.7-NA (0)
0x4f70|6b 68 |kh | rice_parameter: 22 0x4f70.7-0x4f71.3 (0.5)
0x4f70| 68 1a ef 7d d7 d8 bf 98 9d cf 0b 0a 12 d7 bb| h..}...........| samples: 81aef7dd7d8bf989dcf0b0a12d7bba1e... 0x4f71.4-0x50ef.6 (382.3)
0x4f80|a1 ef 2e 3e 8a 3f c8 d8 86 17 01 ef 92 63 39 11|...>.?.......c9.|
* |until 0x50ef.6 (383) | |
| | | [28]: partition {} 0x50ef.7-0x526e.7 (383.1)
| | | count: 128 0x50ef.7-NA (0)
0x50e0| 93| .| rice_parameter: 22 0x50ef.7-0x50f0.3 (0.5)
0x50f0|6e |n |
0x50f0|6e 91 77 6d b0 36 b1 67 20 73 11 f5 70 25 7e 5c|n.wm.6.g s..p%~\| samples: e91776db036b167207311f570257e5cd... 0x50f0.4-0x526e.7 (382.4)
0x5100|d5 7c d7 b9 4c 61 db fe 26 e5 b7 97 4c 82 e2 52|.|..La..&...L..R|
* |until 0x526e.7 (383) | |
| | | [29]: partition {} 0x526f-0x53ef.1 (384.2)
| | | count: 128 0x526f-NA (0)
0x5260| b7| .| rice_parameter: 22 0x526f-0x526f.4 (0.5)
0x5260| b7| .| samples: e9c1e8e311f8a484157c4acf39ebc25d... 0x526f.5-0x53ef.1 (383.5)
0x5270|4e 0f 47 18 8f c5 24 20 ab e2 56 79 cf 5e 12 eb|N.G...$ ..Vy.^..|
* |until 0x53ef.1 (384) | |
| | | [30]: partition {} 0x53ef.2-0x556f (383.7)
| | | count: 128 0x53ef.2-NA (0)
0x53e0| 2d| -| rice_parameter: 22 0x53ef.2-0x53ef.6 (0.5)
0x53e0| 2d| -| samples: 8f46f026d283cb119856776f4420001a... 0x53ef.7-0x556f (383.2)
0x53f0|1e 8d e0 4d a5 07 96 23 30 ac ee de 88 40 00 35|...M...#0....@.5|
* |until 0x556f (384) | |
| | | [31]: partition {} 0x556f.1-0x56ec.6 (381.6)
| | | count: 128 0x556f.1-NA (0)
0x5560| 5a| Z| rice_parameter: 22 0x556f.1-0x556f.5 (0.5)
0x5560| 5a| Z| samples: afc1f70b3e83c1ff8decef8f836813d5... 0x556f.6-0x56ec.6 (381.1)
0x5570|bf 07 dc 2c fa 0f 07 fe 37 b3 be 3e 0d a0 4f 55|...,....7..>..OU|
* |until 0x56ec.6 (382) | |
0x56e0| e8 | . | byte_align: Correct (0x0) 0x56ec.7-0x56ec.7 (0.1)
0x56e0| 7e c7 | ~. | footer_crc: Correct (7ec7) 0x56ed-0x56ee.7 (2)
| | | [3]: frame {} (flac_frame) 0x56ef-0x7cf9.7 (9739)
| | | header: {} 0x56ef-0x56f4.7 (6)
0x56e0| ff| .| sync: Correct (0x3ffe) 0x56ef-0x56f0.5 (1.6)
0x56f0|f8 |. |
0x56f0|f8 |. | reserved0: Correct (0x0) 0x56f0.6-0x56f0.6 (0.1)
0x56f0|f8 |. | blocking_strategy: Fixed (0) 0x56f0.7-0x56f0.7 (0.1)
0x56f0| c9 | . | block_size: 4096 0x56f1-0x56f1.3 (0.4)
0x56f0| c9 | . | sample_rate: 44100 0x56f1.4-0x56f1.7 (0.4)
0x56f0| 0c | . | channel_assignment: mono (1) 0x56f2-0x56f2.3 (0.4)
0x56f0| 0c | . | sample_size: 24 0x56f2.4-0x56f2.6 (0.3)
0x56f0| 0c | . | reserved1: Correct (0x0) 0x56f2.7-0x56f2.7 (0.1)
| | | end_of_header: {} 0x56f3-0x56f3.7 (1)
0x56f0| 03 | . | frame_number: 3 0x56f3-0x56f3.7 (1)
0x56f0| c8 | . | crc: Correct (c8) 0x56f4-0x56f4.7 (1)
| | | subframes: [1] 0x56f5-0x7cf7.2 (9730.3)
| | | [0]: subframe {} 0x56f5-0x7cf7.2 (9730.3)
0x56f0| 12 | . | zero_bit: Correct (0x0) 0x56f5-0x56f5 (0.1)
0x56f0| 12 | . | subframe_type: Fixed (2) 0x56f5.1-0x56f5.6 (0.6)
| | | lpc_order: 1 0x56f5.7-NA (0)
0x56f0| 12 | . | wasted_bits_flag: 0 0x56f5.7-0x56f5.7 (0.1)
| | | subframe_sample_size: 24 0x56f6-NA (0)
| | | warmup_samples: [1] 0x56f6-0x56f8.7 (3)
0x56f0| e8 31 62 | .1b | [0]: value -1560222 0x56f6-0x56f8.7 (3)
0x56f0| 4a | J | residual_coding_method: rice2 (5) 0x56f9-0x56f9.1 (0.2)
0x56f0| 4a | J | partition_order: 2 0x56f9.2-0x56f9.5 (0.4)
| | | rice_partitions: 4 0x56f9.6-NA (0)
| | | partitions: [4] 0x56f9.6-0x7cf7.2 (9725.5)
| | | [0]: partition {} 0x56f9.6-0x631a.4 (3104.7)
| | | count: 1023 0x56f9.6-NA (0)
0x56f0| 4a d6 | J. | rice_parameter: 22 0x56f9.6-0x56fa.2 (0.5)
0x56f0| d6 a0 73 8d b3 75| ..s..u| samples: b5039c6d9bac08b53ae82d676bab075e... 0x56fa.3-0x631a.4 (3104.2)
0x5700|81 16 a7 5d 05 ac ed 75 60 eb c0 97 c5 cc 22 96|...]...u`.....".|
* |until 0x631a.4 (3105) | |
| | | [1]: partition {} 0x631a.5-0x6bb9.3 (2206.7)
| | | count: 1024 0x631a.5-NA (0)
0x6310| 03 ca | .. | rice_parameter: 15 0x631a.5-0x631b.1 (0.5)
0x6310| ca 70 02 50 01| .p.P.| samples: 29c0094007f00398019c00b3004b807d... 0x631b.2-0x6bb9.3 (2206.2)
0x6320|fc 00 e6 00 67 00 2c c0 12 e0 1f 60 1b e0 18 00|....g.,....`....|
* |until 0x6bb9.3 (2207) | |
| | | [2]: partition {} 0x6bb9.4-0x7458.3 (2207)
| | | count: 1024 0x6bb9.4-NA (0)
0x6bb0| 07 9a | .. | rice_parameter: 15 0x6bb9.4-0x6bba (0.5)
0x6bb0| 9a 60 06 48 01 7a| .`.H.z| samples: 34c00c9002f400b00027c008e007d003... 0x6bba.1-0x7458.3 (2206.3)
0x6bc0|00 58 00 13 e0 04 70 03 e8 01 c8 00 cb 00 59 80|.X....p.......Y.|
* |until 0x7458.3 (2207) | |
| | | [3]: partition {} 0x7458.4-0x7cf7.2 (2206.7)
| | | count: 1024 0x7458.4-NA (0)
0x7450| 07 98 | .. | rice_parameter: 15 0x7458.4-0x7459 (0.5)
0x7450| 98 00 06 20 01 86 00| ... ...| samples: 30000c40030c00c30030000ba002c000... 0x7459.1-0x7cf7.2 (2206.2)
0x7460|61 80 18 00 05 d0 01 60 00 52 00 13 00 04 38 03|a......`.R....8.|
* |until 0x7cf7.2 (2207) | |
0x7cf0| 00 | . | byte_align: Correct (0x0) 0x7cf7.3-0x7cf7.7 (0.5)
0x7cf0| c4 69 | .i | footer_crc: Correct (c469) 0x7cf8-0x7cf9.7 (2)
| | | [4]: frame {} (flac_frame) 0x7cfa-0xaab1.7 (11704)
| | | header: {} 0x7cfa-0x7cff.7 (6)
0x7cf0| ff f8 | .. | sync: Correct (0x3ffe) 0x7cfa-0x7cfb.5 (1.6)
0x7cf0| f8 | . | reserved0: Correct (0x0) 0x7cfb.6-0x7cfb.6 (0.1)
0x7cf0| f8 | . | blocking_strategy: Fixed (0) 0x7cfb.7-0x7cfb.7 (0.1)
0x7cf0| c9 | . | block_size: 4096 0x7cfc-0x7cfc.3 (0.4)
0x7cf0| c9 | . | sample_rate: 44100 0x7cfc.4-0x7cfc.7 (0.4)
0x7cf0| 0c | . | channel_assignment: mono (1) 0x7cfd-0x7cfd.3 (0.4)
0x7cf0| 0c | . | sample_size: 24 0x7cfd.4-0x7cfd.6 (0.3)
0x7cf0| 0c | . | reserved1: Correct (0x0) 0x7cfd.7-0x7cfd.7 (0.1)
| | | end_of_header: {} 0x7cfe-0x7cfe.7 (1)
0x7cf0| 04 | . | frame_number: 4 0x7cfe-0x7cfe.7 (1)
0x7cf0| dd| .| crc: Correct (dd) 0x7cff-0x7cff.7 (1)
| | | subframes: [1] 0x7d00-0xaaaf.3 (11695.4)
| | | [0]: subframe {} 0x7d00-0xaaaf.3 (11695.4)
0x7d00|40 |@ | zero_bit: Correct (0x0) 0x7d00-0x7d00 (0.1)
0x7d00|40 |@ | subframe_type: LPC (3) 0x7d00.1-0x7d00.6 (0.6)
| | | lpc_order: 1 0x7d00.7-NA (0)
0x7d00|40 |@ | wasted_bits_flag: 0 0x7d00.7-0x7d00.7 (0.1)
| | | subframe_sample_size: 24 0x7d01-NA (0)
| | | warmup_samples: [1] 0x7d01-0x7d03.7 (3)
0x7d00| f8 1b 80 | ... | [0]: value -517248 0x7d01-0x7d03.7 (3)
0x7d00| e7 | . | precision: 15 0x7d04-0x7d04.3 (0.4)
0x7d00| e7 85 | .. | shift: 15 0x7d04.4-0x7d05 (0.5)
| | | coefficients: [1] 0x7d05.1-0x7d06.7 (1.7)
0x7d00| 85 12 | .. | [0]: value 1298 0x7d05.1-0x7d06.7 (1.7)
0x7d00| 52 | R | residual_coding_method: rice2 (5) 0x7d07-0x7d07.1 (0.2)
0x7d00| 52 | R | partition_order: 4 0x7d07.2-0x7d07.5 (0.4)
| | | rice_partitions: 16 0x7d07.6-NA (0)
| | | partitions: [16] 0x7d07.6-0xaaaf.3 (11687.6)
| | | [0]: partition {} 0x7d07.6-0x7fab.3 (675.6)
| | | count: 255 0x7d07.6-NA (0)
0x7d00| 52 6e | Rn | rice_parameter: 19 0x7d07.6-0x7d08.2 (0.5)
0x7d00| 6e 12 eb 67 bf 7a f5 25| n..g.z.%| samples: 70975b3dfbd7a92aaa6954ba02a0f69f... 0x7d08.3-0x7fab.3 (675.1)
0x7d10|55 4d 2a 97 40 54 1e d3 f8 33 9e e7 a4 e4 e0 fd|UM*.@T...3......|
* |until 0x7fab.3 (676) | |
| | | [1]: partition {} 0x7fab.4-0x824a.4 (671.1)
| | | count: 256 0x7fab.4-NA (0)
0x7fa0| 19 d0 | .. | rice_parameter: 19 0x7fab.4-0x7fac (0.5)
0x7fa0| d0 45 4d 84| .EM.| samples: a08a9b08ebc1761d3341e5a91f8a6746... 0x7fac.1-0x824a.4 (670.4)
0x7fb0|75 e0 bb 0e 99 a0 f2 d4 8f c5 33 a3 07 8d 3f 81|u.........3...?.|
* |until 0x824a.4 (671) | |
| | | [2]: partition {} 0x824a.5-0x84f5.6 (683.2)
| | | count: 256 0x824a.5-NA (0)
0x8240| d4 e8 | .. | rice_parameter: 19 0x824a.5-0x824b.1 (0.5)
0x8240| e8 8c 52 cb 77| ..R.w| samples: a2314b2ddcc4be4d7a20eb3b0ff9c64a... 0x824b.2-0x84f5.6 (682.5)
0x8250|31 2f 93 5e 88 3a ce c3 fe 71 92 96 b0 aa 27 05|1/.^.:...q....'.|
* |until 0x84f5.6 (683) | |
| | | [3]: partition {} 0x84f5.7-0x8797.3 (673.5)
| | | count: 256 0x84f5.7-NA (0)
0x84f0| 05 32 | .2 | rice_parameter: 19 0x84f5.7-0x84f6.3 (0.5)
0x84f0| 32 34 61 9f a8 10 ec 27 26 ce| 24a....'&.| samples: 234619fa810ec2726ced931a2f164ae8... 0x84f6.4-0x8797.3 (673)
0x8500|d9 31 a2 f1 64 ae 89 d5 c4 43 d4 b7 8b f2 6d 84|.1..d....C....m.|
* |until 0x8797.3 (673) | |
| | | [4]: partition {} 0x8797.4-0x8a4c.5 (693.2)
| | | count: 256 0x8797.4-NA (0)
0x8790| 1a 38 | .8 | rice_parameter: 20 0x8797.4-0x8798 (0.5)
0x8790| 38 22 6a da 6a bb 4e 2c| 8"j.j.N,| samples: 7044d5b4d5769c5859816961f11d7680... 0x8798.1-0x8a4c.5 (692.5)
0x87a0|2c c0 b4 b0 f8 8e bb 40 1a c8 8c 2a 89 30 a7 ad|,......@...*.0..|
* |until 0x8a4c.5 (693) | |
| | | [5]: partition {} 0x8a4c.6-0x8d40.6 (756.1)
| | | count: 256 0x8a4c.6-NA (0)
0x8a40| 5a db | Z. | rice_parameter: 22 0x8a4c.6-0x8a4d.2 (0.5)
0x8a40| db 72 8d| .r.| samples: db946dcaf65d5bccbdbcbbbadd46e602... 0x8a4d.3-0x8d40.6 (755.4)
0x8a50|b9 5e cb ab 79 97 b7 97 77 5b a8 dc c0 54 16 ca|.^..y...w[...T..|
* |until 0x8d40.6 (756) | |
| | | [6]: partition {} 0x8d40.7-0x902d.6 (749)
| | | count: 256 0x8d40.7-NA (0)
0x8d40|39 57 |9W | rice_parameter: 21 0x8d40.7-0x8d41.3 (0.5)
0x8d40| 57 9e 50 6d dc 50 99 35 ce 09 a2 68 a5 aa a5| W.Pm.P.5...h...| samples: 79e506ddc509935ce09a268a5aaa539d... 0x8d41.4-0x902d.6 (748.3)
0x8d50|39 d1 6c 9d 5f c4 f4 06 fc 24 dc b8 44 7c fe 6d|9.l._....$..D|.m|
* |until 0x902d.6 (749) | |
| | | [7]: partition {} 0x902d.7-0x931e.3 (752.5)
| | | count: 256 0x902d.7-NA (0)
0x9020| 9b 56 | .V | rice_parameter: 21 0x902d.7-0x902e.3 (0.5)
0x9020| 56 1f| V.| samples: 61fb182cfabc280b5a08b31d06383278... 0x902e.4-0x931e.3 (752)
0x9030|b1 82 cf ab c2 80 b5 a0 8b 31 d0 63 83 27 87 d3|.........1.c.'..|
* |until 0x931e.3 (752) | |
| | | [8]: partition {} 0x931e.4-0x9611.1 (754.6)
| | | count: 256 0x931e.4-NA (0)
0x9310| 7b 5d| {]| rice_parameter: 22 0x931e.4-0x931f (0.5)
0x9310| 5d| ]| samples: bb4516863d83a346473aafc211adc646... 0x931f.1-0x9611.1 (754.1)
0x9320|a2 8b 43 1e c1 d1 a3 23 9d 57 e1 08 d6 e3 23 2f|..C....#.W....#/|
* |until 0x9611.1 (755) | |
| | | [9]: partition {} 0x9611.2-0x9902.7 (753.6)
| | | count: 256 0x9611.2-NA (0)
0x9610| ed | . | rice_parameter: 22 0x9611.2-0x9611.6 (0.5)
0x9610| ed 40 21 51 b9 30 3b 7e 7b 6d 71 03 de ec 14| .@!Q.0;~{mq....| samples: a010a8dc981dbf3db6b881ef760a3e5a... 0x9611.7-0x9902.7 (753.1)
0x9620|7c b5 11 58 d8 e1 1e fe d9 9d cf ab 24 b0 af b4||..X........$...|
* |until 0x9902.7 (754) | |
| | | [10]: partition {} 0x9903-0x9bf5.3 (754.4)
| | | count: 256 0x9903-NA (0)
0x9900| b2 | . | rice_parameter: 22 0x9903-0x9903.4 (0.5)
0x9900| b2 37 50 4b ab f3 d7 ef b5 e8 71 4d 09| .7PK......qM.| samples: 46ea09757e7afdf6bd0e29a1310a22cc... 0x9903.5-0x9bf5.3 (753.7)
0x9910|88 51 16 67 21 17 8a 05 5e 3f 14 13 83 29 91 8a|.Q.g!...^?...)..|
* |until 0x9bf5.3 (754) | |
| | | [11]: partition {} 0x9bf5.4-0x9ee7.4 (754.1)
| | | count: 256 0x9bf5.4-NA (0)
0x9bf0| 8b 2d | .- | rice_parameter: 22 0x9bf5.4-0x9bf6 (0.5)
0x9bf0| 2d de 24 72 db b6 27 2a fe c3| -.$r..'*..| samples: 5bbc48e5b76c4e55fd874fbad155cccd... 0x9bf6.1-0x9ee7.4 (753.4)
0x9c00|a7 dd 68 aa e6 66 81 bc c0 7c 66 d5 a7 de e7 f3|..h..f...|f.....|
* |until 0x9ee7.4 (754) | |
| | | [12]: partition {} 0x9ee7.5-0xa1d9.7 (754.3)
| | | count: 256 0x9ee7.5-NA (0)
0x9ee0| 45 b5 | E. | rice_parameter: 22 0x9ee7.5-0x9ee8.1 (0.5)
0x9ee0| b5 7b 69 22 b6 40 a0 2a| .{i".@.*| samples: d5eda48ad90280a9284b5ab7420639e3... 0x9ee8.2-0xa1d9.7 (753.6)
0x9ef0|4a 12 d6 ad d0 81 8e 78 c8 de 20 57 06 69 21 ea|J......x.. W.i!.|
* |until 0xa1d9.7 (754) | |
| | | [13]: partition {} 0xa1da-0xa4ca.1 (752.2)
| | | count: 256 0xa1da-NA (0)
0xa1d0| ab | . | rice_parameter: 21 0xa1da-0xa1da.4 (0.5)
0xa1d0| ab 0b 6d ba 90 6c| ..m..l| samples: 616db7520d9375dc979bd122149453e8... 0xa1da.5-0xa4ca.1 (751.5)
0xa1e0|9b ae e4 bc de 89 10 a4 a2 9f 44 a2 0c 25 f2 ce|..........D..%..|
* |until 0xa4ca.1 (752) | |
| | | [14]: partition {} 0xa4ca.2-0xa7bc.6 (754.5)
| | | count: 256 0xa4ca.2-NA (0)
0xa4c0| 2d | - | rice_parameter: 22 0xa4ca.2-0xa4ca.6 (0.5)
0xa4c0| 2d ff de 5a 66 46| -..ZfF| samples: ffef2d332343b2c0bd8bd50cb6eb09e2... 0xa4ca.7-0xa7bc.6 (754)
0xa4d0|87 65 81 7b 17 aa 19 6d d6 13 c4 df a6 14 a7 b8|.e.{...m........|
* |until 0xa7bc.6 (754) | |
| | | [15]: partition {} 0xa7bc.7-0xaaaf.3 (754.5)
| | | count: 256 0xa7bc.7-NA (0)
0xa7b0| fd 6b | .k | rice_parameter: 22 0xa7bc.7-0xa7bd.3 (0.5)
0xa7b0| 6b b0 dd| k..| samples: bb0dd395c9e9b14206ee2d0dbc9deeee... 0xa7bd.4-0xaaaf.3 (754)
0xa7c0|39 5c 9e 9b 14 20 6e e2 d0 db c9 de ee eb 33 8d|9\... n.......3.|
* |until 0xaaaf.3 (754) | |
0xaaa0| 00| .| byte_align: Correct (0x0) 0xaaaf.4-0xaaaf.7 (0.4)
0xaab0|02 49 |.I | footer_crc: Correct (0249) 0xaab0-0xaab1.7 (2)
| | | [5]: frame {} (flac_frame) 0xaab2-0xbcca.7 (4633)
| | | header: {} 0xaab2-0xaab9.7 (8)
0xaab0| ff f8 | .. | sync: Correct (0x3ffe) 0xaab2-0xaab3.5 (1.6)
0xaab0| f8 | . | reserved0: Correct (0x0) 0xaab3.6-0xaab3.6 (0.1)
0xaab0| f8 | . | blocking_strategy: Fixed (0) 0xaab3.7-0xaab3.7 (0.1)
0xaab0| 79 | y | block_size: end of header (16 bit) (0) 0xaab4-0xaab4.3 (0.4)
0xaab0| 79 | y | sample_rate: 44100 0xaab4.4-0xaab4.7 (0.4)
0xaab0| 0c | . | channel_assignment: mono (1) 0xaab5-0xaab5.3 (0.4)
0xaab0| 0c | . | sample_size: 24 0xaab5.4-0xaab5.6 (0.3)
0xaab0| 0c | . | reserved1: Correct (0x0) 0xaab5.7-0xaab5.7 (0.1)
| | | end_of_header: {} 0xaab6-0xaab8.7 (3)
0xaab0| 05 | . | frame_number: 5 0xaab6-0xaab6.7 (1)
0xaab0| 06 21 | .! | block_size: 1570 0xaab7-0xaab8.7 (2)
0xaab0| 60 | ` | crc: Correct (60) 0xaab9-0xaab9.7 (1)
| | | subframes: [1] 0xaaba-0xbcc8 (4622.1)
| | | [0]: subframe {} 0xaaba-0xbcc8 (4622.1)
0xaab0| 10 | . | zero_bit: Correct (0x0) 0xaaba-0xaaba (0.1)
0xaab0| 10 | . | subframe_type: Fixed (2) 0xaaba.1-0xaaba.6 (0.6)
| | | lpc_order: 0 0xaaba.7-NA (0)
0xaab0| 10 | . | wasted_bits_flag: 0 0xaaba.7-0xaaba.7 (0.1)
| | | subframe_sample_size: 24 0xaabb-NA (0)
| | | warmup_samples: [0] 0xaabb-NA (0)
0xaab0| 42 | B | residual_coding_method: rice2 (5) 0xaabb-0xaabb.1 (0.2)
0xaab0| 42 | B | partition_order: 0 0xaabb.2-0xaabb.5 (0.4)
| | | rice_partitions: 1 0xaabb.6-NA (0)
| | | partitions: [1] 0xaabb.6-0xbcc8 (4620.3)
| | | [0]: partition {} 0xaabb.6-0xbcc8 (4620.3)
| | | count: 1570 0xaabb.6-NA (0)
0xaab0| 42 a5 | B. | rice_parameter: 21 0xaabb.6-0xaabc.2 (0.5)
0xaab0| a5 bf 5d 86| ..].| samples: 2dfaec352a7208b75789dda48474af25... 0xaabc.3-0xbcc8 (4619.6)
0xaac0|a5 4e 41 16 ea f1 3b b4 90 8e 95 e4 b9 b3 3d 1a|.NA...;.......=.|
* |until 0xbcc8 (4620) | |
0xbcc0| 80 | . | byte_align: Correct (0x0) 0xbcc8.1-0xbcc8.7 (0.7)
0xbcc0| 0a ac| | ..| | footer_crc: Correct (0aac) 0xbcc9-0xbcca.7 (2)
| | | md5_calculated: 732eb03653c4c7d237fda4f06a16db0e 0xbccb-NA (0)
| | | decoded_samples: 22050 0xbccb-NA (0)

BIN
format/flac/testdata/mono8.flac vendored Normal file

Binary file not shown.

548
format/flac/testdata/mono8.fqtest vendored Normal file
View File

@ -0,0 +1,548 @@
/mono8.flac:
> fq -d flac verbose /mono8.flac
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /mono8.flac (flac) 0x0-0x4cef.7 (19696)
0x0000|66 4c 61 43 |fLaC | magic: "fLaC" (Correct) 0x0-0x3.7 (4)
| | | metadatablocks: [4] 0x4-0x206f.7 (8300)
| | | [0]: metadatablock {} (flac_metadatablock) 0x4-0x29.7 (38)
0x0000| 00 | . | last_block: false 0x4-0x4 (0.1)
0x0000| 00 | . | type: Streaminfo (0) 0x4.1-0x4.7 (0.7)
0x0000| 00 00 22 | .." | length: 34 0x5-0x7.7 (3)
0x0000| 10 00 | .. | minimum_block_size: 4096 0x8-0x9.7 (2)
0x0000| 10 00 | .. | maximum_block_size: 4096 0xa-0xb.7 (2)
0x0000| 00 00 0a | ... | minimum_frame_size: 10 0xc-0xe.7 (3)
0x0000| 00| .| maximum_frame_size: 3851 0xf-0x11.7 (3)
0x0010|0f 0b |.. |
0x0010| 0a c4 40 | ..@ | sample_rate: 44100 0x12-0x14.3 (2.4)
0x0010| 40 | @ | channels: 1 0x14.4-0x14.6 (0.3)
0x0010| 40 70 | @p | bits_per_sample: 8 0x14.7-0x15.3 (0.5)
0x0010| 70 00 00 56 22 | p..V" | total_samples_in_stream: 22050 0x15.4-0x19.7 (4.4)
0x0010| 1b 43 07 3d 6a 82| .C.=j.| md5: 1b43073d6a826942bca82cfd2ea155f2 0x1a-0x29.7 (16)
0x0020|69 42 bc a8 2c fd 2e a1 55 f2 |iB..,...U. |
| | | [1]: metadatablock {} (flac_metadatablock) 0x2a-0x3f.7 (22)
0x0020| 03 | . | last_block: false 0x2a-0x2a (0.1)
0x0020| 03 | . | type: Seektable (3) 0x2a.1-0x2a.7 (0.7)
0x0020| 00 00 12 | ... | length: 18 0x2b-0x2d.7 (3)
| | | seekpoints: [1] 0x2e-0x3f.7 (18)
| | | [0]: seekpoint {} 0x2e-0x3f.7 (18)
0x0020| 00 00| ..| sample_number: 0 0x2e-0x35.7 (8)
0x0030|00 00 00 00 00 00 |...... |
0x0030| 00 00 00 00 00 00 00 00 | ........ | offset: 0 0x36-0x3d.7 (8)
0x0030| 10 00| ..| number_of_samples: 4096 0x3e-0x3f.7 (2)
| | | [2]: metadatablock {} (flac_metadatablock) 0x40-0x6b.7 (44)
0x0040|04 |. | last_block: false 0x40-0x40 (0.1)
0x0040|04 |. | type: Vorbis comment (4) 0x40.1-0x40.7 (0.7)
0x0040| 00 00 28 | ..( | length: 40 0x41-0x43.7 (3)
| | | comment: {} (vorbis_comment) 0x44-0x6b.7 (40)
0x0040| 20 00 00 00 | ... | vendor_length: 32 0x44-0x47.7 (4)
0x0040| 72 65 66 65 72 65 6e 63| referenc| vendor: "reference libFLAC 1.3.3 20190804" 0x48-0x67.7 (32)
0x0050|65 20 6c 69 62 46 4c 41 43 20 31 2e 33 2e 33 20|e libFLAC 1.3.3 |
0x0060|32 30 31 39 30 38 30 34 |20190804 |
0x0060| 00 00 00 00 | .... | user_comment_list_length: 0 0x68-0x6b.7 (4)
| | | user_comments: [0] 0x6c-NA (0)
| | | [3]: metadatablock {} (flac_metadatablock) 0x6c-0x206f.7 (8196)
0x0060| 81 | . | last_block: true 0x6c-0x6c (0.1)
0x0060| 81 | . | type: Padding (1) 0x6c.1-0x6c.7 (0.7)
0x0060| 00 20 00| . .| length: 8192 0x6d-0x6f.7 (3)
0x0070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| data: 00000000000000000000000000000000... 0x70-0x206f.7 (8192)
* |until 0x206f.7 (8192) | |
| | | frames: [6] 0x2070-0x4cef.7 (11392)
| | | [0]: frame {} (flac_frame) 0x2070-0x2079.7 (10)
| | | header: {} 0x2070-0x2075.7 (6)
0x2070|ff f8 |.. | sync: Correct (0x3ffe) 0x2070-0x2071.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x2071.6-0x2071.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x2071.7-0x2071.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x2072-0x2072.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x2072.4-0x2072.7 (0.4)
0x2070| 02 | . | channel_assignment: mono (1) 0x2073-0x2073.3 (0.4)
0x2070| 02 | . | sample_size: 8 0x2073.4-0x2073.6 (0.3)
0x2070| 02 | . | reserved1: Correct (0x0) 0x2073.7-0x2073.7 (0.1)
| | | end_of_header: {} 0x2074-0x2074.7 (1)
0x2070| 00 | . | frame_number: 0 0x2074-0x2074.7 (1)
0x2070| 17 | . | crc: Correct (17) 0x2075-0x2075.7 (1)
| | | subframes: [1] 0x2076-0x2077.7 (2)
| | | [0]: subframe {} 0x2076-0x2077.7 (2)
0x2070| 00 | . | zero_bit: Correct (0x0) 0x2076-0x2076 (0.1)
0x2070| 00 | . | subframe_type: Constant (0) 0x2076.1-0x2076.6 (0.6)
| | | lpc_order: 0 0x2076.7-NA (0)
0x2070| 00 | . | wasted_bits_flag: 0 0x2076.7-0x2076.7 (0.1)
| | | subframe_sample_size: 8 0x2077-NA (0)
0x2070| 00 | . | value: 0 0x2077-0x2077.7 (1)
| | | byte_align: Correct (0x0) 0x2078-NA (0)
0x2070| bc ba | .. | footer_crc: Correct (bcba) 0x2078-0x2079.7 (2)
| | | [1]: frame {} (flac_frame) 0x207a-0x23b9.7 (832)
| | | header: {} 0x207a-0x207f.7 (6)
0x2070| ff f8 | .. | sync: Correct (0x3ffe) 0x207a-0x207b.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x207b.6-0x207b.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x207b.7-0x207b.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x207c-0x207c.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x207c.4-0x207c.7 (0.4)
0x2070| 02 | . | channel_assignment: mono (1) 0x207d-0x207d.3 (0.4)
0x2070| 02 | . | sample_size: 8 0x207d.4-0x207d.6 (0.3)
0x2070| 02 | . | reserved1: Correct (0x0) 0x207d.7-0x207d.7 (0.1)
| | | end_of_header: {} 0x207e-0x207e.7 (1)
0x2070| 01 | . | frame_number: 1 0x207e-0x207e.7 (1)
0x2070| 10| .| crc: Correct (10) 0x207f-0x207f.7 (1)
| | | subframes: [1] 0x2080-0x23b7.7 (824)
| | | [0]: subframe {} 0x2080-0x23b7.7 (824)
0x2080|12 |. | zero_bit: Correct (0x0) 0x2080-0x2080 (0.1)
0x2080|12 |. | subframe_type: Fixed (2) 0x2080.1-0x2080.6 (0.6)
| | | lpc_order: 1 0x2080.7-NA (0)
0x2080|12 |. | wasted_bits_flag: 0 0x2080.7-0x2080.7 (0.1)
| | | subframe_sample_size: 8 0x2081-NA (0)
| | | warmup_samples: [1] 0x2081-0x2081.7 (1)
0x2080| 00 | . | [0]: value 0 0x2081-0x2081.7 (1)
0x2080| 04 | . | residual_coding_method: rice (4) 0x2082-0x2082.1 (0.2)
0x2080| 04 | . | partition_order: 1 0x2082.2-0x2082.5 (0.4)
| | | rice_partitions: 2 0x2082.6-NA (0)
| | | partitions: [2] 0x2082.6-0x23b7.7 (821.2)
| | | [0]: partition {} 0x2082.6-0x2210.1 (397.4)
| | | count: 2047 0x2082.6-NA (0)
0x2080| 04 3f | .? | rice_parameter: 0 0x2082.6-0x2083.1 (0.4)
0x2080| 3f ff ff ff ff ff ff ff ff ff ff ff ff| ?............| samples: ffffffffffffffffffffffffffffffff... 0x2083.2-0x2210.1 (397)
0x2090|ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff|................|
* |until 0x2210.1 (397) | |
| | | [1]: partition {} 0x2210.2-0x23b7.7 (423.6)
| | | count: 2048 0x2210.2-NA (0)
0x2210|c1 |. | rice_parameter: 0 0x2210.2-0x2210.5 (0.4)
0x2210|c1 bb ff 39 99 32 4c 92 64 99 33 39 ff bb 6d 6d|...9.2L.d.39..mm| samples: 6effce664c932499264cce7feedb5b6d... 0x2210.6-0x23b7.7 (423.2)
0x2220|b6 df fe 66 66 4c 93 26 4c 99 9e 7e ee d6 d5 ad|...ffL.&L..~....|
* |until 0x23b7.7 (424) | |
| | | byte_align: Correct (0x0) 0x23b8-NA (0)
0x23b0| 5c 65 | \e | footer_crc: Correct (5c65) 0x23b8-0x23b9.7 (2)
| | | [2]: frame {} (flac_frame) 0x23ba-0x32c4.7 (3851)
| | | header: {} 0x23ba-0x23bf.7 (6)
0x23b0| ff f8 | .. | sync: Correct (0x3ffe) 0x23ba-0x23bb.5 (1.6)
0x23b0| f8 | . | reserved0: Correct (0x0) 0x23bb.6-0x23bb.6 (0.1)
0x23b0| f8 | . | blocking_strategy: Fixed (0) 0x23bb.7-0x23bb.7 (0.1)
0x23b0| c9 | . | block_size: 4096 0x23bc-0x23bc.3 (0.4)
0x23b0| c9 | . | sample_rate: 44100 0x23bc.4-0x23bc.7 (0.4)
0x23b0| 02 | . | channel_assignment: mono (1) 0x23bd-0x23bd.3 (0.4)
0x23b0| 02 | . | sample_size: 8 0x23bd.4-0x23bd.6 (0.3)
0x23b0| 02 | . | reserved1: Correct (0x0) 0x23bd.7-0x23bd.7 (0.1)
| | | end_of_header: {} 0x23be-0x23be.7 (1)
0x23b0| 02 | . | frame_number: 2 0x23be-0x23be.7 (1)
0x23b0| 19| .| crc: Correct (19) 0x23bf-0x23bf.7 (1)
| | | subframes: [1] 0x23c0-0x32c2.4 (3842.5)
| | | [0]: subframe {} 0x23c0-0x32c2.4 (3842.5)
0x23c0|10 |. | zero_bit: Correct (0x0) 0x23c0-0x23c0 (0.1)
0x23c0|10 |. | subframe_type: Fixed (2) 0x23c0.1-0x23c0.6 (0.6)
| | | lpc_order: 0 0x23c0.7-NA (0)
0x23c0|10 |. | wasted_bits_flag: 0 0x23c0.7-0x23c0.7 (0.1)
| | | subframe_sample_size: 8 0x23c1-NA (0)
| | | warmup_samples: [0] 0x23c1-NA (0)
0x23c0| 14 | . | residual_coding_method: rice (4) 0x23c1-0x23c1.1 (0.2)
0x23c0| 14 | . | partition_order: 5 0x23c1.2-0x23c1.5 (0.4)
| | | rice_partitions: 32 0x23c1.6-NA (0)
| | | partitions: [32] 0x23c1.6-0x32c2.4 (3840.7)
| | | [0]: partition {} 0x23c1.6-0x2418.7 (87.2)
| | | count: 128 0x23c1.6-NA (0)
0x23c0| 14 e6 | .. | rice_parameter: 3 0x23c1.6-0x23c2.1 (0.4)
0x23c0| e6 f7 d2 95 b5 ef 24 b2 cd 34 f3 c4 89 12| ......$..4....| samples: 9bdf4a56d7bc92cb34d3cf1224489162... 0x23c2.2-0x2418.7 (86.6)
0x23d0|24 58 b1 62 c5 89 12 24 49 e7 9a 69 65 92 4b de|$X.b...$I..ie.K.|
* |until 0x2418.7 (87) | |
| | | [1]: partition {} 0x2419-0x2465.6 (76.7)
| | | count: 128 0x2419-NA (0)
0x2410| 3c | < | rice_parameter: 3 0x2419-0x2419.3 (0.4)
0x2410| 3c cc cc cc cc cc ca| <......| samples: ccccccccccccaa8899bbddff4ad6d6bd... 0x2419.4-0x2465.6 (76.3)
0x2420|a8 89 9b bd df f4 ad 6d 6b de 49 24 96 59 65 96|.......mk.I$.Ye.|
* |until 0x2465.6 (77) | |
| | | [2]: partition {} 0x2465.7-0x24c0.1 (90.3)
| | | count: 128 0x2465.7-NA (0)
0x2460| 9c 68 | .h | rice_parameter: 3 0x2465.7-0x2466.2 (0.4)
0x2460| 68 42 98 e7 10 51 46 1c 70 81| hB...QF.p.| samples: 4214c738828a30e3840a143060e1c387... 0x2466.3-0x24c0.1 (89.7)
0x2470|42 86 0c 1c 38 70 e0 80 80 80 80 80 81 c3 87 0c|B...8p..........|
* |until 0x24c0.1 (90) | |
| | | [3]: partition {} 0x24c0.2-0x250f (78.7)
| | | count: 128 0x24c0.2-NA (0)
0x24c0|cd |. | rice_parameter: 3 0x24c0.2-0x24c0.5 (0.4)
0x24c0|cd 29 4a d6 b5 ad 6b 5a d2 94 ff ee dd cc c4 55|.)J...kZ.......U| samples: 4a52b5ad6b5ad6b4a53ffbb773311559... 0x24c0.6-0x250f (78.3)
0x24d0|66 77 21 0a 52 98 c6 31 8c 63 18 a5 29 08 ee ca|fw!.R..1.c..)...|
* |until 0x250f (79) | |
| | | [4]: partition {} 0x250f.1-0x256b.1 (92.1)
| | | count: 128 0x250f.1-NA (0)
0x2500| a5| .| rice_parameter: 4 0x250f.1-0x250f.4 (0.4)
0x2500| a5| .| samples: be73bef7e8a69aaaaecb2db6dbaebafb... 0x250f.5-0x256b.1 (91.5)
0x2510|f3 9d f7 bf 45 34 d5 55 76 59 6d b6 dd 75 d7 df|....E4.UvYm..u..|
* |until 0x256b.1 (92) | |
| | | [5]: partition {} 0x256b.2-0x25e6.6 (123.5)
| | | count: 128 0x256b.2-NA (0)
0x2560| d8 | . | rice_parameter: 6 0x256b.2-0x256b.5 (0.4)
0x2560| d8 b8 7a 84 ae| ..z..| samples: 2e1ea12bb5aff5bae749b77c27e65371... 0x256b.6-0x25e6.6 (123.1)
0x2570|d6 bf d6 eb 9d 26 dd f0 9f 99 4d c5 c9 4f 05 86|.....&....M..O..|
* |until 0x25e6.6 (124) | |
| | | [6]: partition {} 0x25e6.7-0x2666 (127.2)
| | | count: 128 0x25e6.7-NA (0)
0x25e0| f0 d5 | .. | rice_parameter: 6 0x25e6.7-0x25e7.2 (0.4)
0x25e0| d5 de 24 1c 68 22 ba 20 4b| ..$.h". K| samples: aef120e34115d1025a6ab97a31923955... 0x25e7.3-0x2666 (126.6)
0x25f0|4d 57 2f 46 32 47 2a bf 2e b8 16 c5 1a fb 69 58|MW/F2G*.......iX|
* |until 0x2666 (127) | |
| | | [7]: partition {} 0x2666.1-0x26e4.6 (126.6)
| | | count: 128 0x2666.1-NA (0)
0x2660| b0 | . | rice_parameter: 6 0x2666.1-0x2666.4 (0.4)
0x2660| b0 cc ee b2 f9 52 47 84 8d 18| .....RG...| samples: 199dd65f2a48f091a3126ef27d727afb... 0x2666.5-0x26e4.6 (126.2)
0x2670|93 77 93 eb 93 d7 de 93 e5 a4 93 f3 ae 5e 81 50|.w...........^.P|
* |until 0x26e4.6 (127) | |
| | | [8]: partition {} 0x26e4.7-0x2761.4 (124.6)
| | | count: 128 0x26e4.7-NA (0)
0x26e0| 96 d3 | .. | rice_parameter: 6 0x26e4.7-0x26e5.2 (0.4)
0x26e0| d3 a2 ba 98 74 9d f6 2f 64 14 76| ....t../d.v| samples: 9d15d4c3a4efb17b20a3b4b10ab3a78f... 0x26e5.3-0x2761.4 (124.2)
0x26f0|96 21 56 74 f1 e9 4f 68 86 53 f6 d4 2b 24 fd 98|.!Vt..Oh.S..+$..|
* |until 0x2761.4 (125) | |
| | | [9]: partition {} 0x2761.5-0x27df (125.4)
| | | count: 128 0x2761.5-NA (0)
0x2760| 9b 70 | .p | rice_parameter: 6 0x2761.5-0x2762 (0.4)
0x2760| 70 7b 32 25 ce ed 04 99 f8 92 d6 9e 7a bd| p{2%........z.| samples: e0f6644b9dda0933f125ad3cf57a291d... 0x2762.1-0x27df (125)
0x2770|14 8e 80 78 ab 1c 97 5b b5 c4 54 93 c3 6c 09 0e|...x...[..T..l..|
* |until 0x27df (125) | |
| | | [10]: partition {} 0x27df.1-0x285e.6 (127.6)
| | | count: 128 0x27df.1-NA (0)
0x27d0| 33| 3| rice_parameter: 6 0x27df.1-0x27df.4 (0.4)
0x27d0| 33| 3| samples: 784dba9c468b78cdc220c4d9ad7220dc... 0x27df.5-0x285e.6 (127.2)
0x27e0|c2 6d d4 e2 34 5b c6 6e 11 06 26 cd 6b 91 06 e1|.m..4[.n..&.k...|
* |until 0x285e.6 (128) | |
| | | [11]: partition {} 0x285e.7-0x28dc.3 (125.5)
| | | count: 128 0x285e.7-NA (0)
0x2850| a4 c9| ..| rice_parameter: 6 0x285e.7-0x285f.2 (0.4)
0x2850| c9| .| samples: 4fbb0cbe2e1d0d6ecf74d621dcc1e177... 0x285f.3-0x28dc.3 (125.1)
0x2860|f7 61 97 c5 c3 a1 ad d9 ee 9a c4 3b 98 3c 2e f0|.a.........;.<..|
* |until 0x28dc.3 (126) | |
| | | [12]: partition {} 0x28dc.4-0x295c.1 (127.6)
| | | count: 128 0x28dc.4-NA (0)
0x28d0| 06 | . | rice_parameter: 6 0x28dc.4-0x28dc.7 (0.4)
0x28d0| 8e c6 fd| ...| samples: 8ec6fd59d5e1ab8d09ce4dc759cdd590... 0x28dd-0x295c.1 (127.2)
0x28e0|59 d5 e1 ab 8d 09 ce 4d c7 59 cd d5 90 ce aa 64|Y......M.Y.....d|
* |until 0x295c.1 (128) | |
| | | [13]: partition {} 0x295c.2-0x29d9.4 (125.3)
| | | count: 128 0x295c.2-NA (0)
0x2950| 9a | . | rice_parameter: 6 0x295c.2-0x295c.5 (0.4)
0x2950| 9a b9 23 19| ..#.| samples: ae48c672959a59a86da6221f97b39099... 0x295c.6-0x29d9.4 (124.7)
0x2960|ca 56 69 66 a1 b6 98 88 7e 5e ce 42 65 2b 3b f3|.Vif....~^.Be+;.|
* |until 0x29d9.4 (125) | |
| | | [14]: partition {} 0x29d9.5-0x2a57.4 (126)
| | | count: 128 0x29d9.5-NA (0)
0x29d0| 3b 2a | ;* | rice_parameter: 6 0x29d9.5-0x29da (0.4)
0x29d0| 2a 1d 97 1a 16 0c| *.....| samples: 543b2e342c196f25e51bd10d45618a8b... 0x29da.1-0x2a57.4 (125.4)
0x29e0|b7 92 f2 8d e8 86 a2 b0 c5 45 a7 0a 0d 49 53 0b|.........E...IS.|
* |until 0x2a57.4 (126) | |
| | | [15]: partition {} 0x2a57.5-0x2ad5.5 (126.1)
| | | count: 128 0x2a57.5-NA (0)
0x2a50| 43 65 | Ce | rice_parameter: 6 0x2a57.5-0x2a58 (0.4)
0x2a50| 65 6c 41 4e a8 34 a2 d2| elAN.4..| samples: cad8829d506945a4772027120e7491c9... 0x2a58.1-0x2ad5.5 (125.5)
0x2a60|3b 90 13 89 07 3a 48 e4 d4 49 19 e6 35 13 94 2c|;....:H..I..5..,|
* |until 0x2ad5.5 (126) | |
| | | [16]: partition {} 0x2ad5.6-0x2b52.6 (125.1)
| | | count: 128 0x2ad5.6-NA (0)
0x2ad0| 59 97 | Y. | rice_parameter: 6 0x2ad5.6-0x2ad6.1 (0.4)
0x2ad0| 97 6b c8 34 16 16 1d 2b be ca| .k.4...+..| samples: 5daf20d0585874aefb2b6306322abf48... 0x2ad6.2-0x2b52.6 (124.5)
0x2ae0|d8 c1 8c 8a af d2 21 bf 6e 08 e6 db d4 5b e2 29|......!.n....[.)|
* |until 0x2b52.6 (125) | |
| | | [17]: partition {} 0x2b52.7-0x2bd0.7 (126.1)
| | | count: 128 0x2b52.7-NA (0)
0x2b50| ca c4 | .. | rice_parameter: 6 0x2b52.7-0x2b53.2 (0.4)
0x2b50| c4 58 09 17 31 a5 c1 f6 75 37 de 37 7a| .X..1...u7.7z| samples: 22c048b98d2e0fb3a9bef1bbd4e27778... 0x2b53.3-0x2bd0.7 (125.5)
0x2b60|9c 4e ef 07 d9 89 ce 59 74 9c 50 b4 47 38 6d 5e|.N.....Yt.P.G8m^|
* |until 0x2bd0.7 (126) | |
| | | [18]: partition {} 0x2bd1-0x2c4f.6 (126.7)
| | | count: 128 0x2bd1-NA (0)
0x2bd0| 67 | g | rice_parameter: 6 0x2bd1-0x2bd1.3 (0.4)
0x2bd0| 67 08 e2 ce 46 3c 7b d0 62 0e f1 49 b8 06 e9| g...F<{.b..I...| samples: 708e2ce463c7bd0620ef149b806e930f... 0x2bd1.4-0x2c4f.6 (126.3)
0x2be0|30 f8 b2 df 20 c3 2e f2 6c 38 8a 9f 6a 7a 31 6b|0... ...l8..jz1k|
* |until 0x2c4f.6 (127) | |
| | | [19]: partition {} 0x2c4f.7-0x2ccf.1 (127.3)
| | | count: 128 0x2c4f.7-NA (0)
0x2c40| 8e| .| rice_parameter: 6 0x2c4f.7-0x2c50.2 (0.4)
0x2c50|c8 |. |
0x2c50|c8 62 91 60 48 e9 76 25 03 f1 06 ca 59 3b 1e 07|.b.`H.v%....Y;..| samples: 43148b02474bb1281f883652c9d8f039... 0x2c50.3-0x2ccf.1 (126.7)
0x2c60|24 f2 83 d6 8a 22 65 a2 04 ad 72 68 3f d0 20 27|$...."e...rh?. '|
* |until 0x2ccf.1 (127) | |
| | | [20]: partition {} 0x2ccf.2-0x2d4f.1 (128)
| | | count: 128 0x2ccf.2-NA (0)
0x2cc0| db| .| rice_parameter: 6 0x2ccf.2-0x2ccf.5 (0.4)
0x2cc0| db| .| samples: ceac8e7796f92b3a41512ec2cbda8b1c... 0x2ccf.6-0x2d4f.1 (127.4)
0x2cd0|3a b2 39 de 5b e4 ac e9 05 44 bb 0b 2f 6a 2c 73|:.9.[....D../j,s|
* |until 0x2d4f.1 (128) | |
| | | [21]: partition {} 0x2d4f.2-0x2dcf.4 (128.3)
| | | count: 128 0x2d4f.2-NA (0)
0x2d40| db| .| rice_parameter: 6 0x2d4f.2-0x2d4f.5 (0.4)
0x2d40| db| .| samples: dcb51a296948df4c423c1849e61eaf87... 0x2d4f.6-0x2dcf.4 (127.7)
0x2d50|72 d4 68 a5 a5 23 7d 31 08 f0 61 27 98 7a be 1e|r.h..#}1..a'.z..|
* |until 0x2dcf.4 (128) | |
| | | [22]: partition {} 0x2dcf.5-0x2e4e.5 (127.1)
| | | count: 128 0x2dcf.5-NA (0)
0x2dc0| 7b| {| rice_parameter: 6 0x2dcf.5-0x2dd0 (0.4)
0x2dd0|4d |M |
0x2dd0|4d 64 f8 51 8c b2 74 a6 5e 7a 45 d7 79 ae aa 84|Md.Q..t.^zE.y...| samples: 9ac9f0a31964e94cbcf48baef35d5509... 0x2dd0.1-0x2e4e.5 (126.5)
0x2de0|bb |. |
* |until 0x2e4e.5 (127) | |
| | | [23]: partition {} 0x2e4e.6-0x2ecc.2 (125.5)
| | | count: 128 0x2e4e.6-NA (0)
0x2e40| ed ba| ..| rice_parameter: 6 0x2e4e.6-0x2e4f.1 (0.4)
0x2e40| ba| .| samples: e8704f323da5f920ca565dbb49d8a327... 0x2e4f.2-0x2ecc.2 (125.1)
0x2e50|1c 13 cc 8f 69 7e 48 32 95 97 6e d2 76 28 c9 f2|....i~H2..n.v(..|
* |until 0x2ecc.2 (126) | |
| | | [24]: partition {} 0x2ecc.3-0x2f4b.4 (127.2)
| | | count: 128 0x2ecc.3-NA (0)
0x2ec0| 6d | m | rice_parameter: 6 0x2ecc.3-0x2ecc.6 (0.4)
0x2ec0| 6d df 23 91| m.#.| samples: ef91c8aa615d2d10c631033781088c9a... 0x2ecc.7-0x2f4b.4 (126.6)
0x2ed0|54 c2 ba 5a 21 8c 62 06 6f 02 11 19 35 2b be 21|T..Z!.b.o...5+.!|
* |until 0x2f4b.4 (127) | |
| | | [25]: partition {} 0x2f4b.5-0x2fc9.1 (125.5)
| | | count: 128 0x2f4b.5-NA (0)
0x2f40| bb 41 | .A | rice_parameter: 6 0x2f4b.5-0x2f4c (0.4)
0x2f40| 41 81 85 3e| A..>| samples: 83030a7d72c97a34d23f68df15dac4ad... 0x2f4c.1-0x2fc9.1 (125.1)
0x2f50|b9 64 bd 1a 69 1f b4 6f 8a ed 62 56 b6 15 c9 8c|.d..i..o..bV....|
* |until 0x2fc9.1 (126) | |
| | | [26]: partition {} 0x2fc9.2-0x3046.7 (125.6)
| | | count: 128 0x2fc9.2-NA (0)
0x2fc0| 18 | . | rice_parameter: 6 0x2fc9.2-0x2fc9.5 (0.4)
0x2fc0| 18 d3 11 45 bc 5f 7c| ...E._|| samples: 34c4516f17df25badf12c8085678b0a9... 0x2fc9.6-0x3046.7 (125.2)
0x2fd0|96 eb 7c 4b 20 21 59 e2 c2 a4 8e 73 c5 af d9 69|..|K !Y....s...i|
* |until 0x3046.7 (126) | |
| | | [27]: partition {} 0x3047-0x30c5.6 (126.7)
| | | count: 128 0x3047-NA (0)
0x3040| 68 | h | rice_parameter: 6 0x3047-0x3047.3 (0.4)
0x3040| 68 1e 3f d0 13 22 3e c8 17| h.?..">..| samples: 81e3fd013223ec81712920eace9ded4f... 0x3047.4-0x30c5.6 (126.3)
0x3050|12 92 0e ac e9 de d4 f8 9e c4 99 33 21 c4 28 eb|...........3!.(.|
* |until 0x30c5.6 (127) | |
| | | [28]: partition {} 0x30c5.7-0x3144.7 (127.1)
| | | count: 128 0x30c5.7-NA (0)
0x30c0| ee dc | .. | rice_parameter: 6 0x30c5.7-0x30c6.2 (0.4)
0x30c0| dc db 62 e6 e0 b9 b0 c4 4d 2e| ..b.....M.| samples: e6db173705cd8622697618dfc0b71ac2... 0x30c6.3-0x3144.7 (126.5)
0x30d0|c3 1b f8 16 e3 58 43 d4 2f d1 60 98 25 ee 43 18|.....XC./.`.%.C.|
* |until 0x3144.7 (127) | |
| | | [29]: partition {} 0x3145-0x31c5.2 (128.3)
| | | count: 128 0x3145-NA (0)
0x3140| 6e | n | rice_parameter: 6 0x3145-0x3145.3 (0.4)
0x3140| 6e 8e 4a 57 f4 25 8a c5 f4 5c 07| n.JW.%...\.| samples: e8e4a57f4258ac5f45c07d633423226e... 0x3145.4-0x31c5.2 (127.7)
0x3150|d6 33 42 32 26 e1 04 57 c6 aa 9a 70 21 ab eb 2d|.3B2&..W...p!..-|
* |until 0x31c5.2 (128) | |
| | | [30]: partition {} 0x31c5.3-0x3245 (127.6)
| | | count: 128 0x31c5.3-NA (0)
0x31c0| 0d | . | rice_parameter: 6 0x31c5.3-0x31c5.6 (0.4)
0x31c0| 0d 20 4d 98 aa 88 34 e4 d6 a3 c1| . M...4....| samples: 9026cc55441a726b51e0871cc22dc240... 0x31c5.7-0x3245 (127.2)
0x31d0|0e 39 84 5b 84 80 c9 93 d9 80 b9 11 08 55 2b 95|.9.[.........U+.|
* |until 0x3245 (128) | |
| | | [31]: partition {} 0x3245.1-0x32c2.4 (125.4)
| | | count: 128 0x3245.1-NA (0)
0x3240| 35 | 5 | rice_parameter: 6 0x3245.1-0x3245.4 (0.4)
0x3240| 35 78 5d ef 7c a0 91 52 a1 1a 19| 5x].|..R...| samples: af0bbdef94122a5423432c754e74634e... 0x3245.5-0x32c2.4 (125)
0x3250|63 aa 73 a3 1a 71 0d 0b 84 a5 a7 9e 46 b2 a9 38|c.s..q......F..8|
* |until 0x32c2.4 (125) | |
0x32c0| 60 | ` | byte_align: Correct (0x0) 0x32c2.5-0x32c2.7 (0.3)
0x32c0| 13 0f | .. | footer_crc: Correct (130f) 0x32c3-0x32c4.7 (2)
| | | [3]: frame {} (flac_frame) 0x32c5-0x396d.7 (1705)
| | | header: {} 0x32c5-0x32ca.7 (6)
0x32c0| ff f8 | .. | sync: Correct (0x3ffe) 0x32c5-0x32c6.5 (1.6)
0x32c0| f8 | . | reserved0: Correct (0x0) 0x32c6.6-0x32c6.6 (0.1)
0x32c0| f8 | . | blocking_strategy: Fixed (0) 0x32c6.7-0x32c6.7 (0.1)
0x32c0| c9 | . | block_size: 4096 0x32c7-0x32c7.3 (0.4)
0x32c0| c9 | . | sample_rate: 44100 0x32c7.4-0x32c7.7 (0.4)
0x32c0| 02 | . | channel_assignment: mono (1) 0x32c8-0x32c8.3 (0.4)
0x32c0| 02 | . | sample_size: 8 0x32c8.4-0x32c8.6 (0.3)
0x32c0| 02 | . | reserved1: Correct (0x0) 0x32c8.7-0x32c8.7 (0.1)
| | | end_of_header: {} 0x32c9-0x32c9.7 (1)
0x32c0| 03 | . | frame_number: 3 0x32c9-0x32c9.7 (1)
0x32c0| 1e | . | crc: Correct (1e) 0x32ca-0x32ca.7 (1)
| | | subframes: [1] 0x32cb-0x396b.6 (1696.7)
| | | [0]: subframe {} 0x32cb-0x396b.6 (1696.7)
0x32c0| 12 | . | zero_bit: Correct (0x0) 0x32cb-0x32cb (0.1)
0x32c0| 12 | . | subframe_type: Fixed (2) 0x32cb.1-0x32cb.6 (0.6)
| | | lpc_order: 1 0x32cb.7-NA (0)
0x32c0| 12 | . | wasted_bits_flag: 0 0x32cb.7-0x32cb.7 (0.1)
| | | subframe_sample_size: 8 0x32cc-NA (0)
| | | warmup_samples: [1] 0x32cc-0x32cc.7 (1)
0x32c0| e8 | . | [0]: value -24 0x32cc-0x32cc.7 (1)
0x32c0| 09 | . | residual_coding_method: rice (4) 0x32cd-0x32cd.1 (0.2)
0x32c0| 09 | . | partition_order: 2 0x32cd.2-0x32cd.5 (0.4)
| | | rice_partitions: 4 0x32cd.6-NA (0)
| | | partitions: [4] 0x32cd.6-0x396b.6 (1694.1)
| | | [0]: partition {} 0x32cd.6-0x36f1 (1059.3)
| | | count: 1023 0x32cd.6-NA (0)
0x32c0| 09 ad | .. | rice_parameter: 6 0x32cd.6-0x32ce.1 (0.4)
0x32c0| ad 1b| ..| samples: b46e08bfd73c5b68867fda0481269985... 0x32ce.2-0x36f1 (1058.7)
0x32d0|82 2f f5 cf 16 da 21 9f f6 81 20 49 a6 61 52 0a|./....!... I.aR.|
* |until 0x36f1 (1059) | |
| | | [1]: partition {} 0x36f1.1-0x37c5 (212)
| | | count: 1024 0x36f1.1-NA (0)
0x36f0| 01 | . | rice_parameter: 0 0x36f1.1-0x36f1.4 (0.4)
0x36f0| 01 99 e7 f7 6d b5 b5 b6 de f9 e6 66 64 99 32| ....m......fd.2| samples: 333cfeedb6b6b6dbdf3ccccc93264c99... 0x36f1.5-0x37c5 (211.4)
0x3700|64 cc e7 ff 6e b6 b5 ad b7 7f ce 66 64 c9 93 26|d...n......fd..&|
* |until 0x37c5 (212) | |
| | | [2]: partition {} 0x37c5.1-0x3898.2 (211.2)
| | | count: 1024 0x37c5.1-NA (0)
0x37c0| 84 | . | rice_parameter: 0 0x37c5.1-0x37c5.4 (0.4)
0x37c0| 84 99 99 cf f7 75 b5 ad 5b 6d f7| .....u..[m.| samples: 933339feeeb6b5ab6dbee7ccccc99332... 0x37c5.5-0x3898.2 (210.6)
0x37d0|3e 66 66 4c 99 93 33 9f fd b6 d6 ad 6b 6d df f3|>ffL..3.....km..|
* |until 0x3898.2 (211) | |
| | | [3]: partition {} 0x3898.3-0x396b.6 (211.4)
| | | count: 1024 0x3898.3-NA (0)
0x3890| 60 | ` | rice_parameter: 0 0x3898.3-0x3898.6 (0.4)
0x3890| 60 4c 99 99 9c ff bb 6b| `L.....k| samples: 264cccce7fddb5ad6ad6dbbfce732664... 0x3898.7-0x396b.6 (211)
0x38a0|5a d5 ad b7 7f 9c e6 4c c9 99 33 9c ff 76 da d5|Z......L..3..v..|
* |until 0x396b.6 (211) | |
0x3960| 32 | 2 | byte_align: Correct (0x0) 0x396b.7-0x396b.7 (0.1)
0x3960| c9 08 | .. | footer_crc: Correct (c908) 0x396c-0x396d.7 (2)
| | | [4]: frame {} (flac_frame) 0x396e-0x471b.7 (3502)
| | | header: {} 0x396e-0x3973.7 (6)
0x3960| ff f8| ..| sync: Correct (0x3ffe) 0x396e-0x396f.5 (1.6)
0x3960| f8| .| reserved0: Correct (0x0) 0x396f.6-0x396f.6 (0.1)
0x3960| f8| .| blocking_strategy: Fixed (0) 0x396f.7-0x396f.7 (0.1)
0x3970|c9 |. | block_size: 4096 0x3970-0x3970.3 (0.4)
0x3970|c9 |. | sample_rate: 44100 0x3970.4-0x3970.7 (0.4)
0x3970| 02 | . | channel_assignment: mono (1) 0x3971-0x3971.3 (0.4)
0x3970| 02 | . | sample_size: 8 0x3971.4-0x3971.6 (0.3)
0x3970| 02 | . | reserved1: Correct (0x0) 0x3971.7-0x3971.7 (0.1)
| | | end_of_header: {} 0x3972-0x3972.7 (1)
0x3970| 04 | . | frame_number: 4 0x3972-0x3972.7 (1)
0x3970| 0b | . | crc: Correct (0b) 0x3973-0x3973.7 (1)
| | | subframes: [1] 0x3974-0x4719.4 (3493.5)
| | | [0]: subframe {} 0x3974-0x4719.4 (3493.5)
0x3970| 40 | @ | zero_bit: Correct (0x0) 0x3974-0x3974 (0.1)
0x3970| 40 | @ | subframe_type: LPC (3) 0x3974.1-0x3974.6 (0.6)
| | | lpc_order: 1 0x3974.7-NA (0)
0x3970| 40 | @ | wasted_bits_flag: 0 0x3974.7-0x3974.7 (0.1)
| | | subframe_sample_size: 8 0x3975-NA (0)
| | | warmup_samples: [1] 0x3975-0x3975.7 (1)
0x3970| f8 | . | [0]: value -8 0x3975-0x3975.7 (1)
0x3970| 54 | T | precision: 6 0x3976-0x3976.3 (0.4)
0x3970| 54 a8 | T. | shift: 9 0x3976.4-0x3977 (0.5)
| | | coefficients: [1] 0x3977.1-0x3977.6 (0.6)
0x3970| a8 | . | [0]: value 20 0x3977.1-0x3977.6 (0.6)
0x3970| a8 21 | .! | residual_coding_method: rice (4) 0x3977.7-0x3978 (0.2)
0x3970| 21 | ! | partition_order: 4 0x3978.1-0x3978.4 (0.4)
| | | rice_partitions: 16 0x3978.5-NA (0)
| | | partitions: [16] 0x3978.5-0x4719.4 (3489)
| | | [0]: partition {} 0x3978.5-0x3a19.6 (161.2)
| | | count: 255 0x3978.5-NA (0)
0x3970| 21 ad | !. | rice_parameter: 3 0x3978.5-0x3979 (0.4)
0x3970| ad 69 4f ee dc cc 45| .iO...E| samples: 5ad29fddb9988a8aaccceeeeeeeeeccc... 0x3979.1-0x3a19.6 (160.6)
0x3980|45 56 66 77 77 77 77 76 66 55 44 4c 4d de ff a5|EVfwwwwvfUDLM...|
* |until 0x3a19.6 (161) | |
| | | [1]: partition {} 0x3a19.7-0x3ab6.3 (156.5)
| | | count: 256 0x3a19.7-NA (0)
0x3a10| 12 71 | .q | rice_parameter: 3 0x3a19.7-0x3a1a.2 (0.4)
0x3a10| 71 33 77 bf e9 4a| q3w..J| samples: 899bbdff4a56d6bde49259669a69e79e... 0x3a1a.3-0x3ab6.3 (156.1)
0x3a20|da d7 bc 92 4b 2c d3 4d 3c f3 cf 3c f3 cd 34 d3|....K,.M<..<..4.|
* |until 0x3ab6.3 (157) | |
| | | [2]: partition {} 0x3ab6.4-0x3b66 (175.5)
| | | count: 256 0x3ab6.4-NA (0)
0x3ab0| a3 | . | rice_parameter: 3 0x3ab6.4-0x3ab6.7 (0.4)
0x3ab0| ac ce e4 29 8c 71 04 14 61| ...).q..a| samples: accee4298c710414618708102850c183... 0x3ab7-0x3b66 (175.1)
0x3ac0|87 08 10 28 50 c1 83 07 0e 1c 38 70 e1 c3 87 0e|...(P.....8p....|
* |until 0x3b66 (176) | |
| | | [3]: partition {} 0x3b66.1-0x3c04.1 (158.1)
| | | count: 256 0x3b66.1-NA (0)
0x3b60| 19 | . | rice_parameter: 3 0x3b66.1-0x3b66.4 (0.4)
0x3b60| 19 44 10 e6 31 48 47 66 54 4c| .D..1HGfTL| samples: 28821cc62908ecca8989bbddff4a52b5... 0x3b66.5-0x3c04.1 (157.5)
0x3b70|4d de ef fa 52 95 ad 6b 5a d6 b4 a5 3f ff bb 73|M...R..kZ...?..s|
* |until 0x3c04.1 (158) | |
| | | [4]: partition {} 0x3c04.2-0x3cb6.6 (178.5)
| | | count: 256 0x3c04.2-NA (0)
0x3c00| d1 | . | rice_parameter: 4 0x3c04.2-0x3c04.5 (0.4)
0x3c00| d1 b6 59 5d 75 55 4d 14 7f de ef 39| ..Y]uUM....9| samples: 6d96575d5553451ff7bbce6f5ace718c... 0x3c04.6-0x3cb6.6 (178.1)
0x3c10|bd 6b 39 c6 30 84 25 08 42 10 84 21 18 42 31 9c|.k9.0.%.B..!.B1.|
* |until 0x3cb6.6 (179) | |
| | | [5]: partition {} 0x3cb6.7-0x3dab.1 (244.3)
| | | count: 256 0x3cb6.7-NA (0)
0x3cb0| 2c dc | ,. | rice_parameter: 6 0x3cb6.7-0x3cb7.2 (0.4)
0x3cb0| dc 37 aa b8 5c ba c7 ad d9| .7..\....| samples: e1bd55c2e5d63d6ecfa4051ceeea9778... 0x3cb7.3-0x3dab.1 (243.7)
0x3cc0|f4 80 a3 9d dd 52 ef 09 95 a9 34 22 d4 4b 47 78|.....R....4".KGx|
* |until 0x3dab.1 (244) | |
| | | [6]: partition {} 0x3dab.2-0x3e98.1 (237)
| | | count: 256 0x3dab.2-NA (0)
0x3da0| 95 | . | rice_parameter: 5 0x3dab.2-0x3dab.5 (0.4)
0x3da0| 95 db a6 42 69| ...Bi| samples: 76e9909a53c94ec26426b9f04c203a5b... 0x3dab.6-0x3e98.1 (236.4)
0x3db0|4f 25 3b 09 90 9a e7 c1 30 80 e9 6c e3 c0 90 d4|O%;.....0..l....|
* |until 0x3e98.1 (237) | |
| | | [7]: partition {} 0x3e98.2-0x3f88.7 (240.6)
| | | count: 256 0x3e98.2-NA (0)
0x3e90| 55 | U | rice_parameter: 5 0x3e98.2-0x3e98.5 (0.4)
0x3e90| 55 90 b8 a0 24 17 e4 2c| U...$..,| samples: 642e280905f90b0aa6cd096049cd3e84... 0x3e98.6-0x3f88.7 (240.2)
0x3ea0|2a 9b 34 25 81 27 34 fa 12 10 1b 10 b9 11 0e b9|*.4%.'4.........|
* |until 0x3f88.7 (241) | |
| | | [8]: partition {} 0x3f89-0x407c (243.1)
| | | count: 256 0x3f89-NA (0)
0x3f80| 6b | k | rice_parameter: 6 0x3f89-0x3f89.3 (0.4)
0x3f80| 6b a8 39 f4 22 66 47| k.9."fG| samples: ba839f422664780db8955566636f7047... 0x3f89.4-0x407c (242.5)
0x3f90|80 db 89 55 56 66 36 f7 04 76 22 23 aa 9b 6d fb|...UVf6..v"#..m.|
* |until 0x407c (243) | |
| | | [9]: partition {} 0x407c.1-0x416d.4 (241.4)
| | | count: 256 0x407c.1-NA (0)
0x4070| b5 | . | rice_parameter: 6 0x407c.1-0x407c.4 (0.4)
0x4070| b5 26 ed f5| .&..| samples: a4ddbeaf5e2ccfcf11d95ce045f96080... 0x407c.5-0x416d.4 (241)
0x4080|7a f1 66 7e 78 8e ca e7 02 2f cb 04 06 79 36 70|z.f~x..../...y6p|
* |until 0x416d.4 (241) | |
| | | [10]: partition {} 0x416d.5-0x425f.7 (242.3)
| | | count: 256 0x416d.5-NA (0)
0x4160| 53 22 | S" | rice_parameter: 6 0x416d.5-0x416e (0.4)
0x4160| 22 bb| ".| samples: 45764088996975e9390ed4e87c38ddf8... 0x416e.1-0x425f.7 (241.7)
0x4170|20 44 4c b4 ba f4 9c 87 6a 74 3e 1c 6e fc 22 d0| DL.....jt>.n.".|
* |until 0x425f.7 (242) | |
| | | [11]: partition {} 0x4260-0x4351.1 (241.2)
| | | count: 256 0x4260-NA (0)
0x4260|65 |e | rice_parameter: 6 0x4260-0x4260.3 (0.4)
0x4260|65 ee 84 d8 6d 4c d7 da 5d be a2 ff a2 82 e2 e9|e...mL..].......| samples: 5ee84d86d4cd7da5dbea2ffa282e2e90... 0x4260.4-0x4351.1 (240.6)
0x4270|0e 2d f7 0f bf 30 d8 56 58 47 99 17 fd bf 3d 33|.-...0.VXG....=3|
* |until 0x4351.1 (241) | |
| | | [12]: partition {} 0x4351.2-0x4443.4 (242.3)
| | | count: 256 0x4351.2-NA (0)
0x4350| 1b | . | rice_parameter: 6 0x4351.2-0x4351.5 (0.4)
0x4350| 1b 62 1a 11 25 07 92 16 a9 7b ed 75 a9 82 0a| .b..%....{.u...| samples: d886844941e485aa5efb5d6a6082b56d... 0x4351.6-0x4443.4 (241.7)
0x4360|d5 b6 6e eb a8 69 6a 5a fd 57 5f 93 90 87 82 6b|..n..ijZ.W_....k|
* |until 0x4443.4 (242) | |
| | | [13]: partition {} 0x4443.5-0x4533.2 (239.6)
| | | count: 256 0x4443.5-NA (0)
0x4440| 4a af | J. | rice_parameter: 5 0x4443.5-0x4444 (0.4)
0x4440| af b1 bb b3 f3 e1 79 ca ee 84 c5 65| ......y....e| samples: 5f637767e7c2f395dd098acb06d533e2... 0x4444.1-0x4533.2 (239.2)
0x4450|83 6a 99 f1 01 b8 e0 62 75 c3 11 c1 23 f1 5d a4|.j.....bu...#.].|
* |until 0x4533.2 (240) | |
| | | [14]: partition {} 0x4533.3-0x4626.5 (243.3)
| | | count: 256 0x4533.3-NA (0)
0x4530| 0c | . | rice_parameter: 6 0x4533.3-0x4533.6 (0.4)
0x4530| 0c 81 3b ad ac ca 12 5d 31 46 f1 ab 0a| ..;....]1F...| samples: 409dd6d665092e98a378d5854c81dfbb... 0x4533.7-0x4626.5 (242.7)
0x4540|99 03 bf 76 56 be 56 d9 1c 9c a0 b6 6c 75 46 6c|...vV.V.....luFl|
* |until 0x4626.5 (243) | |
| | | [15]: partition {} 0x4626.6-0x4719.4 (242.7)
| | | count: 256 0x4626.6-NA (0)
0x4620| f1 ad | .. | rice_parameter: 6 0x4626.6-0x4627.1 (0.4)
0x4620| ad e6 69 b7 73 ae 16 35 e6| ..i.s..5.| samples: b799a6ddceb858d79b13f2e65d8b3b9f... 0x4627.2-0x4719.4 (242.3)
0x4630|c4 fc b9 97 62 ce e7 c3 21 19 d1 cf 4c 07 8b f1|....b...!...L...|
* |until 0x4719.4 (243) | |
0x4710| a0 | . | byte_align: Correct (0x0) 0x4719.5-0x4719.7 (0.3)
0x4710| d1 f3 | .. | footer_crc: Correct (d1f3) 0x471a-0x471b.7 (2)
| | | [5]: frame {} (flac_frame) 0x471c-0x4cef.7 (1492)
| | | header: {} 0x471c-0x4723.7 (8)
0x4710| ff f8 | .. | sync: Correct (0x3ffe) 0x471c-0x471d.5 (1.6)
0x4710| f8 | . | reserved0: Correct (0x0) 0x471d.6-0x471d.6 (0.1)
0x4710| f8 | . | blocking_strategy: Fixed (0) 0x471d.7-0x471d.7 (0.1)
0x4710| 79 | y | block_size: end of header (16 bit) (0) 0x471e-0x471e.3 (0.4)
0x4710| 79 | y | sample_rate: 44100 0x471e.4-0x471e.7 (0.4)
0x4710| 02| .| channel_assignment: mono (1) 0x471f-0x471f.3 (0.4)
0x4710| 02| .| sample_size: 8 0x471f.4-0x471f.6 (0.3)
0x4710| 02| .| reserved1: Correct (0x0) 0x471f.7-0x471f.7 (0.1)
| | | end_of_header: {} 0x4720-0x4722.7 (3)
0x4720|05 |. | frame_number: 5 0x4720-0x4720.7 (1)
0x4720| 06 21 | .! | block_size: 1570 0x4721-0x4722.7 (2)
0x4720| a4 | . | crc: Correct (a4) 0x4723-0x4723.7 (1)
| | | subframes: [1] 0x4724-0x4ced.5 (1481.6)
| | | [0]: subframe {} 0x4724-0x4ced.5 (1481.6)
0x4720| 10 | . | zero_bit: Correct (0x0) 0x4724-0x4724 (0.1)
0x4720| 10 | . | subframe_type: Fixed (2) 0x4724.1-0x4724.6 (0.6)
| | | lpc_order: 0 0x4724.7-NA (0)
0x4720| 10 | . | wasted_bits_flag: 0 0x4724.7-0x4724.7 (0.1)
| | | subframe_sample_size: 8 0x4725-NA (0)
| | | warmup_samples: [0] 0x4725-NA (0)
0x4720| 01 | . | residual_coding_method: rice (4) 0x4725-0x4725.1 (0.2)
0x4720| 01 | . | partition_order: 0 0x4725.2-0x4725.5 (0.4)
| | | rice_partitions: 1 0x4725.6-NA (0)
| | | partitions: [1] 0x4725.6-0x4ced.5 (1480)
| | | [0]: partition {} 0x4725.6-0x4ced.5 (1480)
| | | count: 1570 0x4725.6-NA (0)
0x4720| 01 4b | .K | rice_parameter: 5 0x4725.6-0x4726.1 (0.4)
0x4720| 4b 8d 82 22 81 19 6a 31 55 c9| K.."..j1U.| samples: 2e36088a0465a8c557252fa024e15d56... 0x4726.2-0x4ced.5 (1479.4)
0x4730|4b e8 09 38 57 55 8b 53 56 14 0b ee 3c 70 14 15|K..8WU.SV...<p..|
* |until 0x4ced.5 (1480) | |
0x4ce0| b4 | . | byte_align: Correct (0x0) 0x4ced.6-0x4ced.7 (0.2)
0x4ce0| e8 b7| ..| footer_crc: Correct (e8b7) 0x4cee-0x4cef.7 (2)
| | | md5_calculated: 1b43073d6a826942bca82cfd2ea155f2 0x4cf0-NA (0)
| | | decoded_samples: 22050 0x4cf0-NA (0)

Binary file not shown.

View File

@ -0,0 +1,266 @@
/picture_seek_gain.flac:
> fq -d flac verbose /picture_seek_gain.flac
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /picture_seek_gain.flac (flac) 0x0-0x225f.7 (8800)
0x0000|66 4c 61 43 |fLaC | magic: "fLaC" (Correct) 0x0-0x3.7 (4)
| | | metadatablocks: [5] 0x4-0x205f.7 (8284)
| | | [0]: metadatablock {} (flac_metadatablock) 0x4-0x29.7 (38)
0x0000| 00 | . | last_block: false 0x4-0x4 (0.1)
0x0000| 00 | . | type: Streaminfo (0) 0x4.1-0x4.7 (0.7)
0x0000| 00 00 22 | .." | length: 34 0x5-0x7.7 (3)
0x0000| 12 00 | .. | minimum_block_size: 4608 0x8-0x9.7 (2)
0x0000| 12 00 | .. | maximum_block_size: 4608 0xa-0xb.7 (2)
0x0000| 00 02 00 | ... | minimum_frame_size: 512 0xc-0xe.7 (3)
0x0000| 00| .| maximum_frame_size: 512 0xf-0x11.7 (3)
0x0010|02 00 |.. |
0x0010| 0a c4 40 | ..@ | sample_rate: 44100 0x12-0x14.3 (2.4)
0x0010| 40 | @ | channels: 1 0x14.4-0x14.6 (0.3)
0x0010| 40 f0 | @. | bits_per_sample: 16 0x14.7-0x15.3 (0.5)
0x0010| f0 00 00 01 b9 | ..... | total_samples_in_stream: 441 0x15.4-0x19.7 (4.4)
0x0010| 89 88 7b 80 f8 10| ..{...| md5: 89887b80f810285b45f6c4ecc72c977e 0x1a-0x29.7 (16)
0x0020|28 5b 45 f6 c4 ec c7 2c 97 7e |([E....,.~ |
| | | [1]: metadatablock {} (flac_metadatablock) 0x2a-0x3f.7 (22)
0x0020| 03 | . | last_block: false 0x2a-0x2a (0.1)
0x0020| 03 | . | type: Seektable (3) 0x2a.1-0x2a.7 (0.7)
0x0020| 00 00 12 | ... | length: 18 0x2b-0x2d.7 (3)
| | | seekpoints: [1] 0x2e-0x3f.7 (18)
| | | [0]: seekpoint {} 0x2e-0x3f.7 (18)
0x0020| 00 00| ..| sample_number: 0 0x2e-0x35.7 (8)
0x0030|00 00 00 00 00 00 |...... |
0x0030| 00 00 00 00 00 00 00 00 | ........ | offset: 0 0x36-0x3d.7 (8)
0x0030| 01 b9| ..| number_of_samples: 441 0x3e-0x3f.7 (2)
| | | [2]: metadatablock {} (flac_metadatablock) 0x40-0x12e.7 (239)
0x0040|04 |. | last_block: false 0x40-0x40 (0.1)
0x0040|04 |. | type: Vorbis comment (4) 0x40.1-0x40.7 (0.7)
0x0040| 00 00 eb | ... | length: 235 0x41-0x43.7 (3)
| | | comment: {} (vorbis_comment) 0x44-0x12e.7 (235)
0x0040| 0d 00 00 00 | .... | vendor_length: 13 0x44-0x47.7 (4)
0x0040| 4c 61 76 66 35 38 2e 34| Lavf58.4| vendor: "Lavf58.45.100" 0x48-0x54.7 (13)
0x0050|35 2e 31 30 30 |5.100 |
0x0050| 06 00 00 00 | .... | user_comment_list_length: 6 0x55-0x58.7 (4)
| | | user_comments: [6] 0x59-0x12e.7 (214)
| | | [0]: user_comment {} 0x59-0x71.7 (25)
0x0050| 15 00 00 00 | .... | length: 21 0x59-0x5c.7 (4)
0x0050| 65 6e 63| enc| vendor: "encoder=Lavf58.45.100" 0x5d-0x71.7 (21)
0x0060|6f 64 65 72 3d 4c 61 76 66 35 38 2e 34 35 2e 31|oder=Lavf58.45.1|
0x0070|30 30 |00 |
| | | [1]: user_comment {} 0x72-0x9a.7 (41)
0x0070| 25 00 00 00 | %... | length: 37 0x72-0x75.7 (4)
0x0070| 52 45 50 4c 41 59 47 41 49 4e| REPLAYGAIN| vendor: "REPLAYGAIN_REFERENCE_LOUDNESS=89.0 dB" 0x76-0x9a.7 (37)
0x0080|5f 52 45 46 45 52 45 4e 43 45 5f 4c 4f 55 44 4e|_REFERENCE_LOUDN|
0x0090|45 53 53 3d 38 39 2e 30 20 64 42 |ESS=89.0 dB |
| | | [2]: user_comment {} 0x9b-0xc0.7 (38)
0x0090| 22 00 00 00 | "... | length: 34 0x9b-0x9e.7 (4)
0x0090| 52| R| vendor: "REPLAYGAIN_TRACK_GAIN=-24601.00 dB" 0x9f-0xc0.7 (34)
0x00a0|45 50 4c 41 59 47 41 49 4e 5f 54 52 41 43 4b 5f|EPLAYGAIN_TRACK_|
* |until 0xc0.7 (34) | |
| | | [3]: user_comment {} 0xc1-0xe4.7 (36)
0x00c0| 20 00 00 00 | ... | length: 32 0xc1-0xc4.7 (4)
0x00c0| 52 45 50 4c 41 59 47 41 49 4e 5f| REPLAYGAIN_| vendor: "REPLAYGAIN_TRACK_PEAK=0.12496948" 0xc5-0xe4.7 (32)
0x00d0|54 52 41 43 4b 5f 50 45 41 4b 3d 30 2e 31 32 34|TRACK_PEAK=0.124|
0x00e0|39 36 39 34 38 |96948 |
| | | [4]: user_comment {} 0xe5-0x10a.7 (38)
0x00e0| 22 00 00 00 | "... | length: 34 0xe5-0xe8.7 (4)
0x00e0| 52 45 50 4c 41 59 47| REPLAYG| vendor: "REPLAYGAIN_ALBUM_GAIN=-24601.00 dB" 0xe9-0x10a.7 (34)
0x00f0|41 49 4e 5f 41 4c 42 55 4d 5f 47 41 49 4e 3d 2d|AIN_ALBUM_GAIN=-|
0x0100|32 34 36 30 31 2e 30 30 20 64 42 |24601.00 dB |
| | | [5]: user_comment {} 0x10b-0x12e.7 (36)
0x0100| 20 00 00 00 | ... | length: 32 0x10b-0x10e.7 (4)
0x0100| 52| R| vendor: "REPLAYGAIN_ALBUM_PEAK=0.12496948" 0x10f-0x12e.7 (32)
0x0110|45 50 4c 41 59 47 41 49 4e 5f 41 4c 42 55 4d 5f|EPLAYGAIN_ALBUM_|
0x0120|50 45 41 4b 3d 30 2e 31 32 34 39 36 39 34 38 |PEAK=0.12496948 |
| | | [3]: metadatablock {} (flac_metadatablock) 0x12f-0x25e.7 (304)
0x0120| 06| .| last_block: false 0x12f-0x12f (0.1)
0x0120| 06| .| type: Picture (6) 0x12f.1-0x12f.7 (0.7)
0x0130|00 01 2c |.., | length: 300 0x130-0x132.7 (3)
| | | picture: {} (flac_picture) 0x133-0x25e.7 (300)
0x0130| 00 00 00 03 | .... | picture_type: 3 0x133-0x136.7 (4)
0x0130| 00 00 00 09 | .... | mime_length: 9 0x137-0x13a.7 (4)
0x0130| 69 6d 61 67 65| image| mime: "image/png" 0x13b-0x143.7 (9)
0x0140|2f 70 6e 67 |/png |
0x0140| 00 00 00 00 | .... | description_length: 0 0x144-0x147.7 (4)
| | | description: "" 0x148-NA (0)
0x0140| 00 00 00 04 | .... | width: 4 0x148-0x14b.7 (4)
0x0140| 00 00 00 04| ....| height: 4 0x14c-0x14f.7 (4)
0x0150|00 00 00 01 |.... | color_depth: 1 0x150-0x153.7 (4)
0x0150| 00 00 00 00 | .... | number_of_index_colors: 0 0x154-0x157.7 (4)
0x0150| 00 00 01 03 | .... | picture_length: 259 0x158-0x15b.7 (4)
| | | picture_data: {} (png) 0x15c-0x25e.7 (259)
0x0150| 89 50 4e 47| .PNG| signature: "\x89PNG\r\n\x1a\n" (Correct) 0x15c-0x163.7 (8)
0x0160|0d 0a 1a 0a |.... |
| | | chunks: [9] 0x164-0x25e.7 (251)
| | | [0]: chunk {} 0x164-0x17c.7 (25)
0x0160| 00 00 00 0d | .... | length: 13 0x164-0x167.7 (4)
0x0160| 49 48 44 52 | IHDR | type: "IHDR" 0x168-0x16b.7 (4)
0x0160| 49 | I | ancillary: false 0x168.3-0x168.3 (0.1)
0x0160| 48 | H | private: false 0x169.3-0x169.3 (0.1)
0x0160| 44 | D | reserved: false 0x16a.3-0x16a.3 (0.1)
0x0160| 52 | R | safe_to_copy: true 0x16b.3-0x16b.3 (0.1)
0x0160| 00 00 00 04| ....| width: 4 0x16c-0x16f.7 (4)
0x0170|00 00 00 04 |.... | height: 4 0x170-0x173.7 (4)
0x0170| 01 | . | bit_depth: 1 0x174-0x174.7 (1)
0x0170| 00 | . | color_type: 0 0x175-0x175.7 (1)
0x0170| 00 | . | compression_method: deflate (0) 0x176-0x176.7 (1)
0x0170| 00 | . | filter_method: Adaptive filtering (0) 0x177-0x177.7 (1)
0x0170| 00 | . | interlace_method: No interlace (0) 0x178-0x178.7 (1)
0x0170| 81 8a a3 d3 | .... | crc: Correct (818aa3d3) 0x179-0x17c.7 (4)
| | | [1]: chunk {} 0x17d-0x18c.7 (16)
0x0170| 00 00 00| ...| length: 4 0x17d-0x180.7 (4)
0x0180|04 |. |
0x0180| 67 41 4d 41 | gAMA | type: "gAMA" 0x181-0x184.7 (4)
0x0180| 67 | g | ancillary: false 0x181.3-0x181.3 (0.1)
0x0180| 41 | A | private: false 0x182.3-0x182.3 (0.1)
0x0180| 4d | M | reserved: false 0x183.3-0x183.3 (0.1)
0x0180| 41 | A | safe_to_copy: false 0x184.3-0x184.3 (0.1)
0x0180| 00 00 b1 8f | .... | value: 45455 0x185-0x188.7 (4)
0x0180| 0b fc 61 05 | ..a. | crc: Correct (0bfc6105) 0x189-0x18c.7 (4)
| | | [2]: chunk {} 0x18d-0x1b8.7 (44)
0x0180| 00 00 00| ...| length: 32 0x18d-0x190.7 (4)
0x0190|20 | |
0x0190| 63 48 52 4d | cHRM | type: "cHRM" 0x191-0x194.7 (4)
0x0190| 63 | c | ancillary: false 0x191.3-0x191.3 (0.1)
0x0190| 48 | H | private: false 0x192.3-0x192.3 (0.1)
0x0190| 52 | R | reserved: true 0x193.3-0x193.3 (0.1)
0x0190| 4d | M | safe_to_copy: false 0x194.3-0x194.3 (0.1)
0x0190| 00 00 7a 26 | ..z& | white_point_x: 31.27 0x195-0x198.7 (4)
0x0190| 00 00 80 84 | .... | white_point_y: 32.9 0x199-0x19c.7 (4)
0x0190| 00 00 fa| ...| red_x: 64 0x19d-0x1a0.7 (4)
0x01a0|00 |. |
0x01a0| 00 00 80 e8 | .... | red_y: 33 0x1a1-0x1a4.7 (4)
0x01a0| 00 00 75 30 | ..u0 | green_x: 30 0x1a5-0x1a8.7 (4)
0x01a0| 00 00 ea 60 | ...` | green_y: 60 0x1a9-0x1ac.7 (4)
0x01a0| 00 00 3a| ..:| blue_x: 15 0x1ad-0x1b0.7 (4)
0x01b0|98 |. |
0x01b0| 00 00 17 70 | ...p | blue_y: 6 0x1b1-0x1b4.7 (4)
0x01b0| 9c ba 51 3c | ..Q< | crc: Correct (9cba513c) 0x1b5-0x1b8.7 (4)
| | | [3]: chunk {} 0x1b9-0x1c6.7 (14)
0x01b0| 00 00 00 02 | .... | length: 2 0x1b9-0x1bc.7 (4)
0x01b0| 62 4b 47| bKG| type: "bKGD" 0x1bd-0x1c0.7 (4)
0x01c0|44 |D |
0x01b0| 62 | b | ancillary: false 0x1bd.3-0x1bd.3 (0.1)
0x01b0| 4b | K | private: false 0x1be.3-0x1be.3 (0.1)
0x01b0| 47| G| reserved: false 0x1bf.3-0x1bf.3 (0.1)
0x01c0|44 |D | safe_to_copy: false 0x1c0.3-0x1c0.3 (0.1)
0x01c0| 00 01 | .. | value: 1 0x1c1-0x1c2.7 (2)
0x01c0| dd 8a 13 a4 | .... | crc: Correct (dd8a13a4) 0x1c3-0x1c6.7 (4)
| | | [4]: chunk {} 0x1c7-0x1d9.7 (19)
0x01c0| 00 00 00 07 | .... | length: 7 0x1c7-0x1ca.7 (4)
0x01c0| 74 49 4d 45 | tIME | type: "tIME" 0x1cb-0x1ce.7 (4)
0x01c0| 74 | t | ancillary: true 0x1cb.3-0x1cb.3 (0.1)
0x01c0| 49 | I | private: false 0x1cc.3-0x1cc.3 (0.1)
0x01c0| 4d | M | reserved: false 0x1cd.3-0x1cd.3 (0.1)
0x01c0| 45 | E | safe_to_copy: false 0x1ce.3-0x1ce.3 (0.1)
0x01c0| 07| .| data: 07e5021b163b1c 0x1cf-0x1d5.7 (7)
0x01d0|e5 02 1b 16 3b 1c |....;. |
0x01d0| 47 9d cf da | G... | crc: Correct (479dcfda) 0x1d6-0x1d9.7 (4)
| | | [5]: chunk {} 0x1da-0x1f0.7 (23)
0x01d0| 00 00 00 0b | .... | length: 11 0x1da-0x1dd.7 (4)
0x01d0| 49 44| ID| type: "IDAT" 0x1de-0x1e1.7 (4)
0x01e0|41 54 |AT |
0x01d0| 49 | I | ancillary: false 0x1de.3-0x1de.3 (0.1)
0x01d0| 44| D| private: false 0x1df.3-0x1df.3 (0.1)
0x01e0|41 |A | reserved: false 0x1e0.3-0x1e0.3 (0.1)
0x01e0| 54 | T | safe_to_copy: true 0x1e1.3-0x1e1.3 (0.1)
0x01e0| 08 d7 63 60 80 00 00 00 08 00 01 | ..c`....... | data: 08d7636080000000080001 0x1e2-0x1ec.7 (11)
0x01e0| 2f 20 dd| / .| crc: Correct (2f20dd31) 0x1ed-0x1f0.7 (4)
0x01f0|31 |1 |
| | | [6]: chunk {} 0x1f1-0x221.7 (49)
0x01f0| 00 00 00 25 | ...% | length: 37 0x1f1-0x1f4.7 (4)
0x01f0| 74 45 58 74 | tEXt | type: "tEXt" 0x1f5-0x1f8.7 (4)
0x01f0| 74 | t | ancillary: true 0x1f5.3-0x1f5.3 (0.1)
0x01f0| 45 | E | private: false 0x1f6.3-0x1f6.3 (0.1)
0x01f0| 58 | X | reserved: true 0x1f7.3-0x1f7.3 (0.1)
0x01f0| 74 | t | safe_to_copy: true 0x1f8.3-0x1f8.3 (0.1)
0x01f0| 64 61 74 65 3a 63 72| date:cr| keyword: "date:create" 0x1f9-0x203.7 (11)
0x0200|65 61 74 65 |eate |
0x0200| 00 | . | null: "\x00" 0x204-0x204.7 (1)
0x0200| 32 30 32 31 2d 30 32 2d 32 37 54| 2021-02-27T| text: "2021-02-27T22:59:28+00:00" 0x205-0x21d.7 (25)
0x0210|32 32 3a 35 39 3a 32 38 2b 30 30 3a 30 30 |22:59:28+00:00 |
0x0210| 3b 7f| ;.| crc: Correct (3b7fd305) 0x21e-0x221.7 (4)
0x0220|d3 05 |.. |
| | | [7]: chunk {} 0x222-0x252.7 (49)
0x0220| 00 00 00 25 | ...% | length: 37 0x222-0x225.7 (4)
0x0220| 74 45 58 74 | tEXt | type: "tEXt" 0x226-0x229.7 (4)
0x0220| 74 | t | ancillary: true 0x226.3-0x226.3 (0.1)
0x0220| 45 | E | private: false 0x227.3-0x227.3 (0.1)
0x0220| 58 | X | reserved: true 0x228.3-0x228.3 (0.1)
0x0220| 74 | t | safe_to_copy: true 0x229.3-0x229.3 (0.1)
0x0220| 64 61 74 65 3a 6d| date:m| keyword: "date:modify" 0x22a-0x234.7 (11)
0x0230|6f 64 69 66 79 |odify |
0x0230| 00 | . | null: "\x00" 0x235-0x235.7 (1)
0x0230| 32 30 32 31 2d 30 32 2d 32 37| 2021-02-27| text: "2021-02-27T22:59:28+00:00" 0x236-0x24e.7 (25)
0x0240|54 32 32 3a 35 39 3a 32 38 2b 30 30 3a 30 30 |T22:59:28+00:00 |
0x0240| 4a| J| crc: Correct (4a226bb9) 0x24f-0x252.7 (4)
0x0250|22 6b b9 |"k. |
| | | [8]: chunk {} 0x253-0x25e.7 (12)
0x0250| 00 00 00 00 | .... | length: 0 0x253-0x256.7 (4)
0x0250| 49 45 4e 44 | IEND | type: "IEND" 0x257-0x25a.7 (4)
0x0250| 49 | I | ancillary: false 0x257.3-0x257.3 (0.1)
0x0250| 45 | E | private: false 0x258.3-0x258.3 (0.1)
0x0250| 4e | N | reserved: false 0x259.3-0x259.3 (0.1)
0x0250| 44 | D | safe_to_copy: false 0x25a.3-0x25a.3 (0.1)
0x0250| ae 42 60 82 | .B`. | crc: Correct (ae426082) 0x25b-0x25e.7 (4)
| | | [4]: metadatablock {} (flac_metadatablock) 0x25f-0x205f.7 (7681)
0x0250| 81| .| last_block: true 0x25f-0x25f (0.1)
0x0250| 81| .| type: Padding (1) 0x25f.1-0x25f.7 (0.7)
0x0260|00 1d fd |... | length: 7677 0x260-0x262.7 (3)
0x0260| 00 00 00 00 00 00 00 00 00 00 00 00 00| .............| data: 00000000000000000000000000000000... 0x263-0x205f.7 (7677)
0x0270|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0x205f.7 (7677) | |
| | | frames: [1] 0x2060-0x225f.7 (512)
| | | [0]: frame {} (flac_frame) 0x2060-0x225f.7 (512)
| | | header: {} 0x2060-0x2067.7 (8)
0x2060|ff f8 |.. | sync: Correct (0x3ffe) 0x2060-0x2061.5 (1.6)
0x2060| f8 | . | reserved0: Correct (0x0) 0x2061.6-0x2061.6 (0.1)
0x2060| f8 | . | blocking_strategy: Fixed (0) 0x2061.7-0x2061.7 (0.1)
0x2060| 79 | y | block_size: end of header (16 bit) (0) 0x2062-0x2062.3 (0.4)
0x2060| 79 | y | sample_rate: 44100 0x2062.4-0x2062.7 (0.4)
0x2060| 08 | . | channel_assignment: mono (1) 0x2063-0x2063.3 (0.4)
0x2060| 08 | . | sample_size: 16 0x2063.4-0x2063.6 (0.3)
0x2060| 08 | . | reserved1: Correct (0x0) 0x2063.7-0x2063.7 (0.1)
| | | end_of_header: {} 0x2064-0x2066.7 (3)
0x2060| 00 | . | frame_number: 0 0x2064-0x2064.7 (1)
0x2060| 01 b8 | .. | block_size: 441 0x2065-0x2066.7 (2)
0x2060| 55 | U | crc: Correct (55) 0x2067-0x2067.7 (1)
| | | subframes: [1] 0x2068-0x225d.2 (501.3)
| | | [0]: subframe {} 0x2068-0x225d.2 (501.3)
0x2060| 4e | N | zero_bit: Correct (0x0) 0x2068-0x2068 (0.1)
0x2060| 4e | N | subframe_type: LPC (3) 0x2068.1-0x2068.6 (0.6)
| | | lpc_order: 8 0x2068.7-NA (0)
0x2060| 4e | N | wasted_bits_flag: 0 0x2068.7-0x2068.7 (0.1)
| | | subframe_sample_size: 16 0x2069-NA (0)
| | | warmup_samples: [8] 0x2069-0x2078.7 (16)
0x2060| 00 00 | .. | [0]: value 0 0x2069-0x206a.7 (2)
0x2060| 01 00 | .. | [1]: value 256 0x206b-0x206c.7 (2)
0x2060| 01 ff | .. | [2]: value 511 0x206d-0x206e.7 (2)
0x2060| 02| .| [3]: value 765 0x206f-0x2070.7 (2)
0x2070|fd |. |
0x2070| 03 f8 | .. | [4]: value 1016 0x2071-0x2072.7 (2)
0x2070| 04 ee | .. | [5]: value 1262 0x2073-0x2074.7 (2)
0x2070| 05 e0 | .. | [6]: value 1504 0x2075-0x2076.7 (2)
0x2070| 06 cc | .. | [7]: value 1740 0x2077-0x2078.7 (2)
0x2070| e7 | . | precision: 15 0x2079-0x2079.3 (0.4)
0x2070| e7 b7 | .. | shift: 15 0x2079.4-0x207a (0.5)
| | | coefficients: [8] 0x207a.1-0x2089 (15)
0x2070| b7 52 | .R | [0]: value 14162 0x207a.1-0x207b.7 (1.7)
0x2070| 5c 9c | \. | [1]: value 11854 0x207c-0x207d.6 (1.7)
0x2070| 9c 8d e8| ...| [2]: value 9082 0x207d.7-0x207f.5 (1.7)
0x2070| e8| .| [3]: value 5975 0x207f.6-0x2081.4 (1.7)
0x2080|ba b8 |.. |
0x2080| b8 a5 df | ... | [4]: value 2653 0x2081.5-0x2083.3 (1.7)
0x2080| df a3 fc | ... | [5]: value -737 0x2083.4-0x2085.2 (1.7)
0x2080| fc 03 71 | ..q | [6]: value -4083 0x2085.3-0x2087.1 (1.7)
0x2080| 71 e5 80 | q.. | [7]: value -7221 0x2087.2-0x2089 (1.7)
0x2080| 80 | . | residual_coding_method: rice (4) 0x2089.1-0x2089.2 (0.2)
0x2080| 80 | . | partition_order: 0 0x2089.3-0x2089.6 (0.4)
| | | rice_partitions: 1 0x2089.7-NA (0)
| | | partitions: [1] 0x2089.7-0x225d.2 (467.4)
| | | [0]: partition {} 0x2089.7-0x225d.2 (467.4)
| | | count: 433 0x2089.7-NA (0)
0x2080| 80 ee | .. | rice_parameter: 7 0x2089.7-0x208a.2 (0.4)
0x2080| ee e7 63 a9 cc e0| ..c...| samples: 773b1d4e670369a8cc612e164a64d239... 0x208a.3-0x225d.2 (467)
0x2090|6d 35 19 8c 25 c2 c9 4c 9a 47 20 bd ba 36 b3 2f|m5..%..L.G ..6./|
* |until 0x225d.2 (467) | |
0x2250| 20 | | byte_align: Correct (0x0) 0x225d.3-0x225d.7 (0.5)
0x2250| 7f ab| ..| footer_crc: Correct (7fab) 0x225e-0x225f.7 (2)
| | | md5_calculated: 89887b80f810285b45f6c4ecc72c977e 0x2260-NA (0)
| | | decoded_samples: 441 0x2260-NA (0)

BIN
format/flac/testdata/stereo16.flac vendored Normal file

Binary file not shown.

827
format/flac/testdata/stereo16.fqtest vendored Normal file
View File

@ -0,0 +1,827 @@
/stereo16.flac:
> fq -d flac verbose /stereo16.flac
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /stereo16.flac (flac) 0x0-0xc54b.7 (50508)
0x0000|66 4c 61 43 |fLaC | magic: "fLaC" (Correct) 0x0-0x3.7 (4)
| | | metadatablocks: [4] 0x4-0x206f.7 (8300)
| | | [0]: metadatablock {} (flac_metadatablock) 0x4-0x29.7 (38)
0x0000| 00 | . | last_block: false 0x4-0x4 (0.1)
0x0000| 00 | . | type: Streaminfo (0) 0x4.1-0x4.7 (0.7)
0x0000| 00 00 22 | .." | length: 34 0x5-0x7.7 (3)
0x0000| 10 00 | .. | minimum_block_size: 4096 0x8-0x9.7 (2)
0x0000| 10 00 | .. | maximum_block_size: 4096 0xa-0xb.7 (2)
0x0000| 00 00 0e | ... | minimum_frame_size: 14 0xc-0xe.7 (3)
0x0000| 00| .| maximum_frame_size: 16394 0xf-0x11.7 (3)
0x0010|40 0a |@. |
0x0010| 0a c4 42 | ..B | sample_rate: 44100 0x12-0x14.3 (2.4)
0x0010| 42 | B | channels: 2 0x14.4-0x14.6 (0.3)
0x0010| 42 f0 | B. | bits_per_sample: 16 0x14.7-0x15.3 (0.5)
0x0010| f0 00 00 56 22 | ...V" | total_samples_in_stream: 22050 0x15.4-0x19.7 (4.4)
0x0010| 5a 00 c8 73 b8 0b| Z..s..| md5: 5a00c873b80b8f6294d14fe75b14a7d3 0x1a-0x29.7 (16)
0x0020|8f 62 94 d1 4f e7 5b 14 a7 d3 |.b..O.[... |
| | | [1]: metadatablock {} (flac_metadatablock) 0x2a-0x3f.7 (22)
0x0020| 03 | . | last_block: false 0x2a-0x2a (0.1)
0x0020| 03 | . | type: Seektable (3) 0x2a.1-0x2a.7 (0.7)
0x0020| 00 00 12 | ... | length: 18 0x2b-0x2d.7 (3)
| | | seekpoints: [1] 0x2e-0x3f.7 (18)
| | | [0]: seekpoint {} 0x2e-0x3f.7 (18)
0x0020| 00 00| ..| sample_number: 0 0x2e-0x35.7 (8)
0x0030|00 00 00 00 00 00 |...... |
0x0030| 00 00 00 00 00 00 00 00 | ........ | offset: 0 0x36-0x3d.7 (8)
0x0030| 10 00| ..| number_of_samples: 4096 0x3e-0x3f.7 (2)
| | | [2]: metadatablock {} (flac_metadatablock) 0x40-0x6b.7 (44)
0x0040|04 |. | last_block: false 0x40-0x40 (0.1)
0x0040|04 |. | type: Vorbis comment (4) 0x40.1-0x40.7 (0.7)
0x0040| 00 00 28 | ..( | length: 40 0x41-0x43.7 (3)
| | | comment: {} (vorbis_comment) 0x44-0x6b.7 (40)
0x0040| 20 00 00 00 | ... | vendor_length: 32 0x44-0x47.7 (4)
0x0040| 72 65 66 65 72 65 6e 63| referenc| vendor: "reference libFLAC 1.3.3 20190804" 0x48-0x67.7 (32)
0x0050|65 20 6c 69 62 46 4c 41 43 20 31 2e 33 2e 33 20|e libFLAC 1.3.3 |
0x0060|32 30 31 39 30 38 30 34 |20190804 |
0x0060| 00 00 00 00 | .... | user_comment_list_length: 0 0x68-0x6b.7 (4)
| | | user_comments: [0] 0x6c-NA (0)
| | | [3]: metadatablock {} (flac_metadatablock) 0x6c-0x206f.7 (8196)
0x0060| 81 | . | last_block: true 0x6c-0x6c (0.1)
0x0060| 81 | . | type: Padding (1) 0x6c.1-0x6c.7 (0.7)
0x0060| 00 20 00| . .| length: 8192 0x6d-0x6f.7 (3)
0x0070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| data: 00000000000000000000000000000000... 0x70-0x206f.7 (8192)
* |until 0x206f.7 (8192) | |
| | | frames: [6] 0x2070-0xc54b.7 (42204)
| | | [0]: frame {} (flac_frame) 0x2070-0x207d.7 (14)
| | | header: {} 0x2070-0x2075.7 (6)
0x2070|ff f8 |.. | sync: Correct (0x3ffe) 0x2070-0x2071.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x2071.6-0x2071.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x2071.7-0x2071.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x2072-0x2072.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x2072.4-0x2072.7 (0.4)
0x2070| 18 | . | channel_assignment: left, right (2) 0x2073-0x2073.3 (0.4)
0x2070| 18 | . | sample_size: 16 0x2073.4-0x2073.6 (0.3)
0x2070| 18 | . | reserved1: Correct (0x0) 0x2073.7-0x2073.7 (0.1)
| | | end_of_header: {} 0x2074-0x2074.7 (1)
0x2070| 00 | . | frame_number: 0 0x2074-0x2074.7 (1)
0x2070| c2 | . | crc: Correct (c2) 0x2075-0x2075.7 (1)
| | | subframes: [2] 0x2076-0x207b.7 (6)
| | | [0]: subframe {} 0x2076-0x2078.7 (3)
0x2070| 00 | . | zero_bit: Correct (0x0) 0x2076-0x2076 (0.1)
0x2070| 00 | . | subframe_type: Constant (0) 0x2076.1-0x2076.6 (0.6)
| | | lpc_order: 0 0x2076.7-NA (0)
0x2070| 00 | . | wasted_bits_flag: 0 0x2076.7-0x2076.7 (0.1)
| | | subframe_sample_size: 16 0x2077-NA (0)
0x2070| 00 00 | .. | value: 0 0x2077-0x2078.7 (2)
| | | [1]: subframe {} 0x2079-0x207b.7 (3)
0x2070| 00 | . | zero_bit: Correct (0x0) 0x2079-0x2079 (0.1)
0x2070| 00 | . | subframe_type: Constant (0) 0x2079.1-0x2079.6 (0.6)
| | | lpc_order: 0 0x2079.7-NA (0)
0x2070| 00 | . | wasted_bits_flag: 0 0x2079.7-0x2079.7 (0.1)
| | | subframe_sample_size: 16 0x207a-NA (0)
0x2070| 00 00 | .. | value: 0 0x207a-0x207b.7 (2)
| | | byte_align: Correct (0x0) 0x207c-NA (0)
0x2070| b8 ee | .. | footer_crc: Correct (b8ee) 0x207c-0x207d.7 (2)
| | | [1]: frame {} (flac_frame) 0x207e-0x29f5.7 (2424)
| | | header: {} 0x207e-0x2083.7 (6)
0x2070| ff f8| ..| sync: Correct (0x3ffe) 0x207e-0x207f.5 (1.6)
0x2070| f8| .| reserved0: Correct (0x0) 0x207f.6-0x207f.6 (0.1)
0x2070| f8| .| blocking_strategy: Fixed (0) 0x207f.7-0x207f.7 (0.1)
0x2080|c9 |. | block_size: 4096 0x2080-0x2080.3 (0.4)
0x2080|c9 |. | sample_rate: 44100 0x2080.4-0x2080.7 (0.4)
0x2080| 18 | . | channel_assignment: left, right (2) 0x2081-0x2081.3 (0.4)
0x2080| 18 | . | sample_size: 16 0x2081.4-0x2081.6 (0.3)
0x2080| 18 | . | reserved1: Correct (0x0) 0x2081.7-0x2081.7 (0.1)
| | | end_of_header: {} 0x2082-0x2082.7 (1)
0x2080| 01 | . | frame_number: 1 0x2082-0x2082.7 (1)
0x2080| c5 | . | crc: Correct (c5) 0x2083-0x2083.7 (1)
| | | subframes: [2] 0x2084-0x29f3.4 (2415.5)
| | | [0]: subframe {} 0x2084-0x24eb.4 (1127.5)
0x2080| 14 | . | zero_bit: Correct (0x0) 0x2084-0x2084 (0.1)
0x2080| 14 | . | subframe_type: Fixed (2) 0x2084.1-0x2084.6 (0.6)
| | | lpc_order: 2 0x2084.7-NA (0)
0x2080| 14 | . | wasted_bits_flag: 0 0x2084.7-0x2084.7 (0.1)
| | | subframe_sample_size: 16 0x2085-NA (0)
| | | warmup_samples: [2] 0x2085-0x2088.7 (4)
0x2080| 00 00 | .. | [0]: value 0 0x2085-0x2086.7 (2)
0x2080| 00 00 | .. | [1]: value 0 0x2087-0x2088.7 (2)
0x2080| 04 | . | residual_coding_method: rice (4) 0x2089-0x2089.1 (0.2)
0x2080| 04 | . | partition_order: 1 0x2089.2-0x2089.5 (0.4)
| | | rice_partitions: 2 0x2089.6-NA (0)
| | | partitions: [2] 0x2089.6-0x24eb.4 (1121.7)
| | | [0]: partition {} 0x2089.6-0x22ae.2 (548.5)
| | | count: 2046 0x2089.6-NA (0)
0x2080| 04 3f | .? | rice_parameter: 0 0x2089.6-0x208a.1 (0.4)
0x2080| 3f ff ff ff ff ff| ?.....| samples: ffffffffffffffffffffffffffffffff... 0x208a.2-0x22ae.2 (548.1)
0x2090|ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff|................|
* |until 0x22ae.2 (549) | |
| | | [1]: partition {} 0x22ae.3-0x24eb.4 (573.2)
| | | count: 2048 0x22ae.3-NA (0)
0x22a0| a0 | . | rice_parameter: 0 0x22ae.3-0x22ae.6 (0.4)
0x22a0| a0 4a| .J| samples: 25328592ce59fcb2e5913b2e96ca912d... 0x22ae.7-0x24eb.4 (572.6)
0x22b0|65 0b 25 9c b3 f9 65 cb 22 76 5d 2d 95 22 5a 57|e.%...e."v]-."ZW|
* |until 0x24eb.4 (573) | |
| | | [1]: subframe {} 0x24eb.5-0x29f3.4 (1288)
0x24e0| 1a | . | zero_bit: Correct (0x0) 0x24eb.5-0x24eb.5 (0.1)
0x24e0| 1a 60 | .` | subframe_type: LPC (3) 0x24eb.6-0x24ec.3 (0.6)
| | | lpc_order: 7 0x24ec.4-NA (0)
0x24e0| 60 | ` | wasted_bits_flag: 0 0x24ec.4-0x24ec.4 (0.1)
| | | subframe_sample_size: 16 0x24ec.5-NA (0)
| | | warmup_samples: [7] 0x24ec.5-0x24fa.4 (14)
0x24e0| 60 00 00 | `.. | [0]: value 0 0x24ec.5-0x24ee.4 (2)
0x24e0| 00 00| ..| [1]: value 0 0x24ee.5-0x24f0.4 (2)
0x24f0|00 |. |
0x24f0|00 00 00 |... | [2]: value 0 0x24f0.5-0x24f2.4 (2)
0x24f0| 00 00 00 | ... | [3]: value 0 0x24f2.5-0x24f4.4 (2)
0x24f0| 00 00 00 | ... | [4]: value 0 0x24f4.5-0x24f6.4 (2)
0x24f0| 00 00 00 | ... | [5]: value 0 0x24f6.5-0x24f8.4 (2)
0x24f0| 00 00 05 | ... | [6]: value 0 0x24f8.5-0x24fa.4 (2)
0x24f0| 05 a9 | .. | precision: 12 0x24fa.5-0x24fb (0.4)
0x24f0| a9 | . | shift: 10 0x24fb.1-0x24fb.5 (0.5)
| | | coefficients: [7] 0x24fb.6-0x2506.1 (10.4)
0x24f0| a9 3e ff | .>. | [0]: value 1275 0x24fb.6-0x24fd.1 (1.4)
0x24f0| ff 33 | .3 | [1]: value -52 0x24fd.2-0x24fe.5 (1.4)
0x24f0| 33 d2| 3.| [2]: value -183 0x24fe.6-0x2500.1 (1.4)
0x2500|7c || |
0x2500|7c f7 ||. | [3]: value -195 0x2500.2-0x2501.5 (1.4)
0x2500| f7 df 13 | ... | [4]: value -132 0x2501.6-0x2503.1 (1.4)
0x2500| 13 67 | .g | [5]: value 1241 0x2503.2-0x2504.5 (1.4)
0x2500| 67 0f 45 | g.E | [6]: value -963 0x2504.6-0x2506.1 (1.4)
0x2500| 45 | E | residual_coding_method: rice (4) 0x2506.2-0x2506.3 (0.2)
0x2500| 45 | E | partition_order: 5 0x2506.4-0x2506.7 (0.4)
| | | rice_partitions: 32 0x2507-NA (0)
| | | partitions: [32] 0x2507-0x29f3.4 (1260.5)
| | | [0]: partition {} 0x2507-0x2516.4 (15.5)
| | | count: 121 0x2507-NA (0)
0x2500| 0f | . | rice_parameter: 0 0x2507-0x2507.3 (0.4)
0x2500| 0f ff ff ff ff ff ff ff ff| .........| samples: ffffffffffffffffffffffffffffff80 0x2507.4-0x2516.4 (15.1)
0x2510|ff ff ff ff ff ff f8 |....... |
| | | [1]: partition {} 0x2516.5-0x2527 (16.4)
| | | count: 128 0x2516.5-NA (0)
0x2510| f8 7f | .. | rice_parameter: 0 0x2516.5-0x2517 (0.4)
0x2510| 7f ff ff ff ff ff ff ff ff| .........| samples: ffffffffffffffffffffffffffffffff 0x2517.1-0x2527 (16)
0x2520|ff ff ff ff ff ff ff a4 |........ |
| | | [2]: partition {} 0x2527.1-0x258f.2 (104.2)
| | | count: 128 0x2527.1-NA (0)
0x2520| a4 | . | rice_parameter: 4 0x2527.1-0x2527.4 (0.4)
0x2520| a4 21 08 42 10 84 21 08 42| .!.B..!.B| samples: 84210842108421084210842108421084... 0x2527.5-0x258f.2 (103.6)
0x2530|10 84 21 08 42 10 84 21 08 42 10 84 21 08 42 10|..!.B..!.B..!.B.|
* |until 0x258f.2 (104) | |
| | | [3]: partition {} 0x258f.3-0x25b7.5 (40.3)
| | | count: 128 0x258f.3-NA (0)
0x2580| 40| @| rice_parameter: 0 0x258f.3-0x258f.6 (0.4)
0x2580| 40| @| samples: 433849432499092490e124c33249993b... 0x258f.7-0x25b7.5 (39.7)
0x2590|86 70 92 86 49 32 12 49 21 c2 49 86 64 93 32 76|.p..I2.I!.I.d.2v|
* |until 0x25b7.5 (40) | |
| | | [4]: partition {} 0x25b7.6-0x25de.1 (38.4)
| | | count: 128 0x25b7.6-NA (0)
0x25b0| 24 2c | $, | rice_parameter: 0 0x25b7.6-0x25b8.1 (0.4)
0x25b0| 2c b9 e7 9a 50 ce 12 50| ,...P..P| samples: b2e79e69433849432499092490e124c3... 0x25b8.2-0x25de.1 (38)
0x25c0|c9 26 42 49 24 38 49 30 cc 92 66 4e c3 a4 b4 36|.&BI$8I0..fN...6|
0x25d0|9f 2c b2 68 4c cc 26 49 26 49 26 19 24 92 40 |.,.hL.&I&I&.$.@ |
| | | [5]: partition {} 0x25de.2-0x2603.7 (37.6)
| | | count: 128 0x25de.2-NA (0)
0x25d0| 40 | @ | rice_parameter: 0 0x25de.2-0x25de.5 (0.4)
0x25d0| 40 90| @.| samples: 2429c999329365cf3cd2867092864932... 0x25de.6-0x2603.7 (37.2)
0x25e0|a7 26 64 ca 4d 97 3c f3 4a 19 c2 4a 19 24 c8 49|.&d.M.<.J..J.$.I|
* |until 0x2603.7 (38) | |
| | | [6]: partition {} 0x2604-0x262a.3 (38.4)
| | | count: 128 0x2604-NA (0)
0x2600| 02 | . | rice_parameter: 0 0x2604-0x2604.3 (0.4)
0x2600| 02 4c 92 4c 32 49 24 92 14 e4 cc 99| .L.L2I$.....| samples: 24c924c3249249214e4cc9949b2e79e6... 0x2604.4-0x262a.3 (38)
0x2610|49 b2 e7 9e 69 43 38 49 43 24 99 09 24 90 e1 24|I...iC8IC$..$..$|
0x2620|c3 32 49 99 3b 0e 92 d0 da 7c b0 |.2I.;....|. |
| | | [7]: partition {} 0x262a.4-0x2652.1 (39.6)
| | | count: 128 0x262a.4-NA (0)
0x2620| b0 | . | rice_parameter: 0 0x262a.4-0x262a.7 (0.4)
0x2620| 2c 9a 13 33 09| ,..3.| samples: 2c9a1333099249924986492492429c99... 0x262b-0x2652.1 (39.2)
0x2630|92 49 92 49 86 49 24 92 42 9c 99 93 29 36 5c f3|.I.I.I$.B...)6\.|
* |until 0x2652.1 (40) | |
| | | [8]: partition {} 0x2652.2-0x2679.4 (39.3)
| | | count: 128 0x2652.2-NA (0)
0x2650| c1 | . | rice_parameter: 0 0x2652.2-0x2652.5 (0.4)
0x2650| c1 25 a1 b4 f9 65 93 42 66 61 32 49 32 49| .%...e.Bfa2I2I| samples: 49686d3e5964d099984c924c924c3249... 0x2652.6-0x2679.4 (38.7)
0x2660|30 c9 24 92 48 53 93 32 65 26 cb 9e 79 a5 0c e1|0.$.HS.2e&..y...|
0x2670|25 0c 92 64 24 92 43 84 93 08 |%..d$.C... |
| | | [9]: partition {} 0x2679.5-0x269e.6 (37.2)
| | | count: 128 0x2679.5-NA (0)
0x2670| 08 4c | .L | rice_parameter: 0 0x2679.5-0x267a (0.4)
0x2670| 4c 92 66 4e c3 a4| L.fN..| samples: 9924cc9d8749686d3e5964d099984c92... 0x267a.1-0x269e.6 (36.6)
0x2680|b4 36 9f 2c b2 68 4c cc 26 49 26 49 26 19 24 92|.6.,.hL.&I&I&.$.|
0x2690|49 0a 72 66 4c a4 d9 73 cf 34 a1 9c 24 a1 92 |I.rfL..s.4..$.. |
| | | [10]: partition {} 0x269e.7-0x26c5.1 (38.3)
| | | count: 128 0x269e.7-NA (0)
0x2690| 92 04| ..| rice_parameter: 0 0x269e.7-0x269f.2 (0.4)
0x2690| 04| .| samples: 26424924384930cc92664ec3a4b4369f... 0x269f.3-0x26c5.1 (37.7)
0x26a0|c8 49 24 87 09 26 19 92 4c c9 d8 74 96 86 d3 e5|.I$..&..L..t....|
* |until 0x26c5.1 (38) | |
| | | [11]: partition {} 0x26c5.2-0x26ed.2 (40.1)
| | | count: 128 0x26c5.2-NA (0)
0x26c0| c2 | . | rice_parameter: 0 0x26c5.2-0x26c5.5 (0.4)
0x26c0| c2 69 43 38 49 43 24 99 09 24 90| .iC8IC$..$.| samples: 9a50ce1250c926424924384930cc9266... 0x26c5.6-0x26ed.2 (39.5)
0x26d0|e1 24 c3 32 49 99 3b 0e 92 d0 da 7c b2 c9 a1 33|.$.2I.;....|...3|
0x26e0|30 99 24 99 24 98 64 92 49 24 29 c9 99 21 |0.$.$.d.I$)..! |
| | | [12]: partition {} 0x26ed.3-0x2713.3 (38.1)
| | | count: 128 0x26ed.3-NA (0)
0x26e0| 21 | ! | rice_parameter: 0 0x26ed.3-0x26ed.6 (0.4)
0x26e0| 21 29 36| !)6| samples: 949b2e79e69433849432499092490e12... 0x26ed.7-0x2713.3 (37.5)
0x26f0|5c f3 cd 28 67 09 28 64 93 21 24 92 1c 24 98 66|\..(g.(d.!$..$.f|
* |until 0x2713.3 (38) | |
| | | [13]: partition {} 0x2713.4-0x2739.1 (37.6)
| | | count: 128 0x2713.4-NA (0)
0x2710| 90 | . | rice_parameter: 0 0x2713.4-0x2713.7 (0.4)
0x2710| 24 92 48 53 93 32 65 26 cb 9e 79 a5| $.HS.2e&..y.| samples: 2492485393326526cb9e79a50ce1250c... 0x2714-0x2739.1 (37.2)
0x2720|0c e1 25 0c 92 64 24 92 43 84 93 0c c9 26 64 ec|..%..d$.C....&d.|
0x2730|3a 4b 43 69 f2 cb 26 84 cc c0 |:KCi..&... |
| | | [14]: partition {} 0x2739.2-0x2760.4 (39.3)
| | | count: 128 0x2739.2-NA (0)
0x2730| c0 | . | rice_parameter: 0 0x2739.2-0x2739.5 (0.4)
0x2730| c0 26 49 26 49 26 19| .&I&I&.| samples: 099249924986492492429c999329365c... 0x2739.6-0x2760.4 (38.7)
0x2740|24 92 49 0a 72 66 4c a4 d9 73 cf 34 a1 9c 24 a1|$.I.rfL..s.4..$.|
* |until 0x2760.4 (39) | |
| | | [15]: partition {} 0x2760.5-0x2788 (39.4)
| | | count: 128 0x2760.5-NA (0)
0x2760|38 65 |8e | rice_parameter: 0 0x2760.5-0x2761 (0.4)
0x2760| 65 96 4d 09 99 84 c9 24 c9 24 c3 24 92 49 21| e.M....$.$.$.I!| samples: cb2c9a1333099249924986492492429c... 0x2761.1-0x2788 (39)
0x2770|4e 4c c9 94 9b 2e 79 e6 94 33 84 94 32 49 90 92|NL....y..3..2I..|
0x2780|49 0e 12 4c 33 24 99 93 83 |I..L3$... |
| | | [16]: partition {} 0x2788.1-0x27ae.6 (38.6)
| | | count: 128 0x2788.1-NA (0)
0x2780| 83 | . | rice_parameter: 0 0x2788.1-0x2788.4 (0.4)
0x2780| 83 0e 92 d0 da 7c b2 c9| .....|..| samples: 61d25a1b4f965934266613249324930c... 0x2788.5-0x27ae.6 (38.2)
0x2790|a1 33 30 99 24 99 24 98 64 92 49 24 29 c9 99 32|.30.$.$.d.I$)..2|
0x27a0|93 65 cf 3c d2 86 70 92 86 49 32 12 49 21 c2 |.e.<..p..I2.I!. |
| | | [17]: partition {} 0x27ae.7-0x27d4.1 (37.3)
| | | count: 128 0x27ae.7-NA (0)
0x27a0| c2 04| ..| rice_parameter: 0 0x27ae.7-0x27af.2 (0.4)
0x27a0| 04| .| samples: 24c33249993b0e92d0da7cb2c9a13330... 0x27af.3-0x27d4.1 (36.7)
0x27b0|98 66 49 33 27 61 d2 5a 1b 4f 96 59 34 26 66 13|.fI3'a.Z.O.Y4&f.|
* |until 0x27d4.1 (37) | |
| | | [18]: partition {} 0x27d4.2-0x27fb.3 (39.2)
| | | count: 128 0x27d4.2-NA (0)
0x27d0| 41 | A | rice_parameter: 0 0x27d4.2-0x27d4.5 (0.4)
0x27d0| 41 0c 92 64 24 92 43 84 93 0c c9 26| A..d$.C....&| samples: 432499092490e124c33249993b0e92d0... 0x27d4.6-0x27fb.3 (38.6)
0x27e0|64 ec 3a 4b 43 69 f2 cb 26 84 cc c2 64 92 64 92|d.:KCi..&...d.d.|
0x27f0|61 92 49 24 90 a7 26 64 ca 4d 97 30 |a.I$..&d.M.0 |
| | | [19]: partition {} 0x27fb.4-0x2823 (39.5)
| | | count: 128 0x27fb.4-NA (0)
0x27f0| 30 | 0 | rice_parameter: 0 0x27fb.4-0x27fb.7 (0.4)
0x27f0| cf 34 a1 9c| .4..| samples: cf34a19c24a1924c8492487092619924... 0x27fc-0x2823 (39.1)
0x2800|24 a1 92 4c 84 92 48 70 92 61 99 24 cc 9d 87 49|$..L..Hp.a.$...I|
* |until 0x2823 (40) | |
| | | [20]: partition {} 0x2823.1-0x2848.7 (37.7)
| | | count: 128 0x2823.1-NA (0)
0x2820| 84 | . | rice_parameter: 0 0x2823.1-0x2823.4 (0.4)
0x2820| 84 c9 94 9b 2e 79 e6 94 33 84 94 32 49| .....y..3..2I| samples: 99329365cf3cd2867092864932124921... 0x2823.5-0x2848.7 (37.3)
0x2830|90 92 49 0e 12 4c 33 24 99 93 b0 e9 2d 0d a7 cb|..I..L3$....-...|
0x2840|2c 9a 13 33 09 92 49 92 49 |,..3..I.I |
| | | [21]: partition {} 0x2849-0x286f.1 (38.2)
| | | count: 128 0x2849-NA (0)
0x2840| 08 | . | rice_parameter: 0 0x2849-0x2849.3 (0.4)
0x2840| 08 64 92 49 24 29 c9| .d.I$).| samples: 86492492429c999329365cf3cd286709... 0x2849.4-0x286f.1 (37.6)
0x2850|99 32 93 65 cf 3c d2 86 70 92 86 49 32 12 49 21|.2.e.<..p..I2.I!|
0x2860|c2 49 86 64 93 32 76 1d 25 a1 b4 f9 65 93 42 42|.I.d.2v.%...e.BB|
| | | [22]: partition {} 0x286f.2-0x2896.5 (39.4)
| | | count: 128 0x286f.2-NA (0)
0x2860| 42| B| rice_parameter: 0 0x286f.2-0x286f.5 (0.4)
0x2860| 42| B| samples: 9984c924c924c3249249214e4cc9949b... 0x286f.6-0x2896.5 (39)
0x2870|66 13 24 93 24 93 0c 92 49 24 85 39 33 26 52 6c|f.$.$...I$.93&Rl|
* |until 0x2896.5 (39) | |
| | | [23]: partition {} 0x2896.6-0x28be (39.3)
| | | count: 128 0x2896.6-NA (0)
0x2890| 34 29 | 4) | rice_parameter: 0 0x2896.6-0x2897.1 (0.4)
0x2890| 29 f2 cb 26 84 cc c2 64 92| )..&...d.| samples: a7cb2c9a133309924992498649249242... 0x2897.2-0x28be (38.7)
0x28a0|64 92 61 92 49 24 90 a7 26 64 ca 4d 97 3c f3 4a|d.a.I$..&d.M.<.J|
0x28b0|19 c2 4a 19 24 c8 49 24 87 09 26 19 92 4c 84 |..J.$.I$..&..L. |
| | | [24]: partition {} 0x28be.1-0x28e4 (38)
| | | count: 128 0x28be.1-NA (0)
0x28b0| 84 | . | rice_parameter: 0 0x28be.1-0x28be.4 (0.4)
0x28b0| 84 9d| ..| samples: 93b0e92d0da7cb2c9a13330992499249... 0x28be.5-0x28e4 (37.4)
0x28c0|87 49 68 6d 3e 59 64 d0 99 98 4c 92 4c 92 4c 32|.Ihm>Yd...L.L.L2|
* |until 0x28e4 (38) | |
| | | [25]: partition {} 0x28e4.1-0x2909.5 (37.5)
| | | count: 128 0x28e4.1-NA (0)
0x28e0| 81 | . | rice_parameter: 0 0x28e4.1-0x28e4.4 (0.4)
0x28e0| 81 0e 12 4c 33 24 99 93 b0 e9 2d 0d| ...L3$....-.| samples: 21c24986649332761d25a1b4f9659342... 0x28e4.5-0x2909.5 (37.1)
0x28f0|a7 cb 2c 9a 13 33 09 92 49 92 49 86 49 24 92 42|..,..3..I.I.I$.B|
0x2900|9c 99 93 29 36 5c f3 cd 28 64 |...)6\..(d |
| | | [26]: partition {} 0x2909.6-0x2931.4 (39.7)
| | | count: 128 0x2909.6-NA (0)
0x2900| 64 30 | d0 | rice_parameter: 0 0x2909.6-0x290a.1 (0.4)
0x2900| 30 92 86 49 32 12| 0..I2.| samples: c24a1924c8492487092619924cc9d874... 0x290a.2-0x2931.4 (39.3)
0x2910|49 21 c2 49 86 64 93 32 76 1d 25 a1 b4 f9 65 93|I!.I.d.2v.%...e.|
* |until 0x2931.4 (40) | |
| | | [27]: partition {} 0x2931.5-0x2958.6 (39.2)
| | | count: 128 0x2931.5-NA (0)
0x2930| c8 39 | .9 | rice_parameter: 0 0x2931.5-0x2932 (0.4)
0x2930| 39 e7 9a 50 ce 12 50 c9 26 42 49 24 38 49| 9..P..P.&BI$8I| samples: 73cf34a19c24a1924c84924870926199... 0x2932.1-0x2958.6 (38.6)
0x2940|30 cc 92 66 4e c3 a4 b4 36 9f 2c b2 68 4c cc 26|0..fN...6.,.hL.&|
0x2950|49 26 49 26 19 24 92 49 0a |I&I&.$.I. |
| | | [28]: partition {} 0x2958.7-0x297e.1 (37.3)
| | | count: 128 0x2958.7-NA (0)
0x2950| 0a 07 | .. | rice_parameter: 0 0x2958.7-0x2959.2 (0.4)
0x2950| 07 26 64 ca 4d 97 3c| .&d.M.<| samples: 393326526cb9e79a50ce1250c9264249... 0x2959.3-0x297e.1 (36.7)
0x2960|f3 4a 19 c2 4a 19 24 c8 49 24 87 09 26 19 92 4c|.J..J.$.I$..&..L|
0x2970|c9 d8 74 96 86 d3 e5 96 4d 09 99 84 c9 24 c0 |..t.....M....$. |
| | | [29]: partition {} 0x297e.2-0x29a4.4 (38.3)
| | | count: 128 0x297e.2-NA (0)
0x2970| c0 | . | rice_parameter: 0 0x297e.2-0x297e.5 (0.4)
0x2970| c0 92| ..| samples: 24930c92492485393326526cb9e79a50... 0x297e.6-0x29a4.4 (37.7)
0x2980|4c 32 49 24 92 14 e4 cc 99 49 b2 e7 9e 69 43 38|L2I$.....I...iC8|
* |until 0x29a4.4 (38) | |
| | | [30]: partition {} 0x29a4.5-0x29cc.3 (39.7)
| | | count: 128 0x29a4.5-NA (0)
0x29a0| c8 1a | .. | rice_parameter: 0 0x29a4.5-0x29a5 (0.4)
0x29a0| 1a 13 33 09 92 49 92 49 86 49 24| ..3..I.I.I$| samples: 34266613249324930c92492485393326... 0x29a5.1-0x29cc.3 (39.3)
0x29b0|92 42 9c 99 93 29 36 5c f3 cd 28 67 09 28 64 93|.B...)6\..(g.(d.|
0x29c0|21 24 92 1c 24 98 66 49 33 27 61 d2 50 |!$..$.fI3'a.P |
| | | [31]: partition {} 0x29cc.4-0x29f3.4 (39.1)
| | | count: 128 0x29cc.4-NA (0)
0x29c0| 50 | P | rice_parameter: 0 0x29cc.4-0x29cc.7 (0.4)
0x29c0| a1 b4 f9| ...| samples: a1b4f965934266613249324930c92492... 0x29cd-0x29f3.4 (38.5)
0x29d0|65 93 42 66 61 32 49 32 49 30 c9 24 92 48 53 93|e.Bfa2I2I0.$.HS.|
* |until 0x29f3.4 (39) | |
0x29f0| c8 | . | byte_align: Correct (0x0) 0x29f3.5-0x29f3.7 (0.3)
0x29f0| 28 a1 | (. | footer_crc: Correct (28a1) 0x29f4-0x29f5.7 (2)
| | | [2]: frame {} (flac_frame) 0x29f6-0x69ff.7 (16394)
| | | header: {} 0x29f6-0x29fb.7 (6)
0x29f0| ff f8 | .. | sync: Correct (0x3ffe) 0x29f6-0x29f7.5 (1.6)
0x29f0| f8 | . | reserved0: Correct (0x0) 0x29f7.6-0x29f7.6 (0.1)
0x29f0| f8 | . | blocking_strategy: Fixed (0) 0x29f7.7-0x29f7.7 (0.1)
0x29f0| c9 | . | block_size: 4096 0x29f8-0x29f8.3 (0.4)
0x29f0| c9 | . | sample_rate: 44100 0x29f8.4-0x29f8.7 (0.4)
0x29f0| 18 | . | channel_assignment: left, right (2) 0x29f9-0x29f9.3 (0.4)
0x29f0| 18 | . | sample_size: 16 0x29f9.4-0x29f9.6 (0.3)
0x29f0| 18 | . | reserved1: Correct (0x0) 0x29f9.7-0x29f9.7 (0.1)
| | | end_of_header: {} 0x29fa-0x29fa.7 (1)
0x29f0| 02 | . | frame_number: 2 0x29fa-0x29fa.7 (1)
0x29f0| cc | . | crc: Correct (cc) 0x29fb-0x29fb.7 (1)
| | | subframes: [2] 0x29fc-0x69fd.7 (16386)
| | | [0]: subframe {} 0x29fc-0x49fc.7 (8193)
0x29f0| 02 | . | zero_bit: Correct (0x0) 0x29fc-0x29fc (0.1)
0x29f0| 02 | . | subframe_type: Verbatim (1) 0x29fc.1-0x29fc.6 (0.6)
| | | lpc_order: 0 0x29fc.7-NA (0)
0x29f0| 02 | . | wasted_bits_flag: 0 0x29fc.7-0x29fc.7 (0.1)
| | | subframe_sample_size: 16 0x29fd-NA (0)
0x29f0| f8 a7 f8| ...| samples: f8a7f874f841f80df7dbf7a9f777f746... 0x29fd-0x49fc.7 (8192)
0x2a00|74 f8 41 f8 0d f7 db f7 a9 f7 77 f7 46 f7 16 f6|t.A.......w.F...|
* |until 0x49fc.7 (8192) | |
| | | [1]: subframe {} 0x49fd-0x69fd.7 (8193)
0x49f0| 02 | . | zero_bit: Correct (0x0) 0x49fd-0x49fd (0.1)
0x49f0| 02 | . | subframe_type: Verbatim (1) 0x49fd.1-0x49fd.6 (0.6)
| | | lpc_order: 0 0x49fd.7-NA (0)
0x49f0| 02 | . | wasted_bits_flag: 0 0x49fd.7-0x49fd.7 (0.1)
| | | subframe_sample_size: 16 0x49fe-NA (0)
0x49f0| 04 63| .c| samples: 0463030f01b50058fefafd9efc46faf6... 0x49fe-0x69fd.7 (8192)
0x4a00|03 0f 01 b5 00 58 fe fa fd 9e fc 46 fa f6 f9 af|.....X.....F....|
* |until 0x69fd.7 (8192) | |
| | | byte_align: Correct (0x0) 0x69fe-NA (0)
0x69f0| 5d 30| ]0| footer_crc: Correct (5d30) 0x69fe-0x69ff.7 (2)
| | | [3]: frame {} (flac_frame) 0x6a00-0x9416.7 (10775)
| | | header: {} 0x6a00-0x6a05.7 (6)
0x6a00|ff f8 |.. | sync: Correct (0x3ffe) 0x6a00-0x6a01.5 (1.6)
0x6a00| f8 | . | reserved0: Correct (0x0) 0x6a01.6-0x6a01.6 (0.1)
0x6a00| f8 | . | blocking_strategy: Fixed (0) 0x6a01.7-0x6a01.7 (0.1)
0x6a00| c9 | . | block_size: 4096 0x6a02-0x6a02.3 (0.4)
0x6a00| c9 | . | sample_rate: 44100 0x6a02.4-0x6a02.7 (0.4)
0x6a00| 18 | . | channel_assignment: left, right (2) 0x6a03-0x6a03.3 (0.4)
0x6a00| 18 | . | sample_size: 16 0x6a03.4-0x6a03.6 (0.3)
0x6a00| 18 | . | reserved1: Correct (0x0) 0x6a03.7-0x6a03.7 (0.1)
| | | end_of_header: {} 0x6a04-0x6a04.7 (1)
0x6a00| 03 | . | frame_number: 3 0x6a04-0x6a04.7 (1)
0x6a00| cb | . | crc: Correct (cb) 0x6a05-0x6a05.7 (1)
| | | subframes: [2] 0x6a06-0x9414.5 (10766.6)
| | | [0]: subframe {} 0x6a06-0x81dd.6 (6103.7)
0x6a00| 12 | . | zero_bit: Correct (0x0) 0x6a06-0x6a06 (0.1)
0x6a00| 12 | . | subframe_type: Fixed (2) 0x6a06.1-0x6a06.6 (0.6)
| | | lpc_order: 1 0x6a06.7-NA (0)
0x6a00| 12 | . | wasted_bits_flag: 0 0x6a06.7-0x6a06.7 (0.1)
| | | subframe_sample_size: 16 0x6a07-NA (0)
| | | warmup_samples: [1] 0x6a07-0x6a08.7 (2)
0x6a00| 14 b1 | .. | [0]: value 5297 0x6a07-0x6a08.7 (2)
0x6a00| 0b | . | residual_coding_method: rice (4) 0x6a09-0x6a09.1 (0.2)
0x6a00| 0b | . | partition_order: 2 0x6a09.2-0x6a09.5 (0.4)
| | | rice_partitions: 4 0x6a09.6-NA (0)
| | | partitions: [4] 0x6a09.6-0x81dd.6 (6100.1)
| | | [0]: partition {} 0x6a09.6-0x7282.2 (2168.5)
| | | count: 1023 0x6a09.6-NA (0)
0x6a00| 0b 8c | .. | rice_parameter: 14 0x6a09.6-0x6a0a.1 (0.4)
0x6a00| 8c d6 94 25 03 2f| ...%./| samples: 335a50940cbeea68aa2a60673a041e10... 0x6a0a.2-0x7282.2 (2168.1)
0x6a10|ba 9a 2a 8a 98 19 ce 81 07 84 14 3d 82 ed dc 8b|..*........=....|
* |until 0x7282.2 (2169) | |
| | | [1]: partition {} 0x7282.3-0x77a0.6 (1310.4)
| | | count: 1024 0x7282.3-NA (0)
0x7280| 50 | P | rice_parameter: 8 0x7282.3-0x7282.6 (0.4)
0x7280| 50 47 9f 87 31 9c 5a 93 64 03 91 8e a9 45| PG..1.Z.d....E| samples: 23cfc398ce2d49b201c8c754a2d25afe... 0x7282.7-0x77a0.6 (1310)
0x7290|a4 b5 fc df 55 0b 50 d7 76 9d d7 7f c9 39 49 2d|....U.P.v....9I-|
* |until 0x77a0.6 (1310) | |
| | | [2]: partition {} 0x77a0.7-0x7cbf.2 (1310.4)
| | | count: 1024 0x77a0.7-NA (0)
0x77a0|65 06 |e. | rice_parameter: 8 0x77a0.7-0x77a1.2 (0.4)
0x77a0| 06 98 ca 17 c2 c4 50 88 f3 f0 e6 33 8b 52 6c| ......P....3.Rl| samples: 34c650be162284479f87319c5a936403... 0x77a1.3-0x7cbf.2 (1310)
0x77b0|80 72 31 d5 28 b4 96 bf 9b ea a1 6a 1a ee d3 ba|.r1.(......j....|
* |until 0x7cbf.2 (1310) | |
| | | [3]: partition {} 0x7cbf.3-0x81dd.6 (1310.4)
| | | count: 1024 0x7cbf.3-NA (0)
0x7cb0| d0| .| rice_parameter: 8 0x7cbf.3-0x7cbf.6 (0.4)
0x7cb0| d0| .| samples: 3646e8dd1ba364698ca17c2c45088f3f... 0x7cbf.7-0x81dd.6 (1310)
0x7cc0|6c 8d d1 ba 37 46 c8 d3 19 42 f8 58 8a 11 1e 7e|l...7F...B.X...~|
* |until 0x81dd.6 (1310) | |
| | | [1]: subframe {} 0x81dd.7-0x9414.5 (4662.7)
0x81d0| 40 | @ | zero_bit: Correct (0x0) 0x81dd.7-0x81dd.7 (0.1)
0x81d0| 25 | % | subframe_type: Fixed (2) 0x81de-0x81de.5 (0.6)
| | | lpc_order: 1 0x81de.6-NA (0)
0x81d0| 25 | % | wasted_bits_flag: 0 0x81de.6-0x81de.6 (0.1)
| | | subframe_sample_size: 16 0x81de.7-NA (0)
| | | warmup_samples: [1] 0x81de.7-0x81e0.6 (2)
0x81d0| 25 77| %w| [0]: value -17487 0x81de.7-0x81e0.6 (2)
0x81e0|62 |b |
0x81e0|62 2f |b/ | residual_coding_method: rice (4) 0x81e0.7-0x81e1 (0.2)
0x81e0| 2f | / | partition_order: 5 0x81e1.1-0x81e1.4 (0.4)
| | | rice_partitions: 32 0x81e1.5-NA (0)
| | | partitions: [32] 0x81e1.5-0x9414.5 (4659.1)
| | | [0]: partition {} 0x81e1.5-0x82f3 (273.4)
| | | count: 127 0x81e1.5-NA (0)
0x81e0| 2f 38 | /8 | rice_parameter: 14 0x81e1.5-0x81e2 (0.4)
0x81e0| 38 d7 82 55 10 ca b3 be 44 26 02 07 71 30| 8..U....D&..q0| samples: 71af04aa2195677c884c040ee2612178... 0x81e2.1-0x82f3 (273)
0x81f0|90 bc 41 ad 0a cc 80 f2 1b 75 f8 18 b0 07 83 33|..A......u.....3|
* |until 0x82f3 (273) | |
| | | [1]: partition {} 0x82f3.1-0x8405.2 (274.2)
| | | count: 128 0x82f3.1-NA (0)
0x82f0| f1 | . | rice_parameter: 14 0x82f3.1-0x82f3.4 (0.4)
0x82f0| f1 33 72 6f 69 a8 2f 93 60 26 4d 2c ef| .3roi./.`&M,.| samples: 266e4ded3505f26c04c9a59dfabba5ba... 0x82f3.5-0x8405.2 (273.6)
0x8300|d5 dd 2d d6 87 bb 8e 5b 03 9e 5b b1 7f 52 17 d7|..-....[..[..R..|
* |until 0x8405.2 (274) | |
| | | [2]: partition {} 0x8405.3-0x851e.5 (281.3)
| | | count: 128 0x8405.3-NA (0)
0x8400| fc | . | rice_parameter: 14 0x8405.3-0x8405.6 (0.4)
0x8400| fc bb 10 42 02 5e 8d 3c e5 a9 8c| ...B.^.<...| samples: 5d8821012f469e72d4c60317f8124180... 0x8405.7-0x851e.5 (280.7)
0x8410|06 2f f0 24 83 01 1a 34 9c d8 1d eb 1b 6b d8 92|./.$...4.....k..|
* |until 0x851e.5 (281) | |
| | | [3]: partition {} 0x851e.6-0x8630.3 (273.6)
| | | count: 128 0x851e.6-NA (0)
0x8510| a3 83| ..| rice_parameter: 14 0x851e.6-0x851f.1 (0.4)
0x8510| 83| .| samples: 0e0567900a49e174149df5727437f301... 0x851f.2-0x8630.3 (273.2)
0x8520|81 59 e4 02 92 78 5d 05 27 7d 5c 9d 0d fc c0 70|.Y...x].'}\....p|
* |until 0x8630.3 (274) | |
| | | [4]: partition {} 0x8630.4-0x8746.2 (277.7)
| | | count: 128 0x8630.4-NA (0)
0x8630|ce |. | rice_parameter: 14 0x8630.4-0x8630.7 (0.4)
0x8630| 1c 62 d8 82 dc ec 96 8a 60 9b e0 37 69 66 1d| .b......`..7if.| samples: 1c62d882dcec968a609be03769661d99... 0x8631-0x8746.2 (277.3)
0x8640|99 91 49 4f 6f e6 ad 20 7c f1 07 49 85 50 10 81|..IOo.. |..I.P..|
* |until 0x8746.2 (278) | |
| | | [5]: partition {} 0x8746.3-0x8856.1 (271.7)
| | | count: 128 0x8746.3-NA (0)
0x8740| 5c | \ | rice_parameter: 14 0x8746.3-0x8746.6 (0.4)
0x8740| 5c 81 95 39 f5 57 b4 ca 73 12| \..9.W..s.| samples: 40ca9cfaabda653989629e45dd8f13b4... 0x8746.7-0x8856.1 (271.3)
0x8750|c5 3c 8b bb 1e 27 69 71 40 4a 00 0e cd af a9 30|.<...'iq@J.....0|
* |until 0x8856.1 (272) | |
| | | [6]: partition {} 0x8856.2-0x8968 (273.7)
| | | count: 128 0x8856.2-NA (0)
0x8850| 38 | 8 | rice_parameter: 14 0x8856.2-0x8856.5 (0.4)
0x8850| 38 3b e6 9e 13 9f 50 ac de 03| 8;....P...| samples: 0ef9a784e7d42b3780defead308a8c9f... 0x8856.6-0x8968 (273.3)
0x8860|7b fa b4 c2 2a 32 7e 9e 86 a3 21 ea 18 a3 79 61|{...*2~...!...ya|
* |until 0x8968 (274) | |
| | | [7]: partition {} 0x8968.1-0x8a5f.7 (247.7)
| | | count: 128 0x8968.1-NA (0)
0x8960| 68 | h | rice_parameter: 13 0x8968.1-0x8968.4 (0.4)
0x8960| 68 05 ed 24 27 d9 ad 81| h..$'...| samples: 00bda484fb35b02bc80040ae00b181ae... 0x8968.5-0x8a5f.7 (247.3)
0x8970|5e 40 02 05 70 05 8c 0d 72 80 01 53 18 00 b4 98|^@..p...r..S....|
* |until 0x8a5f.7 (248) | |
| | | [8]: partition {} 0x8a60-0x8ac5.7 (102)
| | | count: 128 0x8a60-NA (0)
0x8a60|41 |A | rice_parameter: 4 0x8a60-0x8a60.3 (0.4)
0x8a60|41 01 01 01 01 21 03 c7 84 0f 1e 10 3c 70 f1 c3|A....!......<p..| samples: 1010101012103c7840f1e103c70f1c3c... 0x8a60.4-0x8ac5.7 (101.4)
0x8a70|c7 8e 1c 34 70 d1 c3 86 8d 18 34 68 d1 83 06 0c|...4p.....4h....|
* |until 0x8ac5.7 (102) | |
| | | [9]: partition {} 0x8ac6-0x8b23.7 (94)
| | | count: 128 0x8ac6-NA (0)
0x8ac0| 4b | K | rice_parameter: 4 0x8ac6-0x8ac6.3 (0.4)
0x8ac0| 4b 52 92 a4 a5 28 4a 10 84 61| KR...(J..a| samples: b5292a4a5284a10846118c6719ceb3ad... 0x8ac6.4-0x8b23.7 (93.4)
0x8ad0|18 c6 71 9c eb 3a d6 b5 bd 6f 7c df 39 ce f3 bd|..q..:...o|.9...|
* |until 0x8b23.7 (94) | |
| | | [10]: partition {} 0x8b24-0x8b94.3 (112.4)
| | | count: 128 0x8b24-NA (0)
0x8b20| 55 | U | rice_parameter: 5 0x8b24-0x8b24.3 (0.4)
0x8b20| 55 6a 55 ab 56 b5 5a b5 ab 56 ad 5a| UjU.V.Z..V.Z| samples: 56a55ab56b55ab5ab56ad5abd6ad5ebd... 0x8b24.4-0x8b94.3 (112)
0x8b30|bd 6a d5 eb d7 af 5e bd 8a f5 ec d8 af 62 c5 9b|.j....^......b..|
* |until 0x8b94.3 (112) | |
| | | [11]: partition {} 0x8b94.4-0x8c02.7 (110.4)
| | | count: 128 0x8b94.4-NA (0)
0x8b90| 75 | u | rice_parameter: 5 0x8b94.4-0x8b94.7 (0.4)
0x8b90| 72 dd db 77 2d db b9 72 dd bb 76| r..w-..r..v| samples: 72dddb772ddbb972ddbb76ee5ab96edd... 0x8b95-0x8c02.7 (110)
0x8ba0|ee 5a b9 6e dd bb 56 ed 5b b7 6a dd ab 56 ed 59|.Z.n..V.[.j..V.Y|
* |until 0x8c02.7 (110) | |
| | | [12]: partition {} 0x8c03-0x8c56 (83.1)
| | | count: 128 0x8c03-NA (0)
0x8c00| 31 | 1 | rice_parameter: 3 0x8c03-0x8c03.3 (0.4)
0x8c00| 31 62 44 89 12 24 f1 27 9a 79 e6 9a 69| 1bD..$.'.y..i| samples: 16244891224f1279a79e69a69a59a596... 0x8c03.4-0x8c56 (82.5)
0x8c10|a5 9a 59 65 92 59 24 92 f2 5e f7 b5 ed 6b 56 d5|..Ye.Y$..^...kV.|
* |until 0x8c56 (83) | |
| | | [13]: partition {} 0x8c56.1-0x8cc4 (110)
| | | count: 128 0x8c56.1-NA (0)
0x8c50| 2f | / | rice_parameter: 5 0x8c56.1-0x8c56.4 (0.4)
0x8c50| 2f 1c 75 d7 5c 79 d7 9e 75 f7| /.u.\y..u.| samples: e38ebaeb8f3af3cebef3cfbefbe41f20... 0x8c56.5-0x8cc4 (109.4)
0x8c60|9e 7d f7 df 20 f9 07 c8 90 20 44 89 12 24 49 11|.}.. .... D..$I.|
* |until 0x8cc4 (110) | |
| | | [14]: partition {} 0x8cc4.1-0x8d34.4 (112.4)
| | | count: 128 0x8cc4.1-NA (0)
0x8cc0| 2b | + | rice_parameter: 5 0x8cc4.1-0x8cc4.4 (0.4)
0x8cc0| 2b a7 4e 1d 38 74 e9 c3 a7 4e 1d 3a| +.N.8t...N.:| samples: 74e9c3a70e9d3874e9c3a74e9d3a74e9... 0x8cc4.5-0x8d34.4 (112)
0x8cd0|74 e9 d3 a7 4e 9d 3a 74 e9 d3 a7 4f 1d 3a 74 e9|t...N.:t...O.:t.|
* |until 0x8d34.4 (112) | |
| | | [15]: partition {} 0x8d34.5-0x8d96 (97.4)
| | | count: 128 0x8d34.5-NA (0)
0x8d30| 62 1e | b. | rice_parameter: 4 0x8d34.5-0x8d35 (0.4)
0x8d30| 1e 38 78 f1 c3 86 8e 1a 38 70 d1| .8x.....8p.| samples: 3c70f1e3870d1c3470e1a3460d1a3460... 0x8d35.1-0x8d96 (97)
0x8d40|a3 06 8d 1a 30 60 c1 82 c6 0b 18 2c 50 b1 62 85|....0`.....,P.b.|
* |until 0x8d96 (97) | |
| | | [16]: partition {} 0x8d96.1-0x8df7.4 (97.4)
| | | count: 128 0x8d96.1-NA (0)
0x8d90| a4 | . | rice_parameter: 4 0x8d96.1-0x8d96.4 (0.4)
0x8d90| a4 23 18 ce 33 9d 67 5a d6 b7| .#..3.gZ..| samples: 846319c673aceb5ad6f5bdf37ce73bce... 0x8d96.5-0x8df7.4 (97)
0x8da0|ad ef 9b e7 39 de 77 bd ef bd ef 7f df ff ff 45|....9.w........E|
* |until 0x8df7.4 (97) | |
| | | [17]: partition {} 0x8df7.5-0x8e68 (112.4)
| | | count: 128 0x8df7.5-NA (0)
0x8df0| fa ad | .. | rice_parameter: 5 0x8df7.5-0x8df8 (0.4)
0x8df0| ad 5a bd 7a f5 eb d7 b1| .Z.z....| samples: 5ab57af5ebd7af62bd7b362bd8b166cd... 0x8df8.1-0x8e68 (112)
0x8e00|5e bd 9b 15 ec 58 b3 66 c5 8b 36 6c 59 b5 66 cd|^....X.f..6lY.f.|
* |until 0x8e68 (112) | |
| | | [18]: partition {} 0x8e68.1-0x8ed4.6 (108.6)
| | | count: 128 0x8e68.1-NA (0)
0x8e60| ab | . | rice_parameter: 5 0x8e68.1-0x8e68.4 (0.4)
0x8e60| ab 57 2d db b7 6a dd ab| .W-..j..| samples: 6ae5bb76ed5bb56eddab76ad5bb566d5... 0x8e68.5-0x8ed4.6 (108.2)
0x8e70|76 ed 5b b5 6a dd ab 36 ad 5a b3 6a d5 9b 36 6c|v.[.j..6.Z.j..6l|
* |until 0x8ed4.6 (109) | |
| | | [19]: partition {} 0x8ed4.7-0x8f28.6 (84)
| | | count: 128 0x8ed4.7-NA (0)
0x8ed0| ea 66 | .f | rice_parameter: 3 0x8ed4.7-0x8ed5.2 (0.4)
0x8ed0| 66 9a 59 a5 96 59 25 92 49 2f 25| f.Y..Y%.I/%| samples: 34d2cd2cb2c92c9249792f7bdaf6b5ab... 0x8ed5.3-0x8f28.6 (83.4)
0x8ee0|ef 7b 5e d6 b5 6d 5a d6 95 a5 29 ff 4e ff ee ee|.{^..mZ...).N...|
* |until 0x8f28.6 (84) | |
| | | [20]: partition {} 0x8f28.7-0x8f98.4 (111.6)
| | | count: 128 0x8f28.7-NA (0)
0x8f20| 18 bf | .. | rice_parameter: 5 0x8f28.7-0x8f29.2 (0.4)
0x8f20| bf 7d f7 c8 3e 41 f2| .}..>A.| samples: fbefbe41f20f91204089122448922248... 0x8f29.3-0x8f98.4 (111.2)
0x8f30|24 08 11 22 44 89 12 44 49 12 24 4c 91 22 64 c9|$.."D..DI.$L."d.|
* |until 0x8f98.4 (112) | |
| | | [21]: partition {} 0x8f98.5-0x9009 (112.4)
| | | count: 128 0x8f98.5-NA (0)
0x8f90| d2 ba | .. | rice_parameter: 5 0x8f98.5-0x8f99 (0.4)
0x8f90| ba 74 e9 d3 a7 4e 9d| .t...N.| samples: 74e9d3a74e9d3a74e9d3a78e9d3a74e9... 0x8f99.1-0x9009 (112)
0x8fa0|3a 74 e9 d3 c7 4e 9d 3a 74 e9 e3 a7 4e 9d 3a 78|:t...N.:t...N.:x|
* |until 0x9009 (112) | |
| | | [22]: partition {} 0x9009.1-0x9067 (94)
| | | count: 128 0x9009.1-NA (0)
0x9000| 21 | ! | rice_parameter: 4 0x9009.1-0x9009.4 (0.4)
0x9000| 21 a3 46 8c 18 30 60| !.F..0`| samples: 3468d183060c163058c162858b142c50... 0x9009.5-0x9067 (93.4)
0x9010|b1 82 c6 0b 14 2c 58 a1 62 85 09 14 24 50 91 22|.....,X.b...$P."|
* |until 0x9067 (94) | |
| | | [23]: partition {} 0x9067.1-0x90cc.3 (101.3)
| | | count: 128 0x9067.1-NA (0)
0x9060| a5 | . | rice_parameter: 4 0x9067.1-0x9067.4 (0.4)
0x9060| a5 eb 7b e6 f9 ce 77 9d ef| ..{...w..| samples: bd6f7cdf39cef3bdef7def7bfefffffa... 0x9067.5-0x90cc.3 (100.7)
0x9070|7b ef 7b df f7 ff ff d1 45 14 51 4d 34 d3 4d 55|{.{.....E.QM4.MU|
* |until 0x90cc.3 (101) | |
| | | [24]: partition {} 0x90cc.4-0x913c.7 (112.4)
| | | count: 128 0x90cc.4-NA (0)
0x90c0| f5 | . | rice_parameter: 5 0x90cc.4-0x90cc.7 (0.4)
0x90c0| 62 c5 9b| b..| samples: 62c59b362c59b362cdab366cd9b56ad5... 0x90cd-0x913c.7 (112)
0x90d0|36 2c 59 b3 62 cd ab 36 6c d9 b5 6a d5 9b 56 ad|6,Y.b..6l..j..V.|
* |until 0x913c.7 (112) | |
| | | [25]: partition {} 0x913d-0x91a7.7 (107)
| | | count: 128 0x913d-NA (0)
0x9130| 56 | V | rice_parameter: 5 0x913d-0x913d.3 (0.4)
0x9130| 56 ed 59| V.Y| samples: 6ed59b56ad59b56acd9b366d59b362cd... 0x913d.4-0x91a7.7 (106.4)
0x9140|b5 6a d5 9b 56 ac d9 b3 66 d5 9b 36 2c d8 b3 66|.j..V...f..6,..f|
* |until 0x91a7.7 (107) | |
| | | [26]: partition {} 0x91a8-0x91fe.6 (86.7)
| | | count: 128 0x91a8-NA (0)
0x91a0| 37 | 7 | rice_parameter: 3 0x91a8-0x91a8.3 (0.4)
0x91a0| 37 bd ed 7b 5a d5 b5 6b| 7..{Z..k| samples: 7bded7b5ad5b56b5a5694a7fd3bffbbb... 0x91a8.4-0x91fe.6 (86.3)
0x91b0|5a 56 94 a7 fd 3b ff bb bb 7b 77 37 33 31 31 11|ZV...;...{w7311.|
* |until 0x91fe.6 (87) | |
| | | [27]: partition {} 0x91fe.7-0x926f.2 (112.4)
| | | count: 128 0x91fe.7-NA (0)
0x91f0| 14 a8| ..| rice_parameter: 5 0x91fe.7-0x91ff.2 (0.4)
0x91f0| a8| .| samples: 4489222489122648913264c9942650a1... 0x91ff.3-0x926f.2 (112)
0x9200|91 24 44 91 22 44 c9 12 26 4c 99 32 84 ca 14 28|.$D."D..&L.2...(|
* |until 0x926f.2 (112) | |
| | | [28]: partition {} 0x926f.3-0x92df.6 (112.4)
| | | count: 128 0x926f.3-NA (0)
0x9260| 4a| J| rice_parameter: 5 0x926f.3-0x926f.6 (0.4)
0x9260| 4a| J| samples: 74e9d3a74f1d3a74e9d3c74e9d3a74e9... 0x926f.7-0x92df.6 (112)
0x9270|e9 d3 a7 4e 9e 3a 74 e9 d3 a7 8e 9d 3a 74 e9 d3|...N.:t.....:t..|
* |until 0x92df.6 (112) | |
| | | [29]: partition {} 0x92df.7-0x933a.2 (90.4)
| | | count: 128 0x92df.7-NA (0)
0x92d0| 4c| L| rice_parameter: 4 0x92df.7-0x92e0.2 (0.4)
0x92e0|85 |. |
0x92e0|85 8a 16 28 50 91 42 45 09 12 24 40 81 22 04 08|...(P.BE..$@."..| samples: 2c50b142848a12284891220409102041... 0x92e0.3-0x933a.2 (90)
0x92f0|3c f1 07 9e 71 e7 1c 71 c7 1a 69 a6 9a 61 a6 16|<...q..q..i..a..|
* |until 0x933a.2 (90) | |
| | | [30]: partition {} 0x933a.3-0x93a4.1 (105.7)
| | | count: 128 0x933a.3-NA (0)
0x9330| 6b | k | rice_parameter: 5 0x933a.3-0x933a.6 (0.4)
0x9330| 6b 5d b6 db 6d f6| k]..m.| samples: aedb6db6fb6fbefbf1c71c71cf3cf3cf... 0x933a.7-0x93a4.1 (105.3)
0x9340|df 7d f7 e3 8e 38 e3 9e 79 e7 9e ba e7 ae fb eb|.}...8..y.......|
* |until 0x93a4.1 (106) | |
| | | [31]: partition {} 0x93a4.2-0x9414.5 (112.4)
| | | count: 128 0x93a4.2-NA (0)
0x93a0| d5 | . | rice_parameter: 5 0x93a4.2-0x93a4.5 (0.4)
0x93a0| d5 9b 56 ad 59 b5 6a d5 ab 56 ad da| ..V.Y.j..V..| samples: 66d5ab566d5ab56ad5ab76ad5bb76add... 0x93a4.6-0x9414.5 (112)
0x93b0|b5 6e dd ab 76 ed 5b b7 72 dd bb 76 ed db b9 72|.n..v.[.r..v...r|
* |until 0x9414.5 (112) | |
0x9410| d4 | . | byte_align: Correct (0x0) 0x9414.6-0x9414.7 (0.2)
0x9410| 95 48 | .H | footer_crc: Correct (9548) 0x9415-0x9416.7 (2)
| | | [4]: frame {} (flac_frame) 0x9417-0xb732.7 (8988)
| | | header: {} 0x9417-0x941c.7 (6)
0x9410| ff f8 | .. | sync: Correct (0x3ffe) 0x9417-0x9418.5 (1.6)
0x9410| f8 | . | reserved0: Correct (0x0) 0x9418.6-0x9418.6 (0.1)
0x9410| f8 | . | blocking_strategy: Fixed (0) 0x9418.7-0x9418.7 (0.1)
0x9410| c9 | . | block_size: 4096 0x9419-0x9419.3 (0.4)
0x9410| c9 | . | sample_rate: 44100 0x9419.4-0x9419.7 (0.4)
0x9410| 18 | . | channel_assignment: left, right (2) 0x941a-0x941a.3 (0.4)
0x9410| 18 | . | sample_size: 16 0x941a.4-0x941a.6 (0.3)
0x9410| 18 | . | reserved1: Correct (0x0) 0x941a.7-0x941a.7 (0.1)
| | | end_of_header: {} 0x941b-0x941b.7 (1)
0x9410| 04 | . | frame_number: 4 0x941b-0x941b.7 (1)
0x9410| de | . | crc: Correct (de) 0x941c-0x941c.7 (1)
| | | subframes: [2] 0x941d-0xb730.1 (8979.2)
| | | [0]: subframe {} 0x941d-0xb37a.7 (8030)
0x9410| 10 | . | zero_bit: Correct (0x0) 0x941d-0x941d (0.1)
0x9410| 10 | . | subframe_type: Fixed (2) 0x941d.1-0x941d.6 (0.6)
| | | lpc_order: 0 0x941d.7-NA (0)
0x9410| 10 | . | wasted_bits_flag: 0 0x941d.7-0x941d.7 (0.1)
| | | subframe_sample_size: 16 0x941e-NA (0)
| | | warmup_samples: [0] 0x941e-NA (0)
0x9410| 13 | . | residual_coding_method: rice (4) 0x941e-0x941e.1 (0.2)
0x9410| 13 | . | partition_order: 4 0x941e.2-0x941e.5 (0.4)
| | | rice_partitions: 16 0x941e.6-NA (0)
| | | partitions: [16] 0x941e.6-0xb37a.7 (8028.2)
| | | [0]: partition {} 0x941e.6-0x95d4.3 (437.6)
| | | count: 256 0x941e.6-NA (0)
0x9410| 13 10| ..| rice_parameter: 12 0x941e.6-0x941f.1 (0.4)
0x9410| 10| .| samples: 437fcffc01cb7db2682f15d8ae505ad9... 0x941f.2-0x95d4.3 (437.2)
0x9420|df f3 ff 00 72 df 6c 9a 0b c5 76 2b 94 16 b6 46|....r.l...v+...F|
* |until 0x95d4.3 (438) | |
| | | [1]: partition {} 0x95d4.4-0x978a.2 (437.7)
| | | count: 256 0x95d4.4-NA (0)
0x95d0| 2c | , | rice_parameter: 12 0x95d4.4-0x95d4.7 (0.4)
0x95d0| 4e b9 17 4f 8d 72 93 42 d7 76 a6| N..O.r.B.v.| samples: 4eb9174f8d729342d776a63483a15b36... 0x95d5-0x978a.2 (437.3)
0x95e0|34 83 a1 5b 36 9b 0e e3 0f 6b bd df 41 25 29 55|4..[6....k..A%)U|
* |until 0x978a.2 (438) | |
| | | [2]: partition {} 0x978a.3-0x9940 (437.6)
| | | count: 256 0x978a.3-NA (0)
0x9780| 78 | x | rice_parameter: 12 0x978a.3-0x978a.6 (0.4)
0x9780| 78 b2 0a 86 e9 02| x.....| samples: 59054374817f63d43d5de076ae32bb80... 0x978a.7-0x9940 (437.2)
0x9790|fe c7 a8 7a bb c0 ed 5c 65 77 00 19 5d 55 c3 03|...z...\ew..]U..|
* |until 0x9940 (438) | |
| | | [3]: partition {} 0x9940.1-0x9af5.6 (437.6)
| | | count: 256 0x9940.1-NA (0)
0x9940|63 |c | rice_parameter: 12 0x9940.1-0x9940.4 (0.4)
0x9940|63 12 cb 5f 29 7c 94 b2 09 9d e2 db 06 31 ac 3d|c.._)|.......1.=| samples: 62596be52f92964133bc5b60c63587a6... 0x9940.5-0x9af5.6 (437.2)
0x9950|36 a8 58 48 2e 98 77 73 d0 9f 28 7e 2e 8b 9a 75|6.XH..ws..(~...u|
* |until 0x9af5.6 (438) | |
| | | [4]: partition {} 0x9af5.7-0x9cbf.1 (457.3)
| | | count: 256 0x9af5.7-NA (0)
0x9af0| 17 8d | .. | rice_parameter: 12 0x9af5.7-0x9af6.2 (0.4)
0x9af0| 8d 4f b2 06 b9 ba a8 29 90 a1| .O.....)..| samples: 6a7d9035cdd5414c850dff3ff0072df6... 0x9af6.3-0x9cbf.1 (456.7)
0x9b00|bf e7 fe 00 e5 be d9 34 17 8a ec 57 28 2d 6c 8c|.......4...W(-l.|
* |until 0x9cbf.1 (457) | |
| | | [5]: partition {} 0x9cbf.2-0x9ed3 (531.7)
| | | count: 256 0x9cbf.2-NA (0)
0x9cb0| 39| 9| rice_parameter: 14 0x9cbf.2-0x9cbf.5 (0.4)
0x9cb0| 39| 9| samples: 606463d93a108a9b9f53101bc4f35645... 0x9cbf.6-0x9ed3 (531.3)
0x9cc0|81 91 8f 64 e8 42 2a 6e 7d 4c 40 6f 13 cd 59 17|...d.B*n}L@o..Y.|
* |until 0x9ed3 (532) | |
| | | [6]: partition {} 0x9ed3.1-0xa0df.2 (524.2)
| | | count: 256 0x9ed3.1-NA (0)
0x9ed0| 71 | q | rice_parameter: 14 0x9ed3.1-0x9ed3.4 (0.4)
0x9ed0| 71 27 95 4d 79 48 18 f4 49 68 cc b8 95| q'.MyH..Ih...| samples: 24f2a9af29031e892d199712af6d8a35... 0x9ed3.5-0xa0df.2 (523.6)
0x9ee0|7b 6c 51 a9 1a bc 14 6e 44 73 74 7c ba c7 0e 5b|{lQ....nDst|...[|
* |until 0xa0df.2 (524) | |
| | | [7]: partition {} 0xa0df.3-0xa2ed.5 (526.3)
| | | count: 256 0xa0df.3-NA (0)
0xa0d0| bd| .| rice_parameter: 14 0xa0df.3-0xa0df.6 (0.4)
0xa0d0| bd| .| samples: fca07db878e61aeb078e38d3a76d87ce... 0xa0df.7-0xa2ed.5 (525.7)
0xa0e0|f9 40 fb 70 f1 cc 35 d6 0f 1c 71 a7 4e db 0f 9d|.@.p..5...q.N...|
* |until 0xa2ed.5 (526) | |
| | | [8]: partition {} 0xa2ed.6-0xa4ff.4 (529.7)
| | | count: 256 0xa2ed.6-NA (0)
0xa2e0| 37 95 | 7. | rice_parameter: 14 0xa2ed.6-0xa2ee.1 (0.4)
0xa2e0| 95 05| ..| samples: 541730a5b7d8f2a26ee0eb646879bf3e... 0xa2ee.2-0xa4ff.4 (529.3)
0xa2f0|cc 29 6d f6 3c a8 9b b8 3a d9 1a 1e 6f cf 8e e0|.)m.<...:...o...|
* |until 0xa4ff.4 (530) | |
| | | [9]: partition {} 0xa4ff.5-0xa713 (531.4)
| | | count: 256 0xa4ff.5-NA (0)
0xa4f0| af| .| rice_parameter: 14 0xa4ff.5-0xa500 (0.4)
0xa500|56 |V |
0xa500|56 aa 16 34 96 e7 7b 1f ba a7 b7 4f 9f 8a 87 b5|V..4..{....O....| samples: ad542c692dcef63f754f6e9f3f150f6b... 0xa500.1-0xa713 (531)
0xa510|81 |. |
* |until 0xa713 (531) | |
| | | [10]: partition {} 0xa713.1-0xa924.7 (529.7)
| | | count: 256 0xa713.1-NA (0)
0xa710| 73 | s | rice_parameter: 14 0xa713.1-0xa713.4 (0.4)
0xa710| 73 e1 08 ed a8 58 94 bc 10 6a b0 4b 08| s....X...j.K.| samples: 7c211db50b1297820d560961068371f2... 0xa713.5-0xa924.7 (529.3)
0xa720|34 1b 8f 90 47 76 07 3b 7f a1 5b 8e 24 51 38 15|4...Gv.;..[.$Q8.|
* |until 0xa924.7 (530) | |
| | | [11]: partition {} 0xa925-0xab35.1 (528.2)
| | | count: 256 0xa925-NA (0)
0xa920| e1 | . | rice_parameter: 14 0xa925-0xa925.3 (0.4)
0xa920| e1 66 88 97 fc 3c b8 cc 82 1b e3| .f...<.....| samples: 1668897fc3cb8cc821be387440b21278... 0xa925.4-0xab35.1 (527.6)
0xa930|87 44 0b 21 27 8d d1 f9 c1 50 6d d2 85 a1 de 73|.D.!'....Pm....s|
* |until 0xab35.1 (528) | |
| | | [12]: partition {} 0xab35.2-0xad47.3 (530.2)
| | | count: 256 0xab35.2-NA (0)
0xab30| b9 | . | rice_parameter: 14 0xab35.2-0xab35.5 (0.4)
0xab30| b9 df e1 aa 8c af b4 3a a7 b9 36| .......:..6| samples: 77f86aa32bed0ea9ee4daf3d0617473e... 0xab35.6-0xad47.3 (529.6)
0xab40|bc f4 18 5d 1c f8 22 74 23 80 a5 94 27 dc fd a2|...].."t#...'...|
* |until 0xad47.3 (530) | |
| | | [13]: partition {} 0xad47.4-0xaf57.1 (527.6)
| | | count: 256 0xad47.4-NA (0)
0xad40| 5e | ^ | rice_parameter: 14 0xad47.4-0xad47.7 (0.4)
0xad40| 5b fb b8 4c c4 d2 e5 06| [..L....| samples: 5bfbb84cc4d2e5067c11102504eaf39e... 0xad48-0xaf57.1 (527.2)
0xad50|7c 11 10 25 04 ea f3 9e 9b 06 a2 01 00 b1 e4 48||..%...........H|
* |until 0xaf57.1 (528) | |
| | | [14]: partition {} 0xaf57.2-0xb168.4 (529.3)
| | | count: 256 0xaf57.2-NA (0)
0xaf50| b9 | . | rice_parameter: 14 0xaf57.2-0xaf57.5 (0.4)
0xaf50| b9 fa 32 9f a3 b4 ee 1f a4| ..2......| samples: 7e8ca7e8ed3b87e90790ab9975bc5712... 0xaf57.6-0xb168.4 (528.7)
0xaf60|1e 42 ae 65 d6 f1 5c 4b f8 a4 09 96 46 84 b2 e4|.B.e..\K....F...|
* |until 0xb168.4 (529) | |
| | | [15]: partition {} 0xb168.5-0xb37a.7 (530.3)
| | | count: 256 0xb168.5-NA (0)
0xb160| 97 26 | .& | rice_parameter: 14 0xb168.5-0xb169 (0.4)
0xb160| 26 ea ec aa 1c 82 58| &.....X| samples: 4dd5d9543904b02dd88024a0b3b18d21... 0xb169.1-0xb37a.7 (529.7)
0xb170|16 ec 40 12 50 59 d8 c6 90 f2 bd 40 82 24 75 9b|..@.PY.....@.$u.|
* |until 0xb37a.7 (530) | |
| | | [1]: subframe {} 0xb37b-0xb730.1 (949.2)
0xb370| 14 | . | zero_bit: Correct (0x0) 0xb37b-0xb37b (0.1)
0xb370| 14 | . | subframe_type: Fixed (2) 0xb37b.1-0xb37b.6 (0.6)
| | | lpc_order: 2 0xb37b.7-NA (0)
0xb370| 14 | . | wasted_bits_flag: 0 0xb37b.7-0xb37b.7 (0.1)
| | | subframe_sample_size: 16 0xb37c-NA (0)
| | | warmup_samples: [2] 0xb37c-0xb37f.7 (4)
0xb370| f8 a7 | .. | [0]: value -1881 0xb37c-0xb37d.7 (2)
0xb370| f8 8d| ..| [1]: value -1907 0xb37e-0xb37f.7 (2)
0xb380|04 |. | residual_coding_method: rice (4) 0xb380-0xb380.1 (0.2)
0xb380|04 |. | partition_order: 1 0xb380.2-0xb380.5 (0.4)
| | | rice_partitions: 2 0xb380.6-NA (0)
| | | partitions: [2] 0xb380.6-0xb730.1 (943.4)
| | | [0]: partition {} 0xb380.6-0xb556.2 (469.5)
| | | count: 2046 0xb380.6-NA (0)
0xb380|04 0a |.. | rice_parameter: 0 0xb380.6-0xb381.1 (0.4)
0xb380| 0a 59 f2 cf 49 a6 92 96 65 2c cb 9e 52 92 ca| .Y..I...e,..R..| samples: 2967cb3d269a4a5994b32e794a4b2994... 0xb381.2-0xb556.2 (469.1)
0xb390|65 29 cd 39 a6 53 e7 ca 4b 3c a7 29 ca 72 9c a7|e).9.S..K<.).r..|
* |until 0xb556.2 (470) | |
| | | [1]: partition {} 0xb556.3-0xb730.1 (473.7)
| | | count: 2048 0xb556.3-NA (0)
0xb550| 20 | | rice_parameter: 0 0xb556.3-0xb556.6 (0.4)
0xb550| 20 25 2c d9 65 97 fe 44 f4 22| %,.e..D."| samples: 12966cb2cbff227a11294e94b37297e5... 0xb556.7-0xb730.1 (473.3)
0xb560|52 9d 29 66 e5 2f cb ff a7 d3 4e 94 d9 66 cb 97|R.)f./....N..f..|
* |until 0xb730.1 (474) | |
0xb730|40 |@ | byte_align: Correct (0x0) 0xb730.2-0xb730.7 (0.6)
0xb730| c1 3d | .= | footer_crc: Correct (c13d) 0xb731-0xb732.7 (2)
| | | [5]: frame {} (flac_frame) 0xb733-0xc54b.7 (3609)
| | | header: {} 0xb733-0xb73a.7 (8)
0xb730| ff f8 | .. | sync: Correct (0x3ffe) 0xb733-0xb734.5 (1.6)
0xb730| f8 | . | reserved0: Correct (0x0) 0xb734.6-0xb734.6 (0.1)
0xb730| f8 | . | blocking_strategy: Fixed (0) 0xb734.7-0xb734.7 (0.1)
0xb730| 79 | y | block_size: end of header (16 bit) (0) 0xb735-0xb735.3 (0.4)
0xb730| 79 | y | sample_rate: 44100 0xb735.4-0xb735.7 (0.4)
0xb730| 18 | . | channel_assignment: left, right (2) 0xb736-0xb736.3 (0.4)
0xb730| 18 | . | sample_size: 16 0xb736.4-0xb736.6 (0.3)
0xb730| 18 | . | reserved1: Correct (0x0) 0xb736.7-0xb736.7 (0.1)
| | | end_of_header: {} 0xb737-0xb739.7 (3)
0xb730| 05 | . | frame_number: 5 0xb737-0xb737.7 (1)
0xb730| 06 21 | .! | block_size: 1570 0xb738-0xb739.7 (2)
0xb730| 5f | _ | crc: Correct (5f) 0xb73a-0xb73a.7 (1)
| | | subframes: [2] 0xb73b-0xc549.1 (3598.2)
| | | [0]: subframe {} 0xb73b-0xc37f.7 (3141)
0xb730| 02 | . | zero_bit: Correct (0x0) 0xb73b-0xb73b (0.1)
0xb730| 02 | . | subframe_type: Verbatim (1) 0xb73b.1-0xb73b.6 (0.6)
| | | lpc_order: 0 0xb73b.7-NA (0)
0xb730| 02 | . | wasted_bits_flag: 0 0xb73b.7-0xb73b.7 (0.1)
| | | subframe_sample_size: 16 0xb73c-NA (0)
0xb730| 3e 6f 45 a2| >oE.| samples: 3e6f45a2735837f38cdaa216cd385a8c... 0xb73c-0xc37f.7 (3140)
0xb740|73 58 37 f3 8c da a2 16 cd 38 5a 8c fe b6 ca 3c|sX7......8Z....<|
* |until 0xc37f.7 (3140) | |
| | | [1]: subframe {} 0xc380-0xc549.1 (457.2)
0xc380|14 |. | zero_bit: Correct (0x0) 0xc380-0xc380 (0.1)
0xc380|14 |. | subframe_type: Fixed (2) 0xc380.1-0xc380.6 (0.6)
| | | lpc_order: 2 0xc380.7-NA (0)
0xc380|14 |. | wasted_bits_flag: 0 0xc380.7-0xc380.7 (0.1)
| | | subframe_sample_size: 16 0xc381-NA (0)
| | | warmup_samples: [2] 0xc381-0xc384.7 (4)
0xc380| 0f 8b | .. | [0]: value 3979 0xc381-0xc382.7 (2)
0xc380| 0f 88 | .. | [1]: value 3976 0xc383-0xc384.7 (2)
0xc380| 00 | . | residual_coding_method: rice (4) 0xc385-0xc385.1 (0.2)
0xc380| 00 | . | partition_order: 0 0xc385.2-0xc385.5 (0.4)
| | | rice_partitions: 1 0xc385.6-NA (0)
| | | partitions: [1] 0xc385.6-0xc549.1 (451.4)
| | | [0]: partition {} 0xc385.6-0xc549.1 (451.4)
| | | count: 1568 0xc385.6-NA (0)
0xc380| 00 65 | .e | rice_parameter: 1 0xc385.6-0xc386.1 (0.4)
0xc380| 65 d5 55 5a ad 5a d6 b9 74 ba| e.UZ.Z..t.| samples: 9755556ab56b5ae5d2eaaaaad56ad5cb... 0xc386.2-0xc549.1 (451)
0xc390|aa aa b5 5a b5 72 e5 cb a9 75 6a aa d6 ab 5c ae|...Z.r...uj...\.|
* |until 0xc549.1 (451) | |
0xc540| 80 | . | byte_align: Correct (0x0) 0xc549.2-0xc549.7 (0.6)
0xc540| 06 d3| | ..| | footer_crc: Correct (06d3) 0xc54a-0xc54b.7 (2)
| | | md5_calculated: 5a00c873b80b8f6294d14fe75b14a7d3 0xc54c-NA (0)
| | | decoded_samples: 22050 0xc54c-NA (0)

BIN
format/flac/testdata/stereo24.flac vendored Normal file

Binary file not shown.

1401
format/flac/testdata/stereo24.fqtest vendored Normal file

File diff suppressed because it is too large Load Diff

BIN
format/flac/testdata/stereo8.flac vendored Normal file

Binary file not shown.

933
format/flac/testdata/stereo8.fqtest vendored Normal file
View File

@ -0,0 +1,933 @@
/stereo8.flac:
> fq -d flac verbose /stereo8.flac
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /stereo8.flac (flac) 0x0-0x6d5c.7 (27997)
0x0000|66 4c 61 43 |fLaC | magic: "fLaC" (Correct) 0x0-0x3.7 (4)
| | | metadatablocks: [4] 0x4-0x206f.7 (8300)
| | | [0]: metadatablock {} (flac_metadatablock) 0x4-0x29.7 (38)
0x0000| 00 | . | last_block: false 0x4-0x4 (0.1)
0x0000| 00 | . | type: Streaminfo (0) 0x4.1-0x4.7 (0.7)
0x0000| 00 00 22 | .." | length: 34 0x5-0x7.7 (3)
0x0000| 10 00 | .. | minimum_block_size: 4096 0x8-0x9.7 (2)
0x0000| 10 00 | .. | maximum_block_size: 4096 0xa-0xb.7 (2)
0x0000| 00 00 0c | ... | minimum_frame_size: 12 0xc-0xe.7 (3)
0x0000| 00| .| maximum_frame_size: 8206 0xf-0x11.7 (3)
0x0010|20 0e | . |
0x0010| 0a c4 42 | ..B | sample_rate: 44100 0x12-0x14.3 (2.4)
0x0010| 42 | B | channels: 2 0x14.4-0x14.6 (0.3)
0x0010| 42 70 | Bp | bits_per_sample: 8 0x14.7-0x15.3 (0.5)
0x0010| 70 00 00 56 22 | p..V" | total_samples_in_stream: 22050 0x15.4-0x19.7 (4.4)
0x0010| ef 79 00 9c ce 3b| .y...;| md5: ef79009cce3bd79ef4b5668ebb98d113 0x1a-0x29.7 (16)
0x0020|d7 9e f4 b5 66 8e bb 98 d1 13 |....f..... |
| | | [1]: metadatablock {} (flac_metadatablock) 0x2a-0x3f.7 (22)
0x0020| 03 | . | last_block: false 0x2a-0x2a (0.1)
0x0020| 03 | . | type: Seektable (3) 0x2a.1-0x2a.7 (0.7)
0x0020| 00 00 12 | ... | length: 18 0x2b-0x2d.7 (3)
| | | seekpoints: [1] 0x2e-0x3f.7 (18)
| | | [0]: seekpoint {} 0x2e-0x3f.7 (18)
0x0020| 00 00| ..| sample_number: 0 0x2e-0x35.7 (8)
0x0030|00 00 00 00 00 00 |...... |
0x0030| 00 00 00 00 00 00 00 00 | ........ | offset: 0 0x36-0x3d.7 (8)
0x0030| 10 00| ..| number_of_samples: 4096 0x3e-0x3f.7 (2)
| | | [2]: metadatablock {} (flac_metadatablock) 0x40-0x6b.7 (44)
0x0040|04 |. | last_block: false 0x40-0x40 (0.1)
0x0040|04 |. | type: Vorbis comment (4) 0x40.1-0x40.7 (0.7)
0x0040| 00 00 28 | ..( | length: 40 0x41-0x43.7 (3)
| | | comment: {} (vorbis_comment) 0x44-0x6b.7 (40)
0x0040| 20 00 00 00 | ... | vendor_length: 32 0x44-0x47.7 (4)
0x0040| 72 65 66 65 72 65 6e 63| referenc| vendor: "reference libFLAC 1.3.3 20190804" 0x48-0x67.7 (32)
0x0050|65 20 6c 69 62 46 4c 41 43 20 31 2e 33 2e 33 20|e libFLAC 1.3.3 |
0x0060|32 30 31 39 30 38 30 34 |20190804 |
0x0060| 00 00 00 00 | .... | user_comment_list_length: 0 0x68-0x6b.7 (4)
| | | user_comments: [0] 0x6c-NA (0)
| | | [3]: metadatablock {} (flac_metadatablock) 0x6c-0x206f.7 (8196)
0x0060| 81 | . | last_block: true 0x6c-0x6c (0.1)
0x0060| 81 | . | type: Padding (1) 0x6c.1-0x6c.7 (0.7)
0x0060| 00 20 00| . .| length: 8192 0x6d-0x6f.7 (3)
0x0070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| data: 00000000000000000000000000000000... 0x70-0x206f.7 (8192)
* |until 0x206f.7 (8192) | |
| | | frames: [6] 0x2070-0x6d5c.7 (19693)
| | | [0]: frame {} (flac_frame) 0x2070-0x207b.7 (12)
| | | header: {} 0x2070-0x2075.7 (6)
0x2070|ff f8 |.. | sync: Correct (0x3ffe) 0x2070-0x2071.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x2071.6-0x2071.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x2071.7-0x2071.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x2072-0x2072.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x2072.4-0x2072.7 (0.4)
0x2070| 12 | . | channel_assignment: left, right (2) 0x2073-0x2073.3 (0.4)
0x2070| 12 | . | sample_size: 8 0x2073.4-0x2073.6 (0.3)
0x2070| 12 | . | reserved1: Correct (0x0) 0x2073.7-0x2073.7 (0.1)
| | | end_of_header: {} 0x2074-0x2074.7 (1)
0x2070| 00 | . | frame_number: 0 0x2074-0x2074.7 (1)
0x2070| 40 | @ | crc: Correct (40) 0x2075-0x2075.7 (1)
| | | subframes: [2] 0x2076-0x2079.7 (4)
| | | [0]: subframe {} 0x2076-0x2077.7 (2)
0x2070| 00 | . | zero_bit: Correct (0x0) 0x2076-0x2076 (0.1)
0x2070| 00 | . | subframe_type: Constant (0) 0x2076.1-0x2076.6 (0.6)
| | | lpc_order: 0 0x2076.7-NA (0)
0x2070| 00 | . | wasted_bits_flag: 0 0x2076.7-0x2076.7 (0.1)
| | | subframe_sample_size: 8 0x2077-NA (0)
0x2070| 00 | . | value: 0 0x2077-0x2077.7 (1)
| | | [1]: subframe {} 0x2078-0x2079.7 (2)
0x2070| 00 | . | zero_bit: Correct (0x0) 0x2078-0x2078 (0.1)
0x2070| 00 | . | subframe_type: Constant (0) 0x2078.1-0x2078.6 (0.6)
| | | lpc_order: 0 0x2078.7-NA (0)
0x2070| 00 | . | wasted_bits_flag: 0 0x2078.7-0x2078.7 (0.1)
| | | subframe_sample_size: 8 0x2079-NA (0)
0x2070| 00 | . | value: 0 0x2079-0x2079.7 (1)
| | | byte_align: Correct (0x0) 0x207a-NA (0)
0x2070| 82 7e | .~ | footer_crc: Correct (827e) 0x207a-0x207b.7 (2)
| | | [1]: frame {} (flac_frame) 0x207c-0x261a.7 (1439)
| | | header: {} 0x207c-0x2081.7 (6)
0x2070| ff f8 | .. | sync: Correct (0x3ffe) 0x207c-0x207d.5 (1.6)
0x2070| f8 | . | reserved0: Correct (0x0) 0x207d.6-0x207d.6 (0.1)
0x2070| f8 | . | blocking_strategy: Fixed (0) 0x207d.7-0x207d.7 (0.1)
0x2070| c9 | . | block_size: 4096 0x207e-0x207e.3 (0.4)
0x2070| c9 | . | sample_rate: 44100 0x207e.4-0x207e.7 (0.4)
0x2070| 12| .| channel_assignment: left, right (2) 0x207f-0x207f.3 (0.4)
0x2070| 12| .| sample_size: 8 0x207f.4-0x207f.6 (0.3)
0x2070| 12| .| reserved1: Correct (0x0) 0x207f.7-0x207f.7 (0.1)
| | | end_of_header: {} 0x2080-0x2080.7 (1)
0x2080|01 |. | frame_number: 1 0x2080-0x2080.7 (1)
0x2080| 47 | G | crc: Correct (47) 0x2081-0x2081.7 (1)
| | | subframes: [2] 0x2082-0x2618.2 (1430.3)
| | | [0]: subframe {} 0x2082-0x22e9.1 (615.2)
0x2080| 12 | . | zero_bit: Correct (0x0) 0x2082-0x2082 (0.1)
0x2080| 12 | . | subframe_type: Fixed (2) 0x2082.1-0x2082.6 (0.6)
| | | lpc_order: 1 0x2082.7-NA (0)
0x2080| 12 | . | wasted_bits_flag: 0 0x2082.7-0x2082.7 (0.1)
| | | subframe_sample_size: 8 0x2083-NA (0)
| | | warmup_samples: [1] 0x2083-0x2083.7 (1)
0x2080| 00 | . | [0]: value 0 0x2083-0x2083.7 (1)
0x2080| 04 | . | residual_coding_method: rice (4) 0x2084-0x2084.1 (0.2)
0x2080| 04 | . | partition_order: 1 0x2084.2-0x2084.5 (0.4)
| | | rice_partitions: 2 0x2084.6-NA (0)
| | | partitions: [2] 0x2084.6-0x22e9.1 (612.4)
| | | [0]: partition {} 0x2084.6-0x21b1.6 (301.1)
| | | count: 2047 0x2084.6-NA (0)
0x2080| 04 3f | .? | rice_parameter: 0 0x2084.6-0x2085.1 (0.4)
0x2080| 3f ff ff ff ff ff ff ff ff ff ff| ?..........| samples: ffffffffffffffffffffffffffffffff... 0x2085.2-0x21b1.6 (300.5)
0x2090|ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff|................|
* |until 0x21b1.6 (301) | |
| | | [1]: partition {} 0x21b1.7-0x22e9.1 (311.3)
| | | count: 2048 0x21b1.7-NA (0)
0x21b0| f2 1e | .. | rice_parameter: 0 0x21b1.7-0x21b2.2 (0.4)
0x21b0| 1e 79 f3 cf 9e 79 f3 cf 9e 7c f3 e7 cf 9f| .y...y...|....| samples: f3cf9e7cf3cf9e7cf3e79f3e7cfcfcfc... 0x21b2.3-0x22e9.1 (310.7)
0x21c0|9f 9f 9f cf f3 ff 9f ff ff ff ff ff fb ff 7f bf|................|
* |until 0x22e9.1 (311) | |
| | | [1]: subframe {} 0x22e9.2-0x2618.2 (815.1)
0x22e0| 45 | E | zero_bit: Correct (0x0) 0x22e9.2-0x22e9.2 (0.1)
0x22e0| 45 00 | E. | subframe_type: Fixed (2) 0x22e9.3-0x22ea (0.6)
| | | lpc_order: 2 0x22ea.1-NA (0)
0x22e0| 00 | . | wasted_bits_flag: 0 0x22ea.1-0x22ea.1 (0.1)
| | | subframe_sample_size: 8 0x22ea.2-NA (0)
| | | warmup_samples: [2] 0x22ea.2-0x22ec.1 (2)
0x22e0| 00 00 | .. | [0]: value 0 0x22ea.2-0x22eb.1 (1)
0x22e0| 00 01 | .. | [1]: value 0 0x22eb.2-0x22ec.1 (1)
0x22e0| 01 | . | residual_coding_method: rice (4) 0x22ec.2-0x22ec.3 (0.2)
0x22e0| 01 | . | partition_order: 1 0x22ec.4-0x22ec.7 (0.4)
| | | rice_partitions: 2 0x22ed-NA (0)
| | | partitions: [2] 0x22ed-0x2618.2 (811.3)
| | | [0]: partition {} 0x22ed-0x2476.1 (393.2)
| | | count: 2046 0x22ed-NA (0)
0x22e0| 0f | . | rice_parameter: 0 0x22ed-0x22ed.3 (0.4)
0x22e0| 0f ff ff| ...| samples: ffffffffffffffffffffffffffffffff... 0x22ed.4-0x2476.1 (392.6)
0x22f0|ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff|................|
* |until 0x2476.1 (393) | |
| | | [1]: partition {} 0x2476.2-0x2618.2 (418.1)
| | | count: 2048 0x2476.2-NA (0)
0x2470| c3 | . | rice_parameter: 0 0x2476.2-0x2476.5 (0.4)
0x2470| c3 f9 4f e5 34 e5 cb 29 72 e9| ..O.4..)r.| samples: fe53f94d3972ca5cba697f4bfe9a53a7... 0x2476.6-0x2618.2 (417.5)
0x2480|a5 fd 2f fa 69 4e 9f 2c ff 29 fe 59 4b 2f f4 bf|../.iN.,.).YK/..|
* |until 0x2618.2 (418) | |
0x2610| 20 | | byte_align: Correct (0x0) 0x2618.3-0x2618.7 (0.5)
0x2610| 99 e9 | .. | footer_crc: Correct (99e9) 0x2619-0x261a.7 (2)
| | | [2]: frame {} (flac_frame) 0x261b-0x4628.7 (8206)
| | | header: {} 0x261b-0x2620.7 (6)
0x2610| ff f8 | .. | sync: Correct (0x3ffe) 0x261b-0x261c.5 (1.6)
0x2610| f8 | . | reserved0: Correct (0x0) 0x261c.6-0x261c.6 (0.1)
0x2610| f8 | . | blocking_strategy: Fixed (0) 0x261c.7-0x261c.7 (0.1)
0x2610| c9 | . | block_size: 4096 0x261d-0x261d.3 (0.4)
0x2610| c9 | . | sample_rate: 44100 0x261d.4-0x261d.7 (0.4)
0x2610| a2 | . | channel_assignment: mid/side (2) 0x261e-0x261e.3 (0.4)
| | | side_channel_index: 1 0x261e.4-NA (0)
0x2610| a2 | . | sample_size: 8 0x261e.4-0x261e.6 (0.3)
0x2610| a2 | . | reserved1: Correct (0x0) 0x261e.7-0x261e.7 (0.1)
| | | end_of_header: {} 0x261f-0x261f.7 (1)
0x2610| 02| .| frame_number: 2 0x261f-0x261f.7 (1)
0x2620|01 |. | crc: Correct (01) 0x2620-0x2620.7 (1)
| | | subframes: [2] 0x2621-0x4626.5 (8197.6)
| | | [0]: subframe {} 0x2621-0x3523.6 (3842.7)
0x2620| 10 | . | zero_bit: Correct (0x0) 0x2621-0x2621 (0.1)
0x2620| 10 | . | subframe_type: Fixed (2) 0x2621.1-0x2621.6 (0.6)
| | | lpc_order: 0 0x2621.7-NA (0)
0x2620| 10 | . | wasted_bits_flag: 0 0x2621.7-0x2621.7 (0.1)
| | | subframe_sample_size: 8 0x2622-NA (0)
| | | warmup_samples: [0] 0x2622-NA (0)
0x2620| 15 | . | residual_coding_method: rice (4) 0x2622-0x2622.1 (0.2)
0x2620| 15 | . | partition_order: 5 0x2622.2-0x2622.5 (0.4)
| | | rice_partitions: 32 0x2622.6-NA (0)
| | | partitions: [32] 0x2622.6-0x3523.6 (3841.1)
| | | [0]: partition {} 0x2622.6-0x267b.3 (88.6)
| | | count: 128 0x2622.6-NA (0)
0x2620| 15 27 | .' | rice_parameter: 4 0x2622.6-0x2623.1 (0.4)
0x2620| 27 5b df 7b ef fe 8a 69 aa aa ec b2 cb| '[.{...i.....| samples: 9d6f7defbffa29a6aaabb2cb2db6db6d... 0x2623.2-0x267b.3 (88.2)
0x2630|6d b6 db 6d b6 db 6d b6 cb 2c ae ba aa a6 9a 3f|m..m..m..,.....?|
* |until 0x267b.3 (89) | |
| | | [1]: partition {} 0x267b.4-0x26c8.1 (76.6)
| | | count: 128 0x267b.4-NA (0)
0x2670| 03 | . | rice_parameter: 3 0x267b.4-0x267b.7 (0.4)
0x2670| aa aa aa cc| ....| samples: aaaaaacccaaaa8899bbddf4a56b6bdef... 0x267c-0x26c8.1 (76.2)
0x2680|ca aa a8 89 9b bd df 4a 56 b6 bd ef 24 92 cb 2c|.......JV...$..,|
* |until 0x26c8.1 (77) | |
| | | [2]: partition {} 0x26c8.2-0x2720.3 (88.2)
| | | count: 128 0x26c8.2-NA (0)
0x26c0| 0f | . | rice_parameter: 3 0x26c8.2-0x26c8.5 (0.4)
0x26c0| 0f 90 85 31 84 10 51 86| ...1..Q.| samples: e4214c61041461871c2040a143060e1c... 0x26c8.6-0x2720.3 (87.6)
0x26d0|1c 70 81 02 85 0c 18 38 70 e1 c3 87 0e 1c 38 60|.p.....8p.....8`|
* |until 0x2720.3 (88) | |
| | | [3]: partition {} 0x2720.4-0x2770.1 (79.6)
| | | count: 128 0x2720.4-NA (0)
0x2720|93 |. | rice_parameter: 3 0x2720.4-0x2720.7 (0.4)
0x2720| 4a d6 b5 ad ad 6b 56 d5 ad 29 4f fe ed dc cc| J....kV..)O....| samples: 4ad6b5adad6b56d5ad294ffeeddccc55... 0x2721-0x2770.1 (79.2)
0x2730|55 66 77 21 08 52 94 a5 29 4a 52 94 84 77 76 55|Ufw!.R..)JR..wvU|
* |until 0x2770.1 (80) | |
| | | [4]: partition {} 0x2770.2-0x27cc.6 (92.5)
| | | count: 128 0x2770.2-NA (0)
0x2770|d3 |. | rice_parameter: 4 0x2770.2-0x2770.5 (0.4)
0x2770|d3 39 df 7b f4 51 4d 55 57 65 96 db 75 d7 5f 7d|.9.{.QMUWe..u._}| samples: ce77defd14535555d965b6dd75d7df7d... 0x2770.6-0x27cc.6 (92.1)
0x2780|f7 df 7d f7 df 7d f7 dd 6d b6 59 5d 75 53 4d 1f|..}..}..m.Y]uSM.|
* |until 0x27cc.6 (93) | |
| | | [5]: partition {} 0x27cc.7-0x2848.3 (123.5)
| | | count: 128 0x27cc.7-NA (0)
0x27c0| 36 c5 | 6. | rice_parameter: 6 0x27cc.7-0x27cd.2 (0.4)
0x27c0| c5 c3 c4| ...| samples: 2e1e202cb6b0f7beeb41bf8c27c67361... 0x27cd.3-0x2848.3 (123.1)
0x27d0|05 96 d6 1e f7 dd 68 37 f1 84 f8 ce 6c 2d 48 76|......h7....l-Hv|
* |until 0x2848.3 (124) | |
| | | [6]: partition {} 0x2848.4-0x28c7.5 (127.2)
| | | count: 128 0x2848.4-NA (0)
0x2840| 66 | f | rice_parameter: 6 0x2848.4-0x2848.7 (0.4)
0x2840| b2 ed 18 e7 39 1d cb| ....9..| samples: b2ed18e7391dcbf4d4f592e4431492bb... 0x2849-0x28c7.5 (126.6)
0x2850|f4 d4 f5 92 e4 43 14 92 bb e2 fb 71 6c 53 b3 be|.....C.....qlS..|
* |until 0x28c7.5 (127) | |
| | | [7]: partition {} 0x28c7.6-0x2946.3 (126.6)
| | | count: 128 0x28c7.6-NA (0)
0x28c0| 85 86 | .. | rice_parameter: 6 0x28c7.6-0x28c8.1 (0.4)
0x28c0| 86 47 75 b7 aa 91 bb 23| .Gu....#| samples: 191dd6deaa46ec8d9b027ef27d727afb... 0x28c8.2-0x2946.3 (126.2)
0x28d0|66 c0 9f bc 9f 5c 9e be f0 a3 35 24 a3 a5 6a e4|f....\....5$..j.|
* |until 0x2946.3 (127) | |
| | | [8]: partition {} 0x2946.4-0x29c3.2 (124.7)
| | | count: 128 0x2946.4-NA (0)
0x2940| d6 | . | rice_parameter: 6 0x2946.4-0x2946.7 (0.4)
0x2940| 99 15 d4 c7 ac ef a9 7b 10| .......{.| samples: 9915d4c7acefa97b10a7bcb10aa3976f... 0x2947-0x29c3.2 (124.3)
0x2950|a7 bc b1 0a a3 97 6f 0a bb 44 32 af d6 a1 51 2f|......o..D2...Q/|
* |until 0x29c3.2 (125) | |
| | | [9]: partition {} 0x29c3.3-0x2a40.7 (125.5)
| | | count: 128 0x29c3.3-NA (0)
0x29c0| ad | . | rice_parameter: 6 0x29c3.3-0x29c3.6 (0.4)
0x29c0| ad b9 f4 c8 9b 33 a4 32 57 c2 5b 6a 89| .....3.2W.[j.| samples: dcfa644d99d2192be12db544f1723927... 0x29c3.7-0x2a40.7 (125.1)
0x29d0|e2 e4 72 4f e3 b5 79 24 da 9d ad 22 a5 9d 9b e0|..rO..y$..."....|
* |until 0x2a40.7 (126) | |
| | | [10]: partition {} 0x2a41-0x2ac0.5 (127.6)
| | | count: 128 0x2a41-NA (0)
0x2a40| 67 | g | rice_parameter: 6 0x2a41-0x2a41.3 (0.4)
0x2a40| 67 84 fb e9 c4 48 f7 8c 9c 21 0c 0d 5b 56 a1| g....H...!..[V.| samples: 784fbe9c448f78c9c210c0d5b56a10d8... 0x2a41.4-0x2ac0.5 (127.2)
0x2a50|0d 82 71 ef 21 24 ef 25 9c 98 56 21 93 a4 5a ea|..q.!$.%..V!..Z.|
* |until 0x2ac0.5 (128) | |
| | | [11]: partition {} 0x2ac0.6-0x2b3e.3 (125.6)
| | | count: 128 0x2ac0.6-NA (0)
0x2ac0|41 93 |A. | rice_parameter: 6 0x2ac0.6-0x2ac1.1 (0.4)
0x2ac0| 93 ef c5 30 8b 47 23 6b a3 ed 35 68 76 b0 76| ...0.G#k..5hv.v| samples: 4fbf14c22d1c8dae8fb4d5a1dac1d977... 0x2ac1.2-0x2b3e.3 (125.2)
0x2ad0|5d e1 35 15 c9 d6 97 48 0f 33 1b 14 60 0b 94 86|].5....H.3..`...|
* |until 0x2b3e.3 (126) | |
| | | [12]: partition {} 0x2b3e.4-0x2bbe.2 (127.7)
| | | count: 128 0x2b3e.4-NA (0)
0x2b30| e6 | . | rice_parameter: 6 0x2b3e.4-0x2b3e.7 (0.4)
0x2b30| 92| .| samples: 92caf959dde1a38ce98e0d87798dd510... 0x2b3f-0x2bbe.2 (127.3)
0x2b40|ca f9 59 dd e1 a3 8c e9 8e 0d 87 79 8d d5 10 ce|..Y........y....|
* |until 0x2bbe.2 (128) | |
| | | [13]: partition {} 0x2bbe.3-0x2c3b.5 (125.3)
| | | count: 128 0x2bbe.3-NA (0)
0x2bb0| 0d | . | rice_parameter: 6 0x2bbe.3-0x2bbe.6 (0.4)
0x2bb0| 0d 5c| .\| samples: ae46ca72919269a86faa211f17b49019... 0x2bbe.7-0x2c3b.5 (124.7)
0x2bc0|8d 94 e5 23 24 d3 50 df 54 42 3e 2f 69 20 33 95|...#$.P.TB>/i 3.|
* |until 0x2c3b.5 (125) | |
| | | [14]: partition {} 0x2c3b.6-0x2cb9.5 (126)
| | | count: 128 0x2c3b.6-NA (0)
0x2c30| 25 94 | %. | rice_parameter: 6 0x2c3b.6-0x2c3c.1 (0.4)
0x2c30| 94 8e 8b 4c| ...L| samples: 523a2d332b19ee25e71c508d0541828b... 0x2c3c.2-0x2cb9.5 (125.4)
0x2c40|ca c6 7b 89 79 c7 14 23 41 50 60 a2 d7 8d 0e a4|..{.y..#AP`.....|
* |until 0x2cb9.5 (126) | |
| | | [15]: partition {} 0x2cb9.6-0x2d37.5 (126)
| | | count: 128 0x2cb9.6-NA (0)
0x2cb0| 19 b2 | .. | rice_parameter: 6 0x2cb9.6-0x2cba.1 (0.4)
0x2cb0| b2 b5 21 a6 54 1a| ..!.T.| samples: cad48699506b47a0797e4c241d682493... 0x2cba.2-0x2d37.5 (125.4)
0x2cc0|d1 e8 1e 5f 93 09 07 5a 09 24 f4 49 1a 65 35 13|..._...Z.$.I.e5.|
* |until 0x2d37.5 (126) | |
| | | [16]: partition {} 0x2d37.6-0x2db4.7 (125.2)
| | | count: 128 0x2d37.6-NA (0)
0x2d30| 51 97 | Q. | rice_parameter: 6 0x2d37.6-0x2d38.1 (0.4)
0x2d30| 97 eb c6 34 15 95 9d 2b| ...4...+| samples: 5faf18d0565674aeff2362f6323abf28... 0x2d38.2-0x2db4.7 (124.6)
0x2d40|bf c8 d8 bd 8c 8e af ca 21 bf 6d e8 e6 fb d4 db|........!.m.....|
* |until 0x2db4.7 (125) | |
| | | [17]: partition {} 0x2db5-0x2e32.7 (126)
| | | count: 128 0x2db5-NA (0)
0x2db0| 62 | b | rice_parameter: 6 0x2db5-0x2db5.3 (0.4)
0x2db0| 62 2c 14 6b 59 52 e1 fd 3b 9c 6e| b,.kYR..;.n| samples: 22c146b5952e1fd3b9c6e1b3d4c27798... 0x2db5.4-0x2e32.7 (125.4)
0x2dc0|1b 3d 4c 27 79 87 ec c0 eb 2c be 4c 27 5a 24 9b|.=L'y....,.L'Z$.|
* |until 0x2e32.7 (126) | |
| | | [18]: partition {} 0x2e33-0x2eb1.7 (127)
| | | count: 128 0x2e33-NA (0)
0x2e30| 66 | f | rice_parameter: 6 0x2e33-0x2e33.3 (0.4)
0x2e30| 66 e9 22 de 46 5c bc 50 e1 0f 31 c9 f8| f.".F\.P..1..| samples: 6e922de465cbc50e10f31c9f806c9717... 0x2e33.4-0x2eb1.7 (126.4)
0x2e40|06 c9 71 78 b2 e1 20 c3 2f f0 6c 39 8a 5f e9 78|..qx.. ./.l9._.x|
* |until 0x2eb1.7 (127) | |
| | | [19]: partition {} 0x2eb2-0x2f31 (127.1)
| | | count: 128 0x2eb2-NA (0)
0x2eb0| 64 | d | rice_parameter: 6 0x2eb2-0x2eb2.3 (0.4)
0x2eb0| 64 51 48 b0 24 74 bf 0a 71 f0 83 65 2c 99| dQH.$t..q..e,.| samples: 45148b02474bf0a71f083652c9996f38... 0x2eb2.4-0x2f31 (126.5)
0x2ec0|96 f3 82 79 39 e3 35 31 2a c1 02 46 d9 33 9f e7|...y9.51*..F.3..|
* |until 0x2f31 (127) | |
| | | [20]: partition {} 0x2f31.1-0x2fb1 (128)
| | | count: 128 0x2f31.1-NA (0)
0x2f30| b6 | . | rice_parameter: 6 0x2f31.1-0x2f31.4 (0.4)
0x2f30| b6 95 44 93 cc d7 c9 19 d2 0a 89 76 16 df 54| ..D........v..T| samples: d2a892799af9233a41512ec2dbea8b2c... 0x2f31.5-0x2fb1 (127.4)
0x2f40|59 65 29 20 12 e6 55 65 a7 05 0a b4 54 68 49 3b|Ye) ..Ue....ThI;|
* |until 0x2fb1 (128) | |
| | | [21]: partition {} 0x2fb1.1-0x3031.2 (128.2)
| | | count: 128 0x2fb1.1-NA (0)
0x2fb0| b6 | . | rice_parameter: 6 0x2fb1.1-0x2fb1.4 (0.4)
0x2fb0| b6 e5 88 91 cb 0a 07 1a a2 11 d8 c2 4f 31 f7| ............O1.| samples: dcb112396140e354423b1849e63eef47... 0x2fb1.5-0x3031.2 (127.6)
0x2fc0|7a 3d 9b f4 2d 3a de 4d 5e 8c 46 c2 25 3b 46 2f|z=..-:.M^.F.%;F/|
* |until 0x3031.2 (128) | |
| | | [22]: partition {} 0x3031.3-0x30b0.2 (127)
| | | count: 128 0x3031.3-NA (0)
0x3030| 2d | - | rice_parameter: 6 0x3031.3-0x3031.6 (0.4)
0x3030| 2d 3d 8b d1 4e 22 d9 d2 a9 79 e1 17 6d c6 da| -=..N"...y..m..| samples: 9ec5e8a7116ce954bcf08bb6e36d74e9... 0x3031.7-0x30b0.2 (126.4)
0x3040|e9 d2 ec ec ca 84 ea 2c 5a e6 a1 98 de 7c 17 e7|.......,Z....|..|
* |until 0x30b0.2 (127) | |
| | | [23]: partition {} 0x30b0.3-0x312e (125.6)
| | | count: 128 0x30b0.3-NA (0)
0x30b0|6d |m | rice_parameter: 6 0x30b0.3-0x30b0.6 (0.4)
0x30b0|6d d0 e0 9e 62 7b 4d f6 43 90 a8 bf 76 83 a1 4e|m...b{M.C...v..N| samples: e8704f313da6fb21c8545fbb41d0a727... 0x30b0.7-0x312e (125.2)
0x30c0|4f b2 09 85 25 a2 49 a6 13 88 98 e9 57 34 86 81|O...%.I.....W4..|
* |until 0x312e (126) | |
| | | [24]: partition {} 0x312e.1-0x31ad (127)
| | | count: 128 0x312e.1-NA (0)
0x3120| b7 | . | rice_parameter: 6 0x312e.1-0x312e.4 (0.4)
0x3120| b7 7c| .|| samples: ef91c8ae635d2c10c653f64f0211113d... 0x312e.5-0x31ad (126.4)
0x3130|8e 45 73 1a e9 60 86 32 9f b2 78 10 88 89 e9 1e|.Es..`.2..x.....|
* |until 0x31ad (127) | |
| | | [25]: partition {} 0x31ad.1-0x322a.4 (125.4)
| | | count: 128 0x31ad.1-NA (0)
0x31a0| b4 | . | rice_parameter: 6 0x31ad.1-0x31ad.4 (0.4)
0x31a0| b4 38 18| .8.| samples: 87031a8d72d97224d23f48de965b448d... 0x31ad.5-0x322a.4 (125)
0x31b0|d4 6b 96 cb 91 26 91 fa 46 f4 b2 da 24 6d 63 5a|.k...&..F...$mcZ|
* |until 0x322a.4 (125) | |
| | | [26]: partition {} 0x322a.5-0x32a8.1 (125.5)
| | | count: 128 0x322a.5-NA (0)
0x3220| 13 1a | .. | rice_parameter: 6 0x322a.5-0x322b (0.4)
0x3220| 1a 61 29 b8 8c| .a)..| samples: 34c25371185ea6bbe112df902df36350... 0x322b.1-0x32a8.1 (125.1)
0x3230|2f 53 5d f0 89 6f c8 16 f9 b1 a8 24 9d 70 6d fa|/S]..o.....$.pm.|
* |until 0x32a8.1 (126) | |
| | | [27]: partition {} 0x32a8.2-0x3327.1 (127)
| | | count: 128 0x32a8.2-NA (0)
0x32a0| 5a | Z | rice_parameter: 6 0x32a8.2-0x32a8.5 (0.4)
0x32a0| 5a 0f 6f f3 84 a8 4f b1| Z.o...O.| samples: 83dbfce12a13ec61692118eed29df557... 0x32a8.6-0x3327.1 (126.4)
0x32b0|85 a4 84 63 bb 4a 77 d5 5e 67 d1 2e 5c a8 b0 8a|...c.Jw.^g..\...|
* |until 0x3327.1 (127) | |
| | | [28]: partition {} 0x3327.2-0x33a6.1 (127)
| | | count: 128 0x3327.2-NA (0)
0x3320| 5b | [ | rice_parameter: 6 0x3327.2-0x3327.5 (0.4)
0x3320| 5b ab 6c 5c 9b 97 35 18 09| [.l\..5..| samples: eadb1726e5cd4602797628e3b8bb12c2... 0x3327.6-0x33a6.1 (126.4)
0x3330|e5 d8 a3 8e e2 ec 4b 08 ba 05 fa 6b d2 84 dd 88|......K....k....|
* |until 0x33a6.1 (127) | |
| | | [29]: partition {} 0x33a6.2-0x3426.3 (128.2)
| | | count: 128 0x33a6.2-NA (0)
0x33a0| db | . | rice_parameter: 6 0x33a6.2-0x33a6.5 (0.4)
0x33a0| db a3 82 85 fc c9 a2 a1 85 1e| ..........| samples: e8e0a17f3268a86147bc7f653322216c... 0x33a6.6-0x3426.3 (127.6)
0x33b0|f1 fd 94 cc 88 85 b0 43 16 72 ab a6 9b 88 ab 3b|.......C.r.....;|
* |until 0x3426.3 (128) | |
| | | [30]: partition {} 0x3426.4-0x34a6.1 (127.6)
| | | count: 128 0x3426.4-NA (0)
0x3420| e6 | . | rice_parameter: 6 0x3426.4-0x3426.7 (0.4)
0x3420| 8c 26 ca 57 44 1a f1 6d 53| .&.WD..mS| samples: 8c26ca57441af16d53dc8b24c62ec040... 0x3427-0x34a6.1 (127.2)
0x3430|dc 8b 24 c6 2e c0 40 62 c9 f4 c0 5a 84 80 2b 96|..$...@b...Z..+.|
* |until 0x34a6.1 (128) | |
| | | [31]: partition {} 0x34a6.2-0x3523.6 (125.5)
| | | count: 128 0x34a6.2-NA (0)
0x34a0| 1a | . | rice_parameter: 6 0x34a6.2-0x34a6.5 (0.4)
0x34a0| 1a bc 2f 37 bd 4e 48 a9 48 89| ../7.NH.H.| samples: af0bcdef53922a5222452b754c74654c... 0x34a6.6-0x3523.6 (125.1)
0x34b0|14 ad d5 31 d1 95 30 86 81 ba 42 c3 df 23 69 5c|...1..0...B..#i\|
* |until 0x3523.6 (126) | |
| | | [1]: subframe {} 0x3523.7-0x4626.5 (4354.7)
0x3520| 94 | . | zero_bit: Correct (0x0) 0x3523.7-0x3523.7 (0.1)
0x3520| 81 | . | subframe_type: LPC (3) 0x3524-0x3524.5 (0.6)
| | | lpc_order: 1 0x3524.6-NA (0)
0x3520| 81 | . | wasted_bits_flag: 0 0x3524.6-0x3524.6 (0.1)
| | | subframe_sample_size: 9 0x3524.7-NA (0)
| | | warmup_samples: [1] 0x3524.7-0x3525.7 (1.1)
0x3520| 81 f4 | .. | [0]: value -12 0x3524.7-0x3525.7 (1.1)
0x3520| 57 | W | precision: 6 0x3526-0x3526.3 (0.4)
0x3520| 57 90 | W. | shift: 15 0x3526.4-0x3527 (0.5)
| | | coefficients: [1] 0x3527.1-0x3527.6 (0.6)
0x3520| 90 | . | [0]: value 8 0x3527.1-0x3527.6 (0.6)
0x3520| 90 2a | .* | residual_coding_method: rice (4) 0x3527.7-0x3528 (0.2)
0x3520| 2a | * | partition_order: 5 0x3528.1-0x3528.4 (0.4)
| | | rice_partitions: 32 0x3528.5-NA (0)
| | | partitions: [32] 0x3528.5-0x4626.5 (4350.1)
| | | [0]: partition {} 0x3528.5-0x3588.5 (96.1)
| | | count: 127 0x3528.5-NA (0)
0x3520| 2a 27 | *' | rice_parameter: 4 0x3528.5-0x3529 (0.4)
0x3520| 27 fe ef 37 9c 63 09| '..7.c.| samples: 4ffdde6f38c61295296c635ac6318c62... 0x3529.1-0x3588.5 (95.5)
0x3530|4a 94 b6 31 ad 63 18 c6 31 6a 4a 10 8c 67 9d f7|J..1.c..1jJ..g..|
* |until 0x3588.5 (96) | |
| | | [1]: partition {} 0x3588.6-0x35ec.5 (100)
| | | count: 128 0x3588.6-NA (0)
0x3580| 4d 04 | M. | rice_parameter: 4 0x3588.6-0x3589.1 (0.4)
0x3580| 04 c4 c4 c4 c4 c4 c4| .......| samples: 1313131313131111113e74e992e54991... 0x3589.2-0x35ec.5 (99.4)
0x3590|44 44 4f 9d 3a 64 b9 52 64 5d 65 75 51 fe 6f 58|DDO.:d.Rd]euQ.oX|
* |until 0x35ec.5 (100) | |
| | | [2]: partition {} 0x35ec.6-0x364e.4 (97.7)
| | | count: 128 0x35ec.6-NA (0)
0x35e0| 69 0c | i. | rice_parameter: 4 0x35ec.6-0x35ed.1 (0.4)
0x35e0| 0c 14 24| ..$| samples: 305091071a616510f7358b5252942108... 0x35ed.2-0x364e.4 (97.3)
0x35f0|41 c6 98 59 44 3d cd 62 d4 94 a5 08 42 10 84 21|A..YD=.b....B..!|
* |until 0x364e.4 (98) | |
| | | [3]: partition {} 0x364e.5-0x36b2.6 (100.2)
| | | count: 128 0x364e.5-NA (0)
0x3640| b2 18| ..| rice_parameter: 4 0x364e.5-0x364f (0.4)
0x3640| 18| .| samples: 3068c183060b162c58a1220f38c2ca24... 0x364f.1-0x36b2.6 (99.6)
0x3650|34 60 c1 83 05 8b 16 2c 50 91 07 9c 61 65 12 43|4`.....,P...ae.C|
* |until 0x36b2.6 (100) | |
| | | [4]: partition {} 0x36b2.7-0x371f.7 (109.1)
| | | count: 128 0x36b2.7-NA (0)
0x36b0| 3a aa | :. | rice_parameter: 5 0x36b2.7-0x36b3.2 (0.4)
0x36b0| aa d4 a7 46 87 fe f9 d7 3c 6f ae 99 e5| ...F....<o...| samples: 56a53a343ff7ceb9e37d74cf2c70c304... 0x36b3.3-0x371f.7 (108.5)
0x36c0|8e 18 60 8a 08 20 82 08 20 82 18 20 86 39 67 a6|..`.. .. .. .9g.|
* |until 0x371f.7 (109) | |
| | | [5]: partition {} 0x3720-0x37ae.2 (142.3)
| | | count: 128 0x3720-NA (0)
0x3720|7f |. | rice_parameter: 7 0x3720-0x3720.3 (0.4)
0x3720|7f 1e bf 49 ef 6d bb c7 4a dd 0b 10 f4 3a ec fd|...I.m..J....:..| samples: f1ebf49ef6dbbc74add0b10f43aecfde... 0x3720.4-0x37ae.2 (141.7)
0x3730|eb a8 0a cd ee 1c 61 88 40 2c 8f cd 1c 12 1c 62|......a.@,.....b|
* |until 0x37ae.2 (142) | |
| | | [6]: partition {} 0x37ae.3-0x383c.2 (142)
| | | count: 128 0x37ae.3-NA (0)
0x37a0| 6e | n | rice_parameter: 7 0x37ae.3-0x37ae.6 (0.4)
0x37a0| 6e 59| nY| samples: 2c921914c344904b16a240842579c562... 0x37ae.7-0x383c.2 (141.4)
0x37b0|24 32 29 86 89 20 96 2d 44 81 08 4a f3 8a c4 99|$2).. .-D..J....|
* |until 0x383c.2 (142) | |
| | | [7]: partition {} 0x383c.3-0x38ca.4 (142.2)
| | | count: 128 0x383c.3-NA (0)
0x3830| 0f | . | rice_parameter: 7 0x383c.3-0x383c.6 (0.4)
0x3830| 0f 66 41 51| .fAQ| samples: b320a89782e06892ad84aa8cd655ef12... 0x383c.7-0x38ca.4 (141.6)
0x3840|2f 05 c0 d1 25 5b 09 55 19 ac ab de 24 d5 31 c9|/...%[.U....$.1.|
* |until 0x38ca.4 (142) | |
| | | [8]: partition {} 0x38ca.5-0x395a (143.4)
| | | count: 128 0x38ca.5-NA (0)
0x38c0| cb 98 | .. | rice_parameter: 7 0x38ca.5-0x38cb (0.4)
0x38c0| 98 62 f9 f7 c6| .b...| samples: 30c5f3ef8db38b3a451ad6822b004e5a... 0x38cb.1-0x395a (143)
0x38d0|d9 c5 9d 22 8d 6b 41 15 80 27 2d 6a de c7 32 15|...".kA..'-j..2.|
* |until 0x395a (143) | |
| | | [9]: partition {} 0x395a.1-0x39e8.7 (142.7)
| | | count: 128 0x395a.1-NA (0)
0x3950| bf | . | rice_parameter: 7 0x395a.1-0x395a.4 (0.4)
0x3950| bf 87 9c 6a 9f c6| ...j..| samples: f0f38d53f8c3f642d042a6ca4faa32ed... 0x395a.5-0x39e8.7 (142.3)
0x3960|1f b2 16 82 15 36 52 7d 51 97 6c e6 d2 3c 5f a5|.....6R}Q.l..<_.|
* |until 0x39e8.7 (143) | |
| | | [10]: partition {} 0x39e9-0x3a77.6 (142.7)
| | | count: 128 0x39e9-NA (0)
0x39e0| 76 | v | rice_parameter: 7 0x39e9-0x39e9.3 (0.4)
0x39e0| 76 a9 12 41 ba 76 5f| v..A.v_| samples: 6a91241ba765f89c4059b5a4897c8eba... 0x39e9.4-0x3a77.6 (142.3)
0x39f0|89 c4 05 9b 5a 48 97 c8 eb ac 9a e0 e3 54 b5 d0|....ZH.......T..|
* |until 0x3a77.6 (143) | |
| | | [11]: partition {} 0x3a77.7-0x3b05.5 (141.7)
| | | count: 128 0x3a77.7-NA (0)
0x3a70| fa f7 | .. | rice_parameter: 7 0x3a77.7-0x3a78.2 (0.4)
0x3a70| f7 2c 8b ea 7a 4b 58 74| .,..zKXt| samples: b9645f53d25ac3a753027de064295dcb... 0x3a78.3-0x3b05.5 (141.3)
0x3a80|ea 60 4f bc 0c 85 2b b9 67 d3 05 31 c0 a7 c4 6c|.`O...+.g..1...l|
* |until 0x3b05.5 (142) | |
| | | [12]: partition {} 0x3b05.6-0x3b93.3 (141.6)
| | | count: 128 0x3b05.6-NA (0)
0x3b00| 3d f6 | =. | rice_parameter: 7 0x3b05.6-0x3b06.1 (0.4)
0x3b00| f6 1e 4b 1a 6e 56 cf 9c c9 1d| ..K.nV....| samples: d8792c69b95b3e7324761651250b7900... 0x3b06.2-0x3b93.3 (141.2)
0x3b10|85 94 49 42 de 40 08 23 33 c1 bf ac 84 2b f3 e9|..IB.@.#3....+..|
* |until 0x3b93.3 (142) | |
| | | [13]: partition {} 0x3b93.4-0x3c21.7 (142.4)
| | | count: 128 0x3b93.4-NA (0)
0x3b90| 57 | W | rice_parameter: 7 0x3b93.4-0x3b93.7 (0.4)
0x3b90| 89 6a 0a 6d f6 f9 0f d7 fd 2f 01 6f| .j.m...../.o| samples: 896a0a6df6f90fd7fd2f016facd33c9d... 0x3b94-0x3c21.7 (142)
0x3ba0|ac d3 3c 9d bc ca 56 73 fd 35 3d 41 8e 94 d3 3c|..<...Vs.5=A...<|
* |until 0x3c21.7 (142) | |
| | | [14]: partition {} 0x3c22-0x3cb0.6 (142.7)
| | | count: 128 0x3c22-NA (0)
0x3c20| 75 | u | rice_parameter: 7 0x3c22-0x3c22.3 (0.4)
0x3c20| 75 6f 5c 99 0c a8 91 43 ed 1e f0 14 f2 ea| uo\....C......| samples: 56f5c990ca89143ed1ef014f2ea085e2... 0x3c22.4-0x3cb0.6 (142.3)
0x3c30|08 5e 29 67 ad df 51 c8 72 f3 5d 42 c9 62 dc d3|.^)g..Q.r.]B.b..|
* |until 0x3cb0.6 (143) | |
| | | [15]: partition {} 0x3cb0.7-0x3d3f.6 (143)
| | | count: 128 0x3cb0.7-NA (0)
0x3cb0|da e9 |.. | rice_parameter: 7 0x3cb0.7-0x3cb1.2 (0.4)
0x3cb0| e9 ec 8b 43 28 45 c2 97 62 c6 a2 67 1d ad 1e| ...C(E..b..g...| samples: 4f645a19422e14bb16351338ed68f2d0... 0x3cb1.3-0x3d3f.6 (142.4)
0x3cc0|5a 10 52 a6 53 40 4e be d3 b0 9b f5 d4 ae 59 3a|Z.R.S@N.......Y:|
* |until 0x3d3f.6 (143) | |
| | | [16]: partition {} 0x3d3f.7-0x3dd0.7 (145.1)
| | | count: 128 0x3d3f.7-NA (0)
0x3d30| 1a| .| rice_parameter: 7 0x3d3f.7-0x3d40.2 (0.4)
0x3d40|e8 |. |
0x3d40|e8 02 30 c5 4d 30 30 d4 46 e4 6f e7 3e d9 a5 38|..0.M00.F.o.>..8| samples: 4011862a698186a237237f39f6cd29c7... 0x3d40.3-0x3dd0.7 (144.5)
0x3d50|ec ca 2c 14 0a 0c 83 8f 9d 5c d9 dd 62 90 0a 97|..,......\..b...|
* |until 0x3dd0.7 (145) | |
| | | [17]: partition {} 0x3dd1-0x3e5e.6 (141.7)
| | | count: 128 0x3dd1-NA (0)
0x3dd0| 75 | u | rice_parameter: 7 0x3dd1-0x3dd1.3 (0.4)
0x3dd0| 75 d1 d9 98 f0 d2 80 4e 92 1b dc 29 f4 93 a0| u......N...)...| samples: 5d1d998f0d2804e921bdc29f493a0a4d... 0x3dd1.4-0x3e5e.6 (141.3)
0x3de0|a4 dc c5 49 9b 28 8f 7b 59 cb d8 42 dd 29 f2 7a|...I.(.{Y..B.).z|
* |until 0x3e5e.6 (142) | |
| | | [18]: partition {} 0x3e5e.7-0x3eed.1 (142.3)
| | | count: 128 0x3e5e.7-NA (0)
0x3e50| 8c ee| ..| rice_parameter: 7 0x3e5e.7-0x3e5f.2 (0.4)
0x3e50| ee| .| samples: 770c7872b546b68fc21b504382768632... 0x3e5f.3-0x3eed.1 (141.7)
0x3e60|e1 8f 0e 56 a8 d6 d1 f8 43 6a 08 70 4e d0 c6 57|...V....Cj.pN..W|
* |until 0x3eed.1 (142) | |
| | | [19]: partition {} 0x3eed.2-0x3f7c (142.7)
| | | count: 128 0x3eed.2-NA (0)
0x3ee0| 1d | . | rice_parameter: 7 0x3eed.2-0x3eed.5 (0.4)
0x3ee0| 1d 97 8a| ...| samples: 65e2a8bb18072b9061553ae38d3ad211... 0x3eed.6-0x3f7c (142.3)
0x3ef0|a2 ec 60 1c ae 41 85 54 eb 8e 34 eb 48 44 7b 29|..`..A.T..4.HD{)|
* |until 0x3f7c (143) | |
| | | [20]: partition {} 0x3f7c.1-0x400a.4 (142.4)
| | | count: 128 0x3f7c.1-NA (0)
0x3f70| be | . | rice_parameter: 7 0x3f7c.1-0x3f7c.4 (0.4)
0x3f70| be 1a e7 bb| ....| samples: c35cf777c231c5e8aadc4027381aaea9... 0x3f7c.5-0x400a.4 (142)
0x3f80|be 11 8e 2f 45 56 e2 01 39 c0 d5 75 4f f2 9d ae|.../EV..9..uO...|
* |until 0x400a.4 (142) | |
| | | [21]: partition {} 0x400a.5-0x4099.5 (143.1)
| | | count: 128 0x400a.5-NA (0)
0x4000| 53 91 | S. | rice_parameter: 7 0x400a.5-0x400b (0.4)
0x4000| 91 0c d1 be a4| .....| samples: 2219a37d49bc5dd44deb675053cd1cef... 0x400b.1-0x4099.5 (142.5)
0x4010|de 2e ea 26 f5 b3 a8 29 e6 8e 77 d4 bc ea fb 85|...&...)..w.....|
* |until 0x4099.5 (143) | |
| | | [22]: partition {} 0x4099.6-0x4128.6 (143.1)
| | | count: 128 0x4099.6-NA (0)
0x4090| b5 da | .. | rice_parameter: 7 0x4099.6-0x409a.1 (0.4)
0x4090| da 9c 6b 0d 21 b4| ..k.!.| samples: 6a71ac3486d3c350d94ed3b48f99343c... 0x409a.2-0x4128.6 (142.5)
0x40a0|f0 d4 36 53 b4 ed 23 e6 4d 0f 0e 98 a4 15 f0 fa|..6S..#.M.......|
* |until 0x4128.6 (143) | |
| | | [23]: partition {} 0x4128.7-0x41b5.7 (141.1)
| | | count: 128 0x4128.7-NA (0)
0x4120| 86 ec | .. | rice_parameter: 7 0x4128.7-0x4129.2 (0.4)
0x4120| ec 2c fe 55 83 3e fc| .,.U.>.| samples: 6167f2ac19f7e6477b1f62484a32b227... 0x4129.3-0x41b5.7 (140.5)
0x4130|c8 ef 63 ec 49 09 46 56 44 ef 4a b1 71 90 e1 d3|..c.I.FVD.J.q...|
* |until 0x41b5.7 (141) | |
| | | [24]: partition {} 0x41b6-0x4244.3 (142.4)
| | | count: 128 0x41b6-NA (0)
0x41b0| 72 | r | rice_parameter: 7 0x41b6-0x41b6.3 (0.4)
0x41b0| 72 3c 89 6a ad f6 f5 6b 30 23| r<.j...k0#| samples: 23c896aadf6f56b302371216aaee0d88... 0x41b6.4-0x4244.3 (142)
0x41c0|71 21 6a ae e0 d8 8c 83 3a 7e 6c 46 30 ec a9 53|q!j.....:~lF0..S|
* |until 0x4244.3 (142) | |
| | | [25]: partition {} 0x4244.4-0x42d3.7 (143.4)
| | | count: 128 0x4244.4-NA (0)
0x4240| c7 | . | rice_parameter: 7 0x4244.4-0x4244.7 (0.4)
0x4240| f1 29 8c e4 41 ff b3 48 32 08 85| .)..A..H2..| samples: f1298ce441ffb348320885ba6063fc45... 0x4245-0x42d3.7 (143)
0x4250|ba 60 63 fc 45 2a 6e f3 eb 3d b2 9f e4 3a 96 01|.`c.E*n..=...:..|
* |until 0x42d3.7 (143) | |
| | | [26]: partition {} 0x42d4-0x4362.6 (142.7)
| | | count: 128 0x42d4-NA (0)
0x42d0| 7b | { | rice_parameter: 7 0x42d4-0x42d4.3 (0.4)
0x42d0| 7b 53 77 13 86 5d 80 ed ae 48 f0 c9| {Sw..]...H..| samples: b537713865d80edae48f0c9f1d325142... 0x42d4.4-0x4362.6 (142.3)
0x42e0|f1 d3 25 14 29 47 87 6c 56 0e 22 2c c3 ca 58 15|..%.)G.lV.",..X.|
* |until 0x4362.6 (143) | |
| | | [27]: partition {} 0x4362.7-0x43f1.5 (142.7)
| | | count: 128 0x4362.7-NA (0)
0x4360| d8 e4 | .. | rice_parameter: 7 0x4362.7-0x4363.2 (0.4)
0x4360| e4 db 88 db f1 93 64 60 0b 19 f2 2b 8e| ......d`...+.| samples: 26dc46df8c9b230058cf915c748f3469... 0x4363.3-0x43f1.5 (142.3)
0x4370|91 e6 8d 3a 9e 92 f0 17 eb 83 98 e9 38 7b 89 92|...:........8{..|
* |until 0x43f1.5 (143) | |
| | | [28]: partition {} 0x43f1.6-0x447f.2 (141.5)
| | | count: 128 0x43f1.6-NA (0)
0x43f0| c9 d0 | .. | rice_parameter: 7 0x43f1.6-0x43f2.1 (0.4)
0x43f0| d0 1d 62 97 4f f2 e1 23 85 e3 f2 30 a1 90| ..b.O..#...0..| samples: 40758a5d3fcb848e178fc8c286404c88... 0x43f2.2-0x447f.2 (141.1)
0x4400|13 22 1d 2d d9 01 70 34 ab 2d a0 76 71 26 52 05|.".-..p4.-.vq&R.|
* |until 0x447f.2 (142) | |
| | | [29]: partition {} 0x447f.3-0x450a.4 (139.2)
| | | count: 128 0x447f.3-NA (0)
0x4470| cf| .| rice_parameter: 7 0x447f.3-0x447f.6 (0.4)
0x4470| cf| .| samples: d47f359d87213b011bd4f5e4e0f85a90... 0x447f.7-0x450a.4 (138.6)
0x4480|a8 fe 6b 3b 0e 42 76 02 37 a9 eb c9 c1 f0 b5 21|..k;.Bv.7......!|
* |until 0x450a.4 (139) | |
| | | [30]: partition {} 0x450a.5-0x4598.3 (141.7)
| | | count: 128 0x450a.5-NA (0)
0x4500| bb 8c | .. | rice_parameter: 7 0x450a.5-0x450b (0.4)
0x4500| 8c 8d 7f 2b 32| ...+2| samples: 191afe5664940f85734973d6e5f09318... 0x450b.1-0x4598.3 (141.3)
0x4510|4a 07 c2 b9 a4 b9 eb 72 f8 49 8c 43 03 e4 91 9e|J......r.I.C....|
* |until 0x4598.3 (142) | |
| | | [31]: partition {} 0x4598.4-0x4626.5 (142.2)
| | | count: 128 0x4598.4-NA (0)
0x4590| 27 | ' | rice_parameter: 7 0x4598.4-0x4598.7 (0.4)
0x4590| dc 2f ed f6 8b dc 43| ./....C| samples: dc2fedf68bdc4380d4ddc836ab48a251... 0x4599-0x4626.5 (141.6)
0x45a0|80 d4 dd c8 36 ab 48 a2 51 a1 03 f6 86 a3 fe 71|....6.H.Q......q|
* |until 0x4626.5 (142) | |
0x4620| 40 | @ | byte_align: Correct (0x0) 0x4626.6-0x4626.7 (0.2)
0x4620| 83 11 | .. | footer_crc: Correct (8311) 0x4627-0x4628.7 (2)
| | | [3]: frame {} (flac_frame) 0x4629-0x541f.7 (3575)
| | | header: {} 0x4629-0x462e.7 (6)
0x4620| ff f8 | .. | sync: Correct (0x3ffe) 0x4629-0x462a.5 (1.6)
0x4620| f8 | . | reserved0: Correct (0x0) 0x462a.6-0x462a.6 (0.1)
0x4620| f8 | . | blocking_strategy: Fixed (0) 0x462a.7-0x462a.7 (0.1)
0x4620| c9 | . | block_size: 4096 0x462b-0x462b.3 (0.4)
0x4620| c9 | . | sample_rate: 44100 0x462b.4-0x462b.7 (0.4)
0x4620| 12 | . | channel_assignment: left, right (2) 0x462c-0x462c.3 (0.4)
0x4620| 12 | . | sample_size: 8 0x462c.4-0x462c.6 (0.3)
0x4620| 12 | . | reserved1: Correct (0x0) 0x462c.7-0x462c.7 (0.1)
| | | end_of_header: {} 0x462d-0x462d.7 (1)
0x4620| 03 | . | frame_number: 3 0x462d-0x462d.7 (1)
0x4620| 49 | I | crc: Correct (49) 0x462e-0x462e.7 (1)
| | | subframes: [2] 0x462f-0x541d.5 (3566.6)
| | | [0]: subframe {} 0x462f-0x4e0c.7 (2014)
0x4620| 12| .| zero_bit: Correct (0x0) 0x462f-0x462f (0.1)
0x4620| 12| .| subframe_type: Fixed (2) 0x462f.1-0x462f.6 (0.6)
| | | lpc_order: 1 0x462f.7-NA (0)
0x4620| 12| .| wasted_bits_flag: 0 0x462f.7-0x462f.7 (0.1)
| | | subframe_sample_size: 8 0x4630-NA (0)
| | | warmup_samples: [1] 0x4630-0x4630.7 (1)
0x4630|14 |. | [0]: value 20 0x4630-0x4630.7 (1)
0x4630| 11 | . | residual_coding_method: rice (4) 0x4631-0x4631.1 (0.2)
0x4630| 11 | . | partition_order: 4 0x4631.2-0x4631.5 (0.4)
| | | rice_partitions: 16 0x4631.6-NA (0)
| | | partitions: [16] 0x4631.6-0x4e0c.7 (2011.2)
| | | [0]: partition {} 0x4631.6-0x474e.5 (285)
| | | count: 255 0x4631.6-NA (0)
0x4630| 11 d5 | .. | rice_parameter: 7 0x4631.6-0x4632.1 (0.4)
0x4630| d5 12 05 2e 9e 78 a6 30 4d 22 76 27 d4 56| .....x.0M"v'.V| samples: 544814ba79e298c13489d89f51589971... 0x4632.2-0x474e.5 (284.4)
0x4640|26 5c 73 ca e4 01 96 5f 40 a9 e9 da 14 f1 7b f7|&\s...._@.....{.|
* |until 0x474e.5 (285) | |
| | | [1]: partition {} 0x474e.6-0x486b.2 (284.5)
| | | count: 256 0x474e.6-NA (0)
0x4740| 15 ca| ..| rice_parameter: 7 0x474e.6-0x474f.1 (0.4)
0x4740| ca| .| samples: 2b0b1da70c2b1a46b97daa469b8dbac7... 0x474f.2-0x486b.2 (284.1)
0x4750|c2 c7 69 c3 0a c6 91 ae 5f 6a 91 a6 e3 6e b1 c2|..i....._j...n..|
* |until 0x486b.2 (285) | |
| | | [2]: partition {} 0x486b.3-0x4985.3 (282.1)
| | | count: 256 0x486b.3-NA (0)
0x4860| 4f | O | rice_parameter: 7 0x486b.3-0x486b.6 (0.4)
0x4860| 4f 88 af 76 95| O..v.| samples: c457bb4ac567188719021519a1c71b77... 0x486b.7-0x4985.3 (281.5)
0x4870|8a ce 31 0e 32 04 2a 33 43 8e 36 ef 63 a9 03 43|..1.2.*3C.6.c..C|
* |until 0x4985.3 (282) | |
| | | [3]: partition {} 0x4985.4-0x4a8e.3 (265)
| | | count: 256 0x4985.4-NA (0)
0x4980| e6 | . | rice_parameter: 6 0x4985.4-0x4985.7 (0.4)
0x4980| 18 c6 c1 b5 c0 dd 6c 14 e5 82| ......l...| samples: 18c6c1b5c0dd6c14e5820282ffc1a6e1... 0x4986-0x4a8e.3 (264.4)
0x4990|02 82 ff c1 a6 e1 b8 b2 36 05 31 a8 2d d7 06 e1|........6.1.-...|
* |until 0x4a8e.3 (265) | |
| | | [4]: partition {} 0x4a8e.4-0x4ad8.2 (73.7)
| | | count: 256 0x4a8e.4-NA (0)
0x4a80| 20 | | rice_parameter: 0 0x4a8e.4-0x4a8e.7 (0.4)
0x4a80| 24| $| samples: 24933feb55455145455555bfcc992424... 0x4a8f-0x4ad8.2 (73.3)
0x4a90|93 3f eb 55 45 51 45 45 55 55 bf cc 99 24 24 90|.?.UEQEEUU...$$.|
* |until 0x4ad8.2 (74) | |
| | | [5]: partition {} 0x4ad8.3-0x4b23.4 (75.2)
| | | count: 256 0x4ad8.3-NA (0)
0x4ad0| 20 | | rice_parameter: 0 0x4ad8.3-0x4ad8.6 (0.4)
0x4ad0| 20 aa d7 fc c9 24 92 42| ....$.B| samples: 556bfe64924921242424849249267fd6... 0x4ad8.7-0x4b23.4 (74.6)
0x4ae0|48 48 49 09 24 92 4c ff ad 55 15 45 15 15 55 56|HHI.$.L..U.E..UV|
* |until 0x4b23.4 (75) | |
| | | [6]: partition {} 0x4b23.5-0x4b6d.6 (74.2)
| | | count: 256 0x4b23.5-NA (0)
0x4b20| 48 10 | H. | rice_parameter: 0 0x4b23.5-0x4b24 (0.4)
0x4b20| 10 92 64 cf f6 aa aa 8a 8a 2a 8a ab| ..d......*..| samples: 2124c99fed55551514551556bfe64924... 0x4b24.1-0x4b6d.6 (73.6)
0x4b30|5f f3 24 92 49 09 21 21 24 24 92 49 33 fe b5 54|_.$.I.!!$$.I3..T|
* |until 0x4b6d.6 (74) | |
| | | [7]: partition {} 0x4b6d.7-0x4bb8.5 (74.7)
| | | count: 256 0x4b6d.7-NA (0)
0x4b60| a2 0a | .. | rice_parameter: 0 0x4b6d.7-0x4b6e.2 (0.4)
0x4b60| 0a aa| ..| samples: 55556ff32649092424848492124c99fe... 0x4b6e.3-0x4bb8.5 (74.3)
0x4b70|ad fe 64 c9 21 24 84 90 90 92 42 49 93 3f da aa|..d.!$....BI.?..|
* |until 0x4bb8.5 (75) | |
| | | [8]: partition {} 0x4bb8.6-0x4c02.7 (74.2)
| | | count: 256 0x4bb8.6-NA (0)
0x4bb0| 24 08 | $. | rice_parameter: 0 0x4bb8.6-0x4bb9.1 (0.4)
0x4bb0| 08 49 24 92 67 fd 6a| .I$.g.j| samples: 212492499ff5aaa2a8a2a2aaaadfe64c... 0x4bb9.2-0x4c02.7 (73.6)
0x4bc0|a8 aa 28 a8 aa aa b7 f9 93 24 84 92 12 42 42 49|..(......$...BBI|
* |until 0x4c02.7 (74) | |
| | | [9]: partition {} 0x4c03-0x4c4d.4 (74.5)
| | | count: 256 0x4c03-NA (0)
0x4c00| 01 | . | rice_parameter: 0 0x4c03-0x4c03.3 (0.4)
0x4c00| 01 54 55 5a ff 99 24 92 48 49 09 09 21| .TUZ..$.HI..!| samples: 154555aff99249248490909212492499... 0x4c03.4-0x4c4d.4 (74.1)
0x4c10|24 92 49 9f f5 aa a2 a8 a2 a2 aa aa df e6 4c 92|$.I...........L.|
* |until 0x4c4d.4 (75) | |
| | | [10]: partition {} 0x4c4d.5-0x4c98.3 (74.7)
| | | count: 256 0x4c4d.5-NA (0)
0x4c40| 48 04 | H. | rice_parameter: 0 0x4c4d.5-0x4c4e (0.4)
0x4c40| 04 84| ..| samples: 090924249933fdaaaaa2a28aa2aad7fc... 0x4c4e.1-0x4c98.3 (74.3)
0x4c50|92 12 4c 99 fe d5 55 51 51 45 51 55 6b fe 64 92|..L...UQQEQUk.d.|
* |until 0x4c98.3 (75) | |
| | | [11]: partition {} 0x4c98.4-0x4ce2.5 (74.2)
| | | count: 256 0x4c98.4-NA (0)
0x4c90| 10 | . | rice_parameter: 0 0x4c98.4-0x4c98.7 (0.4)
0x4c90| 45 45 55 55 bf cc 99| EEUU...| samples: 45455555bfcc99242490921212484932... 0x4c99-0x4ce2.5 (73.6)
0x4ca0|24 24 90 92 12 12 48 49 32 67 fb 55 55 45 45 15|$$....HI2g.UUEE.|
* |until 0x4ce2.5 (74) | |
| | | [12]: partition {} 0x4ce2.6-0x4d2d.4 (74.7)
| | | count: 256 0x4ce2.6-NA (0)
0x4ce0| 24 08 | $. | rice_parameter: 0 0x4ce2.6-0x4ce3.1 (0.4)
0x4ce0| 08 48 49 09 24 92 4c ff ad 55 15 45 15| .HI.$.L..U.E.| samples: 21212424924933feb55455145455555b... 0x4ce3.2-0x4d2d.4 (74.3)
0x4cf0|15 55 56 ff 32 64 90 92 42 48 48 49 21 24 c9 9f|.UV.2d..BHHI!$..|
* |until 0x4d2d.4 (75) | |
| | | [13]: partition {} 0x4d2d.5-0x4d77.6 (74.2)
| | | count: 256 0x4d2d.5-NA (0)
0x4d20| a8 0a | .. | rice_parameter: 0 0x4d2d.5-0x4d2e (0.4)
0x4d20| 0a 8a| ..| samples: 1514551556bfe6492492124242484924... 0x4d2e.1-0x4d77.6 (73.6)
0x4d30|2a 8a ab 5f f3 24 92 49 09 21 21 24 24 92 49 33|*.._.$.I.!!$$.I3|
* |until 0x4d77.6 (74) | |
| | | [14]: partition {} 0x4d77.7-0x4dc3 (75.2)
| | | count: 256 0x4d77.7-NA (0)
0x4d70| 12 04 | .. | rice_parameter: 0 0x4d77.7-0x4d78.2 (0.4)
0x4d70| 04 84 90 90 92 42 49 93| .....BI.| samples: 2424848492124c99fed5555151455155... 0x4d78.3-0x4dc3 (74.6)
0x4d80|3f da aa aa 2a 28 aa 2a ad 7f cc 92 49 24 24 84|?...*(.*....I$$.|
* |until 0x4dc3 (75) | |
| | | [15]: partition {} 0x4dc3.1-0x4e0c.7 (73.7)
| | | count: 256 0x4dc3.1-NA (0)
0x4dc0| 80 | . | rice_parameter: 0 0x4dc3.1-0x4dc3.4 (0.4)
0x4dc0| 80 aa 28 a8 aa aa b7 f9 93 24 84 92 12| ..(......$...| samples: 154515155556ff326490924248484921... 0x4dc3.5-0x4e0c.7 (73.3)
0x4dd0|42 42 49 09 26 4c ff 6a aa a8 a8 a2 a8 aa b5 ff|BBI.&L.j........|
* |until 0x4e0c.7 (74) | |
| | | [1]: subframe {} 0x4e0d-0x541d.5 (1552.6)
0x4e00| 12 | . | zero_bit: Correct (0x0) 0x4e0d-0x4e0d (0.1)
0x4e00| 12 | . | subframe_type: Fixed (2) 0x4e0d.1-0x4e0d.6 (0.6)
| | | lpc_order: 1 0x4e0d.7-NA (0)
0x4e00| 12 | . | wasted_bits_flag: 0 0x4e0d.7-0x4e0d.7 (0.1)
| | | subframe_sample_size: 8 0x4e0e-NA (0)
| | | warmup_samples: [1] 0x4e0e-0x4e0e.7 (1)
0x4e00| bb | . | [0]: value -69 0x4e0e-0x4e0e.7 (1)
0x4e00| 09| .| residual_coding_method: rice (4) 0x4e0f-0x4e0f.1 (0.2)
0x4e00| 09| .| partition_order: 2 0x4e0f.2-0x4e0f.5 (0.4)
| | | rice_partitions: 4 0x4e0f.6-NA (0)
| | | partitions: [4] 0x4e0f.6-0x541d.5 (1550)
| | | [0]: partition {} 0x4e0f.6-0x5274.5 (1125)
| | | count: 1023 0x4e0f.6-NA (0)
0x4e00| 09| .| rice_parameter: 7 0x4e0f.6-0x4e10.1 (0.4)
0x4e10|fc |. |
0x4e10|fc 4c c7 2d 79 18 5a 91 08 12 58 f7 9c 39 1e eb|.L.-y.Z...X..9..| samples: f1331cb5e4616a44204963de70e47bae... 0x4e10.2-0x5274.5 (1124.4)
0x4e20|83 86 14 51 56 db c9 5e 08 15 63 1a ef 20 a9 4f|...QV..^..c.. .O|
* |until 0x5274.5 (1125) | |
| | | [1]: partition {} 0x5274.6-0x5302.4 (141.7)
| | | count: 1024 0x5274.6-NA (0)
0x5270| 00 33 | .3 | rice_parameter: 0 0x5274.6-0x5275.1 (0.4)
0x5270| 33 ff 9f fe 7f fc ff fc ff ff 3f| 3.........?| samples: cffe7ff9fff3fff3fffcfffff9ffffff... 0x5275.2-0x5302.4 (141.3)
0x5280|ff fe 7f ff ff ff ff ff ff ff ff ff ff ff fb ff|................|
* |until 0x5302.4 (142) | |
| | | [2]: partition {} 0x5302.5-0x538f.4 (141)
| | | count: 1024 0x5302.5-NA (0)
0x5300| f8 7f | .. | rice_parameter: 0 0x5302.5-0x5303 (0.4)
0x5300| 7f ff ff ff ff ff 7f ff fd ff fe ff fd| .............| samples: fffffffffffefffffbfffdfffbffefff... 0x5303.1-0x538f.4 (140.4)
0x5310|ff f7 ff bf fb ff 7f ef fd ff 7f df f7 fd ff 7f|................|
* |until 0x538f.4 (141) | |
| | | [3]: partition {} 0x538f.5-0x541d.5 (142.1)
| | | count: 1024 0x538f.5-NA (0)
0x5380| f8| .| rice_parameter: 0 0x538f.5-0x5390 (0.4)
0x5390|6f |o |
0x5390|6f fd ff bf ef fb fe ff bf ef fb fd ff 7f df f7|o...............| samples: dffbff7fdff7fdff7fdff7fbfeffbfef... 0x5390.1-0x541d.5 (141.5)
0x53a0|fd |. |
* |until 0x541d.5 (142) | |
0x5410| dc | . | byte_align: Correct (0x0) 0x541d.6-0x541d.7 (0.2)
0x5410| 8b 83| ..| footer_crc: Correct (8b83) 0x541e-0x541f.7 (2)
| | | [4]: frame {} (flac_frame) 0x5420-0x65a1.7 (4482)
| | | header: {} 0x5420-0x5425.7 (6)
0x5420|ff f8 |.. | sync: Correct (0x3ffe) 0x5420-0x5421.5 (1.6)
0x5420| f8 | . | reserved0: Correct (0x0) 0x5421.6-0x5421.6 (0.1)
0x5420| f8 | . | blocking_strategy: Fixed (0) 0x5421.7-0x5421.7 (0.1)
0x5420| c9 | . | block_size: 4096 0x5422-0x5422.3 (0.4)
0x5420| c9 | . | sample_rate: 44100 0x5422.4-0x5422.7 (0.4)
0x5420| 12 | . | channel_assignment: left, right (2) 0x5423-0x5423.3 (0.4)
0x5420| 12 | . | sample_size: 8 0x5423.4-0x5423.6 (0.3)
0x5420| 12 | . | reserved1: Correct (0x0) 0x5423.7-0x5423.7 (0.1)
| | | end_of_header: {} 0x5424-0x5424.7 (1)
0x5420| 04 | . | frame_number: 4 0x5424-0x5424.7 (1)
0x5420| 5c | \ | crc: Correct (5c) 0x5425-0x5425.7 (1)
| | | subframes: [2] 0x5426-0x659f (4473.1)
| | | [0]: subframe {} 0x5426-0x637b.3 (3925.4)
0x5420| 40 | @ | zero_bit: Correct (0x0) 0x5426-0x5426 (0.1)
0x5420| 40 | @ | subframe_type: LPC (3) 0x5426.1-0x5426.6 (0.6)
| | | lpc_order: 1 0x5426.7-NA (0)
0x5420| 40 | @ | wasted_bits_flag: 0 0x5426.7-0x5426.7 (0.1)
| | | subframe_sample_size: 8 0x5427-NA (0)
| | | warmup_samples: [1] 0x5427-0x5427.7 (1)
0x5420| f7 | . | [0]: value -9 0x5427-0x5427.7 (1)
0x5420| 55 | U | precision: 6 0x5428-0x5428.3 (0.4)
0x5420| 55 ae | U. | shift: 11 0x5428.4-0x5429 (0.5)
| | | coefficients: [1] 0x5429.1-0x5429.6 (0.6)
0x5420| ae | . | [0]: value 23 0x5429.1-0x5429.6 (0.6)
0x5420| ae 22 | ." | residual_coding_method: rice (4) 0x5429.7-0x542a (0.2)
0x5420| 22 | " | partition_order: 4 0x542a.1-0x542a.4 (0.4)
| | | rice_partitions: 16 0x542a.5-NA (0)
| | | partitions: [16] 0x542a.5-0x637b.3 (3920.7)
| | | [0]: partition {} 0x542a.5-0x54df (180.4)
| | | count: 255 0x542a.5-NA (0)
0x5420| 22 77 | "w | rice_parameter: 4 0x542a.5-0x542b (0.4)
0x5420| 77 77 ac e1 2a| ww..*| samples: eeef59c254b639e41251661a71c79e79... 0x542b.1-0x54df (180)
0x5430|5b 1c f2 09 28 b3 0d 38 e3 cf 3c f3 cf 3c f3 ce|[...(..8..<..<..|
* |until 0x54df (180) | |
| | | [1]: partition {} 0x54df.1-0x5594.1 (181.1)
| | | count: 256 0x54df.1-NA (0)
0x54d0| 22| "| rice_parameter: 4 0x54df.1-0x54df.4 (0.4)
0x54d0| 22| "| samples: 490f7356a4a31adf3bfa29aabb2cb6eb... 0x54df.5-0x5594.1 (180.5)
0x54e0|48 7b 9a b5 25 18 d6 f9 df d1 4d 55 d9 65 b7 5d|H{..%.....MU.e.]|
* |until 0x5594.1 (181) | |
| | | [2]: partition {} 0x5594.2-0x5649.2 (181.1)
| | | count: 256 0x5594.2-NA (0)
0x5590| d1 | . | rice_parameter: 4 0x5594.2-0x5594.5 (0.4)
0x5590| d1 54 d1 ee f3 79 c6 14 a6 35 cf 24| .T...y...5.$| samples: 55347bbcde7185298d73c928b30c34e3... 0x5594.6-0x5649.2 (180.5)
0x55a0|a2 cc 30 d3 8e 3c f3 cf 3c f3 cf 38 e3 4c 2c a2|..0..<..<..8.L,.|
* |until 0x5649.2 (181) | |
| | | [3]: partition {} 0x5649.3-0x56fe.3 (181.1)
| | | count: 256 0x5649.3-NA (0)
0x5640| 48 | H | rice_parameter: 4 0x5649.3-0x5649.6 (0.4)
0x5640| 48 c2 ca 24 87 35 8b| H..$.5.| samples: 616512439ac5a509ceb9df7e8a6aaecb... 0x5649.7-0x56fe.3 (180.5)
0x5650|4a 13 9d 73 be fd 14 d5 5d 96 db 75 d7 5d 75 d7|J..s....]..u.]u.|
* |until 0x56fe.3 (181) | |
| | | [4]: partition {} 0x56fe.4-0x57c7.1 (200.6)
| | | count: 256 0x56fe.4-NA (0)
0x56f0| b4 | . | rice_parameter: 4 0x56fe.4-0x56fe.7 (0.4)
0x56f0| 65| e| samples: 65755347fdddeb384a96c73c824a2cc3... 0x56ff-0x57c7.1 (200.2)
0x5700|75 53 47 fd dd eb 38 4a 96 c7 3c 82 4a 2c c3 4e|uSG...8J..<.J,.N|
* |until 0x57c7.1 (201) | |
| | | [5]: partition {} 0x57c7.2-0x58d9.4 (274.3)
| | | count: 256 0x57c7.2-NA (0)
0x57c0| 9f | . | rice_parameter: 7 0x57c7.2-0x57c7.5 (0.4)
0x57c0| 9f 83 8d 66 d8 ba c1 66 f0| ...f...f.| samples: e0e359b62eb059bc2e67dbd943b2f34d... 0x57c7.6-0x58d9.4 (273.7)
0x57d0|b9 9f 6f 65 0e cb cd 35 7b b1 29 55 40 cc 45 cf|..oe...5{.)U@.E.|
* |until 0x58d9.4 (274) | |
| | | [6]: partition {} 0x58d9.5-0x59e5.6 (268.2)
| | | count: 256 0x58d9.5-NA (0)
0x58d0| d3 12 | .. | rice_parameter: 6 0x58d9.5-0x58da (0.4)
0x58d0| 12 55 14 8f 57 4b| .U..WK| samples: 24aa291eae97af89e372988a8761c8d4... 0x58da.1-0x59e5.6 (267.6)
0x58e0|d7 c4 f1 b9 4c 45 43 b0 e4 6a 30 38 e9 17 87 63|....LEC..j08...c|
* |until 0x59e5.6 (268) | |
| | | [7]: partition {} 0x59e5.7-0x5af4.6 (271)
| | | count: 256 0x59e5.7-NA (0)
0x59e0| fe c8 | .. | rice_parameter: 6 0x59e5.7-0x59e6.2 (0.4)
0x59e0| c8 07 c7 61 a8 7b 86 78 7a a2| ...a.{.xz.| samples: 403e3b0d43dc33c3d514565781a93fba... 0x59e6.3-0x5af4.6 (270.4)
0x59f0|8a ca f0 35 27 f7 5d 19 99 89 c5 f2 c9 70 58 4f|...5'.]......pXO|
* |until 0x5af4.6 (271) | |
| | | [8]: partition {} 0x5af4.7-0x5c05.7 (273.1)
| | | count: 256 0x5af4.7-NA (0)
0x5af0| b6 fa | .. | rice_parameter: 7 0x5af4.7-0x5af5.2 (0.4)
0x5af0| fa 69 fe db 4e eb 45 4c eb d6 89| .i..N.EL...| samples: d34ff6da775a2a675eb44c564c1eebdd... 0x5af5.3-0x5c05.7 (272.5)
0x5b00|8a c9 83 dd 7b b0 13 ea 47 b3 ed 92 f7 df a2 43|....{...G......C|
* |until 0x5c05.7 (273) | |
| | | [9]: partition {} 0x5c06-0x5d17.3 (273.4)
| | | count: 256 0x5c06-NA (0)
0x5c00| 79 | y | rice_parameter: 7 0x5c06-0x5c06.3 (0.4)
0x5c00| 79 86 c6 ed af 9f 6b 01 f0 f2| y.....k...| samples: 986c6edaf9f6b01f0f28f69bce264fca... 0x5c06.4-0x5d17.3 (273)
0x5c10|8f 69 bc e2 64 fc ac 9f 8c f9 bb 9b 86 73 3e a9|.i..d........s>.|
* |until 0x5d17.3 (273) | |
| | | [10]: partition {} 0x5d17.4-0x5e28.1 (272.6)
| | | count: 256 0x5d17.4-NA (0)
0x5d10| c7 | . | rice_parameter: 7 0x5d17.4-0x5d17.7 (0.4)
0x5d10| fd 7c 25 a7 95 59 4a 97| .|%..YJ.| samples: fd7c25a795594a97f2d3d6faba23c33e... 0x5d18-0x5e28.1 (272.2)
0x5d20|f2 d3 d6 fa ba 23 c3 3e ad 0c f7 a8 4e 90 0a 66|.....#.>....N..f|
* |until 0x5e28.1 (273) | |
| | | [11]: partition {} 0x5e28.2-0x5f38.7 (272.6)
| | | count: 256 0x5e28.2-NA (0)
0x5e20| 98 | . | rice_parameter: 6 0x5e28.2-0x5e28.5 (0.4)
0x5e20| 98 58 24 0f 34 06 e1 ca| .X$.4...| samples: 160903cd01b872b677084aee6cf35a44... 0x5e28.6-0x5f38.7 (272.2)
0x5e30|d9 dc 21 2b b9 b3 cd 69 12 c2 05 ca 19 c7 c5 72|..!+...i.......r|
* |until 0x5f38.7 (273) | |
| | | [12]: partition {} 0x5f39-0x6049.7 (273)
| | | count: 256 0x5f39-NA (0)
0x5f30| 7f | . | rice_parameter: 7 0x5f39-0x5f39.3 (0.4)
0x5f30| 7f 6e b4 c3 d7 bf e9| .n.....| samples: f6eb4c3d7bfe941e5098f999f7db52cc... 0x5f39.4-0x6049.7 (272.4)
0x5f40|41 e5 09 8f 99 9f 7d b5 2c ca 9b 72 69 a9 fc 50|A.....}.,..ri..P|
* |until 0x6049.7 (273) | |
| | | [13]: partition {} 0x604a-0x6159.3 (271.4)
| | | count: 256 0x604a-NA (0)
0x6040| 65 | e | rice_parameter: 6 0x604a-0x604a.3 (0.4)
0x6040| 65 9b cc 6e 27 b1| e..n'.| samples: 59bcc6e27b1105137b2200b04b2d0f58... 0x604a.4-0x6159.3 (271)
0x6050|10 51 37 b2 20 0b 04 b2 d0 f5 89 7f a4 a3 28 e8|.Q7. .........(.|
* |until 0x6159.3 (271) | |
| | | [14]: partition {} 0x6159.4-0x626a (272.5)
| | | count: 256 0x6159.4-NA (0)
0x6150| a7 | . | rice_parameter: 7 0x6159.4-0x6159.7 (0.4)
0x6150| fc 92 f7 a2 c0 4a| .....J| samples: fc92f7a2c04a4eb62f2079b2b3d6aeef... 0x615a-0x626a (272.1)
0x6160|4e b6 2f 20 79 b2 b3 d6 ae ef 54 0b 75 db a1 8a|N./ y.....T.u...|
* |until 0x626a (273) | |
| | | [15]: partition {} 0x626a.1-0x637b.3 (273.3)
| | | count: 256 0x626a.1-NA (0)
0x6260| 3e | > | rice_parameter: 7 0x626a.1-0x626a.4 (0.4)
0x6260| 3e 7d 73 cf 76 69| >}s.vi| samples: cfae79eecd22795ce9a602dfb6a9af57... 0x626a.5-0x637b.3 (272.7)
0x6270|13 ca e7 4d 30 16 fd b5 4d 7a b8 54 1d e5 43 b9|...M0...Mz.T..C.|
* |until 0x637b.3 (273) | |
| | | [1]: subframe {} 0x637b.4-0x659f (547.5)
0x6370| a1 | . | zero_bit: Correct (0x0) 0x637b.4-0x637b.4 (0.1)
0x6370| a1 2f | ./ | subframe_type: Fixed (2) 0x637b.5-0x637c.2 (0.6)
| | | lpc_order: 1 0x637c.3-NA (0)
0x6370| 2f | / | wasted_bits_flag: 0 0x637c.3-0x637c.3 (0.1)
| | | subframe_sample_size: 8 0x637c.4-NA (0)
| | | warmup_samples: [1] 0x637c.4-0x637d.3 (1)
0x6370| 2f 80 | /. | [0]: value -8 0x637c.4-0x637d.3 (1)
0x6370| 80 | . | residual_coding_method: rice (4) 0x637d.4-0x637d.5 (0.2)
0x6370| 80 43 | .C | partition_order: 1 0x637d.6-0x637e.1 (0.4)
| | | rice_partitions: 2 0x637e.2-NA (0)
| | | partitions: [2] 0x637e.2-0x659f (544.7)
| | | [0]: partition {} 0x637e.2-0x6493.2 (277.1)
| | | count: 2047 0x637e.2-NA (0)
0x6370| 43 | C | rice_parameter: 0 0x637e.2-0x637e.5 (0.4)
0x6370| 43 f7| C.| samples: fdffbffbffdfff7ffeffff7ffffdffff... 0x637e.6-0x6493.2 (276.5)
0x6380|fe ff ef ff 7f fd ff fb ff fd ff ff f7 ff ff ff|................|
* |until 0x6493.2 (277) | |
| | | [1]: partition {} 0x6493.3-0x659f (267.6)
| | | count: 2048 0x6493.3-NA (0)
0x6490| e1 | . | rice_parameter: 0 0x6493.3-0x6493.6 (0.4)
0x6490| e1 ff f7 ff ff ff fb ff ff ff ef ff ff| .............| samples: fffbfffffffdfffffff7ffffff7fffff... 0x6493.7-0x659f (267.2)
0x64a0|fe ff ff ff df ff ff f7 ff ff fb ff ff fb ff ff|................|
* |until 0x659f (268) | |
0x6590| 80| .| byte_align: Correct (0x0) 0x659f.1-0x659f.7 (0.7)
0x65a0|3a a5 |:. | footer_crc: Correct (3aa5) 0x65a0-0x65a1.7 (2)
| | | [5]: frame {} (flac_frame) 0x65a2-0x6d5c.7 (1979)
| | | header: {} 0x65a2-0x65a9.7 (8)
0x65a0| ff f8 | .. | sync: Correct (0x3ffe) 0x65a2-0x65a3.5 (1.6)
0x65a0| f8 | . | reserved0: Correct (0x0) 0x65a3.6-0x65a3.6 (0.1)
0x65a0| f8 | . | blocking_strategy: Fixed (0) 0x65a3.7-0x65a3.7 (0.1)
0x65a0| 79 | y | block_size: end of header (16 bit) (0) 0x65a4-0x65a4.3 (0.4)
0x65a0| 79 | y | sample_rate: 44100 0x65a4.4-0x65a4.7 (0.4)
0x65a0| 12 | . | channel_assignment: left, right (2) 0x65a5-0x65a5.3 (0.4)
0x65a0| 12 | . | sample_size: 8 0x65a5.4-0x65a5.6 (0.3)
0x65a0| 12 | . | reserved1: Correct (0x0) 0x65a5.7-0x65a5.7 (0.1)
| | | end_of_header: {} 0x65a6-0x65a8.7 (3)
0x65a0| 05 | . | frame_number: 5 0x65a6-0x65a6.7 (1)
0x65a0| 06 21 | .! | block_size: 1570 0x65a7-0x65a8.7 (2)
0x65a0| c3 | . | crc: Correct (c3) 0x65a9-0x65a9.7 (1)
| | | subframes: [2] 0x65aa-0x6d5a.2 (1968.3)
| | | [0]: subframe {} 0x65aa-0x6bcc.7 (1571)
0x65a0| 02 | . | zero_bit: Correct (0x0) 0x65aa-0x65aa (0.1)
0x65a0| 02 | . | subframe_type: Verbatim (1) 0x65aa.1-0x65aa.6 (0.6)
| | | lpc_order: 0 0x65aa.7-NA (0)
0x65a0| 02 | . | wasted_bits_flag: 0 0x65aa.7-0x65aa.7 (0.1)
| | | subframe_sample_size: 8 0x65ab-NA (0)
0x65a0| 3e 45 73 37 8c| >Es7.| samples: 3e4573378ca2cd5afeca9ff77408c4f9... 0x65ab-0x6bcc.7 (1570)
0x65b0|a2 cd 5a fe ca 9f f7 74 08 c4 f9 fc c3 16 e4 79|..Z....t.......y|
* |until 0x6bcc.7 (1570) | |
| | | [1]: subframe {} 0x6bcd-0x6d5a.2 (397.3)
0x6bc0| 12 | . | zero_bit: Correct (0x0) 0x6bcd-0x6bcd (0.1)
0x6bc0| 12 | . | subframe_type: Fixed (2) 0x6bcd.1-0x6bcd.6 (0.6)
| | | lpc_order: 1 0x6bcd.7-NA (0)
0x6bc0| 12 | . | wasted_bits_flag: 0 0x6bcd.7-0x6bcd.7 (0.1)
| | | subframe_sample_size: 8 0x6bce-NA (0)
| | | warmup_samples: [1] 0x6bce-0x6bce.7 (1)
0x6bc0| 0f | . | [0]: value 15 0x6bce-0x6bce.7 (1)
0x6bc0| 00| .| residual_coding_method: rice (4) 0x6bcf-0x6bcf.1 (0.2)
0x6bc0| 00| .| partition_order: 0 0x6bcf.2-0x6bcf.5 (0.4)
| | | rice_partitions: 1 0x6bcf.6-NA (0)
| | | partitions: [1] 0x6bcf.6-0x6d5a.2 (394.5)
| | | [0]: partition {} 0x6bcf.6-0x6d5a.2 (394.5)
| | | count: 1569 0x6bcf.6-NA (0)
0x6bc0| 00| .| rice_parameter: 1 0x6bcf.6-0x6bd0.1 (0.4)
0x6bd0|6a |j |
0x6bd0|6a aa aa aa aa aa aa aa aa aa ba aa aa aa aa aa|j...............| samples: aaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaa... 0x6bd0.2-0x6d5a.2 (394.1)
0x6be0|aa aa aa aa aa aa aa ae aa aa aa aa aa aa aa aa|................|
* |until 0x6d5a.2 (395) | |
0x6d50| 40 | @ | byte_align: Correct (0x0) 0x6d5a.3-0x6d5a.7 (0.5)
0x6d50| ee 38| | .8| | footer_crc: Correct (ee38) 0x6d5b-0x6d5c.7 (2)
| | | md5_calculated: ef79009cce3bd79ef4b5668ebb98d113 0x6d5d-NA (0)
| | | decoded_samples: 22050 0x6d5d-NA (0)

186
format/flv/flv.go Normal file
View File

@ -0,0 +1,186 @@
//+build ignore
package flv
// TODO: make it useful
// https://www.adobe.com/content/dam/acom/en/devnet/flv/video_file_format_spec_v10.pdf
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.FLV,
Description: "Flash video",
Groups: []string{format.PROBE},
DecodeFn: flvDecode,
})
}
const (
audioData = 8
videoData = 9
scriptDataObject = 18
)
var tagTypeNames = map[uint64]string{
audioData: "audioData",
videoData: "videoData",
scriptDataObject: "scriptDataObject",
}
const (
typeNumber = 0
typeBoolean = 1
typeString = 2
typeObject = 3
typeMovieClip = 4
typeNull = 5
typeUndefined = 6
typeReference = 7
typeECMAArray = 8
typeObjectEnd = 9
typeStrictArray = 10
typeDate = 11
typeLongString = 12
)
var typeNames = map[uint64]string{
typeNumber: "Number",
typeBoolean: "Boolean",
typeString: "String",
typeObject: "Object",
typeMovieClip: "MovieClip",
typeNull: "Null",
typeUndefined: "Undefined",
typeReference: "Reference",
typeECMAArray: "ECMAArray",
typeObjectEnd: "ObjectEnd",
typeStrictArray: "StrictArray",
typeDate: "Date",
typeLongString: "LongString",
}
func flvDecode(d *decode.D, in interface{}) interface{} {
var fieldScriptDataObject func()
var fieldScriptDataVariable func(d *decode.D, name string)
fieldScriptDataString := func(d *decode.D, name string) {
d.FieldStrFn(name, func() (string, string) {
l := d.U16()
return d.UTF8(int(l)), ""
})
}
fieldScriptDataStringLong := func(d *decode.D, name string) {
d.FieldStrFn(name, func() (string, string) {
l := d.U32()
return d.UTF8(int(l)), ""
})
}
fieldScriptDataVariable = func(d *decode.D, name string) {
d.FieldStructFn(name, func(d *decode.D) {
fieldScriptDataString(d, "name")
fieldScriptDataString(d, "data")
})
}
fieldScriptDataValue := func(d *decode.D, _ string) uint64 {
typ, _ := d.FieldStringMapFn("type", typeNames, "Unknown", d.U8, decode.NumberDecimal)
if typ == typeECMAArray {
d.FieldU32("ecma_array_length")
}
switch typ {
case typeNumber:
d.FieldF64("number")
case typeBoolean:
d.FieldU8("boolean")
case typeString:
fieldScriptDataString(d, "string")
case typeObject:
fieldScriptDataObject()
case typeMovieClip:
fieldScriptDataString(d, "path")
case typeNull:
case typeUndefined:
case typeReference:
d.FieldU16("reference")
case typeECMAArray:
d.FieldArrayFn("array", func(d *decode.D) {
for {
if d.PeekBits(24) == typeObjectEnd { // variableEnd?
d.FieldU24("end")
break
}
fieldScriptDataVariable(d, "sasdadas")
}
})
case typeStrictArray:
length := d.FieldU32("length")
for i := uint64(0); i < length; i++ {
fieldScriptDataVariable(d, "sasdadas")
}
case typeDate:
d.FieldF64("date_time")
d.FieldS16("local_data_time_offset")
case typeLongString:
fieldScriptDataStringLong(d, "asdsad")
case typeObjectEnd: // variableEnd also?
}
return typ
}
fieldScriptDataObject = func() {
d.FieldStructFn("object", func(d *decode.D) {
fieldScriptDataString(d, "name")
fieldScriptDataValue(d, "data")
})
}
d.FieldValidateUTF8("signature", "FLV")
d.FieldU8("version")
d.FieldValidateUFn("type_flags_reserved", 0, d.U5)
d.FieldU1("type_flags_audio")
d.FieldValidateUFn("type_flags_reserved", 0, d.U1)
d.FieldU1("type_flags_video")
dataOffset := d.FieldU32("data_offset")
d.SeekAbs(int64(dataOffset) * 8)
d.FieldArrayFn("tags", func(d *decode.D) {
for !d.End() {
d.FieldStructFn("tag", func(d *decode.D) {
d.FieldU32("previous_tag_size")
tagType, _ := d.FieldStringMapFn("tag_type", tagTypeNames, "unknown", d.U8, decode.NumberDecimal)
dataSize := d.FieldU24("data_size")
d.FieldU24("timestamp")
d.FieldU8("timestamp_extended")
d.FieldU24("stream_id")
switch tagType {
case audioData, videoData:
d.SeekRel(int64(dataSize) * 8)
case scriptDataObject:
for {
if d.PeekBits(24) == typeObjectEnd {
d.FieldU24("end")
break
}
fieldScriptDataObject()
}
}
})
}
})
return nil
}

12
format/fqtest_test.go Normal file
View File

@ -0,0 +1,12 @@
package format_test
import (
_ "fq/format/all"
"fq/format/registry"
"fq/pkg/fqtest"
"testing"
)
func TestFQTests(t *testing.T) {
fqtest.TestPath(t, registry.Default)
}

82
format/fuzz_test.go Normal file
View File

@ -0,0 +1,82 @@
// +build gofuzzbeta
package format_test
import (
"bytes"
"context"
"fmt"
_ "fq/format/all"
"fq/pkg/interp"
"io"
"io/ioutil"
"os"
"path/filepath"
"testing"
)
type fuzzTest struct {
b []byte
}
type fuzzTestOutput struct {
io.Writer
}
func (o fuzzTestOutput) Size() (int, int) { return 120, 25 }
func (o fuzzTestOutput) IsTerminal() bool { return false }
func (ft *fuzzTest) Stdin() io.Reader { return bytes.NewBuffer(ft.b) } // TODO: special file?
func (ft *fuzzTest) Stdout() interp.Output { return fuzzTestOutput{os.Stdout} }
func (ft *fuzzTest) Stderr() io.Writer { return os.Stderr }
func (ft *fuzzTest) Interrupt() chan struct{} { return nil }
func (ft *fuzzTest) Environ() []string { return nil }
func (ft *fuzzTest) Args() []string {
return []string{}
}
func (ft *fuzzTest) ConfigDir() (string, error) { return "/config", nil }
func (ft *fuzzTest) Open(name string) (io.ReadSeeker, error) {
return nil, fmt.Errorf("%s: file not found", name)
}
func (ft *fuzzTest) Readline(prompt string, complete func(line string, pos int) (newLine []string, shared int)) (string, error) {
return "", io.EOF
}
func FuzzFQTests(f *testing.F) {
filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
if filepath.Ext(path) == ".fqtest" {
return nil
}
if filepath.Base(filepath.Dir(path)) != "testdata" {
return nil
}
if st, err := os.Stat(path); err != nil || st.IsDir() {
return nil
}
b, err := ioutil.ReadFile(path)
if err != nil {
panic(err)
}
f.Add(b)
return nil
})
f.Fuzz(func(t *testing.T, b []byte) {
fz := &fuzzTest{b: b}
q, err := interp.New(fz, all.Registry)
if err != nil {
t.Fatal(err)
}
err = q.Main(context.Background(), fz.Stdout(), "dev")
if err != nil {
// TODO: expect error
t.Fatal(err)
}
})
}

157
format/gif/gif.go Normal file
View File

@ -0,0 +1,157 @@
package gif
// https://www.w3.org/Graphics/GIF/spec-gif87.txt
// https://en.wikipedia.org/wiki/GIF
// https://web.archive.org/web/20160304075538/http://qalle.net/gif89a.php#graphiccontrolextension
// TODO: local color map
// TODO: bit depth done correct?
// TDOO: mime mage/gif
import (
"bytes"
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.GIF,
Description: "Graphics Interchange Format",
Groups: []string{format.PROBE, format.IMAGE},
DecodeFn: gifDecode,
})
}
const (
extensionPlainText = 0x01
extensionGraphicalControl = 0xf9
extensionComment = 0xfe
extensionApplication = 0xff
)
var extensionNames = map[uint64]string{
extensionPlainText: "PlainText",
extensionGraphicalControl: "GraphicalControl",
extensionComment: "Comment",
extensionApplication: "Application",
}
func fieldColorMap(d *decode.D, name string, bitDepth int) {
d.FieldArrayFn(name, func(d *decode.D) {
for i := 0; i < 1<<bitDepth; i++ {
d.FieldArrayFn("color", func(d *decode.D) {
d.FieldU8("r")
d.FieldU8("g")
d.FieldU8("b")
})
}
})
}
func gifDecode(d *decode.D, in interface{}) interface{} {
d.Endian = decode.LittleEndian
d.FieldValidateUTF8("header", "GIF89a")
d.FieldU16("width")
d.FieldU16("height")
gcpFollows := d.FieldBool("gcp_follows")
d.FieldUFn("color_resolution", func() (uint64, decode.DisplayFormat, string) {
return d.U3() + 1, decode.NumberDecimal, ""
})
d.FieldU1("zero")
bitDepth := d.FieldUFn("bit_depth", func() (uint64, decode.DisplayFormat, string) {
return d.U3() + 1, decode.NumberDecimal, ""
})
d.FieldU8("black_color")
d.FieldU8("pixel_aspect_ratio")
if gcpFollows {
fieldColorMap(d, "global_color_map", int(bitDepth))
}
d.FieldArrayFn("blocks", func(d *decode.D) {
blocks:
for {
switch d.PeekBits(8) {
case 0x3b: /* ";" */
break blocks
case 0x21: /* "!" */
d.FieldStructFn("extension_block", func(d *decode.D) {
d.FieldU8("introducer")
functionCode, _ := d.FieldStringMapFn("function_code", extensionNames, "Unknown", d.U8, decode.NumberHex)
dataBytes := &bytes.Buffer{}
d.FieldArrayFn("func_data_bytes", func(d *decode.D) {
seenTerminator := false
for !seenTerminator {
d.FieldStructFn("func_data_byte", func(d *decode.D) {
byteCount := d.FieldU8("byte_count")
b := d.FieldBitBufLen("data", int64(byteCount*8))
if d.PeekBits(8) == 0 {
d.FieldU8("terminator")
seenTerminator = true
}
decode.MustCopy(dataBytes, b.Copy())
})
}
})
_ = functionCode
// TODO: need a FieldStructBitBuf or something
// switch functionCode {
// case extensionGraphicalControl:
// d.FieldDecodeBitBuf(
// "graphics_control",
// bitio.NewBufferFromBytes(dataBytes.Bytes(), -1),
// )
// }
})
case 0x2c: /* "," */
d.FieldStructFn("image", func(d *decode.D) {
d.FieldU8("separator_character")
d.FieldU16("left")
d.FieldU16("top")
d.FieldU16("width")
d.FieldU16("height")
localFollows := d.FieldBool("local_color_map_follows")
d.FieldBool("image_interlaced")
d.FieldU3("zero")
d.FieldUFn("bit_depth", func() (uint64, decode.DisplayFormat, string) {
return d.U3() + 1, decode.NumberDecimal, ""
})
d.FieldU8("code_size")
if localFollows {
fieldColorMap(d, "local_color_map", int(bitDepth))
}
d.FieldArrayFn("image_bytes", func(d *decode.D) {
seenTerminator := false
for !seenTerminator {
d.FieldStructFn("func_data_byte", func(d *decode.D) {
byteCount := d.FieldU8("byte_count")
d.FieldBitBufLen("data", int64(byteCount*8))
if d.PeekBits(8) == 0 {
d.FieldU8("terminator")
seenTerminator = true
}
})
}
})
})
}
}
})
d.FieldU8("terminator")
return nil
}

94
format/gif/testdata/4x4.fqtest vendored Normal file
View File

@ -0,0 +1,94 @@
# gm convert -size 4x4 'xc:#000' 'xc:#fff' 4x4.gif
/4x4.gif:
> fq -d gif verbose /4x4.gif
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /4x4.gif (gif) 0x0-0x5e.7 (95)
0x00|47 49 46 38 39 61 |GIF89a | header: "GIF89a" (Correct) 0x0-0x5.7 (6)
0x00| 04 00 | .. | width: 4 0x6-0x7.7 (2)
0x00| 04 00 | .. | height: 4 0x8-0x9.7 (2)
0x00| f0 | . | gcp_follows: true 0xa-0xa (0.1)
0x00| f0 | . | color_resolution: 8 0xa.1-0xa.3 (0.3)
0x00| f0 | . | zero: 0 0xa.4-0xa.4 (0.1)
0x00| f0 | . | bit_depth: 1 0xa.5-0xa.7 (0.3)
0x00| 00 | . | black_color: 0 0xb-0xb.7 (1)
0x00| 00 | . | pixel_aspect_ratio: 0 0xc-0xc.7 (1)
| | | global_color_map: [2] 0xd-0x12.7 (6)
| | | [0]: color [3] 0xd-0xf.7 (3)
0x00| 00 | . | [0]: r 0 0xd-0xd.7 (1)
0x00| 00 | . | [1]: g 0 0xe-0xe.7 (1)
0x00| 00| .| [2]: b 0 0xf-0xf.7 (1)
| | | [1]: color [3] 0x10-0x12.7 (3)
0x10|00 |. | [0]: r 0 0x10-0x10.7 (1)
0x10| 00 | . | [1]: g 0 0x11-0x11.7 (1)
0x10| 00 | . | [2]: b 0 0x12-0x12.7 (1)
| | | blocks: [5] 0x13-0x5d.7 (75)
| | | [0]: extension_block {} 0x13-0x1a.7 (8)
0x10| 21 | ! | introducer: 33 0x13-0x13.7 (1)
0x10| f9 | . | function_code: GraphicalControl (0xf9) 0x14-0x14.7 (1)
| | | func_data_bytes: [1] 0x15-0x1a.7 (6)
| | | [0]: func_data_byte {} 0x15-0x1a.7 (6)
0x10| 04 | . | byte_count: 4 0x15-0x15.7 (1)
0x10| 00 00 00 00 | .... | data: 00000000 0x16-0x19.7 (4)
0x10| 00 | . | terminator: 0 0x1a-0x1a.7 (1)
| | | [1]: extension_block {} 0x1b-0x2d.7 (19)
0x10| 21 | ! | introducer: 33 0x1b-0x1b.7 (1)
0x10| ff | . | function_code: Application (0xff) 0x1c-0x1c.7 (1)
| | | func_data_bytes: [2] 0x1d-0x2d.7 (17)
| | | [0]: func_data_byte {} 0x1d-0x28.7 (12)
0x10| 0b | . | byte_count: 11 0x1d-0x1d.7 (1)
0x10| 4e 45| NE| data: 4e45545343415045322e30 0x1e-0x28.7 (11)
0x20|54 53 43 41 50 45 32 2e 30 |TSCAPE2.0 |
| | | [1]: func_data_byte {} 0x29-0x2d.7 (5)
0x20| 03 | . | byte_count: 3 0x29-0x29.7 (1)
0x20| 01 00 00 | ... | data: 010000 0x2a-0x2c.7 (3)
0x20| 00 | . | terminator: 0 0x2d-0x2d.7 (1)
| | | [2]: image {} 0x2e-0x3e.7 (17)
0x20| 2c | , | separator_character: 44 0x2e-0x2e.7 (1)
0x20| 00| .| left: 0 0x2f-0x30.7 (2)
0x30|00 |. |
0x30| 00 00 | .. | top: 0 0x31-0x32.7 (2)
0x30| 04 00 | .. | width: 4 0x33-0x34.7 (2)
0x30| 04 00 | .. | height: 4 0x35-0x36.7 (2)
0x30| 00 | . | local_color_map_follows: false 0x37-0x37 (0.1)
0x30| 00 | . | image_interlaced: false 0x37.1-0x37.1 (0.1)
0x30| 00 | . | zero: 0 0x37.2-0x37.4 (0.3)
0x30| 00 | . | bit_depth: 1 0x37.5-0x37.7 (0.3)
0x30| 02 | . | code_size: 2 0x38-0x38.7 (1)
| | | image_bytes: [1] 0x39-0x3e.7 (6)
| | | [0]: func_data_byte {} 0x39-0x3e.7 (6)
0x30| 04 | . | byte_count: 4 0x39-0x39.7 (1)
0x30| 84 8f 09 05 | .... | data: 848f0905 0x3a-0x3d.7 (4)
0x30| 00 | . | terminator: 0 0x3e-0x3e.7 (1)
| | | [3]: extension_block {} 0x3f-0x46.7 (8)
0x30| 21| !| introducer: 33 0x3f-0x3f.7 (1)
0x40|f9 |. | function_code: GraphicalControl (0xf9) 0x40-0x40.7 (1)
| | | func_data_bytes: [1] 0x41-0x46.7 (6)
| | | [0]: func_data_byte {} 0x41-0x46.7 (6)
0x40| 04 | . | byte_count: 4 0x41-0x41.7 (1)
0x40| 00 00 00 00 | .... | data: 00000000 0x42-0x45.7 (4)
0x40| 00 | . | terminator: 0 0x46-0x46.7 (1)
| | | [4]: image {} 0x47-0x5d.7 (23)
0x40| 2c | , | separator_character: 44 0x47-0x47.7 (1)
0x40| 00 00 | .. | left: 0 0x48-0x49.7 (2)
0x40| 00 00 | .. | top: 0 0x4a-0x4b.7 (2)
0x40| 04 00 | .. | width: 4 0x4c-0x4d.7 (2)
0x40| 04 00| ..| height: 4 0x4e-0x4f.7 (2)
0x50|80 |. | local_color_map_follows: true 0x50-0x50 (0.1)
0x50|80 |. | image_interlaced: false 0x50.1-0x50.1 (0.1)
0x50|80 |. | zero: 0 0x50.2-0x50.4 (0.3)
0x50|80 |. | bit_depth: 1 0x50.5-0x50.7 (0.3)
0x50| ff | . | code_size: 255 0x51-0x51.7 (1)
| | | local_color_map: [2] 0x52-0x57.7 (6)
| | | [0]: color [3] 0x52-0x54.7 (3)
0x50| ff | . | [0]: r 255 0x52-0x52.7 (1)
0x50| ff | . | [1]: g 255 0x53-0x53.7 (1)
0x50| 00 | . | [2]: b 0 0x54-0x54.7 (1)
| | | [1]: color [3] 0x55-0x57.7 (3)
0x50| 00 | . | [0]: r 0 0x55-0x55.7 (1)
0x50| 00 | . | [1]: g 0 0x56-0x56.7 (1)
0x50| 02 | . | [2]: b 2 0x57-0x57.7 (1)
| | | image_bytes: [1] 0x58-0x5d.7 (6)
| | | [0]: func_data_byte {} 0x58-0x5d.7 (6)
0x50| 04 | . | byte_count: 4 0x58-0x58.7 (1)
0x50| 84 8f 09 05 | .... | data: 848f0905 0x59-0x5c.7 (4)
0x50| 00 | . | terminator: 0 0x5d-0x5d.7 (1)
0x50| 3b| | ;|| terminator: 59 0x5e-0x5e.7 (1)

BIN
format/gif/testdata/4x4.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

136
format/gzip/gzip.go Normal file
View File

@ -0,0 +1,136 @@
package gz
// https://tools.ietf.org/html/rfc1952
// TODO: test name, comment etc
// TODO: verify isize?
// TODO: mime application/gzip
import (
"bytes"
"compress/flate"
"fq/format"
"fq/format/registry"
"fq/pkg/bitio"
"fq/pkg/decode"
"hash/crc32"
"io"
)
var probeFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.GZIP,
Description: "gzip compression",
Groups: []string{format.PROBE},
DecodeFn: gzDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.PROBE}, Formats: &probeFormat},
},
})
}
const delfateMethod = 8
var osNames = map[uint64]string{
0: "FAT filesystem (MS-DOS, OS/2, NT/Win32)",
1: "Amiga",
2: "VMS (or OpenVMS)",
3: "Unix",
4: "VM/CMS",
5: "Atari TOS",
6: "HPFS filesystem (OS/2, NT)",
7: "Macintosh",
8: "Z-System",
9: "CP/M",
10: " TOPS-20",
11: " NTFS filesystem (NT)",
12: " QDOS",
13: " Acorn RISCOS",
}
func gzDecode(d *decode.D, in interface{}) interface{} {
d.FieldValidateUTF8("identification", "\x1f\x8b")
compressionMethod := d.FieldUFn("compression_method", func() (uint64, decode.DisplayFormat, string) {
n := d.U8()
if n == delfateMethod {
return n, decode.NumberDecimal, "deflate"
}
return n, decode.NumberDecimal, "unknown"
})
hasHeaderCRC := false
hasExtra := false
hasName := false
hasComment := false
d.FieldStructFn("flags", func(d *decode.D) {
d.FieldBool("text")
hasHeaderCRC = d.FieldBool("header_crc")
hasExtra = d.FieldBool("extra")
hasName = d.FieldBool("name")
hasComment = d.FieldBool("comment")
d.FieldU3("reserved")
})
d.FieldU32LE("mtime") // TODO: unix time
switch compressionMethod {
case delfateMethod:
d.FieldUFn("extra_flags", func() (uint64, decode.DisplayFormat, string) {
n := d.U8()
switch n {
case 2:
return n, decode.NumberDecimal, "slow"
case 4:
return n, decode.NumberDecimal, "fast"
default:
return n, decode.NumberDecimal, "unknown"
}
})
default:
d.FieldU8("extra_flags")
}
d.FieldStringMapFn("os", osNames, "unknown", d.U8, decode.NumberDecimal)
if hasExtra {
// TODO:
xLen := d.FieldU16("xlen")
d.FieldBitBufLen("extra_fields", int64(xLen*8))
}
if hasName {
d.FieldStrNullTerminated("name")
}
if hasComment {
d.FieldStrNullTerminated("comment")
}
if hasHeaderCRC {
d.FieldU16LE("header_crc")
}
compressedLen := d.BitsLeft() - ((4 + 4) * 8) // len-(crc32+isize)
compressedBB := d.FieldBitBufLen("compressed", compressedLen)
var calculatedCRC32 []byte
switch compressionMethod {
case delfateMethod:
deflateR := flate.NewReader(compressedBB)
uncompressed := &bytes.Buffer{}
crc32W := crc32.NewIEEE()
if _, err := io.Copy(io.MultiWriter(uncompressed, crc32W), deflateR); err != nil { //nolint:gosec
d.Invalid(err.Error())
}
calculatedCRC32 = crc32W.Sum(nil)
uncompressedBB := bitio.NewBufferFromBytes(uncompressed.Bytes(), -1)
dv, _, _ := d.FieldTryDecodeBitBuf("uncompressed", uncompressedBB, probeFormat)
if dv == nil {
d.FieldRootBitBuf("uncompressed", uncompressedBB)
}
default:
d.FieldBitBufLen("compressed", compressedLen)
}
if calculatedCRC32 != nil {
d.FieldChecksumLen("crc32", 32, calculatedCRC32, decode.LittleEndian)
} else {
d.FieldU32LE("crc32")
}
d.FieldU32LE("isize")
return nil
}

21
format/gzip/testdata/test.fqtest vendored Normal file
View File

@ -0,0 +1,21 @@
# echo test | gzip -N > test.gz
/test.gz:
> fq -d gzip verbose /test.gz
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /test.gz (gzip) 0x0-0x18.7 (25)
0x00|1f 8b |.. | identification: "\x1f\x8b" (Correct) 0x0-0x1.7 (2)
0x0|74 65 73 74 0a| |test.| | uncompressed: 746573740a 0x0-0x4.7 (5)
0x00| 08 | . | compression_method: deflate (8) 0x2-0x2.7 (1)
| | | flags: {} 0x3-0x3.7 (1)
0x00| 00 | . | text: false 0x3-0x3 (0.1)
0x00| 00 | . | header_crc: false 0x3.1-0x3.1 (0.1)
0x00| 00 | . | extra: false 0x3.2-0x3.2 (0.1)
0x00| 00 | . | name: false 0x3.3-0x3.3 (0.1)
0x00| 00 | . | comment: false 0x3.4-0x3.4 (0.1)
0x00| 00 | . | reserved: 0 0x3.5-0x3.7 (0.3)
0x00| 41 02 ea 5f | A.._ | mtime: 1609171521 0x4-0x7.7 (4)
0x00| 00 | . | extra_flags: unknown (0) 0x8-0x8.7 (1)
0x00| 03 | . | os: Unix (3) 0x9-0x9.7 (1)
0x00| 2b 49 2d 2e e1 02| +I-...| compressed: 2b492d2ee10200 0xa-0x10.7 (7)
0x10|00 |. |
0x10| c6 35 b9 3b | .5.; | crc32: Correct (3bb935c6) 0x11-0x14.7 (4)
0x10| 05 00 00 00| | ....| | isize: 5 0x15-0x18.7 (4)

BIN
format/gzip/testdata/test.gz vendored Normal file

Binary file not shown.

153
format/icc/profile.go Normal file
View File

@ -0,0 +1,153 @@
package icc
// http://www.color.org/ICC1-V41.pdf
// https://www.color.org/icc32.pdf
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
"strings"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.ICC_PROFILE,
Description: "International Color Consortium profile",
DecodeFn: iccProfileDecode,
})
}
func xyzType(d *decode.D) {
d.FieldFP32("X")
d.FieldFP32("Y")
d.FieldFP32("Z")
}
func textType(d *decode.D) {
d.FieldStrNullTerminatedLen("text", int(d.BitsLeft()/8))
}
func paraType(d *decode.D) {
d.FieldU32("reserved0")
d.FieldU16("function_type")
d.FieldU16("reserved1")
d.FieldBitBufLen("parameters", d.BitsLeft())
}
func descType(d *decode.D) {
descLen := d.FieldU32("description_length")
d.FieldStrNullTerminatedLen("description", int(descLen))
d.FieldU32("language_code")
localDescLen := d.FieldU32("localizable_description_length")
d.FieldStrNullTerminatedLen("localizable_description", int(localDescLen))
d.FieldU16("script_code")
d.FieldU8("macintosh_description_length")
d.FieldStrFn("macintosh_description", func() (string, string) {
return strings.Trim(d.UTF8(67), "\x00 "), ""
})
}
var typToDecode = map[string]func(d *decode.D){
"XYZ ": xyzType,
"text": textType,
"para": paraType,
"desc": descType,
}
func bcdU8(d *decode.D) uint64 {
n := d.U8()
return (n>>4)*10 + n&0xf
}
func fieldBCDU8(d *decode.D, name string) uint64 { //nolint:unparam
return d.FieldUFn(name, func() (uint64, decode.DisplayFormat, string) {
return bcdU8(d), decode.NumberDecimal, ""
})
}
func iccProfileDecode(d *decode.D, in interface{}) interface{} {
/*
0..3 Profile size uInt32Number
4..7 CMM Type signature see below
8..11 Profile version number see below
12..15 Profile/Device Class signature see below
16..19 Color space of data (possibly a derived space) [i.e. the canonical input space] see below
20..23 Profile Connection Space (PCS) [i.e. the canonical output space] see below
24..35 Date and time this profile was first created dateTimeNumber
36..39 acsp (61637370h) profile file signature
40..43 Primary Platform signature see below
44..47 Flags to indicate various options for the CMM such as distributed processing and caching options see below
48..51 Device manufacturer of the device for which this profile is created see below
52..55 Device model of the device for which this profile is created see below
56..63 Device attributes unique to the particular device setup such as media type see below
64..67 Rendering Intent see below
68..79 The XYZ values of the illuminant of the Profile Connection Space. This must correspond to D50. It is explained in more detail in A.1. XYZNumber
80..83 Profile Creator signature see below
84..99 Profile ID see below
100..127 28 bytes reserved for future expansion - must be set to zeros
*/
// TODO: PokeU32()?
size := d.U32()
d.SeekRel(-4 * 8)
d.DecodeLenFn(int64(size)*8, func(d *decode.D) {
d.FieldStructFn("header", func(d *decode.D) {
d.FieldU32("size")
d.FieldUTF8("cmm_type_signature", 4)
fieldBCDU8(d, "version_major")
fieldBCDU8(d, "version_minor")
d.FieldU16("version_reserved")
d.FieldUTF8("device_class_signature", 4)
d.FieldUTF8("color_space", 4)
d.FieldUTF8("connection_space", 4)
d.FieldStructFn("timestamp", func(d *decode.D) {
d.FieldU16("year")
d.FieldU16("month")
d.FieldU16("day")
d.FieldU16("hours")
d.FieldU16("minutes")
d.FieldU16("seconds")
})
d.FieldUTF8("file_signature", 4)
d.FieldUTF8("primary_platform", 4)
d.FieldU32("flags")
d.FieldUTF8("device_manufacturer", 4)
d.FieldUTF8("device_model", 4)
d.FieldUTF8("device_attribute", 8)
d.FieldUTF8("render_intent", 4)
d.FieldUTF8("xyz_illuminant", 12)
d.FieldUTF8("profile_creator_signature", 4)
d.FieldUTF8("profile_id", 16)
d.FieldValidateZeroPadding("reserved", 28*8)
})
d.FieldStructFn("tag_table", func(d *decode.D) {
tagCount := d.FieldU32("count")
d.FieldArrayFn("table", func(d *decode.D) {
for i := uint64(0); i < tagCount; i++ {
d.FieldStructFn("element", func(d *decode.D) {
d.FieldUTF8("signature", 4)
offset := d.FieldU32("offset")
size := d.FieldU32("size")
d.DecodeRangeFn(int64(offset)*8, int64(size)*8, func(d *decode.D) {
typ := d.FieldUTF8("type", 4)
d.FieldU32("reserved")
if fn, ok := typToDecode[typ]; ok {
d.DecodeLenFn(int64(size-4-4)*8, fn)
} else {
d.FieldBitBufLen("data", int64(size-4-4)*8)
}
})
})
}
})
})
})
return nil
}

207
format/icc/testdata/sRGB2014.fqtest vendored Normal file
View File

@ -0,0 +1,207 @@
# sRGB2014.icc is from https://www.color.org/srgbprofiles.xalter
/sRGB2014.icc:
> fq -d icc_profile verbose /sRGB2014.icc
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /sRGB2014.icc (icc_profile) 0x0-0xbcf.7 (3024)
| | | header: {} 0x0-0x7f.7 (128)
0x000|00 00 0b d0 |.... | size: 3024 0x0-0x3.7 (4)
0x000| 00 00 00 00 | .... | cmm_type_signature: "\x00\x00\x00\x00" 0x4-0x7.7 (4)
0x000| 02 | . | version_major: 2 0x8-0x8.7 (1)
0x000| 00 | . | version_minor: 0 0x9-0x9.7 (1)
0x000| 00 00 | .. | version_reserved: 0 0xa-0xb.7 (2)
0x000| 6d 6e 74 72| mntr| device_class_signature: "mntr" 0xc-0xf.7 (4)
0x010|52 47 42 20 |RGB | color_space: "RGB " 0x10-0x13.7 (4)
0x010| 58 59 5a 20 | XYZ | connection_space: "XYZ " 0x14-0x17.7 (4)
| | | timestamp: {} 0x18-0x23.7 (12)
0x010| 07 df | .. | year: 2015 0x18-0x19.7 (2)
0x010| 00 02 | .. | month: 2 0x1a-0x1b.7 (2)
0x010| 00 0f | .. | day: 15 0x1c-0x1d.7 (2)
0x010| 00 00| ..| hours: 0 0x1e-0x1f.7 (2)
0x020|00 00 |.. | minutes: 0 0x20-0x21.7 (2)
0x020| 00 00 | .. | seconds: 0 0x22-0x23.7 (2)
0x020| 61 63 73 70 | acsp | file_signature: "acsp" 0x24-0x27.7 (4)
0x020| 00 00 00 00 | .... | primary_platform: "\x00\x00\x00\x00" 0x28-0x2b.7 (4)
0x020| 00 00 00 00| ....| flags: 0 0x2c-0x2f.7 (4)
0x030|00 00 00 00 |.... | device_manufacturer: "\x00\x00\x00\x00" 0x30-0x33.7 (4)
0x030| 00 00 00 00 | .... | device_model: "\x00\x00\x00\x00" 0x34-0x37.7 (4)
0x030| 00 00 00 01 00 00 00 00| ........| device_attribute: "\x00\x00\x00\x01\x00\x00\x00\x00" 0x38-0x3f.7 (8)
0x040|00 00 00 00 |.... | render_intent: "\x00\x00\x00\x00" 0x40-0x43.7 (4)
0x040| 00 00 f6 d6 00 01 00 00 00 00 d3 2d| ...........-| xyz_illuminant: "\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-" 0x44-0x4f.7 (12)
0x050|00 00 00 00 |.... | profile_creator_signature: "\x00\x00\x00\x00" 0x50-0x53.7 (4)
0x050| 3d 0e b2 de ae 93 97 be 9b 67 26 ce| =........g&.| profile_id: "=\x0e\xb2ޮ\x93\x97\xbe\x9bg&Ό\nC\xce" 0x54-0x63.7 (16)
0x060|8c 0a 43 ce |..C. |
0x060| 00 00 00 00 00 00 00 00 00 00 00 00| ............| reserved: Correct (none) (zero padding) 0x64-0x7f.7 (28)
0x070|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
| | | tag_table: {} 0x80-0xbcf.7 (2896)
0x080|00 00 00 10 |.... | count: 16 0x80-0x83.7 (4)
| | | table: [16] 0x84-0xbcf.7 (2892)
| | | [0]: element {} 0x84-0x1a6.7 (291)
0x080| 64 65 73 63 | desc | signature: "desc" 0x84-0x87.7 (4)
0x080| 00 00 01 44 | ...D | offset: 324 0x88-0x8b.7 (4)
0x080| 00 00 00 63| ...c| size: 99 0x8c-0x8f.7 (4)
0x140| 64 65 73 63 | desc | type: "desc" 0x144-0x147.7 (4)
0x140| 00 00 00 00 | .... | reserved: 0 0x148-0x14b.7 (4)
0x140| 00 00 00 09| ....| description_length: 9 0x14c-0x14f.7 (4)
0x150|73 52 47 42 32 30 31 34 00 |sRGB2014. | description: "sRGB2014" 0x150-0x158.7 (9)
0x150| 00 00 00 00 | .... | language_code: 0 0x159-0x15c.7 (4)
0x150| 00 00 00| ...| localizable_description_length: 0 0x15d-0x160.7 (4)
0x160|00 |. |
| | | localizable_description: "" 0x161-NA (0)
0x160| 00 00 | .. | script_code: 0 0x161-0x162.7 (2)
0x160| 00 | . | macintosh_description_length: 0 0x163-0x163.7 (1)
0x160| 00 00 00 00 00 00 00 00 00 00 00 00| ............| macintosh_description: "" 0x164-0x1a6.7 (67)
0x170|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0x1a6.7 (67) | |
| | | [1]: element {} 0x90-0x1bb.7 (300)
0x090|62 58 59 5a |bXYZ | signature: "bXYZ" 0x90-0x93.7 (4)
0x090| 00 00 01 a8 | .... | offset: 424 0x94-0x97.7 (4)
0x090| 00 00 00 14 | .... | size: 20 0x98-0x9b.7 (4)
0x1a0| 58 59 5a 20 | XYZ | type: "XYZ " 0x1a8-0x1ab.7 (4)
0x1a0| 00 00 00 00| ....| reserved: 0 0x1ac-0x1af.7 (4)
0x1b0|00 00 24 a0 |..$. | X: 0.14306640625 0x1b0-0x1b3.7 (4)
0x1b0| 00 00 0f 84 | .... | Y: 0.06060791015625 0x1b4-0x1b7.7 (4)
0x1b0| 00 00 b6 cf | .... | Z: 0.7140960693359375 0x1b8-0x1bb.7 (4)
| | | [2]: element {} 0x9c-0x9c7.7 (2348)
0x090| 62 54 52 43| bTRC| signature: "bTRC" 0x9c-0x9f.7 (4)
0x0a0|00 00 01 bc |.... | offset: 444 0xa0-0xa3.7 (4)
0x0a0| 00 00 08 0c | .... | size: 2060 0xa4-0xa7.7 (4)
0x1b0| 63 75 72 76| curv| type: "curv" 0x1bc-0x1bf.7 (4)
0x1c0|00 00 00 00 |.... | reserved: 0 0x1c0-0x1c3.7 (4)
0x1c0| 00 00 04 00 00 00 00 05 00 0a 00 0f| ............| data: 0000040000000005000a000f00140019... 0x1c4-0x9c7.7 (2052)
0x1d0|00 14 00 19 00 1e 00 23 00 28 00 2d 00 32 00 37|.......#.(.-.2.7|
* |until 0x9c7.7 (2052) | |
| | | [3]: element {} 0xa8-0x9c7.7 (2336)
0x0a0| 67 54 52 43 | gTRC | signature: "gTRC" 0xa8-0xab.7 (4)
0x0a0| 00 00 01 bc| ....| offset: 444 0xac-0xaf.7 (4)
0x0b0|00 00 08 0c |.... | size: 2060 0xb0-0xb3.7 (4)
0x1b0| 63 75 72 76| curv| type: "curv" 0x1bc-0x1bf.7 (4)
0x1c0|00 00 00 00 |.... | reserved: 0 0x1c0-0x1c3.7 (4)
0x1c0| 00 00 04 00 00 00 00 05 00 0a 00 0f| ............| data: 0000040000000005000a000f00140019... 0x1c4-0x9c7.7 (2052)
0x1d0|00 14 00 19 00 1e 00 23 00 28 00 2d 00 32 00 37|.......#.(.-.2.7|
* |until 0x9c7.7 (2052) | |
| | | [4]: element {} 0xb4-0x9c7.7 (2324)
0x0b0| 72 54 52 43 | rTRC | signature: "rTRC" 0xb4-0xb7.7 (4)
0x0b0| 00 00 01 bc | .... | offset: 444 0xb8-0xbb.7 (4)
0x0b0| 00 00 08 0c| ....| size: 2060 0xbc-0xbf.7 (4)
0x1b0| 63 75 72 76| curv| type: "curv" 0x1bc-0x1bf.7 (4)
0x1c0|00 00 00 00 |.... | reserved: 0 0x1c0-0x1c3.7 (4)
0x1c0| 00 00 04 00 00 00 00 05 00 0a 00 0f| ............| data: 0000040000000005000a000f00140019... 0x1c4-0x9c7.7 (2052)
0x1d0|00 14 00 19 00 1e 00 23 00 28 00 2d 00 32 00 37|.......#.(.-.2.7|
* |until 0x9c7.7 (2052) | |
| | | [5]: element {} 0xc0-0xa4f.7 (2448)
0x0c0|64 6d 64 64 |dmdd | signature: "dmdd" 0xc0-0xc3.7 (4)
0x0c0| 00 00 09 c8 | .... | offset: 2504 0xc4-0xc7.7 (4)
0x0c0| 00 00 00 88 | .... | size: 136 0xc8-0xcb.7 (4)
0x9c0| 64 65 73 63 | desc | type: "desc" 0x9c8-0x9cb.7 (4)
0x9c0| 00 00 00 00| ....| reserved: 0 0x9cc-0x9cf.7 (4)
0x9d0|00 00 00 2e |.... | description_length: 46 0x9d0-0x9d3.7 (4)
0x9d0| 49 45 43 20 36 31 39 36 36 2d 32 2d| IEC 61966-2-| description: "IEC 61966-2-1 Default RGB Colour Space - sRGB" 0x9d4-0xa01.7 (46)
0x9e0|31 20 44 65 66 61 75 6c 74 20 52 47 42 20 43 6f|1 Default RGB Co|
* |until 0xa01.7 (46) | |
0xa00| 00 00 00 00 | .... | language_code: 0 0xa02-0xa05.7 (4)
0xa00| 00 00 00 00 | .... | localizable_description_length: 0 0xa06-0xa09.7 (4)
| | | localizable_description: "" 0xa0a-NA (0)
0xa00| 00 00 | .. | script_code: 0 0xa0a-0xa0b.7 (2)
0xa00| 00 | . | macintosh_description_length: 0 0xa0c-0xa0c.7 (1)
0xa00| 00 00 00| ...| macintosh_description: "" 0xa0d-0xa4f.7 (67)
0xa10|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0xa4f.7 (67) | |
| | | [6]: element {} 0xcc-0xa63.7 (2456)
0x0c0| 67 58 59 5a| gXYZ| signature: "gXYZ" 0xcc-0xcf.7 (4)
0x0d0|00 00 0a 50 |...P | offset: 2640 0xd0-0xd3.7 (4)
0x0d0| 00 00 00 14 | .... | size: 20 0xd4-0xd7.7 (4)
0xa50|58 59 5a 20 |XYZ | type: "XYZ " 0xa50-0xa53.7 (4)
0xa50| 00 00 00 00 | .... | reserved: 0 0xa54-0xa57.7 (4)
0xa50| 00 00 62 99 | ..b. | X: 0.3851470947265625 0xa58-0xa5b.7 (4)
0xa50| 00 00 b7 85| ....| Y: 0.7168731689453125 0xa5c-0xa5f.7 (4)
0xa60|00 00 18 da |.... | Z: 0.097076416015625 0xa60-0xa63.7 (4)
| | | [7]: element {} 0xd8-0xa77.7 (2464)
0x0d0| 6c 75 6d 69 | lumi | signature: "lumi" 0xd8-0xdb.7 (4)
0x0d0| 00 00 0a 64| ...d| offset: 2660 0xdc-0xdf.7 (4)
0x0e0|00 00 00 14 |.... | size: 20 0xe0-0xe3.7 (4)
0xa60| 58 59 5a 20 | XYZ | type: "XYZ " 0xa64-0xa67.7 (4)
0xa60| 00 00 00 00 | .... | reserved: 0 0xa68-0xa6b.7 (4)
0xa60| 00 00 00 00| ....| X: 0 0xa6c-0xa6f.7 (4)
0xa70|00 50 00 00 |.P.. | Y: 80 0xa70-0xa73.7 (4)
0xa70| 00 00 00 00 | .... | Z: 0 0xa74-0xa77.7 (4)
| | | [8]: element {} 0xe4-0xa9b.7 (2488)
0x0e0| 6d 65 61 73 | meas | signature: "meas" 0xe4-0xe7.7 (4)
0x0e0| 00 00 0a 78 | ...x | offset: 2680 0xe8-0xeb.7 (4)
0x0e0| 00 00 00 24| ...$| size: 36 0xec-0xef.7 (4)
0xa70| 6d 65 61 73 | meas | type: "meas" 0xa78-0xa7b.7 (4)
0xa70| 00 00 00 00| ....| reserved: 0 0xa7c-0xa7f.7 (4)
0xa80|00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00|................| data: 00000001000000000000000000000000... 0xa80-0xa9b.7 (28)
0xa90|00 00 00 00 00 00 00 00 00 00 00 02 |............ |
| | | [9]: element {} 0xf0-0xaaf.7 (2496)
0x0f0|62 6b 70 74 |bkpt | signature: "bkpt" 0xf0-0xf3.7 (4)
0x0f0| 00 00 0a 9c | .... | offset: 2716 0xf4-0xf7.7 (4)
0x0f0| 00 00 00 14 | .... | size: 20 0xf8-0xfb.7 (4)
0xa90| 58 59 5a 20| XYZ | type: "XYZ " 0xa9c-0xa9f.7 (4)
0xaa0|00 00 00 00 |.... | reserved: 0 0xaa0-0xaa3.7 (4)
0xaa0| 00 00 00 9e | .... | X: 0.002410888671875 0xaa4-0xaa7.7 (4)
0xaa0| 00 00 00 a4 | .... | Y: 0.00250244140625 0xaa8-0xaab.7 (4)
0xaa0| 00 00 00 87| ....| Z: 0.0020599365234375 0xaac-0xaaf.7 (4)
| | | [10]: element {} 0xfc-0xac3.7 (2504)
0x0f0| 72 58 59 5a| rXYZ| signature: "rXYZ" 0xfc-0xff.7 (4)
0x100|00 00 0a b0 |.... | offset: 2736 0x100-0x103.7 (4)
0x100| 00 00 00 14 | .... | size: 20 0x104-0x107.7 (4)
0xab0|58 59 5a 20 |XYZ | type: "XYZ " 0xab0-0xab3.7 (4)
0xab0| 00 00 00 00 | .... | reserved: 0 0xab4-0xab7.7 (4)
0xab0| 00 00 6f a2 | ..o. | X: 0.436065673828125 0xab8-0xabb.7 (4)
0xab0| 00 00 38 f5| ..8.| Y: 0.2224884033203125 0xabc-0xabf.7 (4)
0xac0|00 00 03 90 |.... | Z: 0.013916015625 0xac0-0xac3.7 (4)
| | | [11]: element {} 0x108-0xacf.7 (2504)
0x100| 74 65 63 68 | tech | signature: "tech" 0x108-0x10b.7 (4)
0x100| 00 00 0a c4| ....| offset: 2756 0x10c-0x10f.7 (4)
0x110|00 00 00 0c |.... | size: 12 0x110-0x113.7 (4)
0xac0| 73 69 67 20 | sig | type: "sig " 0xac4-0xac7.7 (4)
0xac0| 00 00 00 00 | .... | reserved: 0 0xac8-0xacb.7 (4)
0xac0| 43 52 54 20| CRT | data: 43525420 0xacc-0xacf.7 (4)
| | | [12]: element {} 0x114-0xb56.7 (2627)
0x110| 76 75 65 64 | vued | signature: "vued" 0x114-0x117.7 (4)
0x110| 00 00 0a d0 | .... | offset: 2768 0x118-0x11b.7 (4)
0x110| 00 00 00 87| ....| size: 135 0x11c-0x11f.7 (4)
0xad0|64 65 73 63 |desc | type: "desc" 0xad0-0xad3.7 (4)
0xad0| 00 00 00 00 | .... | reserved: 0 0xad4-0xad7.7 (4)
0xad0| 00 00 00 2d | ...- | description_length: 45 0xad8-0xadb.7 (4)
0xad0| 52 65 66 65| Refe| description: "Reference Viewing Condition in IEC 61966-2-1" 0xadc-0xb08.7 (45)
0xae0|72 65 6e 63 65 20 56 69 65 77 69 6e 67 20 43 6f|rence Viewing Co|
* |until 0xb08.7 (45) | |
0xb00| 00 00 00 00 | .... | language_code: 0 0xb09-0xb0c.7 (4)
0xb00| 00 00 00| ...| localizable_description_length: 0 0xb0d-0xb10.7 (4)
0xb10|00 |. |
| | | localizable_description: "" 0xb11-NA (0)
0xb10| 00 00 | .. | script_code: 0 0xb11-0xb12.7 (2)
0xb10| 00 | . | macintosh_description_length: 0 0xb13-0xb13.7 (1)
0xb10| 00 00 00 00 00 00 00 00 00 00 00 00| ............| macintosh_description: "" 0xb14-0xb56.7 (67)
0xb20|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0xb56.7 (67) | |
| | | [13]: element {} 0x120-0xb6b.7 (2636)
0x120|77 74 70 74 |wtpt | signature: "wtpt" 0x120-0x123.7 (4)
0x120| 00 00 0b 58 | ...X | offset: 2904 0x124-0x127.7 (4)
0x120| 00 00 00 14 | .... | size: 20 0x128-0x12b.7 (4)
0xb50| 58 59 5a 20 | XYZ | type: "XYZ " 0xb58-0xb5b.7 (4)
0xb50| 00 00 00 00| ....| reserved: 0 0xb5c-0xb5f.7 (4)
0xb60|00 00 f6 d6 |.... | X: 0.964202880859375 0xb60-0xb63.7 (4)
0xb60| 00 01 00 00 | .... | Y: 1 0xb64-0xb67.7 (4)
0xb60| 00 00 d3 2d | ...- | Z: 0.8249053955078125 0xb68-0xb6b.7 (4)
| | | [14]: element {} 0x12c-0xba2.7 (2679)
0x120| 63 70 72 74| cprt| signature: "cprt" 0x12c-0x12f.7 (4)
0x130|00 00 0b 6c |...l | offset: 2924 0x130-0x133.7 (4)
0x130| 00 00 00 37 | ...7 | size: 55 0x134-0x137.7 (4)
0xb60| 74 65 78 74| text| type: "text" 0xb6c-0xb6f.7 (4)
0xb70|00 00 00 00 |.... | reserved: 0 0xb70-0xb73.7 (4)
0xb70| 43 6f 70 79 72 69 67 68 74 20 49 6e| Copyright In| text: "Copyright International Color Consortium, 2015" 0xb74-0xba2.7 (47)
0xb80|74 65 72 6e 61 74 69 6f 6e 61 6c 20 43 6f 6c 6f|ternational Colo|
* |until 0xba2.7 (47) | |
| | | [15]: element {} 0x138-0xbcf.7 (2712)
0x130| 63 68 61 64 | chad | signature: "chad" 0x138-0x13b.7 (4)
0x130| 00 00 0b a4| ....| offset: 2980 0x13c-0x13f.7 (4)
0x140|00 00 00 2c |..., | size: 44 0x140-0x143.7 (4)
0xba0| 73 66 33 32 | sf32 | type: "sf32" 0xba4-0xba7.7 (4)
0xba0| 00 00 00 00 | .... | reserved: 0 0xba8-0xbab.7 (4)
0xba0| 00 01 0c 44| ...D| data: 00010c44000005dffffff32600000794... 0xbac-0xbcf.7 (36)
0xbb0|00 00 05 df ff ff f3 26 00 00 07 94 00 00 fd 8f|.......&........|
0xbc0|ff ff fb a1 ff ff fd a2 00 00 03 db 00 00 c0 75|...............u|
0x1a0| 00 | . | unknown0: 00 0x1a7-0x1a7.7 (1)
0xb50| 00 | . | unknown1: 00 0xb57-0xb57.7 (1)
0xba0| 00 | . | unknown2: 00 0xba3-0xba3.7 (1)

BIN
format/icc/testdata/sRGB2014.icc vendored Normal file

Binary file not shown.

236
format/id3/id3v1.go Normal file
View File

@ -0,0 +1,236 @@
package id3
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
"strings"
)
// TODO: trim strings?
// TODO: comment 28 long, zero byte, track number
func init() {
registry.MustRegister(&decode.Format{
Name: format.ID3V1,
Description: "ID3v1 metadata",
DecodeFn: id3v1Decode,
})
}
func field(d *decode.D, name string, nBytes int) {
d.FieldStrFn(name, func() (string, string) {
return strings.Trim(d.UTF8(nBytes), "\x00 "), ""
})
}
// Decode ID3v1 tag
func id3v1Decode(d *decode.D, in interface{}) interface{} {
d.ValidateAtLeastBitsLeft(128 * 8)
d.FieldValidateUTF8("magic", "TAG")
if d.PeekBits(8) == uint64('+') {
d.Invalid("looks like id3v11")
}
field(d, "song_name", 30)
field(d, "artist", 30)
field(d, "album_name", 30)
field(d, "year", 4)
field(d, "comment", 30)
// from https://en.wikipedia.org/wiki/List_of_ID3v1_Genres
d.FieldStringMapFn("genre", map[uint64]string{
0: "Blues",
1: "Classic Rock",
2: "Country",
3: "Dance",
4: "Disco",
5: "Funk",
6: "Grunge",
7: "Hip-Hop",
8: "Jazz",
9: "Metal",
10: "New Age",
11: "Oldies",
12: "Other",
13: "Pop",
14: "Rhythm and Blues",
15: "Rap",
16: "Reggae",
17: "Rock",
18: "Techno",
19: "Industrial",
20: "Alternative",
21: "Ska",
22: "Death Metal",
23: "Pranks",
24: "Soundtrack",
25: "Euro-Techno",
26: "Ambient",
27: "Trip-Hop",
28: "Vocal",
29: "Jazz & Funk",
30: "Fusion",
31: "Trance",
32: "Classical",
33: "Instrumental",
34: "Acid",
35: "House",
36: "Game",
37: "Sound clip",
38: "Gospel",
39: "Noise",
40: "Alternative Rock",
41: "Bass",
42: "Soul",
43: "Punk",
44: "Space",
45: "Meditative",
46: "Instrumental Pop",
47: "Instrumental Rock",
48: "Ethnic",
49: "Gothic",
50: "Darkwave",
51: "Techno-Industrial",
52: "Electronic",
53: "Pop-Folk",
54: "Eurodance",
55: "Dream",
56: "Southern Rock",
57: "Comedy",
58: "Cult",
59: "Gangsta",
60: "Top 40",
61: "Christian Rap",
62: "Pop/Funk",
63: "Jungle music",
64: "Native US",
65: "Cabaret",
66: "New Wave",
67: "Psychedelic",
68: "Rave",
69: "Showtunes",
70: "Trailer",
71: "Lo-Fi",
72: "Tribal",
73: "Acid Punk",
74: "Acid Jazz",
75: "Polka",
76: "Retro",
77: "Musical",
78: "Rock n Roll",
79: "Hard Rock",
80: "Folk",
81: "Folk-Rock",
82: "National Folk",
83: "Swing",
84: "Fast Fusion",
85: "Bebop",
86: "Latin",
87: "Revival",
88: "Celtic",
89: "Bluegrass",
90: "Avantgarde",
91: "Gothic Rock",
92: "Progressive Rock",
93: "Psychedelic Rock",
94: "Symphonic Rock",
95: "Slow Rock",
96: "Big Band",
97: "Chorus",
98: "Easy Listening",
99: "Acoustic",
100: "Humour",
101: "Speech",
102: "Chanson",
103: "Opera",
104: "Chamber Music",
105: "Sonata",
106: "Symphony",
107: "Booty Bass",
108: "Primus",
109: "Porn Groove",
110: "Satire",
111: "Slow Jam",
112: "Club",
113: "Tango",
114: "Samba",
115: "Folklore",
116: "Ballad",
117: "Power Ballad",
118: "Rhythmic Soul",
119: "Freestyle",
120: "Duet",
121: "Punk Rock",
122: "Drum Solo",
123: "A cappella",
124: "Euro-House",
125: "Dance Hall",
126: "Goa music",
127: "Drum & Bass",
128: "Club-House",
129: "Hardcore Techno",
130: "Terror",
131: "Indie",
132: "BritPop",
133: "Negerpunk",
134: "Polsk Punk",
135: "Beat",
136: "Christian Gangsta Rap",
137: "Heavy Metal",
138: "Black Metal",
139: "Crossover",
140: "Contemporary Christian",
141: "Christian Rock",
142: "Merengue",
143: "Salsa",
144: "Thrash Metal",
145: "Anime",
146: "Jpop",
147: "Synthpop",
148: "Abstract",
149: "Art Rock",
150: "Baroque",
151: "Bhangra",
152: "Big beat",
153: "Breakbeat",
154: "Chillout",
155: "Downtempo",
156: "Dub",
157: "EBM",
158: "Eclectic",
159: "Electro",
160: "Electroclash",
161: "Emo",
162: "Experimental",
163: "Garage",
164: "Global",
165: "IDM",
166: "Illbient",
167: "Industro-Goth",
168: "Jam Band",
169: "Krautrock",
170: "Leftfield",
171: "Lounge",
172: "Math Rock",
173: "New Romantic",
174: "Nu-Breakz",
175: "Post-Punk",
176: "Post-Rock",
177: "Psytrance",
178: "Shoegaze",
179: "Space Rock",
180: "Trop Rock",
181: "World Music",
182: "Neoclassical",
183: "Audiobook",
184: "Audio Theatre",
185: "Neue Deutsche Welle",
186: "Podcast",
187: "Indie-Rock",
188: "G-Funk",
189: "Dubstep",
190: "Garage Rock",
191: "Psybient",
}, "Unknown", d.U8, decode.NumberDecimal)
return nil
}

35
format/id3/id3v11.go Normal file
View File

@ -0,0 +1,35 @@
package id3
import (
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.ID3V11,
Description: "ID3v1.1 metadata",
DecodeFn: id3v11Decode,
})
}
func id3v11Decode(d *decode.D, in interface{}) interface{} {
d.ValidateAtLeastBitsLeft(128 * 8)
d.FieldValidateUTF8("magic", "TAG+")
d.FieldUTF8("title", 60)
d.FieldUTF8("artist", 60)
d.FieldUTF8("album", 60)
d.FieldStringMapFn("speed", map[uint64]string{
0: "unset",
1: "slow",
2: "medium",
3: "fast",
4: "hardcore",
}, "Unknown", d.U8, decode.NumberDecimal)
d.FieldUTF8("genre", 30)
d.FieldUTF8("start", 6)
d.FieldUTF8("stop", 6)
return nil
}

647
format/id3/id3v2.go Normal file
View File

@ -0,0 +1,647 @@
package id3
// https://id3.org/id3v2.3.0
// https://id3.org/id3v2.4.0-structure
// https://id3.org/id3v2.4.0-frames
// https://id3.org/id3v2-chapters-1.0
import (
"bytes"
"fmt"
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
"io"
"strings"
)
var imageFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.ID3V2,
Description: "ID3v2 metadata",
DecodeFn: id3v2Decode,
Dependencies: []decode.Dependency{
{Names: []string{format.IMAGE}, Formats: &imageFormat},
},
})
}
var idDescriptions = map[string]string{
"CHAP": "Chapter",
"CTOC": "Table of contents",
"AENC": "Audio encryption",
"APIC": "Attached picture",
"ASPI": "Audio seek point index",
"COMM": "Comments",
"COMR": "Commercial frame",
"ENCR": "Encryption method registration",
"EQU2": "Equalisation (2)",
"EQUA": "Equalization",
"ETCO": "Event timing codes",
"GEOB": "General encapsulated object",
"GRID": "Group identification registration",
"IPLS": "Involved people list",
"LINK": "Linked information",
"MCDI": "Music CD identifier",
"MLLT": "MPEG location lookup table",
"OWNE": "Ownership frame",
"PCNT": "Play counter",
"POPM": "Popularimeter",
"POSS": "Position synchronisation frame",
"PRIV": "Private frame",
"RBUF": "Recommended buffer size",
"RVA2": "Relative volume adjustment (2)",
"RVAD": "Relative volume adjustment",
"RVRB": "Reverb",
"SEEK": "Seek frame",
"SIGN": "Signature frame",
"SYLT": "Synchronized lyric/text",
"SYTC": "Synchronized tempo codes",
"TALB": "Album/Movie/Show title",
"TBPM": "BPM (beats per minute)",
"TCOM": "Composer",
"TCON": "Content type",
"TCOP": "Copyright message",
"TDAT": "Date",
"TDEN": "Encoding time",
"TDLY": "Playlist delay",
"TDOR": "Original release time",
"TDRC": "Recording time",
"TDRL": "Release time",
"TDTG": "Tagging time",
"TENC": "Encoded by",
"TEXT": "Lyricist/Text writer",
"TFLT": "File type",
"TIME": "Time",
"TIPL": "Involved people list",
"TIT1": "Content group description",
"TIT2": "Title/songname/content description",
"TIT3": "Subtitle/Description refinement",
"TKEY": "Initial key",
"TLAN": "Language(s)",
"TLEN": "Length",
"TMCL": "Musician credits list",
"TMED": "Media type",
"TMOO": "Mood",
"TOAL": "Original album/movie/show title",
"TOFN": "Original filename",
"TOLY": "Original lyricist(s)/text writer(s)",
"TOPE": "Original artist(s)/performer(s)",
"TORY": "Original release year",
"TOWN": "File owner/licensee",
"TPE1": "Lead performer(s)/Soloist(s)",
"TPE2": "Band/orchestra/accompaniment",
"TPE3": "Conductor/performer refinement",
"TPE4": "Interpreted, remixed, or otherwise modified by",
"TPOS": "Part of a set",
"TPRO": "Produced notice",
"TPUB": "Publisher",
"TRCK": "Track number/Position in set",
"TRDA": "Recording dates",
"TRSN": "Internet radio station name",
"TRSO": "Internet radio station owner",
"TSIZ": "Size",
"TSOA": "Album sort order",
"TSOP": "Performer sort order",
"TSOT": "Title sort order",
"TSRC": "ISRC (international standard recording code)",
"TSSE": "Software/Hardware and settings used for encoding",
"TSST": "Set subtitle",
"TXXX": "User defined text information frame",
"TYER": "Year",
"UFID": "Unique file identifier",
"USER": "Terms of use",
"USLT": "Unsychronized lyric/text transcription",
"WCOM": "Commercial information",
"WCOP": "Copyright/Legal information",
"WOAF": "Official audio file webpage",
"WOAR": "Official artist/performer webpage",
"WOAS": "Official audio source webpage",
"WORS": "Official Internet radio station homepage",
"WPAY": "Payment",
"WPUB": "Publishers official webpage",
"WXXX": "User defined URL link frame",
"BUF": "Recommended buffer size",
"CNT": "Play counter",
"COM": "Comments",
"CRA": "Audio encryption",
"CRM": "Encrypted meta frame",
"ETC": "Event timing codes",
"EQU": "Equalization",
"GEO": "General encapsulated object",
"IPL": "Involved people list",
"LNK": "Linked information",
"MCI": "Music CD Identifier",
"MLL": "MPEG location lookup table",
"PIC": "Attached picture",
"POP": "Popularimeter",
"REV": "Reverb",
"RVA": "Relative volume adjustment",
"SLT": "Synchronized lyric/text",
"STC": "Synced tempo codes",
"TAL": "Album/Movie/Show title",
"TBP": "BPM (Beats Per Minute)",
"TCM": "Composer",
"TCO": "Content type",
"TCR": "Copyright message",
"TDA": "Date",
"TDY": "Playlist delay",
"TEN": "Encoded by",
"TFT": "File type",
"TIM": "Time",
"TKE": "Initial key",
"TLA": "Language(s)",
"TLE": "Length",
"TMT": "Media type",
"TOA": "Original artist(s)/performer(s)",
"TOF": "Original filename",
"TOL": "Original Lyricist(s)/text writer(s)",
"TOR": "Original release year",
"TOT": "Original album/Movie/Show title",
"TP1": "Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group",
"TP2": "Band/Orchestra/Accompaniment",
"TP3": "Conductor/Performer refinement",
"TP4": "Interpreted, remixed, or otherwise modified by",
"TPA": "Part of a set",
"TPB": "Publisher",
"TRC": "ISRC (International Standard Recording Code)",
"TRD": "Recording dates",
"TRK": "Track number/Position in set",
"TSI": "Size",
"TSS": "Software/hardware and settings used for encoding",
"TT1": "Content group description",
"TT2": "Title/Songname/Content description",
"TT3": "Subtitle/Description refinement",
"TXT": "Lyricist/text writer",
"TXX": "User defined text information frame",
"TYE": "Year",
"UFI": "Unique file identifier",
"ULT": "Unsychronized lyric/text transcription",
"WAF": "Official audio file webpage",
"WAR": "Official artist/performer webpage",
"WAS": "Official audio source webpage",
"WCM": "Commercial information",
"WCP": "Copyright/Legal information",
"WPB": "Publishers official webpage",
"WXX": "User defined URL link frame",
}
// id3v2 MPEG/AAC unsynchronisation reader
// Replace 0xff 0x00 0xab with 0xff 0xab in byte stream
type unsyncReader struct {
io.Reader
lastFF bool
}
func (r unsyncReader) Read(p []byte) (n int, err error) {
n, err = r.Reader.Read(p)
ni := 0
for i, b := range p[0:n] {
if r.lastFF && b == 0x00 {
n--
r.lastFF = false
continue
} else {
r.lastFF = b == 0xff
}
p[ni] = p[i]
ni++
}
return n, err
}
const (
encodingISO8859_1 = 0
encodingUTF16 = 1
encodingUTF16BE = 2
encodingUTF8 = 3
)
// $00 ISO-8859-1 [ISO-8859-1]. Terminated with $00.
// $01 UTF-16 [UTF-16] encoded Unicode [UNICODE] with BOM. All
// strings in the same frame SHALL have the same byteorder.
// Terminated with $00 00.
// $02 UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM.
// Terminated with $00 00.
// $03 UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00.
var encodingNames = map[uint64]string{
encodingISO8859_1: "ISO-8859-1",
encodingUTF16: "UTF-16",
encodingUTF16BE: "UTF-16BE",
encodingUTF8: "UTF-8",
}
var encodingLen = map[uint64]int{
encodingISO8859_1: 1,
encodingUTF16: 2,
encodingUTF16BE: 2,
encodingUTF8: 1,
}
var encodingToUTF8 = map[int]func(b []byte) string{
encodingISO8859_1: func(b []byte) string {
rs := make([]rune, len(b))
for i, r := range b {
rs[i] = rune(r)
}
return string(rs)
},
encodingUTF16: func(b []byte) string {
beBOM := []byte("\xfe\xff")
leBOM := []byte("\xff\xfe")
var rs []rune
switch {
case bytes.HasPrefix(b, leBOM):
// strip BOM
b = b[2:]
rs = make([]rune, len(b)/2)
for i := 0; i < len(b)/2; i++ {
rs[i] = rune(uint(b[i*2]) | uint(b[i*2+1])<<8)
}
case bytes.HasPrefix(b, beBOM):
b = b[2:]
fallthrough
default:
rs = make([]rune, len(b)/2)
for i := 0; i < len(b)/2; i++ {
rs[i] = rune(uint(b[i*2])<<8 | uint(b[i*2+1]))
}
}
return string(rs)
},
encodingUTF16BE: func(b []byte) string {
rs := make([]rune, len(b)/2)
for i := 0; i < len(b)/2; i++ {
rs[i] = rune(uint(b[i*2])<<8 + uint(b[i*2+1]))
}
return string(rs)
},
encodingUTF8: func(b []byte) string {
return string(b)
},
}
func syncSafeU32(d *decode.D) uint64 {
u := d.U32()
// syncsafe integer is a number encoded
// with 8th bit in each byte set to zero
// 0aaaaaaa0bbbbbbb0ccccccc0ddddddd ->
// 0000aaaaaaabbbbbbbcccccccddddddd
return (((u & 0x7f000000) >> 3) |
((u & 0x007f0000) >> 2) |
((u & 0x00007f00) >> 1) |
((u & 0x0000007f) >> 0))
}
func text(d *decode.D, encoding int, nBytes int) string {
encodingFn := encodingToUTF8[encodingUTF8]
if fn, ok := encodingToUTF8[encoding]; ok {
encodingFn = fn
}
return strings.TrimRight(encodingFn(d.BytesLen(nBytes)), "\x00")
}
func textNull(d *decode.D, encoding int) string {
nullLen := encodingLen[encodingUTF8]
if n, ok := encodingLen[uint64(encoding)]; ok {
nullLen = n
}
pos := d.PeekFind(nullLen*8, 8, func(v uint64) bool { return v == 0 }, -1) / 8
textLen := int(pos + int64(nullLen))
text := text(d, encoding, textLen)
if nullLen > 1 && d.PeekBits(8) == 0 {
d.SeekRel(8)
}
return text
}
func fieldSyncSafeU32(d *decode.D, name string) uint64 {
return d.FieldUFn(name, func() (uint64, decode.DisplayFormat, string) {
return syncSafeU32(d), decode.NumberDecimal, ""
})
}
func fieldTextNull(d *decode.D, name string, encoding int) string { //nolint:unparam
return d.FieldStrFn(name, func() (string, string) {
return textNull(d, encoding), ""
})
}
func fieldText(d *decode.D, name string, encoding int, nBytes int) string { //nolint:unparam
return d.FieldStrFn(name, func() (string, string) {
return text(d, encoding, nBytes), ""
})
}
func decodeFrame(d *decode.D, version int) uint64 {
var id string
switch version {
case 2:
id = d.UTF8(3)
d.SeekRel(-3 * 8)
case 3, 4:
id = d.UTF8(4)
d.SeekRel(-4 * 8)
}
var size uint64
var dataSize uint64
// TODO: global tag unsync?
unsyncFlag := false
idDescription := ""
if d, ok := idDescriptions[id]; ok {
idDescription = d
}
switch version {
case 2:
// Frame ID "XXX"
// Frame size $xx xx xx
d.FieldStrFn("id", func() (string, string) { return d.UTF8(3), idDescription })
dataSize = d.FieldU24("size")
size = dataSize + 6
case 3:
// Frame ID $xx xx xx xx (four characters)
// Size $xx xx xx xx
// Flags $xx xx
d.FieldStrFn("id", func() (string, string) { return d.UTF8(4), idDescription })
dataSize = d.FieldU32("size")
d.FieldStructFn("flags", func(d *decode.D) {
// %abc00000 %ijk00000
d.FieldBool("tag_alter_preservation")
d.FieldBool("file_alter_preservation")
d.FieldBool("read_only")
d.FieldU5("unused0")
d.FieldBool("compression")
// TODO: read encruption byte, skip decode of frame data?
d.FieldBool("encryption")
d.FieldBool("grouping_identity")
d.FieldU5("unused1")
})
size = dataSize + 10
case 4:
// Frame ID $xx xx xx xx (four characters)
// Size 4 * %0xxxxxxx (synchsafe integer)
// Flags $xx xx
d.FieldStrFn("id", func() (string, string) { return d.UTF8(4), idDescription })
dataSize = fieldSyncSafeU32(d, "size")
var headerLen uint64 = 10
dataLenFlag := false
d.FieldStructFn("flags", func(d *decode.D) {
// %0abc0000 %0h00kmnp
d.FieldU1("unused0")
d.FieldBool("tag_alter_preservation")
d.FieldBool("file_alter_preservation")
d.FieldBool("read_only")
d.FieldU5("unused1")
d.FieldBool("grouping_identity")
d.FieldU2("unused2")
d.FieldBool("compression")
// TODO: read encruption byte, skip decode of frame data?
d.FieldBool("encryption")
unsyncFlag = d.FieldBool("unsync")
dataLenFlag = d.FieldBool("data_length_indicator")
})
if dataLenFlag {
fieldSyncSafeU32(d, "data_length_indicator")
dataSize -= 4
headerLen += 4
}
size = dataSize + headerLen
}
// note frame function run inside a SubLenFn so they can use BitLefts and
// can't accidentally read too far
frames := map[string]func(d *decode.D){
// <ID3v2.3 or ID3v2.4 frame header, ID: "CHAP"> (10 bytes)
// Element ID <text string> $00
// Start time $xx xx xx xx
// End time $xx xx xx xx
// Start offset $xx xx xx xx
// End offset $xx xx xx xx
// <Optional embedded sub-frames>
"CHAP": func(d *decode.D) {
fieldTextNull(d, "element_id", encodingUTF8)
d.FieldU32("start_time")
d.FieldU32("end_time")
d.FieldU32("start_offset")
d.FieldU32("end_offset")
decodeFrames(d, version, uint64(d.BitsLeft()/8))
},
"CTOC": func(d *decode.D) {
fieldTextNull(d, "element_id", encodingUTF8)
d.FieldU8("ctoc_flags")
entryCount := d.FieldU8("entry_count")
d.FieldArrayFn("entries", func(d *decode.D) {
for i := uint64(0); i < entryCount; i++ {
fieldTextNull(d, "entry", encodingUTF8)
}
})
},
// <Header for 'Attached picture', ID: "APIC">
// Text encoding $xx
// MIME type <text string> $00
// Picture type $xx
// Description <text string according to encoding> $00 (00)
// Picture data <binary data>
"APIC": func(d *decode.D) {
encoding, _ := d.FieldStringMapFn("text_encoding", encodingNames, "unknown", d.U8, decode.NumberDecimal)
fieldTextNull(d, "mime_type", encodingUTF8)
d.FieldU8("picture_type") // TODO: table
fieldTextNull(d, "description", int(encoding))
dv, _, _ := d.FieldTryDecodeLen("picture", d.BitsLeft(), imageFormat)
if dv == nil {
d.FieldBitBufLen("picture", d.BitsLeft())
}
},
// Unsynced lyrics/text "ULT"
// Frame size $xx xx xx
// Text encoding $xx
// Language $xx xx xx
// Content descriptor <textstring> $00 (00)
// Lyrics/text <textstring>
//
// <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT">
// Text encoding $xx
// Language $xx xx xx
// Content descriptor <text string according to encoding> $00 (00)
// Lyrics/text <full text string according to encoding>
//
// Comment "COM"
// Frame size $xx xx xx
// Text encoding $xx
// Language $xx xx xx
// Short content description <textstring> $00 (00)
// The actual text <textstring>
//
// <Header for 'Comment', ID: "COMM">
// Text encoding $xx
// Language $xx xx xx
// Short content descrip. <text string according to encoding> $00 (00)
// The actual text <full text string according to encoding>
"COMM": func(d *decode.D) {
encoding, _ := d.FieldStringMapFn("text_encoding", encodingNames, "unknown", d.U8, decode.NumberDecimal)
d.FieldUTF8("language", 3)
fieldTextNull(d, "description", int(encoding))
fieldText(d, "value", int(encoding), int(d.BitsLeft()/8))
},
// Text information identifier "T00" - "TZZ" , excluding "TXX",
// described in 4.2.2.
// Frame size $xx xx xx
// Text encoding $xx
// Information <textstring>
//
// <Header for 'Text information frame', ID: "T000" - "TZZZ",
// excluding "TXXX" described in 4.2.6.>
// Text encoding $xx
// Information <text string(s) according to encoding>
"T000": func(d *decode.D) {
encoding, _ := d.FieldStringMapFn("text_encoding", encodingNames, "unknown", d.U8, decode.NumberDecimal)
fieldText(d, "text", int(encoding), int(d.BitsLeft()/8))
},
// User defined... "TXX"
// Frame size $xx xx xx
// Text encoding $xx
// Description <textstring> $00 (00)
// Value <textstring>
//
// <Header for 'User defined text information frame', ID: "TXXX">
// Text encoding $xx
// Description <text string according to encoding> $00 (00)
// Value <text string according to encoding>
"TXXX": func(d *decode.D) {
encoding, _ := d.FieldStringMapFn("text_encoding", encodingNames, "unknown", d.U8, decode.NumberDecimal)
fieldTextNull(d, "description", int(encoding))
fieldText(d, "value", int(encoding), int(d.BitsLeft()/8))
},
// <Header for 'Private frame', ID: "PRIV">
// Owner identifier <text string> $00
// The private data <binary data>
"PRIV": func(d *decode.D) {
// TODO: is default ISO8859-1?
fieldTextNull(d, "owner", int(encodingISO8859_1))
d.FieldBitBufLen("data", d.BitsLeft())
},
}
idNormalized := id
switch {
case id == "COMM", id == "COM", id == "USLT", id == "ULT":
idNormalized = "COMM"
case id == "TXX", id == "TXXX":
idNormalized = "TXXX"
case id[0] == 'T':
idNormalized = "T000"
}
if unsyncFlag {
// TODO: DecodeFn
// TODO: unknown after frame decode
unsyncedBb := decode.MustNewBitBufFromReader(unsyncReader{Reader: d.BitBufRange(d.Pos(), int64(dataSize)*8)})
d.FieldDecodeBitBuf("unsync", unsyncedBb, decode.FormatFn(func(d *decode.D, in interface{}) interface{} {
if fn, ok := frames[idNormalized]; ok {
fn(d)
} else {
d.FieldBitBufLen("data", d.BitsLeft())
}
return nil
}))
d.FieldBitBufLen("data", int64(dataSize*8))
} else {
if fn, ok := frames[idNormalized]; ok {
d.DecodeLenFn(int64(dataSize)*8, func(d *decode.D) {
fn(d)
})
} else {
d.FieldBitBufLen("data", int64(dataSize*8))
}
}
return size
}
func decodeFrames(d *decode.D, version int, size uint64) {
d.FieldArrayFn("frames", func(d *decode.D) {
for size > 0 {
if d.PeekBits(8) == 0 {
return
}
d.FieldStructFn("frame", func(d *decode.D) {
size -= decodeFrame(d, version)
})
}
})
if size > 0 {
d.FieldValidateZeroPadding("padding", int(size)*8)
}
}
func id3v2Decode(d *decode.D, in interface{}) interface{} {
d.ValidateAtLeastBitsLeft(4 * 8)
d.FieldValidateUTF8("magic", "ID3")
version := int(d.FieldU8("version"))
versionValid := version == 2 || version == 3 || version == 4
if !versionValid {
d.Invalid(fmt.Sprintf("unsupported version %d", version))
}
d.FieldU8("revision")
var extendedHeader bool
d.FieldStructFn("flags", func(d *decode.D) {
d.FieldBool("unsynchronisation")
extendedHeader = d.FieldBool("extended_header")
d.FieldBool("experimental_indicator")
d.FieldU5("unused")
})
size := d.FieldUFn("size", func() (uint64, decode.DisplayFormat, string) {
return syncSafeU32(d), decode.NumberDecimal, ""
})
var extHeaderSize uint64
if extendedHeader {
d.FieldStructFn("extended_header", func(d *decode.D) {
switch version {
case 3:
extHeaderSize = d.FieldU32("size")
d.FieldBitBufLen("data", int64(extHeaderSize)*8)
case 4:
extHeaderSize = d.FieldUFn("size", func() (uint64, decode.DisplayFormat, string) {
return syncSafeU32(d), decode.NumberDecimal, ""
})
// in v4 synchsafe integer includes itself
d.FieldBitBufLen("data", (int64(extHeaderSize)-4)*8)
}
})
}
decodeFrames(d, version, size)
return nil
}

BIN
format/id3/testdata/apic vendored Normal file

Binary file not shown.

108
format/id3/testdata/apic.fqtest vendored Normal file
View File

@ -0,0 +1,108 @@
# ffmpeg -f lavfi -i anullsrc=d=10ms -f lavfi -i testsrc=s=4x4:r=1:d=1 -map 0:0 -map 1:0 -f mp3 test.mp3
# fq test.mp3 '.. | select(._format == "id3v2")?._bytes' > apic
/apic:
> fq -d id3v2 verbose /apic
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /apic (id3v2) 0x0-0xb3.7 (180)
0x00|49 44 33 |ID3 | magic: "ID3" (Correct) 0x0-0x2.7 (3)
0x00| 04 | . | version: 4 0x3-0x3.7 (1)
0x00| 00 | . | revision: 0 0x4-0x4.7 (1)
| | | flags: {} 0x5-0x5.7 (1)
0x00| 00 | . | unsynchronisation: false 0x5-0x5 (0.1)
0x00| 00 | . | extended_header: false 0x5.1-0x5.1 (0.1)
0x00| 00 | . | experimental_indicator: false 0x5.2-0x5.2 (0.1)
0x00| 00 | . | unused: 0 0x5.3-0x5.7 (0.5)
0x00| 00 00 01 2a | ...* | size: 170 0x6-0x9.7 (4)
| | | frames: [2] 0xa-0xa9.7 (160)
| | | [0]: frame {} 0xa-0x22.7 (25)
0x00| 54 53 53 45 | TSSE | id: "TSSE" (Software/Hardware and settings used for encoding) 0xa-0xd.7 (4)
0x00| 00 00| ..| size: 15 0xe-0x11.7 (4)
0x10|00 0f |.. |
| | | flags: {} 0x12-0x13.7 (2)
0x10| 00 | . | unused0: 0 0x12-0x12 (0.1)
0x10| 00 | . | tag_alter_preservation: false 0x12.1-0x12.1 (0.1)
0x10| 00 | . | file_alter_preservation: false 0x12.2-0x12.2 (0.1)
0x10| 00 | . | read_only: false 0x12.3-0x12.3 (0.1)
0x10| 00 00 | .. | unused1: 0 0x12.4-0x13 (0.5)
0x10| 00 | . | grouping_identity: false 0x13.1-0x13.1 (0.1)
0x10| 00 | . | unused2: 0 0x13.2-0x13.3 (0.2)
0x10| 00 | . | compression: false 0x13.4-0x13.4 (0.1)
0x10| 00 | . | encryption: false 0x13.5-0x13.5 (0.1)
0x10| 00 | . | unsync: false 0x13.6-0x13.6 (0.1)
0x10| 00 | . | data_length_indicator: false 0x13.7-0x13.7 (0.1)
0x10| 03 | . | text_encoding: UTF-8 (3) 0x14-0x14.7 (1)
0x10| 4c 61 76 66 35 38 2e 37 36 2e 31| Lavf58.76.1| text: "Lavf58.76.100" 0x15-0x22.7 (14)
0x20|30 30 00 |00. |
| | | [1]: frame {} 0x23-0xa9.7 (135)
0x20| 41 50 49 43 | APIC | id: "APIC" (Attached picture) 0x23-0x26.7 (4)
0x20| 00 00 00 7d | ...} | size: 125 0x27-0x2a.7 (4)
| | | flags: {} 0x2b-0x2c.7 (2)
0x20| 00 | . | unused0: 0 0x2b-0x2b (0.1)
0x20| 00 | . | tag_alter_preservation: false 0x2b.1-0x2b.1 (0.1)
0x20| 00 | . | file_alter_preservation: false 0x2b.2-0x2b.2 (0.1)
0x20| 00 | . | read_only: false 0x2b.3-0x2b.3 (0.1)
0x20| 00 00 | .. | unused1: 0 0x2b.4-0x2c (0.5)
0x20| 00 | . | grouping_identity: false 0x2c.1-0x2c.1 (0.1)
0x20| 00 | . | unused2: 0 0x2c.2-0x2c.3 (0.2)
0x20| 00 | . | compression: false 0x2c.4-0x2c.4 (0.1)
0x20| 00 | . | encryption: false 0x2c.5-0x2c.5 (0.1)
0x20| 00 | . | unsync: false 0x2c.6-0x2c.6 (0.1)
0x20| 00 | . | data_length_indicator: false 0x2c.7-0x2c.7 (0.1)
0x20| 03 | . | text_encoding: UTF-8 (3) 0x2d-0x2d.7 (1)
0x20| 69 6d| im| mime_type: "image/png" 0x2e-0x37.7 (10)
0x30|61 67 65 2f 70 6e 67 00 |age/png. |
0x30| 00 | . | picture_type: 0 0x38-0x38.7 (1)
0x30| 00 | . | description: "" 0x39-0x39.7 (1)
| | | picture: {} (png) 0x3a-0xa9.7 (112)
0x30| 89 50 4e 47 0d 0a| .PNG..| signature: "\x89PNG\r\n\x1a\n" (Correct) 0x3a-0x41.7 (8)
0x40|1a 0a |.. |
| | | chunks: [4] 0x42-0xa9.7 (104)
| | | [0]: chunk {} 0x42-0x5a.7 (25)
0x40| 00 00 00 0d | .... | length: 13 0x42-0x45.7 (4)
0x40| 49 48 44 52 | IHDR | type: "IHDR" 0x46-0x49.7 (4)
0x40| 49 | I | ancillary: false 0x46.3-0x46.3 (0.1)
0x40| 48 | H | private: false 0x47.3-0x47.3 (0.1)
0x40| 44 | D | reserved: false 0x48.3-0x48.3 (0.1)
0x40| 52 | R | safe_to_copy: true 0x49.3-0x49.3 (0.1)
0x40| 00 00 00 04 | .... | width: 4 0x4a-0x4d.7 (4)
0x40| 00 00| ..| height: 4 0x4e-0x51.7 (4)
0x50|00 04 |.. |
0x50| 08 | . | bit_depth: 8 0x52-0x52.7 (1)
0x50| 02 | . | color_type: 2 0x53-0x53.7 (1)
0x50| 00 | . | compression_method: deflate (0) 0x54-0x54.7 (1)
0x50| 00 | . | filter_method: Adaptive filtering (0) 0x55-0x55.7 (1)
0x50| 00 | . | interlace_method: No interlace (0) 0x56-0x56.7 (1)
0x50| 26 93 09 29 | &..) | crc: Correct (26930929) 0x57-0x5a.7 (4)
| | | [1]: chunk {} 0x5b-0x6f.7 (21)
0x50| 00 00 00 09 | .... | length: 9 0x5b-0x5e.7 (4)
0x50| 70| p| type: "pHYs" 0x5f-0x62.7 (4)
0x60|48 59 73 |HYs |
0x50| 70| p| ancillary: true 0x5f.3-0x5f.3 (0.1)
0x60|48 |H | private: false 0x60.3-0x60.3 (0.1)
0x60| 59 | Y | reserved: true 0x61.3-0x61.3 (0.1)
0x60| 73 | s | safe_to_copy: true 0x62.3-0x62.3 (0.1)
0x60| 00 00 00 01 | .... | x_pixels_per_unit: 1 0x63-0x66.7 (4)
0x60| 00 00 00 01 | .... | y_pixels_per_unit: 1 0x67-0x6a.7 (4)
0x60| 00 | . | unit: 0 0x6b-0x6b.7 (1)
0x60| 4f 25 c4 d6| O%..| crc: Correct (4f25c4d6) 0x6c-0x6f.7 (4)
| | | [2]: chunk {} 0x70-0x9d.7 (46)
0x70|00 00 00 22 |..." | length: 34 0x70-0x73.7 (4)
0x70| 49 44 41 54 | IDAT | type: "IDAT" 0x74-0x77.7 (4)
0x70| 49 | I | ancillary: false 0x74.3-0x74.3 (0.1)
0x70| 44 | D | private: false 0x75.3-0x75.3 (0.1)
0x70| 41 | A | reserved: false 0x76.3-0x76.3 (0.1)
0x70| 54 | T | safe_to_copy: true 0x77.3-0x77.3 (0.1)
0x70| 78 9c 63 60 60 60 f8 0f| x.c```..| data: 789c63606060f80fc6ff4114880564fc... 0x78-0x99.7 (34)
0x80|c6 ff 41 14 88 05 64 fc 87 08 22 71 80 44 3d 88|..A...d..."q.D=.|
0x90|f1 bf 81 e1 3f 00 c8 76 13 ed |....?..v.. |
0x90| 2f 76 8a 2a | /v.* | crc: Correct (2f768a2a) 0x9a-0x9d.7 (4)
| | | [3]: chunk {} 0x9e-0xa9.7 (12)
0x90| 00 00| ..| length: 0 0x9e-0xa1.7 (4)
0xa0|00 00 |.. |
0xa0| 49 45 4e 44 | IEND | type: "IEND" 0xa2-0xa5.7 (4)
0xa0| 49 | I | ancillary: false 0xa2.3-0xa2.3 (0.1)
0xa0| 45 | E | private: false 0xa3.3-0xa3.3 (0.1)
0xa0| 4e | N | reserved: false 0xa4.3-0xa4.3 (0.1)
0xa0| 44 | D | safe_to_copy: false 0xa5.3-0xa5.3 (0.1)
0xa0| ae 42 60 82 | .B`. | crc: Correct (ae426082) 0xa6-0xa9.7 (4)
0xa0| 00 00 00 00 00 00| ......| padding: Correct (none) (zero padding) 0xaa-0xb3.7 (10)
0xb0|00 00 00 00| |....| |

BIN
format/id3/testdata/id3v1 vendored Normal file

Binary file not shown.

18
format/id3/testdata/id3v1.fqtest vendored Normal file
View File

@ -0,0 +1,18 @@
# ffmpeg -f lavfi -i sine -t 10ms -write_id3v1 1 -metadata title=test -f mp3 pipe:1 | fq - '.footers[0]._bytes' > id3v1
/id3v1:
> fq -d id3v1 verbose /id3v1
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /id3v1 (id3v1) 0x0-0x7f.7 (128)
0x00|54 41 47 |TAG | magic: "TAG" (Correct) 0x0-0x2.7 (3)
0x00| 74 65 73 74 00 00 00 00 00 00 00 00 00| test.........| song_name: "test" 0x3-0x20.7 (30)
0x10|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
0x20|00 |. |
0x20| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00| ...............| artist: "" 0x21-0x3e.7 (30)
0x30|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |............... |
0x30| 00| .| album_name: "" 0x3f-0x5c.7 (30)
0x40|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
0x50|00 00 00 00 00 00 00 00 00 00 00 00 00 |............. |
0x50| 00 00 00| ...| year: "" 0x5d-0x60.7 (4)
0x60|00 |. |
0x60| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00| ...............| comment: "" 0x61-0x7e.7 (30)
0x70|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |............... |
0x70| ff| .| genre: Unknown (255) 0x7f-0x7f.7 (1)

BIN
format/id3/testdata/id3v1.mp3 vendored Normal file

Binary file not shown.

BIN
format/id3/testdata/id3v23 vendored Normal file

Binary file not shown.

31
format/id3/testdata/id3v23.fqtest vendored Normal file
View File

@ -0,0 +1,31 @@
# ffmpeg -f lavfi -i sine -t 0s -id3v2_version 3 -f mp3 pipe:1 > id3v23
/id3v23:
> fq -d id3v2 verbose /id3v23
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /id3v23 (id3v2) 0x0-0x2c.7 (45)
0x00|49 44 33 |ID3 | magic: "ID3" (Correct) 0x0-0x2.7 (3)
0x00| 03 | . | version: 3 0x3-0x3.7 (1)
0x00| 00 | . | revision: 0 0x4-0x4.7 (1)
| | | flags: {} 0x5-0x5.7 (1)
0x00| 00 | . | unsynchronisation: false 0x5-0x5 (0.1)
0x00| 00 | . | extended_header: false 0x5.1-0x5.1 (0.1)
0x00| 00 | . | experimental_indicator: false 0x5.2-0x5.2 (0.1)
0x00| 00 | . | unused: 0 0x5.3-0x5.7 (0.5)
0x00| 00 00 00 23 | ...# | size: 35 0x6-0x9.7 (4)
| | | frames: [1] 0xa-0x22.7 (25)
| | | [0]: frame {} 0xa-0x22.7 (25)
0x00| 54 53 53 45 | TSSE | id: "TSSE" (Software/Hardware and settings used for encoding) 0xa-0xd.7 (4)
0x00| 00 00| ..| size: 15 0xe-0x11.7 (4)
0x10|00 0f |.. |
| | | flags: {} 0x12-0x13.7 (2)
0x10| 00 | . | tag_alter_preservation: false 0x12-0x12 (0.1)
0x10| 00 | . | file_alter_preservation: false 0x12.1-0x12.1 (0.1)
0x10| 00 | . | read_only: false 0x12.2-0x12.2 (0.1)
0x10| 00 | . | unused0: 0 0x12.3-0x12.7 (0.5)
0x10| 00 | . | compression: false 0x13-0x13 (0.1)
0x10| 00 | . | encryption: false 0x13.1-0x13.1 (0.1)
0x10| 00 | . | grouping_identity: false 0x13.2-0x13.2 (0.1)
0x10| 00 | . | unused1: 0 0x13.3-0x13.7 (0.5)
0x10| 00 | . | text_encoding: ISO-8859-1 (0) 0x14-0x14.7 (1)
0x10| 4c 61 76 66 35 38 2e 34 35 2e 31| Lavf58.45.1| text: "Lavf58.45.100" 0x15-0x22.7 (14)
0x20|30 30 00 |00. |
0x20| 00 00 00 00 00 00 00 00 00 00| | ..........| | padding: Correct (none) (zero padding) 0x23-0x2c.7 (10)

BIN
format/id3/testdata/id3v24 vendored Normal file

Binary file not shown.

34
format/id3/testdata/id3v24.fqtest vendored Normal file
View File

@ -0,0 +1,34 @@
# ffmpeg -f lavfi -i sine -t 0s -id3v2_version 4 -f mp3 pipe:1 > id3v24
/id3v24:
> fq -d id3v2 verbose /id3v24
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /id3v24 (id3v2) 0x0-0x2c.7 (45)
0x00|49 44 33 |ID3 | magic: "ID3" (Correct) 0x0-0x2.7 (3)
0x00| 04 | . | version: 4 0x3-0x3.7 (1)
0x00| 00 | . | revision: 0 0x4-0x4.7 (1)
| | | flags: {} 0x5-0x5.7 (1)
0x00| 00 | . | unsynchronisation: false 0x5-0x5 (0.1)
0x00| 00 | . | extended_header: false 0x5.1-0x5.1 (0.1)
0x00| 00 | . | experimental_indicator: false 0x5.2-0x5.2 (0.1)
0x00| 00 | . | unused: 0 0x5.3-0x5.7 (0.5)
0x00| 00 00 00 23 | ...# | size: 35 0x6-0x9.7 (4)
| | | frames: [1] 0xa-0x22.7 (25)
| | | [0]: frame {} 0xa-0x22.7 (25)
0x00| 54 53 53 45 | TSSE | id: "TSSE" (Software/Hardware and settings used for encoding) 0xa-0xd.7 (4)
0x00| 00 00| ..| size: 15 0xe-0x11.7 (4)
0x10|00 0f |.. |
| | | flags: {} 0x12-0x13.7 (2)
0x10| 00 | . | unused0: 0 0x12-0x12 (0.1)
0x10| 00 | . | tag_alter_preservation: false 0x12.1-0x12.1 (0.1)
0x10| 00 | . | file_alter_preservation: false 0x12.2-0x12.2 (0.1)
0x10| 00 | . | read_only: false 0x12.3-0x12.3 (0.1)
0x10| 00 00 | .. | unused1: 0 0x12.4-0x13 (0.5)
0x10| 00 | . | grouping_identity: false 0x13.1-0x13.1 (0.1)
0x10| 00 | . | unused2: 0 0x13.2-0x13.3 (0.2)
0x10| 00 | . | compression: false 0x13.4-0x13.4 (0.1)
0x10| 00 | . | encryption: false 0x13.5-0x13.5 (0.1)
0x10| 00 | . | unsync: false 0x13.6-0x13.6 (0.1)
0x10| 00 | . | data_length_indicator: false 0x13.7-0x13.7 (0.1)
0x10| 03 | . | text_encoding: UTF-8 (3) 0x14-0x14.7 (1)
0x10| 4c 61 76 66 35 38 2e 34 35 2e 31| Lavf58.45.1| text: "Lavf58.45.100" 0x15-0x22.7 (14)
0x20|30 30 00 |00. |
0x20| 00 00 00 00 00 00 00 00 00 00| | ..........| | padding: Correct (none) (zero padding) 0x23-0x2c.7 (10)

BIN
format/id3/testdata/utf16-apic vendored Normal file

Binary file not shown.

175
format/id3/testdata/utf16-apic.fqtest vendored Normal file
View File

@ -0,0 +1,175 @@
# ffmpeg -f lavfi -i sine -t 1ms -write_xing 0 -write_id3v2 0 -write_id3v1 0 -f mp3 test.mp3
# convert -size 4x4 "xc:#000" 4x4.png
# eyeD3 --encoding=utf16 --add-image=4x4.png:OTHER:test test.mp3
# fq test.mp3 .headers[0]._bits > utf16-apic
/utf16-apic:
> fq -d id3v2 verbose /utf16-apic
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /utf16-apic (id3v2) 0x0-0x255.7 (598)
0x000|49 44 33 |ID3 | magic: "ID3" (Correct) 0x0-0x2.7 (3)
0x000| 04 | . | version: 4 0x3-0x3.7 (1)
0x000| 00 | . | revision: 0 0x4-0x4.7 (1)
| | | flags: {} 0x5-0x5.7 (1)
0x000| 00 | . | unsynchronisation: false 0x5-0x5 (0.1)
0x000| 00 | . | extended_header: false 0x5.1-0x5.1 (0.1)
0x000| 00 | . | experimental_indicator: false 0x5.2-0x5.2 (0.1)
0x000| 00 | . | unused: 0 0x5.3-0x5.7 (0.5)
0x000| 00 00 04 4c | ...L | size: 588 0x6-0x9.7 (4)
| | | frames: [2] 0xa-0x155.7 (332)
| | | [0]: frame {} 0xa-0x12e.7 (293)
0x000| 41 50 49 43 | APIC | id: "APIC" (Attached picture) 0xa-0xd.7 (4)
0x000| 00 00| ..| size: 283 0xe-0x11.7 (4)
0x010|02 1b |.. |
| | | flags: {} 0x12-0x13.7 (2)
0x010| 00 | . | unused0: 0 0x12-0x12 (0.1)
0x010| 00 | . | tag_alter_preservation: false 0x12.1-0x12.1 (0.1)
0x010| 00 | . | file_alter_preservation: false 0x12.2-0x12.2 (0.1)
0x010| 00 | . | read_only: false 0x12.3-0x12.3 (0.1)
0x010| 00 00 | .. | unused1: 0 0x12.4-0x13 (0.5)
0x010| 00 | . | grouping_identity: false 0x13.1-0x13.1 (0.1)
0x010| 00 | . | unused2: 0 0x13.2-0x13.3 (0.2)
0x010| 00 | . | compression: false 0x13.4-0x13.4 (0.1)
0x010| 00 | . | encryption: false 0x13.5-0x13.5 (0.1)
0x010| 00 | . | unsync: false 0x13.6-0x13.6 (0.1)
0x010| 00 | . | data_length_indicator: false 0x13.7-0x13.7 (0.1)
0x010| 01 | . | text_encoding: UTF-16 (1) 0x14-0x14.7 (1)
0x010| 69 6d 61 67 65 2f 70 6e 67 00 | image/png. | mime_type: "image/png" 0x15-0x1e.7 (10)
0x010| 00| .| picture_type: 0 0x1f-0x1f.7 (1)
0x020|ff fe 74 00 65 00 73 00 74 00 00 00 |..t.e.s.t... | description: "test" 0x20-0x2b.7 (12)
| | | picture: {} (png) 0x2c-0x12e.7 (259)
0x020| 89 50 4e 47| .PNG| signature: "\x89PNG\r\n\x1a\n" (Correct) 0x2c-0x33.7 (8)
0x030|0d 0a 1a 0a |.... |
| | | chunks: [9] 0x34-0x12e.7 (251)
| | | [0]: chunk {} 0x34-0x4c.7 (25)
0x030| 00 00 00 0d | .... | length: 13 0x34-0x37.7 (4)
0x030| 49 48 44 52 | IHDR | type: "IHDR" 0x38-0x3b.7 (4)
0x030| 49 | I | ancillary: false 0x38.3-0x38.3 (0.1)
0x030| 48 | H | private: false 0x39.3-0x39.3 (0.1)
0x030| 44 | D | reserved: false 0x3a.3-0x3a.3 (0.1)
0x030| 52 | R | safe_to_copy: true 0x3b.3-0x3b.3 (0.1)
0x030| 00 00 00 04| ....| width: 4 0x3c-0x3f.7 (4)
0x040|00 00 00 04 |.... | height: 4 0x40-0x43.7 (4)
0x040| 01 | . | bit_depth: 1 0x44-0x44.7 (1)
0x040| 00 | . | color_type: 0 0x45-0x45.7 (1)
0x040| 00 | . | compression_method: deflate (0) 0x46-0x46.7 (1)
0x040| 00 | . | filter_method: Adaptive filtering (0) 0x47-0x47.7 (1)
0x040| 00 | . | interlace_method: No interlace (0) 0x48-0x48.7 (1)
0x040| 81 8a a3 d3 | .... | crc: Correct (818aa3d3) 0x49-0x4c.7 (4)
| | | [1]: chunk {} 0x4d-0x5c.7 (16)
0x040| 00 00 00| ...| length: 4 0x4d-0x50.7 (4)
0x050|04 |. |
0x050| 67 41 4d 41 | gAMA | type: "gAMA" 0x51-0x54.7 (4)
0x050| 67 | g | ancillary: false 0x51.3-0x51.3 (0.1)
0x050| 41 | A | private: false 0x52.3-0x52.3 (0.1)
0x050| 4d | M | reserved: false 0x53.3-0x53.3 (0.1)
0x050| 41 | A | safe_to_copy: false 0x54.3-0x54.3 (0.1)
0x050| 00 00 b1 8f | .... | value: 45455 0x55-0x58.7 (4)
0x050| 0b fc 61 05 | ..a. | crc: Correct (0bfc6105) 0x59-0x5c.7 (4)
| | | [2]: chunk {} 0x5d-0x88.7 (44)
0x050| 00 00 00| ...| length: 32 0x5d-0x60.7 (4)
0x060|20 | |
0x060| 63 48 52 4d | cHRM | type: "cHRM" 0x61-0x64.7 (4)
0x060| 63 | c | ancillary: false 0x61.3-0x61.3 (0.1)
0x060| 48 | H | private: false 0x62.3-0x62.3 (0.1)
0x060| 52 | R | reserved: true 0x63.3-0x63.3 (0.1)
0x060| 4d | M | safe_to_copy: false 0x64.3-0x64.3 (0.1)
0x060| 00 00 7a 26 | ..z& | white_point_x: 31.27 0x65-0x68.7 (4)
0x060| 00 00 80 84 | .... | white_point_y: 32.9 0x69-0x6c.7 (4)
0x060| 00 00 fa| ...| red_x: 64 0x6d-0x70.7 (4)
0x070|00 |. |
0x070| 00 00 80 e8 | .... | red_y: 33 0x71-0x74.7 (4)
0x070| 00 00 75 30 | ..u0 | green_x: 30 0x75-0x78.7 (4)
0x070| 00 00 ea 60 | ...` | green_y: 60 0x79-0x7c.7 (4)
0x070| 00 00 3a| ..:| blue_x: 15 0x7d-0x80.7 (4)
0x080|98 |. |
0x080| 00 00 17 70 | ...p | blue_y: 6 0x81-0x84.7 (4)
0x080| 9c ba 51 3c | ..Q< | crc: Correct (9cba513c) 0x85-0x88.7 (4)
| | | [3]: chunk {} 0x89-0x96.7 (14)
0x080| 00 00 00 02 | .... | length: 2 0x89-0x8c.7 (4)
0x080| 62 4b 47| bKG| type: "bKGD" 0x8d-0x90.7 (4)
0x090|44 |D |
0x080| 62 | b | ancillary: false 0x8d.3-0x8d.3 (0.1)
0x080| 4b | K | private: false 0x8e.3-0x8e.3 (0.1)
0x080| 47| G| reserved: false 0x8f.3-0x8f.3 (0.1)
0x090|44 |D | safe_to_copy: false 0x90.3-0x90.3 (0.1)
0x090| 00 01 | .. | value: 1 0x91-0x92.7 (2)
0x090| dd 8a 13 a4 | .... | crc: Correct (dd8a13a4) 0x93-0x96.7 (4)
| | | [4]: chunk {} 0x97-0xa9.7 (19)
0x090| 00 00 00 07 | .... | length: 7 0x97-0x9a.7 (4)
0x090| 74 49 4d 45 | tIME | type: "tIME" 0x9b-0x9e.7 (4)
0x090| 74 | t | ancillary: true 0x9b.3-0x9b.3 (0.1)
0x090| 49 | I | private: false 0x9c.3-0x9c.3 (0.1)
0x090| 4d | M | reserved: false 0x9d.3-0x9d.3 (0.1)
0x090| 45 | E | safe_to_copy: false 0x9e.3-0x9e.3 (0.1)
0x090| 07| .| data: 07e50514143524 0x9f-0xa5.7 (7)
0x0a0|e5 05 14 14 35 24 |....5$ |
0x0a0| 18 db 42 e2 | ..B. | crc: Correct (18db42e2) 0xa6-0xa9.7 (4)
| | | [5]: chunk {} 0xaa-0xc0.7 (23)
0x0a0| 00 00 00 0b | .... | length: 11 0xaa-0xad.7 (4)
0x0a0| 49 44| ID| type: "IDAT" 0xae-0xb1.7 (4)
0x0b0|41 54 |AT |
0x0a0| 49 | I | ancillary: false 0xae.3-0xae.3 (0.1)
0x0a0| 44| D| private: false 0xaf.3-0xaf.3 (0.1)
0x0b0|41 |A | reserved: false 0xb0.3-0xb0.3 (0.1)
0x0b0| 54 | T | safe_to_copy: true 0xb1.3-0xb1.3 (0.1)
0x0b0| 08 d7 63 60 80 00 00 00 08 00 01 | ..c`....... | data: 08d7636080000000080001 0xb2-0xbc.7 (11)
0x0b0| 2f 20 dd| / .| crc: Correct (2f20dd31) 0xbd-0xc0.7 (4)
0x0c0|31 |1 |
| | | [6]: chunk {} 0xc1-0xf1.7 (49)
0x0c0| 00 00 00 25 | ...% | length: 37 0xc1-0xc4.7 (4)
0x0c0| 74 45 58 74 | tEXt | type: "tEXt" 0xc5-0xc8.7 (4)
0x0c0| 74 | t | ancillary: true 0xc5.3-0xc5.3 (0.1)
0x0c0| 45 | E | private: false 0xc6.3-0xc6.3 (0.1)
0x0c0| 58 | X | reserved: true 0xc7.3-0xc7.3 (0.1)
0x0c0| 74 | t | safe_to_copy: true 0xc8.3-0xc8.3 (0.1)
0x0c0| 64 61 74 65 3a 63 72| date:cr| keyword: "date:create" 0xc9-0xd3.7 (11)
0x0d0|65 61 74 65 |eate |
0x0d0| 00 | . | null: "\x00" 0xd4-0xd4.7 (1)
0x0d0| 32 30 32 31 2d 30 35 2d 32 30 54| 2021-05-20T| text: "2021-05-20T20:53:36+00:00" 0xd5-0xed.7 (25)
0x0e0|32 30 3a 35 33 3a 33 36 2b 30 30 3a 30 30 |20:53:36+00:00 |
0x0e0| 67 53| gS| crc: Correct (6753fe7a) 0xee-0xf1.7 (4)
0x0f0|fe 7a |.z |
| | | [7]: chunk {} 0xf2-0x122.7 (49)
0x0f0| 00 00 00 25 | ...% | length: 37 0xf2-0xf5.7 (4)
0x0f0| 74 45 58 74 | tEXt | type: "tEXt" 0xf6-0xf9.7 (4)
0x0f0| 74 | t | ancillary: true 0xf6.3-0xf6.3 (0.1)
0x0f0| 45 | E | private: false 0xf7.3-0xf7.3 (0.1)
0x0f0| 58 | X | reserved: true 0xf8.3-0xf8.3 (0.1)
0x0f0| 74 | t | safe_to_copy: true 0xf9.3-0xf9.3 (0.1)
0x0f0| 64 61 74 65 3a 6d| date:m| keyword: "date:modify" 0xfa-0x104.7 (11)
0x100|6f 64 69 66 79 |odify |
0x100| 00 | . | null: "\x00" 0x105-0x105.7 (1)
0x100| 32 30 32 31 2d 30 35 2d 32 30| 2021-05-20| text: "2021-05-20T20:53:36+00:00" 0x106-0x11e.7 (25)
0x110|54 32 30 3a 35 33 3a 33 36 2b 30 30 3a 30 30 |T20:53:36+00:00 |
0x110| 16| .| crc: Correct (160e46c6) 0x11f-0x122.7 (4)
0x120|0e 46 c6 |.F. |
| | | [8]: chunk {} 0x123-0x12e.7 (12)
0x120| 00 00 00 00 | .... | length: 0 0x123-0x126.7 (4)
0x120| 49 45 4e 44 | IEND | type: "IEND" 0x127-0x12a.7 (4)
0x120| 49 | I | ancillary: false 0x127.3-0x127.3 (0.1)
0x120| 45 | E | private: false 0x128.3-0x128.3 (0.1)
0x120| 4e | N | reserved: false 0x129.3-0x129.3 (0.1)
0x120| 44 | D | safe_to_copy: false 0x12a.3-0x12a.3 (0.1)
0x120| ae 42 60 82 | .B`. | crc: Correct (ae426082) 0x12b-0x12e.7 (4)
| | | [1]: frame {} 0x12f-0x155.7 (39)
0x120| 54| T| id: "TSSE" (Software/Hardware and settings used for encoding) 0x12f-0x132.7 (4)
0x130|53 53 45 |SSE |
0x130| 00 00 00 1d | .... | size: 29 0x133-0x136.7 (4)
| | | flags: {} 0x137-0x138.7 (2)
0x130| 00 | . | unused0: 0 0x137-0x137 (0.1)
0x130| 00 | . | tag_alter_preservation: false 0x137.1-0x137.1 (0.1)
0x130| 00 | . | file_alter_preservation: false 0x137.2-0x137.2 (0.1)
0x130| 00 | . | read_only: false 0x137.3-0x137.3 (0.1)
0x130| 00 00 | .. | unused1: 0 0x137.4-0x138 (0.5)
0x130| 00 | . | grouping_identity: false 0x138.1-0x138.1 (0.1)
0x130| 00 | . | unused2: 0 0x138.2-0x138.3 (0.2)
0x130| 00 | . | compression: false 0x138.4-0x138.4 (0.1)
0x130| 00 | . | encryption: false 0x138.5-0x138.5 (0.1)
0x130| 00 | . | unsync: false 0x138.6-0x138.6 (0.1)
0x130| 00 | . | data_length_indicator: false 0x138.7-0x138.7 (0.1)
0x130| 01 | . | text_encoding: UTF-16 (1) 0x139-0x139.7 (1)
0x130| ff fe 4c 00 61 00| ..L.a.| text: "Lavf58.76.100" 0x13a-0x155.7 (28)
0x140|76 00 66 00 35 00 38 00 2e 00 37 00 36 00 2e 00|v.f.5.8...7.6...|
0x150|31 00 30 00 30 00 |1.0.0. |
0x150| 00 00 00 00 00 00 00 00 00 00| ..........| padding: Correct (none) (zero padding) 0x156-0x255.7 (256)
0x160|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0x255.7 (end) (256) | |

366
format/jpeg/jpeg.go Normal file
View File

@ -0,0 +1,366 @@
package jpeg
// https://www.w3.org/Graphics/JPEG/itu-t81.pdf
// TODO: warning on junk before marker?
// TODO: extract photohop to own decoder?
// TODO: image/jpeg
import (
"bytes"
"fmt"
"fq/format"
"fq/format/registry"
"fq/pkg/bitio"
"fq/pkg/decode"
)
var exifFormat []*decode.Format
var iccProfileFormat []*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.JPEG,
Description: "Joint Photographic Experts Group file",
Groups: []string{format.PROBE, format.IMAGE},
DecodeFn: jpegDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.EXIF}, Formats: &exifFormat},
{Names: []string{format.ICC_PROFILE}, Formats: &iccProfileFormat},
},
})
}
type marker struct {
symbol string
description string // TODO: use as description later
}
const (
SOF0 = 0xc0
SOF1 = 0xc1
SOF2 = 0xc2
SOF3 = 0xc3
SOF5 = 0xc5
SOF6 = 0xc6
SOF7 = 0xc7
JPG = 0xc8
SOF9 = 0xc9
SOF10 = 0xca
SOF11 = 0xcb
SOF13 = 0xcd
SOF14 = 0xce
SOF15 = 0xcf
DHT = 0xc4
DAC = 0xcc
RST0 = 0xd0
RST1 = 0xd1
RST2 = 0xd2
RST3 = 0xd3
RST4 = 0xd4
RST5 = 0xd5
RST6 = 0xd6
RST7 = 0xd7
SOI = 0xd8
EOI = 0xd9
SOS = 0xda
DQT = 0xdb
DNL = 0xdc
DRI = 0xdd
DHP = 0xde
EXP = 0xdf
APP0 = 0xe0
APP1 = 0xe1
APP2 = 0xe2
APP3 = 0xe3
APP4 = 0xe4
APP5 = 0xe5
APP6 = 0xe6
APP7 = 0xe7
APP8 = 0xe8
APP9 = 0xe9
APP10 = 0xea
APP11 = 0xeb
APP12 = 0xec
APP13 = 0xed
APP14 = 0xee
APP15 = 0xef
JPG0 = 0xf0
JPG1 = 0xf1
JPG2 = 0xf2
JPG3 = 0xf3
JPG4 = 0xf4
JPG5 = 0xf5
JPG6 = 0xf6
JPG7 = 0xf7
JPG8 = 0xf8
JPG9 = 0xf9
JPG10 = 0xfa
JPG11 = 0xfb
JPG12 = 0xfc
JPG13 = 0xfd
COM = 0xfe
TEM = 0x01
)
var markers = map[uint]marker{
SOF0: {"SOF0", "Baseline DCT"},
SOF1: {"SOF1", "Extended sequential DCT"},
SOF2: {"SOF2", "Progressive DCT"},
SOF3: {"SOF3", "Lossless (sequential)"},
SOF5: {"SOF5", "Differential sequential DCT"},
SOF6: {"SOF6", "Differential progressive DCT"},
SOF7: {"SOF7", "Differential lossless (sequential)"},
JPG: {"JPG", "Reserved for JPEG extensions"},
SOF9: {"SOF9", "Extended sequential DCT"},
SOF10: {"SOF10", "Progressive DCT"},
SOF11: {"SOF11", "Lossless (sequential)"},
SOF13: {"SOF13", "Differential sequential DCT"},
SOF14: {"SOF14", "Differential progressive DCT"},
SOF15: {"SOF15", "Differential lossless (sequential)"},
DHT: {"DHT", "Define Huffman table(s)"},
DAC: {"DAC", "Define arithmetic coding conditioning(s)"},
RST0: {"RST0", "Restart with modulo 8 count 0"},
RST1: {"RST1", "Restart with modulo 8 count 1"},
RST2: {"RST2", "Restart with modulo 8 count 2"},
RST3: {"RST3", "Restart with modulo 8 count 3"},
RST4: {"RST4", "Restart with modulo 8 count 4"},
RST5: {"RST5", "Restart with modulo 8 count 5"},
RST6: {"RST6", "Restart with modulo 8 count 6"},
RST7: {"RST7", "Restart with modulo 8 count 7"},
SOI: {"SOI", "Start of image"},
EOI: {"EOI", "End of image true"},
SOS: {"SOS", "Start of scan"},
DQT: {"DQT", "Define quantization table(s)"},
DNL: {"DNL", "Define number of lines"},
DRI: {"DRI", "Define restart interval"},
DHP: {"DHP", "Define hierarchical progression"},
EXP: {"EXP", "Expand reference component(s)"},
APP0: {"APP0", "Reserved for application segments"},
APP1: {"APP1", "Reserved for application segments"},
APP2: {"APP2", "Reserved for application segments"},
APP3: {"APP3", "Reserved for application segments"},
APP4: {"APP4", "Reserved for application segments"},
APP5: {"APP5", "Reserved for application segments"},
APP6: {"APP6", "Reserved for application segments"},
APP7: {"APP7", "Reserved for application segments"},
APP8: {"APP8", "Reserved for application segments"},
APP9: {"APP9", "Reserved for application segments"},
APP10: {"APP10", "Reserved for application segments"},
APP11: {"APP11", "Reserved for application segments"},
APP12: {"APP12", "Reserved for application segments"},
APP13: {"APP13", "Reserved for application segments"},
APP14: {"APP14", "Reserved for application segments"},
APP15: {"APP15", "Reserved for application segments"},
JPG0: {"JPG0", "Reserved for JPEG extensions"},
JPG1: {"JPG1", "Reserved for JPEG extensions"},
JPG2: {"JPG2", "Reserved for JPEG extensions"},
JPG3: {"JPG3", "Reserved for JPEG extensions"},
JPG4: {"JPG4", "Reserved for JPEG extensions"},
JPG5: {"JPG5", "Reserved for JPEG extensions"},
JPG6: {"JPG6", "Reserved for JPEG extensions"},
JPG7: {"JPG7", "Reserved for JPEG extensions"},
JPG8: {"JPG8", "Reserved for JPEG extensions"},
JPG9: {"JPG9", "Reserved for JPEG extensions"},
JPG10: {"JPG10", "Reserved for JPEG extensions"},
JPG11: {"JPG11", "Reserved for JPEG extensions"},
JPG12: {"JPG12", "Reserved for JPEG extensions"},
JPG13: {"JPG13", "Reserved for JPEG extensions"},
COM: {"COM", "Comment"},
TEM: {"TEM", "For temporary private use in arithmetic coding"},
}
func jpegDecode(d *decode.D, in interface{}) interface{} {
d.ValidateAtLeastBytesLeft(2)
if !bytes.Equal(d.PeekBytes(2), []byte{0xff, SOI}) {
d.Invalid("no SOI marker")
}
var extendedXMP []byte
soiMarkerFound := false
eoiMarkerFound := false
d.FieldArrayFn("segments", func(d *decode.D) {
inECD := false
for d.NotEnd() && !eoiMarkerFound {
if inECD {
ecdLen := int64(0)
for {
if d.PeekBits(8) == 0xff && d.PeekBits(16) != 0xff00 {
break
}
d.SeekRel(8)
ecdLen++
}
d.SeekRel(-ecdLen * 8)
d.FieldBitBufLen("entropy_coded_data", ecdLen*8)
inECD = false
} else {
d.FieldStructFn("marker", func(d *decode.D) {
prefixLen := d.PeekFindByte(0xff, -1) + 1
d.FieldBytesLen("prefix", int(prefixLen))
markerFound := false
markerCode := d.FieldUDescFn("code", func() (uint64, decode.DisplayFormat, string, string) {
n := uint(d.U8())
if m, ok := markers[n]; ok {
markerFound = true
return uint64(n), decode.NumberDecimal, m.symbol, m.description
}
return uint64(n), decode.NumberDecimal, "RES", "Reset"
})
// RST*, SOI, EOI, TEM does not have a length field. All others have a
// 2 byte length read as "Lf", "Ls" etc or in the default case as "length".
// TODO: warning on 0x00?
switch markerCode {
case SOI:
soiMarkerFound = true
case SOF0, SOF1, SOF2, SOF3, SOF5, SOF6, SOF7, SOF9, SOF10, SOF11:
d.FieldU16("Lf")
d.FieldU8("P")
d.FieldU16("Y")
d.FieldU16("X")
nf := d.FieldU8("Nf")
d.FieldArrayFn("frame_components", func(d *decode.D) {
for i := uint64(0); i < nf; i++ {
d.FieldStructFn("frame_component", func(d *decode.D) {
d.FieldU8("C")
d.FieldU4("H")
d.FieldU4("V")
d.FieldU8("Tq")
})
}
})
case COM:
comLen := d.FieldU16("Lc")
d.FieldUTF8("Cm", int(comLen)-2)
case SOS:
d.FieldU16("Ls")
ns := d.FieldU8("Ns")
d.FieldArrayFn("scan_components", func(d *decode.D) {
for i := uint64(0); i < ns; i++ {
d.FieldStructFn("scan_component", func(d *decode.D) {
d.FieldU8("Cs")
d.FieldU4("Td")
d.FieldU4("Ta")
})
}
})
d.FieldU8("Ss")
d.FieldU8("Se")
d.FieldU4("Ah")
d.FieldU4("Al")
inECD = true
case DQT:
lQ := int64(d.FieldU16("Lq"))
// TODO: how to extract n? spec says lq is 2 + sum for i in 1 to n 65+64*Pq(i)
d.DecodeLenFn(lQ*8-16, func(d *decode.D) {
d.FieldArrayFn("Qs", func(d *decode.D) {
for d.NotEnd() {
d.FieldStructFn("Q", func(d *decode.D) {
pQ := d.FieldU4("Pq")
qBits := 8
if pQ != 0 {
qBits = 16
}
d.FieldU4("Tq")
qK := uint64(0)
d.FieldArrayLoopFn("Q", func() bool { return qK < 64 }, func(d *decode.D) {
d.FieldU("Q", qBits)
qK++
})
})
}
})
})
case RST0, RST1, RST2, RST3, RST4, RST5, RST6, RST7:
inECD = true
case TEM:
case EOI:
eoiMarkerFound = true
default:
if !markerFound {
d.Invalid(fmt.Sprintf("unknown marker %x", markerCode))
}
markerLen := d.FieldU16("length")
d.DecodeLenFn(int64((markerLen-2)*8), func(d *decode.D) {
// TODO: map lookup and descriptions?
app0JFIFPrefix := []byte("JFIF\x00")
app1ExifPrefix := []byte("Exif\x00\x00")
extendedXMPPrefix := []byte("http://ns.adobe.com/xmp/extension/\x00")
app2ICCProfile := []byte("ICC_PROFILE\x00")
// TODO: other version? generic?
app13PhotoshopPrefix := []byte("Photoshop 3.0\x00")
switch {
case markerCode == APP0 && d.TryHasBytes(app0JFIFPrefix):
d.FieldUTF8("identifier", len(app0JFIFPrefix))
d.FieldStructFn("version", func(d *decode.D) {
d.FieldU8("major")
d.FieldU8("minor")
})
d.FieldU8("density_units")
d.FieldU16("xdensity")
d.FieldU16("ydensity")
xThumbnail := d.FieldU8("xthumbnail")
yThumbnail := d.FieldU8("ythumbnail")
d.FieldBitBufLen("data", int64(xThumbnail*yThumbnail)*3*8)
case markerCode == APP1 && d.TryHasBytes(app1ExifPrefix):
d.FieldUTF8("exif_prefix", len(app1ExifPrefix))
d.FieldDecodeLen("exif", d.BitsLeft(), exifFormat)
case markerCode == APP1 && d.TryHasBytes(extendedXMPPrefix):
d.FieldStructFn("extended_xmp_chunk", func(d *decode.D) {
d.FieldUTF8("signature", len(extendedXMPPrefix))
d.FieldUTF8("guid", 32)
fullLength := d.FieldU32("full_length")
offset := d.FieldU32("offset")
// TODO: FieldBitsLen? concat bitbuf?
chunk := d.FieldBytesLen("data", int(d.BitsLeft()/8))
if extendedXMP == nil {
extendedXMP = make([]byte, fullLength)
}
copy(extendedXMP[offset:], chunk)
})
case markerCode == APP2 && d.TryHasBytes(app2ICCProfile):
d.FieldUTF8("icc_profile_prefix", len(app2ICCProfile))
// TODO: support multimarker?
d.FieldU8("cur_marker")
d.FieldU8("num_markers")
d.FieldDecodeLen("icc_profile", d.BitsLeft(), iccProfileFormat)
case markerCode == APP13 && d.TryHasBytes(app13PhotoshopPrefix):
d.FieldUTF8("identifier", len(app13PhotoshopPrefix))
signature := d.FieldUTF8("signature", 4)
switch signature {
case "8BIM":
// TODO: description?
d.FieldStringMapFn("block", psImageResourceBlockNames, "Unknown", d.U16, decode.NumberDecimal)
d.FieldBitBufLen("data", d.BitsLeft())
default:
}
default:
// TODO: FieldBitsLen?
d.FieldBitBufLen("data", d.BitsLeft())
}
})
}
})
}
}
})
if !soiMarkerFound {
d.Invalid("no SOI marker found")
}
if extendedXMP != nil {
bb := bitio.NewBufferFromBytes(extendedXMP, -1)
// TODO: bit pos, better bitbhuf api?
d.FieldBitBufFn("extended_xmp", 0, int64(len(extendedXMP))*8, func() (*bitio.Buffer, string) {
return bb, ""
})
}
return nil
}

98
format/jpeg/ps_irids.go Normal file
View File

@ -0,0 +1,98 @@
package jpeg
// based on https://www.adobe.com/devnet-apps/photoshop/fileformatashtml
var psImageResourceBlockNames = map[uint64]string{
0x03E8: `Contains five 2-byte values: number of channels, rows, columns, depth, and mode`,
0x03E9: `Macintosh print manager print info record`,
0x03EA: `Macintosh page format information. No longer read by Photoshop. (Obsolete)`,
0x03EB: `Indexed color table`,
0x03ED: `ResolutionInfo structure. See Appendix A in Photoshop API Guide.pdf.`,
0x03EE: `Names of the alpha channels as a series of Pascal strings.`,
0x03EF: `(Obsolete) See ID 1077DisplayInfo structure. See Appendix A in Photoshop API Guide.pdf.`,
0x03F0: `The caption as a Pascal string.`,
0x03F1: `Border information. Contains a fixed number (2 bytes real, 2 bytes fraction) for the border width, and 2 bytes for border units (1 = inches, 2 = cm, 3 = points, 4 = picas, 5 = columns).`,
0x03F2: `Background color. See See Color structure.`,
0x03F3: `Print flags. A series of one-byte boolean values (see Page Setup dialog): labels, crop marks, color bars, registration marks, negative, flip, interpolate, caption, print flags.`,
0x03F4: `Grayscale and multichannel halftoning information`,
0x03F5: `Color halftoning information`,
0x03F6: `Duotone halftoning information`,
0x03F7: `Grayscale and multichannel transfer function`,
0x03F8: `Color transfer functions`,
0x03F9: `Duotone transfer functions`,
0x03FA: `Duotone image information`,
0x03FB: `Two bytes for the effective black and white values for the dot range`,
0x03FC: `(Obsolete)`,
0x03FD: `EPS options`,
0x03FE: `Quick Mask information. 2 bytes containing Quick Mask channel ID; 1- byte boolean indicating whether the mask was initially empty.`,
0x03FF: `(Obsolete)`,
0x0400: `Layer state information. 2 bytes containing the index of target layer (0 = bottom layer).`,
0x0401: `Working path (not saved). See See Path resource format.`,
0x0402: `Layers group information. 2 bytes per layer containing a group ID for the dragging groups. Layers in a group have the same group ID.`,
0x0403: `(Obsolete)`,
0x0404: `IPTC-NAA record. Contains the File Info... information. See the documentation in the IPTC folder of the Documentation folder.`,
0x0405: `Image mode for raw format files`,
0x0406: `JPEG quality. Private.`,
0x0408: `(Photoshop 4.0) Grid and guides information. See See Grid and guides resource format.`,
0x0409: `(Photoshop 4.0) Thumbnail resource for Photoshop 4.0 only. See See Thumbnail resource format.`,
0x040A: `(Photoshop 4.0) Copyright flag. Boolean indicating whether image is copyrighted. Can be set via Property suite or by user in File Info...`,
0x040B: `(Photoshop 4.0) URL. Handle of a text string with uniform resource locator. Can be set via Property suite or by user in File Info...`,
0x040C: `(Photoshop 5.0) Thumbnail resource (supersedes resource 1033). See See Thumbnail resource format.`,
0x040D: `(Photoshop 5.0) Global Angle. 4 bytes that contain an integer between 0 and 359, which is the global lighting angle for effects layer. If not present, assumed to be 30.`,
0x040E: `(Obsolete) See ID 1073 below. (Photoshop 5.0) Color samplers resource. See See Color samplers resource format.`,
0x040F: `(Photoshop 5.0) ICC Profile. The raw bytes of an ICC (International Color Consortium) format profile. See ICC1v42_2006-05.pdf in the Documentation folder and icProfileHeader.h in Sample Code\Common\Includes .`,
0x0410: `(Photoshop 5.0) Watermark. One byte.`,
0x0411: `(Photoshop 5.0) ICC Untagged Profile. 1 byte that disables any assumed profile handling when opening the file. 1 = intentionally untagged.`,
0x0412: `(Photoshop 5.0) Effects visible. 1-byte global flag to show/hide all the effects layer. Only present when they are hidden.`,
0x0413: `(Photoshop 5.0) Spot Halftone. 4 bytes for version, 4 bytes for length, and the variable length data.`,
0x0414: `(Photoshop 5.0) Document-specific IDs seed number. 4 bytes: Base value, starting at which layer IDs will be generated (or a greater value if existing IDs already exceed it). Its purpose is to avoid the case where we add layers, flatten, save, open, and then add more layers that end up with the same IDs as the first set.`,
0x0415: `(Photoshop 5.0) Unicode Alpha Names. Unicode string`,
0x0416: `(Photoshop 6.0) Indexed Color Table Count. 2 bytes for the number of colors in table that are actually defined`,
0x0417: `(Photoshop 6.0) Transparency Index. 2 bytes for the index of transparent color, if any.`,
0x0419: `(Photoshop 6.0) Global Altitude. 4 byte entry for altitude`,
0x041A: `(Photoshop 6.0) Slices. See See Slices resource format.`,
0x041B: `(Photoshop 6.0) Workflow URL. Unicode string`,
0x041C: `(Photoshop 6.0) Jump To XPEP. 2 bytes major version, 2 bytes minor version, 4 bytes count. Following is repeated for count: 4 bytes block size, 4 bytes key, if key = 'jtDd' , then next is a Boolean for the dirty flag; otherwise it's a 4 byte entry for the mod date.`,
0x041D: `(Photoshop 6.0) Alpha Identifiers. 4 bytes of length, followed by 4 bytes each for every alpha identifier.`,
0x041E: `(Photoshop 6.0) URL List. 4 byte count of URLs, followed by 4 byte long, 4 byte ID, and Unicode string for each count.`,
0x0421: `(Photoshop 6.0) Version Info. 4 bytes version, 1 byte hasRealMergedData , Unicode string: writer name, Unicode string: reader name, 4 bytes file version.`,
0x0422: `(Photoshop 7.0) EXIF data 1. See http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf`,
0x0423: `(Photoshop 7.0) EXIF data 3. See http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf`,
0x0424: `(Photoshop 7.0) XMP metadata. File info as XML description. See http://www.adobe.com/devnet/xmp/`,
0x0425: `(Photoshop 7.0) Caption digest. 16 bytes: RSA Data Security, MD5 message-digest algorithm`,
0x0426: `(Photoshop 7.0) Print scale. 2 bytes style (0 = centered, 1 = size to fit, 2 = user defined). 4 bytes x location (floating point). 4 bytes y location (floating point). 4 bytes scale (floating point)`,
0x0428: `(Photoshop CS) Pixel Aspect Ratio. 4 bytes (version = 1 or 2), 8 bytes double, x / y of a pixel. Version 2, attempting to correct values for NTSC and PAL, previously off by a factor of approx. 5%.`,
0x0429: `(Photoshop CS) Layer Comps. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure)`,
0x042A: `(Photoshop CS) Alternate Duotone Colors. 2 bytes (version = 1), 2 bytes count, following is repeated for each count: [ Color: 2 bytes for space followed by 4 * 2 byte color component ], following this is another 2 byte count, usually 256, followed by Lab colors one byte each for L, a, b. This resource is not read or used by Photoshop.`,
0x042B: `(Photoshop CS)Alternate Spot Colors. 2 bytes (version = 1), 2 bytes channel count, following is repeated for each count: 4 bytes channel ID, Color: 2 bytes for space followed by 4 * 2 byte color component. This resource is not read or used by Photoshop.`,
0x042D: `(Photoshop CS2) Layer Selection ID(s). 2 bytes count, following is repeated for each count: 4 bytes layer ID`,
0x042E: `(Photoshop CS2) HDR Toning information`,
0x042F: `(Photoshop CS2) Print info`,
0x0430: `(Photoshop CS2) Layer Group(s) Enabled ID. 1 byte for each layer in the document, repeated by length of the resource. NOTE: Layer groups have start and end markers`,
0x0431: `(Photoshop CS3) Color samplers resource. Also see ID 1038 for old format. See See Color samplers resource format.`,
0x0432: `(Photoshop CS3) Measurement Scale. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure)`,
0x0433: `(Photoshop CS3) Timeline Information. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure)`,
0x0434: `(Photoshop CS3) Sheet Disclosure. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure)`,
0x0435: `(Photoshop CS3) DisplayInfo structure to support floating point clors. Also see ID 1007. See Appendix A in Photoshop API Guide.pdf .`,
0x0436: `(Photoshop CS3) Onion Skins. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure)`,
0x0438: `(Photoshop CS4) Count Information. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure) Information about the count in the document. See the Count Tool.`,
0x043A: `(Photoshop CS5) Print Information. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure) Information about the current print settings in the document. The color management options.`,
0x043B: `(Photoshop CS5) Print Style. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure) Information about the current print style in the document. The printing marks, labels, ornaments, etc.`,
0x043C: `(Photoshop CS5) Macintosh NSPrintInfo. Variable OS specific info for Macintosh. NSPrintInfo. It is recommended that you do not interpret or use this data.`,
0x043D: `(Photoshop CS5) Windows DEVMODE. Variable OS specific info for Windows. DEVMODE. It is recommended that you do not interpret or use this data.`,
0x043E: `(Photoshop CS6) Auto Save File Path. Unicode string. It is recommended that you do not interpret or use this data.`,
0x043F: `(Photoshop CS6) Auto Save Format. Unicode string. It is recommended that you do not interpret or use this data.`,
0x0440: `(Photoshop CC) Path Selection State. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure) Information about the current path selection state.`,
// 0x07D0 - 0x0BB6: `Path Information (saved paths). See See Path resource format.`,
0x0BB7: `Name of clipping path. See See Path resource format.`,
0x0BB8: `(Photoshop CC) Origin Path Info. 4 bytes (descriptor version = 16), Descriptor (see See Descriptor structure) Information about the origin path data.`,
// 0x0FA0 - 0x1387: `Plug-In resource(s). Resources added by a plug-in. See the plug-in API found in the SDK documentation`,
0x1B58: `Image Ready variables. XML representation of variables definition`,
0x1B59: `Image Ready data sets`,
0x1B5A: `Image Ready default selected state`,
0x1B5B: `Image Ready 7 rollover expanded state`,
0x1B5C: `Image Ready rollover expanded state`,
0x1B5D: `Image Ready save layer settings`,
0x1B5E: `Image Ready version`,
0x1F40: `(Photoshop CS3) Lightroom workflow, if present the document is in the middle of a Lightroom workflow.`,
0x2710: `Print flags information. 2 bytes version ( = 1), 1 byte center crop marks, 1 byte ( = 0), 4 bytes bleed width value, 2 bytes bleed width scale.`,
}

139
format/jpeg/testdata/4x4.fqtest vendored Normal file
View File

@ -0,0 +1,139 @@
# gm convert -size 4x4 'xc:#000' 4x4.jpg
/4x4.jpg:
> fq -d jpeg verbose /4x4.jpg
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /4x4.jpg (jpeg) 0x0-0x9f.7 (160)
| | | segments: [9] 0x0-0x9f.7 (160)
| | | [0]: marker {} 0x0-0x1.7 (2)
0x00|ff |. | prefix: ff 0x0-0x0.7 (1)
0x00| d8 | . | code: SOI (216) (Start of image) 0x1-0x1.7 (1)
| | | [1]: marker {} 0x2-0x13.7 (18)
0x00| ff | . | prefix: ff 0x2-0x2.7 (1)
0x00| e0 | . | code: APP0 (224) (Reserved for application segments) 0x3-0x3.7 (1)
0x00| 00 10 | .. | length: 16 0x4-0x5.7 (2)
0x00| 4a 46 49 46 00 | JFIF. | identifier: "JFIF\x00" 0x6-0xa.7 (5)
| | | version: {} 0xb-0xc.7 (2)
0x00| 01 | . | major: 1 0xb-0xb.7 (1)
0x00| 01 | . | minor: 1 0xc-0xc.7 (1)
0x00| 01 | . | density_units: 1 0xd-0xd.7 (1)
0x00| 00 48| .H| xdensity: 72 0xe-0xf.7 (2)
0x10|00 48 |.H | ydensity: 72 0x10-0x11.7 (2)
0x10| 00 | . | xthumbnail: 0 0x12-0x12.7 (1)
0x10| 00 | . | ythumbnail: 0 0x13-0x13.7 (1)
| | | data: 0x14-NA (0)
| | | [2]: marker {} 0x14-0x58.7 (69)
0x10| ff | . | prefix: ff 0x14-0x14.7 (1)
0x10| db | . | code: DQT (219) (Define quantization table(s)) 0x15-0x15.7 (1)
0x10| 00 43 | .C | Lq: 67 0x16-0x17.7 (2)
| | | Qs: [1] 0x18-0x58.7 (65)
| | | [0]: Q {} 0x18-0x58.7 (65)
0x10| 00 | . | Pq: 0 0x18-0x18.3 (0.4)
0x10| 00 | . | Tq: 0 0x18.4-0x18.7 (0.4)
| | | Q: [64] 0x19-0x58.7 (64)
0x10| 08 | . | [0]: Q 8 0x19-0x19.7 (1)
0x10| 06 | . | [1]: Q 6 0x1a-0x1a.7 (1)
0x10| 06 | . | [2]: Q 6 0x1b-0x1b.7 (1)
0x10| 07 | . | [3]: Q 7 0x1c-0x1c.7 (1)
0x10| 06 | . | [4]: Q 6 0x1d-0x1d.7 (1)
0x10| 05 | . | [5]: Q 5 0x1e-0x1e.7 (1)
0x10| 08| .| [6]: Q 8 0x1f-0x1f.7 (1)
0x20|07 |. | [7]: Q 7 0x20-0x20.7 (1)
0x20| 07 | . | [8]: Q 7 0x21-0x21.7 (1)
0x20| 07 | . | [9]: Q 7 0x22-0x22.7 (1)
0x20| 09 | . | [10]: Q 9 0x23-0x23.7 (1)
0x20| 09 | . | [11]: Q 9 0x24-0x24.7 (1)
0x20| 08 | . | [12]: Q 8 0x25-0x25.7 (1)
0x20| 0a | . | [13]: Q 10 0x26-0x26.7 (1)
0x20| 0c | . | [14]: Q 12 0x27-0x27.7 (1)
0x20| 14 | . | [15]: Q 20 0x28-0x28.7 (1)
0x20| 0d | . | [16]: Q 13 0x29-0x29.7 (1)
0x20| 0c | . | [17]: Q 12 0x2a-0x2a.7 (1)
0x20| 0b | . | [18]: Q 11 0x2b-0x2b.7 (1)
0x20| 0b | . | [19]: Q 11 0x2c-0x2c.7 (1)
0x20| 0c | . | [20]: Q 12 0x2d-0x2d.7 (1)
0x20| 19 | . | [21]: Q 25 0x2e-0x2e.7 (1)
0x20| 12| .| [22]: Q 18 0x2f-0x2f.7 (1)
0x30|13 |. | [23]: Q 19 0x30-0x30.7 (1)
0x30| 0f | . | [24]: Q 15 0x31-0x31.7 (1)
0x30| 14 | . | [25]: Q 20 0x32-0x32.7 (1)
0x30| 1d | . | [26]: Q 29 0x33-0x33.7 (1)
0x30| 1a | . | [27]: Q 26 0x34-0x34.7 (1)
0x30| 1f | . | [28]: Q 31 0x35-0x35.7 (1)
0x30| 1e | . | [29]: Q 30 0x36-0x36.7 (1)
0x30| 1d | . | [30]: Q 29 0x37-0x37.7 (1)
0x30| 1a | . | [31]: Q 26 0x38-0x38.7 (1)
0x30| 1c | . | [32]: Q 28 0x39-0x39.7 (1)
0x30| 1c | . | [33]: Q 28 0x3a-0x3a.7 (1)
0x30| 20 | | [34]: Q 32 0x3b-0x3b.7 (1)
0x30| 24 | $ | [35]: Q 36 0x3c-0x3c.7 (1)
0x30| 2e | . | [36]: Q 46 0x3d-0x3d.7 (1)
0x30| 27 | ' | [37]: Q 39 0x3e-0x3e.7 (1)
0x30| 20| | [38]: Q 32 0x3f-0x3f.7 (1)
0x40|22 |" | [39]: Q 34 0x40-0x40.7 (1)
0x40| 2c | , | [40]: Q 44 0x41-0x41.7 (1)
0x40| 23 | # | [41]: Q 35 0x42-0x42.7 (1)
0x40| 1c | . | [42]: Q 28 0x43-0x43.7 (1)
0x40| 1c | . | [43]: Q 28 0x44-0x44.7 (1)
0x40| 28 | ( | [44]: Q 40 0x45-0x45.7 (1)
0x40| 37 | 7 | [45]: Q 55 0x46-0x46.7 (1)
0x40| 29 | ) | [46]: Q 41 0x47-0x47.7 (1)
0x40| 2c | , | [47]: Q 44 0x48-0x48.7 (1)
0x40| 30 | 0 | [48]: Q 48 0x49-0x49.7 (1)
0x40| 31 | 1 | [49]: Q 49 0x4a-0x4a.7 (1)
0x40| 34 | 4 | [50]: Q 52 0x4b-0x4b.7 (1)
0x40| 34 | 4 | [51]: Q 52 0x4c-0x4c.7 (1)
0x40| 34 | 4 | [52]: Q 52 0x4d-0x4d.7 (1)
0x40| 1f | . | [53]: Q 31 0x4e-0x4e.7 (1)
0x40| 27| '| [54]: Q 39 0x4f-0x4f.7 (1)
0x50|39 |9 | [55]: Q 57 0x50-0x50.7 (1)
0x50| 3d | = | [56]: Q 61 0x51-0x51.7 (1)
0x50| 38 | 8 | [57]: Q 56 0x52-0x52.7 (1)
0x50| 32 | 2 | [58]: Q 50 0x53-0x53.7 (1)
0x50| 3c | < | [59]: Q 60 0x54-0x54.7 (1)
0x50| 2e | . | [60]: Q 46 0x55-0x55.7 (1)
0x50| 33 | 3 | [61]: Q 51 0x56-0x56.7 (1)
0x50| 34 | 4 | [62]: Q 52 0x57-0x57.7 (1)
0x50| 32 | 2 | [63]: Q 50 0x58-0x58.7 (1)
| | | [3]: marker {} 0x59-0x65.7 (13)
0x50| ff | . | prefix: ff 0x59-0x59.7 (1)
0x50| c0 | . | code: SOF0 (192) (Baseline DCT) 0x5a-0x5a.7 (1)
0x50| 00 0b | .. | Lf: 11 0x5b-0x5c.7 (2)
0x50| 08 | . | P: 8 0x5d-0x5d.7 (1)
0x50| 00 04| ..| Y: 4 0x5e-0x5f.7 (2)
0x60|00 04 |.. | X: 4 0x60-0x61.7 (2)
0x60| 01 | . | Nf: 1 0x62-0x62.7 (1)
| | | frame_components: [1] 0x63-0x65.7 (3)
| | | [0]: frame_component {} 0x63-0x65.7 (3)
0x60| 01 | . | C: 1 0x63-0x63.7 (1)
0x60| 11 | . | H: 1 0x64-0x64.3 (0.4)
0x60| 11 | . | V: 1 0x64.4-0x64.7 (0.4)
0x60| 00 | . | Tq: 0 0x65-0x65.7 (1)
| | | [4]: marker {} 0x66-0x7b.7 (22)
0x60| ff | . | prefix: ff 0x66-0x66.7 (1)
0x60| c4 | . | code: DHT (196) (Define Huffman table(s)) 0x67-0x67.7 (1)
0x60| 00 14 | .. | length: 20 0x68-0x69.7 (2)
0x60| 00 01 00 00 00 00| ......| data: 00010000000000000000000000000000... 0x6a-0x7b.7 (18)
0x70|00 00 00 00 00 00 00 00 00 00 00 08 |............ |
| | | [5]: marker {} 0x7c-0x91.7 (22)
0x70| ff | . | prefix: ff 0x7c-0x7c.7 (1)
0x70| c4 | . | code: DHT (196) (Define Huffman table(s)) 0x7d-0x7d.7 (1)
0x70| 00 14| ..| length: 20 0x7e-0x7f.7 (2)
0x80|10 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| data: 10010000000000000000000000000000... 0x80-0x91.7 (18)
0x90|00 00 |.. |
| | | [6]: marker {} 0x92-0x9b.7 (10)
0x90| ff | . | prefix: ff 0x92-0x92.7 (1)
0x90| da | . | code: SOS (218) (Start of scan) 0x93-0x93.7 (1)
0x90| 00 08 | .. | Ls: 8 0x94-0x95.7 (2)
0x90| 01 | . | Ns: 1 0x96-0x96.7 (1)
| | | scan_components: [1] 0x97-0x98.7 (2)
| | | [0]: scan_component {} 0x97-0x98.7 (2)
0x90| 01 | . | Cs: 1 0x97-0x97.7 (1)
0x90| 00 | . | Td: 0 0x98-0x98.3 (0.4)
0x90| 00 | . | Ta: 0 0x98.4-0x98.7 (0.4)
0x90| 00 | . | Ss: 0 0x99-0x99.7 (1)
0x90| 3f | ? | Se: 63 0x9a-0x9a.7 (1)
0x90| 00 | . | Ah: 0 0x9b-0x9b.3 (0.4)
0x90| 00 | . | Al: 0 0x9b.4-0x9b.7 (0.4)
0x90| 3f bf | ?. | [7]: entropy_coded_data 3fbf 0x9c-0x9d.7 (2)
| | | [8]: marker {} 0x9e-0x9f.7 (2)
0x90| ff | . | prefix: ff 0x9e-0x9e.7 (1)
0x90| d9| .| code: EOI (217) (End of image true) 0x9f-0x9f.7 (1)

BIN
format/jpeg/testdata/4x4.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

37
format/json/json.go Normal file
View File

@ -0,0 +1,37 @@
package json
import (
stdjson "encoding/json"
"fq/format"
"fq/format/registry"
"fq/pkg/decode"
)
func init() {
registry.MustRegister(&decode.Format{
Name: format.JSON,
Description: "JSON",
ProbeOrder: 100, // last
Groups: []string{format.PROBE},
DecodeFn: decodeJSON,
})
}
func decodeJSON(d *decode.D, in interface{}) interface{} {
bb := d.BitBufLen(d.Len())
jd := stdjson.NewDecoder(bb)
if err := jd.Decode(&d.Value.V); err != nil {
d.Invalid(err.Error())
}
switch d.Value.V.(type) {
case map[string]interface{},
[]interface{}:
default:
d.Invalid("root not object or array")
}
// TODO: root not array/struct how to add unknown gaps?
// TODO: ranges not end up correct
d.Value.Range.Len = jd.InputOffset() * 8
return nil
}

60
format/json/testdata/json.fqtest vendored Normal file
View File

@ -0,0 +1,60 @@
/test.json:
/json.gz:
> fq -d json . /test.json
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |
| | |.: {} /test.json (json)
> fq -d json tovalue /test.json
{
"a": 123,
"b": [
1,
2,
3
],
"c:": "string",
"d": null,
"e": 123.4
}
> fq . /test.json
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |
| | |.: {} /test.json (json)
> fq .b[1] /test.json
2
> fq . /json.gz
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /json.gz (gzip)
0x00|1f 8b |.. | identification: "\x1f\x8b" (Correct)
0x0|7b 22 61 22 3a 20 31 32 33 7d |{"a": 123} | uncompressed: {} (json)
0x00| 08 | . | compression_method: deflate (8)
0x00| 00 | . | flags: {}
0x00| 65 0a 08 61 | e..a | mtime: 1627916901
0x00| 00 | . | extra_flags: unknown (0)
0x00| 03 | . | os: Unix (3)
0x00| ab 56 4a 54 b2 52| .VJT.R| compressed: ab564a54b252303432aee50200
0x10|30 34 32 ae e5 02 00 |042.... |
0x10| 20 ac d2 9c | ... | crc32: Correct (9cd2ac20)
0x10| 0b 00 00 00| | ....|| isize: 11
> fq tovalue /json.gz
{
"compressed": "\ufffdVJT\ufffdR042\ufffd\ufffd\u0002\u0000",
"compression_method": 8,
"crc32": "\ufffdҬ ",
"extra_flags": 0,
"flags": {
"comment": false,
"extra": false,
"header_crc": false,
"name": false,
"reserved": 0,
"text": false
},
"identification": "\u001f\ufffd",
"isize": 11,
"mtime": 1627916901,
"os": 3,
"uncompressed": {
"a": 123
}
}
> fq .uncompressed /json.gz
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |
| | |.uncompressed: {} (json)

BIN
format/json/testdata/json.gz vendored Normal file

Binary file not shown.

11
format/json/testdata/test.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"a": 123,
"b": [
1,
2,
3
],
"c:": "string",
"d": null,
"e": 123.4
}

View File

@ -0,0 +1,71 @@
package ebml
type Type int
const (
Integer Type = iota
Uinteger
Float
String
UTF8
Date
Binary
Master
)
var TypeNames = map[Type]string{
Integer: "integer",
Uinteger: "uinteger",
Float: "float",
String: "string",
UTF8: "UTF8",
Date: "data",
Binary: "binary",
Master: "master",
}
type Enum struct {
Value string
Label string
Definition string
}
type Attribute struct {
Name string
Type Type
Tag Tag
Definition string
IntegerEnums map[int64]Enum
UintegerEnums map[uint64]Enum
StringEnums map[string]Enum
}
type Tag map[uint64]Attribute
const (
CRC32ID = 0xbf
VoidID = 0xec
HeaderID = 0x1a45dfa3
EBMLVersionID = 0x4286
EBMLReadVersionID = 0x42f7
EBMLMaxIDLengthID = 0x42f2
EBMLMaxSizeLengthID = 0x42f3
DocTypeID = 0x4282
DocTypeVersionID = 0x4287
DocTypeReadVersionID = 0x4285
)
var Global = Tag{
CRC32ID: {Name: "CRC-32", Type: Binary},
VoidID: {Name: "Void", Type: Binary},
}
var Header = Tag{
EBMLVersionID: {Name: "EBMLVersion", Type: Uinteger},
EBMLReadVersionID: {Name: "EBMLReadVersion", Type: Uinteger},
EBMLMaxIDLengthID: {Name: "EBMLMaxIDLength", Type: Uinteger},
EBMLMaxSizeLengthID: {Name: "EBMLMaxSizeLength", Type: Uinteger},
DocTypeID: {Name: "DocType", Type: String},
DocTypeVersionID: {Name: "DocTypeVersion", Type: Uinteger},
DocTypeReadVersionID: {Name: "DocTypeReadVersion", Type: Uinteger},
}

View File

@ -0,0 +1,182 @@
package main
import (
"encoding/xml"
"fmt"
"os"
"strconv"
"strings"
)
type Schema struct {
Elements []Element `xml:"element"`
}
// <element name="FieldOrder" path="\Segment\Tracks\TrackEntry\Video\FieldOrder" id="0x9D" type="uinteger" minver="4" range="0-14" default="2" minOccurs="1" maxOccurs="1">
// <documentation lang="en" purpose="definition">Declare the field ordering of the video. If FlagInterlaced is not set to 1, this Element MUST be ignored.</documentation>
// <restriction>
// <enum value="0" label="progressive"/>
// <enum value="1" label="tff">
// <documentation lang="en" purpose="definition">Top field displayed first. Top field stored first.</documentation>
// </enum>
// <enum value="2" label="undetermined"/>
// <enum value="6" label="bff">
// <documentation lang="en" purpose="definition">Bottom field displayed first. Bottom field stored first.</documentation>
// </enum>
// <enum value="9" label="bff(swapped)">
// <documentation lang="en" purpose="definition">Top field displayed first. Fields are interleaved in storage with the top line of the top field stored first.</documentation>
// </enum>
// <enum value="14" label="tff(swapped)">
// <documentation lang="en" purpose="definition">Bottom field displayed first. Fields are interleaved in storage with the top line of the top field stored first.</documentation>
// </enum>
// </restriction>
// <extension webm="0"/>
// <extension cppname="VideoFieldOrder"/>
// </element>
type Enum struct {
Value string `xml:"value,attr"`
Label string `xml:"label,attr"`
Documentations []Documentation `xml:"documentation"`
}
type Element struct {
Name string `xml:"name,attr"`
Path string `xml:"path,attr"`
ID string `xml:"id,attr"`
Type string `xml:"type,attr"`
Range string `xml:"range,attr"`
Default string `xml:"default,attr"`
MinOccurs string `xml:"minOccurs,attr"`
MaxOccurs string `xml:"maxOccurs,attr"`
Length string `xml:"length,attr"`
Documentations []Documentation `xml:"documentation"`
Enums []Enum `xml:"restriction>enum"`
}
// <documentation lang="en" purpose="definition">A randomly generated unique ID to identify the Segment amongst many others (128 bits).</documentation>
type Documentation struct {
Purpose string `xml:"purpose,attr"`
Value string `xml:",cdata"`
}
func findDefintion(docs []Documentation) (string, bool) {
for _, d := range docs {
if d.Purpose == "definition" {
return strings.TrimSpace(d.Value), true
}
}
return "", false
}
func main() {
xmlPath := os.Args[1]
r, err := os.Open(xmlPath)
if err != nil {
panic(err)
}
pkgName := os.Args[2]
ebmlPkgPath := os.Args[3]
prefix := os.Args[4]
root := os.Args[5]
fmt.Printf("// Code below generated from %s\n", xmlPath)
fmt.Printf("package %s\n", pkgName)
fmt.Printf("import %q\n", ebmlPkgPath)
fmt.Printf("var Root = ebml.Tag{\n")
fmt.Printf("\tebml.HeaderID: {Name: \"EBML\", Type: ebml.Master, Tag: ebml.Header},\n")
fmt.Printf("\t%sID: {Name: \"%s\", Type: ebml.Master, Tag: %s},\n", root, root, root)
fmt.Printf("}\n")
xd := xml.NewDecoder(r)
var es Schema
if err := xd.Decode(&es); err != nil {
panic(err)
}
fmt.Println("const (")
for _, e := range es.Elements {
fmt.Printf("\t%sID = %s\n", e.Name, e.ID)
}
fmt.Println(")")
for _, e := range es.Elements {
var children []Element
for _, c := range es.Elements {
suffix := strings.TrimPrefix(c.Path, e.Path+"\\")
if suffix == "" || strings.Contains(suffix, `\`) {
continue
}
children = append(children, c)
}
if len(children) == 0 {
continue
}
fmt.Printf("var %s%s = ebml.Tag{\n", prefix, e.Name)
for _, c := range children {
def, defOk := findDefintion(c.Documentations)
extra := ""
typ := c.Type
switch typ {
case "master":
extra = ", Tag: " + prefix + c.Name
case "utf-8":
typ = "UTF8"
}
fmt.Printf("\t%sID: {\n", c.Name)
fmt.Printf("\t\tName: %q,\n", c.Name)
if defOk {
fmt.Printf("\t\tDefinition: %q,\n", def)
}
fmt.Printf("\t\tType: ebml.%s%s,\n", strings.Title(typ), extra)
if len(c.Enums) > 0 {
switch c.Type {
case "integer":
fmt.Printf("\t\tIntegerEnums: map[int64]ebml.Enum{\n")
case "uinteger":
fmt.Printf("\t\tUintegerEnums: map[uint64]ebml.Enum{\n")
case "string":
fmt.Printf("\t\tStringEnums: map[string]ebml.Enum{\n")
}
// matroska.xml has dup keys (e.g. PARTS)
enumDups := map[string]bool{}
for _, e := range c.Enums {
if _, ok := enumDups[e.Value]; ok {
continue
}
enumDups[e.Value] = true
enumDef, enumDefOk := findDefintion(e.Documentations)
switch c.Type {
case "integer":
n, _ := strconv.ParseInt(e.Value, 10, 64)
fmt.Printf("\t\t\t%d:{\n", n)
case "uinteger":
n, _ := strconv.ParseUint(e.Value, 10, 64)
fmt.Printf("\t\t\t%d:{\n", n)
case "string":
fmt.Printf("\t\t\t%q:{\n", e.Value)
}
fmt.Printf("\t\t\t\tValue: %q,\n", e.Value)
fmt.Printf("\t\t\t\tLabel: %q,\n", e.Label)
if enumDefOk {
fmt.Printf("\t\t\t\tDefinition: %q,\n", enumDef)
}
fmt.Printf("\t\t\t},\n")
}
fmt.Printf("\t\t},\n")
}
fmt.Printf("\t},\n")
}
fmt.Printf("}\n")
fmt.Printf("\n")
}
}

View File

@ -0,0 +1,4 @@
package ebml_matroska
// https://raw.githubusercontent.com/cellar-wg/matroska-specification/aa2144a58b661baf54b99bab41113d66b0f5ff62/ebml_matroska.xml
//go:generate sh -c "go run ../ebml/gen/main.go ebml_matroska.xml ebml_matroska fq/format/matroska/ebml '' Segment | gofmt > ebml_matroska_gen.go"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

451
format/matroska/matroska.go Normal file
View File

@ -0,0 +1,451 @@
package matroska
// https://tools.ietf.org/html/draft-ietf-cellar-ebml-00
// https://matroska.org/technical/specs/index.html
// https://www.matroska.org/technical/basics.html
// https://www.matroska.org/technical/codec_specs.html
// https://wiki.xiph.org/MatroskaOpus
// TODO: refactor simepleblock/block to just defer decode etc?
// TODO: CRC
// TODO: value to names (TrackType etc)
// TODO: lacing
// TODO: handle garbage (see tcl and example files)
// TODO: could use md5 here somehow, see flac.go
import (
"embed"
"fmt"
"fq/format"
"fq/format/matroska/ebml"
"fq/format/matroska/ebml_matroska"
"fq/format/registry"
"fq/pkg/decode"
"fq/pkg/ranges"
)
//go:embed *.jq
var matroskaFS embed.FS
var aacFrameFormat []*decode.Format
var av1CCRFormat []*decode.Format
var av1FrameFormat []*decode.Format
var flacFrameFormat []*decode.Format
var flacMetadatablockFormat []*decode.Format
var imageFormat []*decode.Format
var mp3FrameFormat []*decode.Format
var mpegASCFrameFormat []*decode.Format
var mpegAVCAUFormat []*decode.Format
var mpegAVCDCRFormat []*decode.Format
var mpegHEVCDCRFormat []*decode.Format
var mpegHEVCSampleFormat []*decode.Format
var mpegPESPacketSampleFormat []*decode.Format
var mpegSPUFrameFormat []*decode.Format
var opusPacketFrameFormat []*decode.Format
var vorbisPacketFormat []*decode.Format
var vp8FrameFormat []*decode.Format
var vp9CFMFormat []*decode.Format
var vp9FrameFormat []*decode.Format
var codecToFormat map[string]*[]*decode.Format
func init() {
registry.MustRegister(&decode.Format{
Name: format.MATROSKA,
Description: "Matroska file",
Groups: []string{format.PROBE},
DecodeFn: matroskaDecode,
Dependencies: []decode.Dependency{
{Names: []string{format.AAC_FRAME}, Formats: &aacFrameFormat},
{Names: []string{format.AV1_CCR}, Formats: &av1CCRFormat},
{Names: []string{format.AV1_FRAME}, Formats: &av1FrameFormat},
{Names: []string{format.AVC_AU}, Formats: &mpegAVCAUFormat},
{Names: []string{format.AVC_DCR}, Formats: &mpegAVCDCRFormat},
{Names: []string{format.FLAC_FRAME}, Formats: &flacFrameFormat},
{Names: []string{format.FLAC_METADATABLOCK}, Formats: &flacMetadatablockFormat},
{Names: []string{format.HEVC_AU}, Formats: &mpegHEVCSampleFormat},
{Names: []string{format.HEVC_DCR}, Formats: &mpegHEVCDCRFormat},
{Names: []string{format.IMAGE}, Formats: &imageFormat},
{Names: []string{format.MP3_FRAME}, Formats: &mp3FrameFormat},
{Names: []string{format.MPEG_ASC}, Formats: &mpegASCFrameFormat},
{Names: []string{format.MPEG_PES_PACKET}, Formats: &mpegPESPacketSampleFormat},
{Names: []string{format.MPEG_SPU}, Formats: &mpegSPUFrameFormat},
{Names: []string{format.OPUS_PACKET}, Formats: &opusPacketFrameFormat},
{Names: []string{format.VORBIS_PACKET}, Formats: &vorbisPacketFormat},
{Names: []string{format.VP8_FRAME}, Formats: &vp8FrameFormat},
{Names: []string{format.VP9_CFM}, Formats: &vp9CFMFormat},
{Names: []string{format.VP9_FRAME}, Formats: &vp9FrameFormat},
},
FS: matroskaFS,
})
codecToFormat = map[string]*[]*decode.Format{
"A_VORBIS": &vorbisPacketFormat,
"A_MPEG/L3": &mp3FrameFormat,
"A_FLAC": &flacFrameFormat,
"A_AAC": &aacFrameFormat,
"A_OPUS": &opusPacketFrameFormat,
"V_VP8": &vp8FrameFormat,
"V_VP9": &vp9FrameFormat,
"V_AV1": &av1FrameFormat,
"V_VOBSUB": &mpegSPUFrameFormat,
"V_MPEG4/ISO/AVC": &mpegAVCAUFormat,
"V_MPEGH/ISO/HEVC": &mpegHEVCSampleFormat,
"V_MPEG2": &mpegPESPacketSampleFormat,
"S_VOBSUB": &mpegSPUFrameFormat,
}
}
// TODO: smarter?
func decodeRawVintWidth(d *decode.D) (uint64, int) {
n := d.U8()
w := 1
for i := 0; i <= 7 && (n&(1<<(7-i))) == 0; i++ {
w++
}
for i := 1; i < w; i++ {
n = n<<8 | d.U8()
}
return n, w
}
func decodeRawVint(d *decode.D) uint64 {
n, _ := decodeRawVintWidth(d)
return n
}
func decodeVint(d *decode.D) uint64 {
n, w := decodeRawVintWidth(d)
m := (uint64(1<<((w-1)*8+(8-w))) - 1)
return n & m
}
func fieldDecodeVint(d *decode.D, name string, displayFormat decode.DisplayFormat) uint64 {
return d.FieldUFn(name, func() (uint64, decode.DisplayFormat, string) {
return decodeVint(d), displayFormat, ""
})
}
type track struct {
parentD *decode.D
number int
codec string
codecPrivatePos int64
codecPrivateTagSize int64
decodeOpts []decode.Options
}
type block struct {
d *decode.D
r ranges.Range
simple bool
}
type decodeContext struct {
currentTrack *track
tracks []*track
blocks []block
}
func decodeMaster(d *decode.D, bitsLimit int64, tag ebml.Tag, dc *decodeContext) {
tagEndBit := d.Pos() + bitsLimit
d.FieldArrayFn("elements", func(d *decode.D) {
// var crcD *decode.D
// var crcStart int64
for d.Pos() < tagEndBit && d.NotEnd() {
startPos := d.Pos()
tagID := decodeRawVint(d)
d.SeekAbs(startPos)
a, ok := tag[tagID]
if !ok {
a, ok = ebml.Global[tagID]
if !ok {
d.Invalid(fmt.Sprintf("unknown id %d", tagID))
}
}
d.FieldStructFn("element", func(d *decode.D) {
if tagID == ebml_matroska.TrackEntryID {
dc.currentTrack = &track{}
dc.tracks = append(dc.tracks, dc.currentTrack)
}
// TODO: add a.Definition as description?
// TODO: map?
d.FieldValueU("type", uint64(a.Type), ebml.TypeNames[a.Type])
d.FieldUFn("id", func() (uint64, decode.DisplayFormat, string) {
n := decodeRawVint(d)
return n, decode.NumberHex, a.Name
})
// tagSize could be 0xffffffffffffff which means "unknown" size, then we will read until eof
// TODO: should read until unknown id:
// The end of a Master-element with unknown size is determined by the beginning of the next
// element that is not a valid sub-element of that Master-element
// TODO: should also handle garbage between
tagSize := fieldDecodeVint(d, "size", decode.NumberDecimal)
if tagSize > 8 &&
(a.Type == ebml.Integer ||
a.Type == ebml.Uinteger ||
a.Type == ebml.Float) {
d.Invalid(fmt.Sprintf("invalid tagSize %d for non-master type", tagSize))
}
switch a.Type {
case ebml.Integer:
d.FieldSFn("value", func() (int64, decode.DisplayFormat, string) {
n := d.S(int(tagSize) * 8)
if len(a.UintegerEnums) > 0 {
// TODO: use enum Definition as description
return n, decode.NumberDecimal, a.IntegerEnums[n].Label
}
return n, decode.NumberDecimal, ""
})
case ebml.Uinteger:
v := d.FieldUFn("value", func() (uint64, decode.DisplayFormat, string) {
n := d.U(int(tagSize) * 8)
if len(a.UintegerEnums) > 0 {
// TODO: use enum Definition as description
return n, decode.NumberDecimal, a.UintegerEnums[n].Label
}
return n, decode.NumberDecimal, ""
})
if dc.currentTrack != nil && tagID == ebml_matroska.TrackNumberID {
dc.currentTrack.number = int(v)
}
case ebml.Float:
d.FieldF("value", int(tagSize)*8)
case ebml.String:
v := d.FieldStrFn("value", func() (string, string) {
s := d.UTF8(int(tagSize))
if len(a.StringEnums) > 0 {
// TODO: use enum Definition as description
return s, a.StringEnums[s].Label
}
return s, ""
})
if dc.currentTrack != nil && tagID == ebml_matroska.CodecIDID {
dc.currentTrack.codec = v
}
case ebml.UTF8:
d.FieldUTF8("value", int(tagSize))
case ebml.Date:
// TODO:
/*
proc type_date {size label _extra} {
set s [clock scan {2001-01-01 00:00:00}]
set frac 0
switch $size {
0 {}
8 {
set nano [int64]
set s [clock add $s [expr $nano/1000000000] seconds]
set frac [expr ($nano%1000000000)/1000000000.0]
}
default {
bytes $size $label
return
}
}
entry $label "[clock format $s] ${frac}s" $size [expr [pos]-$size]
}
*/
d.FieldBitBufLen("value", int64(tagSize)*8)
case ebml.Binary:
switch tagID {
case ebml_matroska.SimpleBlockID:
dc.blocks = append(dc.blocks, block{
d: d,
r: ranges.Range{Start: d.Pos(), Len: int64(tagSize) * 8},
simple: true,
})
d.SeekRel(int64(tagSize) * 8)
case ebml_matroska.BlockID:
dc.blocks = append(dc.blocks, block{
d: d,
r: ranges.Range{Start: d.Pos(), Len: int64(tagSize) * 8},
})
d.SeekRel(int64(tagSize) * 8)
case ebml_matroska.CodecPrivateID:
if dc.currentTrack != nil {
dc.currentTrack.parentD = d
dc.currentTrack.codecPrivatePos = d.Pos()
dc.currentTrack.codecPrivateTagSize = int64(tagSize) * 8
}
d.SeekRel(int64(tagSize) * 8)
case ebml_matroska.FileDataID:
d.FieldDecodeLen("value", int64(tagSize)*8, imageFormat)
default:
d.FieldBitBufLen("value", int64(tagSize)*8)
// if tagID == CRC {
// crcD = d
// crcStart = d.Pos()
// }
}
case ebml.Master:
decodeMaster(d, int64(tagSize)*8, a.Tag, dc)
}
})
}
// if crcD != nil {
// crcValue := crcD.FieldMustRemove("value")
// elementCRC := &crc.CRC{Bits: 32, Current: 0xffff_ffff, Table: crc.IEEELETable}
// //log.Printf("crc: %x-%x %d\n", crcStart/8, d.Pos()/8, (d.Pos()-crcStart)/8)
// ioextra.MustCopy(elementCRC, d.BitBufRange(crcStart, d.Pos()-crcStart))
// crcD.FieldChecksumRange("value", crcValue.Range.Start, crcValue.Range.Len, elementCRC.Sum(nil), decode.LittleEndian)
// }
})
}
func matroskaDecode(d *decode.D, in interface{}) interface{} {
ebmlHeaderID := uint64(0x1a45dfa3)
if d.PeekBits(32) != ebmlHeaderID {
d.Invalid("no EBML header found")
}
dc := &decodeContext{tracks: []*track{}}
decodeMaster(d, d.BitsLeft(), ebml_matroska.Root, dc)
trackNumberToTrack := map[int]*track{}
for _, t := range dc.tracks {
trackNumberToTrack[t.number] = t
}
for _, t := range dc.tracks {
// no CodecPrivate found
if t.parentD == nil {
continue
}
// TODO: refactor, one DecodeRangeFn or refactor to add FieldDecodeRangeFn?
switch t.codec {
case "A_VORBIS":
t.parentD.DecodeRangeFn(t.codecPrivatePos, t.codecPrivateTagSize, func(d *decode.D) {
numPackets := d.FieldU8("num_packets")
// TODO: lacing
packetLengths := []int64{}
// Xiph-style lacing (similar to ogg) of n-1 packets, last is reset of block
d.FieldArrayFn("laces", func(d *decode.D) {
for i := uint64(0); i < numPackets; i++ {
l := d.FieldUFn("lace", func() (uint64, decode.DisplayFormat, string) {
var l uint64
for {
n := d.U8()
l += n
if n < 255 {
return l, decode.NumberDecimal, ""
}
}
})
packetLengths = append(packetLengths, int64(l))
}
})
d.FieldArrayFn("packets", func(d *decode.D) {
for _, l := range packetLengths {
d.FieldDecodeLen("packet", l*8, vorbisPacketFormat)
}
d.FieldDecodeLen("packet", d.BitsLeft(), vorbisPacketFormat)
})
})
case "A_AAC":
t.parentD.FieldDecodeRange("value", t.codecPrivatePos, t.codecPrivateTagSize, mpegASCFrameFormat)
case "A_OPUS":
t.parentD.FieldDecodeRange("value", t.codecPrivatePos, t.codecPrivateTagSize, opusPacketFrameFormat)
case "A_FLAC":
t.parentD.DecodeRangeFn(t.codecPrivatePos, t.codecPrivateTagSize, func(d *decode.D) {
d.FieldStructFn("value", func(d *decode.D) {
d.FieldValidateUTF8("magic", "fLaC")
d.FieldArrayFn("metadatablocks", func(d *decode.D) {
for {
_, v := d.FieldDecode("metadatablock", flacMetadatablockFormat)
flacMetadatablockOut, ok := v.(format.FlacMetadatablockOut)
if !ok {
d.Invalid(fmt.Sprintf("expected FlacMetadatablockOut got %#+v", v))
}
if flacMetadatablockOut.HasStreamInfo {
t.decodeOpts = append(t.decodeOpts,
decode.FormatOptions{InArg: format.FlacFrameIn{StreamInfo: flacMetadatablockOut.StreamInfo}})
}
if flacMetadatablockOut.IsLastBlock {
return
}
}
})
})
})
case "V_MPEG4/ISO/AVC":
_, v := t.parentD.FieldDecodeRange("value", t.codecPrivatePos, t.codecPrivateTagSize, mpegAVCDCRFormat)
avcDcrOut, ok := v.(format.AvcDcrOut)
if !ok {
d.Invalid(fmt.Sprintf("expected AvcDcrOut got %#+v", v))
}
t.decodeOpts = append(t.decodeOpts,
decode.FormatOptions{InArg: format.AvcIn{LengthSize: avcDcrOut.LengthSize}}) //nolint:gosimple
case "V_MPEGH/ISO/HEVC":
_, v := t.parentD.FieldDecodeRange("value", t.codecPrivatePos, t.codecPrivateTagSize, mpegHEVCDCRFormat)
hevcDcrOut, ok := v.(format.HevcDcrOut)
if !ok {
d.Invalid(fmt.Sprintf("expected HevcDcrOut got %#+v", v))
}
t.decodeOpts = append(t.decodeOpts,
decode.FormatOptions{InArg: format.HevcIn{LengthSize: hevcDcrOut.LengthSize}}) //nolint:gosimple
case "V_AV1":
t.parentD.FieldDecodeRange("value", t.codecPrivatePos, t.codecPrivateTagSize, av1CCRFormat)
case "V_VP9":
t.parentD.FieldDecodeRange("value", t.codecPrivatePos, t.codecPrivateTagSize, vp9CFMFormat)
default:
t.parentD.FieldBitBufRange("value", t.codecPrivatePos, t.codecPrivateTagSize)
}
}
for _, b := range dc.blocks {
b.d.DecodeRangeFn(b.r.Start, b.r.Len, func(d *decode.D) {
trackNumber := fieldDecodeVint(d, "track_number", decode.NumberDecimal)
d.FieldU16("timestamp")
if b.simple {
d.FieldStructFn("flags", func(d *decode.D) {
d.FieldBool("key_frame")
d.FieldU3("reserved")
d.FieldBool("invisible")
d.FieldU2("lacing")
d.FieldBool("discardable")
})
} else {
d.FieldStructFn("flags", func(d *decode.D) {
d.FieldU4("reserved")
d.FieldBool("invisible")
d.FieldU2("lacing")
d.FieldBool("not_used")
})
}
// TODO: lacing etc
// TODO: fixed/unknown?
if t, ok := trackNumberToTrack[int(trackNumber)]; ok {
if f, ok := codecToFormat[t.codec]; ok {
d.FieldDecode("packet", *f, t.decodeOpts...)
}
}
if d.BitsLeft() > 0 {
d.FieldBitBufLen("data", d.BitsLeft())
}
})
}
return nil
}

View File

@ -0,0 +1,3 @@
# <matroska value> | matroska_path(".Segment.Tracks[0].TrackEntry[1].CodecID") -> element
# <matroska value> | matroska_path(<matroska value>) -> ".Segment.Tracks[0]"
def matroska_path(p): tree_path(.elements; .id._symbol; p);

514
format/matroska/testdata/aac.fqtest vendored Normal file
View File

@ -0,0 +1,514 @@
# ffmpeg -f lavfi -i sine -c:a aac -f matroska -t 50ms aac.mkv
/aac.mkv:
> fq -d matroska verbose /aac.mkv
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /aac.mkv (matroska) 0x0-0x4c3.7 (1220)
| | | elements: [2] 0x0-0x4c3.7 (1220)
| | | [0]: element {} 0x0-0x27.7 (40)
| | | type: master (7) 0x0-NA (0)
0x000|1a 45 df a3 |.E.. | id: EBML (0x1a45dfa3) 0x0-0x3.7 (4)
0x000| a3 | . | size: 35 0x4-0x4.7 (1)
| | | elements: [7] 0x5-0x27.7 (35)
| | | [0]: element {} 0x5-0x8.7 (4)
| | | type: uinteger (1) 0x5-NA (0)
0x000| 42 86 | B. | id: EBMLVersion (0x4286) 0x5-0x6.7 (2)
0x000| 81 | . | size: 1 0x7-0x7.7 (1)
0x000| 01 | . | value: 1 0x8-0x8.7 (1)
| | | [1]: element {} 0x9-0xc.7 (4)
| | | type: uinteger (1) 0x9-NA (0)
0x000| 42 f7 | B. | id: EBMLReadVersion (0x42f7) 0x9-0xa.7 (2)
0x000| 81 | . | size: 1 0xb-0xb.7 (1)
0x000| 01 | . | value: 1 0xc-0xc.7 (1)
| | | [2]: element {} 0xd-0x10.7 (4)
| | | type: uinteger (1) 0xd-NA (0)
0x000| 42 f2 | B. | id: EBMLMaxIDLength (0x42f2) 0xd-0xe.7 (2)
0x000| 81| .| size: 1 0xf-0xf.7 (1)
0x010|04 |. | value: 4 0x10-0x10.7 (1)
| | | [3]: element {} 0x11-0x14.7 (4)
| | | type: uinteger (1) 0x11-NA (0)
0x010| 42 f3 | B. | id: EBMLMaxSizeLength (0x42f3) 0x11-0x12.7 (2)
0x010| 81 | . | size: 1 0x13-0x13.7 (1)
0x010| 08 | . | value: 8 0x14-0x14.7 (1)
| | | [4]: element {} 0x15-0x1f.7 (11)
| | | type: string (3) 0x15-NA (0)
0x010| 42 82 | B. | id: DocType (0x4282) 0x15-0x16.7 (2)
0x010| 88 | . | size: 8 0x17-0x17.7 (1)
0x010| 6d 61 74 72 6f 73 6b 61| matroska| value: "matroska" 0x18-0x1f.7 (8)
| | | [5]: element {} 0x20-0x23.7 (4)
| | | type: uinteger (1) 0x20-NA (0)
0x020|42 87 |B. | id: DocTypeVersion (0x4287) 0x20-0x21.7 (2)
0x020| 81 | . | size: 1 0x22-0x22.7 (1)
0x020| 04 | . | value: 4 0x23-0x23.7 (1)
| | | [6]: element {} 0x24-0x27.7 (4)
| | | type: uinteger (1) 0x24-NA (0)
0x020| 42 85 | B. | id: DocTypeReadVersion (0x4285) 0x24-0x25.7 (2)
0x020| 81 | . | size: 1 0x26-0x26.7 (1)
0x020| 02 | . | value: 2 0x27-0x27.7 (1)
| | | [1]: element {} 0x28-0x4c3.7 (1180)
| | | type: master (7) 0x28-NA (0)
0x020| 18 53 80 67 | .S.g | id: Segment (0x18538067) 0x28-0x2b.7 (4)
0x020| 01 00 00 00| ....| size: 1168 0x2c-0x33.7 (8)
0x030|00 00 04 90 |.... |
| | | elements: [7] 0x34-0x4c3.7 (1168)
| | | [0]: element {} 0x34-0x78.7 (69)
| | | type: master (7) 0x34-NA (0)
0x030| 11 4d 9b 74 | .M.t | id: SeekHead (0x114d9b74) 0x34-0x37.7 (4)
0x030| c0 | . | size: 64 0x38-0x38.7 (1)
| | | elements: [5] 0x39-0x78.7 (64)
| | | [0]: element {} 0x39-0x3e.7 (6)
| | | type: binary (6) 0x39-NA (0)
0x030| bf | . | id: CRC-32 (0xbf) 0x39-0x39.7 (1)
0x030| 84 | . | size: 4 0x3a-0x3a.7 (1)
0x030| d2 8f 35 55 | ..5U | value: d28f3555 0x3b-0x3e.7 (4)
| | | [1]: element {} 0x3f-0x4c.7 (14)
| | | type: master (7) 0x3f-NA (0)
0x030| 4d| M| id: Seek (0x4dbb) 0x3f-0x40.7 (2)
0x040|bb |. |
0x040| 8b | . | size: 11 0x41-0x41.7 (1)
| | | elements: [2] 0x42-0x4c.7 (11)
| | | [0]: element {} 0x42-0x48.7 (7)
| | | type: binary (6) 0x42-NA (0)
0x040| 53 ab | S. | id: SeekID (0x53ab) 0x42-0x43.7 (2)
0x040| 84 | . | size: 4 0x44-0x44.7 (1)
0x040| 15 49 a9 66 | .I.f | value: 1549a966 0x45-0x48.7 (4)
| | | [1]: element {} 0x49-0x4c.7 (4)
| | | type: uinteger (1) 0x49-NA (0)
0x040| 53 ac | S. | id: SeekPosition (0x53ac) 0x49-0x4a.7 (2)
0x040| 81 | . | size: 1 0x4b-0x4b.7 (1)
0x040| a1 | . | value: 161 0x4c-0x4c.7 (1)
| | | [2]: element {} 0x4d-0x5a.7 (14)
| | | type: master (7) 0x4d-NA (0)
0x040| 4d bb | M. | id: Seek (0x4dbb) 0x4d-0x4e.7 (2)
0x040| 8b| .| size: 11 0x4f-0x4f.7 (1)
| | | elements: [2] 0x50-0x5a.7 (11)
| | | [0]: element {} 0x50-0x56.7 (7)
| | | type: binary (6) 0x50-NA (0)
0x050|53 ab |S. | id: SeekID (0x53ab) 0x50-0x51.7 (2)
0x050| 84 | . | size: 4 0x52-0x52.7 (1)
0x050| 16 54 ae 6b | .T.k | value: 1654ae6b 0x53-0x56.7 (4)
| | | [1]: element {} 0x57-0x5a.7 (4)
| | | type: uinteger (1) 0x57-NA (0)
0x050| 53 ac | S. | id: SeekPosition (0x53ac) 0x57-0x58.7 (2)
0x050| 81 | . | size: 1 0x59-0x59.7 (1)
0x050| f1 | . | value: 241 0x5a-0x5a.7 (1)
| | | [3]: element {} 0x5b-0x69.7 (15)
| | | type: master (7) 0x5b-NA (0)
0x050| 4d bb | M. | id: Seek (0x4dbb) 0x5b-0x5c.7 (2)
0x050| 8c | . | size: 12 0x5d-0x5d.7 (1)
| | | elements: [2] 0x5e-0x69.7 (12)
| | | [0]: element {} 0x5e-0x64.7 (7)
| | | type: binary (6) 0x5e-NA (0)
0x050| 53 ab| S.| id: SeekID (0x53ab) 0x5e-0x5f.7 (2)
0x060|84 |. | size: 4 0x60-0x60.7 (1)
0x060| 12 54 c3 67 | .T.g | value: 1254c367 0x61-0x64.7 (4)
| | | [1]: element {} 0x65-0x69.7 (5)
| | | type: uinteger (1) 0x65-NA (0)
0x060| 53 ac | S. | id: SeekPosition (0x53ac) 0x65-0x66.7 (2)
0x060| 82 | . | size: 2 0x67-0x67.7 (1)
0x060| 01 42 | .B | value: 322 0x68-0x69.7 (2)
| | | [4]: element {} 0x6a-0x78.7 (15)
| | | type: master (7) 0x6a-NA (0)
0x060| 4d bb | M. | id: Seek (0x4dbb) 0x6a-0x6b.7 (2)
0x060| 8c | . | size: 12 0x6c-0x6c.7 (1)
| | | elements: [2] 0x6d-0x78.7 (12)
| | | [0]: element {} 0x6d-0x73.7 (7)
| | | type: binary (6) 0x6d-NA (0)
0x060| 53 ab | S. | id: SeekID (0x53ab) 0x6d-0x6e.7 (2)
0x060| 84| .| size: 4 0x6f-0x6f.7 (1)
0x070|1c 53 bb 6b |.S.k | value: 1c53bb6b 0x70-0x73.7 (4)
| | | [1]: element {} 0x74-0x78.7 (5)
| | | type: uinteger (1) 0x74-NA (0)
0x070| 53 ac | S. | id: SeekPosition (0x53ac) 0x74-0x75.7 (2)
0x070| 82 | . | size: 2 0x76-0x76.7 (1)
0x070| 04 74 | .t | value: 1140 0x77-0x78.7 (2)
| | | [1]: element {} 0x79-0xd4.7 (92)
| | | type: binary (6) 0x79-NA (0)
0x070| ec | . | id: Void (0xec) 0x79-0x79.7 (1)
0x070| 01 00 00 00 00 00| ......| size: 83 0x7a-0x81.7 (8)
0x080|00 53 |.S |
0x080| 00 00 00 00 00 00 00 00 00 00 00 00 00 00| ..............| value: 00000000000000000000000000000000... 0x82-0xd4.7 (83)
0x090|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0xd4.7 (83) | |
| | | [2]: element {} 0xd5-0x124.7 (80)
| | | type: master (7) 0xd5-NA (0)
0x0d0| 15 49 a9 66 | .I.f | id: Info (0x1549a966) 0xd5-0xd8.7 (4)
0x0d0| cb | . | size: 75 0xd9-0xd9.7 (1)
| | | elements: [6] 0xda-0x124.7 (75)
| | | [0]: element {} 0xda-0xdf.7 (6)
| | | type: binary (6) 0xda-NA (0)
0x0d0| bf | . | id: CRC-32 (0xbf) 0xda-0xda.7 (1)
0x0d0| 84 | . | size: 4 0xdb-0xdb.7 (1)
0x0d0| e9 5e 5c 67| .^\g| value: e95e5c67 0xdc-0xdf.7 (4)
| | | [1]: element {} 0xe0-0xe6.7 (7)
| | | type: uinteger (1) 0xe0-NA (0)
0x0e0|2a d7 b1 |*.. | id: TimestampScale (0x2ad7b1) 0xe0-0xe2.7 (3)
0x0e0| 83 | . | size: 3 0xe3-0xe3.7 (1)
0x0e0| 0f 42 40 | .B@ | value: 1000000 0xe4-0xe6.7 (3)
| | | [2]: element {} 0xe7-0xf6.7 (16)
| | | type: UTF8 (4) 0xe7-NA (0)
0x0e0| 4d 80 | M. | id: MuxingApp (0x4d80) 0xe7-0xe8.7 (2)
0x0e0| 8d | . | size: 13 0xe9-0xe9.7 (1)
0x0e0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0xea-0xf6.7 (13)
0x0f0|2e 34 35 2e 31 30 30 |.45.100 |
| | | [3]: element {} 0xf7-0x106.7 (16)
| | | type: UTF8 (4) 0xf7-NA (0)
0x0f0| 57 41 | WA | id: WritingApp (0x5741) 0xf7-0xf8.7 (2)
0x0f0| 8d | . | size: 13 0xf9-0xf9.7 (1)
0x0f0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0xfa-0x106.7 (13)
0x100|2e 34 35 2e 31 30 30 |.45.100 |
| | | [4]: element {} 0x107-0x119.7 (19)
| | | type: binary (6) 0x107-NA (0)
0x100| 73 a4 | s. | id: SegmentUID (0x73a4) 0x107-0x108.7 (2)
0x100| 90 | . | size: 16 0x109-0x109.7 (1)
0x100| 17 bd f9 34 6e 97| ...4n.| value: 17bdf9346e97e1238a83d7c3f1ade0b3 0x10a-0x119.7 (16)
0x110|e1 23 8a 83 d7 c3 f1 ad e0 b3 |.#........ |
| | | [5]: element {} 0x11a-0x124.7 (11)
| | | type: float (2) 0x11a-NA (0)
0x110| 44 89 | D. | id: Duration (0x4489) 0x11a-0x11b.7 (2)
0x110| 88 | . | size: 8 0x11c-0x11c.7 (1)
0x110| 40 52 40| @R@| value: 73 0x11d-0x124.7 (8)
0x120|00 00 00 00 00 |..... |
| | | [3]: element {} 0x125-0x175.7 (81)
| | | type: master (7) 0x125-NA (0)
0x120| 16 54 ae 6b | .T.k | id: Tracks (0x1654ae6b) 0x125-0x128.7 (4)
0x120| cc | . | size: 76 0x129-0x129.7 (1)
| | | elements: [2] 0x12a-0x175.7 (76)
| | | [0]: element {} 0x12a-0x12f.7 (6)
| | | type: binary (6) 0x12a-NA (0)
0x120| bf | . | id: CRC-32 (0xbf) 0x12a-0x12a.7 (1)
0x120| 84 | . | size: 4 0x12b-0x12b.7 (1)
0x120| e5 a6 af af| ....| value: e5a6afaf 0x12c-0x12f.7 (4)
| | | [1]: element {} 0x130-0x175.7 (70)
| | | type: master (7) 0x130-NA (0)
0x130|ae |. | id: TrackEntry (0xae) 0x130-0x130.7 (1)
0x130| 01 00 00 00 00 00 00 3d | .......= | size: 61 0x131-0x138.7 (8)
| | | elements: [8] 0x139-0x175.7 (61)
| | | [0]: element {} 0x139-0x13b.7 (3)
| | | type: uinteger (1) 0x139-NA (0)
0x130| d7 | . | id: TrackNumber (0xd7) 0x139-0x139.7 (1)
0x130| 81 | . | size: 1 0x13a-0x13a.7 (1)
0x130| 01 | . | value: 1 0x13b-0x13b.7 (1)
| | | [1]: element {} 0x13c-0x146.7 (11)
| | | type: uinteger (1) 0x13c-NA (0)
0x130| 73 c5 | s. | id: TrackUID (0x73c5) 0x13c-0x13d.7 (2)
0x130| 88 | . | size: 8 0x13e-0x13e.7 (1)
0x130| f7| .| value: 17862762257755232487 0x13f-0x146.7 (8)
0x140|e5 47 a1 e8 c1 58 e7 |.G...X. |
| | | [2]: element {} 0x147-0x149.7 (3)
| | | type: uinteger (1) 0x147-NA (0)
0x140| 9c | . | id: FlagLacing (0x9c) 0x147-0x147.7 (1)
0x140| 81 | . | size: 1 0x148-0x148.7 (1)
0x140| 00 | . | value: 0 0x149-0x149.7 (1)
| | | [3]: element {} 0x14a-0x150.7 (7)
| | | type: string (3) 0x14a-NA (0)
0x140| 22 b5 9c | ".. | id: Language (0x22b59c) 0x14a-0x14c.7 (3)
0x140| 83 | . | size: 3 0x14d-0x14d.7 (1)
0x140| 75 6e| un| value: "und" 0x14e-0x150.7 (3)
0x150|64 |d |
| | | [4]: element {} 0x151-0x157.7 (7)
| | | type: string (3) 0x151-NA (0)
0x150| 86 | . | id: CodecID (0x86) 0x151-0x151.7 (1)
0x150| 85 | . | size: 5 0x152-0x152.7 (1)
0x150| 41 5f 41 41 43 | A_AAC | value: "A_AAC" 0x153-0x157.7 (5)
| | | [5]: element {} 0x158-0x15a.7 (3)
| | | type: uinteger (1) 0x158-NA (0)
0x150| 83 | . | id: TrackType (0x83) 0x158-0x158.7 (1)
0x150| 81 | . | size: 1 0x159-0x159.7 (1)
0x150| 02 | . | value: audio (2) 0x15a-0x15a.7 (1)
| | | [6]: element {} 0x15b-0x16d.7 (19)
| | | type: master (7) 0x15b-NA (0)
0x150| e1 | . | id: Audio (0xe1) 0x15b-0x15b.7 (1)
0x150| 91 | . | size: 17 0x15c-0x15c.7 (1)
| | | elements: [3] 0x15d-0x16d.7 (17)
| | | [0]: element {} 0x15d-0x15f.7 (3)
| | | type: uinteger (1) 0x15d-NA (0)
0x150| 9f | . | id: Channels (0x9f) 0x15d-0x15d.7 (1)
0x150| 81 | . | size: 1 0x15e-0x15e.7 (1)
0x150| 01| .| value: 1 0x15f-0x15f.7 (1)
| | | [1]: element {} 0x160-0x169.7 (10)
| | | type: float (2) 0x160-NA (0)
0x160|b5 |. | id: SamplingFrequency (0xb5) 0x160-0x160.7 (1)
0x160| 88 | . | size: 8 0x161-0x161.7 (1)
0x160| 40 e5 88 80 00 00 00 00 | @....... | value: 44100 0x162-0x169.7 (8)
| | | [2]: element {} 0x16a-0x16d.7 (4)
| | | type: uinteger (1) 0x16a-NA (0)
0x160| 62 64 | bd | id: BitDepth (0x6264) 0x16a-0x16b.7 (2)
0x160| 81 | . | size: 1 0x16c-0x16c.7 (1)
0x160| 20 | | value: 32 0x16d-0x16d.7 (1)
| | | [7]: element {} 0x16e-0x175.7 (8)
| | | type: binary (6) 0x16e-NA (0)
0x160| 63 a2| c.| id: CodecPrivate (0x63a2) 0x16e-0x16f.7 (2)
0x170|85 |. | size: 5 0x170-0x170.7 (1)
| | | value: {} (mpeg_asc) 0x171-0x175.7 (5)
0x170| 12 | . | object_type: AAC LC (Low Complexity) (2) 0x171-0x171.4 (0.5)
0x170| 12 08 | .. | frequency_index: 44100 0x171.5-0x172 (0.4)
0x170| 08 | . | channel_configuration: channel: front-center (1) 0x172.1-0x172.4 (0.4)
0x170| 08 56 e5 00 | .V.. | var_aot_or_byte_align: 0adca000 0x172.5-0x175.7 (3.3)
| | | [4]: element {} 0x176-0x217.7 (162)
| | | type: master (7) 0x176-NA (0)
0x170| 12 54 c3 67 | .T.g | id: Tags (0x1254c367) 0x176-0x179.7 (4)
0x170| 40 9c | @. | size: 156 0x17a-0x17b.7 (2)
| | | elements: [3] 0x17c-0x217.7 (156)
| | | [0]: element {} 0x17c-0x181.7 (6)
| | | type: binary (6) 0x17c-NA (0)
0x170| bf | . | id: CRC-32 (0xbf) 0x17c-0x17c.7 (1)
0x170| 84 | . | size: 4 0x17d-0x17d.7 (1)
0x170| db 93| ..| value: db938b0f 0x17e-0x181.7 (4)
0x180|8b 0f |.. |
| | | [1]: element {} 0x182-0x1b2.7 (49)
| | | type: master (7) 0x182-NA (0)
0x180| 73 73 | ss | id: Tag (0x7373) 0x182-0x183.7 (2)
0x180| 01 00 00 00 00 00 00 27 | .......' | size: 39 0x184-0x18b.7 (8)
| | | elements: [2] 0x18c-0x1b2.7 (39)
| | | [0]: element {} 0x18c-0x18e.7 (3)
| | | type: master (7) 0x18c-NA (0)
0x180| 63 c0 | c. | id: Targets (0x63c0) 0x18c-0x18d.7 (2)
0x180| 80 | . | size: 0 0x18e-0x18e.7 (1)
| | | elements: [0] 0x18f-NA (0)
| | | [1]: element {} 0x18f-0x1b2.7 (36)
| | | type: master (7) 0x18f-NA (0)
0x180| 67| g| id: SimpleTag (0x67c8) 0x18f-0x190.7 (2)
0x190|c8 |. |
0x190| 01 00 00 00 00 00 00 1a | ........ | size: 26 0x191-0x198.7 (8)
| | | elements: [2] 0x199-0x1b2.7 (26)
| | | [0]: element {} 0x199-0x1a2.7 (10)
| | | type: UTF8 (4) 0x199-NA (0)
0x190| 45 a3 | E. | id: TagName (0x45a3) 0x199-0x19a.7 (2)
0x190| 87 | . | size: 7 0x19b-0x19b.7 (1)
0x190| 45 4e 43 4f| ENCO| value: "ENCODER" 0x19c-0x1a2.7 (7)
0x1a0|44 45 52 |DER |
| | | [1]: element {} 0x1a3-0x1b2.7 (16)
| | | type: UTF8 (4) 0x1a3-NA (0)
0x1a0| 44 87 | D. | id: TagString (0x4487) 0x1a3-0x1a4.7 (2)
0x1a0| 8d | . | size: 13 0x1a5-0x1a5.7 (1)
0x1a0| 4c 61 76 66 35 38 2e 34 35 2e| Lavf58.45.| value: "Lavf58.45.100" 0x1a6-0x1b2.7 (13)
0x1b0|31 30 30 |100 |
| | | [2]: element {} 0x1b3-0x217.7 (101)
| | | type: master (7) 0x1b3-NA (0)
0x1b0| 73 73 | ss | id: Tag (0x7373) 0x1b3-0x1b4.7 (2)
0x1b0| 01 00 00 00 00 00 00 5b | .......[ | size: 91 0x1b5-0x1bc.7 (8)
| | | elements: [3] 0x1bd-0x217.7 (91)
| | | [0]: element {} 0x1bd-0x1ca.7 (14)
| | | type: master (7) 0x1bd-NA (0)
0x1b0| 63 c0 | c. | id: Targets (0x63c0) 0x1bd-0x1be.7 (2)
0x1b0| 8b| .| size: 11 0x1bf-0x1bf.7 (1)
| | | elements: [1] 0x1c0-0x1ca.7 (11)
| | | [0]: element {} 0x1c0-0x1ca.7 (11)
| | | type: uinteger (1) 0x1c0-NA (0)
0x1c0|63 c5 |c. | id: TagTrackUID (0x63c5) 0x1c0-0x1c1.7 (2)
0x1c0| 88 | . | size: 8 0x1c2-0x1c2.7 (1)
0x1c0| f7 e5 47 a1 e8 c1 58 e7 | ..G...X. | value: 17862762257755232487 0x1c3-0x1ca.7 (8)
| | | [1]: element {} 0x1cb-0x1f2.7 (40)
| | | type: master (7) 0x1cb-NA (0)
0x1c0| 67 c8 | g. | id: SimpleTag (0x67c8) 0x1cb-0x1cc.7 (2)
0x1c0| 01 00 00| ...| size: 30 0x1cd-0x1d4.7 (8)
0x1d0|00 00 00 00 1e |..... |
| | | elements: [2] 0x1d5-0x1f2.7 (30)
| | | [0]: element {} 0x1d5-0x1de.7 (10)
| | | type: UTF8 (4) 0x1d5-NA (0)
0x1d0| 45 a3 | E. | id: TagName (0x45a3) 0x1d5-0x1d6.7 (2)
0x1d0| 87 | . | size: 7 0x1d7-0x1d7.7 (1)
0x1d0| 45 4e 43 4f 44 45 52 | ENCODER | value: "ENCODER" 0x1d8-0x1de.7 (7)
| | | [1]: element {} 0x1df-0x1f2.7 (20)
| | | type: UTF8 (4) 0x1df-NA (0)
0x1d0| 44| D| id: TagString (0x4487) 0x1df-0x1e0.7 (2)
0x1e0|87 |. |
0x1e0| 91 | . | size: 17 0x1e1-0x1e1.7 (1)
0x1e0| 4c 61 76 63 35 38 2e 39 31 2e 31 30 30 20| Lavc58.91.100 | value: "Lavc58.91.100 aac" 0x1e2-0x1f2.7 (17)
0x1f0|61 61 63 |aac |
| | | [2]: element {} 0x1f3-0x217.7 (37)
| | | type: master (7) 0x1f3-NA (0)
0x1f0| 67 c8 | g. | id: SimpleTag (0x67c8) 0x1f3-0x1f4.7 (2)
0x1f0| a2 | . | size: 34 0x1f5-0x1f5.7 (1)
| | | elements: [2] 0x1f6-0x217.7 (34)
| | | [0]: element {} 0x1f6-0x200.7 (11)
| | | type: UTF8 (4) 0x1f6-NA (0)
0x1f0| 45 a3 | E. | id: TagName (0x45a3) 0x1f6-0x1f7.7 (2)
0x1f0| 88 | . | size: 8 0x1f8-0x1f8.7 (1)
0x1f0| 44 55 52 41 54 49 4f| DURATIO| value: "DURATION" 0x1f9-0x200.7 (8)
0x200|4e |N |
| | | [1]: element {} 0x201-0x217.7 (23)
| | | type: UTF8 (4) 0x201-NA (0)
0x200| 44 87 | D. | id: TagString (0x4487) 0x201-0x202.7 (2)
0x200| 94 | . | size: 20 0x203-0x203.7 (1)
0x200| 30 30 3a 30 30 3a 30 30 2e 30 37 33| 00:00:00.073| value: "00:00:00.073000000\x00\x00" 0x204-0x217.7 (20)
0x210|30 30 30 30 30 30 00 00 |000000.. |
| | | [5]: element {} 0x218-0x4a7.7 (656)
| | | type: master (7) 0x218-NA (0)
0x210| 1f 43 b6 75 | .C.u | id: Cluster (0x1f43b675) 0x218-0x21b.7 (4)
0x210| 42 8a | B. | size: 650 0x21c-0x21d.7 (2)
| | | elements: [6] 0x21e-0x4a7.7 (650)
| | | [0]: element {} 0x21e-0x223.7 (6)
| | | type: binary (6) 0x21e-NA (0)
0x210| bf | . | id: CRC-32 (0xbf) 0x21e-0x21e.7 (1)
0x210| 84| .| size: 4 0x21f-0x21f.7 (1)
0x220|49 9d 16 a3 |I... | value: 499d16a3 0x220-0x223.7 (4)
| | | [1]: element {} 0x224-0x226.7 (3)
| | | type: uinteger (1) 0x224-NA (0)
0x220| e7 | . | id: Timestamp (0xe7) 0x224-0x224.7 (1)
0x220| 81 | . | size: 1 0x225-0x225.7 (1)
0x220| 00 | . | value: 0 0x226-0x226.7 (1)
| | | [2]: element {} 0x227-0x2fa.7 (212)
| | | type: binary (6) 0x227-NA (0)
0x220| a3 | . | id: SimpleBlock (0xa3) 0x227-0x227.7 (1)
0x220| 40 d1 | @. | size: 209 0x228-0x229.7 (2)
0x220| 81 | . | track_number: 1 0x22a-0x22a.7 (1)
0x220| 00 00 | .. | timestamp: 0 0x22b-0x22c.7 (2)
| | | flags: {} 0x22d-0x22d.7 (1)
0x220| 80 | . | key_frame: true 0x22d-0x22d (0.1)
0x220| 80 | . | reserved: 0 0x22d.1-0x22d.3 (0.3)
0x220| 80 | . | invisible: false 0x22d.4-0x22d.4 (0.1)
0x220| 80 | . | lacing: 0 0x22d.5-0x22d.6 (0.2)
0x220| 80 | . | discardable: false 0x22d.7-0x22d.7 (0.1)
| | | packet: {} (aac_frame) 0x22e-0x2fa.7 (205)
| | | elements: [3] 0x22e-0x242.7 (21)
| | | [0]: element {} 0x22e-0x23e.6 (16.7)
0x220| de | . | syntax_element: FIL (6) 0x22e-0x22e.2 (0.3)
| | | cnt: {} 0x22e.3-0x22f.6 (1.4)
0x220| de | . | count: 15 0x22e.3-0x22e.6 (0.4)
0x220| de 02| ..| esc_count: 1 0x22e.7-0x22f.6 (1)
| | | payload_length: 15 0x22f.7-NA (0)
| | | extension_payload: {} 0x22f.7-0x23e.6 (15)
0x220| 02| .| extension_type: EXT_FILL (0) 0x22f.7-0x230.2 (0.4)
0x230|00 |. |
0x230|00 |. | fill_nibble: 0 0x230.3-0x230.6 (0.4)
0x230|00 4c 61 76 63 35 38 2e 39 31 2e 31 30 30 00 |.Lavc58.91.100. | fill_byte: 2630bb319a9c171c989718981800 0x230.7-0x23e.6 (14)
| | | [1]: element {} 0x23e.7-0x242 (3.2)
0x230| 00 02| ..| syntax_element: SCE (0) 0x23e.7-0x23f.1 (0.3)
0x230| 02| .| element_instance_tag: 0 0x23f.2-0x23f.5 (0.4)
0x230| 02| .| global_gain: 151 0x23f.6-0x240.5 (1)
0x240|5c |\ |
| | | ics_info: {} 0x240.6-0x242 (1.3)
0x240|5c |\ | ics_reserved_bit: 0 0x240.6-0x240.6 (0.1)
0x240|5c ab |\. | window_sequence: LONG_START_SEQUENCE (1) 0x240.7-0x241 (0.2)
0x240| ab | . | window_shape: 0 0x241.1-0x241.1 (0.1)
0x240| ab | . | max_sfb: 43 0x241.2-0x241.7 (0.6)
0x240| 59 | Y | predictor_data_present: false 0x242-0x242 (0.1)
0x240| 59 | Y | [2]: byte_align b2 0x242.1-0x242.7 (0.7)
0x240| a9 8c 72 50 8b 4c aa de 1d 71 72 5c 88| ..rP.L...qr\.| data: a98c72508b4caade1d71725c88420810... 0x243-0x2fa.7 (184)
0x250|42 08 10 0e 80 0c d5 9f 71 6c 47 12 cb b6 16 71|B.......qlG....q|
* |until 0x2fa.7 (184) | |
| | | [3]: element {} 0x2fb-0x3db.7 (225)
| | | type: binary (6) 0x2fb-NA (0)
0x2f0| a3 | . | id: SimpleBlock (0xa3) 0x2fb-0x2fb.7 (1)
0x2f0| 40 de | @. | size: 222 0x2fc-0x2fd.7 (2)
0x2f0| 81 | . | track_number: 1 0x2fe-0x2fe.7 (1)
0x2f0| 00| .| timestamp: 23 0x2ff-0x300.7 (2)
0x300|17 |. |
| | | flags: {} 0x301-0x301.7 (1)
0x300| 80 | . | key_frame: true 0x301-0x301 (0.1)
0x300| 80 | . | reserved: 0 0x301.1-0x301.3 (0.3)
0x300| 80 | . | invisible: false 0x301.4-0x301.4 (0.1)
0x300| 80 | . | lacing: 0 0x301.5-0x301.6 (0.2)
0x300| 80 | . | discardable: false 0x301.7-0x301.7 (0.1)
| | | packet: {} (aac_frame) 0x302-0x3db.7 (218)
| | | elements: [2] 0x302-0x305.7 (4)
| | | [0]: element {} 0x302-0x305.5 (3.6)
0x300| 01 | . | syntax_element: SCE (0) 0x302-0x302.2 (0.3)
0x300| 01 | . | element_instance_tag: 0 0x302.3-0x302.6 (0.4)
0x300| 01 22 | ." | global_gain: 145 0x302.7-0x303.6 (1)
| | | ics_info: {} 0x303.7-0x305.5 (1.7)
0x300| 22 | " | ics_reserved_bit: 0 0x303.7-0x303.7 (0.1)
0x300| 98 | . | window_sequence: EIGHT_SHORT_SEQUENCE (2) 0x304-0x304.1 (0.2)
0x300| 98 | . | window_shape: 0 0x304.2-0x304.2 (0.1)
0x300| 98 | . | max_sfb: 12 0x304.3-0x304.6 (0.4)
0x300| 98 da | .. | scale_factor_grouping: 54 0x304.7-0x305.5 (0.7)
0x300| da | . | [1]: byte_align 80 0x305.6-0x305.7 (0.2)
0x300| d8 3d d6 93 80 76 db 22 13 6a| .=...v.".j| data: d83dd6938076db22136a38461c9c5eae... 0x306-0x3db.7 (214)
0x310|38 46 1c 9c 5e ae 85 f1 ab d5 ff 4d 7b 0f 3e 6d|8F..^......M{.>m|
* |until 0x3db.7 (214) | |
| | | [4]: element {} 0x3dc-0x49c.7 (193)
| | | type: binary (6) 0x3dc-NA (0)
0x3d0| a3 | . | id: SimpleBlock (0xa3) 0x3dc-0x3dc.7 (1)
0x3d0| 40 be | @. | size: 190 0x3dd-0x3de.7 (2)
0x3d0| 81| .| track_number: 1 0x3df-0x3df.7 (1)
0x3e0|00 2e |.. | timestamp: 46 0x3e0-0x3e1.7 (2)
| | | flags: {} 0x3e2-0x3e2.7 (1)
0x3e0| 80 | . | key_frame: true 0x3e2-0x3e2 (0.1)
0x3e0| 80 | . | reserved: 0 0x3e2.1-0x3e2.3 (0.3)
0x3e0| 80 | . | invisible: false 0x3e2.4-0x3e2.4 (0.1)
0x3e0| 80 | . | lacing: 0 0x3e2.5-0x3e2.6 (0.2)
0x3e0| 80 | . | discardable: false 0x3e2.7-0x3e2.7 (0.1)
| | | packet: {} (aac_frame) 0x3e3-0x49c.7 (186)
| | | elements: [2] 0x3e3-0x3e6.7 (4)
| | | [0]: element {} 0x3e3-0x3e6.5 (3.6)
0x3e0| 01 | . | syntax_element: SCE (0) 0x3e3-0x3e3.2 (0.3)
0x3e0| 01 | . | element_instance_tag: 0 0x3e3.3-0x3e3.6 (0.4)
0x3e0| 01 1a | .. | global_gain: 141 0x3e3.7-0x3e4.6 (1)
| | | ics_info: {} 0x3e4.7-0x3e6.5 (1.7)
0x3e0| 1a | . | ics_reserved_bit: 0 0x3e4.7-0x3e4.7 (0.1)
0x3e0| 99 | . | window_sequence: EIGHT_SHORT_SEQUENCE (2) 0x3e5-0x3e5.1 (0.2)
0x3e0| 99 | . | window_shape: 0 0x3e5.2-0x3e5.2 (0.1)
0x3e0| 99 | . | max_sfb: 12 0x3e5.3-0x3e5.6 (0.4)
0x3e0| 99 a6 | .. | scale_factor_grouping: 105 0x3e5.7-0x3e6.5 (0.7)
0x3e0| a6 | . | [1]: byte_align 80 0x3e6.6-0x3e6.7 (0.2)
0x3e0| d3 21 41 ad 34 86 c8 cd 9a| .!A.4....| data: d32141ad3486c8cd9af03d04a1e75f1d... 0x3e7-0x49c.7 (182)
0x3f0|f0 3d 04 a1 e7 5f 1d 0c ff 81 d6 bd bc da b0 65|.=..._.........e|
* |until 0x49c.7 (182) | |
| | | [5]: element {} 0x49d-0x4a7.7 (11)
| | | type: binary (6) 0x49d-NA (0)
0x490| a3 | . | id: SimpleBlock (0xa3) 0x49d-0x49d.7 (1)
0x490| 89 | . | size: 9 0x49e-0x49e.7 (1)
0x490| 81| .| track_number: 1 0x49f-0x49f.7 (1)
0x4a0|00 45 |.E | timestamp: 69 0x4a0-0x4a1.7 (2)
| | | flags: {} 0x4a2-0x4a2.7 (1)
0x4a0| 80 | . | key_frame: true 0x4a2-0x4a2 (0.1)
0x4a0| 80 | . | reserved: 0 0x4a2.1-0x4a2.3 (0.3)
0x4a0| 80 | . | invisible: false 0x4a2.4-0x4a2.4 (0.1)
0x4a0| 80 | . | lacing: 0 0x4a2.5-0x4a2.6 (0.2)
0x4a0| 80 | . | discardable: false 0x4a2.7-0x4a2.7 (0.1)
| | | packet: {} (aac_frame) 0x4a3-0x4a7.7 (5)
| | | elements: [2] 0x4a3-0x4a6.7 (4)
| | | [0]: element {} 0x4a3-0x4a6.5 (3.6)
0x4a0| 01 | . | syntax_element: SCE (0) 0x4a3-0x4a3.2 (0.3)
0x4a0| 01 | . | element_instance_tag: 0 0x4a3.3-0x4a3.6 (0.4)
0x4a0| 01 18 | .. | global_gain: 140 0x4a3.7-0x4a4.6 (1)
| | | ics_info: {} 0x4a4.7-0x4a6.5 (1.7)
0x4a0| 18 | . | ics_reserved_bit: 0 0x4a4.7-0x4a4.7 (0.1)
0x4a0| 81 | . | window_sequence: EIGHT_SHORT_SEQUENCE (2) 0x4a5-0x4a5.1 (0.2)
0x4a0| 81 | . | window_shape: 0 0x4a5.2-0x4a5.2 (0.1)
0x4a0| 81 | . | max_sfb: 0 0x4a5.3-0x4a5.6 (0.4)
0x4a0| 81 b4 | .. | scale_factor_grouping: 109 0x4a5.7-0x4a6.5 (0.7)
0x4a0| b4 | . | [1]: byte_align 00 0x4a6.6-0x4a6.7 (0.2)
0x4a0| 70 | p | data: 70 0x4a7-0x4a7.7 (1)
| | | [6]: element {} 0x4a8-0x4c3.7 (28)
| | | type: master (7) 0x4a8-NA (0)
0x4a0| 1c 53 bb 6b | .S.k | id: Cues (0x1c53bb6b) 0x4a8-0x4ab.7 (4)
0x4a0| 97 | . | size: 23 0x4ac-0x4ac.7 (1)
| | | elements: [2] 0x4ad-0x4c3.7 (23)
| | | [0]: element {} 0x4ad-0x4b2.7 (6)
| | | type: binary (6) 0x4ad-NA (0)
0x4a0| bf | . | id: CRC-32 (0xbf) 0x4ad-0x4ad.7 (1)
0x4a0| 84 | . | size: 4 0x4ae-0x4ae.7 (1)
0x4a0| 9c| .| value: 9c7d8d61 0x4af-0x4b2.7 (4)
0x4b0|7d 8d 61 |}.a |
| | | [1]: element {} 0x4b3-0x4c3.7 (17)
| | | type: master (7) 0x4b3-NA (0)
0x4b0| bb | . | id: CuePoint (0xbb) 0x4b3-0x4b3.7 (1)
0x4b0| 8f | . | size: 15 0x4b4-0x4b4.7 (1)
| | | elements: [2] 0x4b5-0x4c3.7 (15)
| | | [0]: element {} 0x4b5-0x4b7.7 (3)
| | | type: uinteger (1) 0x4b5-NA (0)
0x4b0| b3 | . | id: CueTime (0xb3) 0x4b5-0x4b5.7 (1)
0x4b0| 81 | . | size: 1 0x4b6-0x4b6.7 (1)
0x4b0| 00 | . | value: 0 0x4b7-0x4b7.7 (1)
| | | [1]: element {} 0x4b8-0x4c3.7 (12)
| | | type: master (7) 0x4b8-NA (0)
0x4b0| b7 | . | id: CueTrackPositions (0xb7) 0x4b8-0x4b8.7 (1)
0x4b0| 8a | . | size: 10 0x4b9-0x4b9.7 (1)
| | | elements: [3] 0x4ba-0x4c3.7 (10)
| | | [0]: element {} 0x4ba-0x4bc.7 (3)
| | | type: uinteger (1) 0x4ba-NA (0)
0x4b0| f7 | . | id: CueTrack (0xf7) 0x4ba-0x4ba.7 (1)
0x4b0| 81 | . | size: 1 0x4bb-0x4bb.7 (1)
0x4b0| 01 | . | value: 1 0x4bc-0x4bc.7 (1)
| | | [1]: element {} 0x4bd-0x4c0.7 (4)
| | | type: uinteger (1) 0x4bd-NA (0)
0x4b0| f1 | . | id: CueClusterPosition (0xf1) 0x4bd-0x4bd.7 (1)
0x4b0| 82 | . | size: 2 0x4be-0x4be.7 (1)
0x4b0| 01| .| value: 484 0x4bf-0x4c0.7 (2)
0x4c0|e4 |. |
| | | [2]: element {} 0x4c1-0x4c3.7 (3)
| | | type: uinteger (1) 0x4c1-NA (0)
0x4c0| f0 | . | id: CueRelativePosition (0xf0) 0x4c1-0x4c1.7 (1)
0x4c0| 81 | . | size: 1 0x4c2-0x4c2.7 (1)
0x4c0| 09| | .| | value: 9 0x4c3-0x4c3.7 (1)

BIN
format/matroska/testdata/aac.mkv vendored Normal file

Binary file not shown.

444
format/matroska/testdata/av1.fqtest vendored Normal file
View File

@ -0,0 +1,444 @@
# ffmpeg -f lavfi -i testsrc -g 1 -c:v librav1e -t 50ms av1.mkv
/av1.mkv:
> fq -d matroska verbose /av1.mkv
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /av1.mkv (matroska) 0x0-0x13e6.7 (5095)
| | | elements: [2] 0x0-0x13e6.7 (5095)
| | | [0]: element {} 0x0-0x27.7 (40)
| | | type: master (7) 0x0-NA (0)
0x0000|1a 45 df a3 |.E.. | id: EBML (0x1a45dfa3) 0x0-0x3.7 (4)
0x0000| a3 | . | size: 35 0x4-0x4.7 (1)
| | | elements: [7] 0x5-0x27.7 (35)
| | | [0]: element {} 0x5-0x8.7 (4)
| | | type: uinteger (1) 0x5-NA (0)
0x0000| 42 86 | B. | id: EBMLVersion (0x4286) 0x5-0x6.7 (2)
0x0000| 81 | . | size: 1 0x7-0x7.7 (1)
0x0000| 01 | . | value: 1 0x8-0x8.7 (1)
| | | [1]: element {} 0x9-0xc.7 (4)
| | | type: uinteger (1) 0x9-NA (0)
0x0000| 42 f7 | B. | id: EBMLReadVersion (0x42f7) 0x9-0xa.7 (2)
0x0000| 81 | . | size: 1 0xb-0xb.7 (1)
0x0000| 01 | . | value: 1 0xc-0xc.7 (1)
| | | [2]: element {} 0xd-0x10.7 (4)
| | | type: uinteger (1) 0xd-NA (0)
0x0000| 42 f2 | B. | id: EBMLMaxIDLength (0x42f2) 0xd-0xe.7 (2)
0x0000| 81| .| size: 1 0xf-0xf.7 (1)
0x0010|04 |. | value: 4 0x10-0x10.7 (1)
| | | [3]: element {} 0x11-0x14.7 (4)
| | | type: uinteger (1) 0x11-NA (0)
0x0010| 42 f3 | B. | id: EBMLMaxSizeLength (0x42f3) 0x11-0x12.7 (2)
0x0010| 81 | . | size: 1 0x13-0x13.7 (1)
0x0010| 08 | . | value: 8 0x14-0x14.7 (1)
| | | [4]: element {} 0x15-0x1f.7 (11)
| | | type: string (3) 0x15-NA (0)
0x0010| 42 82 | B. | id: DocType (0x4282) 0x15-0x16.7 (2)
0x0010| 88 | . | size: 8 0x17-0x17.7 (1)
0x0010| 6d 61 74 72 6f 73 6b 61| matroska| value: "matroska" 0x18-0x1f.7 (8)
| | | [5]: element {} 0x20-0x23.7 (4)
| | | type: uinteger (1) 0x20-NA (0)
0x0020|42 87 |B. | id: DocTypeVersion (0x4287) 0x20-0x21.7 (2)
0x0020| 81 | . | size: 1 0x22-0x22.7 (1)
0x0020| 04 | . | value: 4 0x23-0x23.7 (1)
| | | [6]: element {} 0x24-0x27.7 (4)
| | | type: uinteger (1) 0x24-NA (0)
0x0020| 42 85 | B. | id: DocTypeReadVersion (0x4285) 0x24-0x25.7 (2)
0x0020| 81 | . | size: 1 0x26-0x26.7 (1)
0x0020| 02 | . | value: 2 0x27-0x27.7 (1)
| | | [1]: element {} 0x28-0x13e6.7 (5055)
| | | type: master (7) 0x28-NA (0)
0x0020| 18 53 80 67 | .S.g | id: Segment (0x18538067) 0x28-0x2b.7 (4)
0x0020| 01 00 00 00| ....| size: 5043 0x2c-0x33.7 (8)
0x0030|00 00 13 b3 |.... |
| | | elements: [7] 0x34-0x13e6.7 (5043)
| | | [0]: element {} 0x34-0x78.7 (69)
| | | type: master (7) 0x34-NA (0)
0x0030| 11 4d 9b 74 | .M.t | id: SeekHead (0x114d9b74) 0x34-0x37.7 (4)
0x0030| c0 | . | size: 64 0x38-0x38.7 (1)
| | | elements: [5] 0x39-0x78.7 (64)
| | | [0]: element {} 0x39-0x3e.7 (6)
| | | type: binary (6) 0x39-NA (0)
0x0030| bf | . | id: CRC-32 (0xbf) 0x39-0x39.7 (1)
0x0030| 84 | . | size: 4 0x3a-0x3a.7 (1)
0x0030| 01 f4 84 bd | .... | value: 01f484bd 0x3b-0x3e.7 (4)
| | | [1]: element {} 0x3f-0x4c.7 (14)
| | | type: master (7) 0x3f-NA (0)
0x0030| 4d| M| id: Seek (0x4dbb) 0x3f-0x40.7 (2)
0x0040|bb |. |
0x0040| 8b | . | size: 11 0x41-0x41.7 (1)
| | | elements: [2] 0x42-0x4c.7 (11)
| | | [0]: element {} 0x42-0x48.7 (7)
| | | type: binary (6) 0x42-NA (0)
0x0040| 53 ab | S. | id: SeekID (0x53ab) 0x42-0x43.7 (2)
0x0040| 84 | . | size: 4 0x44-0x44.7 (1)
0x0040| 15 49 a9 66 | .I.f | value: 1549a966 0x45-0x48.7 (4)
| | | [1]: element {} 0x49-0x4c.7 (4)
| | | type: uinteger (1) 0x49-NA (0)
0x0040| 53 ac | S. | id: SeekPosition (0x53ac) 0x49-0x4a.7 (2)
0x0040| 81 | . | size: 1 0x4b-0x4b.7 (1)
0x0040| a1 | . | value: 161 0x4c-0x4c.7 (1)
| | | [2]: element {} 0x4d-0x5a.7 (14)
| | | type: master (7) 0x4d-NA (0)
0x0040| 4d bb | M. | id: Seek (0x4dbb) 0x4d-0x4e.7 (2)
0x0040| 8b| .| size: 11 0x4f-0x4f.7 (1)
| | | elements: [2] 0x50-0x5a.7 (11)
| | | [0]: element {} 0x50-0x56.7 (7)
| | | type: binary (6) 0x50-NA (0)
0x0050|53 ab |S. | id: SeekID (0x53ab) 0x50-0x51.7 (2)
0x0050| 84 | . | size: 4 0x52-0x52.7 (1)
0x0050| 16 54 ae 6b | .T.k | value: 1654ae6b 0x53-0x56.7 (4)
| | | [1]: element {} 0x57-0x5a.7 (4)
| | | type: uinteger (1) 0x57-NA (0)
0x0050| 53 ac | S. | id: SeekPosition (0x53ac) 0x57-0x58.7 (2)
0x0050| 81 | . | size: 1 0x59-0x59.7 (1)
0x0050| f1 | . | value: 241 0x5a-0x5a.7 (1)
| | | [3]: element {} 0x5b-0x69.7 (15)
| | | type: master (7) 0x5b-NA (0)
0x0050| 4d bb | M. | id: Seek (0x4dbb) 0x5b-0x5c.7 (2)
0x0050| 8c | . | size: 12 0x5d-0x5d.7 (1)
| | | elements: [2] 0x5e-0x69.7 (12)
| | | [0]: element {} 0x5e-0x64.7 (7)
| | | type: binary (6) 0x5e-NA (0)
0x0050| 53 ab| S.| id: SeekID (0x53ab) 0x5e-0x5f.7 (2)
0x0060|84 |. | size: 4 0x60-0x60.7 (1)
0x0060| 12 54 c3 67 | .T.g | value: 1254c367 0x61-0x64.7 (4)
| | | [1]: element {} 0x65-0x69.7 (5)
| | | type: uinteger (1) 0x65-NA (0)
0x0060| 53 ac | S. | id: SeekPosition (0x53ac) 0x65-0x66.7 (2)
0x0060| 82 | . | size: 2 0x67-0x67.7 (1)
0x0060| 01 46 | .F | value: 326 0x68-0x69.7 (2)
| | | [4]: element {} 0x6a-0x78.7 (15)
| | | type: master (7) 0x6a-NA (0)
0x0060| 4d bb | M. | id: Seek (0x4dbb) 0x6a-0x6b.7 (2)
0x0060| 8c | . | size: 12 0x6c-0x6c.7 (1)
| | | elements: [2] 0x6d-0x78.7 (12)
| | | [0]: element {} 0x6d-0x73.7 (7)
| | | type: binary (6) 0x6d-NA (0)
0x0060| 53 ab | S. | id: SeekID (0x53ab) 0x6d-0x6e.7 (2)
0x0060| 84| .| size: 4 0x6f-0x6f.7 (1)
0x0070|1c 53 bb 6b |.S.k | value: 1c53bb6b 0x70-0x73.7 (4)
| | | [1]: element {} 0x74-0x78.7 (5)
| | | type: uinteger (1) 0x74-NA (0)
0x0070| 53 ac | S. | id: SeekPosition (0x53ac) 0x74-0x75.7 (2)
0x0070| 82 | . | size: 2 0x76-0x76.7 (1)
0x0070| 13 97 | .. | value: 5015 0x77-0x78.7 (2)
| | | [1]: element {} 0x79-0xd4.7 (92)
| | | type: binary (6) 0x79-NA (0)
0x0070| ec | . | id: Void (0xec) 0x79-0x79.7 (1)
0x0070| 01 00 00 00 00 00| ......| size: 83 0x7a-0x81.7 (8)
0x0080|00 53 |.S |
0x0080| 00 00 00 00 00 00 00 00 00 00 00 00 00 00| ..............| value: 00000000000000000000000000000000... 0x82-0xd4.7 (83)
0x0090|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0xd4.7 (83) | |
| | | [2]: element {} 0xd5-0x124.7 (80)
| | | type: master (7) 0xd5-NA (0)
0x00d0| 15 49 a9 66 | .I.f | id: Info (0x1549a966) 0xd5-0xd8.7 (4)
0x00d0| cb | . | size: 75 0xd9-0xd9.7 (1)
| | | elements: [6] 0xda-0x124.7 (75)
| | | [0]: element {} 0xda-0xdf.7 (6)
| | | type: binary (6) 0xda-NA (0)
0x00d0| bf | . | id: CRC-32 (0xbf) 0xda-0xda.7 (1)
0x00d0| 84 | . | size: 4 0xdb-0xdb.7 (1)
0x00d0| ef 98 66 d3| ..f.| value: ef9866d3 0xdc-0xdf.7 (4)
| | | [1]: element {} 0xe0-0xe6.7 (7)
| | | type: uinteger (1) 0xe0-NA (0)
0x00e0|2a d7 b1 |*.. | id: TimestampScale (0x2ad7b1) 0xe0-0xe2.7 (3)
0x00e0| 83 | . | size: 3 0xe3-0xe3.7 (1)
0x00e0| 0f 42 40 | .B@ | value: 1000000 0xe4-0xe6.7 (3)
| | | [2]: element {} 0xe7-0xf6.7 (16)
| | | type: UTF8 (4) 0xe7-NA (0)
0x00e0| 4d 80 | M. | id: MuxingApp (0x4d80) 0xe7-0xe8.7 (2)
0x00e0| 8d | . | size: 13 0xe9-0xe9.7 (1)
0x00e0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0xea-0xf6.7 (13)
0x00f0|2e 34 35 2e 31 30 30 |.45.100 |
| | | [3]: element {} 0xf7-0x106.7 (16)
| | | type: UTF8 (4) 0xf7-NA (0)
0x00f0| 57 41 | WA | id: WritingApp (0x5741) 0xf7-0xf8.7 (2)
0x00f0| 8d | . | size: 13 0xf9-0xf9.7 (1)
0x00f0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0xfa-0x106.7 (13)
0x0100|2e 34 35 2e 31 30 30 |.45.100 |
| | | [4]: element {} 0x107-0x119.7 (19)
| | | type: binary (6) 0x107-NA (0)
0x0100| 73 a4 | s. | id: SegmentUID (0x73a4) 0x107-0x108.7 (2)
0x0100| 90 | . | size: 16 0x109-0x109.7 (1)
0x0100| 46 bd 6f 31 1c 40| F.o1.@| value: 46bd6f311c40fe0b1e0c0e33671d7db3 0x10a-0x119.7 (16)
0x0110|fe 0b 1e 0c 0e 33 67 1d 7d b3 |.....3g.}. |
| | | [5]: element {} 0x11a-0x124.7 (11)
| | | type: float (2) 0x11a-NA (0)
0x0110| 44 89 | D. | id: Duration (0x4489) 0x11a-0x11b.7 (2)
0x0110| 88 | . | size: 8 0x11c-0x11c.7 (1)
0x0110| 40 44 00| @D.| value: 40 0x11d-0x124.7 (8)
0x0120|00 00 00 00 00 |..... |
| | | [3]: element {} 0x125-0x179.7 (85)
| | | type: master (7) 0x125-NA (0)
0x0120| 16 54 ae 6b | .T.k | id: Tracks (0x1654ae6b) 0x125-0x128.7 (4)
0x0120| d0 | . | size: 80 0x129-0x129.7 (1)
| | | elements: [2] 0x12a-0x179.7 (80)
| | | [0]: element {} 0x12a-0x12f.7 (6)
| | | type: binary (6) 0x12a-NA (0)
0x0120| bf | . | id: CRC-32 (0xbf) 0x12a-0x12a.7 (1)
0x0120| 84 | . | size: 4 0x12b-0x12b.7 (1)
0x0120| 83 29 74 24| .)t$| value: 83297424 0x12c-0x12f.7 (4)
| | | [1]: element {} 0x130-0x179.7 (74)
| | | type: master (7) 0x130-NA (0)
0x0130|ae |. | id: TrackEntry (0xae) 0x130-0x130.7 (1)
0x0130| 01 00 00 00 00 00 00 41 | .......A | size: 65 0x131-0x138.7 (8)
| | | elements: [9] 0x139-0x179.7 (65)
| | | [0]: element {} 0x139-0x13b.7 (3)
| | | type: uinteger (1) 0x139-NA (0)
0x0130| d7 | . | id: TrackNumber (0xd7) 0x139-0x139.7 (1)
0x0130| 81 | . | size: 1 0x13a-0x13a.7 (1)
0x0130| 01 | . | value: 1 0x13b-0x13b.7 (1)
| | | [1]: element {} 0x13c-0x146.7 (11)
| | | type: uinteger (1) 0x13c-NA (0)
0x0130| 73 c5 | s. | id: TrackUID (0x73c5) 0x13c-0x13d.7 (2)
0x0130| 88 | . | size: 8 0x13e-0x13e.7 (1)
0x0130| bd| .| value: 13662969948711256639 0x13f-0x146.7 (8)
0x0140|9c 9e c7 61 c5 82 3f |...a..? |
| | | [2]: element {} 0x147-0x149.7 (3)
| | | type: uinteger (1) 0x147-NA (0)
0x0140| 9c | . | id: FlagLacing (0x9c) 0x147-0x147.7 (1)
0x0140| 81 | . | size: 1 0x148-0x148.7 (1)
0x0140| 00 | . | value: 0 0x149-0x149.7 (1)
| | | [3]: element {} 0x14a-0x150.7 (7)
| | | type: string (3) 0x14a-NA (0)
0x0140| 22 b5 9c | ".. | id: Language (0x22b59c) 0x14a-0x14c.7 (3)
0x0140| 83 | . | size: 3 0x14d-0x14d.7 (1)
0x0140| 75 6e| un| value: "und" 0x14e-0x150.7 (3)
0x0150|64 |d |
| | | [4]: element {} 0x151-0x157.7 (7)
| | | type: string (3) 0x151-NA (0)
0x0150| 86 | . | id: CodecID (0x86) 0x151-0x151.7 (1)
0x0150| 85 | . | size: 5 0x152-0x152.7 (1)
0x0150| 56 5f 41 56 31 | V_AV1 | value: "V_AV1" 0x153-0x157.7 (5)
| | | [5]: element {} 0x158-0x15a.7 (3)
| | | type: uinteger (1) 0x158-NA (0)
0x0150| 83 | . | id: TrackType (0x83) 0x158-0x158.7 (1)
0x0150| 81 | . | size: 1 0x159-0x159.7 (1)
0x0150| 01 | . | value: video (1) 0x15a-0x15a.7 (1)
| | | [6]: element {} 0x15b-0x162.7 (8)
| | | type: uinteger (1) 0x15b-NA (0)
0x0150| 23 e3 83 | #.. | id: DefaultDuration (0x23e383) 0x15b-0x15d.7 (3)
0x0150| 84 | . | size: 4 0x15e-0x15e.7 (1)
0x0150| 02| .| value: 40000000 0x15f-0x162.7 (4)
0x0160|62 5a 00 |bZ. |
| | | [7]: element {} 0x163-0x172.7 (16)
| | | type: master (7) 0x163-NA (0)
0x0160| e0 | . | id: Video (0xe0) 0x163-0x163.7 (1)
0x0160| 01 00 00 00 00 00 00 07 | ........ | size: 7 0x164-0x16b.7 (8)
| | | elements: [2] 0x16c-0x172.7 (7)
| | | [0]: element {} 0x16c-0x16f.7 (4)
| | | type: uinteger (1) 0x16c-NA (0)
0x0160| b0 | . | id: PixelWidth (0xb0) 0x16c-0x16c.7 (1)
0x0160| 82 | . | size: 2 0x16d-0x16d.7 (1)
0x0160| 01 40| .@| value: 320 0x16e-0x16f.7 (2)
| | | [1]: element {} 0x170-0x172.7 (3)
| | | type: uinteger (1) 0x170-NA (0)
0x0170|ba |. | id: PixelHeight (0xba) 0x170-0x170.7 (1)
0x0170| 81 | . | size: 1 0x171-0x171.7 (1)
0x0170| f0 | . | value: 240 0x172-0x172.7 (1)
| | | [8]: element {} 0x173-0x179.7 (7)
| | | type: binary (6) 0x173-NA (0)
0x0170| 63 a2 | c. | id: CodecPrivate (0x63a2) 0x173-0x174.7 (2)
0x0170| 84 | . | size: 4 0x175-0x175.7 (1)
| | | value: {} (av1_ccr) 0x176-0x179.7 (4)
0x0170| 81 | . | marker: 1 0x176-0x176 (0.1)
0x0170| 81 | . | version: 1 0x176.1-0x176.7 (0.7)
0x0170| 3f | ? | seq_profile: 1 0x177-0x177.2 (0.3)
0x0170| 3f | ? | seq_level_idx_0: 31 0x177.3-0x177.7 (0.5)
0x0170| 00 | . | seq_tier_0: 0 0x178-0x178 (0.1)
0x0170| 00 | . | high_bitdepth: 0 0x178.1-0x178.1 (0.1)
0x0170| 00 | . | twelve_bit: 0 0x178.2-0x178.2 (0.1)
0x0170| 00 | . | monochrome: 0 0x178.3-0x178.3 (0.1)
0x0170| 00 | . | chroma_subsampling_x: 0 0x178.4-0x178.4 (0.1)
0x0170| 00 | . | chroma_subsampling_y: 0 0x178.5-0x178.5 (0.1)
0x0170| 00 | . | chroma_sample_position: 0 0x178.6-0x178.7 (0.2)
0x0170| 00 | . | reserved = 0: 0 0x179-0x179.2 (0.3)
0x0170| 00 | . | initial_presentation_delay_present: false 0x179.3-0x179.3 (0.1)
0x0170| 00 | . | reserved: 0 0x179.4-0x179.7 (0.4)
| | | [4]: element {} 0x17a-0x220.7 (167)
| | | type: master (7) 0x17a-NA (0)
0x0170| 12 54 c3 67 | .T.g | id: Tags (0x1254c367) 0x17a-0x17d.7 (4)
0x0170| 40 a1| @.| size: 161 0x17e-0x17f.7 (2)
| | | elements: [3] 0x180-0x220.7 (161)
| | | [0]: element {} 0x180-0x185.7 (6)
| | | type: binary (6) 0x180-NA (0)
0x0180|bf |. | id: CRC-32 (0xbf) 0x180-0x180.7 (1)
0x0180| 84 | . | size: 4 0x181-0x181.7 (1)
0x0180| 42 56 d5 19 | BV.. | value: 4256d519 0x182-0x185.7 (4)
| | | [1]: element {} 0x186-0x1b6.7 (49)
| | | type: master (7) 0x186-NA (0)
0x0180| 73 73 | ss | id: Tag (0x7373) 0x186-0x187.7 (2)
0x0180| 01 00 00 00 00 00 00 27| .......'| size: 39 0x188-0x18f.7 (8)
| | | elements: [2] 0x190-0x1b6.7 (39)
| | | [0]: element {} 0x190-0x192.7 (3)
| | | type: master (7) 0x190-NA (0)
0x0190|63 c0 |c. | id: Targets (0x63c0) 0x190-0x191.7 (2)
0x0190| 80 | . | size: 0 0x192-0x192.7 (1)
| | | elements: [0] 0x193-NA (0)
| | | [1]: element {} 0x193-0x1b6.7 (36)
| | | type: master (7) 0x193-NA (0)
0x0190| 67 c8 | g. | id: SimpleTag (0x67c8) 0x193-0x194.7 (2)
0x0190| 01 00 00 00 00 00 00 1a | ........ | size: 26 0x195-0x19c.7 (8)
| | | elements: [2] 0x19d-0x1b6.7 (26)
| | | [0]: element {} 0x19d-0x1a6.7 (10)
| | | type: UTF8 (4) 0x19d-NA (0)
0x0190| 45 a3 | E. | id: TagName (0x45a3) 0x19d-0x19e.7 (2)
0x0190| 87| .| size: 7 0x19f-0x19f.7 (1)
0x01a0|45 4e 43 4f 44 45 52 |ENCODER | value: "ENCODER" 0x1a0-0x1a6.7 (7)
| | | [1]: element {} 0x1a7-0x1b6.7 (16)
| | | type: UTF8 (4) 0x1a7-NA (0)
0x01a0| 44 87 | D. | id: TagString (0x4487) 0x1a7-0x1a8.7 (2)
0x01a0| 8d | . | size: 13 0x1a9-0x1a9.7 (1)
0x01a0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0x1aa-0x1b6.7 (13)
0x01b0|2e 34 35 2e 31 30 30 |.45.100 |
| | | [2]: element {} 0x1b7-0x220.7 (106)
| | | type: master (7) 0x1b7-NA (0)
0x01b0| 73 73 | ss | id: Tag (0x7373) 0x1b7-0x1b8.7 (2)
0x01b0| 01 00 00 00 00 00 00| .......| size: 96 0x1b9-0x1c0.7 (8)
0x01c0|60 |` |
| | | elements: [3] 0x1c1-0x220.7 (96)
| | | [0]: element {} 0x1c1-0x1ce.7 (14)
| | | type: master (7) 0x1c1-NA (0)
0x01c0| 63 c0 | c. | id: Targets (0x63c0) 0x1c1-0x1c2.7 (2)
0x01c0| 8b | . | size: 11 0x1c3-0x1c3.7 (1)
| | | elements: [1] 0x1c4-0x1ce.7 (11)
| | | [0]: element {} 0x1c4-0x1ce.7 (11)
| | | type: uinteger (1) 0x1c4-NA (0)
0x01c0| 63 c5 | c. | id: TagTrackUID (0x63c5) 0x1c4-0x1c5.7 (2)
0x01c0| 88 | . | size: 8 0x1c6-0x1c6.7 (1)
0x01c0| bd 9c 9e c7 61 c5 82 3f | ....a..? | value: 13662969948711256639 0x1c7-0x1ce.7 (8)
| | | [1]: element {} 0x1cf-0x1fb.7 (45)
| | | type: master (7) 0x1cf-NA (0)
0x01c0| 67| g| id: SimpleTag (0x67c8) 0x1cf-0x1d0.7 (2)
0x01d0|c8 |. |
0x01d0| 01 00 00 00 00 00 00 23 | .......# | size: 35 0x1d1-0x1d8.7 (8)
| | | elements: [2] 0x1d9-0x1fb.7 (35)
| | | [0]: element {} 0x1d9-0x1e2.7 (10)
| | | type: UTF8 (4) 0x1d9-NA (0)
0x01d0| 45 a3 | E. | id: TagName (0x45a3) 0x1d9-0x1da.7 (2)
0x01d0| 87 | . | size: 7 0x1db-0x1db.7 (1)
0x01d0| 45 4e 43 4f| ENCO| value: "ENCODER" 0x1dc-0x1e2.7 (7)
0x01e0|44 45 52 |DER |
| | | [1]: element {} 0x1e3-0x1fb.7 (25)
| | | type: UTF8 (4) 0x1e3-NA (0)
0x01e0| 44 87 | D. | id: TagString (0x4487) 0x1e3-0x1e4.7 (2)
0x01e0| 96 | . | size: 22 0x1e5-0x1e5.7 (1)
0x01e0| 4c 61 76 63 35 38 2e 39 31 2e| Lavc58.91.| value: "Lavc58.91.100 librav1e" 0x1e6-0x1fb.7 (22)
0x01f0|31 30 30 20 6c 69 62 72 61 76 31 65 |100 librav1e |
| | | [2]: element {} 0x1fc-0x220.7 (37)
| | | type: master (7) 0x1fc-NA (0)
0x01f0| 67 c8 | g. | id: SimpleTag (0x67c8) 0x1fc-0x1fd.7 (2)
0x01f0| a2 | . | size: 34 0x1fe-0x1fe.7 (1)
| | | elements: [2] 0x1ff-0x220.7 (34)
| | | [0]: element {} 0x1ff-0x209.7 (11)
| | | type: UTF8 (4) 0x1ff-NA (0)
0x01f0| 45| E| id: TagName (0x45a3) 0x1ff-0x200.7 (2)
0x0200|a3 |. |
0x0200| 88 | . | size: 8 0x201-0x201.7 (1)
0x0200| 44 55 52 41 54 49 4f 4e | DURATION | value: "DURATION" 0x202-0x209.7 (8)
| | | [1]: element {} 0x20a-0x220.7 (23)
| | | type: UTF8 (4) 0x20a-NA (0)
0x0200| 44 87 | D. | id: TagString (0x4487) 0x20a-0x20b.7 (2)
0x0200| 94 | . | size: 20 0x20c-0x20c.7 (1)
0x0200| 30 30 3a| 00:| value: "00:00:00.040000000\x00\x00" 0x20d-0x220.7 (20)
0x0210|30 30 3a 30 30 2e 30 34 30 30 30 30 30 30 30 00|00:00.040000000.|
0x0220|00 |. |
| | | [5]: element {} 0x221-0x13ca.7 (4522)
| | | type: master (7) 0x221-NA (0)
0x0220| 1f 43 b6 75 | .C.u | id: Cluster (0x1f43b675) 0x221-0x224.7 (4)
0x0220| 51 a4 | Q. | size: 4516 0x225-0x226.7 (2)
| | | elements: [3] 0x227-0x13ca.7 (4516)
| | | [0]: element {} 0x227-0x22c.7 (6)
| | | type: binary (6) 0x227-NA (0)
0x0220| bf | . | id: CRC-32 (0xbf) 0x227-0x227.7 (1)
0x0220| 84 | . | size: 4 0x228-0x228.7 (1)
0x0220| 4e c3 15 c5 | N... | value: 4ec315c5 0x229-0x22c.7 (4)
| | | [1]: element {} 0x22d-0x22f.7 (3)
| | | type: uinteger (1) 0x22d-NA (0)
0x0220| e7 | . | id: Timestamp (0xe7) 0x22d-0x22d.7 (1)
0x0220| 81 | . | size: 1 0x22e-0x22e.7 (1)
0x0220| 00| .| value: 0 0x22f-0x22f.7 (1)
| | | [2]: element {} 0x230-0x13ca.7 (4507)
| | | type: binary (6) 0x230-NA (0)
0x0230|a3 |. | id: SimpleBlock (0xa3) 0x230-0x230.7 (1)
0x0230| 51 98 | Q. | size: 4504 0x231-0x232.7 (2)
0x0230| 81 | . | track_number: 1 0x233-0x233.7 (1)
0x0230| 00 00 | .. | timestamp: 0 0x234-0x235.7 (2)
| | | flags: {} 0x236-0x236.7 (1)
0x0230| 80 | . | key_frame: true 0x236-0x236 (0.1)
0x0230| 80 | . | reserved: 0 0x236.1-0x236.3 (0.3)
0x0230| 80 | . | invisible: false 0x236.4-0x236.4 (0.1)
0x0230| 80 | . | lacing: 0 0x236.5-0x236.6 (0.2)
0x0230| 80 | . | discardable: false 0x236.7-0x236.7 (0.1)
| | | packet: {} (av1_frame) 0x237-0x13ca.7 (4500)
| | | frame: [3] 0x237-0x13ca.7 (4500)
| | | [0]: obu {} (av1_obu) 0x237-0x245.7 (15)
| | | header: {} 0x237-0x237.7 (1)
0x0230| 0a | . | forbidden_bit: 0 0x237-0x237 (0.1)
0x0230| 0a | . | type: OBU_SEQUENCE_HEADER (1) 0x237.1-0x237.4 (0.4)
0x0230| 0a | . | extension_flag: false 0x237.5-0x237.5 (0.1)
0x0230| 0a | . | has_size_field: true 0x237.6-0x237.6 (0.1)
0x0230| 0a | . | reserved_1bit: 0 0x237.7-0x237.7 (0.1)
0x0230| 0d | . | size: 13 0x238-0x238.7 (1)
0x0230| 20 00 00 fa 1e 7f de| ......| data: 200000fa1e7fde210ad0202025 0x239-0x245.7 (13)
0x0240|21 0a d0 20 20 25 |!.. % |
| | | [1]: obu {} (av1_obu) 0x246-0x257.7 (18)
| | | header: {} 0x246-0x246.7 (1)
0x0240| 1a | . | forbidden_bit: 0 0x246-0x246 (0.1)
0x0240| 1a | . | type: OBU_FRAME_HEADER (3) 0x246.1-0x246.4 (0.4)
0x0240| 1a | . | extension_flag: false 0x246.5-0x246.5 (0.1)
0x0240| 1a | . | has_size_field: true 0x246.6-0x246.6 (0.1)
0x0240| 1a | . | reserved_1bit: 0 0x246.7-0x246.7 (0.1)
0x0240| 10 | . | size: 16 0x247-0x247.7 (1)
0x0240| 10 02 27 c8 e9 e6 64 3f| ..'...d?| data: 100227c8e9e6643fc1f8a49820822a60 0x248-0x257.7 (16)
0x0250|c1 f8 a4 98 20 82 2a 60 |.... .*` |
| | | [2]: obu {} (av1_obu) 0x258-0x13ca.7 (4467)
| | | header: {} 0x258-0x258.7 (1)
0x0250| 22 | " | forbidden_bit: 0 0x258-0x258 (0.1)
0x0250| 22 | " | type: OBU_TILE_GROUP (4) 0x258.1-0x258.4 (0.4)
0x0250| 22 | " | extension_flag: false 0x258.5-0x258.5 (0.1)
0x0250| 22 | " | has_size_field: true 0x258.6-0x258.6 (0.1)
0x0250| 22 | " | reserved_1bit: 0 0x258.7-0x258.7 (0.1)
0x0250| f0 22 | ." | size: 4464 0x259-0x25a.7 (2)
0x0250| f6 0a 4f ae f3| ..O..| data: f60a4faef3feece7304f3f139c75c96a... 0x25b-0x13ca.7 (4464)
0x0260|fe ec e7 30 4f 3f 13 9c 75 c9 6a 37 c2 a8 8f 54|...0O?..u.j7...T|
* |until 0x13ca.7 (4464) | |
| | | [6]: element {} 0x13cb-0x13e6.7 (28)
| | | type: master (7) 0x13cb-NA (0)
0x13c0| 1c 53 bb 6b | .S.k | id: Cues (0x1c53bb6b) 0x13cb-0x13ce.7 (4)
0x13c0| 97| .| size: 23 0x13cf-0x13cf.7 (1)
| | | elements: [2] 0x13d0-0x13e6.7 (23)
| | | [0]: element {} 0x13d0-0x13d5.7 (6)
| | | type: binary (6) 0x13d0-NA (0)
0x13d0|bf |. | id: CRC-32 (0xbf) 0x13d0-0x13d0.7 (1)
0x13d0| 84 | . | size: 4 0x13d1-0x13d1.7 (1)
0x13d0| 16 32 85 1c | .2.. | value: 1632851c 0x13d2-0x13d5.7 (4)
| | | [1]: element {} 0x13d6-0x13e6.7 (17)
| | | type: master (7) 0x13d6-NA (0)
0x13d0| bb | . | id: CuePoint (0xbb) 0x13d6-0x13d6.7 (1)
0x13d0| 8f | . | size: 15 0x13d7-0x13d7.7 (1)
| | | elements: [2] 0x13d8-0x13e6.7 (15)
| | | [0]: element {} 0x13d8-0x13da.7 (3)
| | | type: uinteger (1) 0x13d8-NA (0)
0x13d0| b3 | . | id: CueTime (0xb3) 0x13d8-0x13d8.7 (1)
0x13d0| 81 | . | size: 1 0x13d9-0x13d9.7 (1)
0x13d0| 00 | . | value: 0 0x13da-0x13da.7 (1)
| | | [1]: element {} 0x13db-0x13e6.7 (12)
| | | type: master (7) 0x13db-NA (0)
0x13d0| b7 | . | id: CueTrackPositions (0xb7) 0x13db-0x13db.7 (1)
0x13d0| 8a | . | size: 10 0x13dc-0x13dc.7 (1)
| | | elements: [3] 0x13dd-0x13e6.7 (10)
| | | [0]: element {} 0x13dd-0x13df.7 (3)
| | | type: uinteger (1) 0x13dd-NA (0)
0x13d0| f7 | . | id: CueTrack (0xf7) 0x13dd-0x13dd.7 (1)
0x13d0| 81 | . | size: 1 0x13de-0x13de.7 (1)
0x13d0| 01| .| value: 1 0x13df-0x13df.7 (1)
| | | [1]: element {} 0x13e0-0x13e3.7 (4)
| | | type: uinteger (1) 0x13e0-NA (0)
0x13e0|f1 |. | id: CueClusterPosition (0xf1) 0x13e0-0x13e0.7 (1)
0x13e0| 82 | . | size: 2 0x13e1-0x13e1.7 (1)
0x13e0| 01 ed | .. | value: 493 0x13e2-0x13e3.7 (2)
| | | [2]: element {} 0x13e4-0x13e6.7 (3)
| | | type: uinteger (1) 0x13e4-NA (0)
0x13e0| f0 | . | id: CueRelativePosition (0xf0) 0x13e4-0x13e4.7 (1)
0x13e0| 81 | . | size: 1 0x13e5-0x13e5.7 (1)
0x13e0| 09| | .| | value: 9 0x13e6-0x13e6.7 (1)

BIN
format/matroska/testdata/av1.mkv vendored Normal file

Binary file not shown.

530
format/matroska/testdata/avc.fqtest vendored Normal file
View File

@ -0,0 +1,530 @@
# ffmpeg -f lavfi -i testsrc -c:v h264 -f matroska -t 50ms avc.mkv
/avc.mkv:
> fq -d matroska verbose /avc.mkv
|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| |.: {} /avc.mkv (matroska) 0x0-0xd46.7 (3399)
| | | elements: [2] 0x0-0xd46.7 (3399)
| | | [0]: element {} 0x0-0x27.7 (40)
| | | type: master (7) 0x0-NA (0)
0x0000|1a 45 df a3 |.E.. | id: EBML (0x1a45dfa3) 0x0-0x3.7 (4)
0x0000| a3 | . | size: 35 0x4-0x4.7 (1)
| | | elements: [7] 0x5-0x27.7 (35)
| | | [0]: element {} 0x5-0x8.7 (4)
| | | type: uinteger (1) 0x5-NA (0)
0x0000| 42 86 | B. | id: EBMLVersion (0x4286) 0x5-0x6.7 (2)
0x0000| 81 | . | size: 1 0x7-0x7.7 (1)
0x0000| 01 | . | value: 1 0x8-0x8.7 (1)
| | | [1]: element {} 0x9-0xc.7 (4)
| | | type: uinteger (1) 0x9-NA (0)
0x0000| 42 f7 | B. | id: EBMLReadVersion (0x42f7) 0x9-0xa.7 (2)
0x0000| 81 | . | size: 1 0xb-0xb.7 (1)
0x0000| 01 | . | value: 1 0xc-0xc.7 (1)
| | | [2]: element {} 0xd-0x10.7 (4)
| | | type: uinteger (1) 0xd-NA (0)
0x0000| 42 f2 | B. | id: EBMLMaxIDLength (0x42f2) 0xd-0xe.7 (2)
0x0000| 81| .| size: 1 0xf-0xf.7 (1)
0x0010|04 |. | value: 4 0x10-0x10.7 (1)
| | | [3]: element {} 0x11-0x14.7 (4)
| | | type: uinteger (1) 0x11-NA (0)
0x0010| 42 f3 | B. | id: EBMLMaxSizeLength (0x42f3) 0x11-0x12.7 (2)
0x0010| 81 | . | size: 1 0x13-0x13.7 (1)
0x0010| 08 | . | value: 8 0x14-0x14.7 (1)
| | | [4]: element {} 0x15-0x1f.7 (11)
| | | type: string (3) 0x15-NA (0)
0x0010| 42 82 | B. | id: DocType (0x4282) 0x15-0x16.7 (2)
0x0010| 88 | . | size: 8 0x17-0x17.7 (1)
0x0010| 6d 61 74 72 6f 73 6b 61| matroska| value: "matroska" 0x18-0x1f.7 (8)
| | | [5]: element {} 0x20-0x23.7 (4)
| | | type: uinteger (1) 0x20-NA (0)
0x0020|42 87 |B. | id: DocTypeVersion (0x4287) 0x20-0x21.7 (2)
0x0020| 81 | . | size: 1 0x22-0x22.7 (1)
0x0020| 04 | . | value: 4 0x23-0x23.7 (1)
| | | [6]: element {} 0x24-0x27.7 (4)
| | | type: uinteger (1) 0x24-NA (0)
0x0020| 42 85 | B. | id: DocTypeReadVersion (0x4285) 0x24-0x25.7 (2)
0x0020| 81 | . | size: 1 0x26-0x26.7 (1)
0x0020| 02 | . | value: 2 0x27-0x27.7 (1)
| | | [1]: element {} 0x28-0xd46.7 (3359)
| | | type: master (7) 0x28-NA (0)
0x0020| 18 53 80 67 | .S.g | id: Segment (0x18538067) 0x28-0x2b.7 (4)
0x0020| 01 00 00 00| ....| size: 3347 0x2c-0x33.7 (8)
0x0030|00 00 0d 13 |.... |
| | | elements: [7] 0x34-0xd46.7 (3347)
| | | [0]: element {} 0x34-0x78.7 (69)
| | | type: master (7) 0x34-NA (0)
0x0030| 11 4d 9b 74 | .M.t | id: SeekHead (0x114d9b74) 0x34-0x37.7 (4)
0x0030| c0 | . | size: 64 0x38-0x38.7 (1)
| | | elements: [5] 0x39-0x78.7 (64)
| | | [0]: element {} 0x39-0x3e.7 (6)
| | | type: binary (6) 0x39-NA (0)
0x0030| bf | . | id: CRC-32 (0xbf) 0x39-0x39.7 (1)
0x0030| 84 | . | size: 4 0x3a-0x3a.7 (1)
0x0030| 7d 9c 3e c5 | }.>. | value: 7d9c3ec5 0x3b-0x3e.7 (4)
| | | [1]: element {} 0x3f-0x4c.7 (14)
| | | type: master (7) 0x3f-NA (0)
0x0030| 4d| M| id: Seek (0x4dbb) 0x3f-0x40.7 (2)
0x0040|bb |. |
0x0040| 8b | . | size: 11 0x41-0x41.7 (1)
| | | elements: [2] 0x42-0x4c.7 (11)
| | | [0]: element {} 0x42-0x48.7 (7)
| | | type: binary (6) 0x42-NA (0)
0x0040| 53 ab | S. | id: SeekID (0x53ab) 0x42-0x43.7 (2)
0x0040| 84 | . | size: 4 0x44-0x44.7 (1)
0x0040| 15 49 a9 66 | .I.f | value: 1549a966 0x45-0x48.7 (4)
| | | [1]: element {} 0x49-0x4c.7 (4)
| | | type: uinteger (1) 0x49-NA (0)
0x0040| 53 ac | S. | id: SeekPosition (0x53ac) 0x49-0x4a.7 (2)
0x0040| 81 | . | size: 1 0x4b-0x4b.7 (1)
0x0040| a1 | . | value: 161 0x4c-0x4c.7 (1)
| | | [2]: element {} 0x4d-0x5a.7 (14)
| | | type: master (7) 0x4d-NA (0)
0x0040| 4d bb | M. | id: Seek (0x4dbb) 0x4d-0x4e.7 (2)
0x0040| 8b| .| size: 11 0x4f-0x4f.7 (1)
| | | elements: [2] 0x50-0x5a.7 (11)
| | | [0]: element {} 0x50-0x56.7 (7)
| | | type: binary (6) 0x50-NA (0)
0x0050|53 ab |S. | id: SeekID (0x53ab) 0x50-0x51.7 (2)
0x0050| 84 | . | size: 4 0x52-0x52.7 (1)
0x0050| 16 54 ae 6b | .T.k | value: 1654ae6b 0x53-0x56.7 (4)
| | | [1]: element {} 0x57-0x5a.7 (4)
| | | type: uinteger (1) 0x57-NA (0)
0x0050| 53 ac | S. | id: SeekPosition (0x53ac) 0x57-0x58.7 (2)
0x0050| 81 | . | size: 1 0x59-0x59.7 (1)
0x0050| f1 | . | value: 241 0x5a-0x5a.7 (1)
| | | [3]: element {} 0x5b-0x69.7 (15)
| | | type: master (7) 0x5b-NA (0)
0x0050| 4d bb | M. | id: Seek (0x4dbb) 0x5b-0x5c.7 (2)
0x0050| 8c | . | size: 12 0x5d-0x5d.7 (1)
| | | elements: [2] 0x5e-0x69.7 (12)
| | | [0]: element {} 0x5e-0x64.7 (7)
| | | type: binary (6) 0x5e-NA (0)
0x0050| 53 ab| S.| id: SeekID (0x53ab) 0x5e-0x5f.7 (2)
0x0060|84 |. | size: 4 0x60-0x60.7 (1)
0x0060| 12 54 c3 67 | .T.g | value: 1254c367 0x61-0x64.7 (4)
| | | [1]: element {} 0x65-0x69.7 (5)
| | | type: uinteger (1) 0x65-NA (0)
0x0060| 53 ac | S. | id: SeekPosition (0x53ac) 0x65-0x66.7 (2)
0x0060| 82 | . | size: 2 0x67-0x67.7 (1)
0x0060| 01 7b | .{ | value: 379 0x68-0x69.7 (2)
| | | [4]: element {} 0x6a-0x78.7 (15)
| | | type: master (7) 0x6a-NA (0)
0x0060| 4d bb | M. | id: Seek (0x4dbb) 0x6a-0x6b.7 (2)
0x0060| 8c | . | size: 12 0x6c-0x6c.7 (1)
| | | elements: [2] 0x6d-0x78.7 (12)
| | | [0]: element {} 0x6d-0x73.7 (7)
| | | type: binary (6) 0x6d-NA (0)
0x0060| 53 ab | S. | id: SeekID (0x53ab) 0x6d-0x6e.7 (2)
0x0060| 84| .| size: 4 0x6f-0x6f.7 (1)
0x0070|1c 53 bb 6b |.S.k | value: 1c53bb6b 0x70-0x73.7 (4)
| | | [1]: element {} 0x74-0x78.7 (5)
| | | type: uinteger (1) 0x74-NA (0)
0x0070| 53 ac | S. | id: SeekPosition (0x53ac) 0x74-0x75.7 (2)
0x0070| 82 | . | size: 2 0x76-0x76.7 (1)
0x0070| 0c f7 | .. | value: 3319 0x77-0x78.7 (2)
| | | [1]: element {} 0x79-0xd4.7 (92)
| | | type: binary (6) 0x79-NA (0)
0x0070| ec | . | id: Void (0xec) 0x79-0x79.7 (1)
0x0070| 01 00 00 00 00 00| ......| size: 83 0x7a-0x81.7 (8)
0x0080|00 53 |.S |
0x0080| 00 00 00 00 00 00 00 00 00 00 00 00 00 00| ..............| value: 00000000000000000000000000000000... 0x82-0xd4.7 (83)
0x0090|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................|
* |until 0xd4.7 (83) | |
| | | [2]: element {} 0xd5-0x124.7 (80)
| | | type: master (7) 0xd5-NA (0)
0x00d0| 15 49 a9 66 | .I.f | id: Info (0x1549a966) 0xd5-0xd8.7 (4)
0x00d0| cb | . | size: 75 0xd9-0xd9.7 (1)
| | | elements: [6] 0xda-0x124.7 (75)
| | | [0]: element {} 0xda-0xdf.7 (6)
| | | type: binary (6) 0xda-NA (0)
0x00d0| bf | . | id: CRC-32 (0xbf) 0xda-0xda.7 (1)
0x00d0| 84 | . | size: 4 0xdb-0xdb.7 (1)
0x00d0| 51 bf 34 0a| Q.4.| value: 51bf340a 0xdc-0xdf.7 (4)
| | | [1]: element {} 0xe0-0xe6.7 (7)
| | | type: uinteger (1) 0xe0-NA (0)
0x00e0|2a d7 b1 |*.. | id: TimestampScale (0x2ad7b1) 0xe0-0xe2.7 (3)
0x00e0| 83 | . | size: 3 0xe3-0xe3.7 (1)
0x00e0| 0f 42 40 | .B@ | value: 1000000 0xe4-0xe6.7 (3)
| | | [2]: element {} 0xe7-0xf6.7 (16)
| | | type: UTF8 (4) 0xe7-NA (0)
0x00e0| 4d 80 | M. | id: MuxingApp (0x4d80) 0xe7-0xe8.7 (2)
0x00e0| 8d | . | size: 13 0xe9-0xe9.7 (1)
0x00e0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0xea-0xf6.7 (13)
0x00f0|2e 34 35 2e 31 30 30 |.45.100 |
| | | [3]: element {} 0xf7-0x106.7 (16)
| | | type: UTF8 (4) 0xf7-NA (0)
0x00f0| 57 41 | WA | id: WritingApp (0x5741) 0xf7-0xf8.7 (2)
0x00f0| 8d | . | size: 13 0xf9-0xf9.7 (1)
0x00f0| 4c 61 76 66 35 38| Lavf58| value: "Lavf58.45.100" 0xfa-0x106.7 (13)
0x0100|2e 34 35 2e 31 30 30 |.45.100 |
| | | [4]: element {} 0x107-0x119.7 (19)
| | | type: binary (6) 0x107-NA (0)
0x0100| 73 a4 | s. | id: SegmentUID (0x73a4) 0x107-0x108.7 (2)
0x0100| 90 | . | size: 16 0x109-0x109.7 (1)
0x0100| 7c 01 b0 2d a3 3f| |..-.?| value: 7c01b02da33f3ef638473a3db2c9e419 0x10a-0x119.7 (16)
0x0110|3e f6 38 47 3a 3d b2 c9 e4 19 |>.8G:=.... |
| | | [5]: element {} 0x11a-0x124.7 (11)
| | | type: float (2) 0x11a-NA (0)
0x0110| 44 89 | D. | id: Duration (0x4489) 0x11a-0x11b.7 (2)
0x0110| 88 | . | size: 8 0x11c-0x11c.7 (1)
0x0110| 40 44 00| @D.| value: 40 0x11d-0x124.7 (8)
0x0120|00 00 00 00 00 |..... |
| | | [3]: element {} 0x125-0x1ae.7 (138)
| | | type: master (7) 0x125-NA (0)
0x0120| 16 54 ae 6b | .T.k | id: Tracks (0x1654ae6b) 0x125-0x128.7 (4)
0x0120| 40 84 | @. | size: 132 0x129-0x12a.7 (2)
| | | elements: [2] 0x12b-0x1ae.7 (132)
| | | [0]: element {} 0x12b-0x130.7 (6)
| | | type: binary (6) 0x12b-NA (0)
0x0120| bf | . | id: CRC-32 (0xbf) 0x12b-0x12b.7 (1)
0x0120| 84 | . | size: 4 0x12c-0x12c.7 (1)
0x0120| 3e df 62| >.b| value: 3edf6285 0x12d-0x130.7 (4)
0x0130|85 |. |
| | | [1]: element {} 0x131-0x1ae.7 (126)
| | | type: master (7) 0x131-NA (0)
0x0130| ae | . | id: TrackEntry (0xae) 0x131-0x131.7 (1)
0x0130| 01 00 00 00 00 00 00 75 | .......u | size: 117 0x132-0x139.7 (8)
| | | elements: [9] 0x13a-0x1ae.7 (117)
| | | [0]: element {} 0x13a-0x13c.7 (3)
| | | type: uinteger (1) 0x13a-NA (0)
0x0130| d7 | . | id: TrackNumber (0xd7) 0x13a-0x13a.7 (1)
0x0130| 81 | . | size: 1 0x13b-0x13b.7 (1)
0x0130| 01 | . | value: 1 0x13c-0x13c.7 (1)
| | | [1]: element {} 0x13d-0x147.7 (11)
| | | type: uinteger (1) 0x13d-NA (0)
0x0130| 73 c5 | s. | id: TrackUID (0x73c5) 0x13d-0x13e.7 (2)
0x0130| 88| .| size: 8 0x13f-0x13f.7 (1)
0x0140|5c dc 49 64 84 41 76 e3 |\.Id.Av. | value: 6691303842430154467 0x140-0x147.7 (8)
| | | [2]: element {} 0x148-0x14a.7 (3)
| | | type: uinteger (1) 0x148-NA (0)
0x0140| 9c | . | id: FlagLacing (0x9c) 0x148-0x148.7 (1)
0x0140| 81 | . | size: 1 0x149-0x149.7 (1)
0x0140| 00 | . | value: 0 0x14a-0x14a.7 (1)
| | | [3]: element {} 0x14b-0x151.7 (7)
| | | type: string (3) 0x14b-NA (0)
0x0140| 22 b5 9c | ".. | id: Language (0x22b59c) 0x14b-0x14d.7 (3)
0x0140| 83 | . | size: 3 0x14e-0x14e.7 (1)
0x0140| 75| u| value: "und" 0x14f-0x151.7 (3)
0x0150|6e 64 |nd |
| | | [4]: element {} 0x152-0x162.7 (17)
| | | type: string (3) 0x152-NA (0)
0x0150| 86 | . | id: CodecID (0x86) 0x152-0x152.7 (1)
0x0150| 8f | . | size: 15 0x153-0x153.7 (1)
0x0150| 56 5f 4d 50 45 47 34 2f 49 53 4f 2f| V_MPEG4/ISO/| value: "V_MPEG4/ISO/AVC" 0x154-0x162.7 (15)
0x0160|41 56 43 |AVC |
| | | [5]: element {} 0x163-0x165.7 (3)
| | | type: uinteger (1) 0x163-NA (0)
0x0160| 83 | . | id: TrackType (0x83) 0x163-0x163.7 (1)
0x0160| 81 | . | size: 1 0x164-0x164.7 (1)
0x0160| 01 | . | value: video (1) 0x165-0x165.7 (1)
| | | [6]: element {} 0x166-0x16d.7 (8)
| | | type: uinteger (1) 0x166-NA (0)
0x0160| 23 e3 83 | #.. | id: DefaultDuration (0x23e383) 0x166-0x168.7 (3)
0x0160| 84 | . | size: 4 0x169-0x169.7 (1)
0x0160| 02 62 5a 00 | .bZ. | value: 40000000 0x16a-0x16d.7 (4)
| | | [7]: element {} 0x16e-0x17d.7 (16)
| | | type: master (7) 0x16e-NA (0)
0x0160| e0 | . | id: Video (0xe0) 0x16e-0x16e.7 (1)
0x0160| 01| .| size: 7 0x16f-0x176.7 (8)
0x0170|00 00 00 00 00 00 07 |....... |
| | | elements: [2] 0x177-0x17d.7 (7)
| | | [0]: element {} 0x177-0x17a.7 (4)
| | | type: uinteger (1) 0x177-NA (0)
0x0170| b0 | . | id: PixelWidth (0xb0) 0x177-0x177.7 (1)
0x0170| 82 | . | size: 2 0x178-0x178.7 (1)
0x0170| 01 40 | .@ | value: 320 0x179-0x17a.7 (2)
| | | [1]: element {} 0x17b-0x17d.7 (3)
| | | type: uinteger (1) 0x17b-NA (0)
0x0170| ba | . | id: PixelHeight (0xba) 0x17b-0x17b.7 (1)
0x0170| 81 | . | size: 1 0x17c-0x17c.7 (1)
0x0170| f0 | . | value: 240 0x17d-0x17d.7 (1)
| | | [8]: element {} 0x17e-0x1ae.7 (49)
| | | type: binary (6) 0x17e-NA (0)
0x0170| 63 a2| c.| id: CodecPrivate (0x63a2) 0x17e-0x17f.7 (2)
0x0180|ae |. | size: 46 0x180-0x180.7 (1)
| | | value: {} (avc_dcr) 0x181-0x1ae.7 (46)
0x0180| 01 | . | configuration_version: 1 0x181-0x181.7 (1)
0x0180| f4 | . | profile_indication: High 4:4:4 Predictive Profile (244) 0x182-0x182.7 (1)
0x0180| 00 | . | profile_compatibility: 0 0x183-0x183.7 (1)
0x0180| 0d | . | level_indication: 1.3 (13) 0x184-0x184.7 (1)
0x0180| ff | . | reserved0: 63 0x185-0x185.5 (0.6)
0x0180| ff | . | length_size_minus_one: 3 0x185.6-0x185.7 (0.2)
0x0180| e1 | . | reserved1: 7 0x186-0x186.2 (0.3)
0x0180| e1 | . | num_of_sequence_parameter_sets: 1 0x186.3-0x186.7 (0.5)
| | | sequence_parameter_sets: [1] 0x187-0x1a1.7 (27)
| | | [0]: set {} 0x187-0x1a1.7 (27)
0x0180| 00 19 | .. | length: 25 0x187-0x188.7 (2)
| | | nal: {} (avc_nalu) 0x189-0x1a1.7 (25)
| | | sps: {} (avc_sps) 0x0-0x15.7 (22)
0x000|f4 |. | profile_idc: High 4:4:4 Predictive Profile (244) 0x0-0x0.7 (1)
0x000| 00 | . | constraint_set0_flag: false 0x1-0x1 (0.1)
0x000| 00 | . | constraint_set1_flag: false 0x1.1-0x1.1 (0.1)
0x000| 00 | . | constraint_set2_flag: false 0x1.2-0x1.2 (0.1)
0x000| 00 | . | constraint_set3_flag: false 0x1.3-0x1.3 (0.1)
0x000| 00 | . | constraint_set4_flag: false 0x1.4-0x1.4 (0.1)
0x000| 00 | . | constraint_set5_flag: false 0x1.5-0x1.5 (0.1)
0x000| 00 | . | reserved_zero_2bits: 0 0x1.6-0x1.7 (0.2)
0x000| 0d | . | level_idc: 1.3 (13) 0x2-0x2.7 (1)
0x000| 91 | . | seq_parameter_set_id: 0 0x3-0x3 (0.1)
0x000| 91 | . | chroma_format_idc: 3 0x3.1-0x3.5 (0.5)
0x000| 91 | . | separate_colour_plane_flag: false 0x3.6-0x3.6 (0.1)
0x000| 91 | . | bit_depth_luma_minus8: 0 0x3.7-0x3.7 (0.1)
0x000| 9b | . | bit_depth_chroma_minus8: 0 0x4-0x4 (0.1)
0x000| 9b | . | qpprime_y_zero_transform_bypass_flag: false 0x4.1-0x4.1 (0.1)
0x000| 9b | . | seq_scaling_matrix_present_flag: false 0x4.2-0x4.2 (0.1)
0x000| 9b | . | log2_max_frame_num_minus4: 0 0x4.3-0x4.3 (0.1)
0x000| 9b | . | pic_order_cnt_type: 0 0x4.4-0x4.4 (0.1)
0x000| 9b | . | log2_max_pic_order_cnt_lsb_minus4: 2 0x4.5-0x4.7 (0.3)
0x000| 28 | ( | max_num_ref_frames: 4 0x5-0x5.4 (0.5)
0x000| 28 | ( | gaps_in_frame_num_value_allowed_flag: false 0x5.5-0x5.5 (0.1)
0x000| 28 28 | (( | pic_width_in_mbs_minus1: 19 0x5.6-0x6.6 (1.1)
0x000| 28 3f | (? | pic_height_in_map_units_minus1: 14 0x6.7-0x7.5 (0.7)
0x000| 3f | ? | frame_mbs_only_flag: true 0x7.6-0x7.6 (0.1)
0x000| 3f | ? | direct_8x8_inference_flag: true 0x7.7-0x7.7 (0.1)
0x000| 60 | ` | frame_cropping_flag: false 0x8-0x8 (0.1)
0x000| 60 | ` | vui_parameters_present_flag: true 0x8.1-0x8.1 (0.1)
| | | vui_parameters: {} 0x8.2-0x15.4 (13.3)
0x000| 60 | ` | aspect_ratio_info_present_flag: true 0x8.2-0x8.2 (0.1)
0x000| 60 22 | `" | aspect_ratio_idc: 1 0x8.3-0x9.2 (1)
0x000| 22 | " | overscan_info_present_flag: false 0x9.3-0x9.3 (0.1)
0x000| 22 | " | video_signal_type_present_flag: false 0x9.4-0x9.4 (0.1)
0x000| 22 | " | chroma_loc_info_present_flag: false 0x9.5-0x9.5 (0.1)
0x000| 22 | " | timing_info_present_flag: true 0x9.6-0x9.6 (0.1)
0x000| 22 00 00 00 02 | ".... | num_units_in_tick: 1 0x9.7-0xd.6 (4)
0x000| 02 00 00| ...| time_scale: 50 0xd.7-0x11.6 (4)
0x010|00 64 |.d |
0x010| 64 | d | fixed_frame_rate_flag: false 0x11.7-0x11.7 (0.1)
0x010| 1e | . | nal_hrd_parameters_present_flag: false 0x12-0x12 (0.1)
0x010| 1e | . | vcl_hrd_parameters_present_flag: false 0x12.1-0x12.1 (0.1)
0x010| 1e | . | pic_struct_present_flag: false 0x12.2-0x12.2 (0.1)
0x010| 1e | . | bitstream_restriction_flag: true 0x12.3-0x12.3 (0.1)
0x010| 1e | . | motion_vectors_over_pic_boundaries_flag: true 0x12.4-0x12.4 (0.1)
0x010| 1e | . | max_bytes_per_pic_denom: 0 0x12.5-0x12.5 (0.1)
0x010| 1e | . | max_bits_per_mb_denom: 0 0x12.6-0x12.6 (0.1)
0x010| 1e 28 | .( | log2_max_mv_length_horizontal: 9 0x12.7-0x13.5 (0.7)
0x010| 28 53 | (S | log2_max_mv_length_vertical: 9 0x13.6-0x14.4 (0.7)
0x010| 53 | S | max_num_reorder_frames: 2 0x14.5-0x14.7 (0.3)
0x010| 2c| | ,| | max_dec_frame_buffering: 4 0x15-0x15.4 (0.5)
0x010| 2c| | ,| | rbsp_trailing_bits: 80 0x15.5-0x15.7 (0.3)
0x0180| 67 | g | forbidden_zero_bit: false 0x189-0x189 (0.1)
0x0180| 67 | g | nal_ref_idc: 3 0x189.1-0x189.2 (0.2)
0x0180| 67 | g | nal_unit_type: Sequence parameter set (7) 0x189.3-0x189.7 (0.5)
0x0180| f4 00 0d 91 9b 28| .....(| data: f4000d919b28283f6022000003000200... 0x18a-0x1a1.7 (24)
0x0190|28 3f 60 22 00 00 03 00 02 00 00 03 00 64 1e 28|(?`".........d.(|
0x01a0|53 2c |S, |
0x01a0| 01 | . | num_of_picture_parameter_sets: 1 0x1a2-0x1a2.7 (1)
| | | picture_parameter_sets: [1] 0x1a3-0x1aa.7 (8)
| | | [0]: set {} 0x1a3-0x1aa.7 (8)
0x01a0| 00 06 | .. | length: 6 0x1a3-0x1a4.7 (2)
| | | nal: {} (avc_nalu) 0x1a5-0x1aa.7 (6)
| | | pps: {} (avc_pps) 0x0-0x4.7 (5)
0x000|eb |. | pic_parameter_set_id: 0 0x0-0x0 (0.1)
0x000|eb |. | seq_parameter_set_id: 0 0x0.1-0x0.1 (0.1)
0x000|eb |. | entropy_coding_mode_flag: true 0x0.2-0x0.2 (0.1)
0x000|eb |. | bottom_field_pic_order_in_frame_present_flag: false 0x0.3-0x0.3 (0.1)
0x000|eb |. | num_slice_groups_minus1: 0 0x0.4-0x0.4 (0.1)
0x000|eb |. | num_ref_idx_l0_default_active_minus1: 2 0x0.5-0x0.7 (0.3)
0x000| e3 | . | num_ref_idx_l1_default_active_minus1: 0 0x1-0x1 (0.1)
0x000| e3 | . | weighted_pred_flag: true 0x1.1-0x1.1 (0.1)
0x000| e3 | . | weighted_bipred_idc: 2 0x1.2-0x1.3 (0.2)
0x000| e3 c4 | .. | pic_init_qp_minus26: 3 0x1.4-0x2 (0.5)
0x000| c4 | . | pic_init_qs_minus26: 0 0x2.1-0x2.1 (0.1)
0x000| c4 48 | .H | chroma_qp_index_offset: -4 0x2.2-0x3 (0.7)
0x000| 48 | H | deblocking_filter_control_present_flag: true 0x3.1-0x3.1 (0.1)
0x000| 48 | H | constrained_intra_pred_flag: false 0x3.2-0x3.2 (0.1)
0x000| 48 | H | redundant_pic_cnt_present_flag: false 0x3.3-0x3.3 (0.1)
0x000| 48 | H | transform_8x8_mode_flag: true 0x3.4-0x3.4 (0.1)
0x000| 48 | H | pic_scaling_matrix_present_flag: false 0x3.5-0x3.5 (0.1)
0x000| 48 44| | HD| | second_chroma_qp_index_offset: -4 0x3.6-0x4.4 (0.7)
0x000| 44| | D| | rbsp_trailing_bits: 80 0x4.5-0x4.7 (0.3)
0x01a0| 68 | h | forbidden_zero_bit: false 0x1a5-0x1a5 (0.1)
0x01a0| 68 | h | nal_ref_idc: 3 0x1a5.1-0x1a5.2 (0.2)
0x01a0| 68 | h | nal_unit_type: Picture parameter set (8) 0x1a5.3-0x1a5.7 (0.5)
0x01a0| eb e3 c4 48 44 | ...HD | data: ebe3c44844 0x1a6-0x1aa.7 (5)
0x01a0| ff f8 f8 00 | .... | data: fff8f800 0x1ab-0x1ae.7 (4)
| | | [4]: element {} 0x1af-0x254.7 (166)
| | | type: master (7) 0x1af-NA (0)
0x01a0| 12| .| id: Tags (0x1254c367) 0x1af-0x1b2.7 (4)
0x01b0|54 c3 67 |T.g |
0x01b0| 40 a0 | @. | size: 160 0x1b3-0x1b4.7 (2)
| | | elements: [3] 0x1b5-0x254.7 (160)
| | | [0]: element {} 0x1b5-0x1ba.7 (6)
| | | type: binary (6) 0x1b5-NA (0)
0x01b0| bf | . | id: CRC-32 (0xbf) 0x1b5-0x1b5.7 (1)
0x01b0| 84 | . | size: 4 0x1b6-0x1b6.7 (1)
0x01b0| 00 cb 88 49 | ...I | value: 00cb8849 0x1b7-0x1ba.7 (4)
| | | [1]: element {} 0x1bb-0x1eb.7 (49)
| | | type: master (7) 0x1bb-NA (0)
0x01b0| 73 73 | ss | id: Tag (0x7373) 0x1bb-0x1bc.7 (2)
0x01b0| 01 00 00| ...| size: 39 0x1bd-0x1c4.7 (8)
0x01c0|00 00 00 00 27 |....' |
| | | elements: [2] 0x1c5-0x1eb.7 (39)
| | | [0]: element {} 0x1c5-0x1c7.7 (3)
| | | type: master (7) 0x1c5-NA (0)
0x01c0| 63 c0 | c. | id: Targets (0x63c0) 0x1c5-0x1c6.7 (2)
0x01c0| 80 | . | size: 0 0x1c7-0x1c7.7 (1)
| | | elements: [0] 0x1c8-NA (0)
| | | [1]: element {} 0x1c8-0x1eb.7 (36)
| | | type: master (7) 0x1c8-NA (0)
0x01c0| 67 c8 | g. | id: SimpleTag (0x67c8) 0x1c8-0x1c9.7 (2)
0x01c0| 01 00 00 00 00 00| ......| size: 26 0x1ca-0x1d1.7 (8)
0x01d0|00 1a |.. |
| | | elements: [2] 0x1d2-0x1eb.7 (26)
| | | [0]: element {} 0x1d2-0x1db.7 (10)
| | | type: UTF8 (4) 0x1d2-NA (0)
0x01d0| 45 a3 | E. | id: TagName (0x45a3) 0x1d2-0x1d3.7 (2)
0x01d0| 87 | . | size: 7 0x1d4-0x1d4.7 (1)
0x01d0| 45 4e 43 4f 44 45 52 | ENCODER | value: "ENCODER" 0x1d5-0x1db.7 (7)
| | | [1]: element {} 0x1dc-0x1eb.7 (16)
| | | type: UTF8 (4) 0x1dc-NA (0)
0x01d0| 44 87 | D. | id: TagString (0x4487) 0x1dc-0x1dd.7 (2)
0x01d0| 8d | . | size: 13 0x1de-0x1de.7 (1)
0x01d0| 4c| L| value: "Lavf58.45.100" 0x1df-0x1eb.7 (13)
0x01e0|61 76 66 35 38 2e 34 35 2e 31 30 30 |avf58.45.100 |
| | | [2]: element {} 0x1ec-0x254.7 (105)
| | | type: master (7) 0x1ec-NA (0)
0x01e0| 73 73 | ss | id: Tag (0x7373) 0x1ec-0x1ed.7 (2)
0x01e0| 01 00| ..| size: 95 0x1ee-0x1f5.7 (8)
0x01f0|00 00 00 00 00 5f |....._ |
| | | elements: [3] 0x1f6-0x254.7 (95)
| | | [0]: element {} 0x1f6-0x203.7 (14)
| | | type: master (7) 0x1f6-NA (0)
0x01f0| 63 c0 | c. | id: Targets (0x63c0) 0x1f6-0x1f7.7 (2)
0x01f0| 8b | . | size: 11 0x1f8-0x1f8.7 (1)
| | | elements: [1] 0x1f9-0x203.7 (11)
| | | [0]: element {} 0x1f9-0x203.7 (11)
| | | type: uinteger (1) 0x1f9-NA (0)
0x01f0| 63 c5 | c. | id: TagTrackUID (0x63c5) 0x1f9-0x1fa.7 (2)
0x01f0| 88 | . | size: 8 0x1fb-0x1fb.7 (1)
0x01f0| 5c dc 49 64| \.Id| value: 6691303842430154467 0x1fc-0x203.7 (8)
0x0200|84 41 76 e3 |.Av. |
| | | [1]: element {} 0x204-0x22f.7 (44)
| | | type: master (7) 0x204-NA (0)
0x0200| 67 c8 | g. | id: SimpleTag (0x67c8) 0x204-0x205.7 (2)
0x0200| 01 00 00 00 00 00 00 22 | ......." | size: 34 0x206-0x20d.7 (8)
| | | elements: [2] 0x20e-0x22f.7 (34)
| | | [0]: element {} 0x20e-0x217.7 (10)
| | | type: UTF8 (4) 0x20e-NA (0)
0x0200| 45 a3| E.| id: TagName (0x45a3) 0x20e-0x20f.7 (2)
0x0210|87 |. | size: 7 0x210-0x210.7 (1)
0x0210| 45 4e 43 4f 44 45 52 | ENCODER | value: "ENCODER" 0x211-0x217.7 (7)
| | | [1]: element {} 0x218-0x22f.7 (24)
| | | type: UTF8 (4) 0x218-NA (0)
0x0210| 44 87 | D. | id: TagString (0x4487) 0x218-0x219.7 (2)
0x0210| 95 | . | size: 21 0x21a-0x21a.7 (1)
0x0210| 4c 61 76 63 35| Lavc5| value: "Lavc58.91.100 libx264" 0x21b-0x22f.7 (21)
0x0220|38 2e 39 31 2e 31 30 30 20 6c 69 62 78 32 36 34|8.91.100 libx264|
| | | [2]: element {} 0x230-0x254.7 (37)
| | | type: master (7) 0x230-NA (0)
0x0230|67 c8 |g. | id: SimpleTag (0x67c8) 0x230-0x231.7 (2)
0x0230| a2 | . | size: 34 0x232-0x232.7 (1)
| | | elements: [2] 0x233-0x254.7 (34)
| | | [0]: element {} 0x233-0x23d.7 (11)
| | | type: UTF8 (4) 0x233-NA (0)
0x0230| 45 a3 | E. | id: TagName (0x45a3) 0x233-0x234.7 (2)
0x0230| 88 | . | size: 8 0x235-0x235.7 (1)
0x0230| 44 55 52 41 54 49 4f 4e | DURATION | value: "DURATION" 0x236-0x23d.7 (8)
| | | [1]: element {} 0x23e-0x254.7 (23)
| | | type: UTF8 (4) 0x23e-NA (0)
0x0230| 44 87| D.| id: TagString (0x4487) 0x23e-0x23f.7 (2)
0x0240|94 |. | size: 20 0x240-0x240.7 (1)
0x0240| 30 30 3a 30 30 3a 30 30 2e 30 34 30 30 30 30| 00:00:00.040000| value: "00:00:00.040000000\x00\x00" 0x241-0x254.7 (20)
0x0250|30 30 30 00 00 |000.. |
| | | [5]: element {} 0x255-0xd2a.7 (2774)
| | | type: master (7) 0x255-NA (0)
0x0250| 1f 43 b6 75 | .C.u | id: Cluster (0x1f43b675) 0x255-0x258.7 (4)
0x0250| 4a d0 | J. | size: 2768 0x259-0x25a.7 (2)
| | | elements: [3] 0x25b-0xd2a.7 (2768)
| | | [0]: element {} 0x25b-0x260.7 (6)
| | | type: binary (6) 0x25b-NA (0)
0x0250| bf | . | id: CRC-32 (0xbf) 0x25b-0x25b.7 (1)
0x0250| 84 | . | size: 4 0x25c-0x25c.7 (1)
0x0250| 4e 31 f6| N1.| value: 4e31f60d 0x25d-0x260.7 (4)
0x0260|0d |. |
| | | [1]: element {} 0x261-0x263.7 (3)
| | | type: uinteger (1) 0x261-NA (0)
0x0260| e7 | . | id: Timestamp (0xe7) 0x261-0x261.7 (1)
0x0260| 81 | . | size: 1 0x262-0x262.7 (1)
0x0260| 00 | . | value: 0 0x263-0x263.7 (1)
| | | [2]: element {} 0x264-0xd2a.7 (2759)
| | | type: binary (6) 0x264-NA (0)
0x0260| a3 | . | id: SimpleBlock (0xa3) 0x264-0x264.7 (1)
0x0260| 4a c4 | J. | size: 2756 0x265-0x266.7 (2)
0x0260| 81 | . | track_number: 1 0x267-0x267.7 (1)
0x0260| 00 00 | .. | timestamp: 0 0x268-0x269.7 (2)
| | | flags: {} 0x26a-0x26a.7 (1)
0x0260| 80 | . | key_frame: true 0x26a-0x26a (0.1)
0x0260| 80 | . | reserved: 0 0x26a.1-0x26a.3 (0.3)
0x0260| 80 | . | invisible: false 0x26a.4-0x26a.4 (0.1)
0x0260| 80 | . | lacing: 0 0x26a.5-0x26a.6 (0.2)
0x0260| 80 | . | discardable: false 0x26a.7-0x26a.7 (0.1)
| | | packet: {} (avc_au) 0x26b-0xd2a.7 (2752)
| | | access_unit: [2] 0x26b-0xd2a.7 (2752)
| | | [0]: nalu {} 0x26b-0x51b.7 (689)
0x0260| 00 00 02 ad | .... | length: 685 0x26b-0x26e.7 (4)
| | | nalu: {} (avc_nalu) 0x26f-0x51b.7 (685)
| | | sei: {} (avc_sei) 0x0-0x2ab.7 (684)
0x000|05 |. | payload_type: user_data_unregistered (5) 0x0-0x0.7 (1)
0x000| ff ff a9 | ... | payload_size: 679 0x1-0x3.7 (3)
0x000| dc 45 e9 bd e6 d9 48 b7 96 2c d8 20| .E....H..,. | uuid: x264 (dc45e9bde6d948b7962cd820d923eeef) 0x4-0x13.7 (16)
0x010|d9 23 ee ef |.#.. |
0x010| 78 32 36 34 20 2d 20 63 6f 72 65 20| x264 - core | data: 78323634202d20636f72652031363120... 0x14-0x2aa.7 (663)
0x020|31 36 31 20 72 33 30 32 30 20 64 31 39 38 39 33|161 r3020 d19893|
* |until 0x2aa.7 (663) | |
0x2a0| 80| | .| | rbsp_trailing_bits: 80 0x2ab-0x2ab.7 (1)
0x0260| 06| .| forbidden_zero_bit: false 0x26f-0x26f (0.1)
0x0260| 06| .| nal_ref_idc: 0 0x26f.1-0x26f.2 (0.2)
0x0260| 06| .| nal_unit_type: Supplemental enhancement information (SEI) (6) 0x26f.3-0x26f.7 (0.5)
0x0270|05 ff ff a9 dc 45 e9 bd e6 d9 48 b7 96 2c d8 20|.....E....H..,. | data: 05ffffa9dc45e9bde6d948b7962cd820... 0x270-0x51b.7 (684)
* |until 0x51b.7 (684) | |
| | | [1]: nalu {} 0x51c-0xd2a.7 (2063)
0x0510| 00 00 08 0b| ....| length: 2059 0x51c-0x51f.7 (4)
| | | nalu: {} (avc_nalu) 0x520-0xd2a.7 (2059)
0x0520|65 |e | forbidden_zero_bit: false 0x520-0x520 (0.1)
0x0520|65 |e | nal_ref_idc: 3 0x520.1-0x520.2 (0.2)
0x0520|65 |e | nal_unit_type: Coded slice of an IDR picture (5) 0x520.3-0x520.7 (0.5)
| | | slice_header: {} 0x521-0x522 (1.1)
0x0520| 88 | . | first_mb_in_slice: 0 0x521-0x521 (0.1)
0x0520| 88 | . | slice_type: I (7) 0x521.1-0x521.7 (0.7)
0x0520| 84 | . | pic_parameter_set_id: 0 0x522-0x522 (0.1)
0x0520| 84 00 2b ff fe f5 db f3 2c ac 66 67 3d ff| ..+.....,.fg=.| data: 080057fffdebb7e65958ccce7bffda76... 0x522.1-0xd2a.7 (2056.7)
0x0530|ed 3b 60 00 21 74 ff c0 cf 1f fc 67 ff cd 99 a7|.;`.!t.....g....|
* |until 0xd2a.7 (2057) | |
| | | [6]: element {} 0xd2b-0xd46.7 (28)
| | | type: master (7) 0xd2b-NA (0)
0x0d20| 1c 53 bb 6b | .S.k | id: Cues (0x1c53bb6b) 0xd2b-0xd2e.7 (4)
0x0d20| 97| .| size: 23 0xd2f-0xd2f.7 (1)
| | | elements: [2] 0xd30-0xd46.7 (23)
| | | [0]: element {} 0xd30-0xd35.7 (6)
| | | type: binary (6) 0xd30-NA (0)
0x0d30|bf |. | id: CRC-32 (0xbf) 0xd30-0xd30.7 (1)
0x0d30| 84 | . | size: 4 0xd31-0xd31.7 (1)
0x0d30| 78 19 be 67 | x..g | value: 7819be67 0xd32-0xd35.7 (4)
| | | [1]: element {} 0xd36-0xd46.7 (17)
| | | type: master (7) 0xd36-NA (0)
0x0d30| bb | . | id: CuePoint (0xbb) 0xd36-0xd36.7 (1)
0x0d30| 8f | . | size: 15 0xd37-0xd37.7 (1)
| | | elements: [2] 0xd38-0xd46.7 (15)
| | | [0]: element {} 0xd38-0xd3a.7 (3)
| | | type: uinteger (1) 0xd38-NA (0)
0x0d30| b3 | . | id: CueTime (0xb3) 0xd38-0xd38.7 (1)
0x0d30| 81 | . | size: 1 0xd39-0xd39.7 (1)
0x0d30| 00 | . | value: 0 0xd3a-0xd3a.7 (1)
| | | [1]: element {} 0xd3b-0xd46.7 (12)
| | | type: master (7) 0xd3b-NA (0)
0x0d30| b7 | . | id: CueTrackPositions (0xb7) 0xd3b-0xd3b.7 (1)
0x0d30| 8a | . | size: 10 0xd3c-0xd3c.7 (1)
| | | elements: [3] 0xd3d-0xd46.7 (10)
| | | [0]: element {} 0xd3d-0xd3f.7 (3)
| | | type: uinteger (1) 0xd3d-NA (0)
0x0d30| f7 | . | id: CueTrack (0xf7) 0xd3d-0xd3d.7 (1)
0x0d30| 81 | . | size: 1 0xd3e-0xd3e.7 (1)
0x0d30| 01| .| value: 1 0xd3f-0xd3f.7 (1)
| | | [1]: element {} 0xd40-0xd43.7 (4)
| | | type: uinteger (1) 0xd40-NA (0)
0x0d40|f1 |. | id: CueClusterPosition (0xf1) 0xd40-0xd40.7 (1)
0x0d40| 82 | . | size: 2 0xd41-0xd41.7 (1)
0x0d40| 02 21 | .! | value: 545 0xd42-0xd43.7 (2)
| | | [2]: element {} 0xd44-0xd46.7 (3)
| | | type: uinteger (1) 0xd44-NA (0)
0x0d40| f0 | . | id: CueRelativePosition (0xf0) 0xd44-0xd44.7 (1)
0x0d40| 81 | . | size: 1 0xd45-0xd45.7 (1)
0x0d40| 09| | .| | value: 9 0xd46-0xd46.7 (1)

BIN
format/matroska/testdata/avc.mkv vendored Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More