1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
21
30
31
33 const char *
name,
const int *subscripts,
34 uint32_t *write_to,
35 uint32_t range_min, uint32_t range_max)
36 {
39 unsigned int k;
41
43
44 for (
i = 0;
i < 32;
i++) {
47 "%s: bitstream ended.\n",
name);
49 }
51 bits[
i] = k ?
'1' :
'0';
52 if (k)
53 break;
54 }
57 "%s: more than 31 zeroes.\n",
name);
59 }
61 for (j = 0; j <
i; j++) {
63 bits[
i + j + 1] = k ?
'1' :
'0';
65 }
68
69 if (
ctx->trace_enable)
72
73 if (value < range_min || value > range_max) {
75 "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
78 }
79
81 return 0;
82 }
83
85 const char *
name,
const int *subscripts,
88 {
91 unsigned int k;
92 uint32_t v;
94
96
97 for (
i = 0;
i < 32;
i++) {
100 "%s: bitstream ended.\n",
name);
102 }
104 bits[
i] = k ?
'1' :
'0';
105 if (k)
106 break;
107 }
110 "%s: more than 31 zeroes.\n",
name);
112 }
113 v = 1;
114 for (j = 0; j <
i; j++) {
116 bits[
i + j + 1] = k ?
'1' :
'0';
117 v = v << 1 | k;
118 }
120 if (v & 1)
122 else
124
125 if (
ctx->trace_enable)
128
129 if (value < range_min || value > range_max) {
131 "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
134 }
135
137 return 0;
138 }
139
141 const char *
name,
const int *subscripts,
143 uint32_t range_min, uint32_t range_max)
144 {
146
147 if (value < range_min || value > range_max) {
149 "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
152 }
154
158
159 if (
ctx->trace_enable) {
162
169
172 }
173
177 else
179
180 return 0;
181 }
182
184 const char *
name,
const int *subscripts,
187 {
189 uint32_t uvalue;
190
191 if (value < range_min || value > range_max) {
193 "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
196 }
198
200 uvalue = 0;
202 uvalue = 2 * (uint32_t)
value - 1;
203 else
204 uvalue = 2 * (uint32_t)-
value;
205
209
210 if (
ctx->trace_enable) {
213
218 bits[
len +
i + 1] = (uvalue + 1) >> (
len -
i - 1) & 1 ?
'1' :
'0';
220
223 }
224
228 else
230
231 return 0;
232 }
233
234 // payload_extension_present() - true if we are before the last 1-bit
235 // in the payload structure, which must be in the last byte.
237 int cur_pos)
238 {
239 int bits_left = payload_size * 8 - cur_pos;
240 return (bits_left > 0 &&
242 }
243
244 #define HEADER(name) do { \
245 ff_cbs_trace_header(ctx, name); \
246 } while (0)
247
248 #define CHECK(call) do { \
249 err = (call); \
250 if (err < 0) \
251 return err; \
252 } while (0)
253
254 #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
255 #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
256 #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
257 #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
258 #define FUNC_SEI(name) FUNC_NAME1(READWRITE, sei, name)
259
260 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
261
262 #define u(width, name, range_min, range_max) \
263 xu(width, name, current->name, range_min, range_max, 0, )
264 #define ub(width, name) \
265 xu(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
266 #define flag(name) ub(1, name)
267 #define ue(name, range_min, range_max) \
268 xue(name, current->name, range_min, range_max, 0, )
269 #define i(width, name, range_min, range_max) \
270 xi(width, name, current->name, range_min, range_max, 0, )
271 #define ib(width, name) \
272 xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), 0, )
273 #define se(name, range_min, range_max) \
274 xse(name, current->name, range_min, range_max, 0, )
275
276 #define us(width, name, range_min, range_max, subs, ...) \
277 xu(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
278 #define ubs(width, name, subs, ...) \
279 xu(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
280 #define flags(name, subs, ...) \
281 xu(1, name, current->name, 0, 1, subs, __VA_ARGS__)
282 #define ues(name, range_min, range_max, subs, ...) \
283 xue(name, current->name, range_min, range_max, subs, __VA_ARGS__)
284 #define is(width, name, range_min, range_max, subs, ...) \
285 xi(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
286 #define ibs(width, name, subs, ...) \
287 xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), subs, __VA_ARGS__)
288 #define ses(name, range_min, range_max, subs, ...) \
289 xse(name, current->name, range_min, range_max, subs, __VA_ARGS__)
290
291 #define fixed(width, name, value) do { \
292 av_unused uint32_t fixed_value = value; \
293 xu(width, name, fixed_value, value, value, 0, ); \
294 } while (0)
295
296
298 #define READWRITE read
299 #define RWContext GetBitContext
300
301 #define xu(width, name, var, range_min, range_max, subs, ...) do { \
302 uint32_t value; \
303 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
304 SUBSCRIPTS(subs, __VA_ARGS__), \
305 &value, range_min, range_max)); \
306 var = value; \
307 } while (0)
308 #define xue(name, var, range_min, range_max, subs, ...) do { \
309 uint32_t value; \
310 CHECK(cbs_read_ue_golomb(ctx, rw, #name, \
311 SUBSCRIPTS(subs, __VA_ARGS__), \
312 &value, range_min, range_max)); \
313 var = value; \
314 } while (0)
315 #define xi(width, name, var, range_min, range_max, subs, ...) do { \
316 int32_t value; \
317 CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
318 SUBSCRIPTS(subs, __VA_ARGS__), \
319 &value, range_min, range_max)); \
320 var = value; \
321 } while (0)
322 #define xse(name, var, range_min, range_max, subs, ...) do { \
323 int32_t value; \
324 CHECK(cbs_read_se_golomb(ctx, rw, #name, \
325 SUBSCRIPTS(subs, __VA_ARGS__), \
326 &value, range_min, range_max)); \
327 var = value; \
328 } while (0)
329
330
331 #define infer(name, value) do { \
332 current->name = value; \
333 } while (0)
334
336 {
338 if (bits_left > 8)
339 return 1;
340 if (bits_left == 0)
341 return 0;
343 return 1;
344 return 0;
345 }
346
347 #define more_rbsp_data(var) ((var) = cbs_h2645_read_more_rbsp_data(rw))
348
349 #define bit_position(rw) (get_bits_count(rw))
350 #define byte_alignment(rw) (get_bits_count(rw) % 8)
351
352 #define allocate(name, size) do { \
353 name ## _ref = av_buffer_allocz(size + \
354 AV_INPUT_BUFFER_PADDING_SIZE); \
355 if (!name ## _ref) \
356 return AVERROR(ENOMEM); \
357 name = name ## _ref->data; \
358 } while (0)
359
360 #define FUNC(name) FUNC_SEI(name)
362 #undef FUNC
363
364 #define FUNC(name) FUNC_H264(name)
366 #undef FUNC
367
368 #define FUNC(name) FUNC_H265(name)
370 #undef FUNC
371
372 #undef READ
373 #undef READWRITE
374 #undef RWContext
375 #undef xu
376 #undef xi
377 #undef xue
378 #undef xse
379 #undef infer
380 #undef more_rbsp_data
381 #undef bit_position
382 #undef byte_alignment
383 #undef allocate
384
385
387 #define READWRITE write
388 #define RWContext PutBitContext
389
390 #define xu(width, name, var, range_min, range_max, subs, ...) do { \
391 uint32_t value = var; \
392 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
393 SUBSCRIPTS(subs, __VA_ARGS__), \
394 value, range_min, range_max)); \
395 } while (0)
396 #define xue(name, var, range_min, range_max, subs, ...) do { \
397 uint32_t value = var; \
398 CHECK(cbs_write_ue_golomb(ctx, rw, #name, \
399 SUBSCRIPTS(subs, __VA_ARGS__), \
400 value, range_min, range_max)); \
401 } while (0)
402 #define xi(width, name, var, range_min, range_max, subs, ...) do { \
403 int32_t value = var; \
404 CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
405 SUBSCRIPTS(subs, __VA_ARGS__), \
406 value, range_min, range_max)); \
407 } while (0)
408 #define xse(name, var, range_min, range_max, subs, ...) do { \
409 int32_t value = var; \
410 CHECK(cbs_write_se_golomb(ctx, rw, #name, \
411 SUBSCRIPTS(subs, __VA_ARGS__), \
412 value, range_min, range_max)); \
413 } while (0)
414
415 #define infer(name, value) do { \
416 if (current->name != (value)) { \
417 av_log(ctx->log_ctx, AV_LOG_ERROR, \
418 "%s does not match inferred value: " \
419 "%"PRId64", but should be %"PRId64".\n", \
420 #name, (int64_t)current->name, (int64_t)(value)); \
421 return AVERROR_INVALIDDATA; \
422 } \
423 } while (0)
424
425 #define more_rbsp_data(var) (var)
426
427 #define bit_position(rw) (put_bits_count(rw))
428 #define byte_alignment(rw) (put_bits_count(rw) % 8)
429
430 #define allocate(name, size) do { \
431 if (!name) { \
432 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s must be set " \
433 "for writing.\n", #name); \
434 return AVERROR_INVALIDDATA; \
435 } \
436 } while (0)
437
438 #define FUNC(name) FUNC_SEI(name)
440 #undef FUNC
441
442 #define FUNC(name) FUNC_H264(name)
444 #undef FUNC
445
446 #define FUNC(name) FUNC_H265(name)
448 #undef FUNC
449
450 #undef WRITE
451 #undef READWRITE
452 #undef RWContext
453 #undef xu
454 #undef xi
455 #undef xue
456 #undef xse
457 #undef u
458 #undef i
459 #undef flag
460 #undef ue
461 #undef se
462 #undef infer
463 #undef more_rbsp_data
464 #undef bit_position
465 #undef byte_alignment
466 #undef allocate
467
468
472 {
474
479
481 continue;
482
483 // Remove trailing zeroes.
488 continue;
489 }
490
493
496 if (err < 0)
497 return err;
498 }
499
500 return 0;
501 }
502
506 {
510 int err;
511
514 return 0;
515
517 // AVCC header.
518 size_t size, start, end;
520
522
524
527
528 version = bytestream2_get_byte(&gbc);
533 }
534
537
538 // SPS array.
539 count = bytestream2_get_byte(&gbc) & 0x1f;
541 for (
i = 0;
i < count;
i++) {
544 size = bytestream2_get_be16(&gbc);
548 }
550
552 frag->
data + start, end - start,
554 if (err < 0) {
556 return err;
557 }
559 if (err < 0)
560 return err;
561
562 // PPS array.
563 count = bytestream2_get_byte(&gbc);
565 for (
i = 0;
i < count;
i++) {
568 size = bytestream2_get_be16(&gbc);
572 }
574
576 frag->
data + start, end - start,
578 if (err < 0) {
580 return err;
581 }
583 if (err < 0)
584 return err;
585
589 }
590
592 // HVCC header.
593 size_t size, start, end;
594 int i, j, nb_arrays, nal_unit_type, nb_nals,
version;
595
597
599
602
603 version = bytestream2_get_byte(&gbc);
608 }
609
612
613 nb_arrays = bytestream2_get_byte(&gbc);
614 for (
i = 0;
i < nb_arrays;
i++) {
615 nal_unit_type = bytestream2_get_byte(&gbc) & 0x3f;
616 nb_nals = bytestream2_get_be16(&gbc);
617
619 for (j = 0; j < nb_nals; j++) {
622 size = bytestream2_get_be16(&gbc);
626 }
628
630 frag->
data + start, end - start,
632 if (err < 0) {
634 "HVCC array %d (%d NAL units of type %d).\n",
635 i, nb_nals, nal_unit_type);
636 return err;
637 }
639 if (err < 0)
640 return err;
641 }
642
643 } else {
644 // Annex B, or later MP4 with already-known parameters.
645
651 if (err < 0)
652 return err;
653
655 if (err < 0)
656 return err;
657 }
658
659 return 0;
660 }
661
662 #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \
663 static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \
664 CodedBitstreamUnit *unit) \
665 { \
666 CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
667 H26 ## h26n ## Raw ## ps_name *ps_var = unit->content; \
668 unsigned int id = ps_var->id_element; \
669 int err; \
670 if (id >= FF_ARRAY_ELEMS(priv->ps_var)) { \
671 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \
672 " id : %d.\n", id); \
673 return AVERROR_INVALIDDATA; \
674 } \
675 err = ff_cbs_make_unit_refcounted(ctx, unit); \
676 if (err < 0) \
677 return err; \
678 if (priv->ps_var[id] == priv->active_ ## ps_var) \
679 priv->active_ ## ps_var = NULL ; \
680 av_buffer_unref(&priv->ps_var ## _ref[id]); \
681 av_assert0(unit->content_ref); \
682 priv->ps_var ## _ref[id] = av_buffer_ref(unit->content_ref); \
683 if (!priv->ps_var ## _ref[id]) \
684 return AVERROR(ENOMEM); \
685 priv->ps_var[id] = (H26 ## h26n ## Raw ## ps_name *)priv->ps_var ## _ref[id]->data; \
686 return 0; \
687 }
688
694
697 {
699 int err;
700
702 if (err < 0)
703 return err;
704
706 if (err < 0)
707 return err;
708
709 switch (unit->
type) {
711 {
713
714 err = cbs_h264_read_sps(
ctx, &gbc,
sps);
715 if (err < 0)
716 return err;
717
718 err = cbs_h264_replace_sps(
ctx, unit);
719 if (err < 0)
720 return err;
721 }
722 break;
723
725 {
726 err = cbs_h264_read_sps_extension(
ctx, &gbc, unit->
content);
727 if (err < 0)
728 return err;
729 }
730 break;
731
733 {
735
736 err = cbs_h264_read_pps(
ctx, &gbc,
pps);
737 if (err < 0)
738 return err;
739
740 err = cbs_h264_replace_pps(
ctx, unit);
741 if (err < 0)
742 return err;
743 }
744 break;
745
749 {
752
753 err = cbs_h264_read_slice_header(
ctx, &gbc, &slice->
header);
754 if (err < 0)
755 return err;
756
759
762
769 }
770 break;
771
773 {
774 err = cbs_h264_read_aud(
ctx, &gbc, unit->
content);
775 if (err < 0)
776 return err;
777 }
778 break;
779
781 {
782 err = cbs_h264_read_sei(
ctx, &gbc, unit->
content);
783 if (err < 0)
784 return err;
785 }
786 break;
787
789 {
790 err = cbs_h264_read_filler(
ctx, &gbc, unit->
content);
791 if (err < 0)
792 return err;
793 }
794 break;
795
798 {
800 cbs_h264_read_end_of_sequence :
801 cbs_h264_read_end_of_stream)(
ctx, &gbc, unit->
content);
802 if (err < 0)
803 return err;
804 }
805 break;
806
807 default:
809 }
810
811 return 0;
812 }
813
816 {
818 int err;
819
821 if (err < 0)
822 return err;
823
825 if (err < 0)
826 return err;
827
828 switch (unit->
type) {
830 {
832
833 err = cbs_h265_read_vps(
ctx, &gbc,
vps);
834 if (err < 0)
835 return err;
836
837 err = cbs_h265_replace_vps(
ctx, unit);
838 if (err < 0)
839 return err;
840 }
841 break;
843 {
845
846 err = cbs_h265_read_sps(
ctx, &gbc,
sps);
847 if (err < 0)
848 return err;
849
850 err = cbs_h265_replace_sps(
ctx, unit);
851 if (err < 0)
852 return err;
853 }
854 break;
855
857 {
859
860 err = cbs_h265_read_pps(
ctx, &gbc,
pps);
861 if (err < 0)
862 return err;
863
864 err = cbs_h265_replace_pps(
ctx, unit);
865 if (err < 0)
866 return err;
867 }
868 break;
869
886 {
889
890 err = cbs_h265_read_slice_segment_header(
ctx, &gbc, &slice->
header);
891 if (err < 0)
892 return err;
893
896
899
906 }
907 break;
908
910 {
911 err = cbs_h265_read_aud(
ctx, &gbc, unit->
content);
912 if (err < 0)
913 return err;
914 }
915 break;
916
919 {
920 err = cbs_h265_read_sei(
ctx, &gbc, unit->
content,
922
923 if (err < 0)
924 return err;
925 }
926 break;
927
928 default:
930 }
931
932 return 0;
933 }
934
937 size_t data_size, int data_bit_start)
938 {
939 size_t rest = data_size - (data_bit_start + 7) / 8;
940 const uint8_t *
pos =
data + data_bit_start / 8;
941
943 data_size > data_bit_start / 8);
944
947
948 if (!rest)
949 goto rbsp_stop_one_bit;
950
951 // First copy the remaining bits of the first byte
952 // The above check ensures that we do not accidentally
953 // copy beyond the rbsp_stop_one_bit.
954 if (data_bit_start % 8)
955 put_bits(pbc, 8 - data_bit_start % 8,
957
959 // If the writer is aligned at this point,
960 // memcpy can be used to improve performance.
961 // This happens normally for CABAC.
965 } else {
966 // If not, we have to copy manually.
967 // rbsp_stop_one_bit forces us to special-case
968 // the last byte.
971
972 for (; rest > 4; rest -= 4,
pos += 4)
974
975 for (; rest > 1; rest--,
pos++)
977
978 rbsp_stop_one_bit:
980
984 i = rest ? (8 -
i) : (8 -
i - data_bit_start % 8);
988 }
989
990 return 0;
991 }
992
996 {
997 int err;
998
999 switch (unit->
type) {
1001 {
1003
1004 err = cbs_h264_write_sps(
ctx, pbc,
sps);
1005 if (err < 0)
1006 return err;
1007
1008 err = cbs_h264_replace_sps(
ctx, unit);
1009 if (err < 0)
1010 return err;
1011 }
1012 break;
1013
1015 {
1017
1018 err = cbs_h264_write_sps_extension(
ctx, pbc, sps_ext);
1019 if (err < 0)
1020 return err;
1021 }
1022 break;
1023
1025 {
1027
1028 err = cbs_h264_write_pps(
ctx, pbc,
pps);
1029 if (err < 0)
1030 return err;
1031
1032 err = cbs_h264_replace_pps(
ctx, unit);
1033 if (err < 0)
1034 return err;
1035 }
1036 break;
1037
1041 {
1043
1044 err = cbs_h264_write_slice_header(
ctx, pbc, &slice->
header);
1045 if (err < 0)
1046 return err;
1047
1052 if (err < 0)
1053 return err;
1054 } else {
1055 // No slice data - that was just the header.
1056 // (Bitstream may be unaligned!)
1057 }
1058 }
1059 break;
1060
1062 {
1063 err = cbs_h264_write_aud(
ctx, pbc, unit->
content);
1064 if (err < 0)
1065 return err;
1066 }
1067 break;
1068
1070 {
1071 err = cbs_h264_write_sei(
ctx, pbc, unit->
content);
1072 if (err < 0)
1073 return err;
1074 }
1075 break;
1076
1078 {
1079 err = cbs_h264_write_filler(
ctx, pbc, unit->
content);
1080 if (err < 0)
1081 return err;
1082 }
1083 break;
1084
1086 {
1087 err = cbs_h264_write_end_of_sequence(
ctx, pbc, unit->
content);
1088 if (err < 0)
1089 return err;
1090 }
1091 break;
1092
1094 {
1095 err = cbs_h264_write_end_of_stream(
ctx, pbc, unit->
content);
1096 if (err < 0)
1097 return err;
1098 }
1099 break;
1100
1101 default:
1103 "NAL unit type %"PRIu32
".\n", unit->
type);
1105 }
1106
1107 return 0;
1108 }
1109
1113 {
1114 int err;
1115
1116 switch (unit->
type) {
1118 {
1120
1121 err = cbs_h265_write_vps(
ctx, pbc,
vps);
1122 if (err < 0)
1123 return err;
1124
1125 err = cbs_h265_replace_vps(
ctx, unit);
1126 if (err < 0)
1127 return err;
1128 }
1129 break;
1130
1132 {
1134
1135 err = cbs_h265_write_sps(
ctx, pbc,
sps);
1136 if (err < 0)
1137 return err;
1138
1139 err = cbs_h265_replace_sps(
ctx, unit);
1140 if (err < 0)
1141 return err;
1142 }
1143 break;
1144
1146 {
1148
1149 err = cbs_h265_write_pps(
ctx, pbc,
pps);
1150 if (err < 0)
1151 return err;
1152
1153 err = cbs_h265_replace_pps(
ctx, unit);
1154 if (err < 0)
1155 return err;
1156 }
1157 break;
1158
1175 {
1177
1178 err = cbs_h265_write_slice_segment_header(
ctx, pbc, &slice->
header);
1179 if (err < 0)
1180 return err;
1181
1186 if (err < 0)
1187 return err;
1188 } else {
1189 // No slice data - that was just the header.
1190 }
1191 }
1192 break;
1193
1195 {
1196 err = cbs_h265_write_aud(
ctx, pbc, unit->
content);
1197 if (err < 0)
1198 return err;
1199 }
1200 break;
1201
1204 {
1205 err = cbs_h265_write_sei(
ctx, pbc, unit->
content,
1207
1208 if (err < 0)
1209 return err;
1210 }
1211 break;
1212
1213 default:
1215 "NAL unit type %"PRIu32
".\n", unit->
type);
1217 }
1218
1219 return 0;
1220 }
1221
1224 int nal_unit_index)
1225 {
1226 // Section B.1.2 in H.264, section B.2.2 in H.265.
1227 if (nal_unit_index == 0) {
1228 // Assume that this is the first NAL unit in an access unit.
1229 return 1;
1230 }
1235 return 0;
1236 }
1237
1240 {
1242 size_t max_size, dp,
sp;
1243 int err,
i, zero_run;
1244
1246 // Data should already all have been written when we get here.
1248 }
1249
1250 max_size = 0;
1252 // Start code + content with worst-case emulation prevention.
1254 }
1255
1259
1260 dp = 0;
1263
1265 if (i < frag->nb_units - 1)
1267 "unaligned padding on non-final NAL unit.\n");
1268 else
1270 }
1271
1273 // zero_byte
1275 }
1276 // start_code_prefix_one_3bytes
1280
1281 zero_run = 0;
1283 if (zero_run < 2) {
1285 ++zero_run;
1286 else
1287 zero_run = 0;
1288 } else {
1289 if ((unit->
data[
sp] & ~3) == 0) {
1290 // emulation_prevention_three_byte
1292 }
1293 zero_run = unit->
data[
sp] == 0;
1294 }
1296 }
1297 }
1298
1301 if (err)
1302 return err;
1304
1310 }
1311
1314
1315 return 0;
1316 }
1317
1319 {
1321
1325 }
1329 }
1330
1334 }
1335
1337 {
1340
1342
1347 }
1348
1350 {
1352
1356 }
1360 }
1364 }
1365
1369 }
1370
1372 {
1375
1377
1384 }
1385
1387 {
1391 }
1392
1396
1398
1399 {
1400 .nb_unit_types = 3,
1401 .unit_types = {
1405 },
1408 .nb_ref_offsets = 1,
1410 },
1411
1416
1418
1420 };
1421
1423 {
1427 }
1428
1433
1435
1436 {
1437 // Slices of non-IRAP pictures.
1441
1444 .nb_ref_offsets = 1,
1446 },
1447
1448 {
1449 // Slices of IRAP pictures.
1453
1456 .nb_ref_offsets = 1,
1458 },
1459
1460 {
1461 .nb_unit_types = 2,
1462 .unit_types = {
1465 },
1469 },
1470
1472 };
1473
1476
1478
1480
1482 .read_unit = &cbs_h264_read_nal_unit,
1485
1488 };
1489
1492
1494
1496
1501
1504 };
1505
1507 {
1509 1, 1,
1512 },
1513 {
1515 1, 1,
1518 },
1519 {
1521 1, 1,
1524 },
1525 {
1527 1, 0,
1530 },
1531 {
1533 1, 0,
1536 },
1537 {
1539 1, 0,
1542 },
1544 };
1545
1547 {
1549 1, 0,
1552 },
1553 {
1555 1, 0,
1558 },
1559 {
1561 1, 0,
1564 },
1565 {
1567 1, 0,
1570 },
1571 {
1573 1, 0,
1576 },
1577 {
1579 1, 0,
1582 },
1584 };
1585
1587 {
1589 1, 0,
1592 },
1593 {
1595 1, 0,
1598 },
1599 {
1601 1, 0,
1604 },
1605 {
1607 1, 0,
1610 },
1611 {
1613 1, 0,
1616 },
1617 {
1619 1, 0,
1622 },
1623 {
1625 1, 0,
1628 },
1629 {
1631 0, 1,
1634 },
1635 {
1637 1, 0,
1640 },
1641 {
1643 1, 0,
1646 },
1648 };
1649
1651 int payload_type)
1652 {
1655
1659 }
1660
1661 switch (
ctx->codec->codec_id) {
1664 break;
1667 break;
1668 default:
1670 }
1671
1675 }
1676
1678 }