On 10/23/2011 05:28 AM, Anton Khirnov wrote:
> Prevents -c copy from working for input streams and allows to move
> stream_copy variable from AVStream to OutputStream.
> ---
> avconv.c | 54 +++++++++++++++++++++++++++++-------------------------
> 1 files changed, 29 insertions(+), 25 deletions(-)
>
> diff --git a/avconv.c b/avconv.c
> index 742695b..ea33659 100644
> --- a/avconv.c
> +++ b/avconv.c
> @@ -2724,13 +2724,11 @@ static int opt_map_metadata(OptionsContext *o, const
> char *opt, const char *arg)
> 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);
> @@ -2742,29 +2740,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);
> }
>
> /**
> @@ -2791,9 +2780,7 @@ static void add_input_streams(OptionsContext *o,
> AVFormatContext *ic)
> MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
> ist->ts_scale = scale;
>
> - 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:
> @@ -2894,7 +2881,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);
> @@ -3012,6 +2999,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->st->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;
> @@ -3039,7 +3043,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);
> }
looks good.
-Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel