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
)
43 position
= bitstream_tell(bc
);
45 for (i
= 0; i
< 32; i
++) {
46 if (bitstream_bits_left(bc
) < i
+ 1) {
47 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid ue-golomb code at "
48 "%s: bitstream ended.\n", name
);
49 return AVERROR_INVALIDDATA
;
51 k
= bitstream_read_bit(bc
);
52 bits
[i
] = k ?
'1' : '0';
57 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid ue-golomb code at "
58 "%s: more than 31 zeroes.\n", name
);
59 return AVERROR_INVALIDDATA
;
62 for (j
= 0; j
< i
; j
++) {
63 k
= bitstream_read_bit(bc
);
64 bits
[i
+ j
+ 1] = k ?
'1' : '0';
65 value
= value
<< 1 | k
;
70 if (ctx
->trace_enable
)
71 ff_cbs_trace_syntax_element(ctx
, position
, name
, bits
, value
);
73 if (value
< range_min
|| value
> range_max
) {
74 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "%s out of range: "
75 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
76 name
, value
, range_min
, range_max
);
77 return AVERROR_INVALIDDATA
;
84 static int cbs_read_se_golomb(CodedBitstreamContext
*ctx
, BitstreamContext
*bc
,
85 const char *name
, int32_t *write_to
,
86 int32_t range_min
, int32_t range_max
)
94 position
= bitstream_tell(bc
);
96 for (i
= 0; i
< 32; i
++) {
97 if (bitstream_bits_left(bc
) < i
+ 1) {
98 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid se-golomb code at "
99 "%s: bitstream ended.\n", name
);
100 return AVERROR_INVALIDDATA
;
102 k
= bitstream_read_bit(bc
);
103 bits
[i
] = k ?
'1' : '0';
108 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid se-golomb code at "
109 "%s: 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 if (ctx
->trace_enable
)
125 ff_cbs_trace_syntax_element(ctx
, position
, name
, bits
, value
);
127 if (value
< range_min
|| value
> range_max
) {
128 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "%s out of range: "
129 "%"PRId32
", but must be in [%"PRId32
",%"PRId32
"].\n",
130 name
, value
, range_min
, range_max
);
131 return AVERROR_INVALIDDATA
;
138 static int cbs_write_ue_golomb(CodedBitstreamContext
*ctx
, PutBitContext
*pbc
,
139 const char *name
, uint32_t value
,
140 uint32_t range_min
, uint32_t range_max
)
144 if (value
< range_min
|| value
> range_max
) {
145 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "%s out of range: "
146 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
147 name
, value
, range_min
, range_max
);
148 return AVERROR_INVALIDDATA
;
150 av_assert0(value
!= UINT32_MAX
);
152 len
= av_log2(value
+ 1);
153 if (put_bits_left(pbc
) < 2 * len
+ 1)
154 return AVERROR(ENOSPC
);
156 if (ctx
->trace_enable
) {
160 for (i
= 0; i
< len
; i
++)
163 for (i
= 0; i
< len
; i
++)
164 bits
[len
+ i
+ 1] = (value
+ 1) >> (len
- i
- 1) & 1 ?
'1' : '0';
165 bits
[len
+ len
+ 1] = 0;
167 ff_cbs_trace_syntax_element(ctx
, put_bits_count(pbc
), name
, bits
, value
);
170 put_bits(pbc
, len
, 0);
172 put_bits(pbc
, len
+ 1, value
+ 1);
174 put_bits32(pbc
, value
+ 1);
179 static int cbs_write_se_golomb(CodedBitstreamContext
*ctx
, PutBitContext
*pbc
,
180 const char *name
, int32_t value
,
181 int32_t range_min
, int32_t range_max
)
186 if (value
< range_min
|| value
> range_max
) {
187 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "%s out of range: "
188 "%"PRId32
", but must be in [%"PRId32
",%"PRId32
"].\n",
189 name
, value
, range_min
, range_max
);
190 return AVERROR_INVALIDDATA
;
192 av_assert0(value
!= INT32_MIN
);
197 uvalue
= 2 * (uint32_t)value
- 1;
199 uvalue
= 2 * (uint32_t)-value
;
201 len
= av_log2(uvalue
+ 1);
202 if (put_bits_left(pbc
) < 2 * len
+ 1)
203 return AVERROR(ENOSPC
);
205 if (ctx
->trace_enable
) {
209 for (i
= 0; i
< len
; i
++)
212 for (i
= 0; i
< len
; i
++)
213 bits
[len
+ i
+ 1] = (uvalue
+ 1) >> (len
- i
- 1) & 1 ?
'1' : '0';
214 bits
[len
+ len
+ 1] = 0;
216 ff_cbs_trace_syntax_element(ctx
, put_bits_count(pbc
), name
, bits
, value
);
219 put_bits(pbc
, len
, 0);
221 put_bits(pbc
, len
+ 1, uvalue
+ 1);
223 put_bits32(pbc
, uvalue
+ 1);
228 #define HEADER(name) do { \
229 ff_cbs_trace_header(ctx, name); \
232 #define CHECK(call) do { \
238 #define FUNC_NAME(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
239 #define FUNC_H264(rw, name) FUNC_NAME(rw, h264, name)
240 #define FUNC_H265(rw, name) FUNC_NAME(rw, h265, name)
244 #define READWRITE read
245 #define RWContext BitstreamContext
247 #define xu(width, name, var, range_min, range_max) do { \
248 uint32_t value = range_min; \
249 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
250 &value, range_min, range_max)); \
253 #define xue(name, var, range_min, range_max) do { \
254 uint32_t value = range_min; \
255 CHECK(cbs_read_ue_golomb(ctx, rw, #name, \
256 &value, range_min, range_max)); \
259 #define xse(name, var, range_min, range_max) do { \
260 int32_t value = range_min; \
261 CHECK(cbs_read_se_golomb(ctx, rw, #name, \
262 &value, range_min, range_max)); \
267 #define u(width, name, range_min, range_max) \
268 xu(width, name, current->name, range_min, range_max)
269 #define flag(name) u(1, name, 0, 1)
270 #define ue(name, range_min, range_max) \
271 xue(name, current->name, range_min, range_max)
272 #define se(name, range_min, range_max) \
273 xse(name, current->name, range_min, range_max)
275 #define infer(name, value) do { \
276 current->name = value; \
279 static int cbs_h2645_read_more_rbsp_data(BitstreamContext
*bc
)
281 int bits_left
= bitstream_bits_left(bc
);
284 if (bitstream_peek(bc
, bits_left
) == 1 << (bits_left
- 1))
289 #define more_rbsp_data(var) ((var) = cbs_h2645_read_more_rbsp_data(rw))
291 #define byte_alignment(rw) (bitstream_tell(rw) % 8)
293 #define allocate(name, size) do { \
294 name ## _ref = av_buffer_allocz(size); \
296 return AVERROR(ENOMEM); \
297 name = name ## _ref->data; \
300 #define FUNC(name) FUNC_H264(READWRITE, name)
301 #include "cbs_h264_syntax_template.c"
304 #define FUNC(name) FUNC_H265(READWRITE, name)
305 #include "cbs_h265_syntax_template.c"
319 #undef more_rbsp_data
320 #undef byte_alignment
325 #define READWRITE write
326 #define RWContext PutBitContext
328 #define xu(width, name, var, range_min, range_max) do { \
329 uint32_t value = var; \
330 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
331 value, range_min, range_max)); \
333 #define xue(name, var, range_min, range_max) do { \
334 uint32_t value = var; \
335 CHECK(cbs_write_ue_golomb(ctx, rw, #name, \
336 value, range_min, range_max)); \
338 #define xse(name, var, range_min, range_max) do { \
339 int32_t value = var; \
340 CHECK(cbs_write_se_golomb(ctx, rw, #name, \
341 value, range_min, range_max)); \
344 #define u(width, name, range_min, range_max) \
345 xu(width, name, current->name, range_min, range_max)
346 #define flag(name) u(1, name, 0, 1)
347 #define ue(name, range_min, range_max) \
348 xue(name, current->name, range_min, range_max)
349 #define se(name, range_min, range_max) \
350 xse(name, current->name, range_min, range_max)
352 #define infer(name, value) do { \
353 if (current->name != (value)) { \
354 av_log(ctx->log_ctx, AV_LOG_WARNING, "Warning: " \
355 "%s does not match inferred value: " \
356 "%"PRId64", but should be %"PRId64".\n", \
357 #name, (int64_t)current->name, (int64_t)(value)); \
361 #define more_rbsp_data(var) (var)
363 #define byte_alignment(rw) (put_bits_count(rw) % 8)
365 #define allocate(name, size) do { \
367 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s must be set " \
368 "for writing.\n", #name); \
369 return AVERROR_INVALIDDATA; \
373 #define FUNC(name) FUNC_H264(READWRITE, name)
374 #include "cbs_h264_syntax_template.c"
377 #define FUNC(name) FUNC_H265(READWRITE, name)
378 #include "cbs_h265_syntax_template.c"
392 #undef more_rbsp_data
393 #undef byte_alignment
397 static void cbs_h264_free_sei_payload(H264RawSEIPayload
*payload
)
399 switch (payload
->payload_type
) {
400 case H264_SEI_TYPE_BUFFERING_PERIOD
:
401 case H264_SEI_TYPE_PIC_TIMING
:
402 case H264_SEI_TYPE_RECOVERY_POINT
:
403 case H264_SEI_TYPE_DISPLAY_ORIENTATION
:
405 case H264_SEI_TYPE_USER_DATA_REGISTERED
:
406 av_buffer_unref(&payload
->payload
.user_data_registered
.data_ref
);
408 case H264_SEI_TYPE_USER_DATA_UNREGISTERED
:
409 av_buffer_unref(&payload
->payload
.user_data_unregistered
.data_ref
);
412 av_buffer_unref(&payload
->payload
.other
.data_ref
);
417 static void cbs_h264_free_sei(void *unit
, uint8_t *content
)
419 H264RawSEI
*sei
= (H264RawSEI
*)content
;
421 for (i
= 0; i
< sei
->payload_count
; i
++)
422 cbs_h264_free_sei_payload(&sei
->payload
[i
]);
426 static void cbs_h264_free_slice(void *unit
, uint8_t *content
)
428 H264RawSlice
*slice
= (H264RawSlice
*)content
;
429 av_buffer_unref(&slice
->data_ref
);
433 static void cbs_h265_free_vps(void *unit
, uint8_t *content
)
435 H265RawVPS
*vps
= (H265RawVPS
*)content
;
436 av_buffer_unref(&vps
->extension_data
.data_ref
);
440 static void cbs_h265_free_sps(void *unit
, uint8_t *content
)
442 H265RawSPS
*sps
= (H265RawSPS
*)content
;
443 av_buffer_unref(&sps
->extension_data
.data_ref
);
447 static void cbs_h265_free_pps(void *unit
, uint8_t *content
)
449 H265RawPPS
*pps
= (H265RawPPS
*)content
;
450 av_buffer_unref(&pps
->extension_data
.data_ref
);
454 static void cbs_h265_free_slice(void *unit
, uint8_t *content
)
456 H265RawSlice
*slice
= (H265RawSlice
*)content
;
457 av_buffer_unref(&slice
->data_ref
);
461 static int cbs_h2645_fragment_add_nals(CodedBitstreamContext
*ctx
,
462 CodedBitstreamFragment
*frag
,
463 const H2645Packet
*packet
)
467 for (i
= 0; i
< packet
->nb_nals
; i
++) {
468 const H2645NAL
*nal
= &packet
->nals
[i
];
469 size_t size
= nal
->size
;
472 // Remove trailing zeroes.
473 while (size
> 0 && nal
->data
[size
- 1] == 0)
475 av_assert0(size
> 0);
477 data
= av_malloc(size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
479 return AVERROR(ENOMEM
);
480 memcpy(data
, nal
->data
, size
);
481 memset(data
+ size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
483 err
= ff_cbs_insert_unit_data(ctx
, frag
, -1, nal
->type
,
484 data
, nal
->size
, NULL
);
494 static int cbs_h2645_split_fragment(CodedBitstreamContext
*ctx
,
495 CodedBitstreamFragment
*frag
,
498 enum AVCodecID codec_id
= ctx
->codec
->codec_id
;
499 CodedBitstreamH2645Context
*priv
= ctx
->priv_data
;
503 av_assert0(frag
->data
&& frag
->nb_units
== 0);
504 if (frag
->data_size
== 0)
507 if (header
&& frag
->data
[0] && codec_id
== AV_CODEC_ID_H264
) {
509 size_t size
, start
, end
;
510 int i
, count
, version
;
514 bytestream2_init(&gbc
, frag
->data
, frag
->data_size
);
516 if (bytestream2_get_bytes_left(&gbc
) < 6)
517 return AVERROR_INVALIDDATA
;
519 version
= bytestream2_get_byte(&gbc
);
521 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid AVCC header: "
522 "first byte %u.", version
);
523 return AVERROR_INVALIDDATA
;
526 bytestream2_skip(&gbc
, 3);
527 priv
->nal_length_size
= (bytestream2_get_byte(&gbc
) & 3) + 1;
530 count
= bytestream2_get_byte(&gbc
) & 0x1f;
531 start
= bytestream2_tell(&gbc
);
532 for (i
= 0; i
< count
; i
++) {
533 if (bytestream2_get_bytes_left(&gbc
) < 2 * (count
- i
))
534 return AVERROR_INVALIDDATA
;
535 size
= bytestream2_get_be16(&gbc
);
536 if (bytestream2_get_bytes_left(&gbc
) < size
)
537 return AVERROR_INVALIDDATA
;
538 bytestream2_skip(&gbc
, size
);
540 end
= bytestream2_tell(&gbc
);
542 err
= ff_h2645_packet_split(&priv
->read_packet
,
543 frag
->data
+ start
, end
- start
,
544 ctx
->log_ctx
, 1, 2, AV_CODEC_ID_H264
);
546 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Failed to split AVCC SPS array.\n");
549 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
554 count
= bytestream2_get_byte(&gbc
);
555 start
= bytestream2_tell(&gbc
);
556 for (i
= 0; i
< count
; i
++) {
557 if (bytestream2_get_bytes_left(&gbc
) < 2 * (count
- i
))
558 return AVERROR_INVALIDDATA
;
559 size
= bytestream2_get_be16(&gbc
);
560 if (bytestream2_get_bytes_left(&gbc
) < size
)
561 return AVERROR_INVALIDDATA
;
562 bytestream2_skip(&gbc
, size
);
564 end
= bytestream2_tell(&gbc
);
566 err
= ff_h2645_packet_split(&priv
->read_packet
,
567 frag
->data
+ start
, end
- start
,
568 ctx
->log_ctx
, 1, 2, AV_CODEC_ID_H264
);
570 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Failed to split AVCC PPS array.\n");
573 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
577 if (bytestream2_get_bytes_left(&gbc
) > 0) {
578 av_log(ctx
->log_ctx
, AV_LOG_WARNING
, "%u bytes left at end of AVCC "
579 "header.\n", bytestream2_get_bytes_left(&gbc
));
582 } else if (header
&& frag
->data
[0] && codec_id
== AV_CODEC_ID_HEVC
) {
584 size_t size
, start
, end
;
585 int i
, j
, nb_arrays
, nal_unit_type
, nb_nals
, version
;
589 bytestream2_init(&gbc
, frag
->data
, frag
->data_size
);
591 if (bytestream2_get_bytes_left(&gbc
) < 23)
592 return AVERROR_INVALIDDATA
;
594 version
= bytestream2_get_byte(&gbc
);
596 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid HVCC header: "
597 "first byte %u.", version
);
598 return AVERROR_INVALIDDATA
;
601 bytestream2_skip(&gbc
, 20);
602 priv
->nal_length_size
= (bytestream2_get_byte(&gbc
) & 3) + 1;
604 nb_arrays
= bytestream2_get_byte(&gbc
);
605 for (i
= 0; i
< nb_arrays
; i
++) {
606 nal_unit_type
= bytestream2_get_byte(&gbc
) & 0x3f;
607 nb_nals
= bytestream2_get_be16(&gbc
);
609 start
= bytestream2_tell(&gbc
);
610 for (j
= 0; j
< nb_nals
; j
++) {
611 if (bytestream2_get_bytes_left(&gbc
) < 2)
612 return AVERROR_INVALIDDATA
;
613 size
= bytestream2_get_be16(&gbc
);
614 if (bytestream2_get_bytes_left(&gbc
) < size
)
615 return AVERROR_INVALIDDATA
;
616 bytestream2_skip(&gbc
, size
);
618 end
= bytestream2_tell(&gbc
);
620 err
= ff_h2645_packet_split(&priv
->read_packet
,
621 frag
->data
+ start
, end
- start
,
622 ctx
->log_ctx
, 1, 2, AV_CODEC_ID_HEVC
);
624 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Failed to split "
625 "HVCC array %d (%d NAL units of type %d).\n",
626 i
, nb_nals
, nal_unit_type
);
629 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
635 // Annex B, or later MP4 with already-known parameters.
637 err
= ff_h2645_packet_split(&priv
->read_packet
,
638 frag
->data
, frag
->data_size
,
640 priv
->mp4
, priv
->nal_length_size
,
645 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
653 #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \
654 static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \
655 const H26 ## h26n ## Raw ## ps_name *ps_var) \
657 CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
658 unsigned int id = ps_var->id_element; \
659 if (id > FF_ARRAY_ELEMS(priv->ps_var)) { \
660 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \
661 " id : %d.\n", id); \
662 return AVERROR_INVALIDDATA; \
664 if (priv->ps_var[id] == priv->active_ ## ps_var) \
665 priv->active_ ## ps_var = NULL ; \
666 av_freep(&priv->ps_var[id]); \
667 priv->ps_var[id] = av_malloc(sizeof(*ps_var)); \
668 if (!priv->ps_var[id]) \
669 return AVERROR(ENOMEM); \
670 memcpy(priv->ps_var[id], ps_var, sizeof(*ps_var)); \
674 cbs_h2645_replace_ps(4, SPS
, sps
, seq_parameter_set_id
)
675 cbs_h2645_replace_ps(4, PPS
, pps
, pic_parameter_set_id
)
676 cbs_h2645_replace_ps(5, VPS
, vps
, vps_video_parameter_set_id
)
677 cbs_h2645_replace_ps(5, SPS
, sps
, sps_seq_parameter_set_id
)
678 cbs_h2645_replace_ps(5, PPS
, pps
, pps_pic_parameter_set_id
)
680 static int cbs_h264_read_nal_unit(CodedBitstreamContext
*ctx
,
681 CodedBitstreamUnit
*unit
)
686 err
= bitstream_init(&bc
, unit
->data
, 8 * unit
->data_size
);
690 switch (unit
->type
) {
695 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*sps
), NULL
);
700 err
= cbs_h264_read_sps(ctx
, &bc
, sps
);
704 err
= cbs_h264_replace_sps(ctx
, sps
);
710 case H264_NAL_SPS_EXT
:
712 err
= ff_cbs_alloc_unit_content(ctx
, unit
,
713 sizeof(H264RawSPSExtension
),
718 err
= cbs_h264_read_sps_extension(ctx
, &bc
, unit
->content
);
728 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*pps
), NULL
);
733 err
= cbs_h264_read_pps(ctx
, &bc
, pps
);
737 err
= cbs_h264_replace_pps(ctx
, pps
);
744 case H264_NAL_IDR_SLICE
:
745 case H264_NAL_AUXILIARY_SLICE
:
750 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*slice
),
751 &cbs_h264_free_slice
);
754 slice
= unit
->content
;
756 err
= cbs_h264_read_slice_header(ctx
, &bc
, &slice
->header
);
760 pos
= bitstream_tell(&bc
);
761 len
= unit
->data_size
;
762 if (!unit
->data
[len
- 1]) {
764 for (z
= 0; z
< len
&& !unit
->data
[len
- z
- 1]; z
++);
765 av_log(ctx
->log_ctx
, AV_LOG_DEBUG
, "Deleted %d trailing zeroes "
766 "from slice data.\n", z
);
770 slice
->data_size
= len
- pos
/ 8;
771 slice
->data_ref
= av_buffer_alloc(slice
->data_size
+
772 AV_INPUT_BUFFER_PADDING_SIZE
);
773 if (!slice
->data_ref
)
774 return AVERROR(ENOMEM
);
775 slice
->data
= slice
->data_ref
->data
;
777 unit
->data
+ pos
/ 8, slice
->data_size
);
778 memset(slice
->data
+ slice
->data_size
, 0,
779 AV_INPUT_BUFFER_PADDING_SIZE
);
780 slice
->data_bit_start
= pos
% 8;
786 err
= ff_cbs_alloc_unit_content(ctx
, unit
,
787 sizeof(H264RawAUD
), NULL
);
791 err
= cbs_h264_read_aud(ctx
, &bc
, unit
->content
);
799 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(H264RawSEI
),
804 err
= cbs_h264_read_sei(ctx
, &bc
, unit
->content
);
811 return AVERROR(ENOSYS
);
817 static int cbs_h265_read_nal_unit(CodedBitstreamContext
*ctx
,
818 CodedBitstreamUnit
*unit
)
823 err
= bitstream_init(&bc
, unit
->data
, 8 * unit
->data_size
);
827 switch (unit
->type
) {
832 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*vps
),
838 err
= cbs_h265_read_vps(ctx
, &bc
, vps
);
842 err
= cbs_h265_replace_vps(ctx
, vps
);
851 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*sps
),
857 err
= cbs_h265_read_sps(ctx
, &bc
, sps
);
861 err
= cbs_h265_replace_sps(ctx
, sps
);
871 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*pps
),
877 err
= cbs_h265_read_pps(ctx
, &bc
, pps
);
881 err
= cbs_h265_replace_pps(ctx
, pps
);
887 case HEVC_NAL_TRAIL_N
:
888 case HEVC_NAL_TRAIL_R
:
891 case HEVC_NAL_STSA_N
:
892 case HEVC_NAL_STSA_R
:
893 case HEVC_NAL_RADL_N
:
894 case HEVC_NAL_RADL_R
:
895 case HEVC_NAL_RASL_N
:
896 case HEVC_NAL_RASL_R
:
897 case HEVC_NAL_BLA_W_LP
:
898 case HEVC_NAL_BLA_W_RADL
:
899 case HEVC_NAL_BLA_N_LP
:
900 case HEVC_NAL_IDR_W_RADL
:
901 case HEVC_NAL_IDR_N_LP
:
902 case HEVC_NAL_CRA_NUT
:
907 err
= ff_cbs_alloc_unit_content(ctx
, unit
, sizeof(*slice
),
908 &cbs_h265_free_slice
);
911 slice
= unit
->content
;
913 err
= cbs_h265_read_slice_segment_header(ctx
, &bc
, &slice
->header
);
917 pos
= bitstream_tell(&bc
);
918 len
= unit
->data_size
;
919 if (!unit
->data
[len
- 1]) {
921 for (z
= 0; z
< len
&& !unit
->data
[len
- z
- 1]; z
++);
922 av_log(ctx
->log_ctx
, AV_LOG_DEBUG
, "Deleted %d trailing zeroes "
923 "from slice data.\n", z
);
927 slice
->data_size
= len
- pos
/ 8;
928 slice
->data_ref
= av_buffer_alloc(slice
->data_size
+
929 AV_INPUT_BUFFER_PADDING_SIZE
);
930 if (!slice
->data_ref
)
931 return AVERROR(ENOMEM
);
932 slice
->data
= slice
->data_ref
->data
;
934 unit
->data
+ pos
/ 8, slice
->data_size
);
935 memset(slice
->data
+ slice
->data_size
, 0,
936 AV_INPUT_BUFFER_PADDING_SIZE
);
937 slice
->data_bit_start
= pos
% 8;
943 err
= ff_cbs_alloc_unit_content(ctx
, unit
,
944 sizeof(H265RawAUD
), NULL
);
948 err
= cbs_h265_read_aud(ctx
, &bc
, unit
->content
);
955 return AVERROR(ENOSYS
);
961 static int cbs_h264_write_nal_unit(CodedBitstreamContext
*ctx
,
962 CodedBitstreamUnit
*unit
,
967 switch (unit
->type
) {
970 H264RawSPS
*sps
= unit
->content
;
972 err
= cbs_h264_write_sps(ctx
, pbc
, sps
);
976 err
= cbs_h264_replace_sps(ctx
, sps
);
982 case H264_NAL_SPS_EXT
:
984 H264RawSPSExtension
*sps_ext
= unit
->content
;
986 err
= cbs_h264_write_sps_extension(ctx
, pbc
, sps_ext
);
994 H264RawPPS
*pps
= unit
->content
;
996 err
= cbs_h264_write_pps(ctx
, pbc
, pps
);
1000 err
= cbs_h264_replace_pps(ctx
, pps
);
1006 case H264_NAL_SLICE
:
1007 case H264_NAL_IDR_SLICE
:
1008 case H264_NAL_AUXILIARY_SLICE
:
1010 H264RawSlice
*slice
= unit
->content
;
1011 BitstreamContext bc
;
1012 int bits_left
, end
, zeroes
;
1014 err
= cbs_h264_write_slice_header(ctx
, pbc
, &slice
->header
);
1019 if (slice
->data_size
* 8 + 8 > put_bits_left(pbc
))
1020 return AVERROR(ENOSPC
);
1022 bitstream_init(&bc
, slice
->data
, slice
->data_size
* 8);
1023 bitstream_skip(&bc
, slice
->data_bit_start
);
1025 // Copy in two-byte blocks, but stop before copying the
1026 // rbsp_stop_one_bit in the final byte.
1027 while (bitstream_bits_left(&bc
) > 23)
1028 put_bits(pbc
, 16, bitstream_read(&bc
, 16));
1030 bits_left
= bitstream_bits_left(&bc
);
1031 end
= bitstream_read(&bc
, bits_left
);
1033 // rbsp_stop_one_bit must be present here.
1035 zeroes
= ff_ctz(end
);
1036 if (bits_left
> zeroes
+ 1)
1037 put_bits(pbc
, bits_left
- zeroes
- 1,
1038 end
>> (zeroes
+ 1));
1039 put_bits(pbc
, 1, 1);
1040 while (put_bits_count(pbc
) % 8 != 0)
1041 put_bits(pbc
, 1, 0);
1043 // No slice data - that was just the header.
1044 // (Bitstream may be unaligned!)
1051 err
= cbs_h264_write_aud(ctx
, pbc
, unit
->content
);
1059 err
= cbs_h264_write_sei(ctx
, pbc
, unit
->content
);
1066 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Write unimplemented for "
1067 "NAL unit type %"PRIu32
".\n", unit
->type
);
1068 return AVERROR_PATCHWELCOME
;
1074 static int cbs_h265_write_nal_unit(CodedBitstreamContext
*ctx
,
1075 CodedBitstreamUnit
*unit
,
1080 switch (unit
->type
) {
1083 H265RawVPS
*vps
= unit
->content
;
1085 err
= cbs_h265_write_vps(ctx
, pbc
, vps
);
1089 err
= cbs_h265_replace_vps(ctx
, vps
);
1097 H265RawSPS
*sps
= unit
->content
;
1099 err
= cbs_h265_write_sps(ctx
, pbc
, sps
);
1103 err
= cbs_h265_replace_sps(ctx
, sps
);
1111 H265RawPPS
*pps
= unit
->content
;
1113 err
= cbs_h265_write_pps(ctx
, pbc
, pps
);
1117 err
= cbs_h265_replace_pps(ctx
, pps
);
1123 case HEVC_NAL_TRAIL_N
:
1124 case HEVC_NAL_TRAIL_R
:
1125 case HEVC_NAL_TSA_N
:
1126 case HEVC_NAL_TSA_R
:
1127 case HEVC_NAL_STSA_N
:
1128 case HEVC_NAL_STSA_R
:
1129 case HEVC_NAL_RADL_N
:
1130 case HEVC_NAL_RADL_R
:
1131 case HEVC_NAL_RASL_N
:
1132 case HEVC_NAL_RASL_R
:
1133 case HEVC_NAL_BLA_W_LP
:
1134 case HEVC_NAL_BLA_W_RADL
:
1135 case HEVC_NAL_BLA_N_LP
:
1136 case HEVC_NAL_IDR_W_RADL
:
1137 case HEVC_NAL_IDR_N_LP
:
1138 case HEVC_NAL_CRA_NUT
:
1140 H265RawSlice
*slice
= unit
->content
;
1141 BitstreamContext bc
;
1142 int bits_left
, end
, zeroes
;
1144 err
= cbs_h265_write_slice_segment_header(ctx
, pbc
, &slice
->header
);
1149 if (slice
->data_size
* 8 + 8 > put_bits_left(pbc
))
1150 return AVERROR(ENOSPC
);
1152 bitstream_init(&bc
, slice
->data
, slice
->data_size
* 8);
1153 bitstream_skip(&bc
, slice
->data_bit_start
);
1155 // Copy in two-byte blocks, but stop before copying the
1156 // rbsp_stop_one_bit in the final byte.
1157 while (bitstream_bits_left(&bc
) > 23)
1158 put_bits(pbc
, 16, bitstream_read(&bc
, 16));
1160 bits_left
= bitstream_bits_left(&bc
);
1161 end
= bitstream_read(&bc
, bits_left
);
1163 // rbsp_stop_one_bit must be present here.
1165 zeroes
= ff_ctz(end
);
1166 if (bits_left
> zeroes
+ 1)
1167 put_bits(pbc
, bits_left
- zeroes
- 1,
1168 end
>> (zeroes
+ 1));
1169 put_bits(pbc
, 1, 1);
1170 while (put_bits_count(pbc
) % 8 != 0)
1171 put_bits(pbc
, 1, 0);
1173 // No slice data - that was just the header.
1180 err
= cbs_h265_write_aud(ctx
, pbc
, unit
->content
);
1187 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Write unimplemented for "
1188 "NAL unit type %"PRIu32
".\n", unit
->type
);
1189 return AVERROR_PATCHWELCOME
;
1195 static int cbs_h2645_write_nal_unit(CodedBitstreamContext
*ctx
,
1196 CodedBitstreamUnit
*unit
)
1198 CodedBitstreamH2645Context
*priv
= ctx
->priv_data
;
1199 enum AVCodecID codec_id
= ctx
->codec
->codec_id
;
1203 if (!priv
->write_buffer
) {
1204 // Initial write buffer size is 1MB.
1205 priv
->write_buffer_size
= 1024 * 1024;
1207 reallocate_and_try_again
:
1208 err
= av_reallocp(&priv
->write_buffer
, priv
->write_buffer_size
);
1210 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Unable to allocate a "
1211 "sufficiently large write buffer (last attempt "
1212 "%zu bytes).\n", priv
->write_buffer_size
);
1217 init_put_bits(&pbc
, priv
->write_buffer
, priv
->write_buffer_size
);
1219 if (codec_id
== AV_CODEC_ID_H264
)
1220 err
= cbs_h264_write_nal_unit(ctx
, unit
, &pbc
);
1222 err
= cbs_h265_write_nal_unit(ctx
, unit
, &pbc
);
1224 if (err
== AVERROR(ENOSPC
)) {
1226 priv
->write_buffer_size
*= 2;
1227 goto reallocate_and_try_again
;
1229 // Overflow but we didn't notice.
1230 av_assert0(put_bits_count(&pbc
) <= 8 * priv
->write_buffer_size
);
1233 // Write failed for some other reason.
1237 if (put_bits_count(&pbc
) % 8)
1238 unit
->data_bit_padding
= 8 - put_bits_count(&pbc
) % 8;
1240 unit
->data_bit_padding
= 0;
1242 unit
->data_size
= (put_bits_count(&pbc
) + 7) / 8;
1243 flush_put_bits(&pbc
);
1245 err
= ff_cbs_alloc_unit_data(ctx
, unit
, unit
->data_size
);
1249 memcpy(unit
->data
, priv
->write_buffer
, unit
->data_size
);
1254 static int cbs_h2645_assemble_fragment(CodedBitstreamContext
*ctx
,
1255 CodedBitstreamFragment
*frag
)
1258 size_t max_size
, dp
, sp
;
1259 int err
, i
, zero_run
;
1261 for (i
= 0; i
< frag
->nb_units
; i
++) {
1262 // Data should already all have been written when we get here.
1263 av_assert0(frag
->units
[i
].data
);
1267 for (i
= 0; i
< frag
->nb_units
; i
++) {
1268 // Start code + content with worst-case emulation prevention.
1269 max_size
+= 3 + frag
->units
[i
].data_size
* 3 / 2;
1272 data
= av_malloc(max_size
);
1274 return AVERROR(ENOMEM
);
1277 for (i
= 0; i
< frag
->nb_units
; i
++) {
1278 CodedBitstreamUnit
*unit
= &frag
->units
[i
];
1280 if (unit
->data_bit_padding
> 0) {
1281 if (i
< frag
->nb_units
- 1)
1282 av_log(ctx
->log_ctx
, AV_LOG_WARNING
, "Probably invalid "
1283 "unaligned padding on non-final NAL unit.\n");
1285 frag
->data_bit_padding
= unit
->data_bit_padding
;
1288 if ((ctx
->codec
->codec_id
== AV_CODEC_ID_H264
&&
1289 (unit
->type
== H264_NAL_SPS
||
1290 unit
->type
== H264_NAL_PPS
)) ||
1291 (ctx
->codec
->codec_id
== AV_CODEC_ID_HEVC
&&
1292 (unit
->type
== HEVC_NAL_VPS
||
1293 unit
->type
== HEVC_NAL_SPS
||
1294 unit
->type
== HEVC_NAL_PPS
)) ||
1295 i
== 0 /* (Assume this is the start of an access unit.) */) {
1299 // start_code_prefix_one_3bytes
1305 for (sp
= 0; sp
< unit
->data_size
; sp
++) {
1307 if (unit
->data
[sp
] == 0)
1312 if ((unit
->data
[sp
] & ~3) == 0) {
1313 // emulation_prevention_three_byte
1316 zero_run
= unit
->data
[sp
] == 0;
1318 data
[dp
++] = unit
->data
[sp
];
1322 av_assert0(dp
<= max_size
);
1323 err
= av_reallocp(&data
, dp
);
1327 frag
->data_ref
= av_buffer_create(data
, dp
, NULL
, NULL
, 0);
1328 if (!frag
->data_ref
) {
1330 return AVERROR(ENOMEM
);
1334 frag
->data_size
= dp
;
1339 static void cbs_h264_close(CodedBitstreamContext
*ctx
)
1341 CodedBitstreamH264Context
*h264
= ctx
->priv_data
;
1344 ff_h2645_packet_uninit(&h264
->common
.read_packet
);
1346 av_freep(&h264
->common
.write_buffer
);
1348 for (i
= 0; i
< FF_ARRAY_ELEMS(h264
->sps
); i
++)
1349 av_freep(&h264
->sps
[i
]);
1350 for (i
= 0; i
< FF_ARRAY_ELEMS(h264
->pps
); i
++)
1351 av_freep(&h264
->pps
[i
]);
1354 static void cbs_h265_close(CodedBitstreamContext
*ctx
)
1356 CodedBitstreamH265Context
*h265
= ctx
->priv_data
;
1359 ff_h2645_packet_uninit(&h265
->common
.read_packet
);
1361 av_freep(&h265
->common
.write_buffer
);
1363 for (i
= 0; i
< FF_ARRAY_ELEMS(h265
->vps
); i
++)
1364 av_freep(&h265
->vps
[i
]);
1365 for (i
= 0; i
< FF_ARRAY_ELEMS(h265
->sps
); i
++)
1366 av_freep(&h265
->sps
[i
]);
1367 for (i
= 0; i
< FF_ARRAY_ELEMS(h265
->pps
); i
++)
1368 av_freep(&h265
->pps
[i
]);
1371 const CodedBitstreamType ff_cbs_type_h264
= {
1372 .codec_id
= AV_CODEC_ID_H264
,
1374 .priv_data_size
= sizeof(CodedBitstreamH264Context
),
1376 .split_fragment
= &cbs_h2645_split_fragment
,
1377 .read_unit
= &cbs_h264_read_nal_unit
,
1378 .write_unit
= &cbs_h2645_write_nal_unit
,
1379 .assemble_fragment
= &cbs_h2645_assemble_fragment
,
1381 .close
= &cbs_h264_close
,
1384 const CodedBitstreamType ff_cbs_type_h265
= {
1385 .codec_id
= AV_CODEC_ID_HEVC
,
1387 .priv_data_size
= sizeof(CodedBitstreamH265Context
),
1389 .split_fragment
= &cbs_h2645_split_fragment
,
1390 .read_unit
= &cbs_h265_read_nal_unit
,
1391 .write_unit
= &cbs_h2645_write_nal_unit
,
1392 .assemble_fragment
= &cbs_h2645_assemble_fragment
,
1394 .close
= &cbs_h265_close
,