Commit b9aac90b authored by Anton Khirnov's avatar Anton Khirnov

avconv: make -map_chapters accept only the input file index.

This is consistent with how all the other options work.
parent 6291d7e4
...@@ -94,11 +94,6 @@ typedef struct MetadataMap { ...@@ -94,11 +94,6 @@ typedef struct MetadataMap {
int index; //< stream/chapter/program number int index; //< stream/chapter/program number
} MetadataMap; } MetadataMap;
typedef struct ChapterMap {
int in_file;
int out_file;
} ChapterMap;
static const OptionDef options[]; static const OptionDef options[];
#define MAX_FILES 100 #define MAX_FILES 100
...@@ -121,8 +116,7 @@ static int metadata_global_autocopy = 1; ...@@ -121,8 +116,7 @@ static int metadata_global_autocopy = 1;
static int metadata_streams_autocopy = 1; static int metadata_streams_autocopy = 1;
static int metadata_chapters_autocopy = 1; static int metadata_chapters_autocopy = 1;
static ChapterMap *chapter_maps = NULL; static int chapters_input_file = INT_MAX;
static int nb_chapter_maps;
/* indexed by output file stream index */ /* indexed by output file stream index */
static int *streamid_map = NULL; static int *streamid_map = NULL;
...@@ -2464,38 +2458,6 @@ static int transcode(AVFormatContext **output_files, ...@@ -2464,38 +2458,6 @@ static int transcode(AVFormatContext **output_files,
AV_DICT_DONT_OVERWRITE); AV_DICT_DONT_OVERWRITE);
} }
/* copy chapters according to chapter maps */
for (i = 0; i < nb_chapter_maps; i++) {
int infile = chapter_maps[i].in_file;
int outfile = chapter_maps[i].out_file;
if (infile < 0 || outfile < 0)
continue;
if (infile >= nb_input_files) {
snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
ret = AVERROR(EINVAL);
goto dump_format;
}
if (outfile >= nb_output_files) {
snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
ret = AVERROR(EINVAL);
goto dump_format;
}
copy_chapters(infile, outfile);
}
/* copy chapters from the first input file that has them*/
if (!nb_chapter_maps)
for (i = 0; i < nb_input_files; i++) {
if (!input_files[i].ctx->nb_chapters)
continue;
for (j = 0; j < nb_output_files; j++)
if ((ret = copy_chapters(i, j)) < 0)
goto dump_format;
break;
}
/* open files and write file headers */ /* open files and write file headers */
for(i=0;i<nb_output_files;i++) { for(i=0;i<nb_output_files;i++) {
os = output_files[i]; os = output_files[i];
...@@ -3073,22 +3035,6 @@ static int opt_map_meta_data(const char *opt, const char *arg) ...@@ -3073,22 +3035,6 @@ static int opt_map_meta_data(const char *opt, const char *arg)
return opt_map_metadata(opt, arg); return opt_map_metadata(opt, arg);
} }
static int opt_map_chapters(const char *opt, const char *arg)
{
ChapterMap *c;
char *p;
chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
nb_chapter_maps + 1);
c = &chapter_maps[nb_chapter_maps - 1];
c->out_file = strtol(arg, &p, 0);
if (*p)
p++;
c->in_file = strtol(p, &p, 0);
return 0;
}
static int opt_input_ts_scale(const char *opt, const char *arg) static int opt_input_ts_scale(const char *opt, const char *arg)
{ {
unsigned int stream; unsigned int stream;
...@@ -3732,7 +3678,7 @@ static int opt_streamid(const char *opt, const char *arg) ...@@ -3732,7 +3678,7 @@ static int opt_streamid(const char *opt, const char *arg)
static void opt_output_file(const char *filename) static void opt_output_file(const char *filename)
{ {
AVFormatContext *oc; AVFormatContext *oc;
int err, use_video, use_audio, use_subtitle, use_data; int i, err, use_video, use_audio, use_subtitle, use_data;
int input_has_video, input_has_audio, input_has_subtitle, input_has_data; int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
AVOutputFormat *file_oformat; AVOutputFormat *file_oformat;
...@@ -3857,12 +3803,32 @@ static void opt_output_file(const char *filename) ...@@ -3857,12 +3803,32 @@ static void opt_output_file(const char *filename)
} }
oc->flags |= AVFMT_FLAG_NONBLOCK; oc->flags |= AVFMT_FLAG_NONBLOCK;
/* copy chapters */
if (chapters_input_file >= nb_input_files) {
if (chapters_input_file == INT_MAX) {
/* copy chapters from the first input file that has them*/
chapters_input_file = -1;
for (i = 0; i < nb_input_files; i++)
if (input_files[i].ctx->nb_chapters) {
chapters_input_file = i;
break;
}
} else {
av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
chapters_input_file);
exit_program(1);
}
}
if (chapters_input_file >= 0)
copy_chapters(chapters_input_file, nb_output_files - 1);
frame_rate = (AVRational){0, 0}; frame_rate = (AVRational){0, 0};
frame_width = 0; frame_width = 0;
frame_height = 0; frame_height = 0;
audio_sample_rate = 0; audio_sample_rate = 0;
audio_channels = 0; audio_channels = 0;
audio_sample_fmt = AV_SAMPLE_FMT_NONE; audio_sample_fmt = AV_SAMPLE_FMT_NONE;
chapters_input_file = INT_MAX;
av_freep(&forced_key_frames); av_freep(&forced_key_frames);
uninit_opts(); uninit_opts();
...@@ -4250,7 +4216,7 @@ static const OptionDef options[] = { ...@@ -4250,7 +4216,7 @@ static const OptionDef options[] = {
"outfile[,metadata]:infile[,metadata]" }, "outfile[,metadata]:infile[,metadata]" },
{ "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile", { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
"outfile[,metadata]:infile[,metadata]" }, "outfile[,metadata]:infile[,metadata]" },
{ "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" }, { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
{ "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" }, { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
{ "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, // { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
{ "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" }, { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
......
...@@ -703,10 +703,11 @@ of the output file: ...@@ -703,10 +703,11 @@ of the output file:
@example @example
avconv -i in.ogg -map_metadata 0:0,s0 out.mp3 avconv -i in.ogg -map_metadata 0:0,s0 out.mp3
@end example @end example
@item -map_chapters @var{outfile}:@var{infile} @item -map_chapters @var{input_file_index}
Copy chapters from @var{infile} to @var{outfile}. If no chapter mapping is specified, Copy chapters from input file with index @var{input_file_index} to the next
then chapters are copied from the first input file with at least one chapter to all output file. If no chapter mapping is specified, then chapters are copied from
output files. Use a negative file index to disable any chapter copying. the first input file with at least one chapter. Use a negative file index to
disable any chapter copying.
@item -debug @item -debug
Print specific debug info. Print specific debug info.
@item -benchmark @item -benchmark
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment