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"
29 #include "h2645_parse.h"
32 static int cbs_read_ue_golomb(CodedBitstreamContext
*ctx
, BitstreamContext
*bc
,
33 const char *name
, uint32_t *write_to
,
34 uint32_t range_min
, uint32_t range_max
)
39 if (ctx
->trace_enable
) {
44 position
= bitstream_tell(bc
);
46 for (i
= 0; i
< 32; i
++) {
47 k
= bitstream_read_bit(bc
);
48 bits
[i
] = k ?
'1' : '0';
53 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid ue-golomb "
54 "code found while reading %s: "
55 "more than 31 zeroes.\n", name
);
56 return AVERROR_INVALIDDATA
;
59 for (j
= 0; j
< i
; j
++) {
60 k
= bitstream_read_bit(bc
);
61 bits
[i
+ j
+ 1] = k ?
'1' : '0';
62 value
= value
<< 1 | k
;
67 ff_cbs_trace_syntax_element(ctx
, position
, name
, bits
, value
);
69 value
= get_ue_golomb_long(bc
);
72 if (value
< range_min
|| value
> range_max
) {
73 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "%s out of range: "
74 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
75 name
, value
, range_min
, range_max
);
76 return AVERROR_INVALIDDATA
;
83 static int cbs_read_se_golomb(CodedBitstreamContext
*ctx
, BitstreamContext
*bc
,
84 const char *name
, int32_t *write_to
,
85 int32_t range_min
, int32_t range_max
)
90 if (ctx
->trace_enable
) {
96 position
= bitstream_tell(bc
);
98 for (i
= 0; i
< 32; i
++) {
99 k
= bitstream_read_bit(bc
);
100 bits
[i
] = k ?
'1' : '0';
105 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid se-golomb "
106 "code found while reading %s: "
107 "more than 31 zeroes.\n", name
);
108 return AVERROR_INVALIDDATA
;
111 for (j
= 0; j
< i
; j
++) {
112 k
= bitstream_read_bit(bc
);
113 bits
[i
+ j
+ 1] = k ?
'1' : '0';
118 value
= -(int32_t)(v
/ 2);
122 ff_cbs_trace_syntax_element(ctx
, position
, name
, bits
, value
);
124 value
= get_se_golomb_long(bc
);
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)
243 #define READWRITE read
244 #define RWContext BitstreamContext
246 #define xu(width, name, var, range_min, range_max) do { \
247 uint32_t value = range_min; \
248 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
249 &value, range_min, range_max)); \
252 #define xue(name, var, range_min, range_max) do { \
253 uint32_t value = range_min; \
254 CHECK(cbs_read_ue_golomb(ctx, rw, #name, \
255 &value, range_min, range_max)); \
258 #define xse(name, var, range_min, range_max) do { \
259 int32_t value = range_min; \
260 CHECK(cbs_read_se_golomb(ctx, rw, #name, \
261 &value, range_min, range_max)); \
266 #define u(width, name, range_min, range_max) \
267 xu(width, name, current->name, range_min, range_max)
268 #define flag(name) u(1, name, 0, 1)
269 #define ue(name, range_min, range_max) \
270 xue(name, current->name, range_min, range_max)
271 #define se(name, range_min, range_max) \
272 xse(name, current->name, range_min, range_max)
274 #define infer(name, value) do { \
275 current->name = value; \
278 static int cbs_h2645_read_more_rbsp_data(BitstreamContext
*bc
)
280 int bits_left
= bitstream_bits_left(bc
);
283 if (bitstream_peek(bc
, bits_left
) == 1 << (bits_left
- 1))
288 #define more_rbsp_data(var) ((var) = cbs_h2645_read_more_rbsp_data(rw))
290 #define byte_alignment(rw) (bitstream_tell(rw) % 8)
292 #define allocate(name, size) do { \
293 name = av_mallocz(size); \
295 return AVERROR(ENOMEM); \
298 #define FUNC(name) FUNC_H264(READWRITE, name)
299 #include "cbs_h264_syntax_template.c"
313 #undef more_rbsp_data
314 #undef byte_alignment
319 #define READWRITE write
320 #define RWContext PutBitContext
322 #define xu(width, name, var, range_min, range_max) do { \
323 uint32_t value = var; \
324 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
325 value, range_min, range_max)); \
327 #define xue(name, var, range_min, range_max) do { \
328 uint32_t value = var; \
329 CHECK(cbs_write_ue_golomb(ctx, rw, #name, \
330 value, range_min, range_max)); \
332 #define xse(name, var, range_min, range_max) do { \
333 int32_t value = var; \
334 CHECK(cbs_write_se_golomb(ctx, rw, #name, \
335 value, range_min, range_max)); \
338 #define u(width, name, range_min, range_max) \
339 xu(width, name, current->name, range_min, range_max)
340 #define flag(name) u(1, name, 0, 1)
341 #define ue(name, range_min, range_max) \
342 xue(name, current->name, range_min, range_max)
343 #define se(name, range_min, range_max) \
344 xse(name, current->name, range_min, range_max)
346 #define infer(name, value) do { \
347 if (current->name != (value)) { \
348 av_log(ctx->log_ctx, AV_LOG_WARNING, "Warning: " \
349 "%s does not match inferred value: " \
350 "%"PRId64", but should be %"PRId64".\n", \
351 #name, (int64_t)current->name, (int64_t)(value)); \
355 #define more_rbsp_data(var) (var)
357 #define byte_alignment(rw) (put_bits_count(rw) % 8)
359 #define allocate(name, size) do { \
361 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s must be set " \
362 "for writing.\n", #name); \
363 return AVERROR_INVALIDDATA; \
367 #define FUNC(name) FUNC_H264(READWRITE, name)
368 #include "cbs_h264_syntax_template.c"
382 #undef more_rbsp_data
383 #undef byte_alignment
387 static void cbs_h264_free_sei(H264RawSEI
*sei
)
390 for (i
= 0; i
< sei
->payload_count
; i
++) {
391 H264RawSEIPayload
*payload
= &sei
->payload
[i
];
393 switch (payload
->payload_type
) {
394 case H264_SEI_TYPE_BUFFERING_PERIOD
:
395 case H264_SEI_TYPE_PIC_TIMING
:
396 case H264_SEI_TYPE_RECOVERY_POINT
:
397 case H264_SEI_TYPE_DISPLAY_ORIENTATION
:
399 case H264_SEI_TYPE_USER_DATA_REGISTERED
:
400 av_freep(&payload
->payload
.user_data_registered
.data
);
402 case H264_SEI_TYPE_USER_DATA_UNREGISTERED
:
403 av_freep(&payload
->payload
.user_data_unregistered
.data
);
406 av_freep(&payload
->payload
.other
.data
);
412 static void cbs_h264_free_slice(H264RawSlice
*slice
)
414 av_freep(&slice
->data
);
417 static void cbs_h264_free_nal_unit(CodedBitstreamUnit
*unit
)
419 switch (unit
->type
) {
421 cbs_h264_free_sei(unit
->content
);
423 case H264_NAL_IDR_SLICE
:
425 cbs_h264_free_slice(unit
->content
);
428 av_freep(&unit
->content
);
431 static int cbs_h2645_fragment_add_nals(CodedBitstreamContext
*ctx
,
432 CodedBitstreamFragment
*frag
,
433 const H2645Packet
*packet
)
437 for (i
= 0; i
< packet
->nb_nals
; i
++) {
438 const H2645NAL
*nal
= &packet
->nals
[i
];
441 data
= av_malloc(nal
->size
);
443 return AVERROR(ENOMEM
);
444 memcpy(data
, nal
->data
, nal
->size
);
446 err
= ff_cbs_insert_unit_data(ctx
, frag
, -1, nal
->type
,
457 static int cbs_h2645_split_fragment(CodedBitstreamContext
*ctx
,
458 CodedBitstreamFragment
*frag
,
461 enum AVCodecID codec_id
= ctx
->codec
->codec_id
;
462 CodedBitstreamH2645Context
*priv
= ctx
->priv_data
;
466 av_assert0(frag
->data
&& frag
->nb_units
== 0);
467 if (frag
->data_size
== 0)
470 if (header
&& frag
->data
[0] && codec_id
== AV_CODEC_ID_H264
) {
472 size_t size
, start
, end
;
473 int i
, count
, version
;
477 bytestream2_init(&gbc
, frag
->data
, frag
->data_size
);
479 if (bytestream2_get_bytes_left(&gbc
) < 6)
480 return AVERROR_INVALIDDATA
;
482 version
= bytestream2_get_byte(&gbc
);
484 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Invalid AVCC header: "
485 "first byte %u.", version
);
486 return AVERROR_INVALIDDATA
;
489 bytestream2_skip(&gbc
, 3);
490 priv
->nal_length_size
= (bytestream2_get_byte(&gbc
) & 3) + 1;
493 count
= bytestream2_get_byte(&gbc
) & 0x1f;
494 start
= bytestream2_tell(&gbc
);
495 for (i
= 0; i
< count
; i
++) {
496 if (bytestream2_get_bytes_left(&gbc
) < 2 * (count
- i
))
497 return AVERROR_INVALIDDATA
;
498 size
= bytestream2_get_be16(&gbc
);
499 if (bytestream2_get_bytes_left(&gbc
) < size
)
500 return AVERROR_INVALIDDATA
;
501 bytestream2_skip(&gbc
, size
);
503 end
= bytestream2_tell(&gbc
);
505 err
= ff_h2645_packet_split(&priv
->read_packet
,
506 frag
->data
+ start
, end
- start
,
507 ctx
->log_ctx
, 1, 2, AV_CODEC_ID_H264
);
509 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Failed to split AVCC SPS array.\n");
512 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
517 count
= bytestream2_get_byte(&gbc
);
518 start
= bytestream2_tell(&gbc
);
519 for (i
= 0; i
< count
; i
++) {
520 if (bytestream2_get_bytes_left(&gbc
) < 2 * (count
- i
))
521 return AVERROR_INVALIDDATA
;
522 size
= bytestream2_get_be16(&gbc
);
523 if (bytestream2_get_bytes_left(&gbc
) < size
)
524 return AVERROR_INVALIDDATA
;
525 bytestream2_skip(&gbc
, size
);
527 end
= bytestream2_tell(&gbc
);
529 err
= ff_h2645_packet_split(&priv
->read_packet
,
530 frag
->data
+ start
, end
- start
,
531 ctx
->log_ctx
, 1, 2, AV_CODEC_ID_H264
);
533 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Failed to split AVCC PPS array.\n");
536 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
540 if (bytestream2_get_bytes_left(&gbc
) > 0) {
541 av_log(ctx
->log_ctx
, AV_LOG_WARNING
, "%u bytes left at end of AVCC "
542 "header.\n", bytestream2_get_bytes_left(&gbc
));
546 // Annex B, or later MP4 with already-known parameters.
548 err
= ff_h2645_packet_split(&priv
->read_packet
,
549 frag
->data
, frag
->data_size
,
551 priv
->mp4
, priv
->nal_length_size
,
556 err
= cbs_h2645_fragment_add_nals(ctx
, frag
, &priv
->read_packet
);
564 #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \
565 static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \
566 const H26 ## h26n ## Raw ## ps_name *ps_var) \
568 CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
569 unsigned int id = ps_var->id_element; \
570 if (id > FF_ARRAY_ELEMS(priv->ps_var)) { \
571 av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \
572 " id : %d.\n", id); \
573 return AVERROR_INVALIDDATA; \
575 av_freep(&priv->ps_var[id]); \
576 priv->ps_var[id] = av_malloc(sizeof(*ps_var)); \
577 if (!priv->ps_var[id]) \
578 return AVERROR(ENOMEM); \
579 memcpy(priv->ps_var[id], ps_var, sizeof(*ps_var)); \
583 cbs_h2645_replace_ps(4, SPS
, sps
, seq_parameter_set_id
)
584 cbs_h2645_replace_ps(4, PPS
, pps
, pic_parameter_set_id
)
586 static int cbs_h264_read_nal_unit(CodedBitstreamContext
*ctx
,
587 CodedBitstreamUnit
*unit
)
592 err
= bitstream_init(&bc
, unit
->data
, 8 * unit
->data_size
);
596 switch (unit
->type
) {
601 sps
= av_mallocz(sizeof(*sps
));
603 return AVERROR(ENOMEM
);
604 err
= cbs_h264_read_sps(ctx
, &bc
, sps
);
606 err
= cbs_h264_replace_sps(ctx
, sps
);
616 case H264_NAL_SPS_EXT
:
618 H264RawSPSExtension
*sps_ext
;
620 sps_ext
= av_mallocz(sizeof(*sps_ext
));
622 return AVERROR(ENOMEM
);
623 err
= cbs_h264_read_sps_extension(ctx
, &bc
, sps_ext
);
629 unit
->content
= sps_ext
;
637 pps
= av_mallocz(sizeof(*pps
));
639 return AVERROR(ENOMEM
);
640 err
= cbs_h264_read_pps(ctx
, &bc
, pps
);
642 err
= cbs_h264_replace_pps(ctx
, pps
);
653 case H264_NAL_IDR_SLICE
:
654 case H264_NAL_AUXILIARY_SLICE
:
659 slice
= av_mallocz(sizeof(*slice
));
661 return AVERROR(ENOMEM
);
662 err
= cbs_h264_read_slice_header(ctx
, &bc
, &slice
->header
);
668 pos
= bitstream_tell(&bc
);
669 len
= unit
->data_size
;
670 if (!unit
->data
[len
- 1]) {
672 for (z
= 0; z
< len
&& !unit
->data
[len
- z
- 1]; z
++);
673 av_log(ctx
->log_ctx
, AV_LOG_DEBUG
, "Deleted %d trailing zeroes "
674 "from slice data.\n", z
);
678 slice
->data_size
= len
- pos
/ 8;
679 slice
->data
= av_malloc(slice
->data_size
);
682 return AVERROR(ENOMEM
);
685 unit
->data
+ pos
/ 8, slice
->data_size
);
686 slice
->data_bit_start
= pos
% 8;
688 unit
->content
= slice
;
696 aud
= av_mallocz(sizeof(*aud
));
698 return AVERROR(ENOMEM
);
699 err
= cbs_h264_read_aud(ctx
, &bc
, aud
);
713 sei
= av_mallocz(sizeof(*sei
));
715 return AVERROR(ENOMEM
);
716 err
= cbs_h264_read_sei(ctx
, &bc
, sei
);
718 cbs_h264_free_sei(sei
);
727 return AVERROR(ENOSYS
);
733 static int cbs_h264_write_nal_unit(CodedBitstreamContext
*ctx
,
734 CodedBitstreamUnit
*unit
,
739 switch (unit
->type
) {
742 H264RawSPS
*sps
= unit
->content
;
744 err
= cbs_h264_write_sps(ctx
, pbc
, sps
);
748 err
= cbs_h264_replace_sps(ctx
, sps
);
754 case H264_NAL_SPS_EXT
:
756 H264RawSPSExtension
*sps_ext
;
758 err
= cbs_h264_write_sps_extension(ctx
, pbc
, sps_ext
);
766 H264RawPPS
*pps
= unit
->content
;
768 err
= cbs_h264_write_pps(ctx
, pbc
, pps
);
772 err
= cbs_h264_replace_pps(ctx
, pps
);
779 case H264_NAL_IDR_SLICE
:
781 H264RawSlice
*slice
= unit
->content
;
783 int bits_left
, end
, zeroes
;
785 err
= cbs_h264_write_slice_header(ctx
, pbc
, &slice
->header
);
790 if (slice
->data_size
* 8 + 8 > put_bits_left(pbc
))
791 return AVERROR(ENOSPC
);
793 bitstream_init(&bc
, slice
->data
, slice
->data_size
* 8);
794 bitstream_skip(&bc
, slice
->data_bit_start
);
796 // Copy in two-byte blocks, but stop before copying the
797 // rbsp_stop_one_bit in the final byte.
798 while (bitstream_bits_left(&bc
) > 23)
799 put_bits(pbc
, 16, bitstream_read(&bc
, 16));
801 bits_left
= bitstream_bits_left(&bc
);
802 end
= bitstream_read(&bc
, bits_left
);
804 // rbsp_stop_one_bit must be present here.
806 zeroes
= ff_ctz(end
);
807 if (bits_left
> zeroes
+ 1)
808 put_bits(pbc
, bits_left
- zeroes
- 1,
809 end
>> (zeroes
+ 1));
811 while (put_bits_count(pbc
) % 8 != 0)
814 // No slice data - that was just the header.
815 // (Bitstream may be unaligned!)
822 err
= cbs_h264_write_aud(ctx
, pbc
, unit
->content
);
830 err
= cbs_h264_write_sei(ctx
, pbc
, unit
->content
);
837 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Write unimplemented for "
838 "NAL unit type %"PRIu32
".\n", unit
->type
);
839 return AVERROR_PATCHWELCOME
;
845 static int cbs_h2645_write_nal_unit(CodedBitstreamContext
*ctx
,
846 CodedBitstreamUnit
*unit
)
848 CodedBitstreamH2645Context
*priv
= ctx
->priv_data
;
849 enum AVCodecID codec_id
= ctx
->codec
->codec_id
;
853 if (!priv
->write_buffer
) {
854 // Initial write buffer size is 1MB.
855 priv
->write_buffer_size
= 1024 * 1024;
857 reallocate_and_try_again
:
858 err
= av_reallocp(&priv
->write_buffer
, priv
->write_buffer_size
);
860 av_log(ctx
->log_ctx
, AV_LOG_ERROR
, "Unable to allocate a "
861 "sufficiently large write buffer (last attempt "
862 "%zu bytes).\n", priv
->write_buffer_size
);
867 init_put_bits(&pbc
, priv
->write_buffer
, priv
->write_buffer_size
);
869 err
= cbs_h264_write_nal_unit(ctx
, unit
, &pbc
);
871 if (err
== AVERROR(ENOSPC
)) {
873 priv
->write_buffer_size
*= 2;
874 goto reallocate_and_try_again
;
876 // Overflow but we didn't notice.
877 av_assert0(put_bits_count(&pbc
) <= 8 * priv
->write_buffer_size
);
879 if (put_bits_count(&pbc
) % 8)
880 unit
->data_bit_padding
= 8 - put_bits_count(&pbc
) % 8;
882 unit
->data_bit_padding
= 0;
884 unit
->data_size
= (put_bits_count(&pbc
) + 7) / 8;
885 flush_put_bits(&pbc
);
887 err
= av_reallocp(&unit
->data
, unit
->data_size
);
891 memcpy(unit
->data
, priv
->write_buffer
, unit
->data_size
);
896 static int cbs_h2645_assemble_fragment(CodedBitstreamContext
*ctx
,
897 CodedBitstreamFragment
*frag
)
900 size_t max_size
, dp
, sp
;
901 int err
, i
, zero_run
;
903 for (i
= 0; i
< frag
->nb_units
; i
++) {
904 // Data should already all have been written when we get here.
905 av_assert0(frag
->units
[i
].data
);
909 for (i
= 0; i
< frag
->nb_units
; i
++) {
910 // Start code + content with worst-case emulation prevention.
911 max_size
+= 3 + frag
->units
[i
].data_size
* 3 / 2;
914 data
= av_malloc(max_size
);
916 return AVERROR(ENOMEM
);
919 for (i
= 0; i
< frag
->nb_units
; i
++) {
920 CodedBitstreamUnit
*unit
= &frag
->units
[i
];
922 if (unit
->data_bit_padding
> 0) {
923 if (i
< frag
->nb_units
- 1)
924 av_log(ctx
->log_ctx
, AV_LOG_WARNING
, "Probably invalid "
925 "unaligned padding on non-final NAL unit.\n");
927 frag
->data_bit_padding
= unit
->data_bit_padding
;
930 if (unit
->type
== H264_NAL_SPS
||
931 unit
->type
== H264_NAL_PPS
||
932 i
== 0 /* (Assume this is the start of an access unit.) */) {
936 // start_code_prefix_one_3bytes
942 for (sp
= 0; sp
< unit
->data_size
; sp
++) {
944 if (unit
->data
[sp
] == 0)
949 if ((unit
->data
[sp
] & ~3) == 0) {
950 // emulation_prevention_three_byte
953 zero_run
= unit
->data
[sp
] == 0;
955 data
[dp
++] = unit
->data
[sp
];
959 av_assert0(dp
<= max_size
);
960 err
= av_reallocp(&data
, dp
);
965 frag
->data_size
= dp
;
970 static void cbs_h264_close(CodedBitstreamContext
*ctx
)
972 CodedBitstreamH264Context
*h264
= ctx
->priv_data
;
975 ff_h2645_packet_uninit(&h264
->common
.read_packet
);
977 av_freep(&h264
->common
.write_buffer
);
979 for (i
= 0; i
< FF_ARRAY_ELEMS(h264
->sps
); i
++)
980 av_freep(&h264
->sps
[i
]);
981 for (i
= 0; i
< FF_ARRAY_ELEMS(h264
->pps
); i
++)
982 av_freep(&h264
->pps
[i
]);
985 const CodedBitstreamType ff_cbs_type_h264
= {
986 .codec_id
= AV_CODEC_ID_H264
,
988 .priv_data_size
= sizeof(CodedBitstreamH264Context
),
990 .split_fragment
= &cbs_h2645_split_fragment
,
991 .read_unit
= &cbs_h264_read_nal_unit
,
992 .write_unit
= &cbs_h2645_write_nal_unit
,
993 .assemble_fragment
= &cbs_h2645_assemble_fragment
,
995 .free_unit
= &cbs_h264_free_nal_unit
,
996 .close
= &cbs_h264_close
,