[FFmpeg-devel] [PATCH] lavf/mpegts: improve read error handling

mypopy at gmail.com mypopy at gmail.com
Fri Aug 24 06:00:37 EEST 2018


On Fri, Aug 24, 2018 at 5:38 AM Rodger Combs <rodger.combs at gmail.com> wrote:
>
> We previously could fail to check errors entirely, or misinterpret read
errors
> as normal EOFs.
> ---
>  libavformat/mpegts.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index 37a6aa8bff..1350213d39 100644
> --- a/libavformat/mpegts.c
> +++ b/libavformat/mpegts.c
> @@ -2475,6 +2475,8 @@ static int mpegts_resync(AVFormatContext *s, int
seekback, const uint8_t *curren
>
>      for (i = 0; i < ts->resync_size; i++) {
>          c = avio_r8(pb);
> +        if (pb->error)
> +            return pb->error;
>          if (avio_feof(pb))
>              return AVERROR_EOF;
>          if (c == 0x47) {
> @@ -2498,8 +2500,13 @@ static int read_packet(AVFormatContext *s, uint8_t
*buf, int raw_packet_size,
>
>      for (;;) {
>          len = ffio_read_indirect(pb, buf, TS_PACKET_SIZE, data);
> -        if (len != TS_PACKET_SIZE)
> -            return len < 0 ? len : AVERROR_EOF;
> +        if (len != TS_PACKET_SIZE) {
> +            if (len < 0)
> +                return len;
> +            if (pb->error)
> +                return pb->error;
> +            return AVERROR_EOF;
> +        }
>          /* check packet sync byte */
>          if ((*data)[0] != 0x47) {
>              /* find a new packet start */
> @@ -2670,6 +2677,8 @@ static int mpegts_read_header(AVFormatContext *s)
>      /* read the first 8192 bytes to get packet size */
>      pos = avio_tell(pb);
>      len = avio_read(pb, buf, sizeof(buf));
> +    if (len < 0)
> +        return len;
>      ts->raw_packet_size = get_packet_size(buf, len);
>      if (ts->raw_packet_size <= 0) {
>          av_log(s, AV_LOG_WARNING, "Could not detect TS packet size,
defaulting to non-FEC/DVHS\n");
> --
As I understand, only after avio_xxx return < 0 to check pb->error, now we
coding like:
           len = avio_xxx(pb);
           if (len < 0)
                return len;
            if (pb->error)
                return pb->error;

It's stranger way for me, consider Unix API read(2), we just check the
error after -1 is returned
(
http://man7.org/linux/man-pages/man2/read.2.html
)

we usually catch the error
/ error
number like:

len =  read(fd, buf, buf_size);
if (len < 0)
   handle the error with error number.


More information about the ffmpeg-devel mailing list