aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-10-07 01:07:47 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-10-10 14:29:54 +0200
commitd98dfcecad179260182d90ed1d170c1037db7568 (patch)
treee2fafb2a1b03633949611bf27f346d03f20c5538
parent44dc42e4ac1f635bfcb2ba9e77f7caa623b80764 (diff)
downloadffmpeg-d98dfcecad179260182d90ed1d170c1037db7568.tar.gz
fftools/ffmpeg_demux: Don't use fake object with av_opt_eval
The av_opt_eval family of functions emits errors messages on error and can therefore not be used with fake objects when the AVClass has a custom item_name callback. The AVClass for AVCodecContext has such a custom callback (it searches whether an AVCodec is set to use its name). In practice it means that whatever is directly after the "cc" pointer to the AVClass for AVCodec in the stack frame of ist_add() will be treated as a pointer to an AVCodec with unpredictable consequences. Fix this by using an actual AVCodecContext instead of a fake object. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--fftools/ffmpeg_demux.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index c71edf01a5..41fcb678c6 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -1042,9 +1042,6 @@ static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st)
char *codec_tag = NULL;
char *next;
char *discard_str = NULL;
- const AVClass *cc = avcodec_get_class();
- const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL,
- 0, AV_OPT_SEARCH_FAKE_OBJ);
int ret;
ds = demux_stream_alloc(d, st);
@@ -1176,18 +1173,20 @@ static int ist_add(const OptionsContext *o, Demuxer *d, AVStream *st)
(o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
ist->user_set_discard = AVDISCARD_ALL;
+ ist->dec_ctx = avcodec_alloc_context3(ist->dec);
+ if (!ist->dec_ctx)
+ return AVERROR(ENOMEM);
+
if (discard_str) {
- ret = av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard);
+ const AVOption *discard_opt = av_opt_find(ist->dec_ctx, "skip_frame",
+ NULL, 0, 0);
+ ret = av_opt_eval_int(ist->dec_ctx, discard_opt, discard_str, &ist->user_set_discard);
if (ret < 0) {
av_log(ist, AV_LOG_ERROR, "Error parsing discard %s.\n", discard_str);
return ret;
}
}
- ist->dec_ctx = avcodec_alloc_context3(ist->dec);
- if (!ist->dec_ctx)
- return AVERROR(ENOMEM);
-
ret = avcodec_parameters_to_context(ist->dec_ctx, par);
if (ret < 0) {
av_log(ist, AV_LOG_ERROR, "Error initializing the decoder context.\n");