commit c338840e4d5ea706bb01ed7301fbef8019491d28 Author: lordwelch Date: Mon Mar 11 11:41:26 2019 -0700 Initial commit diff --git a/main.go b/main.go new file mode 100644 index 0000000..b265322 --- /dev/null +++ b/main.go @@ -0,0 +1,229 @@ +package main + +import ( + "bytes" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "os" +) + +const ( + ChapterSearchMask = 1 << iota + TimeSearchMask + SkipToNextPointMask + SkipBackToPreviousPointMask + ForwardPlayMask + BackwardPlayMask + PlayMask + StopMask + PauseOnMask + PauseOffMask + StillOffMask + ResumeMask + MoveUpSelectedButtonMask + MoveDownSelectedButtonMask + MoveLeftSelectedButtonMask + MoveRightSelectedButtonMask + SelectButtonMask + ActivateAndActivateMask + SelectAndActivateMask + AudioChangeMask + PgTextstChangeMask + AngleChangeMask + PopupOnMask + PopupOffMask + SelectMenuLanguageMask +) + +const ( + PlaylistRandomAccess = 1 << iota + AudioMixApp + LosslessMayBypassMixer + // reserved +) + +type MPLS struct { + Header string + playlistStart int + playlistMarkStart int + extensionDataStart int + AppInfoPlaylist AppInfoPlaylist + Playlist Playlist +} + +type AppInfoPlaylist struct { + Len int + PlaybackType int + PlaybackCount int + UOMask uint64 + AppInfoPlaylistFlags uint16 +} +type Playlist struct { + len int + NumberOfPlayItems uint16 + numberOfSubpaths uint16 + PlayItems PlayItem +} + +// reserved = 1 << (iota + 7) +const ( + IsDifferentAudios = 1 << (iota + 7) + IsSeamlessAngleChange +) + +type PlayItem struct { + len uint16 + + ClipFile string + ClipID string // M2TS + + // Reserved 11 bits + IsMultiAngle bool // (1 bit) + ConnectionCondition byte // (4 bits) + + STCID byte + InTime uint16 + OutTime uint16 + + UOMask uint64 + + RandomAccessFlag byte // 1 bit - 7 reserved + + StillMode byte + + stillTime uint16 + angleCount byte + AngleFlag byte +} + +type CLPI struct { + ClipFile string + ClipID string // M2TS + STCID byte +} + +func main() { + parse(os.Args[1]) +} +func parse(filename string) error { + var ( + buf [10]byte + n int + n64 int64 + Mpls MPLS + ) + f, err := ioutil.ReadFile(filename) + if err != nil { + return err + } + file := bytes.NewReader(f) + + n, err = file.Read(buf[:8]) + if err != nil || n != 8 { + return err + } + str := string(buf[:8]) + if str[:4] != "MPLS" { + return fmt.Errorf("%s is not an mpls file it must start with 'MPLS' it started with '%s'", filename, str[:4]) + } + if str[4:8] != "0200" { + fmt.Fprintf(os.Stderr, "warning: mpls may not work it is version %s\n", str[4:8]) + } + + Mpls.Header = str + + Mpls.playlistStart, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.playlistStart, "binary:", buf[:4]) + Mpls.playlistMarkStart, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.playlistMarkStart, "binary:", buf[:4]) + Mpls.extensionDataStart, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.extensionDataStart, "binary:", buf[:4]) + n64, err = file.Seek(20, io.SeekCurrent) + if err != nil || n64 != 20 { + return err + } + Mpls.AppInfoPlaylist.Len, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.AppInfoPlaylist.Len, "binary:", buf[:4]) + + n, err = file.Read(buf[:4]) + if err != nil || n != 1 { + return err + } + Mpls.AppInfoPlaylist.PlaybackType = int(buf[1]) + switch Mpls.AppInfoPlaylist.PlaybackType { + case 2, 3: + Mpls.AppInfoPlaylist.PlaybackCount = int(binary.BigEndian.Uint16(buf[3:4])) + fmt.Println("uint:", Mpls.AppInfoPlaylist.PlaybackCount, "binary:", buf[3:4]) + } + Mpls.AppInfoPlaylist.UOMask, err = readUInt64(file, buf[:8]) + if err != nil || n != 1 { + return err + } + Mpls.AppInfoPlaylist.AppInfoPlaylistFlags, err = readUInt16(file, buf[:2]) + if err != nil || n != 1 { + return err + } + err = Mpls.Playlist.parsePlaylist(file, int64(Mpls.playlistStart)) + if err != nil { + return err + } + return nil +} + +func (p Playlist) parsePlaylist(file io.ReadSeeker, PlaylistStart int64) error { + var ( + n64 int64 + err error + buf [10]byte + ) + n64, err = file.Seek(PlaylistStart, io.SeekStart) + if err != nil || n64 != 20 { + return err + } + fmt.Println("uint:", PlaylistStart, "binary:", buf[:4]) + p.len, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + + file.Read(buf[:5]) + return nil +} + +func readUInt16(file io.Reader, buf []byte) (uint16, error) { + n, err := file.Read(buf[:2]) + if err != nil || n != 2 { + return 0, err + } + return binary.BigEndian.Uint16(buf[:2]), nil +} + +func readInt32(file io.Reader, buf []byte) (int, error) { + n, err := file.Read(buf[:4]) + if err != nil || n != 4 { + return 0, err + } + return int(binary.BigEndian.Uint32(buf[:4])), nil +} + +func readUInt64(file io.Reader, buf []byte) (uint64, error) { + n, err := file.Read(buf[:8]) + if err != nil || n != 8 { + return 0, err + } + return binary.BigEndian.Uint64(buf[:8]), nil +} diff --git a/testFiles/timmy.narnian.us/00000.mpls b/testFiles/timmy.narnian.us/00000.mpls new file mode 100644 index 0000000..c13df53 Binary files /dev/null and b/testFiles/timmy.narnian.us/00000.mpls differ diff --git a/testFiles/timmy.narnian.us/00002.mpls b/testFiles/timmy.narnian.us/00002.mpls new file mode 100644 index 0000000..41a86e4 Binary files /dev/null and b/testFiles/timmy.narnian.us/00002.mpls differ diff --git a/testFiles/timmy.narnian.us/00003.mpls b/testFiles/timmy.narnian.us/00003.mpls new file mode 100644 index 0000000..99753a4 Binary files /dev/null and b/testFiles/timmy.narnian.us/00003.mpls differ diff --git a/testFiles/timmy.narnian.us/00005.mpls b/testFiles/timmy.narnian.us/00005.mpls new file mode 100644 index 0000000..cd72d10 Binary files /dev/null and b/testFiles/timmy.narnian.us/00005.mpls differ diff --git a/testFiles/timmy.narnian.us/00008.mpls b/testFiles/timmy.narnian.us/00008.mpls new file mode 100644 index 0000000..c230479 Binary files /dev/null and b/testFiles/timmy.narnian.us/00008.mpls differ diff --git a/testFiles/timmy.narnian.us/00020.mpls b/testFiles/timmy.narnian.us/00020.mpls new file mode 100644 index 0000000..8f91e27 Binary files /dev/null and b/testFiles/timmy.narnian.us/00020.mpls differ diff --git a/testFiles/timmy.narnian.us/00021.mpls b/testFiles/timmy.narnian.us/00021.mpls new file mode 100644 index 0000000..eece2c7 Binary files /dev/null and b/testFiles/timmy.narnian.us/00021.mpls differ diff --git a/testFiles/timmy.narnian.us/00050.mpls b/testFiles/timmy.narnian.us/00050.mpls new file mode 100644 index 0000000..939fa7e Binary files /dev/null and b/testFiles/timmy.narnian.us/00050.mpls differ diff --git a/testFiles/timmy.narnian.us/00051.mpls b/testFiles/timmy.narnian.us/00051.mpls new file mode 100644 index 0000000..7ca5f99 Binary files /dev/null and b/testFiles/timmy.narnian.us/00051.mpls differ diff --git a/testFiles/timmy.narnian.us/00100.mpls b/testFiles/timmy.narnian.us/00100.mpls new file mode 100644 index 0000000..30445d2 Binary files /dev/null and b/testFiles/timmy.narnian.us/00100.mpls differ diff --git a/testFiles/timmy.narnian.us/00101.mpls b/testFiles/timmy.narnian.us/00101.mpls new file mode 100644 index 0000000..e892cb8 Binary files /dev/null and b/testFiles/timmy.narnian.us/00101.mpls differ diff --git a/testFiles/timmy.narnian.us/00110.mpls b/testFiles/timmy.narnian.us/00110.mpls new file mode 100644 index 0000000..691a13f Binary files /dev/null and b/testFiles/timmy.narnian.us/00110.mpls differ diff --git a/testFiles/timmy.narnian.us/00120.mpls b/testFiles/timmy.narnian.us/00120.mpls new file mode 100644 index 0000000..3fc7d31 Binary files /dev/null and b/testFiles/timmy.narnian.us/00120.mpls differ diff --git a/testFiles/timmy.narnian.us/00201.mpls b/testFiles/timmy.narnian.us/00201.mpls new file mode 100644 index 0000000..42bba14 Binary files /dev/null and b/testFiles/timmy.narnian.us/00201.mpls differ diff --git a/testFiles/timmy.narnian.us/00202.mpls b/testFiles/timmy.narnian.us/00202.mpls new file mode 100644 index 0000000..9c3b0e5 Binary files /dev/null and b/testFiles/timmy.narnian.us/00202.mpls differ diff --git a/testFiles/timmy.narnian.us/00203.mpls b/testFiles/timmy.narnian.us/00203.mpls new file mode 100644 index 0000000..ce2de61 Binary files /dev/null and b/testFiles/timmy.narnian.us/00203.mpls differ diff --git a/testFiles/timmy.narnian.us/00204.mpls b/testFiles/timmy.narnian.us/00204.mpls new file mode 100644 index 0000000..ce065ca Binary files /dev/null and b/testFiles/timmy.narnian.us/00204.mpls differ diff --git a/testFiles/timmy.narnian.us/00205.mpls b/testFiles/timmy.narnian.us/00205.mpls new file mode 100644 index 0000000..9b8b8a5 Binary files /dev/null and b/testFiles/timmy.narnian.us/00205.mpls differ diff --git a/testFiles/timmy.narnian.us/00206.mpls b/testFiles/timmy.narnian.us/00206.mpls new file mode 100644 index 0000000..bf388a2 Binary files /dev/null and b/testFiles/timmy.narnian.us/00206.mpls differ diff --git a/testFiles/timmy.narnian.us/00207.mpls b/testFiles/timmy.narnian.us/00207.mpls new file mode 100644 index 0000000..e92c97a Binary files /dev/null and b/testFiles/timmy.narnian.us/00207.mpls differ diff --git a/testFiles/timmy.narnian.us/00208.mpls b/testFiles/timmy.narnian.us/00208.mpls new file mode 100644 index 0000000..56a94e2 Binary files /dev/null and b/testFiles/timmy.narnian.us/00208.mpls differ diff --git a/testFiles/timmy.narnian.us/00209.mpls b/testFiles/timmy.narnian.us/00209.mpls new file mode 100644 index 0000000..77ceed2 Binary files /dev/null and b/testFiles/timmy.narnian.us/00209.mpls differ diff --git a/testFiles/timmy.narnian.us/00210.mpls b/testFiles/timmy.narnian.us/00210.mpls new file mode 100644 index 0000000..1421428 Binary files /dev/null and b/testFiles/timmy.narnian.us/00210.mpls differ diff --git a/testFiles/timmy.narnian.us/00211.mpls b/testFiles/timmy.narnian.us/00211.mpls new file mode 100644 index 0000000..9aac2fe Binary files /dev/null and b/testFiles/timmy.narnian.us/00211.mpls differ diff --git a/testFiles/timmy.narnian.us/00212.mpls b/testFiles/timmy.narnian.us/00212.mpls new file mode 100644 index 0000000..685e7da Binary files /dev/null and b/testFiles/timmy.narnian.us/00212.mpls differ diff --git a/testFiles/timmy.narnian.us/00213.mpls b/testFiles/timmy.narnian.us/00213.mpls new file mode 100644 index 0000000..8e191a2 Binary files /dev/null and b/testFiles/timmy.narnian.us/00213.mpls differ diff --git a/testFiles/timmy.narnian.us/00214.mpls b/testFiles/timmy.narnian.us/00214.mpls new file mode 100644 index 0000000..900f85e Binary files /dev/null and b/testFiles/timmy.narnian.us/00214.mpls differ diff --git a/testFiles/timmy.narnian.us/00215.mpls b/testFiles/timmy.narnian.us/00215.mpls new file mode 100644 index 0000000..5f9a932 Binary files /dev/null and b/testFiles/timmy.narnian.us/00215.mpls differ diff --git a/testFiles/timmy.narnian.us/00900.mpls b/testFiles/timmy.narnian.us/00900.mpls new file mode 100644 index 0000000..50a21c9 Binary files /dev/null and b/testFiles/timmy.narnian.us/00900.mpls differ diff --git a/testFiles/timmy.narnian.us/00901.mpls b/testFiles/timmy.narnian.us/00901.mpls new file mode 100644 index 0000000..41aa12e Binary files /dev/null and b/testFiles/timmy.narnian.us/00901.mpls differ