mirror of https://github.com/mpv-player/mpv
ad_spdif: fix segfault due to early deallocation
The avpkt was created once on decoder init but destroyed each time the
filter was destroyed, this obviously can't work. Move the packet alloc
to the filter init function instead.
fixes: 4574dd5dc6
This commit is contained in:
parent
bb17d44835
commit
4c3ed843dc
|
@ -149,10 +149,13 @@ done:
|
||||||
MP_WARN(da, "Failed to parse codec profile.\n");
|
MP_WARN(da, "Failed to parse codec profile.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_filter(struct mp_filter *da, AVPacket *pkt)
|
static int init_filter(struct mp_filter *da)
|
||||||
{
|
{
|
||||||
struct spdifContext *spdif_ctx = da->priv;
|
struct spdifContext *spdif_ctx = da->priv;
|
||||||
|
|
||||||
|
AVPacket *pkt = spdif_ctx->avpkt = av_packet_alloc();
|
||||||
|
MP_HANDLE_OOM(spdif_ctx->avpkt);
|
||||||
|
|
||||||
int profile = FF_PROFILE_UNKNOWN;
|
int profile = FF_PROFILE_UNKNOWN;
|
||||||
int c_rate = 0;
|
int c_rate = 0;
|
||||||
determine_codec_params(da, pkt, &profile, &c_rate);
|
determine_codec_params(da, pkt, &profile, &c_rate);
|
||||||
|
@ -296,12 +299,14 @@ static void process(struct mp_filter *da)
|
||||||
struct mp_aframe *out = NULL;
|
struct mp_aframe *out = NULL;
|
||||||
double pts = mpkt->pts;
|
double pts = mpkt->pts;
|
||||||
|
|
||||||
|
if (!spdif_ctx->lavf_ctx) {
|
||||||
|
if (init_filter(da) < 0)
|
||||||
|
goto done;
|
||||||
|
assert(spdif_ctx->avpkt);
|
||||||
|
}
|
||||||
|
|
||||||
mp_set_av_packet(spdif_ctx->avpkt, mpkt, NULL);
|
mp_set_av_packet(spdif_ctx->avpkt, mpkt, NULL);
|
||||||
spdif_ctx->avpkt->pts = spdif_ctx->avpkt->dts = 0;
|
spdif_ctx->avpkt->pts = spdif_ctx->avpkt->dts = 0;
|
||||||
if (!spdif_ctx->lavf_ctx) {
|
|
||||||
if (init_filter(da, spdif_ctx->avpkt) < 0)
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
spdif_ctx->out_buffer_len = 0;
|
spdif_ctx->out_buffer_len = 0;
|
||||||
int ret = av_write_frame(spdif_ctx->lavf_ctx, spdif_ctx->avpkt);
|
int ret = av_write_frame(spdif_ctx->lavf_ctx, spdif_ctx->avpkt);
|
||||||
avio_flush(spdif_ctx->lavf_ctx->pb);
|
avio_flush(spdif_ctx->lavf_ctx->pb);
|
||||||
|
@ -425,9 +430,6 @@ static struct mp_decoder *create(struct mp_filter *parent,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
spdif_ctx->avpkt = av_packet_alloc();
|
|
||||||
MP_HANDLE_OOM(spdif_ctx->avpkt);
|
|
||||||
|
|
||||||
return &spdif_ctx->public;
|
return &spdif_ctx->public;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue