1
- package hevc
1
+ package internal
2
2
3
3
import (
4
- "bytes"
5
4
"fmt"
6
5
7
- "github.com/Eyevinn/mp2ts-tools/internal"
8
6
"github.com/Eyevinn/mp4ff/avc"
9
7
"github.com/Eyevinn/mp4ff/hevc"
10
8
"github.com/Eyevinn/mp4ff/sei"
@@ -17,7 +15,7 @@ type HevcPS struct {
17
15
vpsnalu []byte
18
16
spsnalu []byte
19
17
ppsnalus [][]byte
20
- Statistics internal. StreamStatistics
18
+ Statistics StreamStatistics
21
19
}
22
20
23
21
func (a * HevcPS ) setSPS (nalu []byte ) error {
@@ -48,14 +46,14 @@ func (a *HevcPS) setPPS(nalu []byte) error {
48
46
return nil
49
47
}
50
48
51
- func ParseHEVCPES (jp * internal. JsonPrinter , d * astits.DemuxerData , ps * HevcPS , o internal. Options ) (* HevcPS , error ) {
49
+ func ParseHEVCPES (jp * JsonPrinter , d * astits.DemuxerData , ps * HevcPS , o Options ) (* HevcPS , error ) {
52
50
pid := d .PID
53
51
pes := d .PES
54
52
fp := d .FirstPacket
55
53
if pes .Header .OptionalHeader .PTS == nil {
56
54
return nil , fmt .Errorf ("no PTS in PES" )
57
55
}
58
- nfd := internal. NaluFrameData {
56
+ nfd := NaluFrameData {
59
57
PID : pid ,
60
58
}
61
59
if ps == nil {
@@ -87,43 +85,12 @@ func ParseHEVCPES(jp *internal.JsonPrinter, d *astits.DemuxerData, ps *HevcPS, o
87
85
firstPS := false
88
86
for _ , nalu := range avc .ExtractNalusFromByteStream (data ) {
89
87
naluType := hevc .GetNaluType (nalu [0 ])
90
- // Handle SEI messages separately
91
- if naluType == hevc .NALU_SEI_PREFIX || naluType == hevc .NALU_SEI_SUFFIX {
92
- if ! o .ShowSEI {
93
- continue
94
- }
95
- var hdrLen = 2
96
- seiBytes := nalu [hdrLen :]
97
- buf := bytes .NewReader (seiBytes )
98
- seiDatas , err := sei .ExtractSEIData (buf )
99
- if err != nil {
100
- return nil , err
101
- }
102
-
103
- for _ , seiData := range seiDatas {
104
- var seiMsg sei.SEIMessage
105
- seiMsg , err = sei .DecodeSEIMessage (& seiData , sei .HEVC )
106
- if err != nil {
107
- fmt .Printf ("SEI: Got error %q\n " , err )
108
- continue
109
- }
110
-
111
- nfd .NALUS = append (nfd .NALUS , internal.NaluData {
112
- Type : naluType .String (),
113
- Len : len (nalu ),
114
- Data : seiMsg .String (),
115
- })
116
- }
117
-
118
- continue
119
- }
120
-
121
- // Handle other NALUs
122
88
switch naluType {
123
89
case hevc .NALU_VPS :
124
90
ps .vpsnalu = nalu
91
+ firstPS = true
125
92
case hevc .NALU_SPS :
126
- if ! firstPS {
93
+ if firstPS {
127
94
err := ps .setSPS (nalu )
128
95
if err != nil {
129
96
return nil , fmt .Errorf ("cannot set SPS" )
@@ -137,13 +104,41 @@ func ParseHEVCPES(jp *internal.JsonPrinter, d *astits.DemuxerData, ps *HevcPS, o
137
104
return nil , fmt .Errorf ("cannot set PPS" )
138
105
}
139
106
}
107
+ case hevc .NALU_SEI_PREFIX , hevc .NALU_SEI_SUFFIX :
108
+
109
+ var seiData any
110
+ if o .ShowSEIDetails && len (ps .spss ) > 0 {
111
+ sps := ps .spss [0 ]
112
+ seiMessages , err := hevc .ParseSEINalu (nalu , sps )
113
+ if err != nil {
114
+ return nil , fmt .Errorf ("cannot parse SEI NALU" )
115
+ }
116
+ parts := make ([]SeiOut , 0 , len (seiMessages ))
117
+ for _ , seiMsg := range seiMessages {
118
+ var payload any
119
+ switch seiMsg .Type () {
120
+ case sei .SEIPicTimingType :
121
+ payload = seiMsg .(* sei.PicTimingHevcSEI )
122
+ }
123
+ parts = append (parts , SeiOut {Msg : sei .SEIType (seiMsg .Type ()).String (), Payload : payload })
124
+ }
125
+ seiData = parts
126
+ } else {
127
+ seiData = nil // hex.EncodeToString(nalu)
128
+ }
129
+ nfd .NALUS = append (nfd .NALUS , NaluData {
130
+ Type : naluType .String (),
131
+ Len : len (nalu ),
132
+ Data : seiData ,
133
+ })
134
+ continue
140
135
case hevc .NALU_IDR_W_RADL , hevc .NALU_IDR_N_LP :
141
136
ps .Statistics .IDRPTS = append (ps .Statistics .IDRPTS , pts .Base )
142
137
}
143
- nfd .NALUS = append (nfd .NALUS , internal. NaluData {
138
+ nfd .NALUS = append (nfd .NALUS , NaluData {
144
139
Type : naluType .String (),
145
140
Len : len (nalu ),
146
- Data : "" ,
141
+ Data : nil ,
147
142
})
148
143
}
149
144
0 commit comments