diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-10-26 02:09:31 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-10-26 02:36:07 +0200 |
commit | 51bfaa21c85201ab31776a447599349a1ed6e96b (patch) | |
tree | b7baafad803a06c5d582606f37f91a27e8342e59 /ffmpeg.c | |
parent | f5fdb12d5552a3710611f15cd72ce6c7b6fb4da0 (diff) | |
parent | a3a8572165ce636fb011b78764a2584777f81b95 (diff) | |
download | ffmpeg-51bfaa21c85201ab31776a447599349a1ed6e96b.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master: (22 commits)
g722dec: check output buffer size before decoding
g722dec: cosmetics: reindent/linewrap
g722dec: remove the use of lowres for half-rate decoding.
tta: check for extradata allocation failure in tta demuxer
tta: check for allocation failure of decode_buffer
tta: use correct frame_length calculation.
tta: add support for decoding 24-bit sample format
cosmetics: indentation
tta: remove pointless braces
tta: check output buffer size after adjusting frame length for last frame
tta: fix reading of format in TTA header.
tta: remove useless commented-out lines
tta: check remaining bitstream size while reading unary value
lavf: deprecate AVStream.stream_copy
avconc: split choose_codec() to choose_decoder/choose_encoder.
lavf: simplify by using FFMAX/FFMIN.
mpegenc: add preload private option.
cosmetics: simplify latm_decode_init
latm: avoid unnecessary reinit of the aac decoder
aacdec: initialize sbr context only in new channel elements
...
Conflicts:
avconv.c
libavcodec/resample.c
libavcodec/tta.c
libavformat/utils.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'ffmpeg.c')
-rw-r--r-- | ffmpeg.c | 99 |
1 files changed, 52 insertions, 47 deletions
@@ -251,6 +251,7 @@ typedef struct OutputStream { int64_t sws_flags; AVDictionary *opts; int is_past_recording_time; + int stream_copy; } OutputStream; @@ -410,7 +411,6 @@ static void reset_options(OptionsContext *o, int is_input) if(is_input) o->recording_time = bak.recording_time; else o->recording_time = INT64_MAX; - o->mux_preload = 0.5; o->mux_max_delay = 0.7; o->limit_filesize = UINT64_MAX; o->chapters_input_file = INT_MAX; @@ -1414,7 +1414,7 @@ static void print_report(OutputFile *output_files, float q = -1; ost = &ost_table[i]; enc = ost->st->codec; - if (!ost->st->stream_copy && enc->coded_frame) + if (!ost->stream_copy && enc->coded_frame) q = enc->coded_frame->quality/(float)FF_QP2LAMBDA; if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) { snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q); @@ -2066,7 +2066,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files, codec->bits_per_raw_sample= icodec->bits_per_raw_sample; codec->chroma_sample_location = icodec->chroma_sample_location; - if (ost->st->stream_copy) { + if (ost->stream_copy) { uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE; if (extra_size > INT_MAX) { @@ -2161,9 +2161,8 @@ static int transcode_init(OutputFile *output_files, int nb_output_files, if (!ost->fifo) { return AVERROR(ENOMEM); } - if (!codec->sample_rate) { + if (!codec->sample_rate) codec->sample_rate = icodec->sample_rate; - } choose_sample_rate(ost->st, ost->enc); codec->time_base = (AVRational){1, codec->sample_rate}; if (codec->sample_fmt == AV_SAMPLE_FMT_NONE) @@ -2377,7 +2376,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files, av_log(NULL, AV_LOG_INFO, " [sync #%d.%d]", ost->sync_ist->file_index, ost->sync_ist->st->index); - if (ost->st->stream_copy) + if (ost->stream_copy) av_log(NULL, AV_LOG_INFO, " (copy)"); else av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ? @@ -2701,7 +2700,7 @@ static int transcode(OutputFile *output_files, int nb_output_files, for (i = 0; i < nb_output_streams; i++) { ost = &output_streams[i]; if (ost) { - if (ost->st->stream_copy) + if (ost->stream_copy) av_freep(&ost->st->codec->extradata); if (ost->logfile) { fclose(ost->logfile); @@ -2944,13 +2943,11 @@ static int opt_recording_timestamp(OptionsContext *o, const char *opt, const cha return 0; } -static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder) +static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder) { const char *codec_string = encoder ? "encoder" : "decoder"; AVCodec *codec; - if(!name) - return CODEC_ID_NONE; codec = encoder ? avcodec_find_encoder_by_name(name) : avcodec_find_decoder_by_name(name); @@ -2962,29 +2959,20 @@ static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, i av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name); exit_program(1); } - return codec->id; + return codec; } -static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type) +static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st) { char *codec_name = NULL; MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st); - - if (!codec_name) { - if (s->oformat) { - st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type); - return avcodec_find_encoder(st->codec->codec_id); - } - } else if (!strcmp(codec_name, "copy")) - st->stream_copy = 1; - else { - st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL); - return s->oformat ? avcodec_find_encoder_by_name(codec_name) : - avcodec_find_decoder_by_name(codec_name); - } - - return NULL; + if (codec_name) { + AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0); + st->codec->codec_id = codec->id; + return codec; + } else + return avcodec_find_decoder(st->codec->codec_id); } /** @@ -3020,9 +3008,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) st->codec->codec_tag = tag; } - ist->dec = choose_codec(o, ic, st, dec->codec_type); - if (!ist->dec) - ist->dec = avcodec_find_decoder(dec->codec_id); + ist->dec = choose_decoder(o, ic, st); switch (dec->codec_type) { case AVMEDIA_TYPE_AUDIO: @@ -3115,12 +3101,12 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena if (o->nb_frame_pix_fmts) av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0); - ic->video_codec_id = - find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0); - ic->audio_codec_id = - find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0); - ic->subtitle_codec_id= - find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0); + ic->video_codec_id = video_codec_name ? + find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE; + ic->audio_codec_id = audio_codec_name ? + find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE; + ic->subtitle_codec_id= subtitle_codec_name ? + find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE; ic->flags |= AVFMT_FLAG_NONBLOCK; if (loop_input) { @@ -3138,7 +3124,7 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena /* apply forced codec ids */ for (i = 0; i < ic->nb_streams; i++) - choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type); + choose_decoder(o, ic, ic->streams[i]); /* Set AVCodecContext options for avformat_find_stream_info */ opts = setup_find_stream_info_opts(ic, codec_opts); @@ -3253,6 +3239,23 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV return ret; } +static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost) +{ + char *codec_name = NULL; + + MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st); + if (!codec_name) { + ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, + NULL, ost->st->codec->codec_type); + ost->enc = avcodec_find_encoder(ost->st->codec->codec_id); + } else if (!strcmp(codec_name, "copy")) + ost->stream_copy = 1; + else { + ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1); + ost->st->codec->codec_id = ost->enc->id; + } +} + static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type) { OutputStream *ost; @@ -3280,7 +3283,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e ost->index = idx; ost->st = st; st->codec->codec_type = type; - ost->enc = choose_codec(o, oc, st, type); + choose_encoder(o, oc, ost); if (ost->enc) { ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st); } @@ -3381,7 +3384,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) st = ost->st; video_enc = st->codec; - if (!st->stream_copy) { + if (!ost->stream_copy) { const char *p = NULL; char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL; char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL; @@ -3502,7 +3505,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc) audio_enc = st->codec; audio_enc->codec_type = AVMEDIA_TYPE_AUDIO; - if (!st->stream_copy) { + if (!ost->stream_copy) { char *sample_fmt = NULL; MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st); @@ -3525,12 +3528,10 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc) static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc) { - AVStream *st; OutputStream *ost; ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA); - st = ost->st; - if (!st->stream_copy) { + if (!ost->stream_copy) { av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n"); exit_program(1); } @@ -3541,7 +3542,7 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc) static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc) { OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT); - ost->st->stream_copy = 1; + ost->stream_copy = 1; return ost; } @@ -3646,9 +3647,9 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch memcpy(st->info, ic->streams[i]->info, sizeof(*st->info)); avcodec_copy_context(st->codec, ic->streams[i]->codec); - if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy) + if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy) choose_sample_fmt(st, codec); - else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy) + else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy) choose_pixel_fmt(st, codec); } @@ -3812,7 +3813,11 @@ static void opt_output_file(void *optctx, const char *filename) } } - oc->preload = (int)(o->mux_preload * AV_TIME_BASE); + if (o->mux_preload) { + uint8_t buf[64]; + snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE)); + av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0); + } oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE); if (loop_output >= 0) { |