Merge commit 'c253340ae6f74ffd8798bbd476e46d1b33a2d56e'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 20 Apr 2015 00:48:19 +0000 (02:48 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 20 Apr 2015 00:48:19 +0000 (02:48 +0200)
* commit 'c253340ae6f74ffd8798bbd476e46d1b33a2d56e':
  log: Introduce a more verbose debug level

Conflicts:
doc/APIchanges
doc/fftools-common-opts.texi
libavutil/log.c
libavutil/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
cmdutils.c
doc/APIchanges
doc/fftools-common-opts.texi
libavutil/log.c
libavutil/log.h
libavutil/version.h

diff --cc cmdutils.c
Simple merge
diff --cc doc/APIchanges
@@@ -15,38 -13,19 +15,41 @@@ libavutil:     2014-08-0
  
  API changes, most recent first:
  
 -2015-xx-xx - xxxxxxx - lavu 54.11.0
 -  Add av_small_strptime().
+ 2015-xx-xx - xxxxxxx - lavu 54.12.0
+   Add AV_LOG_TRACE for extremely verbose debugging.
 +2015-xx-xx - xxxxxxx - lavf 56.29.100 - avio.h
 +  Add AVIODirEntryType.AVIO_ENTRY_SERVER.
 +  Add AVIODirEntryType.AVIO_ENTRY_SHARE.
 +  Add AVIODirEntryType.AVIO_ENTRY_WORKGROUP.
  
 -2015-xx-xx - xxxxxxx - lavc 56.22.0
 -  Add FF_PROFILE_DTS_EXPRESS.
 +2015-xx-xx - xxxxxxx - lavu 54.22.100 - avstring.h
 +  Add av_append_path_component()
 +
 +2015-03-27 - 184084c - lavf 56.27.100 - avio.h url.h
 +  New directory listing API.
  
 -2015-xx-xx - xxxxxxx - lavu 54.10.0
 +  Add AVIODirEntryType enum.
 +  Add AVIODirEntry, AVIODirContext structures.
 +  Add avio_open_dir(), avio_read_dir(), avio_close_dir(), avio_free_directory_entry().
 +  Add ff_alloc_dir_entry().
 +  Extend URLProtocol with url_open_dir(), url_read_dir(), url_close_dir().
 +
 +2015-xx-xx - xxxxxxx - lavu 54.21.100 / 54.10.0
    Add AV_PIX_FMT_MMAL for MMAL hardware acceleration.
  
 -2015-xx-xx - xxxxxxx - lavc 56.13
 +2015-xx-xx - xxxxxxx - 56.29.100 / lavc 56.22.0
 +  Add FF_PROFILE_DTS_EXPRESS.
 +
 +-------- 8< --------- FFmpeg 2.6 was cut here -------- 8< ---------
 +
 +2015-03-04 - cca4476 - lavf 56.25.100
 +  Add avformat_flush()
 +
 +2015-03-03 - 81a9126 - lavf 56.24.100
 +  Add avio_put_str16be()
 +
 +2015-02-19 - 560eb71 / 31d2039 - lavc 56.23.100 / 56.13.0
    Add width, height, coded_width, coded_height and format to
    AVCodecParserContext.
  
index 2451cc4,0000000..3b85813
mode 100644,000000..100644
--- /dev/null
@@@ -1,386 -1,0 +1,387 @@@
 +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 multiples, 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).
 +@item m:@var{key}[:@var{value}]
 +Matches streams with the metadata tag @var{key} having the specified value. If
 +@var{value} is not given, matches streams that contain the given tag with any
 +value.
 +@item u
 +Matches streams with usable configuration, the codec must be defined and the
 +essential information such as video dimension or audio sample rate must be present.
 +
 +Note that in @command{ffmpeg}, matching by metadata will only work properly for
 +input files.
 +@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 (including devices).
 +
 +@item -devices
 +Show available devices.
 +
 +@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 -sources @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
 +Show autodetected sources of the intput device.
 +Some devices may provide system-dependent source names that cannot be autodetected.
 +The returned list cannot be assumed to be always complete.
 +@example
 +ffmpeg -sources pulse,server=192.168.0.4
 +@end example
 +
 +@item -sinks @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
 +Show autodetected sinks of the output device.
 +Some devices may provide system-dependent sink names that cannot be autodetected.
 +The returned list cannot be assumed to be always complete.
 +@example
 +ffmpeg -sinks pulse,server=192.168.0.4
 +@end example
 +
 +@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 string or a number containing one of the following values:
 +@table @samp
 +@item quiet, -8
 +Show nothing at all; be silent.
 +@item panic, 0
 +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, 8
 +Only show fatal errors. These are errors after which the process absolutely
 +cannot continue after.
 +@item error, 16
 +Show all errors, including ones which can be recovered from.
 +@item warning, 24
 +Show all warnings and errors. Any message related to possibly
 +incorrect or unexpected events will be shown.
 +@item info, 32
 +Show informative messages during processing. This is in addition to
 +warnings and errors. This is the default value.
 +@item verbose, 40
 +Same as @code{info}, except more verbose.
 +@item debug, 48
 +Show everything, including debugging information.
++@item trace, 56
 +@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 @env{FFREPORT} to any value has the
 +same effect. If the value is a ':'-separated key=value sequence, these
 +options will affect the report; option 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 options are 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{%}
 +@item level
 +set the log verbosity level using a numerical value (see @code{-loglevel}).
 +@end table
 +
 +For example, to output a report to a file named @file{ffreport.log}
 +using a log level of @code{32} (alias for log level @code{info}):
 +
 +@example
 +FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
 +@end example
 +
 +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 avx2
 +@item xop
 +@item fma3
 +@item fma4
 +@item 3dnow
 +@item 3dnowext
 +@item bmi1
 +@item bmi2
 +@item cmov
 +@end table
 +@item ARM
 +@table @samp
 +@item armv5te
 +@item armv6
 +@item armv6t2
 +@item vfp
 +@item vfpv3
 +@item neon
 +@item setend
 +@end table
 +@item AArch64
 +@table @samp
 +@item armv8
 +@item vfp
 +@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
 +This option is used to benchmark all available OpenCL devices and print the
 +results. This option is only available when FFmpeg has been compiled with
 +@code{--enable-opencl}.
 +
 +When FFmpeg is configured with @code{--enable-opencl}, the options for the
 +global OpenCL context are set via @option{-opencl_options}. See the
 +"OpenCL Options" section in the ffmpeg-utils manual for the complete list of
 +supported options. Amongst others, these options include the ability to select
 +a specific platform and device to run the OpenCL code on. By default, FFmpeg
 +will run on the first device of the first platform. While the options for the
 +global OpenCL context provide flexibility to the user in selecting the OpenCL
 +device of their choice, most users would probably want to select the fastest
 +OpenCL device for their system.
 +
 +This option assists the selection of the most efficient configuration by
 +identifying the appropriate device for the user's system. The built-in
 +benchmark is run on all the OpenCL devices and the performance is measured for
 +each device. The devices in the results list are sorted based on their
 +performance with the fastest device listed first. The user can subsequently
 +invoke @command{ffmpeg} using the device deemed most appropriate via
 +@option{-opencl_options} to obtain the best performance for the OpenCL
 +accelerated code.
 +
 +Typical usage to use the fastest OpenCL device involve the following steps.
 +
 +Run the command:
 +@example
 +ffmpeg -opencl_bench
 +@end example
 +Note down the platform ID (@var{pidx}) and device ID (@var{didx}) of the first
 +i.e. fastest device in the list.
 +Select the platform and device using the command:
 +@example
 +ffmpeg -opencl_options platform_idx=@var{pidx}:device_idx=@var{didx} ...
 +@end example
 +
 +@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.
diff --cc libavutil/log.c
@@@ -50,66 -43,22 +50,69 @@@ static pthread_mutex_t mutex = PTHREAD_
  static int av_log_level = AV_LOG_INFO;
  static int flags;
  
 -#if HAVE_SETCONSOLETEXTATTRIBUTE
+ #define NB_LEVELS 8
 +#if defined(_WIN32) && !defined(__MINGW32CE__) && HAVE_SETCONSOLETEXTATTRIBUTE
  #include <windows.h>
 -static const uint8_t color[NB_LEVELS] = { 12, 12, 12, 14, 7, 10, 11, 8};
 +static const uint8_t color[16 + AV_CLASS_CATEGORY_NB] = {
 +    [AV_LOG_PANIC  /8] = 12,
 +    [AV_LOG_FATAL  /8] = 12,
 +    [AV_LOG_ERROR  /8] = 12,
 +    [AV_LOG_WARNING/8] = 14,
 +    [AV_LOG_INFO   /8] =  7,
 +    [AV_LOG_VERBOSE/8] = 10,
 +    [AV_LOG_DEBUG  /8] = 10,
++    [AV_LOG_TRACE  /8] = 8,
 +    [16+AV_CLASS_CATEGORY_NA              ] =  7,
 +    [16+AV_CLASS_CATEGORY_INPUT           ] = 13,
 +    [16+AV_CLASS_CATEGORY_OUTPUT          ] =  5,
 +    [16+AV_CLASS_CATEGORY_MUXER           ] = 13,
 +    [16+AV_CLASS_CATEGORY_DEMUXER         ] =  5,
 +    [16+AV_CLASS_CATEGORY_ENCODER         ] = 11,
 +    [16+AV_CLASS_CATEGORY_DECODER         ] =  3,
 +    [16+AV_CLASS_CATEGORY_FILTER          ] = 10,
 +    [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] =  9,
 +    [16+AV_CLASS_CATEGORY_SWSCALER        ] =  7,
 +    [16+AV_CLASS_CATEGORY_SWRESAMPLER     ] =  7,
 +    [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ] = 13,
 +    [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT  ] = 5,
 +    [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ] = 13,
 +    [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT  ] = 5,
 +    [16+AV_CLASS_CATEGORY_DEVICE_OUTPUT       ] = 13,
 +    [16+AV_CLASS_CATEGORY_DEVICE_INPUT        ] = 5,
 +};
 +
  static int16_t background, attr_orig;
  static HANDLE con;
 -#define set_color(x)  SetConsoleTextAttribute(con, background | color[x])
 -#define reset_color() SetConsoleTextAttribute(con, attr_orig)
 -#define print_256color(x)
  #else
 -static const uint8_t color[NB_LEVELS] = {
 -    0x41, 0x41, 0x11, 0x03, 9, 0x02, 0x06, 0x07
 +
 +static const uint32_t color[16 + AV_CLASS_CATEGORY_NB] = {
 +    [AV_LOG_PANIC  /8] =  52 << 16 | 196 << 8 | 0x41,
 +    [AV_LOG_FATAL  /8] = 208 <<  8 | 0x41,
 +    [AV_LOG_ERROR  /8] = 196 <<  8 | 0x11,
 +    [AV_LOG_WARNING/8] = 226 <<  8 | 0x03,
 +    [AV_LOG_INFO   /8] = 253 <<  8 | 0x09,
 +    [AV_LOG_VERBOSE/8] =  40 <<  8 | 0x02,
 +    [AV_LOG_DEBUG  /8] =  34 <<  8 | 0x02,
++    [AV_LOG_TRACE  /8] =  34 <<  8 | 0x07,
 +    [16+AV_CLASS_CATEGORY_NA              ] = 250 << 8 | 0x09,
 +    [16+AV_CLASS_CATEGORY_INPUT           ] = 219 << 8 | 0x15,
 +    [16+AV_CLASS_CATEGORY_OUTPUT          ] = 201 << 8 | 0x05,
 +    [16+AV_CLASS_CATEGORY_MUXER           ] = 213 << 8 | 0x15,
 +    [16+AV_CLASS_CATEGORY_DEMUXER         ] = 207 << 8 | 0x05,
 +    [16+AV_CLASS_CATEGORY_ENCODER         ] =  51 << 8 | 0x16,
 +    [16+AV_CLASS_CATEGORY_DECODER         ] =  39 << 8 | 0x06,
 +    [16+AV_CLASS_CATEGORY_FILTER          ] = 155 << 8 | 0x12,
 +    [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 192 << 8 | 0x14,
 +    [16+AV_CLASS_CATEGORY_SWSCALER        ] = 153 << 8 | 0x14,
 +    [16+AV_CLASS_CATEGORY_SWRESAMPLER     ] = 147 << 8 | 0x14,
 +    [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ] = 213 << 8 | 0x15,
 +    [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT  ] = 207 << 8 | 0x05,
 +    [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ] = 213 << 8 | 0x15,
 +    [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT  ] = 207 << 8 | 0x05,
 +    [16+AV_CLASS_CATEGORY_DEVICE_OUTPUT       ] = 213 << 8 | 0x15,
 +    [16+AV_CLASS_CATEGORY_DEVICE_INPUT        ] = 207 << 8 | 0x05,
  };
 -#define set_color(x)  fprintf(stderr, "\033[%d;3%dm", color[x] >> 4, color[x]&15)
 -#define print_256color(x) fprintf(stderr, "\033[38;5;%dm", x)
 -#define reset_color() fprintf(stderr, "\033[0m")
 +
  #endif
  static int use_color = -1;
  
@@@ -322,20 -162,8 +325,20 @@@ void av_log_default_callback(void* ptr
          fprintf(stderr, "    Last message repeated %d times\n", count);
          count = 0;
      }
 -    colored_fputs(av_clip(level >> 3, 0, NB_LEVELS - 1), tint >> 8, line);
 -    av_strlcpy(prev, line, sizeof line);
 +    strcpy(prev, line);
 +    sanitize(part[0].str);
 +    colored_fputs(type[0], 0, part[0].str);
 +    sanitize(part[1].str);
 +    colored_fputs(type[1], 0, part[1].str);
 +    sanitize(part[2].str);
-     colored_fputs(av_clip(level >> 3, 0, 6), tint >> 8, part[2].str);
++    colored_fputs(av_clip(level >> 3, 0, NB_LEVELS - 1), tint >> 8, part[2].str);
 +    sanitize(part[3].str);
-     colored_fputs(av_clip(level >> 3, 0, 6), tint >> 8, part[3].str);
++    colored_fputs(av_clip(level >> 3, 0, NB_LEVELS - 1), tint >> 8, part[3].str);
 +end:
 +    av_bprint_finalize(part+3, NULL);
 +#if HAVE_PTHREADS
 +    pthread_mutex_unlock(&mutex);
 +#endif
  }
  
  static void (*av_log_callback)(void*, int, const char*, va_list) =
diff --cc libavutil/log.h
  #include <stdarg.h>
  #include "avutil.h"
  #include "attributes.h"
+ #include "version.h"
  
 +typedef enum {
 +    AV_CLASS_CATEGORY_NA = 0,
 +    AV_CLASS_CATEGORY_INPUT,
 +    AV_CLASS_CATEGORY_OUTPUT,
 +    AV_CLASS_CATEGORY_MUXER,
 +    AV_CLASS_CATEGORY_DEMUXER,
 +    AV_CLASS_CATEGORY_ENCODER,
 +    AV_CLASS_CATEGORY_DECODER,
 +    AV_CLASS_CATEGORY_FILTER,
 +    AV_CLASS_CATEGORY_BITSTREAM_FILTER,
 +    AV_CLASS_CATEGORY_SWSCALER,
 +    AV_CLASS_CATEGORY_SWRESAMPLER,
 +    AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40,
 +    AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 +    AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
 +    AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 +    AV_CLASS_CATEGORY_DEVICE_OUTPUT,
 +    AV_CLASS_CATEGORY_DEVICE_INPUT,
 +    AV_CLASS_CATEGORY_NB, ///< not part of ABI/API
 +}AVClassCategory;
 +
 +#define AV_IS_INPUT_DEVICE(category) \
 +    (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \
 +     ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \
 +     ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT))
 +
 +#define AV_IS_OUTPUT_DEVICE(category) \
 +    (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \
 +     ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \
 +     ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT))
 +
 +struct AVOptionRanges;
 +
  /**
   * Describe the class of an AVClass context structure. That is an
   * arbitrary struct of which the first field is a pointer to an
@@@ -195,9 -144,12 +196,14 @@@ typedef struct AVClass 
   */
  #define AV_LOG_DEBUG    48
  
 +#define AV_LOG_MAX_OFFSET (AV_LOG_DEBUG - AV_LOG_QUIET)
 +
  /**
+  * Extremely verbose debugging, useful for libav* development.
+  */
+ #define AV_LOG_TRACE    56
+ /**
   * @}
   */
  
@@@ -299,28 -248,20 +305,31 @@@ void av_log_default_callback(void *avcl
   * @return The AVClass class_name
   */
  const char* av_default_item_name(void* ctx);
 +AVClassCategory av_default_get_category(void *ptr);
 +
 +/**
 + * Format a line of log the same way as the default callback.
 + * @param line          buffer to receive the formated line
 + * @param line_size     size of the buffer
 + * @param print_prefix  used to store whether the prefix must be printed;
 + *                      must point to a persistent integer initially set to 1
 + */
 +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,
 +                        char *line, int line_size, int *print_prefix);
  
+ #if FF_API_DLOG
  /**
   * av_dlog macros
+  * @deprecated unused
   * Useful to print debug messages that shouldn't get compiled in normally.
   */
  
  #ifdef DEBUG
  #    define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
  #else
 -#    define av_dlog(pctx, ...)
 +#    define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0)
  #endif
+ #endif /* FF_API_DLOG */
  
  /**
   * Skip repeated messages, this requires the user app to use av_log() instead of
@@@ -55,9 -53,9 +55,9 @@@
   * @{
   */
  
 -#define LIBAVUTIL_VERSION_MAJOR 54
 -#define LIBAVUTIL_VERSION_MINOR 12
 -#define LIBAVUTIL_VERSION_MICRO  0
 +#define LIBAVUTIL_VERSION_MAJOR  54
- #define LIBAVUTIL_VERSION_MINOR  22
- #define LIBAVUTIL_VERSION_MICRO 101
++#define LIBAVUTIL_VERSION_MINOR  23
++#define LIBAVUTIL_VERSION_MICRO 100
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                 LIBAVUTIL_VERSION_MINOR, \
  #ifndef FF_API_OPT_TYPE_METADATA
  #define FF_API_OPT_TYPE_METADATA        (LIBAVUTIL_VERSION_MAJOR < 55)
  #endif
+ #ifndef FF_API_DLOG
+ #define FF_API_DLOG                     (LIBAVUTIL_VERSION_MAJOR < 55)
+ #endif
  
 +#ifndef FF_CONST_AVUTIL55
 +#if LIBAVUTIL_VERSION_MAJOR >= 55
 +#define FF_CONST_AVUTIL55 const
 +#else
 +#define FF_CONST_AVUTIL55
 +#endif
 +#endif
  
  /**
   * @}