github.com/bluenviron/mediacommon@v1.9.3/pkg/formats/mpegts/writer_test.go (about) 1 //nolint:dupl 2 package mpegts 3 4 import ( 5 "bytes" 6 "context" 7 "errors" 8 "testing" 9 10 "github.com/asticode/go-astits" 11 "github.com/stretchr/testify/require" 12 13 "github.com/bluenviron/mediacommon/pkg/codecs/h264" 14 "github.com/bluenviron/mediacommon/pkg/codecs/h265" 15 ) 16 17 func h265RandomAccessPresent(au [][]byte) bool { 18 for _, nalu := range au { 19 typ := h265.NALUType((nalu[0] >> 1) & 0b111111) 20 switch typ { 21 case h265.NALUType_IDR_W_RADL, h265.NALUType_IDR_N_LP, h265.NALUType_CRA_NUT: 22 return true 23 } 24 } 25 return false 26 } 27 28 func TestWriter(t *testing.T) { 29 for _, ca := range casesReadWriter { 30 t.Run(ca.name, func(t *testing.T) { 31 var buf bytes.Buffer 32 w := NewWriter(&buf, []*Track{ca.track}) 33 34 for _, sample := range ca.samples { 35 switch ca.track.Codec.(type) { 36 case *CodecH265: 37 err := w.WriteH26x(ca.track, sample.pts, sample.dts, h265RandomAccessPresent(sample.data), sample.data) 38 require.NoError(t, err) 39 40 case *CodecH264: 41 err := w.WriteH26x(ca.track, sample.pts, sample.dts, h264.IDRPresent(sample.data), sample.data) 42 require.NoError(t, err) 43 44 case *CodecMPEG4Video: 45 err := w.WriteMPEG4Video(ca.track, sample.pts, sample.data[0]) 46 require.NoError(t, err) 47 48 case *CodecMPEG1Video: 49 err := w.WriteMPEG1Video(ca.track, sample.pts, sample.data[0]) 50 require.NoError(t, err) 51 52 case *CodecOpus: 53 err := w.WriteOpus(ca.track, sample.pts, sample.data) 54 require.NoError(t, err) 55 56 case *CodecMPEG4Audio: 57 err := w.WriteMPEG4Audio(ca.track, sample.pts, sample.data) 58 require.NoError(t, err) 59 60 case *CodecMPEG1Audio: 61 err := w.WriteMPEG1Audio(ca.track, sample.pts, sample.data) 62 require.NoError(t, err) 63 64 case *CodecAC3: 65 err := w.WriteAC3(ca.track, sample.pts, sample.data[0]) 66 require.NoError(t, err) 67 68 default: 69 t.Errorf("unexpected") 70 } 71 } 72 73 dem := astits.NewDemuxer( 74 context.Background(), 75 &buf, 76 astits.DemuxerOptPacketSize(188)) 77 78 i := 0 79 80 for { 81 pkt, err := dem.NextPacket() 82 if errors.Is(err, astits.ErrNoMorePackets) { 83 break 84 } 85 require.NoError(t, err) 86 87 if i >= len(ca.packets) { 88 t.Errorf("missing packet: %#v", pkt) 89 break 90 } 91 92 require.Equal(t, ca.packets[i], pkt) 93 i++ 94 } 95 96 require.Equal(t, len(ca.packets), i) 97 }) 98 } 99 } 100 101 func TestWriterAutomaticPID(t *testing.T) { 102 track := &Track{ 103 Codec: &CodecH265{}, 104 } 105 106 var buf bytes.Buffer 107 NewWriter(&buf, []*Track{track}) 108 require.NotEqual(t, 0, track.PID) 109 }