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 = ff_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
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 ff_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 ff_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;
807 if (err < 0)
808 return err;
814 }
815 }
817 return 0;
818 }
819
823 {
825 int err;
826
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
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
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;
1089
1091 if (err < 0)
1092 return err;
1093
1095 if (err < 0)
1096 return err;
1097
1098 switch (unit->
type) {
1100 {
1101 err = cbs_h266_read_dci(
ctx, &gbc, unit->
content);
1102
1103 if (err < 0)
1104 return err;
1105 }
1106 break;
1108 {
1109 err = cbs_h266_read_opi(
ctx, &gbc, unit->
content);
1110
1111 if (err < 0)
1112 return err;
1113 }
1114 break;
1116 {
1118
1119 err = cbs_h266_read_vps(
ctx, &gbc,
vps);
1120 if (err < 0)
1121 return err;
1122
1123 err = cbs_h266_replace_vps(
ctx, unit);
1124 if (err < 0)
1125 return err;
1126 }
1127 break;
1129 {
1131
1132 err = cbs_h266_read_sps(
ctx, &gbc,
sps);
1133 if (err < 0)
1134 return err;
1135
1136 err = cbs_h266_replace_sps(
ctx, unit);
1137 if (err < 0)
1138 return err;
1139 }
1140 break;
1141
1143 {
1145
1146 err = cbs_h266_read_pps(
ctx, &gbc,
pps);
1147 if (err < 0)
1148 return err;
1149
1150 err = cbs_h266_replace_pps(
ctx, unit);
1151 if (err < 0)
1152 return err;
1153 }
1154 break;
1155
1158 {
1159 err = cbs_h266_read_aps(
ctx, &gbc, unit->
content,
1161
1162 if (err < 0)
1163 return err;
1164 }
1165 break;
1167 {
1169 err = cbs_h266_read_ph(
ctx, &gbc,
ph);
1170 if (err < 0)
1171 return err;
1173 if (err < 0)
1174 return err;
1175 }
1176 break;
1177
1186 {
1189
1190 err = cbs_h266_read_slice_header(
ctx, &gbc, &slice->
header);
1191 if (err < 0)
1192 return err;
1193
1196
1199
1202 if (err < 0)
1203 return err;
1204 }
1205
1213 }
1214 break;
1215
1217 {
1218 err = cbs_h266_read_aud(
ctx, &gbc, unit->
content);
1219 if (err < 0)
1220 return err;
1221 }
1222 break;
1223
1226 {
1227 err = cbs_h266_read_sei(
ctx, &gbc, unit->
content,
1229
1230 if (err < 0)
1231 return err;
1232 }
1233 break;
1234
1235 default:
1237 }
1238 return 0;
1239 }
1240
1243 size_t data_size, int data_bit_start)
1244 {
1245 size_t rest = data_size - (data_bit_start + 7) / 8;
1246 const uint8_t *
pos =
data + data_bit_start / 8;
1247
1249 data_size > data_bit_start / 8);
1250
1253
1254 if (!rest)
1255 goto rbsp_stop_one_bit;
1256
1257 // First copy the remaining bits of the first byte
1258 // The above check ensures that we do not accidentally
1259 // copy beyond the rbsp_stop_one_bit.
1260 if (data_bit_start % 8)
1261 put_bits(pbc, 8 - data_bit_start % 8,
1263
1265 // If the writer is aligned at this point,
1266 // memcpy can be used to improve performance.
1267 // This happens normally for CABAC.
1271 } else {
1272 // If not, we have to copy manually.
1273 // rbsp_stop_one_bit forces us to special-case
1274 // the last byte.
1277
1278 for (; rest > 4; rest -= 4,
pos += 4)
1280
1281 for (; rest > 1; rest--,
pos++)
1283
1284 rbsp_stop_one_bit:
1286
1290 i = rest ? (8 -
i) : (8 -
i - data_bit_start % 8);
1294 }
1295
1296 return 0;
1297 }
1298
1302 {
1303 int err;
1304
1305 switch (unit->
type) {
1307 {
1309
1310 err = cbs_h264_write_sps(
ctx, pbc,
sps);
1311 if (err < 0)
1312 return err;
1313
1314 err = cbs_h264_replace_sps(
ctx, unit);
1315 if (err < 0)
1316 return err;
1317 }
1318 break;
1319
1321 {
1323
1324 err = cbs_h264_write_sps_extension(
ctx, pbc, sps_ext);
1325 if (err < 0)
1326 return err;
1327 }
1328 break;
1329
1331 {
1333
1334 err = cbs_h264_write_pps(
ctx, pbc,
pps);
1335 if (err < 0)
1336 return err;
1337
1338 err = cbs_h264_replace_pps(
ctx, unit);
1339 if (err < 0)
1340 return err;
1341 }
1342 break;
1343
1347 {
1349
1350 err = cbs_h264_write_slice_header(
ctx, pbc, &slice->
header);
1351 if (err < 0)
1352 return err;
1353
1358 if (err < 0)
1359 return err;
1360 } else {
1361 // No slice data - that was just the header.
1362 // (Bitstream may be unaligned!)
1363 }
1364 }
1365 break;
1366
1368 {
1369 err = cbs_h264_write_aud(
ctx, pbc, unit->
content);
1370 if (err < 0)
1371 return err;
1372 }
1373 break;
1374
1376 {
1377 err = cbs_h264_write_sei(
ctx, pbc, unit->
content);
1378 if (err < 0)
1379 return err;
1380 }
1381 break;
1382
1384 {
1385 err = cbs_h264_write_filler(
ctx, pbc, unit->
content);
1386 if (err < 0)
1387 return err;
1388 }
1389 break;
1390
1392 {
1393 err = cbs_h264_write_end_of_sequence(
ctx, pbc, unit->
content);
1394 if (err < 0)
1395 return err;
1396 }
1397 break;
1398
1400 {
1401 err = cbs_h264_write_end_of_stream(
ctx, pbc, unit->
content);
1402 if (err < 0)
1403 return err;
1404 }
1405 break;
1406
1407 default:
1409 "NAL unit type %"PRIu32
".\n", unit->
type);
1411 }
1412
1413 return 0;
1414 }
1415
1419 {
1420 int err;
1421
1422 switch (unit->
type) {
1424 {
1426
1427 err = cbs_h265_write_vps(
ctx, pbc,
vps);
1428 if (err < 0)
1429 return err;
1430
1431 err = cbs_h265_replace_vps(
ctx, unit);
1432 if (err < 0)
1433 return err;
1434 }
1435 break;
1436
1438 {
1440
1441 err = cbs_h265_write_sps(
ctx, pbc,
sps);
1442 if (err < 0)
1443 return err;
1444
1445 err = cbs_h265_replace_sps(
ctx, unit);
1446 if (err < 0)
1447 return err;
1448 }
1449 break;
1450
1452 {
1454
1455 err = cbs_h265_write_pps(
ctx, pbc,
pps);
1456 if (err < 0)
1457 return err;
1458
1459 err = cbs_h265_replace_pps(
ctx, unit);
1460 if (err < 0)
1461 return err;
1462 }
1463 break;
1464
1481 {
1483
1484 err = cbs_h265_write_slice_segment_header(
ctx, pbc, &slice->
header);
1485 if (err < 0)
1486 return err;
1487
1492 if (err < 0)
1493 return err;
1494 } else {
1495 // No slice data - that was just the header.
1496 }
1497 }
1498 break;
1499
1501 {
1502 err = cbs_h265_write_aud(
ctx, pbc, unit->
content);
1503 if (err < 0)
1504 return err;
1505 }
1506 break;
1507
1509 {
1510 err = cbs_h265_write_filler(
ctx, pbc, unit->
content);
1511 if (err < 0)
1512 return err;
1513 }
1514 break;
1515
1518 {
1519 err = cbs_h265_write_sei(
ctx, pbc, unit->
content,
1521
1522 if (err < 0)
1523 return err;
1524 }
1525 break;
1526
1527 default:
1529 "NAL unit type %"PRIu32
".\n", unit->
type);
1531 }
1532
1533 return 0;
1534 }
1535
1539 {
1542 int slice_type_i, slice_type_b, slice_type_si;
1543
1545 return 0;
1546
1547 // keep non-VCL
1551 return 0;
1552
1554 return 1;
1555
1557 return 1;
1558
1562 "h264 nal unit header is null, missing decompose?\n");
1563 return 0;
1564 }
1565
1567 return 1;
1568
1572 "h264 slice header is null, missing decompose?\n");
1573 return 0;
1574 }
1575
1579
1581 return 1;
1583 return 1;
1584
1585 return 0;
1586 }
1587
1591 {
1593
1595 return 0;
1596
1597 switch (unit->
type) {
1604 // IRAP slice
1606 return 0;
1607 break;
1608
1619 // Slice
1620 break;
1621 default:
1622 // Don't discard non-slice nal.
1623 return 0;
1624 }
1625
1627 return 1;
1628
1632 "h265 slice header is null, missing decompose?\n");
1633 return 0;
1634 }
1635
1637 return 1;
1639 return 1;
1640
1642 switch (unit->
type) {
1651 // non-ref
1652 return 1;
1653 default:
1654 break;
1655 }
1656 }
1657
1658 return 0;
1659 }
1660
1664 {
1665 int err;
1666
1667 switch (unit->
type) {
1669 {
1671
1672 err = cbs_h266_write_dci(
ctx, pbc,
dci);
1673 if (err < 0)
1674 return err;
1675 }
1676 break;
1678 {
1680
1681 err = cbs_h266_write_opi(
ctx, pbc,
opi);
1682 if (err < 0)
1683 return err;
1684 }
1685 break;
1687 {
1689
1690 err = cbs_h266_write_vps(
ctx, pbc,
vps);
1691 if (err < 0)
1692 return err;
1693
1694 err = cbs_h266_replace_vps(
ctx, unit);
1695 if (err < 0)
1696 return err;
1697 }
1698 break;
1700 {
1702
1703 err = cbs_h266_write_sps(
ctx, pbc,
sps);
1704 if (err < 0)
1705 return err;
1706
1707 err = cbs_h266_replace_sps(
ctx, unit);
1708 if (err < 0)
1709 return err;
1710 }
1711 break;
1712
1714 {
1716
1717 err = cbs_h266_write_pps(
ctx, pbc,
pps);
1718 if (err < 0)
1719 return err;
1720
1721 err = cbs_h266_replace_pps(
ctx, unit);
1722 if (err < 0)
1723 return err;
1724 }
1725 break;
1726
1729 {
1730 err = cbs_h266_write_aps(
ctx, pbc, unit->
content,
1732 if (err < 0)
1733 return err;
1734 }
1735 break;
1737 {
1739 err = cbs_h266_write_ph(
ctx, pbc,
ph);
1740 if (err < 0)
1741 return err;
1742
1744 if (err < 0)
1745 return err;
1746 }
1747 break;
1748
1757 {
1759
1760 err = cbs_h266_write_slice_header(
ctx, pbc, &slice->
header);
1761 if (err < 0)
1762 return err;
1763
1766 if (err < 0)
1767 return err;
1768 }
1769
1774 if (err < 0)
1775 return err;
1776 } else {
1777 // No slice data - that was just the header.
1778 }
1779 }
1780 break;
1781
1783 {
1784 err = cbs_h266_write_aud(
ctx, pbc, unit->
content);
1785 if (err < 0)
1786 return err;
1787 }
1788 break;
1789
1792 {
1793 err = cbs_h266_write_sei(
ctx, pbc, unit->
content,
1795
1796 if (err < 0)
1797 return err;
1798 }
1799 break;
1800
1801 default:
1803 "NAL unit type %"PRIu32
".\n", unit->
type);
1805 }
1806
1807 return 0;
1808 }
1809
1812 int nal_unit_index)
1813 {
1814 // Section B.1.2 in H.264, section B.2.2 in H.265, H.266.
1815 if (nal_unit_index == 0) {
1816 // Assume that this is the first NAL unit in an access unit.
1817 return 1;
1818 }
1825 return 0;
1826 }
1827
1830 {
1832 size_t max_size, dp, sp;
1833 int err,
i, zero_run;
1834
1836 // Data should already all have been written when we get here.
1838 }
1839
1840 max_size = 0;
1842 // Start code + content with worst-case emulation prevention.
1844 }
1845
1849
1850 dp = 0;
1853
1855 if (i < frag->nb_units - 1)
1857 "unaligned padding on non-final NAL unit.\n");
1858 else
1860 }
1861
1863 // zero_byte
1865 }
1866 // start_code_prefix_one_3bytes
1870
1871 zero_run = 0;
1872 for (sp = 0; sp < unit->
data_size; sp++) {
1873 if (zero_run < 2) {
1874 if (unit->
data[sp] == 0)
1875 ++zero_run;
1876 else
1877 zero_run = 0;
1878 } else {
1879 if ((unit->
data[sp] & ~3) == 0) {
1880 // emulation_prevention_three_byte
1882 }
1883 zero_run = unit->
data[sp] == 0;
1884 }
1886 }
1887 }
1888
1891 if (err)
1892 return err;
1894
1900 }
1901
1904
1905 return 0;
1906 }
1907
1909 {
1911
1916
1920 }
1921
1923 {
1926
1928
1933 }
1934
1936 {
1938
1945
1949 }
1950
1952 {
1955
1957
1964 }
1965
1967 {
1969
1977 }
1978
1980 {
1982
1985 }
1986
1988 {
1991 }
1992
1996
1998
2002
2007
2009
2011 };
2012
2014 {
2017 }
2018
2023
2026
2027 // Slices of non-IRAP pictures.
2030 // Slices of IRAP pictures.
2033
2036
2038 };
2039
2041 {
2044 }
2045
2050 {
2051 .nb_unit_types = 1,
2056 .nb_offsets = 2,
2059 },
2060 },
2064
2067
2070
2073
2076
2078 };
2079
2082
2084
2086
2092
2095 };
2096
2099
2101
2103
2109
2112 };
2113
2116
2118
2120
2125
2128 };
2129
2130 // Macro for the read/write pair.
2131 #define SEI_MESSAGE_RW(codec, name) \
2132 .read = cbs_ ## codec ## _read_ ## name ## _internal, \
2133 .write = cbs_ ## codec ## _write_ ## name ## _internal
2134
2136 {
2138 1, 1,
2141 },
2142 {
2144 1, 1,
2147 },
2148 {
2150 1, 1,
2153 },
2154 {
2156 1, 0,
2159 },
2160 {
2162 0, 1,
2165 },
2166 {
2168 1, 0,
2171 },
2172 {
2174 1, 0,
2177 },
2178 {
2180 1, 0,
2183 },
2184 {
2186 1, 0,
2189 },
2191 };
2192
2194 {
2196 1, 0,
2199 },
2200 {
2202 1, 0,
2205 },
2206 {
2208 1, 0,
2211 },
2212 {
2214 1, 0,
2217 },
2218 {
2220 1, 0,
2223 },
2224 {
2226 1, 0,
2229 },
2230 {
2232 1, 0,
2235 },
2237 };
2238
2240 {
2242 1, 0,
2245 },
2246 {
2248 1, 0,
2251 },
2252 {
2254 1, 0,
2257 },
2258 {
2260 1, 0,
2263 },
2264 {
2266 1, 0,
2269 },
2270 {
2272 1, 0,
2275 },
2276 {
2278 1, 0,
2281 },
2282 {
2284 0, 1,
2287 },
2288 {
2290 1, 0,
2293 },
2294 {
2296 1, 0,
2299 },
2300 {
2302 1, 0,
2305 },
2307 };
2308
2311 };
2312
2314 int payload_type)
2315 {
2318
2319 switch (
ctx->codec->codec_id) {
2322 break;
2325 break;
2328 break;
2329 default:
2331 }
2332
2336 }
2337
2341 }
2342
2344 }