47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package raw
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
|
|
"github.com/deepch/vdk/codec/h265parser"
|
|
|
|
"github.com/deepch/vdk/codec/h264parser"
|
|
|
|
"github.com/deepch/vdk/av"
|
|
)
|
|
|
|
var startCode = []byte{0, 0, 0, 1}
|
|
|
|
type Muxer struct {
|
|
idx int8
|
|
w io.WriteSeeker
|
|
}
|
|
|
|
func NewMuxer(v io.WriteSeeker) *Muxer {
|
|
return &Muxer{w: v}
|
|
}
|
|
func (element *Muxer) WriteHeader(streams []av.CodecData) (err error) {
|
|
for i, stream := range streams {
|
|
switch stream.Type() {
|
|
case av.H264:
|
|
_, err = element.w.Write(append(startCode, bytes.Join([][]byte{stream.(h264parser.CodecData).SPS(), stream.(h264parser.CodecData).PPS()}, startCode)...))
|
|
element.idx = int8(i)
|
|
case av.H265:
|
|
_, err = element.w.Write(append(startCode, bytes.Join([][]byte{stream.(h265parser.CodecData).SPS(), stream.(h265parser.CodecData).PPS(), stream.(h265parser.CodecData).VPS()}, startCode)...))
|
|
element.idx = int8(i)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
func (element *Muxer) WritePacket(pkt *av.Packet) (err error) {
|
|
if pkt.Idx == element.idx {
|
|
_, err = element.w.Write(startCode)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = element.w.Write(pkt.Data[4:])
|
|
}
|
|
return
|
|
}
|