1
1
mirror of https://github.com/wader/fq.git synced 2024-11-24 03:05:22 +03:00
fq/format/default.go
2021-09-12 13:08:54 +02:00

389 lines
14 KiB
Go

package format
import (
"github.com/wader/fq/pkg/bitio"
"github.com/wader/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_ANNEXB = "avc_annexb"
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_ANNEXB = "hevc_annexb"
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"
PSSH_PLAYREADY = "pssh_playready"
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",
}
const (
MPEGStreamTypeUnknown = iota
MPEGStreamTypeVideo
MPEGStreamTypeAudio
MPEGStreamTypeText
)
var MpegObjectTypeStreamType = map[uint64]int{
MPEGObjectTypeMOV_TEXT: MPEGStreamTypeText,
MPEGObjectTypeMPEG4: MPEGStreamTypeVideo,
MPEGObjectTypeH264: MPEGStreamTypeVideo,
MPEGObjectTypeHEVC: MPEGStreamTypeVideo,
MPEGObjectTypeAAC: MPEGStreamTypeAudio,
MPEGObjectTypeMPEG2VideoMain: MPEGStreamTypeVideo,
MPEGObjectTypeMPEG2VideoSimple: MPEGStreamTypeVideo,
MPEGObjectTypeMPEG2VideoSNR: MPEGStreamTypeVideo,
MPEGObjectTypeMPEG2VideoSpatial: MPEGStreamTypeVideo,
MPEGObjectTypeMPEG2VideoHigh: MPEGStreamTypeVideo,
MPEGObjectTypeMPEG2Video422: MPEGStreamTypeVideo,
MPEGObjectTypeAACMain: MPEGStreamTypeAudio,
MPEGObjectTypeAACLow: MPEGStreamTypeAudio,
MPEGObjectTypeAACSSR: MPEGStreamTypeAudio,
MPEGObjectTypeMP32MP3: MPEGStreamTypeAudio,
MPEGObjectTypeMPEG1VIDEO: MPEGStreamTypeVideo,
MPEGObjectTypeMP3: MPEGStreamTypeAudio,
MPEGObjectTypeMJPEG: MPEGStreamTypeVideo,
MPEGObjectTypePNG: MPEGStreamTypeVideo,
MPEGObjectTypeJPEG2000: MPEGStreamTypeVideo,
MPEGObjectTypeVC1: MPEGStreamTypeVideo,
MPEGObjectTypeDIRAC: MPEGStreamTypeVideo,
MPEGObjectTypeAC3: MPEGStreamTypeAudio,
MPEGObjectTypeEAC3: MPEGStreamTypeAudio,
MPEGObjectTypeDTS: MPEGStreamTypeAudio,
MPEGObjectTypeOPUS: MPEGStreamTypeAudio,
MPEGObjectTypeVP9: MPEGStreamTypeAudio,
MPEGObjectTypeFLAC: MPEGStreamTypeAudio,
MPEGObjectTypeTSCC2: MPEGStreamTypeVideo,
MPEGObjectTypeEVRC: MPEGStreamTypeAudio,
MPEGObjectTypeVORBIS: MPEGStreamTypeAudio,
MPEGObjectTypeDVDSubtitle: MPEGStreamTypeText,
MPEGObjectTypeQCELP: MPEGStreamTypeAudio,
MPEGObjectTypeMPEG4SYSTEMS1: MPEGStreamTypeUnknown,
MPEGObjectTypeMPEG4SYSTEMS2: MPEGStreamTypeUnknown,
MPEGObjectTypeNONE: MPEGStreamTypeUnknown,
}
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
}