You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-11 14:30:22 +02:00
Merge commit '666fe5da47d127074be7f0e2bac93db6af8b4a30'
* commit '666fe5da47d127074be7f0e2bac93db6af8b4a30': atomic: Exclude the unsupported implementation headers from checkheaders avconv: do not silently ignore unused codec AVOptions. Conflicts: ffmpeg_opt.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@ -4,6 +4,8 @@ releases are sorted from youngest to oldest.
|
|||||||
version <next>:
|
version <next>:
|
||||||
- curves filter
|
- curves filter
|
||||||
- reference-counting for AVFrame and AVPacket data
|
- reference-counting for AVFrame and AVPacket data
|
||||||
|
- avconv now fails when input options are used for output file
|
||||||
|
or vice versa
|
||||||
|
|
||||||
|
|
||||||
version 1.2:
|
version 1.2:
|
||||||
|
89
ffmpeg_opt.c
89
ffmpeg_opt.c
@ -151,6 +151,24 @@ static void init_options(OptionsContext *o, int is_input)
|
|||||||
o->chapters_input_file = INT_MAX;
|
o->chapters_input_file = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return a copy of the input with the stream specifiers removed from the keys */
|
||||||
|
static AVDictionary *strip_specifiers(AVDictionary *dict)
|
||||||
|
{
|
||||||
|
AVDictionaryEntry *e = NULL;
|
||||||
|
AVDictionary *ret = NULL;
|
||||||
|
|
||||||
|
while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
|
||||||
|
char *p = strchr(e->key, ':');
|
||||||
|
|
||||||
|
if (p)
|
||||||
|
*p = 0;
|
||||||
|
av_dict_set(&ret, e->key, e->value, 0);
|
||||||
|
if (p)
|
||||||
|
*p = ':';
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int opt_sameq(void *optctx, const char *opt, const char *arg)
|
static int opt_sameq(void *optctx, const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
|
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
|
||||||
@ -705,6 +723,8 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
|||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
uint8_t buf[128];
|
uint8_t buf[128];
|
||||||
AVDictionary **opts;
|
AVDictionary **opts;
|
||||||
|
AVDictionary *unused_opts = NULL;
|
||||||
|
AVDictionaryEntry *e = NULL;
|
||||||
int orig_nb_streams; // number of streams before avformat_find_stream_info
|
int orig_nb_streams; // number of streams before avformat_find_stream_info
|
||||||
char * video_codec_name = NULL;
|
char * video_codec_name = NULL;
|
||||||
char * audio_codec_name = NULL;
|
char * audio_codec_name = NULL;
|
||||||
@ -831,6 +851,39 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
|||||||
f->nb_streams = ic->nb_streams;
|
f->nb_streams = ic->nb_streams;
|
||||||
f->rate_emu = o->rate_emu;
|
f->rate_emu = o->rate_emu;
|
||||||
|
|
||||||
|
/* check if all codec options have been used */
|
||||||
|
unused_opts = strip_specifiers(o->g->codec_opts);
|
||||||
|
for (i = f->ist_index; i < nb_input_streams; i++) {
|
||||||
|
e = NULL;
|
||||||
|
while ((e = av_dict_get(input_streams[i]->opts, "", e,
|
||||||
|
AV_DICT_IGNORE_SUFFIX)))
|
||||||
|
av_dict_set(&unused_opts, e->key, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
e = NULL;
|
||||||
|
while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
|
||||||
|
const AVClass *class = avcodec_get_class();
|
||||||
|
const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
|
||||||
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
|
||||||
|
if (!option)
|
||||||
|
continue;
|
||||||
|
if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
|
||||||
|
"input file #%d (%s) is not a decoding option.\n", e->key,
|
||||||
|
option->help ? option->help : "", nb_input_files - 1,
|
||||||
|
filename);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
|
||||||
|
"input file #%d (%s) has not been used for any stream. The most "
|
||||||
|
"likely reason is either wrong type (e.g. a video option with "
|
||||||
|
"no video streams) or that it is a private option of some decoder "
|
||||||
|
"which was not actually used for any stream.\n", e->key,
|
||||||
|
option->help ? option->help : "", nb_input_files - 1, filename);
|
||||||
|
}
|
||||||
|
av_dict_free(&unused_opts);
|
||||||
|
|
||||||
for (i = 0; i < o->nb_dump_attachment; i++) {
|
for (i = 0; i < o->nb_dump_attachment; i++) {
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@ -1452,6 +1505,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
OutputFile *of;
|
OutputFile *of;
|
||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
InputStream *ist;
|
InputStream *ist;
|
||||||
|
AVDictionary *unused_opts = NULL;
|
||||||
|
AVDictionaryEntry *e = NULL;
|
||||||
|
|
||||||
if (configure_complex_filters() < 0) {
|
if (configure_complex_filters() < 0) {
|
||||||
av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
|
av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
|
||||||
@ -1701,6 +1756,40 @@ loop_end:
|
|||||||
of->shortest = o->shortest;
|
of->shortest = o->shortest;
|
||||||
av_dict_copy(&of->opts, o->g->format_opts, 0);
|
av_dict_copy(&of->opts, o->g->format_opts, 0);
|
||||||
|
|
||||||
|
|
||||||
|
/* check if all codec options have been used */
|
||||||
|
unused_opts = strip_specifiers(o->g->codec_opts);
|
||||||
|
for (i = of->ost_index; i < nb_output_streams; i++) {
|
||||||
|
e = NULL;
|
||||||
|
while ((e = av_dict_get(output_streams[i]->opts, "", e,
|
||||||
|
AV_DICT_IGNORE_SUFFIX)))
|
||||||
|
av_dict_set(&unused_opts, e->key, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
e = NULL;
|
||||||
|
while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
|
||||||
|
const AVClass *class = avcodec_get_class();
|
||||||
|
const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
|
||||||
|
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
|
||||||
|
if (!option)
|
||||||
|
continue;
|
||||||
|
if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
|
||||||
|
"output file #%d (%s) is not an encoding option.\n", e->key,
|
||||||
|
option->help ? option->help : "", nb_output_files - 1,
|
||||||
|
filename);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
|
||||||
|
"output file #%d (%s) has not been used for any stream. The most "
|
||||||
|
"likely reason is either wrong type (e.g. a video option with "
|
||||||
|
"no video streams) or that it is a private option of some encoder "
|
||||||
|
"which was not actually used for any stream.\n", e->key,
|
||||||
|
option->help ? option->help : "", nb_output_files - 1, filename);
|
||||||
|
}
|
||||||
|
av_dict_free(&unused_opts);
|
||||||
|
|
||||||
/* check filename in case of an image number is expected */
|
/* check filename in case of an image number is expected */
|
||||||
if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
|
if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
|
||||||
if (!av_filename_number_test(oc->filename)) {
|
if (!av_filename_number_test(oc->filename)) {
|
||||||
|
@ -111,6 +111,10 @@ OBJS += $(COMPAT_OBJS:%=../compat/%)
|
|||||||
|
|
||||||
SKIPHEADERS = old_pix_fmts.h
|
SKIPHEADERS = old_pix_fmts.h
|
||||||
|
|
||||||
|
SKIPHEADERS-$(HAVE_MACHINE_RW_BARRIER) += atomic_suncc.h
|
||||||
|
SKIPHEADERS-$(HAVE_MEMORYBARRIER) += atomic_win32.h
|
||||||
|
SKIPHEADERS-$(HAVE_SYNC_VAL_COMPARE_AND_SWAP) += atomic_gcc.h
|
||||||
|
|
||||||
TESTPROGS = adler32 \
|
TESTPROGS = adler32 \
|
||||||
aes \
|
aes \
|
||||||
atomic \
|
atomic \
|
||||||
|
@ -99,7 +99,7 @@ do_lavf swf "" "-an"
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$do_ffm" ] ; then
|
if [ -n "$do_ffm" ] ; then
|
||||||
do_lavf ffm "-ab 64k"
|
do_lavf ffm
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$do_flm" ] ; then
|
if [ -n "$do_flm" ] ; then
|
||||||
|
Reference in New Issue
Block a user