1
1
mirror of https://github.com/wader/fq.git synced 2024-11-26 21:55:57 +03:00
fq/format/riff/common.go
Mattias Wadman 9b81d4d3ab decode: More type safe API and split scalar into multiple types
Preparation to make decoder use less memory and API more type safe.
Now each scalar type has it's own struct type so it can store different
things and enables to have a scalar interface.
Also own types will enable experimenting with decode DLS designs like
using chained methods that are type aware.
2022-12-14 16:23:58 +01:00

121 lines
3.6 KiB
Go

package riff
import (
"github.com/wader/fq/pkg/decode"
"github.com/wader/fq/pkg/scalar"
)
type pathEntry struct {
id string
data any
}
type path []pathEntry
func (p path) topData() any {
if len(p) < 1 {
return nil
}
return p[len(p)-1].data
}
func riffDecode(d *decode.D, path path, headFn func(d *decode.D, path path) (string, int64), chunkFn func(d *decode.D, id string, path path) (bool, any)) {
id, size := headFn(d, path)
d.FramedFn(size*8, func(d *decode.D) {
hasChildren, data := chunkFn(d, id, path)
if hasChildren {
np := append(path, pathEntry{id: id, data: data})
d.FieldArray("chunks", func(d *decode.D) {
for !d.End() {
d.FieldStruct("chunk", func(d *decode.D) {
riffDecode(d, np, headFn, chunkFn)
})
}
})
}
})
wordAlgin := d.AlignBits(16)
if wordAlgin != 0 {
d.FieldRawLen("align", int64(wordAlgin))
}
}
// TODO: sym name?
var chunkIDDescriptions = scalar.StrMapDescription{
"LIST": "Chunk list",
"JUNK": "Alignment",
"idx1": "Index",
"indx": "Base index",
"avih": "AVI main header",
"strh": "Stream header",
"strf": "Stream format",
"strn": "Stream name",
"vprp": "Video properties",
"dmlh": "Extended AVI header",
"ISMP": "SMPTE timecode",
"IDIT": "Time and date digitizing commenced",
"IARL": "Archival Location. Indicates where the subject of the file is archived.",
"IART": "Artist. Lists the artist of the original subject of the file",
"ICMS": "Commissioned. Lists the name of the person or organization that commissioned the subject of the file",
"ICMT": "Comments. Provides general comments about the file or the subject of the file",
"ICOP": "Copyright. Records the copyright information for the file",
"ICRD": "Creation date. Specifies the date the subject of the file was created.",
"ICRP": "Cropped. Describes whether an image has been cropped and, if so, how it was cropped",
"IDIM": "Dimensions. Specifies the size of the original subject of the file",
"IDPI": "Dots Per Inch. Stores dots per inch setting of the digitizer used to produce the file",
"IENG": "Engineer. Stores the name of the engineer who worked on the file. If there are multiple engineers, separate the names by a semicolon and a blank",
"IGNR": "Genre. Describes the original work",
"IKEY": "Keywords. Provides a list of keywords that refer to the file or subject of the file",
"ILGT": "Lightness. Describes the changes in lightness settings on the digitizer required to produce the file.",
"IMED": "Medium. Describes the original subject of the file",
"INAM": "Name. Stores the title of the subject of the file",
"IPLT": "Palette Setting. Specifies the number of colors requested when digitizing an image",
"IPRD": "Product. Specifies the name of the title the file was originally intended for",
"ISBJ": "Subject. Describes the contents of the file",
"ISFT": "Software. Identifies the name of the software package used to create the file",
"ISHP": "Sharpness. Identifies the changes in sharpness for the digitizer required to produce the file",
"ISRC": "Source. Identifies the name of the person or organization who supplied the original subject of the file",
"ISRF": "Source Form. Identifies the original form of the material that was digitized",
"ITCH": "Technician. Identifies the technician who digitized the subject file",
}
func riffIsStringChunkID(id string) bool {
switch id {
case "strn",
"ISMP",
"IDIT",
"IARL",
"IART",
"ICMS",
"ICMT",
"ICOP",
"ICRD",
"ICRP",
"IDIM",
"IDPI",
"IENG",
"IGNR",
"IKEY",
"ILGT",
"IMED",
"INAM",
"IPLT",
"IPRD",
"ISBJ",
"ISFT",
"ISHP",
"ISRC",
"ISRF",
"ITCH":
return true
default:
return false
}
}