diff mbox

[FFmpeg-devel] avformat/matroskadec: retain error codes in matroska_resync() and matroska_read_packet()

Message ID 1474578189-135377-1-git-send-email-skw@google.com
State Superseded
Headers show

Commit Message

Sophia Wang Sept. 22, 2016, 9:03 p.m. UTC
Signed-off-by: Sophia Wang <skw@google.com>
---
 libavformat/matroskadec.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

Comments

Benoit Fouet Sept. 23, 2016, 8:40 a.m. UTC | #1
Hi,


On 22/09/2016 23:03, Sophia Wang wrote:
> Signed-off-by: Sophia Wang <skw@google.com>
> ---
>   libavformat/matroskadec.c | 13 ++++++++-----
>   1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 77b8a5d..936690d 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -738,13 +738,16 @@ static int matroska_read_close(AVFormatContext *s);
>   static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
>   {
>       AVIOContext *pb = matroska->ctx->pb;
> +    int64_t ret;
>       uint32_t id;
>       matroska->current_id = 0;
>       matroska->num_levels = 0;
>   
>       /* seek to next position to resync from */
> -    if (avio_seek(pb, last_pos + 1, SEEK_SET) < 0)
> -        goto eof;
> +    if ((ret = avio_seek(pb, last_pos + 1, SEEK_SET)) < 0) {
> +        matroska->done = 1;
> +        return ret;

doesn't this generate a warning, returning an int64 from a function 
supposed to return an int?

> +    }
>   
>       id = avio_rb32(pb);
>   
> @@ -760,7 +763,6 @@ static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
>           id = (id << 8) | avio_r8(pb);
>       }
>   
> -eof:
>       matroska->done = 1;
>       return AVERROR_EOF;
>   }
> @@ -3317,13 +3319,14 @@ static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
>   static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
>   {
>       MatroskaDemuxContext *matroska = s->priv_data;
> +    int ret = 0;
>   
>       while (matroska_deliver_packet(matroska, pkt)) {
>           int64_t pos = avio_tell(matroska->ctx->pb);
>           if (matroska->done)
> -            return AVERROR_EOF;
> +            return (ret < 0) ? ret : AVERROR_EOF;
>           if (matroska_parse_cluster(matroska) < 0)
> -            matroska_resync(matroska, pos);
> +            ret = matroska_resync(matroska, pos);
>       }
>   
>       return 0;

You might want to return ret instead of 0 here.
Sophia Wang Sept. 27, 2016, 6:59 p.m. UTC | #2
On Fri, Sep 23, 2016 at 1:40 AM, Benoit Fouet <benoit.fouet@free.fr> wrote:

> Hi,
>
>
> On 22/09/2016 23:03, Sophia Wang wrote:
>
>> Signed-off-by: Sophia Wang <skw@google.com>
>> ---
>>   libavformat/matroskadec.c | 13 ++++++++-----
>>   1 file changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>> index 77b8a5d..936690d 100644
>> --- a/libavformat/matroskadec.c
>> +++ b/libavformat/matroskadec.c
>> @@ -738,13 +738,16 @@ static int matroska_read_close(AVFormatContext *s);
>>   static int matroska_resync(MatroskaDemuxContext *matroska, int64_t
>> last_pos)
>>   {
>>       AVIOContext *pb = matroska->ctx->pb;
>> +    int64_t ret;
>>       uint32_t id;
>>       matroska->current_id = 0;
>>       matroska->num_levels = 0;
>>         /* seek to next position to resync from */
>> -    if (avio_seek(pb, last_pos + 1, SEEK_SET) < 0)
>> -        goto eof;
>> +    if ((ret = avio_seek(pb, last_pos + 1, SEEK_SET)) < 0) {
>> +        matroska->done = 1;
>> +        return ret;
>>
>
> doesn't this generate a warning, returning an int64 from a function
> supposed to return an int?


avio_seek returns an int64, so at some point an int64 is going to be
converted to an int. I don't believe it will make a difference where,
especially since the values that will actually be returned (error codes)
should fit in an int.


>
> +    }
>>         id = avio_rb32(pb);
>>   @@ -760,7 +763,6 @@ static int matroska_resync(MatroskaDemuxContext
>> *matroska, int64_t last_pos)
>>           id = (id << 8) | avio_r8(pb);
>>       }
>>   -eof:
>>       matroska->done = 1;
>>       return AVERROR_EOF;
>>   }
>> @@ -3317,13 +3319,14 @@ static int matroska_parse_cluster(MatroskaDemuxContext
>> *matroska)
>>   static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
>>   {
>>       MatroskaDemuxContext *matroska = s->priv_data;
>> +    int ret = 0;
>>         while (matroska_deliver_packet(matroska, pkt)) {
>>           int64_t pos = avio_tell(matroska->ctx->pb);
>>           if (matroska->done)
>> -            return AVERROR_EOF;
>> +            return (ret < 0) ? ret : AVERROR_EOF;
>>           if (matroska_parse_cluster(matroska) < 0)
>> -            matroska_resync(matroska, pos);
>> +            ret = matroska_resync(matroska, pos);
>>       }
>>         return 0;
>>
>
> You might want to return ret instead of 0 here.


Done.


>
>
> --
> Ben
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
diff mbox

Patch

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 77b8a5d..936690d 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -738,13 +738,16 @@  static int matroska_read_close(AVFormatContext *s);
 static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
 {
     AVIOContext *pb = matroska->ctx->pb;
+    int64_t ret;
     uint32_t id;
     matroska->current_id = 0;
     matroska->num_levels = 0;
 
     /* seek to next position to resync from */
-    if (avio_seek(pb, last_pos + 1, SEEK_SET) < 0)
-        goto eof;
+    if ((ret = avio_seek(pb, last_pos + 1, SEEK_SET)) < 0) {
+        matroska->done = 1;
+        return ret;
+    }
 
     id = avio_rb32(pb);
 
@@ -760,7 +763,6 @@  static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
         id = (id << 8) | avio_r8(pb);
     }
 
-eof:
     matroska->done = 1;
     return AVERROR_EOF;
 }
@@ -3317,13 +3319,14 @@  static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
 static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     MatroskaDemuxContext *matroska = s->priv_data;
+    int ret = 0;
 
     while (matroska_deliver_packet(matroska, pkt)) {
         int64_t pos = avio_tell(matroska->ctx->pb);
         if (matroska->done)
-            return AVERROR_EOF;
+            return (ret < 0) ? ret : AVERROR_EOF;
         if (matroska_parse_cluster(matroska) < 0)
-            matroska_resync(matroska, pos);
+            ret = matroska_resync(matroska, pos);
     }
 
     return 0;