Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 13 Mar 2014 13:16:00 +0000 (14:16 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 13 Mar 2014 13:21:27 +0000 (14:21 +0100)
* qatar/master:
  avconv: Match stream id

Conflicts:
cmdutils.c
doc/fftools-common-opts.texi

See: ea07063fd82686af3fabb45e5ed10aa48d084d61
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/fftools-common-opts.texi
libavformat/utils.c

index dcfe9b5,0000000..6bc6852
mode 100644,000000..100644
--- /dev/null
@@@ -1,303 -1,0 +1,303 @@@
- @item #@var{stream_id}
- Matches the stream by a format-specific ID.
 +All the numerical options, if not specified otherwise, accept a string
 +representing a number as input, which may be followed by one of the SI
 +unit prefixes, for example: 'K', 'M', or 'G'.
 +
 +If 'i' is appended to the SI unit prefix, the complete prefix will be
 +interpreted as a unit prefix for binary multiplies, which are based on
 +powers of 1024 instead of powers of 1000. Appending 'B' to the SI unit
 +prefix multiplies the value by 8. This allows using, for example:
 +'KB', 'MiB', 'G' and 'B' as number suffixes.
 +
 +Options which do not take arguments are boolean options, and set the
 +corresponding value to true. They can be set to false by prefixing
 +the option name with "no". For example using "-nofoo"
 +will set the boolean option with name "foo" to false.
 +
 +@anchor{Stream specifiers}
 +@section Stream specifiers
 +Some options are applied per-stream, e.g. bitrate or codec. Stream specifiers
 +are used to precisely specify which stream(s) a given option belongs to.
 +
 +A stream specifier is a string generally appended to the option name and
 +separated from it by a colon. E.g. @code{-codec:a:1 ac3} contains the
 +@code{a:1} stream specifier, which matches the second audio stream. Therefore, it
 +would select the ac3 codec for the second audio stream.
 +
 +A stream specifier can match several streams, so that the option is applied to all
 +of them. E.g. the stream specifier in @code{-b:a 128k} matches all audio
 +streams.
 +
 +An empty stream specifier matches all streams. For example, @code{-codec copy}
 +or @code{-codec: copy} would copy all the streams without reencoding.
 +
 +Possible forms of stream specifiers are:
 +@table @option
 +@item @var{stream_index}
 +Matches the stream with this index. E.g. @code{-threads:1 4} would set the
 +thread count for the second stream to 4.
 +@item @var{stream_type}[:@var{stream_index}]
 +@var{stream_type} is one of following: 'v' for video, 'a' for audio, 's' for subtitle,
 +'d' for data, and 't' for attachments. If @var{stream_index} is given, then it matches
 +stream number @var{stream_index} of this type. Otherwise, it matches all
 +streams of this type.
 +@item p:@var{program_id}[:@var{stream_index}]
 +If @var{stream_index} is given, then it matches the stream with number @var{stream_index}
 +in the program with the id @var{program_id}. Otherwise, it matches all streams in the
 +program.
++@item #@var{stream_id} or i:@var{stream_id}
++Match the stream by stream id (e.g. PID in MPEG-TS container).
 +@end table
 +
 +@section Generic options
 +
 +These options are shared amongst the ff* tools.
 +
 +@table @option
 +
 +@item -L
 +Show license.
 +
 +@item -h, -?, -help, --help [@var{arg}]
 +Show help. An optional parameter may be specified to print help about a specific
 +item. If no argument is specified, only basic (non advanced) tool
 +options are shown.
 +
 +Possible values of @var{arg} are:
 +@table @option
 +@item long
 +Print advanced tool options in addition to the basic tool options.
 +
 +@item full
 +Print complete list of options, including shared and private options
 +for encoders, decoders, demuxers, muxers, filters, etc.
 +
 +@item decoder=@var{decoder_name}
 +Print detailed information about the decoder named @var{decoder_name}. Use the
 +@option{-decoders} option to get a list of all decoders.
 +
 +@item encoder=@var{encoder_name}
 +Print detailed information about the encoder named @var{encoder_name}. Use the
 +@option{-encoders} option to get a list of all encoders.
 +
 +@item demuxer=@var{demuxer_name}
 +Print detailed information about the demuxer named @var{demuxer_name}. Use the
 +@option{-formats} option to get a list of all demuxers and muxers.
 +
 +@item muxer=@var{muxer_name}
 +Print detailed information about the muxer named @var{muxer_name}. Use the
 +@option{-formats} option to get a list of all muxers and demuxers.
 +
 +@item filter=@var{filter_name}
 +Print detailed information about the filter name @var{filter_name}. Use the
 +@option{-filters} option to get a list of all filters.
 +@end table
 +
 +@item -version
 +Show version.
 +
 +@item -formats
 +Show available formats.
 +
 +@item -codecs
 +Show all codecs known to libavcodec.
 +
 +Note that the term 'codec' is used throughout this documentation as a shortcut
 +for what is more correctly called a media bitstream format.
 +
 +@item -decoders
 +Show available decoders.
 +
 +@item -encoders
 +Show all available encoders.
 +
 +@item -bsfs
 +Show available bitstream filters.
 +
 +@item -protocols
 +Show available protocols.
 +
 +@item -filters
 +Show available libavfilter filters.
 +
 +@item -pix_fmts
 +Show available pixel formats.
 +
 +@item -sample_fmts
 +Show available sample formats.
 +
 +@item -layouts
 +Show channel names and standard channel layouts.
 +
 +@item -colors
 +Show recognized color names.
 +
 +@item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel}
 +Set the logging level used by the library.
 +Adding "repeat+" indicates that repeated log output should not be compressed
 +to the first line and the "Last message repeated n times" line will be
 +omitted. "repeat" can also be used alone.
 +If "repeat" is used alone, and with no prior loglevel set, the default
 +loglevel will be used. If multiple loglevel parameters are given, using
 +'repeat' will not change the loglevel.
 +@var{loglevel} is a number or a string containing one of the following values:
 +@table @samp
 +@item quiet
 +Show nothing at all; be silent.
 +@item panic
 +Only show fatal errors which could lead the process to crash, such as
 +and assert failure. This is not currently used for anything.
 +@item fatal
 +Only show fatal errors. These are errors after which the process absolutely
 +cannot continue after.
 +@item error
 +Show all errors, including ones which can be recovered from.
 +@item warning
 +Show all warnings and errors. Any message related to possibly
 +incorrect or unexpected events will be shown.
 +@item info
 +Show informative messages during processing. This is in addition to
 +warnings and errors. This is the default value.
 +@item verbose
 +Same as @code{info}, except more verbose.
 +@item debug
 +Show everything, including debugging information.
 +@end table
 +
 +By default the program logs to stderr, if coloring is supported by the
 +terminal, colors are used to mark errors and warnings. Log coloring
 +can be disabled setting the environment variable
 +@env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
 +the environment variable @env{AV_LOG_FORCE_COLOR}.
 +The use of the environment variable @env{NO_COLOR} is deprecated and
 +will be dropped in a following FFmpeg version.
 +
 +@item -report
 +Dump full command line and console output to a file named
 +@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
 +directory.
 +This file can be useful for bug reports.
 +It also implies @code{-loglevel verbose}.
 +
 +Setting the environment variable @code{FFREPORT} to any value has the
 +same effect. If the value is a ':'-separated key=value sequence, these
 +options will affect the report; options values must be escaped if they
 +contain special characters or the options delimiter ':' (see the
 +``Quoting and escaping'' section in the ffmpeg-utils manual). The
 +following option is recognized:
 +@table @option
 +@item file
 +set the file name to use for the report; @code{%p} is expanded to the name
 +of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded
 +to a plain @code{%}
 +@end table
 +
 +Errors in parsing the environment variable are not fatal, and will not
 +appear in the report.
 +
 +@item -hide_banner
 +Suppress printing banner.
 +
 +All FFmpeg tools will normally show a copyright notice, build options
 +and library versions. This option can be used to suppress printing
 +this information.
 +
 +@item -cpuflags flags (@emph{global})
 +Allows setting and clearing cpu flags. This option is intended
 +for testing. Do not use it unless you know what you're doing.
 +@example
 +ffmpeg -cpuflags -sse+mmx ...
 +ffmpeg -cpuflags mmx ...
 +ffmpeg -cpuflags 0 ...
 +@end example
 +Possible flags for this option are:
 +@table @samp
 +@item x86
 +@table @samp
 +@item mmx
 +@item mmxext
 +@item sse
 +@item sse2
 +@item sse2slow
 +@item sse3
 +@item sse3slow
 +@item ssse3
 +@item atom
 +@item sse4.1
 +@item sse4.2
 +@item avx
 +@item xop
 +@item fma4
 +@item 3dnow
 +@item 3dnowext
 +@item cmov
 +@end table
 +@item ARM
 +@table @samp
 +@item armv5te
 +@item armv6
 +@item armv6t2
 +@item vfp
 +@item vfpv3
 +@item neon
 +@end table
 +@item PowerPC
 +@table @samp
 +@item altivec
 +@end table
 +@item Specific Processors
 +@table @samp
 +@item pentium2
 +@item pentium3
 +@item pentium4
 +@item k6
 +@item k62
 +@item athlon
 +@item athlonxp
 +@item k8
 +@end table
 +@end table
 +
 +@item -opencl_bench
 +Benchmark all available OpenCL devices and show the results. This option
 +is only available when FFmpeg has been compiled with @code{--enable-opencl}.
 +
 +@item -opencl_options options (@emph{global})
 +Set OpenCL environment options. This option is only available when
 +FFmpeg has been compiled with @code{--enable-opencl}.
 +
 +@var{options} must be a list of @var{key}=@var{value} option pairs
 +separated by ':'. See the ``OpenCL Options'' section in the
 +ffmpeg-utils manual for the list of supported options.
 +@end table
 +
 +@section AVOptions
 +
 +These options are provided directly by the libavformat, libavdevice and
 +libavcodec libraries. To see the list of available AVOptions, use the
 +@option{-help} option. They are separated into two categories:
 +@table @option
 +@item generic
 +These options can be set for any container, codec or device. Generic options
 +are listed under AVFormatContext options for containers/devices and under
 +AVCodecContext options for codecs.
 +@item private
 +These options are specific to the given container, device or codec. Private
 +options are listed under their corresponding containers/devices/codecs.
 +@end table
 +
 +For example to write an ID3v2.3 header instead of a default ID3v2.4 to
 +an MP3 file, use the @option{id3v2_version} private option of the MP3
 +muxer:
 +@example
 +ffmpeg -i input.flac -id3v2_version 3 out.mp3
 +@end example
 +
 +All codec AVOptions are per-stream, and thus a stream specifier
 +should be attached to them.
 +
 +Note: the @option{-nooption} syntax cannot be used for boolean
 +AVOptions, use @option{-option 0}/@option{-option 1}.
 +
 +Note: the old undocumented way of specifying per-stream AVOptions by
 +prepending v/a/s to the options name is now obsolete and will be
 +removed soon.
@@@ -4375,112 -3390,6 +4375,114 @@@ int ff_add_param_change(AVPacket *pkt, 
      return 0;
  }
  
-     } else if (*spec == '#') {
-         int sid;
 +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
 +{
 +    AVRational undef = {0, 1};
 +    AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
 +    AVRational codec_sample_aspect_ratio  = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
 +    AVRational frame_sample_aspect_ratio  = frame  ? frame->sample_aspect_ratio  : codec_sample_aspect_ratio;
 +
 +    av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
 +               stream_sample_aspect_ratio.num,  stream_sample_aspect_ratio.den, INT_MAX);
 +    if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
 +        stream_sample_aspect_ratio = undef;
 +
 +    av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
 +               frame_sample_aspect_ratio.num,  frame_sample_aspect_ratio.den, INT_MAX);
 +    if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
 +        frame_sample_aspect_ratio = undef;
 +
 +    if (stream_sample_aspect_ratio.num)
 +        return stream_sample_aspect_ratio;
 +    else
 +        return frame_sample_aspect_ratio;
 +}
 +
 +AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
 +{
 +    AVRational fr = st->r_frame_rate;
 +    AVRational codec_fr = av_inv_q(st->codec->time_base);
 +    AVRational   avg_fr = st->avg_frame_rate;
 +
 +    if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
 +        av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
 +        fr = avg_fr;
 +    }
 +
 +
 +    if (st->codec->ticks_per_frame > 1) {
 +        codec_fr.den *= st->codec->ticks_per_frame;
 +        if (   codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7
 +            && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)
 +            fr = codec_fr;
 +    }
 +
 +    return fr;
 +}
 +
 +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
 +                                    const char *spec)
 +{
 +    if (*spec <= '9' && *spec >= '0') /* opt:index */
 +        return strtol(spec, NULL, 0) == st->index;
 +    else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
 +             *spec == 't') { /* opt:[vasdt] */
 +        enum AVMediaType type;
 +
 +        switch (*spec++) {
 +        case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
 +        case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
 +        case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
 +        case 'd': type = AVMEDIA_TYPE_DATA;       break;
 +        case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
 +        default:  av_assert0(0);
 +        }
 +        if (type != st->codec->codec_type)
 +            return 0;
 +        if (*spec++ == ':') { /* possibly followed by :index */
 +            int i, index = strtol(spec, NULL, 0);
 +            for (i = 0; i < s->nb_streams; i++)
 +                if (s->streams[i]->codec->codec_type == type && index-- == 0)
 +                   return i == st->index;
 +            return 0;
 +        }
 +        return 1;
 +    } else if (*spec == 'p' && *(spec + 1) == ':') {
 +        int prog_id, i, j;
 +        char *endptr;
 +        spec += 2;
 +        prog_id = strtol(spec, &endptr, 0);
 +        for (i = 0; i < s->nb_programs; i++) {
 +            if (s->programs[i]->id != prog_id)
 +                continue;
 +
 +            if (*endptr++ == ':') {
 +                int stream_idx = strtol(endptr, NULL, 0);
 +                return stream_idx >= 0 &&
 +                    stream_idx < s->programs[i]->nb_stream_indexes &&
 +                    st->index == s->programs[i]->stream_index[stream_idx];
 +            }
 +
 +            for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
 +                if (st->index == s->programs[i]->stream_index[j])
 +                    return 1;
 +        }
 +        return 0;
-         sid = strtol(spec + 1, &endptr, 0);
++    } else if (*spec == '#' ||
++               (*spec == 'i' && *(spec + 1) == ':')) {
++        int stream_id;
 +        char *endptr;
-             return st->id == sid;
++        spec += 1 + (*spec == 'i');
++        stream_id = strtol(spec, &endptr, 0);
 +        if (!*endptr)
++            return stream_id == st->id;
 +    } else if (!*spec) /* empty specifier, matches everything */
 +        return 1;
 +
 +    av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
 +    return AVERROR(EINVAL);
 +}
 +
  int ff_generate_avci_extradata(AVStream *st)
  {
      static const uint8_t avci100_1080p_extradata[] = {