[FFmpeg-devel] [PATCH 1/2] avformat: add CRI AAX demuxer

James Almer jamrial at gmail.com
Sun Sep 13 01:40:09 EEST 2020


On 9/12/2020 7:33 PM, Paul B Mahol wrote:
> +static int aax_read_packet(AVFormatContext *s, AVPacket *pkt)
> +{
> +    AAXContext *a = s->priv_data;
> +    AVCodecParameters *par = s->streams[0]->codecpar;
> +    AVIOContext *pb = s->pb;
> +    const int size = 18 * par->channels;
> +    int ret, extradata_size = 0;
> +    uint8_t *dst = NULL;
> +
> +    if (avio_feof(pb))
> +        return AVERROR_EOF;
> +
> +    if (avio_tell(pb) >= a->segments[a->current_segment].offset +
> +                         a->segments[a->current_segment].size) {
> +        if (a->current_segment + 1 == a->nb_segments)
> +            return AVERROR_EOF;
> +        a->last_segment_pts = a->prev_pts;
> +        a->current_segment++;
> +        avio_seek(pb, a->segments[a->current_segment].offset, SEEK_SET);
> +        if (avio_rb16(pb) != 0x8000)
> +            return AVERROR_INVALIDDATA;
> +        extradata_size = avio_rb16(pb) + 4;
> +        avio_seek(pb, -4, SEEK_CUR);
> +        if (extradata_size < 12)
> +            return AVERROR_INVALIDDATA;
> +        dst = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, extradata_size);
> +        if (!dst)
> +            return AVERROR(ENOMEM);
> +        avio_read(pb, dst, extradata_size);
> +    }
> +
> +    pkt->pos = avio_tell(pb);
> +    ret = av_get_packet(pb, pkt, size);

This will call av_init_packet() internally, meaning the side data you
allocated above will be lost...

> +    pkt->duration = 1;
> +    pkt->stream_index = 0;
> +    pkt->pts = a->last_segment_pts + ((pkt->pos - a->segments[a->current_segment].offset) / size);
> +    a->prev_pts = pkt->pts;
> +
> +    if (dst) {
> +        ret = av_packet_add_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, dst, extradata_size);

...and then readded by this.

Just replace the av_packet_new_side_data() call above with an
av_mallocz() one.

> +        if (ret < 0)
> +            return ret;
> +    }
> +
> +    return ret;
> +}


More information about the ffmpeg-devel mailing list