[FFmpeg-devel] [PATCH] avformat/adxdec: demux multiple blocks at once

Paul B Mahol onemda at gmail.com
Fri Sep 18 13:22:38 EEST 2020


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 <onemda at 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 at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list