1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-02-04 06:08:26 +02:00

avconv: move metadata maps to options context.

This commit is contained in:
Anton Khirnov 2011-08-29 09:16:42 +02:00
parent 35e6f8c174
commit 847529f84a

View File

@ -99,13 +99,6 @@ static const OptionDef options[];
static AVDictionary *ts_scale;
/* first item specifies output metadata, second is input */
static MetadataMap (*meta_data_maps)[2] = NULL;
static int nb_meta_data_maps;
static int metadata_global_autocopy = 1;
static int metadata_streams_autocopy = 1;
static int metadata_chapters_autocopy = 1;
static int chapters_input_file = INT_MAX;
/* indexed by output file stream index */
@ -321,6 +314,12 @@ typedef struct OptionsContext {
/* output options */
StreamMap *stream_maps;
int nb_stream_maps;
/* first item specifies output metadata, second is input */
MetadataMap (*meta_data_maps)[2];
int nb_meta_data_maps;
int metadata_global_manual;
int metadata_streams_manual;
int metadata_chapters_manual;
int64_t recording_time;
uint64_t limit_filesize;
@ -362,6 +361,7 @@ static void reset_options(OptionsContext *o)
}
av_freep(&o->stream_maps);
av_freep(&o->meta_data_maps);
memset(o, 0, sizeof(*o));
@ -513,8 +513,6 @@ void exit_program(int ret)
fclose(vstats_file);
av_free(vstats_filename);
av_free(meta_data_maps);
av_freep(&input_streams);
av_freep(&input_files);
av_freep(&output_streams);
@ -2756,30 +2754,30 @@ static void parse_meta_type(char *arg, char *type, int *index)
*type = 'g';
}
static int opt_map_metadata(const char *opt, const char *arg)
static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
{
MetadataMap *m, *m1;
char *p;
meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
&nb_meta_data_maps, nb_meta_data_maps + 1);
o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
&o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
m = &meta_data_maps[nb_meta_data_maps - 1][1];
m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
m->file = strtol(arg, &p, 0);
parse_meta_type(p, &m->type, &m->index);
m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
if (p = strchr(opt, ':'))
parse_meta_type(p, &m1->type, &m1->index);
else
m1->type = 'g';
if (m->type == 'g' || m1->type == 'g')
metadata_global_autocopy = 0;
o->metadata_global_manual = 1;
if (m->type == 's' || m1->type == 's')
metadata_streams_autocopy = 0;
o->metadata_streams_manual = 1;
if (m->type == 'c' || m1->type == 'c')
metadata_chapters_autocopy = 0;
o->metadata_chapters_manual = 1;
return 0;
}
@ -3343,7 +3341,7 @@ static int opt_streamid(const char *opt, const char *arg)
return 0;
}
static int copy_chapters(InputFile *ifile, OutputFile *ofile)
static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
{
AVFormatContext *is = ifile->ctx;
AVFormatContext *os = ofile->ctx;
@ -3371,7 +3369,7 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile)
out_ch->start = FFMAX(0, in_ch->start - ts_off);
out_ch->end = FFMIN(rt, in_ch->end - ts_off);
if (metadata_chapters_autocopy)
if (copy_metadata)
av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
os->nb_chapters++;
@ -3604,10 +3602,11 @@ static void opt_output_file(void *optctx, const char *filename)
}
}
if (chapters_input_file >= 0)
copy_chapters(&input_files[chapters_input_file], &output_files[nb_output_files - 1]);
copy_chapters(&input_files[chapters_input_file], &output_files[nb_output_files - 1],
o->metadata_chapters_manual);
/* copy metadata */
for (i = 0; i < nb_meta_data_maps; i++) {
for (i = 0; i < o->nb_meta_data_maps; i++) {
AVFormatContext *files[2];
AVDictionary **meta[2];
int j;
@ -3619,7 +3618,7 @@ static void opt_output_file(void *optctx, const char *filename)
exit_program(1);\
}
int in_file_index = meta_data_maps[i][1].file;
int in_file_index = o->meta_data_maps[i][1].file;
if (in_file_index < 0)
continue;
METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
@ -3628,7 +3627,7 @@ static void opt_output_file(void *optctx, const char *filename)
files[1] = input_files[in_file_index].ctx;
for (j = 0; j < 2; j++) {
MetadataMap *map = &meta_data_maps[i][j];
MetadataMap *map = &o->meta_data_maps[i][j];
switch (map->type) {
case 'g':
@ -3653,10 +3652,10 @@ static void opt_output_file(void *optctx, const char *filename)
}
/* copy global metadata by default */
if (metadata_global_autocopy && nb_input_files)
if (!o->metadata_global_manual && nb_input_files)
av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
AV_DICT_DONT_OVERWRITE);
if (metadata_streams_autocopy)
if (!o->metadata_streams_manual)
for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
InputStream *ist = &input_streams[output_streams[i].source_index];
av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
@ -3670,11 +3669,6 @@ static void opt_output_file(void *optctx, const char *filename)
audio_sample_fmt = AV_SAMPLE_FMT_NONE;
chapters_input_file = INT_MAX;
av_freep(&meta_data_maps);
nb_meta_data_maps = 0;
metadata_global_autocopy = 1;
metadata_streams_autocopy = 1;
metadata_chapters_autocopy = 1;
av_freep(&streamid_map);
nb_streamid_map = 0;
@ -4025,7 +4019,7 @@ static const OptionDef options[] = {
{ "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
{ "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
{ "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
{ "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
{ "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
"outfile[,metadata]:infile[,metadata]" },
{ "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
{ "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },