Skip to content

Commit

Permalink
Merge branch 'release/Release/v1.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
matsuuram committed Jun 6, 2019
2 parents 19f65ab + 082e335 commit 2707a59
Show file tree
Hide file tree
Showing 13 changed files with 393 additions and 64 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@
*.m2ts
.vscode
debug
main
MpegTsAnalyzer
209 changes: 207 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ It can parse TS header, Adaptation Field, PSI(PAT/PMT) and PES header. Then, it
Default, it is dump each timestamps(PCR/PTS/DTS) that include PCR interval and PTS PCR gap. If you want to dump more detail, please add each command line flags.

```
usage: main.exe [<flags>] <input>
usage: MpegTsAnalyzer [<flags>] <input>
Flags:
--help Show context-sensitive help (also try --help-long
Expand All @@ -18,8 +18,213 @@ Flags:
--dump-ts-payload Dump TS packet payload binary.
--dump-adaptation-field Dump TS packet adaptation_field detail.
--dump-psi Dump PSI(PAT/PMT) detail.
-n, --not-dump-timestamp Not Dump PCR/PTS/DTS timestamps.
-t, --dump-timestamp Dump PCR/PTS/DTS timestamps.
Args:
<input> Input file name.
```

# Result Examples

## No option

```
$ ./MpegTsAnalyzer ColorBar_4Mbps_1280x720_2997p.m2t
Input file: ColorBar_4Mbps_1280x720_2997p.m2t
Detected PAT: PMT pid = 0x100
Detected PMT
PMT : Program Info : elementary_PID : 0x200, stream_type : 0x1b (AVC video stream as defined in ITU-T Rec. H.264|ISO/IEC 14496-10 Video)
PMT : Program Info : elementary_PID : 0x201, stream_type : 0x11 (14496-3 audio with LATM transport syntax as defined in ISO/IEC 14496-3 / AMD 1)
```

## Dump TS header

```
$ ./MpegTsAnalyzer ColorBar_4Mbps_1280x720_2997p.m2t --dump-ts-header
Input file: ColorBar_4Mbps_1280x720_2997p.m2t
===============================================================
TS Header
===============================================================
transport_error_indicator : 0
payload_unit_start_indicator : 1
transport_priority : 1
pid : 0x0
transport_scrambling_control : 0
adaptation_field_control : 1
continuity_counter : 0
===============================================================
TS Header
===============================================================
transport_error_indicator : 0
payload_unit_start_indicator : 1
transport_priority : 1
pid : 0x100
transport_scrambling_control : 0
adaptation_field_control : 1
continuity_counter : 0
===============================================================
TS Header
===============================================================
transport_error_indicator : 0
payload_unit_start_indicator : 0
transport_priority : 0
pid : 0x101
transport_scrambling_control : 0
adaptation_field_control : 2
continuity_counter : 0
===============================================================
TS Header
===============================================================
transport_error_indicator : 0
payload_unit_start_indicator : 1
transport_priority : 0
pid : 0x200
transport_scrambling_control : 0
adaptation_field_control : 1
continuity_counter : 0
```

## Dump

```
$ ./MpegTsAnalyzer ColorBar_4Mbps_1280x720_2997p.m2t --dump-ts-payload
Input file: ColorBar_4Mbps_1280x720_2997p.m2t
===============================================================
Dump TS Data
===============================================================
1: 47 60 00 10 00 00 b0 0d 00 00 c1 00 00 00 01 e1 00 b3 58 82
2: b7 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
3: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
4: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
5: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
6: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
7: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
8: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
9: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff
===============================================================
Dump TS Data
===============================================================
1: 47 61 00 10 00 02 b0 17 00 01 c1 00 00 e1 01 f0 00 1b e2 00
2: f0 00 11 e2 01 f0 00 c5 82 fb 7e ff ff ff ff ff ff ff ff ff
3: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
4: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
5: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
6: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
7: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
8: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
9: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff
```

## Dump adaptation field

```
$ ./MpegTsAnalyzer ColorBar_4Mbps_1280x720_2997p.m2t --dump-adaptation-field
Input file: ColorBar_4Mbps_1280x720_2997p.m2t
===========================================
Adaptation Field
===========================================
Adaptation Field : adaptation_field_length : 183
Adaptation Field : discontinuity_indicator : 0
Adaptation Field : random_access_indicator : 0
Adaptation Field : elementary_stream_priority_indicator : 0
Adaptation Field : PCR_flag : 1
Adaptation Field : OPCR_flag : 0
Adaptation Field : splicing_point_flag : 0
Adaptation Field : adaptation_field_extension_flag : 0
Adaptation Field : program_clock_reference_base : 45
Adaptation Field : program_clock_reference_extension : 185
Adaptation Field : PCR 0x3575[0.506852ms]
===========================================
Adaptation Field
===========================================
Adaptation Field : adaptation_field_length : 8
Adaptation Field : discontinuity_indicator : 0
Adaptation Field : random_access_indicator : 0
Adaptation Field : elementary_stream_priority_indicator : 0
Adaptation Field : PCR_flag : 0
Adaptation Field : OPCR_flag : 0
Adaptation Field : splicing_point_flag : 0
Adaptation Field : adaptation_field_extension_flag : 0
```

## Dump PSI

```
$ ./MpegTsAnalyzer ColorBar_4Mbps_1280x720_2997p.m2t --dump-psi
Input file: ColorBar_4Mbps_1280x720_2997p.m2t
Detected PAT: PMT pid = 0x100
===========================================
PAT
===========================================
PAT : table_id : 0x0
PAT : section_syntax_indicator : 1
PAT : section_length : 13
PAT : transport_stream_id : 0
PAT : version_number : 0
PAT : current_next_indicator : 1
PAT : section_number : 0
PAT : last_section_number : 0
PAT : program_number : 1
PAT : program_map_PID : 0x100
PAT : CRC_32 : b35882b7
Detected PMT
===========================================
PMT
===========================================
PMT : table_id : 0x2
PMT : section_syntax_indicator : 1
PMT : section_length : 23
PMT : program_number : 1
PMT : version_number : 0
PMT : current_next_indicator : 1
PMT : section_number : 0
PMT : last_section_number : 0
PMT : PCR_PID : 0x101
PMT : program_info_length : 0
PMT : Program Info : elementary_PID : 0x200, stream_type : 0x1b (AVC video stream as defined in ITU-T Rec. H.264|ISO/IEC 14496-10 Video)
PMT : Program Info : elementary_PID : 0x201, stream_type : 0x11 (14496-3 audio with LATM transport syntax as defined in ISO/IEC 14496-3 / AMD 1)
PMT : CRC_32 : c582fb7e
```

## Dump timestamp

```
$ ./MpegTsAnalyzer ColorBar_4Mbps_1280x720_2997p.m2t --dump-timestamp
Input file: ColorBar_4Mbps_1280x720_2997p.m2t
Detected PAT: PMT pid = 0x100
Detected PMT
PMT : Program Info : elementary_PID : 0x200, stream_type : 0x1b (AVC video stream as defined in ITU-T Rec. H.264|ISO/IEC 14496-10 Video)
PMT : Program Info : elementary_PID : 0x201, stream_type : 0x11 (14496-3 audio with LATM transport syntax as defined in ISO/IEC 14496-3 / AMD 1)
0x00000178 PCR: 0x00003575[00000.506852ms] (Interval:00000.506852ms)
0x00000814 PTS: 0x00013554[00879.866638ms] (pid:0x201) (delay:877.078979ms)
0x00001028 PTS: 0x00013cd4[00901.200012ms] (pid:0x201) (delay:895.624634ms)
0x00001b2c PTS: 0x00014454[00922.533325ms] (pid:0x201) (delay:913.156555ms)
0x00000234 DTS: 0x00012999[00846.500000ms] (pid:0x200) (delay:845.739746ms)
0x00002340 PTS: 0x00014bd4[00943.866638ms] (pid:0x201) (delay:931.702209ms)
0x00002574 DTS: 0x00013554[00879.866638ms] (pid:0x200) (delay:866.941895ms)
0x00002a98 PTS: 0x00015354[00965.200012ms] (pid:0x201) (delay:950.501282ms)
0x000032ac PTS: 0x00015ad4[00986.533325ms] (pid:0x201) (delay:969.046936ms)
0x000031f0 DTS: 0x0001410f[00913.233337ms] (pid:0x200) (delay:896.000366ms)
0x00003cf4 DTS: 0x00014cca[00946.599976ms] (pid:0x200) (delay:925.565613ms)
0x000058dc PCR: 0x000ca24c[00030.665926ms] (Interval:00030.159074ms)
0x00003a04 PTS: 0x00016254[01007.866638ms] (pid:0x201) (delay:987.846008ms)
0x000055ec DTS: 0x00015885[00979.966675ms] (pid:0x200) (delay:950.314514ms)
(Partially omitted)
0x01917fdc PCR: 0x3915c1de[35471.377704ms] (Interval:00030.159074ms)
0x01912644 PTS: 0x003157d4[35930.535156ms] (pid:0x201) (delay:490.078125ms)
0x0191d740 PCR: 0x39222eb5[35501.536778ms] (Interval:00030.159074ms)
0x0191a1a4 PTS: 0x00315f54[35951.867188ms] (pid:0x201) (delay:468.832031ms)
-----------------------------
Max PCR interval: 30.412519ms
PCR-PTS max gap: 990.001953ms
```
19 changes: 13 additions & 6 deletions circle.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
machine:
timezone:
Asia/Tokyo
test:
override:
- go test ./...
version: 2
jobs:
build:
working_directory: /home/circleci/go/src/github.com/small-teton/MpegTsAnalyzer
environment:
GOPATH: /home/circleci/go
docker:
- image: circleci/golang:1.11
steps:
- run: echo 'export PATH=${GOPATH}/bin/:${PATH}' >> $BASH_ENV
- checkout
- run: go get -t -d -v ./...
- run: go test -v -race ./...
32 changes: 25 additions & 7 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,27 @@ import (

const tsPacketSize = 188

var (
dumpHeader = kingpin.Flag("dump-ts-header", "Dump TS packet header.").Bool()
dumpPayload = kingpin.Flag("dump-ts-payload", "Dump TS packet payload binary.").Bool()
dumpAdaptationField = kingpin.Flag("dump-adaptation-field", "Dump TS packet adaptation_field detail.").Bool()
dumpPsi = kingpin.Flag("dump-psi", "Dump PSI(PAT/PMT) detail.").Bool()
dumpPesHeader = kingpin.Flag("dump-pes-header", "Dump PES packet header detail.").Bool()
dumpTimestamp = kingpin.Flag("dump-timestamp", "Dump PCR/PTS/DTS timestamps.").Short('t').Bool()
)

func main() {
var options options.Options
filename := kingpin.Arg("input", "Input file name.").Required().String()
options.SetDumpHeader(*kingpin.Flag("dump-ts-header", "Dump TS packet header.").Bool())
options.SetDumpPayload(*kingpin.Flag("dump-ts-payload", "Dump TS packet payload binary.").Bool())
options.SetDumpAdaptationField(*kingpin.Flag("dump-adaptation-field", "Dump TS packet adaptation_field detail.").Bool())
options.SetDumpPsi(*kingpin.Flag("dump-psi", "Dump PSI(PAT/PMT) detail.").Bool())
options.SetNotDumpTimestamp(*kingpin.Flag("not-dump-timestamp", "Not Dump PCR/PTS/DTS timestamps.").Short('n').Bool())
kingpin.Parse()

var options options.Options
options.SetDumpHeader(*dumpHeader)
options.SetDumpPayload(*dumpPayload)
options.SetDumpAdaptationField(*dumpAdaptationField)
options.SetDumpPsi(*dumpPsi)
options.SetDumpPesHeader(*dumpPesHeader)
options.SetDumpTimestamp(*dumpTimestamp)

if err := parseTsFile(*filename, options); err != nil {
os.Exit(1)
}
Expand Down Expand Up @@ -68,6 +79,9 @@ func parseTsFile(filename string, options options.Options) error {
return fmt.Errorf("File seek error: %s", err)
}
fmt.Printf("Detected PAT: PMT pid = 0x%02x\n", pmtPid)
if options.DumpPsi() {
pat.Dump()
}

// Parse PMT
err = tsparser.BufferPsi(file, &pos, pmtPid, pmt, options)
Expand All @@ -82,7 +96,11 @@ func parseTsFile(filename string, options options.Options) error {
return fmt.Errorf("File seek error: %s", err)
}
fmt.Println("Detected PMT")
pmt.DumpProgramInfos()
if options.DumpPsi() {
pmt.Dump()
} else {
pmt.DumpProgramInfos()
}

err = tsparser.BufferPes(file, &pos, pcrPid, programs, options)
if err != nil {
Expand Down
15 changes: 11 additions & 4 deletions options/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ type Options struct {
dumpPayload bool
dumpAdaptationField bool
dumpPsi bool
notDumpTimestamp bool
dumpPesHeader bool
dumpTimestamp bool
}

// DumpHeader return flag data "--dump-ts-header"
Expand All @@ -21,8 +22,11 @@ func (o *Options) DumpAdaptationField() bool { return o.dumpAdaptationField }
// DumpPsi return flag data "--dump-psi"
func (o *Options) DumpPsi() bool { return o.dumpPsi }

// DumpPesHeader return flag data "--dump-pes-header"
func (o *Options) DumpPesHeader() bool { return o.dumpPesHeader }

// NotDumpTimestamp return flag data "--not-dump-timestamp"
func (o *Options) NotDumpTimestamp() bool { return o.notDumpTimestamp }
func (o *Options) DumpTimestamp() bool { return o.dumpTimestamp }

// SetDumpHeader set value to "--dump-ts-header"
func (o *Options) SetDumpHeader(v bool) { o.dumpHeader = v }
Expand All @@ -36,5 +40,8 @@ func (o *Options) SetDumpAdaptationField(v bool) { o.dumpAdaptationField = v }
// SetDumpPsi set value to "--dump-psi"
func (o *Options) SetDumpPsi(v bool) { o.dumpPsi = v }

// SetNotDumpTimestamp set value to "--not-dump-timestamp"
func (o *Options) SetNotDumpTimestamp(v bool) { o.notDumpTimestamp = v }
// SetDumpPesHeader set value to "--dump-pes-header"
func (o *Options) SetDumpPesHeader(v bool) { o.dumpPesHeader = v }

// SetDumpTimestamp set value to "--dump-timestamp"
func (o *Options) SetDumpTimestamp(v bool) { o.dumpTimestamp = v }
Loading

0 comments on commit 2707a59

Please sign in to comment.