From 46b004959bb7870a361a57272cd5fa7eea34250b Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Fri, 9 Sep 2011 22:04:09 +0200 Subject: [PATCH 1/9] ffv1: Fixed size given to init_get_bits() in decoder. init_get_bits() takes a number of bits and not a number of bytes as its size argument. Signed-off-by: Alex Converse --- libavcodec/ffv1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index 15d9553348..8a6f33f383 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -1693,7 +1693,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac bytes_read = c->bytestream - c->bytestream_start - 1; if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME //printf("pos=%d\n", bytes_read); - init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, buf_size - bytes_read); + init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, (buf_size - bytes_read) * 8); } else { bytes_read = 0; /* avoid warning */ } @@ -1710,7 +1710,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac if(fs->ac){ ff_init_range_decoder(&fs->c, buf_p, v); }else{ - init_get_bits(&fs->gb, buf_p, v); + init_get_bits(&fs->gb, buf_p, v * 8); } } From 68ca330cbd479111db9cb7649d7530ad59f04cc8 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Fri, 9 Sep 2011 13:24:19 -0700 Subject: [PATCH 2/9] indeo2: init_get_bits size in bits instead of bytes --- libavcodec/indeo2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/indeo2.c b/libavcodec/indeo2.c index d05998893b..591c1ceb89 100644 --- a/libavcodec/indeo2.c +++ b/libavcodec/indeo2.c @@ -165,7 +165,7 @@ static int ir2_decode_frame(AVCodecContext *avctx, #endif start = 48; /* hardcoded for now */ - init_get_bits(&s->gb, buf + start, buf_size - start); + init_get_bits(&s->gb, buf + start, (buf_size - start) * 8); if (s->decode_delta) { /* intraframe */ ir2_decode_plane(s, avctx->width, avctx->height, From b7ce4f1d1c3add86ece7ca595ea6c4a10b471055 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Fri, 9 Sep 2011 13:26:49 -0700 Subject: [PATCH 3/9] indeo2: fail if input buffer too small --- libavcodec/indeo2.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libavcodec/indeo2.c b/libavcodec/indeo2.c index 591c1ceb89..398a9acd92 100644 --- a/libavcodec/indeo2.c +++ b/libavcodec/indeo2.c @@ -156,6 +156,13 @@ static int ir2_decode_frame(AVCodecContext *avctx, return -1; } + start = 48; /* hardcoded for now */ + + if (start >= buf_size) { + av_log(s->avctx, AV_LOG_ERROR, "input buffer size too small (%d)\n", buf_size); + return AVERROR_INVALIDDATA; + } + s->decode_delta = buf[18]; /* decide whether frame uses deltas or not */ @@ -163,7 +170,6 @@ static int ir2_decode_frame(AVCodecContext *avctx, for (i = 0; i < buf_size; i++) buf[i] = av_reverse[buf[i]]; #endif - start = 48; /* hardcoded for now */ init_get_bits(&s->gb, buf + start, (buf_size - start) * 8); From 0c1f5b93d9b97c4cc3684ba91a040e90bfc760d2 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Fri, 9 Sep 2011 14:50:33 -0700 Subject: [PATCH 4/9] cljr: init_get_bits size in bits instead of bytes --- libavcodec/cljr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/cljr.c b/libavcodec/cljr.c index 3050fe204e..b1cb6f07e3 100644 --- a/libavcodec/cljr.c +++ b/libavcodec/cljr.c @@ -67,7 +67,7 @@ static int decode_frame(AVCodecContext *avctx, p->pict_type= AV_PICTURE_TYPE_I; p->key_frame= 1; - init_get_bits(&a->gb, buf, buf_size); + init_get_bits(&a->gb, buf, buf_size * 8); for(y=0; yheight; y++){ uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ]; From 013887ebcd2557d7ab9bd85beafb17cd0d1b8ffc Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 31 Aug 2011 08:51:15 +0200 Subject: [PATCH 5/9] avconv: move codec tags to options context. Add a new -tag option, make -[vas]tag an alias for -tag:[vas] --- avconv.c | 68 ++++++++++++++++++++++--------------------------- doc/avconv.texi | 7 +++-- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/avconv.c b/avconv.c index 09d4886b95..c92a58bdd3 100644 --- a/avconv.c +++ b/avconv.c @@ -113,7 +113,6 @@ static uint16_t *inter_matrix = NULL; static const char *video_rc_override_string=NULL; static int video_disable = 0; static int video_discard = 0; -static unsigned int video_codec_tag = 0; static char *video_language = NULL; static int same_quant = 0; static int do_deinterlace = 0; @@ -130,15 +129,12 @@ static int audio_sample_rate = 0; static float audio_qscale = QSCALE_NONE; static int audio_disable = 0; static int audio_channels = 0; -static unsigned int audio_codec_tag = 0; static char *audio_language = NULL; static int subtitle_disable = 0; static char *subtitle_language = NULL; -static unsigned int subtitle_codec_tag = 0; static int data_disable = 0; -static unsigned int data_codec_tag = 0; static int file_overwrite = 0; static int do_benchmark = 0; @@ -325,6 +321,8 @@ typedef struct OptionsContext { int nb_max_frames; SpecifierOpt *bitstream_filters; int nb_bitstream_filters; + SpecifierOpt *codec_tags; + int nb_codec_tags; } OptionsContext; #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\ @@ -2627,24 +2625,6 @@ static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg) return parse_option(o, "codec:d", arg, options); } -static int opt_codec_tag(const char *opt, const char *arg) -{ - char *tail; - uint32_t *codec_tag; - - codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag : - !strcmp(opt, "vtag") ? &video_codec_tag : - !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL; - if (!codec_tag) - return -1; - - *codec_tag = strtol(arg, &tail, 0); - if (!tail || *tail) - *codec_tag = AV_RL32(arg); - - return 0; -} - static int opt_map(OptionsContext *o, const char *opt, const char *arg) { StreamMap *m = NULL; @@ -3063,7 +3043,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0); int idx = oc->nb_streams - 1; int64_t max_frames = INT64_MAX; - char *bsf = NULL, *next; + char *bsf = NULL, *next, *codec_tag = NULL; AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL; if (!st) { @@ -3106,6 +3086,14 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e bsf = next; } + MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st); + if (codec_tag) { + uint32_t tag = strtol(codec_tag, &next, 0); + if (*next) + tag = AV_RL32(codec_tag); + st->codec->codec_tag = tag; + } + ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL); return ost; } @@ -3129,9 +3117,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) video_enc = st->codec; - if(video_codec_tag) - video_enc->codec_tag= video_codec_tag; - if(oc->oformat->flags & AVFMT_GLOBALHEADER) { video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } @@ -3230,9 +3215,6 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc) audio_enc = st->codec; audio_enc->codec_type = AVMEDIA_TYPE_AUDIO; - if(audio_codec_tag) - audio_enc->codec_tag= audio_codec_tag; - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } @@ -3273,9 +3255,6 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc) exit_program(1); } - if (data_codec_tag) - data_enc->codec_tag= data_codec_tag; - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } @@ -3296,9 +3275,6 @@ static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc) subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE; - if(subtitle_codec_tag) - subtitle_enc->codec_tag= subtitle_codec_tag; - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } @@ -4032,6 +4008,21 @@ static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg) return parse_option(o, "frames:d", arg, options); } +static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg) +{ + return parse_option(o, "tag:v", arg, options); +} + +static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg) +{ + return parse_option(o, "tag:a", arg, options); +} + +static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg) +{ + return parse_option(o, "tag:s", arg, options); +} + #define OFFSET(x) offsetof(OptionsContext, x) static const OptionDef options[] = { /* main options */ @@ -4073,6 +4064,7 @@ static const OptionDef options[] = { { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" }, { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" }, { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" }, + { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" }, /* video options */ { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" }, @@ -4102,7 +4094,7 @@ static const OptionDef options[] = { { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" }, { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" }, { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" }, - { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" }, + { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" }, { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" }, { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" }, { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" }, @@ -4116,7 +4108,7 @@ static const OptionDef options[] = { { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" }, { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" }, { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" }, - { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" }, + { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" }, { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, // { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" }, { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" }, @@ -4125,7 +4117,7 @@ static const OptionDef options[] = { { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" }, { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" }, { "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_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" }, + { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" }, /* grab options */ { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" }, diff --git a/doc/avconv.texi b/doc/avconv.texi index 1b9a7929d6..98fd2ca00f 100644 --- a/doc/avconv.texi +++ b/doc/avconv.texi @@ -564,7 +564,7 @@ top=1/bottom=0/auto=-1 field first @item -dc @var{precision} Intra_dc_precision. @item -vtag @var{fourcc/tag} -Force video tag/fourcc. +Force video tag/fourcc. This is an alias for @code{-tag:v}. @item -qphist Show QP histogram. @item -force_key_frames @var{time}[,@var{time}...] @@ -604,7 +604,7 @@ Set the ISO 639 language code (3 letters) of the current audio stream. @table @option @item -atag @var{fourcc/tag} -Force audio tag/fourcc. +Force audio tag/fourcc. This is an alias for @code{-tag:a}. @item -audio_service_type @var{type} Set the type of service that the audio stream contains. @table @option @@ -811,6 +811,9 @@ avconv -i h264.mp4 -c:v copy -vbsf h264_mp4toannexb -an out.h264 @example avconv -i file.mov -an -vn -sbsf mov2textsub -c:s copy -f rawvideo sub.txt @end example + +@item -tag[:@var{stream_specifier}] @var{codec_tag} +Force a tag/fourcc for matching streams. @end table @c man end OPTIONS From 35c5d7d1ef7b623779c860887f9ddbeb3265c71c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 31 Aug 2011 09:17:08 +0200 Subject: [PATCH 6/9] avconv: remove -[vas]lang options. They are redundant, the same can be now accomplished with -metadata. --- avconv.c | 19 ------------------- doc/avconv.texi | 10 ---------- 2 files changed, 29 deletions(-) diff --git a/avconv.c b/avconv.c index c92a58bdd3..68dff49f73 100644 --- a/avconv.c +++ b/avconv.c @@ -113,7 +113,6 @@ static uint16_t *inter_matrix = NULL; static const char *video_rc_override_string=NULL; static int video_disable = 0; static int video_discard = 0; -static char *video_language = NULL; static int same_quant = 0; static int do_deinterlace = 0; static int top_field_first = -1; @@ -129,10 +128,8 @@ static int audio_sample_rate = 0; static float audio_qscale = QSCALE_NONE; static int audio_disable = 0; static int audio_channels = 0; -static char *audio_language = NULL; static int subtitle_disable = 0; -static char *subtitle_language = NULL; static int data_disable = 0; @@ -3191,10 +3188,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) if (forced_key_frames) parse_forced_key_frames(forced_key_frames, ost, video_enc); } - if (video_language) { - av_dict_set(&st->metadata, "language", video_language, 0); - av_freep(&video_language); - } /* reset some key parameters */ video_disable = 0; @@ -3230,10 +3223,6 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc) if (audio_sample_rate) audio_enc->sample_rate = audio_sample_rate; } - if (audio_language) { - av_dict_set(&st->metadata, "language", audio_language, 0); - av_freep(&audio_language); - } /* reset some key parameters */ audio_disable = 0; @@ -3279,11 +3268,6 @@ static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc) subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } - if (subtitle_language) { - av_dict_set(&st->metadata, "language", subtitle_language, 0); - av_freep(&subtitle_language); - } - subtitle_disable = 0; return ost; } @@ -4095,7 +4079,6 @@ static const OptionDef options[] = { { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" }, { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" }, { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" }, - { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" }, { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" }, { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" }, { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" }, @@ -4110,13 +4093,11 @@ static const OptionDef options[] = { { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" }, { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" }, { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, // - { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" }, { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" }, /* subtitle options */ { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" }, { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" }, - { "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 | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" }, /* grab options */ diff --git a/doc/avconv.texi b/doc/avconv.texi index 98fd2ca00f..827e0f94e5 100644 --- a/doc/avconv.texi +++ b/doc/avconv.texi @@ -202,9 +202,6 @@ avconv -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg @item -dframes @var{number} Set the number of data frames to record. This is an alias for @code{-frames:d}. -@item -slang @var{code} -Set the ISO 639 language code (3 letters) of the current subtitle stream. - @item -frames[:stream_specifier] @var{framecount} Stop writing to the stream after @var{framecount} frames. @@ -337,9 +334,6 @@ prefix is ``av2pass''. The complete file name will be @file{PREFIX-N.log}, where N is a number specific to the output stream. -@item -vlang @var{code} -Set the ISO 639 language code (3 letters) of the current video stream. - @item -vf @var{filter_graph} @var{filter_graph} is a description of the filter graph to apply to the input video. @@ -596,8 +590,6 @@ and is mapped to the corresponding demuxer options. Disable audio recording. @item -acodec @var{codec} Set the audio codec. This is an alias for @code{-codec:a}. -@item -alang @var{code} -Set the ISO 639 language code (3 letters) of the current audio stream. @end table @section Advanced Audio options: @@ -634,8 +626,6 @@ Karaoke @table @option @item -scodec @var{codec} Set the subtitle codec. This is an alias for @code{-codec:s}. -@item -slang @var{code} -Set the ISO 639 language code (3 letters) of the current subtitle stream. @item -sn Disable subtitle recording. @end table From 2130981af3068a029b914bb9c392e2e0f69bc0b1 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 31 Aug 2011 08:51:15 +0200 Subject: [PATCH 7/9] avconv: move *_disable to options context. --- avconv.c | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/avconv.c b/avconv.c index 68dff49f73..6804a3b50e 100644 --- a/avconv.c +++ b/avconv.c @@ -111,7 +111,6 @@ static float video_qscale = 0; static uint16_t *intra_matrix = NULL; static uint16_t *inter_matrix = NULL; static const char *video_rc_override_string=NULL; -static int video_disable = 0; static int video_discard = 0; static int same_quant = 0; static int do_deinterlace = 0; @@ -126,13 +125,8 @@ static char *vfilters = NULL; static int audio_sample_rate = 0; #define QSCALE_NONE -99999 static float audio_qscale = QSCALE_NONE; -static int audio_disable = 0; static int audio_channels = 0; -static int subtitle_disable = 0; - -static int data_disable = 0; - static int file_overwrite = 0; static int do_benchmark = 0; static int do_hex_dump = 0; @@ -312,6 +306,11 @@ typedef struct OptionsContext { float mux_preload; float mux_max_delay; + int video_disable; + int audio_disable; + int subtitle_disable; + int data_disable; + SpecifierOpt *metadata; int nb_metadata; SpecifierOpt *max_frames; @@ -2826,7 +2825,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) switch (dec->codec_type) { case AVMEDIA_TYPE_AUDIO: - if(audio_disable) + if (o->audio_disable) st->discard= AVDISCARD_ALL; break; case AVMEDIA_TYPE_VIDEO: @@ -2849,7 +2848,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) (float)rfps / rfps_base, rfps, rfps_base); } - if(video_disable) + if (o->video_disable) st->discard= AVDISCARD_ALL; else if(video_discard) st->discard= video_discard; @@ -2857,7 +2856,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) case AVMEDIA_TYPE_DATA: break; case AVMEDIA_TYPE_SUBTITLE: - if(subtitle_disable) + if (o->subtitle_disable) st->discard = AVDISCARD_ALL; break; case AVMEDIA_TYPE_ATTACHMENT: @@ -3190,7 +3189,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc) } /* reset some key parameters */ - video_disable = 0; av_freep(&forced_key_frames); frame_pix_fmt = PIX_FMT_NONE; return ost; @@ -3224,9 +3222,6 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc) audio_enc->sample_rate = audio_sample_rate; } - /* reset some key parameters */ - audio_disable = 0; - return ost; } @@ -3248,7 +3243,6 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc) data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } - data_disable = 0; return ost; } @@ -3268,7 +3262,6 @@ static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc) subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER; } - subtitle_disable = 0; return ost; } @@ -3423,7 +3416,7 @@ static void opt_output_file(void *optctx, const char *filename) } /* video: highest resolution */ - if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) { + if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) { int area = 0, idx = -1; for (i = 0; i < nb_input_streams; i++) { ist = &input_streams[i]; @@ -3437,7 +3430,7 @@ static void opt_output_file(void *optctx, const char *filename) } /* audio: most channels */ - if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) { + if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) { int channels = 0, idx = -1; for (i = 0; i < nb_input_streams; i++) { ist = &input_streams[i]; @@ -3451,7 +3444,7 @@ static void opt_output_file(void *optctx, const char *filename) } /* subtitles: pick first */ - if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) { + if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) { for (i = 0; i < nb_input_streams; i++) if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) { NEW_STREAM(subtitle, i); @@ -4056,7 +4049,7 @@ static const OptionDef options[] = { { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" }, { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" }, { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" }, - { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" }, + { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" }, { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" }, { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" }, { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" }, @@ -4089,14 +4082,14 @@ static const OptionDef options[] = { { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", }, { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" }, { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" }, - { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" }, + { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" }, { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" }, { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" }, { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, // { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" }, /* subtitle options */ - { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" }, + { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" }, { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" }, { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" }, From 6a11686dfc0aed13bf234af85329450cd8c3b225 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 1 Sep 2011 08:20:50 +0200 Subject: [PATCH 8/9] avconv: move audio_channels to the options context. --- avconv.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/avconv.c b/avconv.c index 6804a3b50e..cfb231907b 100644 --- a/avconv.c +++ b/avconv.c @@ -125,7 +125,6 @@ static char *vfilters = NULL; static int audio_sample_rate = 0; #define QSCALE_NONE -99999 static float audio_qscale = QSCALE_NONE; -static int audio_channels = 0; static int file_overwrite = 0; static int do_benchmark = 0; @@ -281,6 +280,8 @@ typedef struct OptionsContext { SpecifierOpt *codec_names; int nb_codec_names; + SpecifierOpt *audio_channels; + int nb_audio_channels; /* input options */ int64_t input_ts_offset; @@ -2595,12 +2596,6 @@ static int opt_audio_rate(const char *opt, const char *arg) return 0; } -static int opt_audio_channels(const char *opt, const char *arg) -{ - audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); - return 0; -} - static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg) { return parse_option(o, "codec:a", arg, options); @@ -2901,8 +2896,8 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena snprintf(buf, sizeof(buf), "%d", audio_sample_rate); av_dict_set(&format_opts, "sample_rate", buf, 0); } - if (audio_channels) { - snprintf(buf, sizeof(buf), "%d", audio_channels); + if (o->nb_audio_channels) { + snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i); av_dict_set(&format_opts, "channels", buf, 0); } if (frame_rate.num) { @@ -2999,7 +2994,6 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena frame_height = 0; frame_width = 0; audio_sample_rate = 0; - audio_channels = 0; audio_sample_fmt = AV_SAMPLE_FMT_NONE; for (i = 0; i < orig_nb_streams; i++) @@ -3214,8 +3208,8 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc) audio_enc->flags |= CODEC_FLAG_QSCALE; audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale; } - if (audio_channels) - audio_enc->channels = audio_channels; + MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st); + if (audio_sample_fmt != AV_SAMPLE_FMT_NONE) audio_enc->sample_fmt = audio_sample_fmt; if (audio_sample_rate) @@ -3648,7 +3642,6 @@ static void opt_output_file(void *optctx, const char *filename) frame_width = 0; frame_height = 0; audio_sample_rate = 0; - audio_channels = 0; audio_sample_fmt = AV_SAMPLE_FMT_NONE; av_freep(&streamid_map); @@ -3879,7 +3872,7 @@ static int opt_target(OptionsContext *o, const char *opt, const char *arg) opt_default("b:a", "224000"); audio_sample_rate = 44100; - audio_channels = 2; + parse_option(o, "ac", "2", options); opt_default("packetsize", "2324"); opt_default("muxrate", "1411200"); // 2352 * 75 * 8; @@ -3943,7 +3936,7 @@ static int opt_target(OptionsContext *o, const char *opt, const char *arg) opt_frame_rate("r", frame_rates[norm]); audio_sample_rate = 48000; - audio_channels = 2; + parse_option(o, "ac", "2", options); } else { fprintf(stderr, "Unknown target: %s\n", arg); @@ -4081,7 +4074,7 @@ static const OptionDef options[] = { { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" }, { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", }, { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" }, - { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" }, + { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" }, { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" }, { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" }, { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" }, From 8bfea4ab4e2cb32bc7bf6f697ee30a238c65d296 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Wed, 7 Sep 2011 21:43:03 +0200 Subject: [PATCH 9/9] Fixed segfault with wavpack decoder on corrupted decorrelation terms sub-blocks. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavcodec/wavpack.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 0604452b80..a687c279ef 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -863,12 +863,13 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, } switch(id & WP_IDF_MASK){ case WP_ID_DECTERMS: - s->terms = size; - if(s->terms > MAX_TERMS){ + if(size > MAX_TERMS){ av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n"); + s->terms = 0; buf += ssize; continue; } + s->terms = size; for(i = 0; i < s->terms; i++) { s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5; s->decorr[s->terms - i - 1].delta = *buf >> 5;