The obstacle to do so was in filter_codec_opts: It uses searches the AVCodec for options via the AV_OPT_SEARCH_FAKE_OBJ method, which requires using a void * that points to a pointer to a const AVClass. When using const AVCodec *, one can not simply use a pointer that points to the AVCodec's pointer to its AVClass, as said pointer is const, too. This is fixed by using a temporary pointer to the AVClass. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>tags/n4.4
@@ -2101,7 +2101,7 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec) | |||||
} | } | ||||
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | ||||
AVFormatContext *s, AVStream *st, AVCodec *codec) | |||||
AVFormatContext *s, AVStream *st, const AVCodec *codec) | |||||
{ | { | ||||
AVDictionary *ret = NULL; | AVDictionary *ret = NULL; | ||||
AVDictionaryEntry *t = NULL; | AVDictionaryEntry *t = NULL; | ||||
@@ -2130,6 +2130,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | |||||
} | } | ||||
while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) { | while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) { | ||||
const AVClass *priv_class; | |||||
char *p = strchr(t->key, ':'); | char *p = strchr(t->key, ':'); | ||||
/* check stream specification in opt name */ | /* check stream specification in opt name */ | ||||
@@ -2142,8 +2143,8 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | |||||
if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) || | if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) || | ||||
!codec || | !codec || | ||||
(codec->priv_class && | |||||
av_opt_find(&codec->priv_class, t->key, NULL, flags, | |||||
((priv_class = codec->priv_class) && | |||||
av_opt_find(&priv_class, t->key, NULL, flags, | |||||
AV_OPT_SEARCH_FAKE_OBJ))) | AV_OPT_SEARCH_FAKE_OBJ))) | ||||
av_dict_set(&ret, t->key, t->value, 0); | av_dict_set(&ret, t->key, t->value, 0); | ||||
else if (t->key[0] == prefix && | else if (t->key[0] == prefix && | ||||
@@ -414,7 +414,7 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); | |||||
* @return a pointer to the created dictionary | * @return a pointer to the created dictionary | ||||
*/ | */ | ||||
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, | ||||
AVFormatContext *s, AVStream *st, AVCodec *codec); | |||||
AVFormatContext *s, AVStream *st, const AVCodec *codec); | |||||
/** | /** | ||||
* Setup AVCodecContext options for avformat_find_stream_info(). | * Setup AVCodecContext options for avformat_find_stream_info(). | ||||
@@ -688,7 +688,7 @@ void assert_avoptions(AVDictionary *m) | |||||
} | } | ||||
} | } | ||||
static void abort_codec_experimental(AVCodec *c, int encoder) | |||||
static void abort_codec_experimental(const AVCodec *c, int encoder) | |||||
{ | { | ||||
exit_program(1); | exit_program(1); | ||||
} | } | ||||
@@ -2943,7 +2943,7 @@ static int init_input_stream(int ist_index, char *error, int error_len) | |||||
InputStream *ist = input_streams[ist_index]; | InputStream *ist = input_streams[ist_index]; | ||||
if (ist->decoding_needed) { | if (ist->decoding_needed) { | ||||
AVCodec *codec = ist->dec; | |||||
const AVCodec *codec = ist->dec; | |||||
if (!codec) { | if (!codec) { | ||||
snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d", | snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d", | ||||
avcodec_get_name(ist->dec_ctx->codec_id), ist->file_index, ist->st->index); | avcodec_get_name(ist->dec_ctx->codec_id), ist->file_index, ist->st->index); | ||||
@@ -3522,7 +3522,7 @@ static int init_output_stream(OutputStream *ost, AVFrame *frame, | |||||
int ret = 0; | int ret = 0; | ||||
if (ost->encoding_needed) { | if (ost->encoding_needed) { | ||||
AVCodec *codec = ost->enc; | |||||
const AVCodec *codec = ost->enc; | |||||
AVCodecContext *dec = NULL; | AVCodecContext *dec = NULL; | ||||
InputStream *ist; | InputStream *ist; | ||||
@@ -307,7 +307,7 @@ typedef struct InputStream { | |||||
#define DECODING_FOR_FILTER 2 | #define DECODING_FOR_FILTER 2 | ||||
AVCodecContext *dec_ctx; | AVCodecContext *dec_ctx; | ||||
AVCodec *dec; | |||||
const AVCodec *dec; | |||||
AVFrame *decoded_frame; | AVFrame *decoded_frame; | ||||
AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ | AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ | ||||
@@ -470,7 +470,7 @@ typedef struct OutputStream { | |||||
AVCodecContext *enc_ctx; | AVCodecContext *enc_ctx; | ||||
AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */ | AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */ | ||||
AVCodec *enc; | |||||
const AVCodec *enc; | |||||
int64_t max_frames; | int64_t max_frames; | ||||
AVFrame *filtered_frame; | AVFrame *filtered_frame; | ||||
AVFrame *last_frame; | AVFrame *last_frame; | ||||
@@ -766,13 +766,13 @@ static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int e | |||||
return codec; | return codec; | ||||
} | } | ||||
static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st) | |||||
static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st) | |||||
{ | { | ||||
char *codec_name = NULL; | char *codec_name = NULL; | ||||
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st); | MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st); | ||||
if (codec_name) { | if (codec_name) { | ||||
AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0); | |||||
const AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0); | |||||
st->codecpar->codec_id = codec->id; | st->codecpar->codec_id = codec->id; | ||||
return codec; | return codec; | ||||
} else | } else | ||||
@@ -2573,7 +2573,7 @@ static int stream_component_open(VideoState *is, int stream_index) | |||||
{ | { | ||||
AVFormatContext *ic = is->ic; | AVFormatContext *ic = is->ic; | ||||
AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
AVCodec *codec; | |||||
const AVCodec *codec; | |||||
const char *forced_codec_name = NULL; | const char *forced_codec_name = NULL; | ||||
AVDictionary *opts = NULL; | AVDictionary *opts = NULL; | ||||
AVDictionaryEntry *t = NULL; | AVDictionaryEntry *t = NULL; | ||||
@@ -2996,7 +2996,7 @@ static int open_input_file(InputFile *ifile, const char *filename, | |||||
for (i = 0; i < fmt_ctx->nb_streams; i++) { | for (i = 0; i < fmt_ctx->nb_streams; i++) { | ||||
InputStream *ist = &ifile->streams[i]; | InputStream *ist = &ifile->streams[i]; | ||||
AVStream *stream = fmt_ctx->streams[i]; | AVStream *stream = fmt_ctx->streams[i]; | ||||
AVCodec *codec; | |||||
const AVCodec *codec; | |||||
ist->st = stream; | ist->st = stream; | ||||