github.com/bluenviron/mediacommon@v1.9.3/pkg/codecs/h264/avcc_test.go (about)

     1  package h264
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  )
     8  
     9  var casesAVCC = []struct {
    10  	name string
    11  	enc  []byte
    12  	dec  [][]byte
    13  }{
    14  	{
    15  		"single",
    16  		[]byte{
    17  			0x00, 0x00, 0x00, 0x03,
    18  			0xaa, 0xbb, 0xcc,
    19  		},
    20  		[][]byte{
    21  			{0xaa, 0xbb, 0xcc},
    22  		},
    23  	},
    24  	{
    25  		"multiple",
    26  		[]byte{
    27  			0x00, 0x00, 0x00, 0x02,
    28  			0xaa, 0xbb,
    29  			0x00, 0x00, 0x00, 0x02,
    30  			0xcc, 0xdd,
    31  			0x00, 0x00, 0x00, 0x02,
    32  			0xee, 0xff,
    33  		},
    34  		[][]byte{
    35  			{0xaa, 0xbb},
    36  			{0xcc, 0xdd},
    37  			{0xee, 0xff},
    38  		},
    39  	},
    40  }
    41  
    42  func TestAVCCUnmarshal(t *testing.T) {
    43  	for _, ca := range casesAVCC {
    44  		t.Run(ca.name, func(t *testing.T) {
    45  			dec, err := AVCCUnmarshal(ca.enc)
    46  			require.NoError(t, err)
    47  			require.Equal(t, ca.dec, dec)
    48  		})
    49  	}
    50  }
    51  
    52  // issue mediamtx/2375
    53  func TestAVCCUnmarshalEmpty(t *testing.T) {
    54  	dec, err := AVCCUnmarshal([]byte{
    55  		0x0, 0x0, 0x0, 0x0,
    56  	})
    57  
    58  	require.Equal(t, ErrAVCCNoNALUs, err)
    59  	require.Equal(t, [][]byte(nil), dec)
    60  
    61  	dec, err = AVCCUnmarshal([]byte{
    62  		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x2, 0x3,
    63  	})
    64  
    65  	require.NoError(t, err)
    66  	require.Equal(t, [][]byte{
    67  		{1, 2, 3},
    68  	}, dec)
    69  }
    70  
    71  func TestAVCCMarshal(t *testing.T) {
    72  	for _, ca := range casesAVCC {
    73  		t.Run(ca.name, func(t *testing.T) {
    74  			enc, err := AVCCMarshal(ca.dec)
    75  			require.NoError(t, err)
    76  			require.Equal(t, ca.enc, enc)
    77  		})
    78  	}
    79  }
    80  
    81  func FuzzAVCCUnmarshal(f *testing.F) {
    82  	f.Fuzz(func(_ *testing.T, b []byte) {
    83  		AVCCUnmarshal(b) //nolint:errcheck
    84  	})
    85  }