github.com/cnotch/ipchub@v1.1.0/av/format/mpegts/h264_packetizer.go (about) 1 // Copyright (c) 2019,CAOHONGJU All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package mpegts 6 7 import ( 8 "time" 9 10 "github.com/cnotch/ipchub/av/codec" 11 "github.com/cnotch/ipchub/av/codec/h264" 12 ) 13 14 type h264Packetizer struct { 15 meta *codec.VideoMeta 16 tsframeWriter FrameWriter 17 } 18 19 func NewH264Packetizer(meta *codec.VideoMeta, tsframeWriter FrameWriter) Packetizer { 20 h264p := &h264Packetizer{ 21 meta: meta, 22 tsframeWriter: tsframeWriter, 23 } 24 return h264p 25 } 26 27 func (h264p *h264Packetizer) Packetize(frame *codec.Frame) error { 28 nalType := frame.Payload[0] & 0x1F 29 30 dts := frame.Dts * 90000 / int64(time.Second) // 90000Hz 31 pts := frame.Pts * 90000 / int64(time.Second) // 90000Hz 32 // set fields 33 tsframe := &Frame{ 34 Pid: tsVideoPid, 35 StreamID: tsVideoAvc, 36 Dts: dts, 37 Pts: pts, 38 Payload: frame.Payload, 39 key: nalType == h264.NalIdrSlice, 40 } 41 42 tsframe.prepareAvcHeader(h264p.meta.Sps, h264p.meta.Pps) 43 44 return h264p.tsframeWriter.WriteMpegtsFrame(tsframe) 45 }