[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