put $atoms into fields

This commit is contained in:
nareix 2015-11-22 08:04:52 +08:00
parent 706b6e107b
commit f887bff6bd
2 changed files with 60 additions and 71 deletions

View File

@ -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,
}), }),
]); ]);
} }

View File

@ -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