put $atoms into fields
This commit is contained in:
parent
706b6e107b
commit
f887bff6bd
@ -5,17 +5,13 @@ Array.prototype.nonull = function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var atoms = {
|
var atoms = {
|
||||||
fileType: {
|
|
||||||
cc4: 'ftyp',
|
|
||||||
fields: [
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
movie: {
|
movie: {
|
||||||
cc4: 'moov',
|
cc4: 'moov',
|
||||||
atoms: [
|
fields: [
|
||||||
['header', '*movieHeader'],
|
['$atoms', [
|
||||||
['tracks', '[]*track'],
|
['header', '*movieHeader'],
|
||||||
|
['tracks', '[]*track'],
|
||||||
|
]],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -44,9 +40,11 @@ var atoms = {
|
|||||||
|
|
||||||
track: {
|
track: {
|
||||||
cc4: 'trak',
|
cc4: 'trak',
|
||||||
atoms: [
|
fields: [
|
||||||
['header', '*trackHeader'],
|
['$atoms', [
|
||||||
['media', '*media'],
|
['header', '*trackHeader'],
|
||||||
|
['media', '*media'],
|
||||||
|
]],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -77,10 +75,12 @@ var atoms = {
|
|||||||
|
|
||||||
media: {
|
media: {
|
||||||
cc4: 'mdia',
|
cc4: 'mdia',
|
||||||
atoms: [
|
fields: [
|
||||||
['header', '*mediaHeader'],
|
['$atoms', [
|
||||||
['info', '*mediaInfo'],
|
['header', '*mediaHeader'],
|
||||||
['hdlr', '*handlerRefer'],
|
['info', '*mediaInfo'],
|
||||||
|
['hdlr', '*handlerRefer'],
|
||||||
|
]],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -100,10 +100,12 @@ var atoms = {
|
|||||||
|
|
||||||
mediaInfo: {
|
mediaInfo: {
|
||||||
cc4: 'minf',
|
cc4: 'minf',
|
||||||
atoms: [
|
fields: [
|
||||||
['sound', '*soundMediaInfo'],
|
['$atoms', [
|
||||||
['video', '*videoMediaInfo'],
|
['sound', '*soundMediaInfo'],
|
||||||
['sample', '*sampleTable'],
|
['video', '*videoMediaInfo'],
|
||||||
|
['sample', '*sampleTable'],
|
||||||
|
]],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -129,14 +131,16 @@ var atoms = {
|
|||||||
|
|
||||||
sampleTable: {
|
sampleTable: {
|
||||||
cc4: 'stbl',
|
cc4: 'stbl',
|
||||||
atoms: [
|
fields: [
|
||||||
['sampleDesc', '*sampleDesc'],
|
['$atoms', [
|
||||||
['timeToSample', '*timeToSample'],
|
['sampleDesc', '*sampleDesc'],
|
||||||
['compositionOffset', '*compositionOffset'],
|
['timeToSample', '*timeToSample'],
|
||||||
['sampleToChunk', '*sampleToChunk'],
|
['compositionOffset', '*compositionOffset'],
|
||||||
['syncSample', '*syncSample'],
|
['sampleToChunk', '*sampleToChunk'],
|
||||||
['chunkOffset', '*chunkOffset'],
|
['syncSample', '*syncSample'],
|
||||||
['sampleSize', '*sampleSize'],
|
['chunkOffset', '*chunkOffset'],
|
||||||
|
['sampleSize', '*sampleSize'],
|
||||||
|
]],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -268,12 +272,12 @@ var DeclReadFunc = (opts) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var elemTypeStr = type => typeStr(Object.assign({}, type, {arr: false}));
|
var elemTypeStr = type => typeStr(Object.assign({}, type, {arr: false}));
|
||||||
var ReadAtoms = () => [
|
var ReadAtoms = fields => [
|
||||||
For(`r.N > 0`, [
|
For(`r.N > 0`, [
|
||||||
DeclVar('cc4', 'string'),
|
DeclVar('cc4', 'string'),
|
||||||
DeclVar('ar', '*io.LimitedReader'),
|
DeclVar('ar', '*io.LimitedReader'),
|
||||||
CallCheckAssign('ReadAtomHeader', ['r', '""'], ['ar', 'cc4']),
|
CallCheckAssign('ReadAtomHeader', ['r', '""'], ['ar', 'cc4']),
|
||||||
Switch('cc4', opts.fields.map(field => [
|
Switch('cc4', fields.map(field => [
|
||||||
`"${atoms[field.type.struct].cc4}"`, [
|
`"${atoms[field.type.struct].cc4}"`, [
|
||||||
field.type.arr ? [
|
field.type.arr ? [
|
||||||
DeclVar('item', elemTypeStr(field.type)),
|
DeclVar('item', elemTypeStr(field.type)),
|
||||||
@ -302,6 +306,8 @@ var DeclReadFunc = (opts) => {
|
|||||||
var ReadField = (name, type) => {
|
var ReadField = (name, type) => {
|
||||||
if (name == '_')
|
if (name == '_')
|
||||||
return CallCheckAssign('ReadDummy', ['r', type.len], ['_']);
|
return CallCheckAssign('ReadDummy', ['r', type.len], ['_']);
|
||||||
|
if (name == '$atoms')
|
||||||
|
return ReadAtoms(type.list);
|
||||||
if (type.arr && type.fn != 'Bytes')
|
if (type.arr && type.fn != 'Bytes')
|
||||||
return ReadArr('self.'+name, type);
|
return ReadArr('self.'+name, type);
|
||||||
return ReadCommnType('self.'+name, type);
|
return ReadCommnType('self.'+name, type);
|
||||||
@ -321,7 +327,7 @@ var DeclReadFunc = (opts) => {
|
|||||||
[[ptr?'res':'self', (ptr?'*':'')+opts.type], ['err', 'error']],
|
[[ptr?'res':'self', (ptr?'*':'')+opts.type], ['err', 'error']],
|
||||||
[
|
[
|
||||||
ptr && `self := &${opts.type}{}`,
|
ptr && `self := &${opts.type}{}`,
|
||||||
!opts.atoms ? ReadFields() : ReadAtoms(),
|
ReadFields(),
|
||||||
ptr && `res = self`,
|
ptr && `res = self`,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
@ -338,7 +344,7 @@ var DeclWriteFunc = (opts) => {
|
|||||||
CallCheckAssign('aw.Close', [], []),
|
CallCheckAssign('aw.Close', [], []),
|
||||||
];
|
];
|
||||||
|
|
||||||
var WriteAtoms = () => opts.fields.map(field => {
|
var WriteAtoms = fields => fields.map(field => {
|
||||||
var name = 'self.'+field.name;
|
var name = 'self.'+field.name;
|
||||||
return [
|
return [
|
||||||
`if ${name} != nil {`,
|
`if ${name} != nil {`,
|
||||||
@ -369,6 +375,8 @@ var DeclWriteFunc = (opts) => {
|
|||||||
var WriteField = (name, type) => {
|
var WriteField = (name, type) => {
|
||||||
if (name == '_')
|
if (name == '_')
|
||||||
return CallCheckAssign('WriteDummy', ['w', type.len], []);
|
return CallCheckAssign('WriteDummy', ['w', type.len], []);
|
||||||
|
if (name == '$atoms')
|
||||||
|
return WriteAtoms(type.list);
|
||||||
if (type.arr && type.fn != 'Bytes')
|
if (type.arr && type.fn != 'Bytes')
|
||||||
return WriteArr('self.'+name, type);
|
return WriteArr('self.'+name, type);
|
||||||
return WriteCommnType('self.'+name, type);
|
return WriteCommnType('self.'+name, type);
|
||||||
@ -382,7 +390,7 @@ var DeclWriteFunc = (opts) => {
|
|||||||
[['err', 'error']],
|
[['err', 'error']],
|
||||||
[
|
[
|
||||||
opts.cc4 && SavePos,
|
opts.cc4 && SavePos,
|
||||||
opts.atoms ? WriteAtoms() : WriteFields(),
|
WriteFields(),
|
||||||
opts.cc4 && RestorePosSetSize,
|
opts.cc4 && RestorePosSetSize,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
@ -527,39 +535,44 @@ var nameShouldHide = (name) => name == '_'
|
|||||||
var allStmts = () => {
|
var allStmts = () => {
|
||||||
var stmts = [];
|
var stmts = [];
|
||||||
|
|
||||||
|
var parseFields = fields => fields.map(field => {
|
||||||
|
return {
|
||||||
|
name: uc(field[0]),
|
||||||
|
type: field[0] == '$atoms' ? {list: parseFields(field[1])} : parseType(field[1]),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
var genStructFields = fields => fields.map(field => {
|
||||||
|
if (field.name == '_')
|
||||||
|
return;
|
||||||
|
if (field.name == '$atoms')
|
||||||
|
return field.type.list;
|
||||||
|
return [field];
|
||||||
|
}).nonull().reduce((prev, cur) => prev.concat(cur)).map(field => [
|
||||||
|
field.name, typeStr(field.type)]);
|
||||||
|
|
||||||
for (var k in atoms) {
|
for (var k in atoms) {
|
||||||
var atom = atoms[k];
|
var atom = atoms[k];
|
||||||
var name = uc(k);
|
var name = uc(k);
|
||||||
|
|
||||||
var fields = (atom.fields || atom.atoms);
|
if (atom.fields == null)
|
||||||
if (fields == null)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
fields = fields.map(field => {
|
var fields = parseFields(atom.fields);
|
||||||
return {
|
|
||||||
name: uc(field[0]),
|
|
||||||
type: parseType(field[1]),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
stmts = stmts.concat([
|
stmts = stmts.concat([
|
||||||
DeclStruct(name, fields.map(field => !nameShouldHide(field.name) && [
|
DeclStruct(name, genStructFields(fields)),
|
||||||
uc(field.name),
|
|
||||||
typeStr(field.type),
|
|
||||||
]).nonull()),
|
|
||||||
|
|
||||||
DeclReadFunc({
|
DeclReadFunc({
|
||||||
type: name,
|
type: name,
|
||||||
fields: fields,
|
fields: fields,
|
||||||
cc4: atom.cc4,
|
cc4: atom.cc4,
|
||||||
atoms: atom.atoms != null,
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
DeclWriteFunc({
|
DeclWriteFunc({
|
||||||
type: name,
|
type: name,
|
||||||
fields: fields,
|
fields: fields,
|
||||||
cc4: atom.cc4,
|
cc4: atom.cc4,
|
||||||
atoms: atom.atoms != null,
|
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -5,30 +5,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FileType struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadFileType(r *io.LimitedReader) (res *FileType, err error) {
|
|
||||||
|
|
||||||
self := &FileType{}
|
|
||||||
|
|
||||||
res = self
|
|
||||||
return
|
|
||||||
}
|
|
||||||
func WriteFileType(w io.WriteSeeker, self *FileType) (err error) {
|
|
||||||
|
|
||||||
var aw *Writer
|
|
||||||
if aw, err = WriteAtomHeader(w, "ftyp"); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
w = aw
|
|
||||||
|
|
||||||
if err = aw.Close(); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
type Movie struct {
|
type Movie struct {
|
||||||
Header *MovieHeader
|
Header *MovieHeader
|
||||||
Tracks []*Track
|
Tracks []*Track
|
||||||
|
Loading…
x
Reference in New Issue
Block a user