change some struct fields
This commit is contained in:
parent
b810c9a2fb
commit
9ec3f04c16
@ -24,8 +24,8 @@ var atoms = {
|
||||
fields: [
|
||||
['version', 'int8'],
|
||||
['flags', 'int24'],
|
||||
['cTime', 'TimeStamp32'],
|
||||
['mTime', 'TimeStamp32'],
|
||||
['createTime', 'TimeStamp32'],
|
||||
['modifyTime', 'TimeStamp32'],
|
||||
['timeScale', 'TimeStamp32'],
|
||||
['duration', 'TimeStamp32'],
|
||||
['preferredRate', 'int32'],
|
||||
@ -55,8 +55,8 @@ var atoms = {
|
||||
fields: [
|
||||
['version', 'int8'],
|
||||
['flags', 'int24'],
|
||||
['cTime', 'TimeStamp32'],
|
||||
['mTime', 'TimeStamp32'],
|
||||
['createTime', 'TimeStamp32'],
|
||||
['modifyTime', 'TimeStamp32'],
|
||||
['trackId', 'TimeStamp32'],
|
||||
['_', '[4]byte'],
|
||||
['duration', 'TimeStamp32'],
|
||||
@ -66,8 +66,8 @@ var atoms = {
|
||||
['volume', 'int16'],
|
||||
['_', '[2]byte'],
|
||||
['matrix', '[9]int32'],
|
||||
['trackWidth', 'int32'],
|
||||
['trackHeader', 'int32'],
|
||||
['trackWidth', 'Fixed32'],
|
||||
['trackHeight', 'Fixed32'],
|
||||
],
|
||||
},
|
||||
|
||||
@ -89,8 +89,8 @@ var atoms = {
|
||||
fields: [
|
||||
['version', 'int8'],
|
||||
['flags', 'int24'],
|
||||
['cTime', 'int32'],
|
||||
['mTime', 'int32'],
|
||||
['createTime', 'int32'],
|
||||
['modifyTime', 'int32'],
|
||||
['timeScale', 'int32'],
|
||||
['duration', 'int32'],
|
||||
['language', 'int16'],
|
||||
@ -226,6 +226,25 @@ var atoms = {
|
||||
],
|
||||
},
|
||||
|
||||
videoSampleDescHeader: {
|
||||
fields: [
|
||||
['version', 'int16'],
|
||||
['revision', 'int16'],
|
||||
['vendor', 'int32'],
|
||||
['temporalQuality', 'int32'],
|
||||
['spatialQuality', 'int32'],
|
||||
['width', 'int16'],
|
||||
['height', 'int16'],
|
||||
['horizontalResolution', 'Fixed32'],
|
||||
['vorizontalResolution', 'Fixed32'],
|
||||
['_', 'int32'],
|
||||
['compressorName', '[32]char'],
|
||||
['frameCount', 'int16'],
|
||||
['depth', 'int16'],
|
||||
['colorTableId', 'int16'],
|
||||
],
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
var DeclReadFunc = (opts) => {
|
||||
@ -386,7 +405,7 @@ D('DeclStruct', 'name', 'body');
|
||||
D('StrStmt', 'content');
|
||||
D('Switch', 'cond', 'cases', 'default');
|
||||
|
||||
var showlog = true;
|
||||
var showlog = false;
|
||||
var S = s => s && s || '';
|
||||
|
||||
var dumpFn = f => {
|
||||
@ -439,6 +458,10 @@ var dumpStmts = stmts => {
|
||||
var parseType = s => {
|
||||
var r = {};
|
||||
var bracket = /^\[(.*)\]/;
|
||||
var lenDiv = 8;
|
||||
var types = /^(int|TimeStamp|byte|Fixed|char)/;
|
||||
var number = /[0-9]+/;
|
||||
|
||||
if (s.match(bracket)) {
|
||||
var count = s.match(bracket)[1];
|
||||
if (count.substr(0,3) == 'int') {
|
||||
@ -449,31 +472,36 @@ var parseType = s => {
|
||||
r.arr = true;
|
||||
s = s.replace(bracket, '');
|
||||
}
|
||||
|
||||
if (s.substr(0,1) == '*') {
|
||||
r.ptr = true;
|
||||
s = s.slice(1);
|
||||
}
|
||||
var types = /^(int|TimeStamp|byte|cc)/;
|
||||
|
||||
if (s.match(types)) {
|
||||
r.type = s.match(types)[0];
|
||||
r.fn = uc(r.type);
|
||||
s = s.replace(types, '');
|
||||
}
|
||||
|
||||
if (r.type == 'byte' && r.arr) {
|
||||
r.len = r.count;
|
||||
r.fn = 'Bytes';
|
||||
}
|
||||
var lenDiv = 8;
|
||||
if (r.type == 'cc') {
|
||||
|
||||
if (r.type == 'char' && r.arr) {
|
||||
r.len = r.count;
|
||||
r.fn = 'String';
|
||||
r.type = 'string';
|
||||
r.arr = false;
|
||||
lenDiv = 1;
|
||||
}
|
||||
var number = /[0-9]+/;
|
||||
|
||||
if (s.match(number)) {
|
||||
r.len = +s.match(number)[0]/lenDiv;
|
||||
s = s.replace(number, '');
|
||||
}
|
||||
|
||||
if (s != '') {
|
||||
r.struct = s;
|
||||
r.Struct = uc(s);
|
||||
|
@ -3,12 +3,58 @@ package atom
|
||||
|
||||
import (
|
||||
"io"
|
||||
"bytes"
|
||||
"log"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
type VideoSampleDesc struct {
|
||||
VideoSampleDescHeader
|
||||
AVCDecoderConf []byte
|
||||
}
|
||||
|
||||
func ReadVideoSampleDesc(r *io.LimitedReader) (res *VideoSampleDesc, err error) {
|
||||
self := &VideoSampleDesc{}
|
||||
|
||||
if self.VideoSampleDescHeader, err = ReadVideoSampleDescHeader(r); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for r.N > 0 {
|
||||
var cc4 string
|
||||
var ar *io.LimitedReader
|
||||
if ar, cc4, err = ReadAtomHeader(r, ""); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if false {
|
||||
log.Println("VideoSampleDesc:", cc4, ar.N)
|
||||
//log.Println("VideoSampleDesc:", "avcC", len(self.AVCDecoderConf))
|
||||
}
|
||||
|
||||
switch cc4 {
|
||||
case "avcC": {
|
||||
if self.AVCDecoderConf, err = ReadBytes(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
res = self
|
||||
return
|
||||
}
|
||||
|
||||
type SampleDescEntry struct {
|
||||
Format string
|
||||
DataRefIndex int
|
||||
Data []byte
|
||||
|
||||
Video *VideoSampleDesc
|
||||
}
|
||||
|
||||
func ReadSampleDescEntry(r *io.LimitedReader) (res *SampleDescEntry, err error) {
|
||||
@ -22,9 +68,22 @@ func ReadSampleDescEntry(r *io.LimitedReader) (res *SampleDescEntry, err error)
|
||||
if self.DataRefIndex, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if self.Data, err = ReadBytes(r, int(r.N)); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if self.Format == "avc1" {
|
||||
br := bytes.NewReader(self.Data)
|
||||
var err error
|
||||
self.Video, err = ReadVideoSampleDesc(&io.LimitedReader{R: br, N: int64(len(self.Data))})
|
||||
if false {
|
||||
log.Println("ReadSampleDescEntry:", hex.Dump(self.Data))
|
||||
log.Println("ReadSampleDescEntry:", err)
|
||||
}
|
||||
} else if self.Format == "mp4a" {
|
||||
}
|
||||
|
||||
res = self
|
||||
return
|
||||
}
|
||||
@ -94,16 +153,16 @@ func WriteHandlerRefer(w io.WriteSeeker, self *HandlerRefer) (err error) {
|
||||
if err = WriteInt(w, self.Flags, 1); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteString(w, self.Type); err != nil {
|
||||
if err = WriteString(w, self.Type, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteString(w, self.SubType); err != nil {
|
||||
if err = WriteString(w, self.SubType, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteDummy(w, 12); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteString(w, self.Name); err != nil {
|
||||
if err = WriteString(w, self.Name, len(self.Name)); err != nil {
|
||||
return
|
||||
}
|
||||
if err = aw.Close(); err != nil {
|
||||
|
@ -7,9 +7,6 @@ import (
|
||||
"log"
|
||||
)
|
||||
|
||||
type Fixed32 uint32
|
||||
type TimeStamp uint32
|
||||
|
||||
func ReadBytes(r io.Reader, n int) (res []byte, err error) {
|
||||
res = make([]byte, n)
|
||||
if n, err = r.Read(res); err != nil {
|
||||
@ -39,12 +36,12 @@ func ReadInt(r io.Reader, n int) (res int, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func ReadFixed32(r io.Reader, n int) (res Fixed32, err error) {
|
||||
func ReadFixed(r io.Reader, n int) (res Fixed, err error) {
|
||||
var ui uint
|
||||
if ui, err = ReadUInt(r, n); err != nil {
|
||||
return
|
||||
}
|
||||
res = Fixed32(ui)
|
||||
res = Fixed(ui)
|
||||
return
|
||||
}
|
||||
|
||||
|
279
atom/struct.go
279
atom/struct.go
@ -3,21 +3,20 @@ package atom
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
)
|
||||
|
||||
type FileType struct {
|
||||
}
|
||||
|
||||
func ReadFileType(r *io.LimitedReader) (res *FileType, err error) {
|
||||
log.Println("ReadFileType")
|
||||
|
||||
self := &FileType{}
|
||||
|
||||
res = self
|
||||
return
|
||||
}
|
||||
func WriteFileType(w io.WriteSeeker, self *FileType) (err error) {
|
||||
log.Println("WriteFileType")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "ftyp"); err != nil {
|
||||
return
|
||||
@ -36,7 +35,7 @@ type Movie struct {
|
||||
}
|
||||
|
||||
func ReadMovie(r *io.LimitedReader) (res *Movie, err error) {
|
||||
log.Println("ReadMovie")
|
||||
|
||||
self := &Movie{}
|
||||
for r.N > 0 {
|
||||
var cc4 string
|
||||
@ -59,10 +58,7 @@ func ReadMovie(r *io.LimitedReader) (res *Movie, err error) {
|
||||
}
|
||||
self.Tracks = append(self.Tracks, item)
|
||||
}
|
||||
default:
|
||||
{
|
||||
log.Println("skip", cc4)
|
||||
}
|
||||
|
||||
}
|
||||
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
@ -72,7 +68,7 @@ func ReadMovie(r *io.LimitedReader) (res *Movie, err error) {
|
||||
return
|
||||
}
|
||||
func WriteMovie(w io.WriteSeeker, self *Movie) (err error) {
|
||||
log.Println("WriteMovie")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "moov"); err != nil {
|
||||
return
|
||||
@ -99,8 +95,8 @@ func WriteMovie(w io.WriteSeeker, self *Movie) (err error) {
|
||||
type MovieHeader struct {
|
||||
Version int
|
||||
Flags int
|
||||
CTime TimeStamp
|
||||
MTime TimeStamp
|
||||
CreateTime TimeStamp
|
||||
ModifyTime TimeStamp
|
||||
TimeScale TimeStamp
|
||||
Duration TimeStamp
|
||||
PreferredRate int
|
||||
@ -116,7 +112,7 @@ type MovieHeader struct {
|
||||
}
|
||||
|
||||
func ReadMovieHeader(r *io.LimitedReader) (res *MovieHeader, err error) {
|
||||
log.Println("ReadMovieHeader")
|
||||
|
||||
self := &MovieHeader{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -124,10 +120,10 @@ func ReadMovieHeader(r *io.LimitedReader) (res *MovieHeader, err error) {
|
||||
if self.Flags, err = ReadInt(r, 3); err != nil {
|
||||
return
|
||||
}
|
||||
if self.CTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
if self.CreateTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.MTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
if self.ModifyTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.TimeScale, err = ReadTimeStamp(r, 4); err != nil {
|
||||
@ -175,7 +171,7 @@ func ReadMovieHeader(r *io.LimitedReader) (res *MovieHeader, err error) {
|
||||
return
|
||||
}
|
||||
func WriteMovieHeader(w io.WriteSeeker, self *MovieHeader) (err error) {
|
||||
log.Println("WriteMovieHeader")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "mvhd"); err != nil {
|
||||
return
|
||||
@ -187,10 +183,10 @@ func WriteMovieHeader(w io.WriteSeeker, self *MovieHeader) (err error) {
|
||||
if err = WriteInt(w, self.Flags, 3); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteTimeStamp(w, self.CTime, 4); err != nil {
|
||||
if err = WriteTimeStamp(w, self.CreateTime, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteTimeStamp(w, self.MTime, 4); err != nil {
|
||||
if err = WriteTimeStamp(w, self.ModifyTime, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteTimeStamp(w, self.TimeScale, 4); err != nil {
|
||||
@ -246,7 +242,7 @@ type Track struct {
|
||||
}
|
||||
|
||||
func ReadTrack(r *io.LimitedReader) (res *Track, err error) {
|
||||
log.Println("ReadTrack")
|
||||
|
||||
self := &Track{}
|
||||
for r.N > 0 {
|
||||
var cc4 string
|
||||
@ -267,10 +263,7 @@ func ReadTrack(r *io.LimitedReader) (res *Track, err error) {
|
||||
return
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
log.Println("skip", cc4)
|
||||
}
|
||||
|
||||
}
|
||||
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
@ -280,7 +273,7 @@ func ReadTrack(r *io.LimitedReader) (res *Track, err error) {
|
||||
return
|
||||
}
|
||||
func WriteTrack(w io.WriteSeeker, self *Track) (err error) {
|
||||
log.Println("WriteTrack")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "trak"); err != nil {
|
||||
return
|
||||
@ -305,20 +298,20 @@ func WriteTrack(w io.WriteSeeker, self *Track) (err error) {
|
||||
type TrackHeader struct {
|
||||
Version int
|
||||
Flags int
|
||||
CTime TimeStamp
|
||||
MTime TimeStamp
|
||||
CreateTime TimeStamp
|
||||
ModifyTime TimeStamp
|
||||
TrackId TimeStamp
|
||||
Duration TimeStamp
|
||||
Layer int
|
||||
AlternateGroup int
|
||||
Volume int
|
||||
Matrix [9]int
|
||||
TrackWidth int
|
||||
TrackHeader int
|
||||
TrackWidth Fixed
|
||||
TrackHeight Fixed
|
||||
}
|
||||
|
||||
func ReadTrackHeader(r *io.LimitedReader) (res *TrackHeader, err error) {
|
||||
log.Println("ReadTrackHeader")
|
||||
|
||||
self := &TrackHeader{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -326,10 +319,10 @@ func ReadTrackHeader(r *io.LimitedReader) (res *TrackHeader, err error) {
|
||||
if self.Flags, err = ReadInt(r, 3); err != nil {
|
||||
return
|
||||
}
|
||||
if self.CTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
if self.CreateTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.MTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
if self.ModifyTime, err = ReadTimeStamp(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.TrackId, err = ReadTimeStamp(r, 4); err != nil {
|
||||
@ -361,17 +354,17 @@ func ReadTrackHeader(r *io.LimitedReader) (res *TrackHeader, err error) {
|
||||
return
|
||||
}
|
||||
}
|
||||
if self.TrackWidth, err = ReadInt(r, 4); err != nil {
|
||||
if self.TrackWidth, err = ReadFixed(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.TrackHeader, err = ReadInt(r, 4); err != nil {
|
||||
if self.TrackHeight, err = ReadFixed(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
res = self
|
||||
return
|
||||
}
|
||||
func WriteTrackHeader(w io.WriteSeeker, self *TrackHeader) (err error) {
|
||||
log.Println("WriteTrackHeader")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "tkhd"); err != nil {
|
||||
return
|
||||
@ -383,10 +376,10 @@ func WriteTrackHeader(w io.WriteSeeker, self *TrackHeader) (err error) {
|
||||
if err = WriteInt(w, self.Flags, 3); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteTimeStamp(w, self.CTime, 4); err != nil {
|
||||
if err = WriteTimeStamp(w, self.CreateTime, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteTimeStamp(w, self.MTime, 4); err != nil {
|
||||
if err = WriteTimeStamp(w, self.ModifyTime, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteTimeStamp(w, self.TrackId, 4); err != nil {
|
||||
@ -418,10 +411,10 @@ func WriteTrackHeader(w io.WriteSeeker, self *TrackHeader) (err error) {
|
||||
return
|
||||
}
|
||||
}
|
||||
if err = WriteInt(w, self.TrackWidth, 4); err != nil {
|
||||
if err = WriteFixed(w, self.TrackWidth, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.TrackHeader, 4); err != nil {
|
||||
if err = WriteFixed(w, self.TrackHeight, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = aw.Close(); err != nil {
|
||||
@ -437,7 +430,7 @@ type Media struct {
|
||||
}
|
||||
|
||||
func ReadMedia(r *io.LimitedReader) (res *Media, err error) {
|
||||
log.Println("ReadMedia")
|
||||
|
||||
self := &Media{}
|
||||
for r.N > 0 {
|
||||
var cc4 string
|
||||
@ -464,10 +457,7 @@ func ReadMedia(r *io.LimitedReader) (res *Media, err error) {
|
||||
return
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
log.Println("skip", cc4)
|
||||
}
|
||||
|
||||
}
|
||||
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
@ -477,7 +467,7 @@ func ReadMedia(r *io.LimitedReader) (res *Media, err error) {
|
||||
return
|
||||
}
|
||||
func WriteMedia(w io.WriteSeeker, self *Media) (err error) {
|
||||
log.Println("WriteMedia")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "mdia"); err != nil {
|
||||
return
|
||||
@ -505,18 +495,18 @@ func WriteMedia(w io.WriteSeeker, self *Media) (err error) {
|
||||
}
|
||||
|
||||
type MediaHeader struct {
|
||||
Version int
|
||||
Flags int
|
||||
CTime int
|
||||
MTime int
|
||||
TimeScale int
|
||||
Duration int
|
||||
Language int
|
||||
Quality int
|
||||
Version int
|
||||
Flags int
|
||||
CreateTime int
|
||||
ModifyTime int
|
||||
TimeScale int
|
||||
Duration int
|
||||
Language int
|
||||
Quality int
|
||||
}
|
||||
|
||||
func ReadMediaHeader(r *io.LimitedReader) (res *MediaHeader, err error) {
|
||||
log.Println("ReadMediaHeader")
|
||||
|
||||
self := &MediaHeader{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -524,10 +514,10 @@ func ReadMediaHeader(r *io.LimitedReader) (res *MediaHeader, err error) {
|
||||
if self.Flags, err = ReadInt(r, 3); err != nil {
|
||||
return
|
||||
}
|
||||
if self.CTime, err = ReadInt(r, 4); err != nil {
|
||||
if self.CreateTime, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.MTime, err = ReadInt(r, 4); err != nil {
|
||||
if self.ModifyTime, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.TimeScale, err = ReadInt(r, 4); err != nil {
|
||||
@ -546,7 +536,7 @@ func ReadMediaHeader(r *io.LimitedReader) (res *MediaHeader, err error) {
|
||||
return
|
||||
}
|
||||
func WriteMediaHeader(w io.WriteSeeker, self *MediaHeader) (err error) {
|
||||
log.Println("WriteMediaHeader")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "mdhd"); err != nil {
|
||||
return
|
||||
@ -558,10 +548,10 @@ func WriteMediaHeader(w io.WriteSeeker, self *MediaHeader) (err error) {
|
||||
if err = WriteInt(w, self.Flags, 3); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.CTime, 4); err != nil {
|
||||
if err = WriteInt(w, self.CreateTime, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.MTime, 4); err != nil {
|
||||
if err = WriteInt(w, self.ModifyTime, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.TimeScale, 4); err != nil {
|
||||
@ -589,7 +579,7 @@ type MediaInfo struct {
|
||||
}
|
||||
|
||||
func ReadMediaInfo(r *io.LimitedReader) (res *MediaInfo, err error) {
|
||||
log.Println("ReadMediaInfo")
|
||||
|
||||
self := &MediaInfo{}
|
||||
for r.N > 0 {
|
||||
var cc4 string
|
||||
@ -616,10 +606,7 @@ func ReadMediaInfo(r *io.LimitedReader) (res *MediaInfo, err error) {
|
||||
return
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
log.Println("skip", cc4)
|
||||
}
|
||||
|
||||
}
|
||||
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
@ -629,7 +616,7 @@ func ReadMediaInfo(r *io.LimitedReader) (res *MediaInfo, err error) {
|
||||
return
|
||||
}
|
||||
func WriteMediaInfo(w io.WriteSeeker, self *MediaInfo) (err error) {
|
||||
log.Println("WriteMediaInfo")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "minf"); err != nil {
|
||||
return
|
||||
@ -663,7 +650,7 @@ type SoundMediaInfo struct {
|
||||
}
|
||||
|
||||
func ReadSoundMediaInfo(r *io.LimitedReader) (res *SoundMediaInfo, err error) {
|
||||
log.Println("ReadSoundMediaInfo")
|
||||
|
||||
self := &SoundMediaInfo{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -681,7 +668,7 @@ func ReadSoundMediaInfo(r *io.LimitedReader) (res *SoundMediaInfo, err error) {
|
||||
return
|
||||
}
|
||||
func WriteSoundMediaInfo(w io.WriteSeeker, self *SoundMediaInfo) (err error) {
|
||||
log.Println("WriteSoundMediaInfo")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "smhd"); err != nil {
|
||||
return
|
||||
@ -713,7 +700,7 @@ type VideoMediaInfo struct {
|
||||
}
|
||||
|
||||
func ReadVideoMediaInfo(r *io.LimitedReader) (res *VideoMediaInfo, err error) {
|
||||
log.Println("ReadVideoMediaInfo")
|
||||
|
||||
self := &VideoMediaInfo{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -733,7 +720,7 @@ func ReadVideoMediaInfo(r *io.LimitedReader) (res *VideoMediaInfo, err error) {
|
||||
return
|
||||
}
|
||||
func WriteVideoMediaInfo(w io.WriteSeeker, self *VideoMediaInfo) (err error) {
|
||||
log.Println("WriteVideoMediaInfo")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "vmhd"); err != nil {
|
||||
return
|
||||
@ -770,7 +757,7 @@ type SampleTable struct {
|
||||
}
|
||||
|
||||
func ReadSampleTable(r *io.LimitedReader) (res *SampleTable, err error) {
|
||||
log.Println("ReadSampleTable")
|
||||
|
||||
self := &SampleTable{}
|
||||
for r.N > 0 {
|
||||
var cc4 string
|
||||
@ -821,10 +808,7 @@ func ReadSampleTable(r *io.LimitedReader) (res *SampleTable, err error) {
|
||||
return
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
log.Println("skip", cc4)
|
||||
}
|
||||
|
||||
}
|
||||
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||
return
|
||||
@ -834,7 +818,7 @@ func ReadSampleTable(r *io.LimitedReader) (res *SampleTable, err error) {
|
||||
return
|
||||
}
|
||||
func WriteSampleTable(w io.WriteSeeker, self *SampleTable) (err error) {
|
||||
log.Println("WriteSampleTable")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stbl"); err != nil {
|
||||
return
|
||||
@ -888,7 +872,7 @@ type SampleDesc struct {
|
||||
}
|
||||
|
||||
func ReadSampleDesc(r *io.LimitedReader) (res *SampleDesc, err error) {
|
||||
log.Println("ReadSampleDesc")
|
||||
|
||||
self := &SampleDesc{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -910,7 +894,7 @@ func ReadSampleDesc(r *io.LimitedReader) (res *SampleDesc, err error) {
|
||||
return
|
||||
}
|
||||
func WriteSampleDesc(w io.WriteSeeker, self *SampleDesc) (err error) {
|
||||
log.Println("WriteSampleDesc")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stsd"); err != nil {
|
||||
return
|
||||
@ -943,7 +927,7 @@ type TimeToSample struct {
|
||||
}
|
||||
|
||||
func ReadTimeToSample(r *io.LimitedReader) (res *TimeToSample, err error) {
|
||||
log.Println("ReadTimeToSample")
|
||||
|
||||
self := &TimeToSample{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -965,7 +949,7 @@ func ReadTimeToSample(r *io.LimitedReader) (res *TimeToSample, err error) {
|
||||
return
|
||||
}
|
||||
func WriteTimeToSample(w io.WriteSeeker, self *TimeToSample) (err error) {
|
||||
log.Println("WriteTimeToSample")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stts"); err != nil {
|
||||
return
|
||||
@ -997,7 +981,7 @@ type TimeToSampleEntry struct {
|
||||
}
|
||||
|
||||
func ReadTimeToSampleEntry(r *io.LimitedReader) (self TimeToSampleEntry, err error) {
|
||||
log.Println("ReadTimeToSampleEntry")
|
||||
|
||||
if self.Count, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
@ -1007,7 +991,7 @@ func ReadTimeToSampleEntry(r *io.LimitedReader) (self TimeToSampleEntry, err err
|
||||
return
|
||||
}
|
||||
func WriteTimeToSampleEntry(w io.WriteSeeker, self TimeToSampleEntry) (err error) {
|
||||
log.Println("WriteTimeToSampleEntry")
|
||||
|
||||
if err = WriteInt(w, self.Count, 4); err != nil {
|
||||
return
|
||||
}
|
||||
@ -1024,7 +1008,7 @@ type SampleToChunk struct {
|
||||
}
|
||||
|
||||
func ReadSampleToChunk(r *io.LimitedReader) (res *SampleToChunk, err error) {
|
||||
log.Println("ReadSampleToChunk")
|
||||
|
||||
self := &SampleToChunk{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -1046,7 +1030,7 @@ func ReadSampleToChunk(r *io.LimitedReader) (res *SampleToChunk, err error) {
|
||||
return
|
||||
}
|
||||
func WriteSampleToChunk(w io.WriteSeeker, self *SampleToChunk) (err error) {
|
||||
log.Println("WriteSampleToChunk")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stsc"); err != nil {
|
||||
return
|
||||
@ -1079,7 +1063,7 @@ type SampleToChunkEntry struct {
|
||||
}
|
||||
|
||||
func ReadSampleToChunkEntry(r *io.LimitedReader) (self SampleToChunkEntry, err error) {
|
||||
log.Println("ReadSampleToChunkEntry")
|
||||
|
||||
if self.FirstChunk, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
@ -1092,7 +1076,7 @@ func ReadSampleToChunkEntry(r *io.LimitedReader) (self SampleToChunkEntry, err e
|
||||
return
|
||||
}
|
||||
func WriteSampleToChunkEntry(w io.WriteSeeker, self SampleToChunkEntry) (err error) {
|
||||
log.Println("WriteSampleToChunkEntry")
|
||||
|
||||
if err = WriteInt(w, self.FirstChunk, 4); err != nil {
|
||||
return
|
||||
}
|
||||
@ -1112,7 +1096,7 @@ type CompositionOffset struct {
|
||||
}
|
||||
|
||||
func ReadCompositionOffset(r *io.LimitedReader) (res *CompositionOffset, err error) {
|
||||
log.Println("ReadCompositionOffset")
|
||||
|
||||
self := &CompositionOffset{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -1134,7 +1118,7 @@ func ReadCompositionOffset(r *io.LimitedReader) (res *CompositionOffset, err err
|
||||
return
|
||||
}
|
||||
func WriteCompositionOffset(w io.WriteSeeker, self *CompositionOffset) (err error) {
|
||||
log.Println("WriteCompositionOffset")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "ctts"); err != nil {
|
||||
return
|
||||
@ -1166,7 +1150,7 @@ type CompositionOffsetEntry struct {
|
||||
}
|
||||
|
||||
func ReadCompositionOffsetEntry(r *io.LimitedReader) (self CompositionOffsetEntry, err error) {
|
||||
log.Println("ReadCompositionOffsetEntry")
|
||||
|
||||
if self.Count, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
@ -1176,7 +1160,7 @@ func ReadCompositionOffsetEntry(r *io.LimitedReader) (self CompositionOffsetEntr
|
||||
return
|
||||
}
|
||||
func WriteCompositionOffsetEntry(w io.WriteSeeker, self CompositionOffsetEntry) (err error) {
|
||||
log.Println("WriteCompositionOffsetEntry")
|
||||
|
||||
if err = WriteInt(w, self.Count, 4); err != nil {
|
||||
return
|
||||
}
|
||||
@ -1193,7 +1177,7 @@ type SyncSample struct {
|
||||
}
|
||||
|
||||
func ReadSyncSample(r *io.LimitedReader) (res *SyncSample, err error) {
|
||||
log.Println("ReadSyncSample")
|
||||
|
||||
self := &SyncSample{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -1215,7 +1199,7 @@ func ReadSyncSample(r *io.LimitedReader) (res *SyncSample, err error) {
|
||||
return
|
||||
}
|
||||
func WriteSyncSample(w io.WriteSeeker, self *SyncSample) (err error) {
|
||||
log.Println("WriteSyncSample")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stss"); err != nil {
|
||||
return
|
||||
@ -1249,7 +1233,7 @@ type SampleSize struct {
|
||||
}
|
||||
|
||||
func ReadSampleSize(r *io.LimitedReader) (res *SampleSize, err error) {
|
||||
log.Println("ReadSampleSize")
|
||||
|
||||
self := &SampleSize{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -1274,7 +1258,7 @@ func ReadSampleSize(r *io.LimitedReader) (res *SampleSize, err error) {
|
||||
return
|
||||
}
|
||||
func WriteSampleSize(w io.WriteSeeker, self *SampleSize) (err error) {
|
||||
log.Println("WriteSampleSize")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stsz"); err != nil {
|
||||
return
|
||||
@ -1310,7 +1294,7 @@ type ChunkOffset struct {
|
||||
}
|
||||
|
||||
func ReadChunkOffset(r *io.LimitedReader) (res *ChunkOffset, err error) {
|
||||
log.Println("ReadChunkOffset")
|
||||
|
||||
self := &ChunkOffset{}
|
||||
if self.Version, err = ReadInt(r, 1); err != nil {
|
||||
return
|
||||
@ -1332,7 +1316,7 @@ func ReadChunkOffset(r *io.LimitedReader) (res *ChunkOffset, err error) {
|
||||
return
|
||||
}
|
||||
func WriteChunkOffset(w io.WriteSeeker, self *ChunkOffset) (err error) {
|
||||
log.Println("WriteChunkOffset")
|
||||
|
||||
var aw *Writer
|
||||
if aw, err = WriteAtomHeader(w, "stco"); err != nil {
|
||||
return
|
||||
@ -1357,3 +1341,112 @@ func WriteChunkOffset(w io.WriteSeeker, self *ChunkOffset) (err error) {
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type VideoSampleDescHeader struct {
|
||||
Version int
|
||||
Revision int
|
||||
Vendor int
|
||||
TemporalQuality int
|
||||
SpatialQuality int
|
||||
Width int
|
||||
Height int
|
||||
HorizontalResolution Fixed
|
||||
VorizontalResolution Fixed
|
||||
CompressorName string
|
||||
FrameCount int
|
||||
Depth int
|
||||
ColorTableId int
|
||||
}
|
||||
|
||||
func ReadVideoSampleDescHeader(r *io.LimitedReader) (self VideoSampleDescHeader, err error) {
|
||||
|
||||
if self.Version, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if self.Revision, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if self.Vendor, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.TemporalQuality, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.SpatialQuality, err = ReadInt(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.Width, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if self.Height, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if self.HorizontalResolution, err = ReadFixed(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.VorizontalResolution, err = ReadFixed(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = ReadDummy(r, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if self.CompressorName, err = ReadString(r, 32); err != nil {
|
||||
return
|
||||
}
|
||||
if self.FrameCount, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if self.Depth, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if self.ColorTableId, err = ReadInt(r, 2); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
func WriteVideoSampleDescHeader(w io.WriteSeeker, self VideoSampleDescHeader) (err error) {
|
||||
|
||||
if err = WriteInt(w, self.Version, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.Revision, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.Vendor, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.TemporalQuality, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.SpatialQuality, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.Width, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.Height, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteFixed(w, self.HorizontalResolution, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteFixed(w, self.VorizontalResolution, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteDummy(w, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteString(w, self.CompressorName, 32); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.FrameCount, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.Depth, 2); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteInt(w, self.ColorTableId, 2); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -24,12 +24,19 @@ func WriteInt(w io.Writer, val int, n int) (err error) {
|
||||
return WriteUInt(w, uint(val), n)
|
||||
}
|
||||
|
||||
func WriteFixed(w io.Writer, val Fixed, n int) (err error) {
|
||||
return WriteUInt(w, uint(val), n)
|
||||
}
|
||||
|
||||
func WriteTimeStamp(w io.Writer, ts TimeStamp, n int) (err error) {
|
||||
return WriteUInt(w, uint(ts), n)
|
||||
}
|
||||
|
||||
func WriteString(w io.Writer, val string) (err error) {
|
||||
return WriteBytes(w, []byte(val))
|
||||
func WriteString(w io.Writer, val string, n int) (err error) {
|
||||
wb := make([]byte, n)
|
||||
sb := []byte(val)
|
||||
copy(wb, sb)
|
||||
return WriteBytes(w, wb)
|
||||
}
|
||||
|
||||
func WriteDummy(w io.Writer, n int) (err error) {
|
||||
@ -70,7 +77,7 @@ func WriteAtomHeader(w io.WriteSeeker, cc4 string) (res *Writer, err error) {
|
||||
if err = WriteDummy(self, 4); err != nil {
|
||||
return
|
||||
}
|
||||
if err = WriteString(self, cc4); err != nil {
|
||||
if err = WriteString(self, cc4, 4); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
|
26
mp4.go
26
mp4.go
@ -31,6 +31,31 @@ func (self *File) Sync() {
|
||||
func (self *File) Close() {
|
||||
}
|
||||
|
||||
func changeMoov(moov *atom.Movie) {
|
||||
header := moov.Header
|
||||
|
||||
log.Println("moov: ", header.CreateTime, header.TimeScale, header.Duration)
|
||||
log.Println("moov: ", header.PreferredRate, header.PreferredVolume)
|
||||
log.Println("moov: ", header.PreviewTime, header.PreviewDuration)
|
||||
log.Println("moov: ", header.PosterTime)
|
||||
log.Println("moov: ", header.SelectionTime, header.SelectionDuration)
|
||||
log.Println("moov: ", header.CurrentTime)
|
||||
log.Println("moov: ", header.NextTrackId)
|
||||
log.Println("moov: ", header.Matrix)
|
||||
header.NextTrackId = 0
|
||||
|
||||
for i, track := range moov.Tracks {
|
||||
log.Println("track", i, ":", track.Header.TrackId)
|
||||
log.Println("track", i, ":", track.Header.Duration)
|
||||
log.Println("track", i, ":", track.Header.Layer, track.Header.AlternateGroup)
|
||||
log.Println("track", i, ":", track.Header.Volume)
|
||||
log.Println("track", i, ":", track.Header.TrackWidth, track.Header.TrackHeight)
|
||||
log.Println("track", i, ":", track.Header.Matrix)
|
||||
|
||||
//media := track.Media
|
||||
}
|
||||
}
|
||||
|
||||
func Open(filename string) (file *File, err error) {
|
||||
var osfile *os.File
|
||||
if osfile, err = os.Open(filename); err != nil {
|
||||
@ -65,6 +90,7 @@ func Open(filename string) (file *File, err error) {
|
||||
if moov, err = atom.ReadMovie(ar); err != nil {
|
||||
return
|
||||
}
|
||||
changeMoov(moov)
|
||||
if err = atom.WriteMovie(outfile, moov); err != nil {
|
||||
return
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user