diff options
author | James Almer <jamrial@gmail.com> | 2020-12-06 12:30:14 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2020-12-07 14:22:52 -0300 |
commit | 1aa72fe79454c8f0a9adcd9ac7e6fbd20bbfe1a4 (patch) | |
tree | bcd899a7457055f2a4d4c323af3d0ee2b85e81e7 | |
parent | b9f7c9b2723f44aa7850c24f9dcbb6a4e3ac555f (diff) | |
download | ffmpeg-1aa72fe79454c8f0a9adcd9ac7e6fbd20bbfe1a4.tar.gz |
avcodec/dynamic_hdr10_plus: don't take a GetBitContext as input argument
Create a local one instead from a byte buffer input argument.
This prevents skipping bytes that may belong to another SEI message.
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavcodec/dynamic_hdr10_plus.c | 13 | ||||
-rw-r--r-- | libavcodec/dynamic_hdr10_plus.h | 7 | ||||
-rw-r--r-- | libavcodec/hevc_sei.c | 5 |
3 files changed, 18 insertions, 7 deletions
diff --git a/libavcodec/dynamic_hdr10_plus.c b/libavcodec/dynamic_hdr10_plus.c index bf0d085b8f..4b2ecdb72e 100644 --- a/libavcodec/dynamic_hdr10_plus.c +++ b/libavcodec/dynamic_hdr10_plus.c @@ -17,6 +17,7 @@ */ #include "dynamic_hdr10_plus.h" +#include "get_bits.h" static const uint8_t usa_country_code = 0xB5; static const uint16_t smpte_provider_code = 0x003C; @@ -30,11 +31,19 @@ static const int32_t knee_point_den = 4095; static const int32_t bezier_anchor_den = 1023; static const int32_t saturation_weight_den = 8; -int ff_parse_itu_t_t35_to_dynamic_hdr10_plus(GetBitContext *gb, AVDynamicHDRPlus *s) +int ff_parse_itu_t_t35_to_dynamic_hdr10_plus(AVDynamicHDRPlus *s, const uint8_t *data, + int size) { + GetBitContext gbc, *gb = &gbc; + int ret; + if (!s) return AVERROR(ENOMEM); + ret = init_get_bits8(gb, data, size); + if (ret < 0) + return ret; + s->application_version = get_bits(gb, 8); if (get_bits_left(gb) < 2) @@ -189,7 +198,5 @@ int ff_parse_itu_t_t35_to_dynamic_hdr10_plus(GetBitContext *gb, AVDynamicHDRPlus } } - skip_bits(gb, get_bits_left(gb)); - return 0; } diff --git a/libavcodec/dynamic_hdr10_plus.h b/libavcodec/dynamic_hdr10_plus.h index 06053f88e7..cd7acf0432 100644 --- a/libavcodec/dynamic_hdr10_plus.h +++ b/libavcodec/dynamic_hdr10_plus.h @@ -20,15 +20,16 @@ #define AVCODEC_DYNAMIC_HDR10_PLUS_H #include "libavutil/hdr_dynamic_metadata.h" -#include "get_bits.h" /** * Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus). - * @param gb The bit content to be decoded. * @param s A pointer containing the decoded AVDynamicHDRPlus structure. + * @param data The byte array containing the raw ITU-T T.35 data. + * @param size Size of the data array in bytes. * * @return 0 if succeed. Otherwise, returns the appropriate AVERROR. */ -int ff_parse_itu_t_t35_to_dynamic_hdr10_plus(GetBitContext *gb, AVDynamicHDRPlus *s); +int ff_parse_itu_t_t35_to_dynamic_hdr10_plus(AVDynamicHDRPlus *s, const uint8_t *data, + int size); #endif /* AVCODEC_DYNAMIC_HDR10_PLUS_H */ diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c index 159ef5830a..3b0fa43439 100644 --- a/libavcodec/hevc_sei.c +++ b/libavcodec/hevc_sei.c @@ -216,7 +216,8 @@ static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s if (!metadata) return AVERROR(ENOMEM); - err = ff_parse_itu_t_t35_to_dynamic_hdr10_plus(gb, metadata); + err = ff_parse_itu_t_t35_to_dynamic_hdr10_plus(metadata, + gb->buffer + get_bits_count(gb) / 8, size); if (err < 0) { av_free(metadata); return err; @@ -229,6 +230,8 @@ static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s return AVERROR(ENOMEM); } + skip_bits_long(gb, size * 8); + return 0; } |