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 }