github.com/bluenviron/mediacommon@v1.9.3/pkg/codecs/h265/dts_extractor_test.go (about)

     1  package h265
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestDTSExtractor(t *testing.T) {
    11  	type sequenceSample struct {
    12  		au  [][]byte
    13  		pts time.Duration
    14  		dts time.Duration
    15  	}
    16  
    17  	for _, ca := range []struct {
    18  		name     string
    19  		sequence []sequenceSample
    20  	}{
    21  		{
    22  			"with timing info, IDR",
    23  			[]sequenceSample{
    24  				{
    25  					[][]byte{
    26  						{ // VPS
    27  							0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60,
    28  							0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03,
    29  							0x00, 0x00, 0x03, 0x00, 0x78, 0x99, 0x98, 0x09,
    30  						},
    31  						{ // SPS
    32  							0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03,
    33  							0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
    34  							0x00, 0x78, 0xa0, 0x03, 0xc0, 0x80, 0x10, 0xe5,
    35  							0x96, 0x66, 0x69, 0x24, 0xca, 0xe0, 0x10, 0x00,
    36  							0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x01,
    37  							0xe0, 0x80,
    38  						},
    39  						{ // PPS
    40  							0x44, 0x1, 0xc1, 0x72, 0xb4, 0x62, 0x40,
    41  						},
    42  						{ // IDR_W_RADL
    43  							0x26, 0x1, 0xaf, 0x8, 0x42, 0x23, 0x48, 0x8a, 0x43, 0xe2,
    44  						},
    45  					},
    46  					0,
    47  					-66666666 * time.Nanosecond,
    48  				},
    49  				{
    50  					[][]byte{{ // TRAIL_R
    51  						0x02, 0x01, 0xd0, 0x19, 0x5f, 0x8c, 0xb4, 0x42,
    52  						0x49, 0x20, 0x40, 0x11, 0x16, 0x92, 0x93, 0xea,
    53  						0x54, 0x57, 0x4e, 0x0a,
    54  					}},
    55  					100 * time.Millisecond,
    56  					-33333333 * time.Nanosecond,
    57  				},
    58  				{
    59  					[][]byte{{ // TRAIL_R
    60  						0x02, 0x01, 0xe0, 0x44, 0x97, 0xe0, 0x81, 0x20,
    61  						0x44, 0x52, 0x62, 0x7a, 0x1b, 0x88, 0x0b, 0x21,
    62  						0x26, 0x5f, 0x10, 0x9c,
    63  					}},
    64  					66666666 * time.Nanosecond,
    65  					0,
    66  				},
    67  				{
    68  					[][]byte{{ // TRAIL_N
    69  						0x00, 0x01, 0xe0, 0x24, 0xff, 0xfa, 0x24, 0x0a,
    70  						0x42, 0x25, 0x8c, 0x18, 0xe6, 0x1c, 0xea, 0x5a,
    71  						0x5d, 0x07, 0xc1, 0x8f,
    72  					}},
    73  					33333333 * time.Nanosecond,
    74  					33333333 * time.Nanosecond,
    75  				},
    76  				{
    77  					[][]byte{{ // TRAIL_R
    78  						0x02, 0x01, 0xd0, 0x30, 0x97, 0xd7, 0xdc, 0xf9,
    79  						0x0c, 0x10, 0x11, 0x11, 0x20, 0x42, 0x11, 0x18,
    80  						0x63, 0xa5, 0x18, 0x55,
    81  					}},
    82  					200 * time.Millisecond,
    83  					66666667 * time.Nanosecond,
    84  				},
    85  				{
    86  					[][]byte{{ // TRAIL_R
    87  						0x02, 0x01, 0xe0, 0xa2, 0x25, 0xd7, 0xf7, 0x08,
    88  						0x12, 0x04, 0x45, 0xa1, 0x83, 0xc0, 0x97, 0x53,
    89  						0xa3, 0x5e, 0x78, 0x14,
    90  					}},
    91  					166666666 * time.Nanosecond,
    92  					100 * time.Millisecond,
    93  				},
    94  				{
    95  					[][]byte{{ // TRAIL_N
    96  						0x00, 0x01, 0xe0, 0x82, 0x3f, 0x5f, 0xf6, 0x89,
    97  						0x02, 0x90, 0x88, 0xa3, 0x0c, 0x7d, 0x27, 0x0c,
    98  						0xd4, 0xd9, 0xc2, 0xa5,
    99  					}},
   100  					133333333 * time.Nanosecond,
   101  					133333333 * time.Nanosecond,
   102  				},
   103  			},
   104  		},
   105  		{
   106  			"no timing info, CRA",
   107  			[]sequenceSample{
   108  				{
   109  					[][]byte{
   110  						{ // SPS
   111  							0x42, 0x01, 0x01, 0x02, 0x20, 0x00, 0x00, 0x03,
   112  							0x00, 0xb0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
   113  							0x00, 0x7b, 0xa0, 0x07, 0x82, 0x00, 0x88, 0x7d,
   114  							0xb6, 0x71, 0x8b, 0x92, 0x44, 0x80, 0x53, 0x88,
   115  							0x88, 0x92, 0xcf, 0x24, 0xa6, 0x92, 0x72, 0xc9,
   116  							0x12, 0x49, 0x22, 0xdc, 0x91, 0xaa, 0x48, 0xfc,
   117  							0xa2, 0x23, 0xff, 0x00, 0x01, 0x00, 0x01, 0x6a,
   118  							0x02, 0x02, 0x02, 0x01,
   119  						},
   120  						{ // PPS
   121  							0x44, 0x01, 0xc0, 0x25, 0x2f, 0x05, 0x32, 0x40,
   122  						},
   123  						{
   124  							byte(NALUType_CRA_NUT) << 1,
   125  						},
   126  					},
   127  					1 * time.Second,
   128  					1 * time.Second,
   129  				},
   130  			},
   131  		},
   132  		{
   133  			"short_term_ref_pic_set_sps_flag",
   134  			[]sequenceSample{
   135  				{
   136  					[][]byte{
   137  						{ // VPS
   138  							0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x40,
   139  							0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03,
   140  							0x00, 0x00, 0x03, 0x00, 0x99, 0xa5, 0x02, 0x40,
   141  						},
   142  						{ // SPS
   143  							0x42, 0x01, 0x01, 0x01, 0x40, 0x00, 0x00, 0x03,
   144  							0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
   145  							0x00, 0x99, 0xa0, 0x03, 0xc0, 0x80, 0x10, 0xe5,
   146  							0x8d, 0xa5, 0x92, 0x42, 0x36, 0x22, 0xec, 0xb8,
   147  							0x80, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00,
   148  							0x00, 0x05, 0x0f, 0xe2, 0xc4, 0xa0,
   149  						},
   150  						{ // PPS
   151  							0x44, 0x01, 0xc0, 0xe0, 0x98, 0x93, 0x03, 0x05,
   152  							0x14, 0x90,
   153  						},
   154  						{ // IDR
   155  							0x26, 0x01, 0xaf, 0x3e, 0x3d, 0x3a, 0xca, 0xc0,
   156  							0xf2, 0x2f, 0xc3, 0x0f, 0x86, 0x9f, 0xed, 0xfc,
   157  							0x67, 0x2f, 0x62, 0x69,
   158  						},
   159  					},
   160  					1113436 * time.Nanosecond,
   161  					-48886564 * time.Nanosecond,
   162  				},
   163  				{
   164  					[][]byte{
   165  						{ // TRAIL_R
   166  							0x02, 0x02, 0xd0, 0x00, 0x0c, 0xc6, 0x27, 0xfe,
   167  							0x6e, 0x6d, 0xe8, 0x10, 0xd5, 0xce, 0x61, 0x1b,
   168  							0x66, 0xf6, 0x21, 0x59,
   169  						},
   170  					},
   171  					68113436 * time.Nanosecond,
   172  					18113436 * time.Nanosecond,
   173  				},
   174  				{
   175  					[][]byte{
   176  						{ // TRAIL_R
   177  							0x02, 0x02, 0xd0, 0x00, 0x14, 0xc6, 0x7c, 0xfe,
   178  							0x83, 0x29, 0x34, 0xba, 0xce, 0xaa, 0x8b, 0x76,
   179  							0xb0, 0x95, 0x67, 0xb2,
   180  						},
   181  					},
   182  					101113436 * time.Nanosecond,
   183  					51113436 * time.Nanosecond,
   184  				},
   185  			},
   186  		},
   187  	} {
   188  		t.Run(ca.name, func(t *testing.T) {
   189  			ex := NewDTSExtractor()
   190  			for _, sample := range ca.sequence {
   191  				dts, err := ex.Extract(sample.au, sample.pts)
   192  				require.NoError(t, err)
   193  				require.Equal(t, sample.dts, dts)
   194  			}
   195  		})
   196  	}
   197  }
   198  
   199  func FuzzDTSExtractor(f *testing.F) {
   200  	sps := []byte{
   201  		0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03,
   202  		0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03,
   203  		0x00, 0x78, 0xa0, 0x03, 0xc0, 0x80, 0x10, 0xe5,
   204  		0x96, 0x66, 0x69, 0x24, 0xca, 0xe0, 0x10, 0x00,
   205  		0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x01,
   206  		0xe0, 0x80,
   207  	}
   208  
   209  	pps := []byte{
   210  		0x44, 0x01, 0xc1, 0x72, 0xb4, 0x62, 0x40,
   211  	}
   212  
   213  	ex := NewDTSExtractor()
   214  	f.Fuzz(func(_ *testing.T, b []byte, p uint64) {
   215  		if len(b) < 1 {
   216  			return
   217  		}
   218  		ex.Extract([][]byte{sps, pps, b}, time.Duration(p)) //nolint:errcheck
   219  	})
   220  }