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 <[email protected]>
> > ---
> >  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
> [email protected]
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> [email protected] with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".

Reply via email to