Paul B Mahol: > 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. >
But you don't return an error if the return value is in the range 0..size - 1; you return the packet with the incomplete and apparently useless packet. >> >>> + 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". > _______________________________________________ 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".