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  }