Skip to content

Commit ee786e0

Browse files
committed
feat: share dev tool
1 parent 75cf569 commit ee786e0

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

cmd/mkdev/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Matroska Development Tool CLI
2+
3+
A CLI tool to inspect non-Matroska media files.
4+
5+
- [Introduction](#introduction)
6+
7+
## Introduction
8+
9+
`mkdev` stands for "Matroska Development". The name **differs** from the extension naming used for Matroska files. The most used extensions are `mkv` "Matroska Video", `mka` "Matroska Audio", and `mks` "Matroska Subtitle".
10+
11+
This library builds on top of multiple incomplete and complete documents. It was created for investigating other file formats.
12+
13+
The implementations MAY change and they use "internal" packages.

cmd/mkdev/main.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
flag "github.com/spf13/pflag"
6+
"log"
7+
"os"
8+
"path/filepath"
9+
)
10+
11+
func main() {
12+
flag.Usage = func() {
13+
fmt.Fprint(os.Stderr, `usage: mkdev <mode> <file>...
14+
modes:
15+
ogg
16+
`)
17+
}
18+
19+
flag.Parse()
20+
args := flag.Args()
21+
22+
if len(args) < 1 {
23+
flag.Usage()
24+
os.Exit(1)
25+
}
26+
27+
switch args[0] {
28+
case "ogg":
29+
files := args[1:]
30+
for _, f := range files {
31+
log.Println("=== " + filepath.Base(f))
32+
err := analyzeOggPackages(f)
33+
if err != nil {
34+
log.Fatal(err)
35+
}
36+
}
37+
}
38+
}

cmd/mkdev/ogg.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package main
2+
3+
import (
4+
"github.com/coding-socks/matroska/internal/ogg"
5+
"io"
6+
"log"
7+
"os"
8+
)
9+
10+
func analyzeOggPackages(filename string) error {
11+
f, err := os.Open(filename)
12+
if err != nil {
13+
return err
14+
}
15+
d := ogg.NewDecoder(f)
16+
streams, err := d.DecodeStreams()
17+
if err != nil {
18+
return err
19+
}
20+
log.Println("Streams:", streams)
21+
for {
22+
page, err := d.DecodePage()
23+
if err == io.EOF {
24+
break
25+
}
26+
if err != nil {
27+
return err
28+
}
29+
log.Printf("%d GranPos %d, Len %d, SegTabLen %d", page.SequenceNum, page.GranulePosition, page.FullLen, len(page.SegmentTable))
30+
}
31+
return nil
32+
}

0 commit comments

Comments
 (0)