On Fri, Sep 18, 2020 at 12:16:18PM +0200, Andreas Rheinhardt wrote:
> Paul B Mahol:
> > Improves decoding speed by 24x
> > 
> > Signed-off-by: Paul B Mahol <one...@gmail.com>
> > ---
> >  libavformat/adxdec.c | 23 +++++++++++++++--------
> >  1 file changed, 15 insertions(+), 8 deletions(-)
> > 
> > diff --git a/libavformat/adxdec.c b/libavformat/adxdec.c
> > index ccd5049acd..0e4c251cfc 100644
> > --- a/libavformat/adxdec.c
> > +++ b/libavformat/adxdec.c
> > @@ -53,6 +53,9 @@ static int adx_read_packet(AVFormatContext *s, AVPacket 
> > *pkt)
> >      AVCodecParameters *par = s->streams[0]->codecpar;
> >      int ret, size;
> >  
> > +    if (avio_feof(s->pb))
> > +        return AVERROR_EOF;
> > +
> >      if (par->channels <= 0) {
> >          av_log(s, AV_LOG_ERROR, "invalid number of channels %d\n", 
> > par->channels);
> >          return AVERROR_INVALIDDATA;
> > @@ -63,16 +66,20 @@ static int adx_read_packet(AVFormatContext *s, AVPacket 
> > *pkt)
> >      pkt->pos = avio_tell(s->pb);
> >      pkt->stream_index = 0;
> >  
> > -    ret = av_get_packet(s->pb, pkt, size);
> > -    if (ret != size) {
> > -        return ret < 0 ? ret : AVERROR(EIO);
> > -    }
> > -    if (AV_RB16(pkt->data) & 0x8000) {
> > -        return AVERROR_EOF;
> > +    ret = av_get_packet(s->pb, pkt, size * 128);
> > +    if (ret < 0)
> > +        return ret;
> > +    if ((ret % size) && ret >= size) {
> 
> So if ret < size you don't set the corrupt flag. Why?

Because data, that is not gonna be used at all, is discarded, instead of
pointlessly being passed to decoder and there errored out.
This happens at every single eof.

> 
> > +        size = ret - (ret % size);
> > +        av_shrink_packet(pkt, size);
> > +        pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
> > +    } else {
> > +        size = ret;
> >      }
> > +
> >      pkt->size     = size;
> 
> This line makes no sense any more: If the first branch above is taken,
> av_shrink_packet() will already set the size; in the other branch,
> av_get_packet() already did.

Removed that line locally.

> 
> > -    pkt->duration = 1;
> > -    pkt->pts      = (pkt->pos - c->header_size) / size;
> > +    pkt->duration = size / (BLOCK_SIZE * par->channels);
> > +    pkt->pts      = (pkt->pos - c->header_size) / (BLOCK_SIZE * 
> > par->channels);
> >  
> >      return 0;
> >  }
> > 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to