* qatar/master:
AVOptions: fix av_set_string3() doxy to match reality.
cmdutils: get rid of dummy contexts for examining AVOptions.
lavf,lavc,sws: add {avcodec,avformat,sws}_get_class() functions.
AVOptions: add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find().
cpu detection: avoid a signed overflow
Conflicts:
avconv.c
cmdutils.c
doc/APIchanges
ffmpeg.c
libavcodec/options.c
libavcodec/version.h
libavformat/version.h
libavutil/avutil.h
Merged-by: Michael Niedermayer <michaelni@gmx.at>
tags/n0.9
| @@ -3883,6 +3883,7 @@ static int opt_help(const char *opt, const char *arg) | |||
| AVCodec *c; | |||
| AVOutputFormat *oformat = NULL; | |||
| AVInputFormat *iformat = NULL; | |||
| const AVClass *class; | |||
| av_log_set_callback(log_callback_help); | |||
| show_usage(); | |||
| @@ -3910,7 +3911,8 @@ static int opt_help(const char *opt, const char *arg) | |||
| OPT_GRAB, | |||
| OPT_GRAB); | |||
| printf("\n"); | |||
| av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| class = avcodec_get_class(); | |||
| av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| printf("\n"); | |||
| /* individual codec options */ | |||
| @@ -3922,7 +3924,8 @@ static int opt_help(const char *opt, const char *arg) | |||
| } | |||
| } | |||
| av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| class = avformat_get_class(); | |||
| av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| printf("\n"); | |||
| /* individual muxer options */ | |||
| @@ -3941,7 +3944,8 @@ static int opt_help(const char *opt, const char *arg) | |||
| } | |||
| } | |||
| av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| class = sws_get_class(); | |||
| av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| return 0; | |||
| } | |||
| @@ -49,8 +49,6 @@ | |||
| #include <sys/resource.h> | |||
| #endif | |||
| AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; | |||
| AVFormatContext *avformat_opts; | |||
| struct SwsContext *sws_opts; | |||
| AVDictionary *format_opts, *codec_opts; | |||
| @@ -58,10 +56,6 @@ static const int this_year = 2011; | |||
| void init_opts(void) | |||
| { | |||
| int i; | |||
| for (i = 0; i < AVMEDIA_TYPE_NB; i++) | |||
| avcodec_opts[i] = avcodec_alloc_context3(NULL); | |||
| avformat_opts = avformat_alloc_context(); | |||
| #if CONFIG_SWSCALE | |||
| sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL); | |||
| #endif | |||
| @@ -69,11 +63,6 @@ void init_opts(void) | |||
| void uninit_opts(void) | |||
| { | |||
| int i; | |||
| for (i = 0; i < AVMEDIA_TYPE_NB; i++) | |||
| av_freep(&avcodec_opts[i]); | |||
| av_freep(&avformat_opts->key); | |||
| av_freep(&avformat_opts); | |||
| #if CONFIG_SWSCALE | |||
| sws_freeContext(sws_opts); | |||
| sws_opts = NULL; | |||
| @@ -293,18 +282,19 @@ int opt_default(const char *opt, const char *arg) | |||
| const AVOption *oc, *of, *os; | |||
| char opt_stripped[128]; | |||
| const char *p; | |||
| const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class(), *sc = sws_get_class(); | |||
| if (!(p = strchr(opt, ':'))) | |||
| p = opt + strlen(opt); | |||
| av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1)); | |||
| if ((oc = av_opt_find(avcodec_opts[0], opt_stripped, NULL, 0, AV_OPT_SEARCH_CHILDREN)) || | |||
| if ((oc = av_opt_find(&cc, opt_stripped, NULL, 0, AV_OPT_SEARCH_CHILDREN|AV_OPT_SEARCH_FAKE_OBJ)) || | |||
| ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') && | |||
| (oc = av_opt_find(avcodec_opts[0], opt+1, NULL, 0, 0)))) | |||
| (oc = av_opt_find(&cc, opt+1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) | |||
| av_dict_set(&codec_opts, opt, arg, FLAGS(oc)); | |||
| if ((of = av_opt_find(avformat_opts, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN))) | |||
| if ((of = av_opt_find(&fc, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) | |||
| av_dict_set(&format_opts, opt, arg, FLAGS(of)); | |||
| if ((os = av_opt_find(sws_opts, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN))) { | |||
| if ((os = av_opt_find(&sc, opt, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) { | |||
| // XXX we only support sws_flags, not arbitrary sws options | |||
| int ret = av_set_string3(sws_opts, opt, arg, 1, NULL); | |||
| if (ret < 0) { | |||
| @@ -831,6 +821,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFor | |||
| AVCodec *codec = s->oformat ? avcodec_find_encoder(codec_id) : avcodec_find_decoder(codec_id); | |||
| int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM : AV_OPT_FLAG_DECODING_PARAM; | |||
| char prefix = 0; | |||
| const AVClass *cc = avcodec_get_class(); | |||
| if (!codec) | |||
| return NULL; | |||
| @@ -852,10 +843,10 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, AVFor | |||
| default: return NULL; | |||
| } | |||
| if (av_opt_find(avcodec_opts[0], t->key, NULL, flags, 0) || | |||
| (codec && codec->priv_class && av_opt_find(&codec->priv_class, t->key, NULL, flags, 0))) | |||
| if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) || | |||
| (codec && codec->priv_class && av_opt_find(&codec->priv_class, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ))) | |||
| av_dict_set(&ret, t->key, t->value, 0); | |||
| else if (t->key[0] == prefix && av_opt_find(avcodec_opts[0], t->key+1, NULL, flags, 0)) | |||
| else if (t->key[0] == prefix && av_opt_find(&cc, t->key+1, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ)) | |||
| av_dict_set(&ret, t->key+1, t->value, 0); | |||
| if (p) | |||
| @@ -19,6 +19,14 @@ API changes, most recent first: | |||
| 2011-08-20 - 69e2c1a - lavu 51.13.0 | |||
| Add av_get_media_type_string(). | |||
| 2011-08-xx - xxxxxxx - lavc 53.13.0 | |||
| lavf 53.11.0 | |||
| lsws 2.1.0 | |||
| Add {avcodec,avformat,sws}_get_class(). | |||
| 2011-08-xx - xxxxxxx - lavu 51.15.0 | |||
| Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function. | |||
| 2011-08-14 - 323b930 - lavu 51.12.0 | |||
| Add av_fifo_peek2(), deprecate av_fifo_peek(). | |||
| @@ -4021,6 +4021,7 @@ static int opt_help(const char *opt, const char *arg) | |||
| AVCodec *c; | |||
| AVOutputFormat *oformat = NULL; | |||
| AVInputFormat *iformat = NULL; | |||
| const AVClass *class; | |||
| av_log_set_callback(log_callback_help); | |||
| show_usage(); | |||
| @@ -4048,7 +4049,8 @@ static int opt_help(const char *opt, const char *arg) | |||
| OPT_GRAB, | |||
| OPT_GRAB); | |||
| printf("\n"); | |||
| av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| class = avcodec_get_class(); | |||
| av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| printf("\n"); | |||
| /* individual codec options */ | |||
| @@ -4060,7 +4062,8 @@ static int opt_help(const char *opt, const char *arg) | |||
| } | |||
| } | |||
| av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| class = avformat_get_class(); | |||
| av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| printf("\n"); | |||
| /* individual muxer options */ | |||
| @@ -4079,7 +4082,8 @@ static int opt_help(const char *opt, const char *arg) | |||
| } | |||
| } | |||
| av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| class = sws_get_class(); | |||
| av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| return 0; | |||
| } | |||
| @@ -2960,6 +2960,7 @@ static void show_usage(void) | |||
| static int opt_help(const char *opt, const char *arg) | |||
| { | |||
| const AVClass *class; | |||
| av_log_set_callback(log_callback_help); | |||
| show_usage(); | |||
| show_help_options(options, "Main options:\n", | |||
| @@ -2967,14 +2968,17 @@ static int opt_help(const char *opt, const char *arg) | |||
| show_help_options(options, "\nAdvanced options:\n", | |||
| OPT_EXPERT, OPT_EXPERT); | |||
| printf("\n"); | |||
| av_opt_show2(avcodec_opts[0], NULL, | |||
| class = avcodec_get_class(); | |||
| av_opt_show2(&class, NULL, | |||
| AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| printf("\n"); | |||
| av_opt_show2(avformat_opts, NULL, | |||
| class = avformat_get_class(); | |||
| av_opt_show2(&class, NULL, | |||
| AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| #if !CONFIG_AVFILTER | |||
| printf("\n"); | |||
| av_opt_show2(sws_opts, NULL, | |||
| class = sws_get_class(); | |||
| av_opt_show2(&class, NULL, | |||
| AV_OPT_FLAG_ENCODING_PARAM, 0); | |||
| #endif | |||
| printf("\nWhile playing:\n" | |||
| @@ -470,11 +470,12 @@ static int opt_input_file(const char *opt, const char *arg) | |||
| static int opt_help(const char *opt, const char *arg) | |||
| { | |||
| const AVClass *class = avformat_get_class(); | |||
| av_log_set_callback(log_callback_help); | |||
| show_usage(); | |||
| show_help_options(options, "Main options:\n", 0, 0); | |||
| printf("\n"); | |||
| av_opt_show2(avformat_opts, NULL, | |||
| av_opt_show2(&class, NULL, | |||
| AV_OPT_FLAG_DECODING_PARAM, 0); | |||
| return 0; | |||
| } | |||
| @@ -529,7 +530,5 @@ int main(int argc, char **argv) | |||
| ret = probe_file(input_filename); | |||
| av_free(avformat_opts); | |||
| return ret; | |||
| } | |||
| @@ -4417,4 +4417,12 @@ int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); | |||
| */ | |||
| enum AVMediaType avcodec_get_type(enum CodecID codec_id); | |||
| /** | |||
| * Get the AVClass for AVCodecContext. It can be used in combination with | |||
| * AV_OPT_SEARCH_FAKE_OBJ for examining options. | |||
| * | |||
| * @see av_opt_find(). | |||
| */ | |||
| const AVClass *avcodec_get_class(void); | |||
| #endif /* AVCODEC_AVCODEC_H */ | |||
| @@ -44,7 +44,7 @@ static const AVOption *opt_find(void *obj, const char *name, const char *unit, i | |||
| AVCodecContext *s = obj; | |||
| AVCodec *c = NULL; | |||
| if (s->priv_data) { | |||
| if (!(search_flags & AV_OPT_SEARCH_FAKE_OBJ) && s->priv_data) { | |||
| if (s->codec && s->codec->priv_class) | |||
| return av_opt_find(s->priv_data, name, unit, opt_flags, search_flags); | |||
| return NULL; | |||
| @@ -662,3 +662,8 @@ fail: | |||
| av_freep(&dest->rc_eq); | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| const AVClass *avcodec_get_class(void) | |||
| { | |||
| return &av_codec_context_class; | |||
| } | |||
| @@ -21,7 +21,7 @@ | |||
| #define AVCODEC_VERSION_H | |||
| #define LIBAVCODEC_VERSION_MAJOR 53 | |||
| #define LIBAVCODEC_VERSION_MINOR 12 | |||
| #define LIBAVCODEC_VERSION_MINOR 13 | |||
| #define LIBAVCODEC_VERSION_MICRO 0 | |||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | |||
| @@ -1720,4 +1720,12 @@ int av_match_ext(const char *filename, const char *extensions); | |||
| */ | |||
| int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance); | |||
| /** | |||
| * Get the AVClass for AVFormatContext. It can be used in combination with | |||
| * AV_OPT_SEARCH_FAKE_OBJ for examining options. | |||
| * | |||
| * @see av_opt_find(). | |||
| */ | |||
| const AVClass *avformat_get_class(void); | |||
| #endif /* AVFORMAT_AVFORMAT_H */ | |||
| @@ -38,7 +38,7 @@ static const AVOption *opt_find(void *obj, const char *name, const char *unit, i | |||
| AVFormatContext *s = obj; | |||
| AVInputFormat *ifmt = NULL; | |||
| AVOutputFormat *ofmt = NULL; | |||
| if (s->priv_data) { | |||
| if (!(search_flags & AV_OPT_SEARCH_FAKE_OBJ) && s->priv_data) { | |||
| if ((s->iformat && !s->iformat->priv_class) || | |||
| (s->oformat && !s->oformat->priv_class)) | |||
| return NULL; | |||
| @@ -126,3 +126,8 @@ AVFormatContext *avformat_alloc_context(void) | |||
| avformat_get_context_defaults(ic); | |||
| return ic; | |||
| } | |||
| const AVClass *avformat_get_class(void) | |||
| { | |||
| return &av_format_context_class; | |||
| } | |||
| @@ -24,7 +24,7 @@ | |||
| #include "libavutil/avutil.h" | |||
| #define LIBAVFORMAT_VERSION_MAJOR 53 | |||
| #define LIBAVFORMAT_VERSION_MINOR 10 | |||
| #define LIBAVFORMAT_VERSION_MINOR 11 | |||
| #define LIBAVFORMAT_VERSION_MICRO 0 | |||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | |||
| @@ -40,7 +40,7 @@ | |||
| #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) | |||
| #define LIBAVUTIL_VERSION_MAJOR 51 | |||
| #define LIBAVUTIL_VERSION_MINOR 14 | |||
| #define LIBAVUTIL_VERSION_MINOR 15 | |||
| #define LIBAVUTIL_VERSION_MICRO 0 | |||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | |||
| @@ -134,7 +134,7 @@ const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int m | |||
| * when 0 then no av_free() nor av_strdup() will be used | |||
| * @return 0 if the value has been set, or an AVERROR code in case of | |||
| * error: | |||
| * AVERROR(ENOENT) if no matching option exists | |||
| * AVERROR_OPTION_NOT_FOUND if no matching option exists | |||
| * AVERROR(ERANGE) if the value is out of range | |||
| * AVERROR(EINVAL) if the value is not valid | |||
| */ | |||
| @@ -216,6 +216,13 @@ int av_opt_set_dict(void *obj, struct AVDictionary **options); | |||
| #define AV_OPT_SEARCH_CHILDREN 0x0001 /**< Search in possible children of the | |||
| given object first. */ | |||
| /** | |||
| * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass | |||
| * instead of a required pointer to a struct containing AVClass. This is | |||
| * useful for searching for options without needing to allocate the corresponding | |||
| * object. | |||
| */ | |||
| #define AV_OPT_SEARCH_FAKE_OBJ 0x0002 | |||
| /** | |||
| * Look for an option in an object. Consider only options which | |||
| @@ -223,6 +230,8 @@ int av_opt_set_dict(void *obj, struct AVDictionary **options); | |||
| * | |||
| * @param[in] obj A pointer to a struct whose first element is a | |||
| * pointer to an AVClass. | |||
| * Alternatively a double pointer to an AVClass, if | |||
| * AV_OPT_SEARCH_FAKE_OBJ search flag is set. | |||
| * @param[in] name The name of the option to look for. | |||
| * @param[in] unit When searching for named constants, name of the unit | |||
| * it belongs to. | |||
| @@ -113,7 +113,7 @@ int ff_get_cpu_flags_x86(void) | |||
| if(max_ext_level >= 0x80000001){ | |||
| cpuid(0x80000001, eax, ebx, ecx, ext_caps); | |||
| if (ext_caps & (1<<31)) | |||
| if (ext_caps & (1U<<31)) | |||
| rval |= AV_CPU_FLAG_3DNOW; | |||
| if (ext_caps & (1<<30)) | |||
| rval |= AV_CPU_FLAG_3DNOWEXT; | |||
| @@ -67,3 +67,8 @@ static const AVOption options[] = { | |||
| }; | |||
| const AVClass sws_context_class = { "SWScaler", sws_context_to_name, options }; | |||
| const AVClass *sws_get_class(void) | |||
| { | |||
| return &sws_context_class; | |||
| } | |||
| @@ -32,7 +32,7 @@ | |||
| #include "libavutil/pixfmt.h" | |||
| #define LIBSWSCALE_VERSION_MAJOR 2 | |||
| #define LIBSWSCALE_VERSION_MINOR 0 | |||
| #define LIBSWSCALE_VERSION_MINOR 1 | |||
| #define LIBSWSCALE_VERSION_MICRO 0 | |||
| #define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ | |||
| @@ -354,5 +354,12 @@ void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pix | |||
| */ | |||
| void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); | |||
| /** | |||
| * Get the AVClass for swsContext. It can be used in combination with | |||
| * AV_OPT_SEARCH_FAKE_OBJ for examining options. | |||
| * | |||
| * @see av_opt_find(). | |||
| */ | |||
| const AVClass *sws_get_class(void); | |||
| #endif /* SWSCALE_SWSCALE_H */ | |||