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  }