1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

lavf/flacdec: stop accessing FFStream.avctx

The demuxer opens an internal parser instance in read_timestamp(), which
requires a codec context. There is no need for it to access the FFStream
one which is used for other purposes, it can allocate its own internal
one.
This commit is contained in:
Anton Khirnov 2024-01-31 16:27:59 +01:00
parent 0d54ae4012
commit 88ba22009e

View File

@ -36,6 +36,8 @@
typedef struct FLACDecContext {
FFRawDemuxerContext rawctx;
int found_seektable;
AVCodecContext *parser_dec;
} FLACDecContext;
static void reset_index_position(int64_t metadata_head_size, AVStream *st)
@ -269,6 +271,7 @@ static int flac_probe(const AVProbeData *p)
static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_index,
int64_t *ppos, int64_t pos_limit)
{
FLACDecContext *flac = s->priv_data;
FFFormatContext *const si = ffformatcontext(s);
AVPacket *const pkt = si->parse_pkt;
AVStream *st = s->streams[stream_index];
@ -285,6 +288,16 @@ static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_inde
}
parser->flags |= PARSER_FLAG_USE_CODEC_TS;
if (!flac->parser_dec) {
flac->parser_dec = avcodec_alloc_context3(NULL);
if (!flac->parser_dec)
return AV_NOPTS_VALUE;
ret = avcodec_parameters_to_context(flac->parser_dec, st->codecpar);
if (ret < 0)
return ret;
}
for (;;){
uint8_t *data;
int size;
@ -298,7 +311,7 @@ static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_inde
av_assert1(!pkt->size);
}
}
av_parser_parse2(parser, ffstream(st)->avctx,
av_parser_parse2(parser, flac->parser_dec,
&data, &size, pkt->data, pkt->size,
pkt->pts, pkt->dts, *ppos);
@ -318,6 +331,15 @@ static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_inde
return pts;
}
static int flac_close(AVFormatContext *s)
{
FLACDecContext *flac = s->priv_data;
avcodec_free_context(&flac->parser_dec);
return 0;
}
static int flac_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) {
AVStream *const st = s->streams[0];
FFStream *const sti = ffstream(st);
@ -347,6 +369,7 @@ const AVInputFormat ff_flac_demuxer = {
.long_name = NULL_IF_CONFIG_SMALL("raw FLAC"),
.read_probe = flac_probe,
.read_header = flac_read_header,
.read_close = flac_close,
.read_packet = ff_raw_read_partial_packet,
.read_seek = flac_seek,
.read_timestamp = flac_read_timestamp,