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

Reply via email to