X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg.c;h=cb15120eee193ddc89588108dbb0d2436d3ce418;hb=e8b03952360d7e1f771f363441f898f75325f03c;hp=72156e2253986a0621d4bdacc6e8a2ed5c3fe206;hpb=41dd680dd80d93626e133c02b92e31cabb756eeb;p=ffmpeg diff --git a/ffmpeg.c b/ffmpeg.c index 72156e22539..cb15120eee1 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -162,6 +162,7 @@ static char *audio_language = NULL; static int subtitle_disable = 0; static char *subtitle_codec_name = NULL; static char *subtitle_language = NULL; +static int subtitle_codec_tag = 0; static float mux_preload= 0.5; static float mux_max_delay= 0.7; @@ -672,7 +673,7 @@ static void do_audio_out(AVFormatContext *s, AVPacket pkt; av_init_packet(&pkt); - av_fifo_read(ost->fifo, audio_buf, frame_bytes); + av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL); //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio() @@ -1452,7 +1453,7 @@ static int output_packet(AVInputStream *ist, int ist_index, if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) { int fs_tmp = enc->frame_size; enc->frame_size = fifo_bytes / (2 * enc->channels); - av_fifo_read(ost->fifo, (uint8_t *)samples, fifo_bytes); + av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL); ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples); enc->frame_size = fs_tmp; } @@ -1545,12 +1546,13 @@ static int av_encode(AVFormatContext **output_files, int nb_input_files, AVStreamMap *stream_maps, int nb_stream_maps) { - int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0; + int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0; AVFormatContext *is, *os; AVCodecContext *codec, *icodec; AVOutputStream *ost, **ost_table = NULL; AVInputStream *ist, **ist_table = NULL; AVInputFile *file_table; + char error[1024]; int key; int want_sdp = 1; uint8_t no_packet[MAX_FILES]={0}; @@ -1899,31 +1901,9 @@ static int av_encode(AVFormatContext **output_files, if (!bit_buffer) bit_buffer = av_malloc(bit_buffer_size); - if (!bit_buffer) + if (!bit_buffer) { + ret = AVERROR(ENOMEM); goto fail; - - /* dump the file output parameters - cannot be done before in case - of stream copy */ - for(i=0;ifilename, 1); - } - - /* dump the stream mapping */ - if (verbose >= 0) { - fprintf(stderr, "Stream mapping:\n"); - for(i=0;i #%d.%d", - ist_table[ost->source_index]->file_index, - ist_table[ost->source_index]->index, - ost->file_index, - ost->index); - if (ost->sync_ist != ist_table[ost->source_index]) - fprintf(stderr, " [sync #%d.%d]", - ost->sync_ist->file_index, - ost->sync_ist->index); - fprintf(stderr, "\n"); - } } /* open each encoder */ @@ -1934,14 +1914,16 @@ static int av_encode(AVFormatContext **output_files, if (!codec) codec = avcodec_find_encoder(ost->st->codec->codec_id); if (!codec) { - fprintf(stderr, "Unsupported codec for output stream #%d.%d\n", + snprintf(error, sizeof(error), "Unsupported codec for output stream #%d.%d", ost->file_index, ost->index); - av_exit(1); + ret = AVERROR(EINVAL); + goto dump_format; } if (avcodec_open(ost->st->codec, codec) < 0) { - fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n", + snprintf(error, sizeof(error), "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height", ost->file_index, ost->index); - av_exit(1); + ret = AVERROR(EINVAL); + goto dump_format; } extra_size += ost->st->codec->extradata_size; } @@ -1955,14 +1937,16 @@ static int av_encode(AVFormatContext **output_files, if (!codec) codec = avcodec_find_decoder(ist->st->codec->codec_id); if (!codec) { - fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n", + snprintf(error, sizeof(error), "Unsupported codec (id=%d) for input stream #%d.%d", ist->st->codec->codec_id, ist->file_index, ist->index); - av_exit(1); + ret = AVERROR(EINVAL); + goto dump_format; } if (avcodec_open(ist->st->codec, codec) < 0) { - fprintf(stderr, "Error while opening codec for input stream #%d.%d\n", + snprintf(error, sizeof(error), "Error while opening codec for input stream #%d.%d", ist->file_index, ist->index); - av_exit(1); + ret = AVERROR(EINVAL); + goto dump_format; } //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD; @@ -1987,14 +1971,16 @@ static int av_encode(AVFormatContext **output_files, int out_file_index = meta_data_maps[i].out_file; int in_file_index = meta_data_maps[i].in_file; if (out_file_index < 0 || out_file_index >= nb_output_files) { - fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index); + snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)", + out_file_index, out_file_index, in_file_index); ret = AVERROR(EINVAL); - goto fail; + goto dump_format; } if (in_file_index < 0 || in_file_index >= nb_input_files) { - fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index); + snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)", + in_file_index, out_file_index, in_file_index); ret = AVERROR(EINVAL); - goto fail; + goto dump_format; } out_file = output_files[out_file_index]; @@ -2012,14 +1998,45 @@ static int av_encode(AVFormatContext **output_files, for(i=0;ioformat->name, "rtp")) { want_sdp = 0; } } + + dump_format: + /* dump the file output parameters - cannot be done before in case + of stream copy */ + for(i=0;ifilename, 1); + } + + /* dump the stream mapping */ + if (verbose >= 0) { + fprintf(stderr, "Stream mapping:\n"); + for(i=0;i #%d.%d", + ist_table[ost->source_index]->file_index, + ist_table[ost->source_index]->index, + ost->file_index, + ost->index); + if (ost->sync_ist != ist_table[ost->source_index]) + fprintf(stderr, " [sync #%d.%d]", + ost->sync_ist->file_index, + ost->sync_ist->index); + fprintf(stderr, "\n"); + } + } + + if (ret) { + fprintf(stderr, "%s\n", error); + goto fail; + } + if (want_sdp) { print_sdp(output_files, nb_output_files); } @@ -2104,7 +2121,7 @@ static int av_encode(AVFormatContext **output_files, /* read a frame from it and output it in the fifo */ is = input_files[file_index]; ret= av_read_frame(is, &pkt); - if(ret == AVERROR(EAGAIN) && strcmp(is->iformat->name, "ffm")){ + if(ret == AVERROR(EAGAIN)){ no_packet[file_index]=1; no_packet_count++; continue; @@ -2215,9 +2232,9 @@ static int av_encode(AVFormatContext **output_files, } /* finished ! */ - ret = 0; - fail1: + + fail: av_freep(&bit_buffer); av_free(file_table); @@ -2251,9 +2268,6 @@ static int av_encode(AVFormatContext **output_files, av_free(ost_table); } return ret; - fail: - ret = AVERROR(ENOMEM); - goto fail1; } #if 0 @@ -2307,10 +2321,15 @@ static int opt_me_threshold(const char *opt, const char *arg) return 0; } +static void opt_loglevel(const char *opt, const char *arg) +{ + int level = parse_number_or_die(opt, arg, OPT_INT, INT_MIN, INT_MAX); + av_log_set_level(level); +} + static int opt_verbose(const char *opt, const char *arg) { verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10); - av_log_set_level(verbose); return 0; } @@ -2517,9 +2536,13 @@ static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), static void opt_frame_pix_fmt(const char *arg) { - if (strcmp(arg, "list")) + if (strcmp(arg, "list")) { frame_pix_fmt = avcodec_get_pix_fmt(arg); - else { + if (frame_pix_fmt == PIX_FMT_NONE) { + fprintf(stderr, "Unknown pixel format requested: %s\n", arg); + av_exit(1); + } + } else { list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB); av_exit(0); } @@ -2668,6 +2691,15 @@ static void opt_subtitle_codec(const char *arg) opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg); } +static void opt_subtitle_tag(const char *arg) +{ + char *tail; + subtitle_codec_tag= strtol(arg, &tail, 0); + + if(!tail || *tail) + subtitle_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24); +} + static void opt_map(const char *arg) { AVStreamMap *m; @@ -3209,6 +3241,10 @@ static void new_subtitle_stream(AVFormatContext *oc) subtitle_enc = st->codec; subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE; + + if(subtitle_codec_tag) + subtitle_enc->codec_tag= subtitle_codec_tag; + if (subtitle_stream_copy) { st->stream_copy = 1; } else { @@ -3362,13 +3398,10 @@ static void opt_output_file(const char *filename) filename[1] == ':' || av_strstart(filename, "file:", NULL))) { if (url_exist(filename)) { - int c; - if (!using_stdin) { fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename); fflush(stderr); - c = getchar(); - if (toupper(c) != 'Y') { + if (!read_yesno()) { fprintf(stderr, "Not overwriting - exiting\n"); av_exit(1); } @@ -3779,7 +3812,8 @@ static const OptionDef options[] = { { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" }, { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" }, { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" }, - { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" }, + { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" }, + { "loglevel", HAS_ARG | OPT_FUNC2, {(void*)opt_loglevel}, "set libav* logging level", "number" }, { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" }, { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" }, { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" }, @@ -3854,6 +3888,7 @@ static const OptionDef options[] = { { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" }, { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" }, { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" }, + { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" }, /* grab options */ { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },