2 * This file is part of Libav.
4 * Libav 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.
9 * Libav 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.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "libavutil/attributes.h"
20 #include "libavutil/avassert.h"
22 #include "bytestream.h"
24 #include "cbs_internal.h"
30 #include "h2645_parse.h"
34 static int cbs_read_ue_golomb(CodedBitstreamContext *ctx, BitstreamContext *bc,
35 const char *name, uint32_t *write_to,
36 uint32_t range_min, uint32_t range_max)
41 if (ctx->trace_enable) {
46 position = bitstream_tell(bc);
48 for (i = 0; i < 32; i++) {
49 k = bitstream_read_bit(bc);
50 bits[i] = k ? '1' : '0';
55 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb "
56 "code found while reading %s: "
57 "more than 31 zeroes.\n", name);
58 return AVERROR_INVALIDDATA;
61 for (j = 0; j < i; j++) {
62 k = bitstream_read_bit(bc);
63 bits[i + j + 1] = k ? '1' : '0';
64 value = value << 1 | k;
69 ff_cbs_trace_syntax_element(ctx, position, name, bits, value);
71 value = get_ue_golomb_long(bc);
74 if (value < range_min || value > range_max) {
75 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
76 "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
77 name, value, range_min, range_max);
78 return AVERROR_INVALIDDATA;
85 static int cbs_read_se_golomb(CodedBitstreamContext *ctx, BitstreamContext *bc,
86 const char *name, int32_t *write_to,
87 int32_t range_min, int32_t range_max)
92 if (ctx->trace_enable) {
98 position = bitstream_tell(bc);
100 for (i = 0; i < 32; i++) {
101 k = bitstream_read_bit(bc);
102 bits[i] = k ? '1' : '0';
107 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb "
108 "code found while reading %s: "
109 "more than 31 zeroes.\n", name);
110 return AVERROR_INVALIDDATA;
113 for (j = 0; j < i; j++) {
114 k = bitstream_read_bit(bc);
115 bits[i + j + 1] = k ? '1' : '0';
120 value = -(int32_t)(v / 2);
124 ff_cbs_trace_syntax_element(ctx, position, name, bits, value);
126 value = get_se_golomb_long(bc);
129 if (value < range_min || value > range_max) {
130 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
131 "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
132 name, value, range_min, range_max);
133 return AVERROR_INVALIDDATA;
140 static int cbs_write_ue_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc,
141 const char *name, uint32_t value,
142 uint32_t range_min, uint32_t range_max)
146 if (value < range_min || value > range_max) {
147 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
148 "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n",
149 name, value, range_min, range_max);
150 return AVERROR_INVALIDDATA;
152 av_assert0(value != UINT32_MAX);
154 len = av_log2(value + 1);
155 if (put_bits_left(pbc) < 2 * len + 1)
156 return AVERROR(ENOSPC);
158 if (ctx->trace_enable) {
162 for (i = 0; i < len; i++)
165 for (i = 0; i < len; i++)
166 bits[len + i + 1] = (value + 1) >> (len - i - 1) & 1 ? '1' : '0';
167 bits[len + len + 1] = 0;
169 ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc), name, bits, value);
172 put_bits(pbc, len, 0);
174 put_bits(pbc, len + 1, value + 1);
176 put_bits32(pbc, value + 1);
181 static int cbs_write_se_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc,
182 const char *name, int32_t value,
183 int32_t range_min, int32_t range_max)
188 if (value < range_min || value > range_max) {
189 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
190 "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
191 name, value, range_min, range_max);
192 return AVERROR_INVALIDDATA;
194 av_assert0(value != INT32_MIN);
199 uvalue = 2 * (uint32_t)value - 1;
201 uvalue = 2 * (uint32_t)-value;
203 len = av_log2(uvalue + 1);
204 if (put_bits_left(pbc) < 2 * len + 1)
205 return AVERROR(ENOSPC);
207 if (ctx->trace_enable) {
211 for (i = 0; i < len; i++)
214 for (i = 0; i < len; i++)
215 bits[len + i + 1] = (uvalue + 1) >> (len - i - 1) & 1 ? '1' : '0';
216 bits[len + len + 1] = 0;
218 ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc), name, bits, value);
221 put_bits(pbc, len, 0);
223 put_bits(pbc, len + 1, uvalue + 1);
225 put_bits32(pbc, uvalue + 1);
230 #define HEADER(name) do { \
231 ff_cbs_trace_header(ctx, name); \
234 #define CHECK(call) do { \
240 #define FUNC_NAME(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
241 #define FUNC_H264(rw, name) FUNC_NAME(rw, h264, name)
242 #define FUNC_H265(rw, name) FUNC_NAME(rw, h265, name)
246 #define READWRITE read
247 #define RWContext BitstreamContext
249 #define xu(width, name, var, range_min, range_max) do { \
250 uint32_t value = range_min; \
251 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
252 &value, range_min, range_max)); \
255 #define xue(name, var, range_min, range_max) do { \
256 uint32_t value = range_min; \
257 CHECK(cbs_read_ue_golomb(ctx, rw, #name, \
258 &value, range_min, range_max)); \
261 #define xse(name, var, range_min, range_max) do { \
262 int32_t value = range_min; \
263 CHECK(cbs_read_se_golomb(ctx, rw, #name, \
264 &value, range_min, range_max)); \
269 #define u(width, name, range_min, range_max) \
270 xu(width, name, current->name, range_min, range_max)
271 #define flag(name) u(1, name, 0, 1)
272 #define ue(name, range_min, range_max) \
273 xue(name, current->name, range_min, range_max)
274 #define se(name, range_min, range_max) \
275 xse(name, current->name, range_min, range_max)
277 #define infer(name, value) do { \
278 current->name = value; \
281 static int cbs_h2645_read_more_rbsp_data(BitstreamContext *bc)
283 int bits_left = bitstream_bits_left(bc);
286 if (bitstream_peek(bc, bits_left) == 1 << (bits_left - 1))
291 #define more_rbsp_data(var) ((var) = cbs_h2645_read_more_rbsp_data(rw))
293 #define byte_alignment(rw) (bitstream_tell(rw) % 8)
295 #define allocate(name, size) do { \
296 name = av_mallocz(size); \
298 return AVERROR(ENOMEM); \
301 #define FUNC(name) FUNC_H264(READWRITE, name)
302 #include "cbs_h264_syntax_template.c"
305 #define FUNC(name) FUNC_H265(READWRITE, name)
306 #include "cbs_h265_syntax_template.c"
320 #undef more_rbsp_data
321 #undef byte_alignment
326 #define READWRITE write
327 #define RWContext PutBitContext
329 #define xu(width, name, var, range_min, range_max) do { \
330 uint32_t value = var; \
331 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
332 value, range_min, range_max)); \
334 #define xue(name, var, range_min, range_max) do { \
335 uint32_t value = var; \
336 CHECK(cbs_write_ue_golomb(ctx, rw, #name, \
337 value, range_min, range_max)); \
339 #define xse(name, var, range_min, range_max) do { \
340 int32_t value = var; \
341 CHECK(cbs_write_se_golomb(ctx, rw, #name, \
342 value, range_min, range_max)); \
345 #define u(width, name, range_min, range_max) \
346 xu(width, name, current->name, range_min, range_max)
347 #define flag(name) u(1, name, 0, 1)
348 #define ue(name, range_min, range_max) \
349 xue(name, current->name, range_min, range_max)
350 #define se(name, range_min, range_max) \
351 xse(name, current->name, range_min, range_max)
353 #define infer(name, value) do { \
354 if (current->name != (value)) { \
355 av_log(ctx->log_ctx, AV_LOG_WARNING, "Warning: " \
356 "%s does not match inferred value: " \
357 "%"PRId64", but should be %"PRId64".\n", \
358 #name, (int64_t)current->name, (int64_t)(value)); \
362 #define more_rbsp_data(var) (var)
364 #define byte_alignment(rw) (put_bits_count(rw) % 8)
366 #define allocate(name, size) do { \
368 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s must be set " \
369 "for writing.\n", #name); \
370 return AVERROR_INVALIDDATA; \
374 #define FUNC(name) FUNC_H264(READWRITE, name)
375 #include "cbs_h264_syntax_template.c"
378 #define FUNC(name) FUNC_H265(READWRITE, name)
379 #include "cbs_h265_syntax_template.c"
393 #undef more_rbsp_data
394 #undef byte_alignment
398 static void cbs_h264_free_sei(H264RawSEI *sei)
401 for (i = 0; i < sei->payload_count; i++) {
402 H264RawSEIPayload *payload = &sei->payload[i];
404 switch (payload->payload_type) {
405 case H264_SEI_TYPE_BUFFERING_PERIOD:
406 case H264_SEI_TYPE_PIC_TIMING:
407 case H264_SEI_TYPE_RECOVERY_POINT:
408 case H264_SEI_TYPE_DISPLAY_ORIENTATION:
410 case H264_SEI_TYPE_USER_DATA_REGISTERED:
411 av_freep(&payload->payload.user_data_registered.data);
413 case H264_SEI_TYPE_USER_DATA_UNREGISTERED:
414 av_freep(&payload->payload.user_data_unregistered.data);
417 av_freep(&payload->payload.other.data);
423 static void cbs_h264_free_slice(H264RawSlice *slice)
425 av_freep(&slice->data);
428 static void cbs_h264_free_nal_unit(CodedBitstreamUnit *unit)
430 switch (unit->type) {
432 cbs_h264_free_sei(unit->content);
434 case H264_NAL_IDR_SLICE:
436 cbs_h264_free_slice(unit->content);
439 av_freep(&unit->content);
442 static void cbs_h265_free_nal_unit(CodedBitstreamUnit *unit)
444 switch (unit->type) {
446 av_freep(&((H265RawVPS*)unit->content)->extension_data.data);
449 av_freep(&((H265RawSPS*)unit->content)->extension_data.data);
452 av_freep(&((H265RawPPS*)unit->content)->extension_data.data);
454 case HEVC_NAL_TRAIL_N:
455 case HEVC_NAL_TRAIL_R:
458 case HEVC_NAL_STSA_N:
459 case HEVC_NAL_STSA_R:
460 case HEVC_NAL_RADL_N:
461 case HEVC_NAL_RADL_R:
462 case HEVC_NAL_RASL_N:
463 case HEVC_NAL_RASL_R:
464 case HEVC_NAL_BLA_W_LP:
465 case HEVC_NAL_BLA_W_RADL:
466 case HEVC_NAL_BLA_N_LP:
467 case HEVC_NAL_IDR_W_RADL:
468 case HEVC_NAL_IDR_N_LP:
469 case HEVC_NAL_CRA_NUT:
470 av_freep(&((H265RawSlice*)unit->content)->data);
473 av_freep(&unit->content);
476 static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx,
477 CodedBitstreamFragment *frag,
478 const H2645Packet *packet)
482 for (i = 0; i < packet->nb_nals; i++) {
483 const H2645NAL *nal = &packet->nals[i];
486 data = av_malloc(nal->size);
488 return AVERROR(ENOMEM);
489 memcpy(data, nal->data, nal->size);
491 err = ff_cbs_insert_unit_data(ctx, frag, -1, nal->type,
502 static int cbs_h2645_split_fragment(CodedBitstreamContext *ctx,
503 CodedBitstreamFragment *frag,
506 enum AVCodecID codec_id = ctx->codec->codec_id;
507 CodedBitstreamH2645Context *priv = ctx->priv_data;
511 av_assert0(frag->data && frag->nb_units == 0);
512 if (frag->data_size == 0)
515 if (header && frag->data[0] && codec_id == AV_CODEC_ID_H264) {
517 size_t size, start, end;
518 int i, count, version;
522 bytestream2_init(&gbc, frag->data, frag->data_size);
524 if (bytestream2_get_bytes_left(&gbc) < 6)
525 return AVERROR_INVALIDDATA;
527 version = bytestream2_get_byte(&gbc);
529 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid AVCC header: "
530 "first byte %u.", version);
531 return AVERROR_INVALIDDATA;
534 bytestream2_skip(&gbc, 3);
535 priv->nal_length_size = (bytestream2_get_byte(&gbc) & 3) + 1;
538 count = bytestream2_get_byte(&gbc) & 0x1f;
539 start = bytestream2_tell(&gbc);
540 for (i = 0; i < count; i++) {
541 if (bytestream2_get_bytes_left(&gbc) < 2 * (count - i))
542 return AVERROR_INVALIDDATA;
543 size = bytestream2_get_be16(&gbc);
544 if (bytestream2_get_bytes_left(&gbc) < size)
545 return AVERROR_INVALIDDATA;
546 bytestream2_skip(&gbc, size);
548 end = bytestream2_tell(&gbc);
550 err = ff_h2645_packet_split(&priv->read_packet,
551 frag->data + start, end - start,
552 ctx->log_ctx, 1, 2, AV_CODEC_ID_H264);
554 av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to split AVCC SPS array.\n");
557 err = cbs_h2645_fragment_add_nals(ctx, frag, &priv->read_packet);
562 count = bytestream2_get_byte(&gbc);
563 start = bytestream2_tell(&gbc);
564 for (i = 0; i < count; i++) {
565 if (bytestream2_get_bytes_left(&gbc) < 2 * (count - i))
566 return AVERROR_INVALIDDATA;
567 size = bytestream2_get_be16(&gbc);
568 if (bytestream2_get_bytes_left(&gbc) < size)
569 return AVERROR_INVALIDDATA;
570 bytestream2_skip(&gbc, size);
572 end = bytestream2_tell(&gbc);
574 err = ff_h2645_packet_split(&priv->read_packet,
575 frag->data + start, end - start,
576 ctx->log_ctx, 1, 2, AV_CODEC_ID_H264);
578 av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to split AVCC PPS array.\n");
581 err = cbs_h2645_fragment_add_nals(ctx, frag, &priv->read_packet);
585 if (bytestream2_get_bytes_left(&gbc) > 0) {
586 av_log(ctx->log_ctx, AV_LOG_WARNING, "%u bytes left at end of AVCC "
587 "header.\n", bytestream2_get_bytes_left(&gbc));
590 } else if (header && frag->data[0] && codec_id == AV_CODEC_ID_HEVC) {
592 size_t size, start, end;
593 int i, j, nb_arrays, nal_unit_type, nb_nals, version;
597 bytestream2_init(&gbc, frag->data, frag->data_size);
599 if (bytestream2_get_bytes_left(&gbc) < 23)
600 return AVERROR_INVALIDDATA;
602 version = bytestream2_get_byte(&gbc);
604 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid HVCC header: "
605 "first byte %u.", version);
606 return AVERROR_INVALIDDATA;
609 bytestream2_skip(&gbc, 20);
610 priv->nal_length_size = (bytestream2_get_byte(&gbc) & 3) + 1;
612 nb_arrays = bytestream2_get_byte(&gbc);
613 for (i = 0; i < nb_arrays; i++) {
614 nal_unit_type = bytestream2_get_byte(&gbc) & 0x3f;
615 nb_nals = bytestream2_get_be16(&gbc);
617 start = bytestream2_tell(&gbc);
618 for (j = 0; j < nb_nals; j++) {
619 if (bytestream2_get_bytes_left(&gbc) < 2)
620 return AVERROR_INVALIDDATA;
621 size = bytestream2_get_be16(&gbc);
622 if (bytestream2_get_bytes_left(&gbc) < size)
623 return AVERROR_INVALIDDATA;
624 bytestream2_skip(&gbc, size);
626 end = bytestream2_tell(&gbc);
628 err = ff_h2645_packet_split(&priv->read_packet,
629 frag->data + start, end - start,
630 ctx->log_ctx, 1, 2, AV_CODEC_ID_HEVC);
632 av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to split "
633 "HVCC array %d (%d NAL units of type %d).\n",
634 i, nb_nals, nal_unit_type);
637 err = cbs_h2645_fragment_add_nals(ctx, frag, &priv->read_packet);
643 // Annex B, or later MP4 with already-known parameters.
645 err = ff_h2645_packet_split(&priv->read_packet,
646 frag->data, frag->data_size,
648 priv->mp4, priv->nal_length_size,
653 err = cbs_h2645_fragment_add_nals(ctx, frag, &priv->read_packet);
661 #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \
662 static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \
663 const H26 ## h26n ## Raw ## ps_name *ps_var) \
665 CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
666 unsigned int id = ps_var->id_element; \
667 if (id > FF_ARRAY_ELEMS(priv->ps_var)) { \
668 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \
669 " id : %d.\n", id); \
670 return AVERROR_INVALIDDATA; \
672 av_freep(&priv->ps_var[id]); \
673 priv->ps_var[id] = av_malloc(sizeof(*ps_var)); \
674 if (!priv->ps_var[id]) \
675 return AVERROR(ENOMEM); \
676 memcpy(priv->ps_var[id], ps_var, sizeof(*ps_var)); \
680 cbs_h2645_replace_ps(4, SPS, sps, seq_parameter_set_id)
681 cbs_h2645_replace_ps(4, PPS, pps, pic_parameter_set_id)
682 cbs_h2645_replace_ps(5, VPS, vps, vps_video_parameter_set_id)
683 cbs_h2645_replace_ps(5, SPS, sps, sps_seq_parameter_set_id)
684 cbs_h2645_replace_ps(5, PPS, pps, pps_pic_parameter_set_id)
686 static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx,
687 CodedBitstreamUnit *unit)
692 err = bitstream_init(&bc, unit->data, 8 * unit->data_size);
696 switch (unit->type) {
701 sps = av_mallocz(sizeof(*sps));
703 return AVERROR(ENOMEM);
704 err = cbs_h264_read_sps(ctx, &bc, sps);
706 err = cbs_h264_replace_sps(ctx, sps);
716 case H264_NAL_SPS_EXT:
718 H264RawSPSExtension *sps_ext;
720 sps_ext = av_mallocz(sizeof(*sps_ext));
722 return AVERROR(ENOMEM);
723 err = cbs_h264_read_sps_extension(ctx, &bc, sps_ext);
729 unit->content = sps_ext;
737 pps = av_mallocz(sizeof(*pps));
739 return AVERROR(ENOMEM);
740 err = cbs_h264_read_pps(ctx, &bc, pps);
742 err = cbs_h264_replace_pps(ctx, pps);
753 case H264_NAL_IDR_SLICE:
754 case H264_NAL_AUXILIARY_SLICE:
759 slice = av_mallocz(sizeof(*slice));
761 return AVERROR(ENOMEM);
762 err = cbs_h264_read_slice_header(ctx, &bc, &slice->header);
768 pos = bitstream_tell(&bc);
769 len = unit->data_size;
770 if (!unit->data[len - 1]) {
772 for (z = 0; z < len && !unit->data[len - z - 1]; z++);
773 av_log(ctx->log_ctx, AV_LOG_DEBUG, "Deleted %d trailing zeroes "
774 "from slice data.\n", z);
778 slice->data_size = len - pos / 8;
779 slice->data = av_malloc(slice->data_size);
782 return AVERROR(ENOMEM);
785 unit->data + pos / 8, slice->data_size);
786 slice->data_bit_start = pos % 8;
788 unit->content = slice;
796 aud = av_mallocz(sizeof(*aud));
798 return AVERROR(ENOMEM);
799 err = cbs_h264_read_aud(ctx, &bc, aud);
813 sei = av_mallocz(sizeof(*sei));
815 return AVERROR(ENOMEM);
816 err = cbs_h264_read_sei(ctx, &bc, sei);
818 cbs_h264_free_sei(sei);
827 return AVERROR(ENOSYS);
833 static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
834 CodedBitstreamUnit *unit)
839 err = bitstream_init(&bc, unit->data, 8 * unit->data_size);
843 switch (unit->type) {
848 vps = av_mallocz(sizeof(*vps));
850 return AVERROR(ENOMEM);
851 err = cbs_h265_read_vps(ctx, &bc, vps);
853 err = cbs_h265_replace_vps(ctx, vps);
866 sps = av_mallocz(sizeof(*sps));
868 return AVERROR(ENOMEM);
869 err = cbs_h265_read_sps(ctx, &bc, sps);
871 err = cbs_h265_replace_sps(ctx, sps);
885 pps = av_mallocz(sizeof(*pps));
887 return AVERROR(ENOMEM);
888 err = cbs_h265_read_pps(ctx, &bc, pps);
890 err = cbs_h265_replace_pps(ctx, pps);
900 case HEVC_NAL_TRAIL_N:
901 case HEVC_NAL_TRAIL_R:
904 case HEVC_NAL_STSA_N:
905 case HEVC_NAL_STSA_R:
906 case HEVC_NAL_RADL_N:
907 case HEVC_NAL_RADL_R:
908 case HEVC_NAL_RASL_N:
909 case HEVC_NAL_RASL_R:
910 case HEVC_NAL_BLA_W_LP:
911 case HEVC_NAL_BLA_W_RADL:
912 case HEVC_NAL_BLA_N_LP:
913 case HEVC_NAL_IDR_W_RADL:
914 case HEVC_NAL_IDR_N_LP:
915 case HEVC_NAL_CRA_NUT:
920 slice = av_mallocz(sizeof(*slice));
922 return AVERROR(ENOMEM);
923 err = cbs_h265_read_slice_segment_header(ctx, &bc, &slice->header);
929 pos = bitstream_tell(&bc);
930 len = unit->data_size;
931 if (!unit->data[len - 1]) {
933 for (z = 0; z < len && !unit->data[len - z - 1]; z++);
934 av_log(ctx->log_ctx, AV_LOG_DEBUG, "Deleted %d trailing zeroes "
935 "from slice data.\n", z);
939 slice->data_size = len - pos / 8;
940 slice->data = av_malloc(slice->data_size);
943 return AVERROR(ENOMEM);
946 unit->data + pos / 8, slice->data_size);
947 slice->data_bit_start = pos % 8;
949 unit->content = slice;
957 aud = av_mallocz(sizeof(*aud));
959 return AVERROR(ENOMEM);
960 err = cbs_h265_read_aud(ctx, &bc, aud);
971 return AVERROR(ENOSYS);
977 static int cbs_h264_write_nal_unit(CodedBitstreamContext *ctx,
978 CodedBitstreamUnit *unit,
983 switch (unit->type) {
986 H264RawSPS *sps = unit->content;
988 err = cbs_h264_write_sps(ctx, pbc, sps);
992 err = cbs_h264_replace_sps(ctx, sps);
998 case H264_NAL_SPS_EXT:
1000 H264RawSPSExtension *sps_ext;
1002 err = cbs_h264_write_sps_extension(ctx, pbc, sps_ext);
1010 H264RawPPS *pps = unit->content;
1012 err = cbs_h264_write_pps(ctx, pbc, pps);
1016 err = cbs_h264_replace_pps(ctx, pps);
1022 case H264_NAL_SLICE:
1023 case H264_NAL_IDR_SLICE:
1025 H264RawSlice *slice = unit->content;
1026 BitstreamContext bc;
1027 int bits_left, end, zeroes;
1029 err = cbs_h264_write_slice_header(ctx, pbc, &slice->header);
1034 if (slice->data_size * 8 + 8 > put_bits_left(pbc))
1035 return AVERROR(ENOSPC);
1037 bitstream_init(&bc, slice->data, slice->data_size * 8);
1038 bitstream_skip(&bc, slice->data_bit_start);
1040 // Copy in two-byte blocks, but stop before copying the
1041 // rbsp_stop_one_bit in the final byte.
1042 while (bitstream_bits_left(&bc) > 23)
1043 put_bits(pbc, 16, bitstream_read(&bc, 16));
1045 bits_left = bitstream_bits_left(&bc);
1046 end = bitstream_read(&bc, bits_left);
1048 // rbsp_stop_one_bit must be present here.
1050 zeroes = ff_ctz(end);
1051 if (bits_left > zeroes + 1)
1052 put_bits(pbc, bits_left - zeroes - 1,
1053 end >> (zeroes + 1));
1054 put_bits(pbc, 1, 1);
1055 while (put_bits_count(pbc) % 8 != 0)
1056 put_bits(pbc, 1, 0);
1058 // No slice data - that was just the header.
1059 // (Bitstream may be unaligned!)
1066 err = cbs_h264_write_aud(ctx, pbc, unit->content);
1074 err = cbs_h264_write_sei(ctx, pbc, unit->content);
1081 av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for "
1082 "NAL unit type %"PRIu32".\n", unit->type);
1083 return AVERROR_PATCHWELCOME;
1089 static int cbs_h265_write_nal_unit(CodedBitstreamContext *ctx,
1090 CodedBitstreamUnit *unit,
1095 switch (unit->type) {
1098 H265RawVPS *vps = unit->content;
1100 err = cbs_h265_write_vps(ctx, pbc, vps);
1104 err = cbs_h265_replace_vps(ctx, vps);
1112 H265RawSPS *sps = unit->content;
1114 err = cbs_h265_write_sps(ctx, pbc, sps);
1118 err = cbs_h265_replace_sps(ctx, sps);
1126 H265RawPPS *pps = unit->content;
1128 err = cbs_h265_write_pps(ctx, pbc, pps);
1132 err = cbs_h265_replace_pps(ctx, pps);
1138 case HEVC_NAL_TRAIL_N:
1139 case HEVC_NAL_TRAIL_R:
1140 case HEVC_NAL_TSA_N:
1141 case HEVC_NAL_TSA_R:
1142 case HEVC_NAL_STSA_N:
1143 case HEVC_NAL_STSA_R:
1144 case HEVC_NAL_RADL_N:
1145 case HEVC_NAL_RADL_R:
1146 case HEVC_NAL_RASL_N:
1147 case HEVC_NAL_RASL_R:
1148 case HEVC_NAL_BLA_W_LP:
1149 case HEVC_NAL_BLA_W_RADL:
1150 case HEVC_NAL_BLA_N_LP:
1151 case HEVC_NAL_IDR_W_RADL:
1152 case HEVC_NAL_IDR_N_LP:
1153 case HEVC_NAL_CRA_NUT:
1155 H265RawSlice *slice = unit->content;
1156 BitstreamContext bc;
1157 int bits_left, end, zeroes;
1159 err = cbs_h265_write_slice_segment_header(ctx, pbc, &slice->header);
1164 if (slice->data_size * 8 + 8 > put_bits_left(pbc))
1165 return AVERROR(ENOSPC);
1167 bitstream_init(&bc, slice->data, slice->data_size * 8);
1168 bitstream_skip(&bc, slice->data_bit_start);
1170 // Copy in two-byte blocks, but stop before copying the
1171 // rbsp_stop_one_bit in the final byte.
1172 while (bitstream_bits_left(&bc) > 23)
1173 put_bits(pbc, 16, bitstream_read(&bc, 16));
1175 bits_left = bitstream_bits_left(&bc);
1176 end = bitstream_read(&bc, bits_left);
1178 // rbsp_stop_one_bit must be present here.
1180 zeroes = ff_ctz(end);
1181 if (bits_left > zeroes + 1)
1182 put_bits(pbc, bits_left - zeroes - 1,
1183 end >> (zeroes + 1));
1184 put_bits(pbc, 1, 1);
1185 while (put_bits_count(pbc) % 8 != 0)
1186 put_bits(pbc, 1, 0);
1188 // No slice data - that was just the header.
1195 err = cbs_h265_write_aud(ctx, pbc, unit->content);
1202 av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for "
1203 "NAL unit type %d.\n", unit->type);
1204 return AVERROR_PATCHWELCOME;
1210 static int cbs_h2645_write_nal_unit(CodedBitstreamContext *ctx,
1211 CodedBitstreamUnit *unit)
1213 CodedBitstreamH2645Context *priv = ctx->priv_data;
1214 enum AVCodecID codec_id = ctx->codec->codec_id;
1218 if (!priv->write_buffer) {
1219 // Initial write buffer size is 1MB.
1220 priv->write_buffer_size = 1024 * 1024;
1222 reallocate_and_try_again:
1223 err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
1225 av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
1226 "sufficiently large write buffer (last attempt "
1227 "%zu bytes).\n", priv->write_buffer_size);
1232 init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
1234 if (codec_id == AV_CODEC_ID_H264)
1235 err = cbs_h264_write_nal_unit(ctx, unit, &pbc);
1237 err = cbs_h265_write_nal_unit(ctx, unit, &pbc);
1239 if (err == AVERROR(ENOSPC)) {
1241 priv->write_buffer_size *= 2;
1242 goto reallocate_and_try_again;
1244 // Overflow but we didn't notice.
1245 av_assert0(put_bits_count(&pbc) <= 8 * priv->write_buffer_size);
1247 if (put_bits_count(&pbc) % 8)
1248 unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
1250 unit->data_bit_padding = 0;
1252 unit->data_size = (put_bits_count(&pbc) + 7) / 8;
1253 flush_put_bits(&pbc);
1255 err = av_reallocp(&unit->data, unit->data_size);
1259 memcpy(unit->data, priv->write_buffer, unit->data_size);
1264 static int cbs_h2645_assemble_fragment(CodedBitstreamContext *ctx,
1265 CodedBitstreamFragment *frag)
1268 size_t max_size, dp, sp;
1269 int err, i, zero_run;
1271 for (i = 0; i < frag->nb_units; i++) {
1272 // Data should already all have been written when we get here.
1273 av_assert0(frag->units[i].data);
1277 for (i = 0; i < frag->nb_units; i++) {
1278 // Start code + content with worst-case emulation prevention.
1279 max_size += 3 + frag->units[i].data_size * 3 / 2;
1282 data = av_malloc(max_size);
1284 return AVERROR(ENOMEM);
1287 for (i = 0; i < frag->nb_units; i++) {
1288 CodedBitstreamUnit *unit = &frag->units[i];
1290 if (unit->data_bit_padding > 0) {
1291 if (i < frag->nb_units - 1)
1292 av_log(ctx->log_ctx, AV_LOG_WARNING, "Probably invalid "
1293 "unaligned padding on non-final NAL unit.\n");
1295 frag->data_bit_padding = unit->data_bit_padding;
1298 if ((ctx->codec->codec_id == AV_CODEC_ID_H264 &&
1299 (unit->type == H264_NAL_SPS ||
1300 unit->type == H264_NAL_PPS)) ||
1301 (ctx->codec->codec_id == AV_CODEC_ID_HEVC &&
1302 (unit->type == HEVC_NAL_VPS ||
1303 unit->type == HEVC_NAL_SPS ||
1304 unit->type == HEVC_NAL_PPS)) ||
1305 i == 0 /* (Assume this is the start of an access unit.) */) {
1309 // start_code_prefix_one_3bytes
1315 for (sp = 0; sp < unit->data_size; sp++) {
1317 if (unit->data[sp] == 0)
1322 if ((unit->data[sp] & ~3) == 0) {
1323 // emulation_prevention_three_byte
1326 zero_run = unit->data[sp] == 0;
1328 data[dp++] = unit->data[sp];
1332 av_assert0(dp <= max_size);
1333 err = av_reallocp(&data, dp);
1338 frag->data_size = dp;
1343 static void cbs_h264_close(CodedBitstreamContext *ctx)
1345 CodedBitstreamH264Context *h264 = ctx->priv_data;
1348 ff_h2645_packet_uninit(&h264->common.read_packet);
1350 av_freep(&h264->common.write_buffer);
1352 for (i = 0; i < FF_ARRAY_ELEMS(h264->sps); i++)
1353 av_freep(&h264->sps[i]);
1354 for (i = 0; i < FF_ARRAY_ELEMS(h264->pps); i++)
1355 av_freep(&h264->pps[i]);
1358 static void cbs_h265_close(CodedBitstreamContext *ctx)
1360 CodedBitstreamH265Context *h265 = ctx->priv_data;
1363 ff_h2645_packet_uninit(&h265->common.read_packet);
1365 av_freep(&h265->common.write_buffer);
1367 for (i = 0; i < FF_ARRAY_ELEMS(h265->vps); i++)
1368 av_freep(&h265->vps[i]);
1369 for (i = 0; i < FF_ARRAY_ELEMS(h265->sps); i++)
1370 av_freep(&h265->sps[i]);
1371 for (i = 0; i < FF_ARRAY_ELEMS(h265->pps); i++)
1372 av_freep(&h265->pps[i]);
1375 const CodedBitstreamType ff_cbs_type_h264 = {
1376 .codec_id = AV_CODEC_ID_H264,
1378 .priv_data_size = sizeof(CodedBitstreamH264Context),
1380 .split_fragment = &cbs_h2645_split_fragment,
1381 .read_unit = &cbs_h264_read_nal_unit,
1382 .write_unit = &cbs_h2645_write_nal_unit,
1383 .assemble_fragment = &cbs_h2645_assemble_fragment,
1385 .free_unit = &cbs_h264_free_nal_unit,
1386 .close = &cbs_h264_close,
1389 const CodedBitstreamType ff_cbs_type_h265 = {
1390 .codec_id = AV_CODEC_ID_HEVC,
1392 .priv_data_size = sizeof(CodedBitstreamH265Context),
1394 .split_fragment = &cbs_h2645_split_fragment,
1395 .read_unit = &cbs_h265_read_nal_unit,
1396 .write_unit = &cbs_h2645_write_nal_unit,
1397 .assemble_fragment = &cbs_h2645_assemble_fragment,
1399 .free_unit = &cbs_h265_free_nal_unit,
1400 .close = &cbs_h265_close,