On 10.07.2015 20:01, Anton Khirnov wrote: > Quoting Andreas Cadhalpun (2015-07-10 19:49:36) >> It is used as get_bits argument and reading 0 bits doesn't make sense. >> >> Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> >> --- >> libavcodec/hevc.c | 6 ++++++ >> libavcodec/hevc_parser.c | 6 ++++++ >> 2 files changed, 12 insertions(+) >> >> diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c >> index 38734f0..d47af16 100644 >> --- a/libavcodec/hevc.c >> +++ b/libavcodec/hevc.c >> @@ -459,6 +459,12 @@ static int hls_slice_header(HEVCContext *s) >> >> slice_address_length = av_ceil_log2(s->sps->ctb_width * >> s->sps->ctb_height); >> + if (slice_address_length <= 0) { >> + av_log(s->avctx, AV_LOG_ERROR, >> + "Invalid slice address length: %d\n", >> + slice_address_length); >> + return AVERROR_INVALIDDATA; > > No, this is not invalid. Having a picture of 1x1 CTB is perfectly valid, > then the spec mandates that slice_segment_addr is 0.
OK, then let's make that explicit. New patch attached. > Does get_bits() really not just return 0 on trying to read 0 bits? The comment for get_bits() says: 'Read 1-25 bits.' Best regards, Andreas
>From 0da1b118a19d517d5ab31321e354348844c4ce7a Mon Sep 17 00:00:00 2001 From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> Date: Fri, 10 Jul 2015 19:41:43 +0200 Subject: [PATCH] hevc: check slice address length It is used as get_bits argument and reading 0 bits doesn't make sense. Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> --- libavcodec/hevc.c | 2 +- libavcodec/hevc_parser.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index 38734f0..6ff52ec 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -459,7 +459,7 @@ static int hls_slice_header(HEVCContext *s) slice_address_length = av_ceil_log2(s->sps->ctb_width * s->sps->ctb_height); - sh->slice_segment_addr = get_bits(gb, slice_address_length); + sh->slice_segment_addr = slice_address_length ? get_bits(gb, slice_address_length) : 0; if (sh->slice_segment_addr >= s->sps->ctb_width * s->sps->ctb_height) { av_log(s->avctx, AV_LOG_ERROR, "Invalid slice segment address: %u.\n", diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index 3c7c3c3..31452f2 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -200,7 +200,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, AVCodecContext *avctx slice_address_length = av_ceil_log2_c(h->sps->ctb_width * h->sps->ctb_height); - sh->slice_segment_addr = get_bits(gb, slice_address_length); + sh->slice_segment_addr = slice_address_length ? get_bits(gb, slice_address_length) : 0; if (sh->slice_segment_addr >= h->sps->ctb_width * h->sps->ctb_height) { av_log(h->avctx, AV_LOG_ERROR, "Invalid slice segment address: %u.\n", sh->slice_segment_addr); -- 2.1.4
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel