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
22
33
35
37 const char *
name,
const int *subscripts,
38 uint32_t *write_to,
39 uint32_t range_min, uint32_t range_max)
40 {
41 uint32_t leading_bits,
value;
42 int max_length, leading_zeroes;
43
45
47
49 if (leading_bits == 0) {
50 if (max_length >= 32) {
52 "%s: more than 31 zeroes.\n",
name);
54 } else {
56 "%s: bitstream ended.\n",
name);
58 }
59 }
60
61 leading_zeroes = max_length - 1 -
av_log2(leading_bits);
63
66 "%s: bitstream ended.\n",
name);
68 }
69
71
73
74 if (value < range_min || value > range_max) {
76 "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
79 }
80
82 return 0;
83 }
84
86 const char *
name,
const int *subscripts,
89 {
90 uint32_t leading_bits, unsigned_value;
91 int max_length, leading_zeroes;
93
95
97
99 if (leading_bits == 0) {
100 if (max_length >= 32) {
102 "%s: more than 31 zeroes.\n",
name);
104 } else {
106 "%s: bitstream ended.\n",
name);
108 }
109 }
110
111 leading_zeroes = max_length - 1 -
av_log2(leading_bits);
113
116 "%s: bitstream ended.\n",
name);
118 }
119
121
122 if (unsigned_value & 1)
124 else
125 value = unsigned_value / 2;
126
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
148
149 if (value < range_min || value > range_max) {
151 "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
154 }
156
160
164 else
166
168
169 return 0;
170 }
171
173 const char *
name,
const int *subscripts,
176 {
178 uint32_t uvalue;
179
181
182 if (value < range_min || value > range_max) {
184 "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
187 }
189
191 uvalue = 0;
193 uvalue = 2 * (uint32_t)
value - 1;
194 else
195 uvalue = 2 * (uint32_t)-
value;
196
200
204 else
206
208
209 return 0;
210 }
211
212 // payload_extension_present() - true if we are before the last 1-bit
213 // in the payload structure, which must be in the last byte.
215 int cur_pos)
216 {
217 int bits_left = payload_size * 8 - cur_pos;
220 }
221
222 #define HEADER(name) do { \
223 ff_cbs_trace_header(ctx, name); \
224 } while (0)
225
226 #define CHECK(call) do { \
227 err = (call); \
228 if (err < 0) \
229 return err; \
230 } while (0)
231
232 #define FUNC_NAME2(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
233 #define FUNC_NAME1(rw, codec, name) FUNC_NAME2(rw, codec, name)
234 #define FUNC_H264(name) FUNC_NAME1(READWRITE, h264, name)
235 #define FUNC_H265(name) FUNC_NAME1(READWRITE, h265, name)
236 #define FUNC_H266(name) FUNC_NAME1(READWRITE, h266, name)
237 #define FUNC_SEI(name) FUNC_NAME1(READWRITE, sei, name)
238
239 #define SEI_FUNC(name, args) \
240 static int FUNC(name) args; \
241 static int FUNC(name ## _internal)(CodedBitstreamContext *ctx, \
242 RWContext *rw, void *cur, \
243 SEIMessageState *state) \
244 { \
245 return FUNC(name)(ctx, rw, cur, state); \
246 } \
247 static int FUNC(name) args
248
249 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
250
251 #define u(width, name, range_min, range_max) \
252 xu(width, name, current->name, range_min, range_max, 0, )
253 #define flag(name) ub(1, name)
254 #define ue(name, range_min, range_max) \
255 xue(name, current->name, range_min, range_max, 0, )
256 #define i(width, name, range_min, range_max) \
257 xi(width, name, current->name, range_min, range_max, 0, )
258 #define ib(width, name) \
259 xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), 0, )
260 #define se(name, range_min, range_max) \
261 xse(name, current->name, range_min, range_max, 0, )
262
263 #define us(width, name, range_min, range_max, subs, ...) \
264 xu(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
265 #define ubs(width, name, subs, ...) \
266 xu(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
267 #define flags(name, subs, ...) \
268 xu(1, name, current->name, 0, 1, subs, __VA_ARGS__)
269 #define ues(name, range_min, range_max, subs, ...) \
270 xue(name, current->name, range_min, range_max, subs, __VA_ARGS__)
271 #define is(width, name, range_min, range_max, subs, ...) \
272 xi(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
273 #define ibs(width, name, subs, ...) \
274 xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), subs, __VA_ARGS__)
275 #define ses(name, range_min, range_max, subs, ...) \
276 xse(name, current->name, range_min, range_max, subs, __VA_ARGS__)
277
278 #define fixed(width, name, value) do { \
279 av_unused uint32_t fixed_value = value; \
280 xu(width, name, fixed_value, value, value, 0, ); \
281 } while (0)
282
283
285 #define READWRITE read
286 #define RWContext GetBitContext
287
288 #define ub(width, name) do { \
289 uint32_t value; \
290 CHECK(ff_cbs_read_simple_unsigned(ctx, rw, width, #name, \
291 &value)); \
292 current->name = value; \
293 } while (0)
294 #define xu(width, name, var, range_min, range_max, subs, ...) do { \
295 uint32_t value; \
296 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
297 SUBSCRIPTS(subs, __VA_ARGS__), \
298 &value, range_min, range_max)); \
299 var = value; \
300 } while (0)
301 #define xue(name, var, range_min, range_max, subs, ...) do { \
302 uint32_t value; \
303 CHECK(cbs_read_ue_golomb(ctx, rw, #name, \
304 SUBSCRIPTS(subs, __VA_ARGS__), \
305 &value, range_min, range_max)); \
306 var = value; \
307 } while (0)
308 #define xi(width, name, var, range_min, range_max, subs, ...) do { \
309 int32_t value; \
310 CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
311 SUBSCRIPTS(subs, __VA_ARGS__), \
312 &value, range_min, range_max)); \
313 var = value; \
314 } while (0)
315 #define xse(name, var, range_min, range_max, subs, ...) do { \
316 int32_t value; \
317 CHECK(cbs_read_se_golomb(ctx, rw, #name, \
318 SUBSCRIPTS(subs, __VA_ARGS__), \
319 &value, range_min, range_max)); \
320 var = value; \
321 } while (0)
322
323
324 #define infer(name, value) do { \
325 current->name = value; \
326 } while (0)
327
329 {
332 return 1;
334 return 0;
336 return 1;
337 return 0;
338 }
339
340 #define more_rbsp_data(var) ((var) = cbs_h2645_read_more_rbsp_data(rw))
341
342 #define bit_position(rw) (get_bits_count(rw))
343 #define byte_alignment(rw) (get_bits_count(rw) % 8)
344
345 /* The CBS SEI code uses the refstruct API for the allocation
346 * of its child buffers. */
347 #define allocate(name, size) do { \
348 name = av_refstruct_allocz(size + \
349 AV_INPUT_BUFFER_PADDING_SIZE); \
350 if (!name) \
351 return AVERROR(ENOMEM); \
352 } while (0)
353
354 #define FUNC(name) FUNC_SEI(name)
356 #undef FUNC
357
358 #undef allocate
359
360 /* The other code uses the refstruct API for the allocation
361 * of its child buffers. */
362 #define allocate(name, size) do { \
363 name ## _ref = av_buffer_allocz(size + \
364 AV_INPUT_BUFFER_PADDING_SIZE); \
365 if (!name ## _ref) \
366 return AVERROR(ENOMEM); \
367 name = name ## _ref->data; \
368 } while (0)
369
370 #define FUNC(name) FUNC_H264(name)
372 #undef FUNC
373
374 #define FUNC(name) FUNC_H265(name)
376 #undef FUNC
377
378 #define FUNC(name) FUNC_H266(name)
380 #undef FUNC
381
382 #undef READ
383 #undef READWRITE
384 #undef RWContext
385 #undef ub
386 #undef xu
387 #undef xi
388 #undef xue
389 #undef xse
390 #undef infer
391 #undef more_rbsp_data
392 #undef bit_position
393 #undef byte_alignment
394 #undef allocate
395
396
398 #define READWRITE write
399 #define RWContext PutBitContext
400
401 #define ub(width, name) do { \
402 uint32_t value = current->name; \
403 CHECK(ff_cbs_write_simple_unsigned(ctx, rw, width, #name, \
404 value)); \
405 } while (0)
406 #define xu(width, name, var, range_min, range_max, subs, ...) do { \
407 uint32_t value = var; \
408 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
409 SUBSCRIPTS(subs, __VA_ARGS__), \
410 value, range_min, range_max)); \
411 } while (0)
412 #define xue(name, var, range_min, range_max, subs, ...) do { \
413 uint32_t value = var; \
414 CHECK(cbs_write_ue_golomb(ctx, rw, #name, \
415 SUBSCRIPTS(subs, __VA_ARGS__), \
416 value, range_min, range_max)); \
417 } while (0)
418 #define xi(width, name, var, range_min, range_max, subs, ...) do { \
419 int32_t value = var; \
420 CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
421 SUBSCRIPTS(subs, __VA_ARGS__), \
422 value, range_min, range_max)); \
423 } while (0)
424 #define xse(name, var, range_min, range_max, subs, ...) do { \
425 int32_t value = var; \
426 CHECK(cbs_write_se_golomb(ctx, rw, #name, \
427 SUBSCRIPTS(subs, __VA_ARGS__), \
428 value, range_min, range_max)); \
429 } while (0)
430
431 #define infer(name, value) do { \
432 if (current->name != (value)) { \
433 av_log(ctx->log_ctx, AV_LOG_ERROR, \
434 "%s does not match inferred value: " \
435 "%"PRId64", but should be %"PRId64".\n", \
436 #name, (int64_t)current->name, (int64_t)(value)); \
437 return AVERROR_INVALIDDATA; \
438 } \
439 } while (0)
440
441 #define more_rbsp_data(var) (var)
442
443 #define bit_position(rw) (put_bits_count(rw))
444 #define byte_alignment(rw) (put_bits_count(rw) % 8)
445
446 #define allocate(name, size) do { \
447 if (!name) { \
448 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s must be set " \
449 "for writing.\n", #name); \
450 return AVERROR_INVALIDDATA; \
451 } \
452 } while (0)
453
454 #define FUNC(name) FUNC_SEI(name)
456 #undef FUNC
457
458 #define FUNC(name) FUNC_H264(name)
460 #undef FUNC
461
462 #define FUNC(name) FUNC_H265(name)
464 #undef FUNC
465
466 #define FUNC(name) FUNC_H266(name)
468 #undef FUNC
469
470 #undef WRITE
471 #undef READWRITE
472 #undef RWContext
473 #undef ub
474 #undef xu
475 #undef xi
476 #undef xue
477 #undef xse
478 #undef u
479 #undef i
480 #undef flag
481 #undef ue
482 #undef se
483 #undef infer
484 #undef more_rbsp_data
485 #undef bit_position
486 #undef byte_alignment
487 #undef allocate
488
489
493 {
495
501
504 continue;
505
506 // Remove trailing zeroes.
511 continue;
512 }
513
516
517 err = ff_cbs_append_unit_data(frag, nal->
type,
519 if (err < 0)
520 return err;
521 }
522
523 return 0;
524 }
525
529 {
533 int err;
534
537 return 0;
538
540 // AVCC header.
541 size_t size, start, end;
543
545
547
550
551 version = bytestream2_get_byte(&gbc);
556 }
557
560
561 // SPS array.
562 count = bytestream2_get_byte(&gbc) & 0x1f;
564 for (
i = 0;
i < count;
i++) {
567 size = bytestream2_get_be16(&gbc);
571 }
573
575 frag->
data + start, end - start,
578 if (err < 0) {
580 return err;
581 }
583 if (err < 0)
584 return err;
585
586 // PPS array.
587 count = bytestream2_get_byte(&gbc);
589 for (
i = 0;
i < count;
i++) {
592 size = bytestream2_get_be16(&gbc);
596 }
598
600 frag->
data + start, end - start,
603 if (err < 0) {
605 return err;
606 }
608 if (err < 0)
609 return err;
610
614 }
615
617 // HVCC header.
618 size_t size, start, end;
619 int i, j, nb_arrays, nal_unit_type, nb_nals,
version;
620
622
624
627
628 version = bytestream2_get_byte(&gbc);
633 }
634
637
638 nb_arrays = bytestream2_get_byte(&gbc);
639 for (
i = 0;
i < nb_arrays;
i++) {
640 nal_unit_type = bytestream2_get_byte(&gbc) & 0x3f;
641 nb_nals = bytestream2_get_be16(&gbc);
642
644 for (j = 0; j < nb_nals; j++) {
647 size = bytestream2_get_be16(&gbc);
651 }
653
655 frag->
data + start, end - start,
658 if (err < 0) {
660 "HVCC array %d (%d NAL units of type %d).\n",
661 i, nb_nals, nal_unit_type);
662 return err;
663 }
665 if (err < 0)
666 return err;
667 }
668
670 // VVCC header.
671 int ptl_present_flag, num_arrays;
673
675
677
678 b = bytestream2_get_byte(&gbc);
680 ptl_present_flag =
b & 1;
681
682 if(ptl_present_flag) {
683 int num_sublayers, num_bytes_constraint_info, num_sub_profiles;
684 num_sublayers = (bytestream2_get_be16u(&gbc) >> 4) & 7;
686
687 // begin VvcPTLRecord(num_sublayers);
688 num_bytes_constraint_info = bytestream2_get_byte(&gbc) & 0x3f;
690 if(num_sublayers > 1) {
691 int count_present_flags = 0;
692 b = bytestream2_get_byte(&gbc);
693 for(
i = num_sublayers - 2;
i >= 0;
i--) {
694 if((
b >> (7 - (num_sublayers - 2 -
i))) & 0x01)
695 count_present_flags++;
696 }
698 }
699 num_sub_profiles = bytestream2_get_byte(&gbc);
701 // end VvcPTLRecord(num_sublayers);
702
704 }
705
706 num_arrays = bytestream2_get_byte(&gbc);
707 for(j = 0; j < num_arrays; j++) {
708 size_t start, end,
size;
709 int nal_unit_type = bytestream2_get_byte(&gbc) & 0x1f;
710 unsigned int num_nalus = 1;
712 num_nalus = bytestream2_get_be16(&gbc);
713
715 for(
i = 0;
i < num_nalus;
i++) {
718 size = bytestream2_get_be16(&gbc);
722 }
724
726 frag->
data + start, end - start,
729 if (err < 0) {
731 "VVCC array %d (%d NAL units of type %d).\n",
732 i, num_nalus, nal_unit_type);
733 return err;
734 }
736 if (err < 0)
737 return err;
738 }
739 } else {
741 // Annex B, or later MP4 with already-known parameters.
742
748 if (err < 0)
749 return err;
750
752 if (err < 0)
753 return err;
754 }
755
756 return 0;
757 }
758
759 #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \
760 static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \
761 CodedBitstreamUnit *unit) \
762 { \
763 CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
764 H26 ## h26n ## Raw ## ps_name *ps_var = unit->content; \
765 unsigned int id = ps_var->id_element; \
766 int err = ff_cbs_make_unit_refcounted(ctx, unit); \
767 if (err < 0) \
768 return err; \
769 if (priv->ps_var[id] == priv->active_ ## ps_var) \
770 priv->active_ ## ps_var = NULL ; \
771 av_assert0(unit->content_ref); \
772 av_refstruct_replace(&priv->ps_var[id], unit->content_ref); \
773 return 0; \
774 }
775
781
782 #define cbs_h266_replace_ps(h26n, ps_name, ps_var, id_element) \
783 static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \
784 CodedBitstreamUnit *unit) \
785 { \
786 CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
787 H26 ## h26n ## Raw ## ps_name *ps_var = unit->content; \
788 unsigned int id = ps_var->id_element; \
789 int err = ff_cbs_make_unit_refcounted(ctx, unit); \
790 if (err < 0) \
791 return err; \
792 av_assert0(unit->content_ref); \
793 av_refstruct_replace(&priv->ps_var[id], unit->content_ref); \
794 return 0; \
795 }
796
799
802 {
805 unsigned int id =
sps->sps_seq_parameter_set_id;
806 int err = ff_cbs_make_unit_refcounted(
ctx, unit);
807 if (err < 0)
808 return err;
814 }
815 }
817 return 0;
818 }
819
823 {
825 int err;
826
827 err = ff_cbs_make_unit_refcounted(
ctx, unit);
828 if (err < 0)
829 return err;
833 return 0;
834 }
835
838 {
840 int err;
841
843 if (err < 0)
844 return err;
845
846 err = ff_cbs_alloc_unit_content(
ctx, unit);
847 if (err < 0)
848 return err;
849
850 switch (unit->
type) {
852 {
854
855 err = cbs_h264_read_sps(
ctx, &gbc,
sps);
856 if (err < 0)
857 return err;
858
859 err = cbs_h264_replace_sps(
ctx, unit);
860 if (err < 0)
861 return err;
862 }
863 break;
864
866 {
867 err = cbs_h264_read_sps_extension(
ctx, &gbc, unit->
content);
868 if (err < 0)
869 return err;
870 }
871 break;
872
874 {
876
877 err = cbs_h264_read_pps(
ctx, &gbc,
pps);
878 if (err < 0)
879 return err;
880
881 err = cbs_h264_replace_pps(
ctx, unit);
882 if (err < 0)
883 return err;
884 }
885 break;
886
890 {
893
894 err = cbs_h264_read_slice_header(
ctx, &gbc, &slice->
header);
895 if (err < 0)
896 return err;
897
900
903
910 }
911 break;
912
914 {
915 err = cbs_h264_read_aud(
ctx, &gbc, unit->
content);
916 if (err < 0)
917 return err;
918 }
919 break;
920
922 {
923 err = cbs_h264_read_sei(
ctx, &gbc, unit->
content);
924 if (err < 0)
925 return err;
926 }
927 break;
928
930 {
931 err = cbs_h264_read_filler(
ctx, &gbc, unit->
content);
932 if (err < 0)
933 return err;
934 }
935 break;
936
939 {
941 cbs_h264_read_end_of_sequence :
942 cbs_h264_read_end_of_stream)(
ctx, &gbc, unit->
content);
943 if (err < 0)
944 return err;
945 }
946 break;
947
948 default:
950 }
951
952 return 0;
953 }
954
957 {
959 int err;
960
962 if (err < 0)
963 return err;
964
965 err = ff_cbs_alloc_unit_content(
ctx, unit);
966 if (err < 0)
967 return err;
968
969 switch (unit->
type) {
971 {
973
974 err = cbs_h265_read_vps(
ctx, &gbc,
vps);
975 if (err < 0)
976 return err;
977
978 err = cbs_h265_replace_vps(
ctx, unit);
979 if (err < 0)
980 return err;
981 }
982 break;
984 {
986
987 err = cbs_h265_read_sps(
ctx, &gbc,
sps);
988 if (err < 0)
989 return err;
990
991 err = cbs_h265_replace_sps(
ctx, unit);
992 if (err < 0)
993 return err;
994 }
995 break;
996
998 {
1000
1001 err = cbs_h265_read_pps(
ctx, &gbc,
pps);
1002 if (err < 0)
1003 return err;
1004
1005 err = cbs_h265_replace_pps(
ctx, unit);
1006 if (err < 0)
1007 return err;
1008 }
1009 break;
1010
1027 {
1030
1031 err = cbs_h265_read_slice_segment_header(
ctx, &gbc, &slice->
header);
1032 if (err < 0)
1033 return err;
1034
1037
1040
1047 }
1048 break;
1049
1051 {
1052 err = cbs_h265_read_aud(
ctx, &gbc, unit->
content);
1053 if (err < 0)
1054 return err;
1055 }
1056 break;
1057
1059 {
1060 err = cbs_h265_read_filler(
ctx, &gbc, unit->
content);
1061 if (err < 0)
1062 return err;
1063 }
1064 break;
1065
1068 {
1069 err = cbs_h265_read_sei(
ctx, &gbc, unit->
content,
1071
1072 if (err < 0)
1073 return err;
1074 }
1075 break;
1076
1077 default:
1079 }
1080
1081 return 0;
1082 }
1083
1086 {
1088 int err;
1090
1092 if (err < 0)
1093 return err;
1094
1095 err = ff_cbs_alloc_unit_content(
ctx, unit);
1096 if (err < 0)
1097 return err;
1098
1099 switch (unit->
type) {
1101 {
1102 err = cbs_h266_read_dci(
ctx, &gbc, unit->
content);
1103
1104 if (err < 0)
1105 return err;
1106 }
1107 break;
1109 {
1110 err = cbs_h266_read_opi(
ctx, &gbc, unit->
content);
1111
1112 if (err < 0)
1113 return err;
1114 }
1115 break;
1117 {
1119
1120 err = cbs_h266_read_vps(
ctx, &gbc,
vps);
1121 if (err < 0)
1122 return err;
1123
1124 err = cbs_h266_replace_vps(
ctx, unit);
1125 if (err < 0)
1126 return err;
1127 }
1128 break;
1130 {
1132
1133 err = cbs_h266_read_sps(
ctx, &gbc,
sps);
1134 if (err < 0)
1135 return err;
1136
1137 err = cbs_h266_replace_sps(
ctx, unit);
1138 if (err < 0)
1139 return err;
1140 }
1141 break;
1142
1144 {
1146
1147 err = cbs_h266_read_pps(
ctx, &gbc,
pps);
1148 if (err < 0)
1149 return err;
1150
1151 err = cbs_h266_replace_pps(
ctx, unit);
1152 if (err < 0)
1153 return err;
1154 }
1155 break;
1156
1159 {
1160 err = cbs_h266_read_aps(
ctx, &gbc, unit->
content,
1162
1163 if (err < 0)
1164 return err;
1165 }
1166 break;
1168 {
1170 err = cbs_h266_read_ph(
ctx, &gbc,
ph);
1171 if (err < 0)
1172 return err;
1174 if (err < 0)
1175 return err;
1176 }
1177 break;
1178
1187 {
1190
1191 err = cbs_h266_read_slice_header(
ctx, &gbc, &slice->
header);
1192 if (err < 0)
1193 return err;
1194
1197
1200
1203 if (err < 0)
1204 return err;
1206 } else {
1208 }
1209 slice->
ph = h266->
ph;
1212
1220 }
1221 break;
1222
1224 {
1225 err = cbs_h266_read_aud(
ctx, &gbc, unit->
content);
1226 if (err < 0)
1227 return err;
1228 }
1229 break;
1230
1233 {
1234 err = cbs_h266_read_sei(
ctx, &gbc, unit->
content,
1236
1237 if (err < 0)
1238 return err;
1239 }
1240 break;
1241
1242 default:
1244 }
1245 return 0;
1246 }
1247
1250 size_t data_size, int data_bit_start)
1251 {
1252 size_t rest = data_size - (data_bit_start + 7) / 8;
1253 const uint8_t *
pos =
data + data_bit_start / 8;
1254
1256 data_size > data_bit_start / 8);
1257
1260
1261 if (!rest)
1262 goto rbsp_stop_one_bit;
1263
1264 // First copy the remaining bits of the first byte
1265 // The above check ensures that we do not accidentally
1266 // copy beyond the rbsp_stop_one_bit.
1267 if (data_bit_start % 8)
1268 put_bits(pbc, 8 - data_bit_start % 8,
1270
1272 // If the writer is aligned at this point,
1273 // memcpy can be used to improve performance.
1274 // This happens normally for CABAC.
1278 } else {
1279 // If not, we have to copy manually.
1280 // rbsp_stop_one_bit forces us to special-case
1281 // the last byte.
1284
1285 for (; rest > 4; rest -= 4,
pos += 4)
1287
1288 for (; rest > 1; rest--,
pos++)
1290
1291 rbsp_stop_one_bit:
1293
1297 i = rest ? (8 -
i) : (8 -
i - data_bit_start % 8);
1301 }
1302
1303 return 0;
1304 }
1305
1309 {
1310 int err;
1311
1312 switch (unit->
type) {
1314 {
1316
1317 err = cbs_h264_write_sps(
ctx, pbc,
sps);
1318 if (err < 0)
1319 return err;
1320
1321 err = cbs_h264_replace_sps(
ctx, unit);
1322 if (err < 0)
1323 return err;
1324 }
1325 break;
1326
1328 {
1330
1331 err = cbs_h264_write_sps_extension(
ctx, pbc, sps_ext);
1332 if (err < 0)
1333 return err;
1334 }
1335 break;
1336
1338 {
1340
1341 err = cbs_h264_write_pps(
ctx, pbc,
pps);
1342 if (err < 0)
1343 return err;
1344
1345 err = cbs_h264_replace_pps(
ctx, unit);
1346 if (err < 0)
1347 return err;
1348 }
1349 break;
1350
1354 {
1356
1357 err = cbs_h264_write_slice_header(
ctx, pbc, &slice->
header);
1358 if (err < 0)
1359 return err;
1360
1365 if (err < 0)
1366 return err;
1367 } else {
1368 // No slice data - that was just the header.
1369 // (Bitstream may be unaligned!)
1370 }
1371 }
1372 break;
1373
1375 {
1376 err = cbs_h264_write_aud(
ctx, pbc, unit->
content);
1377 if (err < 0)
1378 return err;
1379 }
1380 break;
1381
1383 {
1384 err = cbs_h264_write_sei(
ctx, pbc, unit->
content);
1385 if (err < 0)
1386 return err;
1387 }
1388 break;
1389
1391 {
1392 err = cbs_h264_write_filler(
ctx, pbc, unit->
content);
1393 if (err < 0)
1394 return err;
1395 }
1396 break;
1397
1399 {
1400 err = cbs_h264_write_end_of_sequence(
ctx, pbc, unit->
content);
1401 if (err < 0)
1402 return err;
1403 }
1404 break;
1405
1407 {
1408 err = cbs_h264_write_end_of_stream(
ctx, pbc, unit->
content);
1409 if (err < 0)
1410 return err;
1411 }
1412 break;
1413
1414 default:
1416 "NAL unit type %"PRIu32
".\n", unit->
type);
1418 }
1419
1420 return 0;
1421 }
1422
1426 {
1427 int err;
1428
1429 switch (unit->
type) {
1431 {
1433
1434 err = cbs_h265_write_vps(
ctx, pbc,
vps);
1435 if (err < 0)
1436 return err;
1437
1438 err = cbs_h265_replace_vps(
ctx, unit);
1439 if (err < 0)
1440 return err;
1441 }
1442 break;
1443
1445 {
1447
1448 err = cbs_h265_write_sps(
ctx, pbc,
sps);
1449 if (err < 0)
1450 return err;
1451
1452 err = cbs_h265_replace_sps(
ctx, unit);
1453 if (err < 0)
1454 return err;
1455 }
1456 break;
1457
1459 {
1461
1462 err = cbs_h265_write_pps(
ctx, pbc,
pps);
1463 if (err < 0)
1464 return err;
1465
1466 err = cbs_h265_replace_pps(
ctx, unit);
1467 if (err < 0)
1468 return err;
1469 }
1470 break;
1471
1488 {
1490
1491 err = cbs_h265_write_slice_segment_header(
ctx, pbc, &slice->
header);
1492 if (err < 0)
1493 return err;
1494
1499 if (err < 0)
1500 return err;
1501 } else {
1502 // No slice data - that was just the header.
1503 }
1504 }
1505 break;
1506
1508 {
1509 err = cbs_h265_write_aud(
ctx, pbc, unit->
content);
1510 if (err < 0)
1511 return err;
1512 }
1513 break;
1514
1516 {
1517 err = cbs_h265_write_filler(
ctx, pbc, unit->
content);
1518 if (err < 0)
1519 return err;
1520 }
1521 break;
1522
1525 {
1526 err = cbs_h265_write_sei(
ctx, pbc, unit->
content,
1528
1529 if (err < 0)
1530 return err;
1531 }
1532 break;
1533
1534 default:
1536 "NAL unit type %"PRIu32
".\n", unit->
type);
1538 }
1539
1540 return 0;
1541 }
1542
1546 {
1549 int slice_type_i, slice_type_b, slice_type_si;
1550
1552 return 0;
1553
1554 // keep non-VCL
1558 return 0;
1559
1561 return 1;
1562
1564 return 1;
1565
1569 "h264 nal unit header is null, missing decompose?\n");
1570 return 0;
1571 }
1572
1574 return 1;
1575
1579 "h264 slice header is null, missing decompose?\n");
1580 return 0;
1581 }
1582
1586
1588 return 1;
1590 return 1;
1591
1592 return 0;
1593 }
1594
1598 {
1600
1602 return 0;
1603
1604 switch (unit->
type) {
1611 // IRAP slice
1613 return 0;
1614 break;
1615
1626 // Slice
1627 break;
1628 default:
1629 // Don't discard non-slice nal.
1630 return 0;
1631 }
1632
1634 return 1;
1635
1639 "h265 slice header is null, missing decompose?\n");
1640 return 0;
1641 }
1642
1644 return 1;
1646 return 1;
1647
1649 switch (unit->
type) {
1658 // non-ref
1659 return 1;
1660 default:
1661 break;
1662 }
1663 }
1664
1665 return 0;
1666 }
1667
1671 {
1672 int err;
1673
1674 switch (unit->
type) {
1676 {
1678
1679 err = cbs_h266_write_dci(
ctx, pbc,
dci);
1680 if (err < 0)
1681 return err;
1682 }
1683 break;
1685 {
1687
1688 err = cbs_h266_write_opi(
ctx, pbc,
opi);
1689 if (err < 0)
1690 return err;
1691 }
1692 break;
1694 {
1696
1697 err = cbs_h266_write_vps(
ctx, pbc,
vps);
1698 if (err < 0)
1699 return err;
1700
1701 err = cbs_h266_replace_vps(
ctx, unit);
1702 if (err < 0)
1703 return err;
1704 }
1705 break;
1707 {
1709
1710 err = cbs_h266_write_sps(
ctx, pbc,
sps);
1711 if (err < 0)
1712 return err;
1713
1714 err = cbs_h266_replace_sps(
ctx, unit);
1715 if (err < 0)
1716 return err;
1717 }
1718 break;
1719
1721 {
1723
1724 err = cbs_h266_write_pps(
ctx, pbc,
pps);
1725 if (err < 0)
1726 return err;
1727
1728 err = cbs_h266_replace_pps(
ctx, unit);
1729 if (err < 0)
1730 return err;
1731 }
1732 break;
1733
1736 {
1737 err = cbs_h266_write_aps(
ctx, pbc, unit->
content,
1739 if (err < 0)
1740 return err;
1741 }
1742 break;
1744 {
1746 err = cbs_h266_write_ph(
ctx, pbc,
ph);
1747 if (err < 0)
1748 return err;
1749
1751 if (err < 0)
1752 return err;
1753 }
1754 break;
1755
1764 {
1766
1767 err = cbs_h266_write_slice_header(
ctx, pbc, &slice->
header);
1768 if (err < 0)
1769 return err;
1770
1773 if (err < 0)
1774 return err;
1775 }
1776
1781 if (err < 0)
1782 return err;
1783 } else {
1784 // No slice data - that was just the header.
1785 }
1786 }
1787 break;
1788
1790 {
1791 err = cbs_h266_write_aud(
ctx, pbc, unit->
content);
1792 if (err < 0)
1793 return err;
1794 }
1795 break;
1796
1799 {
1800 err = cbs_h266_write_sei(
ctx, pbc, unit->
content,
1802
1803 if (err < 0)
1804 return err;
1805 }
1806 break;
1807
1808 default:
1810 "NAL unit type %"PRIu32
".\n", unit->
type);
1812 }
1813
1814 return 0;
1815 }
1816
1819 int nal_unit_index)
1820 {
1821 // Section B.1.2 in H.264, section B.2.2 in H.265, H.266.
1822 if (nal_unit_index == 0) {
1823 // Assume that this is the first NAL unit in an access unit.
1824 return 1;
1825 }
1832 return 0;
1833 }
1834
1837 {
1839 size_t max_size, dp, sp;
1840 int err,
i, zero_run;
1841
1843 // Data should already all have been written when we get here.
1845 }
1846
1847 max_size = 0;
1849 // Start code + content with worst-case emulation prevention.
1851 }
1852
1856
1857 dp = 0;
1860
1862 if (i < frag->nb_units - 1)
1864 "unaligned padding on non-final NAL unit.\n");
1865 else
1867 }
1868
1870 // zero_byte
1872 }
1873 // start_code_prefix_one_3bytes
1877
1878 zero_run = 0;
1879 for (sp = 0; sp < unit->
data_size; sp++) {
1880 if (zero_run < 2) {
1881 if (unit->
data[sp] == 0)
1882 ++zero_run;
1883 else
1884 zero_run = 0;
1885 } else {
1886 if ((unit->
data[sp] & ~3) == 0) {
1887 // emulation_prevention_three_byte
1889 }
1890 zero_run = unit->
data[sp] == 0;
1891 }
1893 }
1894 }
1895
1898 if (err)
1899 return err;
1901
1907 }
1908
1911
1912 return 0;
1913 }
1914
1916 {
1918
1923
1927 }
1928
1930 {
1933
1935
1940 }
1941
1943 {
1945
1952
1956 }
1957
1959 {
1962
1964
1971 }
1972
1974 {
1976
1984 }
1985
1987 {
1989
1992 }
1993
1995 {
1998 }
1999
2003
2005
2009
2014
2016
2018 };
2019
2021 {
2024 }
2025
2030
2033
2034 // Slices of non-IRAP pictures.
2037 // Slices of IRAP pictures.
2040
2043
2045 };
2046
2048 {
2054 }
2055
2056
2058 {
2061 }
2062
2067 {
2068 .nb_unit_types = 1,
2073 .nb_offsets = 2,
2076 },
2077 },
2081
2084
2091
2094
2096 };
2097
2100
2102
2104
2110
2113 };
2114
2117
2119
2121
2127
2130 };
2131
2134
2136
2138
2143
2146 };
2147
2148 // Macro for the read/write pair.
2149 #define SEI_MESSAGE_RW(codec, name) \
2150 .read = cbs_ ## codec ## _read_ ## name ## _internal, \
2151 .write = cbs_ ## codec ## _write_ ## name ## _internal
2152
2154 {
2156 1, 1,
2159 },
2160 {
2162 1, 1,
2165 },
2166 {
2168 1, 1,
2171 },
2172 {
2174 1, 0,
2177 },
2178 {
2180 0, 1,
2183 },
2184 {
2186 1, 0,
2189 },
2190 {
2192 1, 0,
2195 },
2196 {
2198 1, 0,
2201 },
2202 {
2204 1, 0,
2207 },
2209 };
2210
2212 {
2214 1, 0,
2217 },
2218 {
2220 1, 0,
2223 },
2224 {
2226 1, 0,
2229 },
2230 {
2232 1, 0,
2235 },
2236 {
2238 1, 0,
2241 },
2242 {
2244 1, 0,
2247 },
2248 {
2250 1, 0,
2253 },
2255 };
2256
2258 {
2260 1, 0,
2263 },
2264 {
2266 1, 0,
2269 },
2270 {
2272 1, 0,
2275 },
2276 {
2278 1, 0,
2281 },
2282 {
2284 1, 0,
2287 },
2288 {
2290 1, 0,
2293 },
2294 {
2296 1, 0,
2299 },
2300 {
2302 0, 1,
2305 },
2306 {
2308 1, 0,
2311 },
2312 {
2314 1, 0,
2317 },
2318 {
2320 1, 0,
2323 },
2325 };
2326
2329 };
2330
2332 {
2334 1, 0,
2337 },
2338 {
2340 1, 0,
2343 },
2344 {
2346 1, 0,
2349 },
2351 };
2352
2354 int payload_type)
2355 {
2358
2359 switch (
ctx->codec->codec_id) {
2362 break;
2365 break;
2368 break;
2369 default:
2371 }
2372
2376 }
2377
2382 }
2383 }
2384
2388 }
2389
2391 }