Initial commit
This commit is contained in:
commit
c338840e4d
229
main.go
Normal file
229
main.go
Normal file
@ -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
|
||||
}
|
BIN
testFiles/timmy.narnian.us/00000.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00000.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00002.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00002.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00003.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00003.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00005.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00005.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00008.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00008.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00020.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00020.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00021.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00021.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00050.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00050.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00051.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00051.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00100.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00100.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00101.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00101.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00110.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00110.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00120.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00120.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00201.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00201.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00202.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00202.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00203.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00203.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00204.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00204.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00205.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00205.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00206.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00206.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00207.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00207.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00208.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00208.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00209.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00209.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00210.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00210.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00211.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00211.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00212.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00212.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00213.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00213.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00214.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00214.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00215.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00215.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00900.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00900.mpls
Normal file
Binary file not shown.
BIN
testFiles/timmy.narnian.us/00901.mpls
Normal file
BIN
testFiles/timmy.narnian.us/00901.mpls
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user