diff --git a/CMake/Helpers/CMakeMacOS.cmake b/CMake/Helpers/CMakeMacOS.cmake
index 55e1369208..38c7b34530 100644
--- a/CMake/Helpers/CMakeMacOS.cmake
+++ b/CMake/Helpers/CMakeMacOS.cmake
@@ -18,11 +18,21 @@ find_library(MAC_FRAME_CARBON Carbon)
find_library(MAC_FRAME_COREAUDIO CoreAudio)
find_library(MAC_FRAME_IOKIT IOKit)
find_library(MAC_FRAME_METAL Metal)
+find_library(MAC_FRAME_VIDEO CoreVideo)
+find_library(MAC_FRAME_VIDEODECODEACCELERATION VideoDecodeAcceleration)
+find_library(MAC_FRAME_COREMEDIA CoreMedia)
+find_library(MAC_FRAME_VIDEOTOOLBOX VideoToolbox)
+find_library(MAC_FRAME_AUDIOTOOLBOX AudioToolbox)
target_link_libraries(Etterna PRIVATE ${MAC_FRAME_AUDIOUNIT})
target_link_libraries(Etterna PRIVATE ${MAC_FRAME_CARBON})
target_link_libraries(Etterna PRIVATE ${MAC_FRAME_COREAUDIO})
target_link_libraries(Etterna PRIVATE ${MAC_FRAME_IOKIT})
target_link_libraries(Etterna PRIVATE ${MAC_FRAME_METAL})
+target_link_libraries(Etterna PRIVATE ${MAC_FRAME_VIDEO})
+target_link_libraries(Etterna PRIVATE ${MAC_FRAME_VIDEODECODEACCELERATION})
+target_link_libraries(Etterna PRIVATE ${MAC_FRAME_COREMEDIA})
+target_link_libraries(Etterna PRIVATE ${MAC_FRAME_VIDEOTOOLBOX})
+target_link_libraries(Etterna PRIVATE ${MAC_FRAME_AUDIOTOOLBOX})
# Extern Libraries
target_link_libraries(Etterna PRIVATE ffmpeg)
@@ -35,3 +45,7 @@ target_link_libraries(Etterna PRIVATE ${OPENGL_LIBRARIES})
target_link_libraries(Etterna PRIVATE ${BZIP2_LIBRARIES})
target_link_libraries(Etterna PUBLIC ${ICONV_LIBRARIES})
+# lzma
+include(FindLibLZMA)
+target_link_libraries(Etterna PUBLIC ${LIBLZMA_LIBRARIES})
+
diff --git a/CMake/Helpers/CMakeWindows.cmake b/CMake/Helpers/CMakeWindows.cmake
index 8ef5d262c5..d4549a90e1 100644
--- a/CMake/Helpers/CMakeWindows.cmake
+++ b/CMake/Helpers/CMakeWindows.cmake
@@ -34,10 +34,11 @@ else()
endif()
list(APPEND WIN_DLLS
- "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avcodec-55.dll"
- "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avformat-55.dll"
- "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avutil-52.dll"
- "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/swscale-2.dll")
+ "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avcodec-58.dll"
+ "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avformat-58.dll"
+ "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/avutil-56.dll"
+ "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/swscale-5.dll"
+ "${PROJECT_SOURCE_DIR}/extern/ffmpeg/windows/${ARCH}/swresample-3.dll")
foreach(dll ${WIN_DLLS})
# We remove the dlls if they exist already in /Program/ in case we run a different ARCH target before
diff --git a/CMake/Helpers/CPackSetup.cmake b/CMake/Helpers/CPackSetup.cmake
index ea0f4d8dce..ae1c421549 100644
--- a/CMake/Helpers/CPackSetup.cmake
+++ b/CMake/Helpers/CPackSetup.cmake
@@ -46,8 +46,8 @@ if(WIN32)
set(INSTALL_DIR ".")
# List every DLL etterna needs.
- list(APPEND WIN_DLLS "${PROJECT_SOURCE_DIR}/Program/avcodec-55.dll" "${PROJECT_SOURCE_DIR}/Program/avformat-55.dll"
- "${PROJECT_SOURCE_DIR}/Program/avutil-52.dll" "${PROJECT_SOURCE_DIR}/Program/swscale-2.dll"
+ list(APPEND WIN_DLLS "${PROJECT_SOURCE_DIR}/Program/avcodec-58.dll" "${PROJECT_SOURCE_DIR}/Program/avformat-58.dll"
+ "${PROJECT_SOURCE_DIR}/Program/avutil-56.dll" "${PROJECT_SOURCE_DIR}/Program/swscale-5.dll" "${PROJECT_SOURCE_DIR}/Program/swresample-3.dll"
${PROJECT_BINARY_DIR}/gn_crashpad/crashpad_handler.exe)
install(FILES ${WIN_DLLS} COMPONENT Etterna DESTINATION Program)
install(TARGETS Etterna COMPONENT Etterna DESTINATION Program)
diff --git a/CMake/Helpers/SetupFFMPEG.cmake b/CMake/Helpers/SetupFFMPEG.cmake
index 3a2d7e6274..d1b7617383 100644
--- a/CMake/Helpers/SetupFFMPEG.cmake
+++ b/CMake/Helpers/SetupFFMPEG.cmake
@@ -1,6 +1,6 @@
include(ExternalProject)
-set(FFMPEG_ROOT "${PROJECT_BINARY_DIR}/ffmpeg_dl/ffmpeg-2.1.3-src")
+set(FFMPEG_ROOT "${PROJECT_BINARY_DIR}/ffmpeg_dl/ffmpeg-4.4-src")
set(FFMPEG_BIN "${PROJECT_BINARY_DIR}/ffmpeg_dl/ffmpeg_dl-build")
list(APPEND FFMPEG_CONFIGURE
@@ -51,7 +51,7 @@ ExternalProject_Add(ffmpeg_dl
GIT_REPOSITORY "https://github.com/etternagame/ffmpeg.git"
GIT_PROGRESS TRUE
GIT_SHALLOW TRUE
- GIT_TAG "n2.1.3"
+ GIT_TAG "n4.4"
BUILD_BYPRODUCTS ${FFMPEG_BUILD_LIBS}
SOURCE_DIR ${FFMPEG_ROOT}
diff --git a/extern/ffmpeg/64bit/avcodec.lib b/extern/ffmpeg/64bit/avcodec.lib
index c2e4302ee6..e1c3ec09b9 100644
Binary files a/extern/ffmpeg/64bit/avcodec.lib and b/extern/ffmpeg/64bit/avcodec.lib differ
diff --git a/extern/ffmpeg/64bit/avdevice.lib b/extern/ffmpeg/64bit/avdevice.lib
index 4f2db7689e..c3833d0188 100644
Binary files a/extern/ffmpeg/64bit/avdevice.lib and b/extern/ffmpeg/64bit/avdevice.lib differ
diff --git a/extern/ffmpeg/64bit/avfilter.lib b/extern/ffmpeg/64bit/avfilter.lib
index 24c6e4f5a8..9bcbb84616 100644
Binary files a/extern/ffmpeg/64bit/avfilter.lib and b/extern/ffmpeg/64bit/avfilter.lib differ
diff --git a/extern/ffmpeg/64bit/avformat.lib b/extern/ffmpeg/64bit/avformat.lib
index 321a6c5fa8..678bdbf9d6 100644
Binary files a/extern/ffmpeg/64bit/avformat.lib and b/extern/ffmpeg/64bit/avformat.lib differ
diff --git a/extern/ffmpeg/64bit/avutil.lib b/extern/ffmpeg/64bit/avutil.lib
index 155a36f9d7..0fd81e7b0e 100644
Binary files a/extern/ffmpeg/64bit/avutil.lib and b/extern/ffmpeg/64bit/avutil.lib differ
diff --git a/extern/ffmpeg/64bit/postproc.lib b/extern/ffmpeg/64bit/postproc.lib
deleted file mode 100644
index 96cc834d9f..0000000000
Binary files a/extern/ffmpeg/64bit/postproc.lib and /dev/null differ
diff --git a/extern/ffmpeg/64bit/swresample.lib b/extern/ffmpeg/64bit/swresample.lib
index e1b524905e..c486710548 100644
Binary files a/extern/ffmpeg/64bit/swresample.lib and b/extern/ffmpeg/64bit/swresample.lib differ
diff --git a/extern/ffmpeg/64bit/swscale.lib b/extern/ffmpeg/64bit/swscale.lib
index 39e2521a12..91a46c7867 100644
Binary files a/extern/ffmpeg/64bit/swscale.lib and b/extern/ffmpeg/64bit/swscale.lib differ
diff --git a/extern/ffmpeg/doc/APIchanges b/extern/ffmpeg/doc/APIchanges
new file mode 100644
index 0000000000..c928887f79
--- /dev/null
+++ b/extern/ffmpeg/doc/APIchanges
@@ -0,0 +1,3372 @@
+Never assume the API of libav* to be stable unless at least 1 month has passed
+since the last major version increase or the API was added.
+
+The last version increases were:
+libavcodec: 2017-10-21
+libavdevice: 2017-10-21
+libavfilter: 2017-10-21
+libavformat: 2017-10-21
+libavresample: 2017-10-21
+libpostproc: 2017-10-21
+libswresample: 2017-10-21
+libswscale: 2017-10-21
+libavutil: 2017-10-21
+
+
+API changes, most recent first:
+
+-------- 8< --------- FFmpeg 4.4 was cut here -------- 8< ---------
+
+2021-03-19 - e8c0bca6bd - lavu 56.69.100 - adler32.h
+ Added a typedef for the type of the Adler-32 checksums
+ used by av_adler32_update(). It will be changed to uint32_t
+ at the next major bump.
+ The type of the parameter for the length of the input buffer
+ will also be changed to size_t at the next major bump.
+
+2021-03-19 - e318438f2f - lavf 58.75.100 - avformat.h
+ AVChapter.id will be changed from int to int64_t
+ on the next major version bump.
+
+2021-03-17 - f7db77bd87 - lavc 58.133.100 - codec.h
+ Deprecated av_init_packet(). Once removed, sizeof(AVPacket) will
+ no longer be a part of the public ABI.
+ Deprecated AVPacketList.
+
+2021-03-16 - 7d09579190 - lavc 58.132.100 - codec.h
+ Add AV_CODEC_CAP_OTHER_THREADS as a new name for
+ AV_CODEC_CAP_AUTO_THREADS. AV_CODEC_CAP_AUTO_THREADS
+ is now deprecated.
+
+2021-03-12 - 6e7e3a3820 - lavc 58.131.100 - avcodec.h codec.h
+ Add a get_encode_buffer callback to AVCodecContext, similar to
+ get_buffer2 but for encoders.
+ Add avcodec_default_get_encode_buffer().
+ Add AV_GET_ENCODE_BUFFER_FLAG_REF.
+ Encoders may now be flagged as AV_CODEC_CAP_DR1 capable.
+
+2021-03-10 - 42e68fe015 - lavf 58.72.100 - avformat.h
+ Change AVBufferRef related AVStream function and struct size
+ parameter and fields type to size_t at next major bump.
+
+2021-03-10 - d79e0fe65c - lavc 58.130.100 - packet.h
+ Change AVBufferRef related AVPacket function and struct size
+ parameter and fields type to size_t at next major bump.
+
+2021-03-10 - 14040a1d91 - lavu 56.68.100 - buffer.h frame.h
+ Change AVBufferRef and relevant AVFrame function and struct size
+ parameter and fields type to size_t at next major bump.
+
+2021-03-04 - a0eec776b6 - lavc 58.128.101 - avcodec.h
+ Enable err_recognition to be set for encoders.
+
+2021-03-03 - 2ff40b98ec - lavf 58.70.100 - avformat.h
+ Deprecate AVFMT_FLAG_PRIV_OPT. It will do nothing
+ as soon as av_demuxer_open() is removed.
+
+2021-02-27 - dd9227e48f - lavc 58.126.100 - avcodec.h
+ Deprecated avcodec_get_frame_class().
+
+2021-02-21 - 5ca40d6d94 - lavu 56.66.100 - tx.h
+ Add enum AVTXFlags and AVTXFlags.AV_TX_INPLACE
+
+2021-02-14 - 4f49ca7bbc - lavd 58.12.100 - avdevice.h
+ Deprecated avdevice_capabilities_create() and
+ avdevice_capabilities_free().
+
+2021-02-10 - 1bda9bb68a - lavu 56.65.100 - common.h
+ Add FFABS64U()
+
+2021-01-26 - 5dd9567080 - lavu 56.64.100 - common.h
+ Add FFABSU()
+
+2021-01-25 - 56709ca8aa - lavc 58.119.100 - avcodec.h
+ Deprecate AVCodecContext.debug_mv, FF_DEBUG_VIS_MV_P_FOR, FF_DEBUG_VIS_MV_B_FOR,
+ FF_DEBUG_VIS_MV_B_BACK
+
+2021-01-11 - ebdd33086a - lavc 58.116.100 - avcodec.h
+ Add FF_PROFILE_VVC_MAIN_10 and FF_PROFILE_VVC_MAIN_10_444.
+
+2020-01-01 - baecaa16c1 - lavu 56.63.100 - video_enc_params.h
+ Add AV_VIDEO_ENC_PARAMS_MPEG2
+
+2020-12-03 - eca12f4d5a - lavu 56.62.100 - timecode.h
+ Add av_timecode_init_from_components.
+
+2020-11-27 - a83098ab03 - lavc 58.114.100 - avcodec.h
+ Deprecate AVCodecContext.thread_safe_callbacks. Starting with
+ LIBAVCODEC_VERSION_MAJOR=60, user callbacks must always be
+ thread-safe when frame threading is used.
+
+2020-11-25 - d243dd540a - lavc 58.113.100 - avcodec.h
+ Adds a new flag AV_CODEC_EXPORT_DATA_FILM_GRAIN for export_side_data.
+
+2020-11-25 - 4f9ee87253 - lavu 56.61.100 - film_grain_params.h
+ Adds a new API for extracting codec film grain parameters as side data.
+ Adds a new AVFrameSideDataType entry AV_FRAME_DATA_FILM_GRAIN_PARAMS for it.
+
+2020-10-28 - f95d9510ff - lavf 58.64.100 - avformat.h
+ Add AVSTREAM_EVENT_FLAG_NEW_PACKETS.
+
+2020-09-28 - 68918d3b7f - lavu 56.60.100 - buffer.h
+ Add a av_buffer_replace() convenience function.
+
+2020-09-13 - 837b6eb90e - lavu 56.59.100 - timecode.h
+ Add av_timecode_make_smpte_tc_string2.
+
+2020-08-21 - 06f2651204 - lavu 56.58.100 - avstring.h
+ Deprecate av_d2str(). Use av_asprintf() instead.
+
+2020-08-04 - 34de0abbe7 - lavu 56.58.100 - channel_layout.h
+ Add AV_CH_LAYOUT_22POINT2 together with its newly required pieces:
+ AV_CH_TOP_SIDE_LEFT, AV_CH_TOP_SIDE_RIGHT, AV_CH_BOTTOM_FRONT_CENTER,
+ AV_CH_BOTTOM_FRONT_LEFT, AV_CH_BOTTOM_FRONT_RIGHT.
+
+2020-07-23 - 84655b7101 - lavu 56.57.100 - cpu.h
+ Add AV_CPU_FLAG_MMI and AV_CPU_FLAG_MSA.
+
+2020-07-22 - 3a8e927176 - lavu 56.56.100 - imgutils.h
+ Add av_image_fill_plane_sizes().
+
+2020-07-15 - 448a9aaa78 - lavc 58.96.100 - packet.h
+ Add AV_PKT_DATA_S12M_TIMECODE.
+
+2020-06-12 - b09fb030c1 - lavu 56.55.100 - pixdesc.h
+ Add AV_PIX_FMT_X2RGB10.
+
+2020-06-11 - bc8ab084fb - lavu 56.54.100 - frame.h
+ Add AV_FRAME_DATA_SEI_UNREGISTERED.
+
+2020-06-10 - 1b4a98b029 - lavu 56.53.100 - log.h opt.h
+ Add av_opt_child_class_iterate() and AVClass.child_class_iterate().
+ Deprecate av_opt_child_class_next() and AVClass.child_class_next().
+
+-------- 8< --------- FFmpeg 4.3 was cut here -------- 8< ---------
+
+2020-06-05 - ec39c2276a - lavu 56.50.100 - buffer.h
+ Passing NULL as alloc argument to av_buffer_pool_init2() is now allowed.
+
+2020-05-27 - ba6cada92e - lavc 58.88.100 - avcodec.h codec.h
+ Move AVCodec-related public API to new header codec.h.
+
+2020-05-23 - 064b875e89 - lavu 56.49.100 - video_enc_params.h
+ Add AV_VIDEO_ENC_PARAMS_H264.
+
+2020-05-23 - 2e08b39444 - lavu 56.48.100 - hwcontext.h
+ Add av_hwdevice_ctx_create_derived_opts.
+
+2020-05-23 - 6b65c4ec54 - lavu 56.47.100 - rational.h
+ Add av_gcd_q().
+
+2020-05-22 - af9e622776 - lavu 56.46.101 - opt.h
+ Add AV_OPT_FLAG_CHILD_CONSTS.
+
+2020-05-22 - 9d443c3e68 - lavc 58.87.100 - avcodec.h codec_par.h
+ Move AVBitstreamFilter-related public API to new header bsf.h.
+ Move AVCodecParameters-related public API to new header codec_par.h.
+
+2020-05-21 - 13b1bbff0b - lavc 58.86.101 - avcodec.h
+ Deprecated AV_CODEC_CAP_INTRA_ONLY and AV_CODEC_CAP_LOSSLESS.
+
+2020-05-17 - 84af196c65 - lavu 56.46.100 - common.h
+ Add av_sat_add64() and av_sat_sub64()
+
+2020-05-12 - 991d417692 - lavu 56.45.100 - video_enc_params.h
+ lavc 58.84.100 - avcodec.h
+ Add a new API for exporting video encoding information.
+ Replaces the deprecated API for exporting QP tables from decoders.
+ Add AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS to request this information from
+ decoders.
+
+2020-05-10 - dccd07f66d - lavu 56.44.100 - hwcontext_vulkan.h
+ Add enabled_inst_extensions, num_enabled_inst_extensions, enabled_dev_extensions
+ and num_enabled_dev_extensions fields to AVVulkanDeviceContext
+
+2020-04-22 - 0e1db79e37 - lavc 58.81.100 - packet.h
+ - lavu 56.43.100 - dovi_meta.h
+ Add AV_PKT_DATA_DOVI_CONF and AVDOVIDecoderConfigurationRecord.
+
+2020-04-15 - 22b25b3ea5 - lavc 58.79.100 - avcodec.h
+ Add formal support for calling avcodec_flush_buffers() on encoders.
+ Encoders that set the cap AV_CODEC_CAP_ENCODER_FLUSH will be flushed.
+ For all other encoders, the call is now a no-op rather than undefined
+ behaviour.
+
+2020-04-10 - 672946c7fe - lavc 58.78.100 - avcodec.h codec_desc.h codec_id.h packet.h
+ Move AVCodecDesc-related public API to new header codec_desc.h.
+ Move AVCodecID enum to new header codec_id.h.
+ Move AVPacket-related public API to new header packet.h.
+
+2020-03-29 - 4cb0dda555 - lavf 58.42.100 - avformat.h
+ av_read_frame() now guarantees to handle uninitialized input packets
+ and to return refcounted packets on success.
+
+2020-03-27 - c52ec0367d - lavc 58.77.100 - avcodec.h
+ av_packet_ref() now guarantees to return the destination packet
+ in a blank state on error.
+
+2020-03-10 - 05d27f342b - lavc 58.75.100 - avcodec.h
+ Add AV_PKT_DATA_ICC_PROFILE.
+
+2020-02-21 - d005a7cdfd - lavc 58.73.101 - avcodec.h
+ Add AV_CODEC_EXPORT_DATA_PRFT.
+
+2020-02-21 - c666689491 - lavc 58.73.100 - avcodec.h
+ Add AVCodecContext.export_side_data and AV_CODEC_EXPORT_DATA_MVS.
+
+2020-02-13 - e8f054b095 - lavu 56.41.100 - tx.h
+ Add AV_TX_INT32_FFT and AV_TX_INT32_MDCT
+
+2020-02-12 - 3182114f88 - lavu 56.40.100 - log.h
+ Add av_log_once().
+
+2020-02-04 - a88449ffb2 - lavu 56.39.100 - hwcontext.h
+ Add AV_PIX_FMT_VULKAN
+ Add AV_HWDEVICE_TYPE_VULKAN and implementation.
+
+2020-01-30 - 27529eeb27 - lavf 58.37.100 - avio.h
+ Add avio_protocol_get_class().
+
+2020-01-15 - 717b2074ec - lavc 58.66.100 - avcodec.h
+ Add AV_PKT_DATA_PRFT and AVProducerReferenceTime.
+
+2019-12-27 - 45259a0ee4 - lavu 56.38.100 - eval.h
+ Add av_expr_count_func().
+
+2019-12-26 - 16685114d5 - lavu 56.37.100 - buffer.h
+ Add av_buffer_pool_buffer_get_opaque().
+
+2019-11-17 - 1c23abc88f - lavu 56.36.100 - eval API
+ Add av_expr_count_vars().
+
+2019-10-14 - f3746d31f9 - lavu 56.35.101 - opt.h
+ Add AV_OPT_FLAG_RUNTIME_PARAM.
+
+2019-09-25 - f8406ab4b9 - lavc 58.59.100 - avcodec.h
+ Add max_samples
+
+2019-09-04 - 2a9d461abc - lavu 56.35.100 - hwcontext_videotoolbox.h
+ Add av_map_videotoolbox_format_from_pixfmt2() for full range pixfmt
+
+2019-09-01 - 8821d1f56e - lavu 56.34.100 - pixfmt.h
+ Add EBU Tech. 3213-E AVColorPrimaries value
+
+2019-08-17 - 95fa73a2b4 - lavf 58.31.101 - avio.h
+ 4K limit removed from avio_printf.
+
+2019-08-17 - a82f8f2f10 - lavf 58.31.100 - avio.h
+ Add avio_print_string_array and avio_print.
+
+2019-07-27 - 42e2319ba9 - lavu 56.33.100 - tx.h
+ Add AV_TX_DOUBLE_FFT and AV_TX_DOUBLE_MDCT
+
+-------- 8< --------- FFmpeg 4.2 was cut here -------- 8< ---------
+
+2019-06-21 - a30e44098a - lavu 56.30.100 - frame.h
+ Add FF_DECODE_ERROR_DECODE_SLICES
+
+2019-06-14 - edfced8c04 - lavu 56.29.100 - frame.h
+ Add FF_DECODE_ERROR_CONCEALMENT_ACTIVE
+
+2019-05-15 - b79b29ddb1 - lavu 56.28.100 - tx.h
+ Add av_tx_init(), av_tx_uninit() and related definitions.
+
+2019-04-20 - 3153a6502a - lavc 58.52.100 - avcodec.h
+ Add AV_CODEC_FLAG_DROPCHANGED to allow avcodec_receive_frame to drop
+ frames whose parameters differ from first decoded frame in stream.
+
+2019-04-12 - abfeba9724 - lavf 58.27.102
+ Rename hls,applehttp demuxer to hls
+
+2019-01-27 - 5bcefceec8 - lavc 58.46.100 - avcodec.h
+ Add discard_damaged_percentage
+
+2019-01-08 - 1ef4828276 - lavu 56.26.100 - frame.h
+ Add AV_FRAME_DATA_REGIONS_OF_INTEREST
+
+2018-12-21 - 2744d6b364 - lavu 56.25.100 - hdr_dynamic_metadata.h
+ Add AV_FRAME_DATA_DYNAMIC_HDR_PLUS enum value, av_dynamic_hdr_plus_alloc(),
+ av_dynamic_hdr_plus_create_side_data() functions, and related structs.
+
+-------- 8< --------- FFmpeg 4.1 was cut here -------- 8< ---------
+
+2018-10-27 - 718044dc19 - lavu 56.21.100 - pixdesc.h
+ Add av_read_image_line2(), av_write_image_line2()
+
+2018-10-24 - f9d4126f28 - lavu 56.20.100 - frame.h
+ Add AV_FRAME_DATA_S12M_TIMECODE
+
+2018-10-11 - f6d48b618a - lavc 58.33.100 - mediacodec.h
+ Add av_mediacodec_render_buffer_at_time().
+
+2018-09-09 - 35498c124a - lavc 58.29.100 - avcodec.h
+ Add AV_PKT_DATA_AFD
+
+2018-08-16 - b33f5299a5 - lavc 58.23.100 - avcodec.h
+ Add av_bsf_flush().
+
+2018-05-18 - 2b2f2f65f3 - lavf 58.15.100 - avformat.h
+ Add pmt_version field to AVProgram
+
+2018-05-17 - 5dfeb7f081 - lavf 58.14.100 - avformat.h
+ Add AV_DISPOSITION_STILL_IMAGE
+
+2018-05-10 - c855683427 - lavu 56.18.101 - hwcontext_cuda.h
+ Add AVCUDADeviceContext.stream.
+
+2018-04-30 - 56b081da57 - lavu 56.18.100 - pixdesc.h
+ Add AV_PIX_FMT_FLAG_ALPHA to AV_PIX_FMT_PAL8.
+
+2018-04-26 - 5be0410cb3 - lavu 56.17.100 - opt.h
+ Add AV_OPT_FLAG_DEPRECATED.
+
+2018-04-26 - 71fa82bed6 - lavu 56.16.100 - threadmessage.h
+ Add av_thread_message_queue_nb_elems().
+
+-------- 8< --------- FFmpeg 4.0 was cut here -------- 8< ---------
+
+2018-04-03 - d6fc031caf - lavu 56.13.100 - pixdesc.h
+ Deprecate AV_PIX_FMT_FLAG_PSEUDOPAL and make allocating a pseudo palette
+ optional for API users (see AV_PIX_FMT_FLAG_PSEUDOPAL doxygen for details).
+
+2018-04-01 - 860086ee16 - lavc 58.17.100 - avcodec.h
+ Add av_packet_make_refcounted().
+
+2018-04-01 - f1805d160d - lavfi 7.14.100 - avfilter.h
+ Deprecate use of avfilter_register(), avfilter_register_all(),
+ avfilter_next(). Add av_filter_iterate().
+
+2018-03-25 - b7d0d912ef - lavc 58.16.100 - avcodec.h
+ Add FF_SUB_CHARENC_MODE_IGNORE.
+
+2018-03-23 - db2a7c947e - lavu 56.12.100 - encryption_info.h
+ Add AVEncryptionInitInfo and AVEncryptionInfo structures to hold new side-data
+ for encryption info.
+
+2018-03-21 - f14ca60001 - lavc 58.15.100 - avcodec.h
+ Add av_packet_make_writable().
+
+2018-03-18 - 4b86ac27a0 - lavu 56.11.100 - frame.h
+ Add AV_FRAME_DATA_QP_TABLE_PROPERTIES and AV_FRAME_DATA_QP_TABLE_DATA.
+
+2018-03-15 - e0e72539cf - lavu 56.10.100 - opt.h
+ Add AV_OPT_FLAG_BSF_PARAM
+
+2018-03-07 - 950170bd3b - lavu 56.9.100 - crc.h
+ Add AV_CRC_8_EBU crc variant.
+
+2018-03-07 - 2a0eb86857 - lavc 58.14.100 - mediacodec.h
+ Change the default behavior of avcodec_flush() on mediacodec
+ video decoders. To restore the previous behavior, use the new
+ delay_flush=1 option.
+
+2018-03-01 - 6731f60598 - lavu 56.8.100 - frame.h
+ Add av_frame_new_side_data_from_buf().
+
+2018-02-15 - 8a8d0b319a
+ Change av_ripemd_update(), av_murmur3_update() and av_hash_update() length
+ parameter type to size_t at next major bump.
+
+2018-02-12 - bcab11a1a2 - lavfi 7.12.100 - avfilter.h
+ Add AVFilterContext.extra_hw_frames.
+
+2018-02-12 - d23fff0d8a - lavc 58.11.100 - avcodec.h
+ Add AVCodecContext.extra_hw_frames.
+
+2018-02-06 - 0694d87024 - lavf 58.9.100 - avformat.h
+ Deprecate use of av_register_input_format(), av_register_output_format(),
+ av_register_all(), av_iformat_next(), av_oformat_next().
+ Add av_demuxer_iterate(), and av_muxer_iterate().
+
+2018-02-06 - 36c85d6e77 - lavc 58.10.100 - avcodec.h
+ Deprecate use of avcodec_register(), avcodec_register_all(),
+ av_codec_next(), av_register_codec_parser(), and av_parser_next().
+ Add av_codec_iterate() and av_parser_iterate().
+
+2018-02-04 - ff46124b0d - lavf 58.8.100 - avformat.h
+ Deprecate the current names of the RTSP "timeout", "stimeout", "user-agent"
+ options. Introduce "listen_timeout" as replacement for the current "timeout"
+ option, and "user_agent" as replacement for "user-agent". Once the deprecation
+ is over, the old "timeout" option will be removed, and "stimeout" will be
+ renamed to "stimeout" (the "timeout" option will essentially change semantics).
+
+2018-01-28 - ea3672b7d6 - lavf 58.7.100 - avformat.h
+ Deprecate AVFormatContext filename field which had limited length, use the
+ new dynamically allocated url field instead.
+
+2018-01-28 - ea3672b7d6 - lavf 58.7.100 - avformat.h
+ Add url field to AVFormatContext and add ff_format_set_url helper function.
+
+2018-01-27 - 6194d7e564 - lavf 58.6.100 - avformat.h
+ Add AVFMTCTX_UNSEEKABLE (for HLS demuxer).
+
+2018-01-23 - 9f07cf7c00 - lavu 56.9.100 - aes_ctr.h
+ Add method to set the 16-byte IV.
+
+2018-01-16 - 631c56a8e4 - lavf 58.5.100 - avformat.h
+ Explicitly make avformat_network_init() and avformat_network_deinit() optional.
+ If these are not called, network initialization and deinitialization is
+ automatic, and unlike in older versions, fully supported, unless libavformat
+ is linked to ancient GnuTLS and OpenSSL.
+
+2018-01-16 - 6512ff72f9 - lavf 58.4.100 - avformat.h
+ Deprecate AVStream.recommended_encoder_configuration. It was useful only for
+ FFserver, which has been removed.
+
+2018-01-05 - 798dcf2432 - lavfi 7.11.101 - avfilter.h
+ Deprecate avfilter_link_get_channels(). Use av_buffersink_get_channels().
+
+2017-01-04 - c29038f304 - lavr 4.0.0 - avresample.h
+ Deprecate the entire library. Merged years ago to provide compatibility
+ with Libav, it remained unmaintained by the FFmpeg project and duplicated
+ functionality provided by libswresample.
+
+ In order to improve consistency and reduce attack surface, it has been deprecated.
+ Users of this library are asked to migrate to libswresample, which, as well as
+ providing more functionality, is faster and has higher accuracy.
+
+2017-12-26 - a04c2c707d - lavc 58.9.100 - avcodec.h
+ Deprecate av_lockmgr_register(). You need to build FFmpeg with threading
+ support enabled to get basic thread-safety (which is the default build
+ configuration).
+
+2017-12-24 - 8b81eabe57 - lavu 56.7.100 - cpu.h
+ AVX-512 flags added.
+
+2017-12-16 - 8bf4e6d3ce - lavc 58.8.100 - avcodec.h
+ The MediaCodec decoders now support AVCodecContext.hw_device_ctx.
+
+2017-12-16 - e4d9f05ca7 - lavu 56.6.100 - hwcontext.h hwcontext_mediacodec.h
+ Add AV_HWDEVICE_TYPE_MEDIACODEC and a new installed header with
+ MediaCodec-specific hwcontext definitions.
+
+2017-12-14 - b945fed629 - lavc 58.7.100 - avcodec.h
+ Add AV_CODEC_CAP_HARDWARE, AV_CODEC_CAP_HYBRID, and AVCodec.wrapper_name,
+ and mark all AVCodecs accordingly.
+
+2017-11-29 - d268094f88 - lavu 56.4.100 / 56.7.0 - stereo3d.h
+ Add view field to AVStereo3D structure and AVStereo3DView enum.
+
+2017-11-26 - 3a71bcc213 - lavc 58.6.100 - avcodec.h
+ Add const to AVCodecContext.hwaccel.
+
+2017-11-26 - 3536a3efb9 - lavc 58.5.100 - avcodec.h
+ Deprecate user visibility of the AVHWAccel structure and the functions
+ av_register_hwaccel() and av_hwaccel_next().
+
+2017-11-26 - 24cc0a53e9 - lavc 58.4.100 - avcodec.h
+ Add AVCodecHWConfig and avcodec_get_hw_config().
+
+2017-11-22 - 3650cb2dfa - lavu 56.3.100 - opencl.h
+ Remove experimental OpenCL API (av_opencl_*).
+
+2017-11-22 - b25d8ef0a7 - lavu 56.2.100 - hwcontext.h hwcontext_opencl.h
+ Add AV_HWDEVICE_TYPE_OPENCL and a new installed header with
+ OpenCL-specific hwcontext definitions.
+
+2017-11-22 - a050f56c09 - lavu 56.1.100 - pixfmt.h
+ Add AV_PIX_FMT_OPENCL.
+
+2017-11-11 - 48e4eda11d - lavc 58.3.100 - avcodec.h
+ Add avcodec_get_hw_frames_parameters().
+
+-------- 8< --------- FFmpeg 3.4 was cut here -------- 8< ---------
+
+2017-09-28 - b6cf66ae1c - lavc 57.106.104 - avcodec.h
+ Add AV_PKT_DATA_A53_CC packet side data, to export closed captions
+
+2017-09-27 - 7aa6b8a68f - lavu 55.77.101 / lavu 55.31.1 - frame.h
+ Allow passing the value of 0 (meaning "automatic") as the required alignment
+ to av_frame_get_buffer().
+
+2017-09-27 - 522f877086 - lavu 55.77.100 / lavu 55.31.0 - cpu.h
+ Add av_cpu_max_align() for querying maximum required data alignment.
+
+2017-09-26 - b1cf151c4d - lavc 57.106.102 - avcodec.h
+ Deprecate AVCodecContext.refcounted_frames. This was useful for deprecated
+ API only (avcodec_decode_video2/avcodec_decode_audio4). The new decode APIs
+ (avcodec_send_packet/avcodec_receive_frame) always work with reference
+ counted frames.
+
+2017-09-21 - 6f15f1cdc8 - lavu 55.76.100 / 56.6.0 - pixdesc.h
+ Add av_color_range_from_name(), av_color_primaries_from_name(),
+ av_color_transfer_from_name(), av_color_space_from_name(), and
+ av_chroma_location_from_name().
+
+2017-09-13 - 82342cead1 - lavc 57.106.100 - avcodec.h
+ Add AV_PKT_FLAG_TRUSTED.
+
+2017-09-13 - 9cb23cd9fe - lavu 55.75.100 - hwcontext.h hwcontext_drm.h
+ Add AV_HWDEVICE_TYPE_DRM and implementation.
+
+2017-09-08 - 5ba2aef6ec - lavfi 6.103.100 - buffersrc.h
+ Add av_buffersrc_close().
+
+2017-09-04 - 6cadbb16e9 - lavc 57.105.100 - avcodec.h
+ Add AV_HWACCEL_CODEC_CAP_EXPERIMENTAL, replacing the deprecated
+ HWACCEL_CODEC_CAP_EXPERIMENTAL flag.
+
+2017-09-01 - 5d76674756 - lavf 57.81.100 - avio.h
+ Add avio_read_partial().
+
+2017-09-01 - xxxxxxx - lavf 57.80.100 / 57.11.0 - avio.h
+ Add avio_context_free(). From now on it must be used for freeing AVIOContext.
+
+2017-08-08 - 1460408703 - lavu 55.74.100 - pixdesc.h
+ Add AV_PIX_FMT_FLAG_FLOAT pixel format flag.
+
+2017-08-08 - 463b81de2b - lavu 55.72.100 - imgutils.h
+ Add av_image_fill_black().
+
+2017-08-08 - caa12027ba - lavu 55.71.100 - frame.h
+ Add av_frame_apply_cropping().
+
+2017-07-25 - 24de4fddca - lavu 55.69.100 - frame.h
+ Add AV_FRAME_DATA_ICC_PROFILE side data type.
+
+2017-06-27 - 70143a3954 - lavc 57.100.100 - avcodec.h
+ DXVA2 and D3D11 hardware accelerated decoding now supports the new hwaccel API,
+ which can create the decoder context and allocate hardware frame automatically.
+ See AVCodecContext.hw_device_ctx and AVCodecContext.hw_frames_ctx. For D3D11,
+ the new AV_PIX_FMT_D3D11 pixfmt must be used with the new API.
+
+2017-06-27 - 3303511f33 - lavu 56.67.100 - hwcontext.h
+ Add AV_HWDEVICE_TYPE_D3D11VA and AV_PIX_FMT_D3D11.
+
+2017-06-24 - 09891c5391 - lavf 57.75.100 - avio.h
+ Add AVIO_DATA_MARKER_FLUSH_POINT to signal preferred flush points to aviobuf.
+
+2017-06-14 - d59c6a3aeb - lavu 55.66.100 - hwcontext.h
+ av_hwframe_ctx_create_derived() now takes some AV_HWFRAME_MAP_* combination
+ as its flags argument (which was previously unused).
+
+2017-06-14 - 49ae8a5e87 - lavc 57.99.100 - avcodec.h
+ Add AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH.
+
+2017-06-14 - 0b1794a43e - lavu 55.65.100 - hwcontext.h
+ Add AV_HWDEVICE_TYPE_NONE, av_hwdevice_find_type_by_name(),
+ av_hwdevice_get_type_name() and av_hwdevice_iterate_types().
+
+2017-06-14 - b22172f6f3 - lavu 55.64.100 - hwcontext.h
+ Add av_hwdevice_ctx_create_derived().
+
+2017-05-15 - 532b23f079 - lavc 57.96.100 - avcodec.h
+ VideoToolbox hardware-accelerated decoding now supports the new hwaccel API,
+ which can create the decoder context and allocate hardware frames automatically.
+ See AVCodecContext.hw_device_ctx and AVCodecContext.hw_frames_ctx.
+
+2017-05-15 - 532b23f079 - lavu 57.63.100 - hwcontext.h
+ Add AV_HWDEVICE_TYPE_VIDEOTOOLBOX and implementation.
+
+2017-05-08 - f089e02fa2 - lavc 57.95.100 / 57.31.0 - avcodec.h
+ Add AVCodecContext.apply_cropping to control whether cropping
+ is handled by libavcodec or the caller.
+
+2017-05-08 - a47bd5d77e - lavu 55.62.100 / 55.30.0 - frame.h
+ Add AVFrame.crop_left/right/top/bottom fields for attaching cropping
+ information to video frames.
+
+2017-xx-xx - xxxxxxxxxx
+ Change av_sha_update(), av_sha512_update() and av_md5_sum()/av_md5_update() length
+ parameter type to size_t at next major bump.
+
+2017-05-05 - c0f17a905f - lavc 57.94.100 - avcodec.h
+ The cuvid decoders now support AVCodecContext.hw_device_ctx, which removes
+ the requirement to set an incomplete AVCodecContext.hw_frames_ctx only to
+ set the Cuda device handle.
+
+2017-04-11 - 8378466507 - lavu 55.61.100 - avstring.h
+ Add av_strireplace().
+
+2016-04-06 - 157e57a181 - lavc 57.92.100 - avcodec.h
+ Add AV_PKT_DATA_CONTENT_LIGHT_LEVEL packet side data.
+
+2016-04-06 - b378f5bd64 - lavu 55.60.100 - mastering_display_metadata.h
+ Add AV_FRAME_DATA_CONTENT_LIGHT_LEVEL value, av_content_light_metadata_alloc()
+ and av_content_light_metadata_create_side_data() API, and AVContentLightMetadata
+ type to export content light level video properties.
+
+2017-03-31 - 9033e8723c - lavu 55.57.100 - spherical.h
+ Add av_spherical_projection_name().
+ Add av_spherical_from_name().
+
+2017-03-30 - 4cda23f1f1 - lavu 55.53.100 / 55.27.0 - hwcontext.h
+ Add av_hwframe_map() and associated AV_HWFRAME_MAP_* flags.
+ Add av_hwframe_ctx_create_derived().
+
+2017-03-29 - bfdcdd6d82 - lavu 55.52.100 - avutil.h
+ add av_fourcc_make_string() function and av_fourcc2str() macro to replace
+ av_get_codec_tag_string() from lavc.
+
+2017-03-27 - ddef3d902f - lavf 57.68.100 - avformat.h
+ Deprecate that demuxers export the stream rotation angle in AVStream.metadata
+ (via an entry named "rotate"). Use av_stream_get_side_data() with
+ AV_PKT_DATA_DISPLAYMATRIX instead, and read the rotation angle with
+ av_display_rotation_get(). The same is done for muxing. Instead of adding a
+ "rotate" entry to AVStream.metadata, AV_PKT_DATA_DISPLAYMATRIX side data has
+ to be added to the AVStream.
+
+2017-03-23 - 7e4ba776a2 - lavc 57.85.101 - avcodec.h
+ vdpau hardware accelerated decoding now supports the new hwaccel API, which
+ can create the decoder context and allocate hardware frame automatically.
+ See AVCodecContext.hw_device_ctx and AVCodecContext.hw_frames_ctx.
+
+2017-03-23 - 156bd8278f - lavc 57.85.100 - avcodec.h
+ Add AVCodecContext.hwaccel_flags field. This will control some hwaccels at
+ a later point.
+
+2017-03-21 - fc9f14c7de - lavf 57.67.100 / 57.08.0 - avio.h
+ Add AVIO_SEEKABLE_TIME flag.
+
+2017-03-21 - d682ae70b4 - lavf 57.66.105, lavc 57.83.101 - avformat.h, avcodec.h
+ Deprecate AVFMT_FLAG_KEEP_SIDE_DATA. It will be ignored after the next major
+ bump, and libavformat will behave as if it were always set.
+ Deprecate av_packet_merge_side_data() and av_packet_split_side_data().
+
+2016-03-20 - 8200b16a9c - lavu 55.50.100 / 55.21.0 - imgutils.h
+ Add av_image_copy_uc_from(), a version of av_image_copy() for copying
+ from GPU mapped memory.
+
+2017-03-20 - 9c2436e - lavu 55.49.100 - pixdesc.h
+ Add AV_PIX_FMT_FLAG_BAYER pixel format flag.
+
+2017-03-18 - 3796fb2692 - lavfi 6.77.100 - avfilter.h
+ Deprecate AVFilterGraph.resample_lavr_opts
+ It's never been used by avfilter nor passed to anything.
+
+2017-02-10 - 1b7ffddb3a - lavu 55.48.100 / 55.33.0 - spherical.h
+ Add AV_SPHERICAL_EQUIRECTANGULAR_TILE, av_spherical_tile_bounds(),
+ and projection-specific properties (bound_left, bound_top, bound_right,
+ bound_bottom, padding) to AVSphericalMapping.
+
+2017-03-02 - ade7c1a232 - lavc 57.81.104 - videotoolbox.h
+ AVVideotoolboxContext.cv_pix_fmt_type can now be set to 0 to output the
+ native decoder format. (The default value is not changed.)
+
+2017-03-02 - 554bc4eea8 - lavu 55.47.101, lavc 57.81.102, lavf 57.66.103
+ Remove requirement to use AVOption or accessors to access certain fields
+ in AVFrame, AVCodecContext, and AVFormatContext that were previously
+ documented as "no direct access" allowed.
+
+2017-02-13 - c1a5fca06f - lavc 57.80.100 - avcodec.h
+ Add AVCodecContext.hw_device_ctx.
+
+2017-02-11 - e3af49b14b - lavu 55.47.100 - frame.h
+ Add AVFrame.opaque_ref.
+
+2017-01-31 - 2eab48177d - lavu 55.46.100 / 55.20.0 - cpu.h
+ Add AV_CPU_FLAG_SSSE3SLOW.
+
+2017-01-24 - c4618f842a - lavu 55.45.100 - channel_layout.h
+ Add av_get_extended_channel_layout()
+
+2017-01-22 - 76c5a69e26 - lavu 55.44.100 - lfg.h
+ Add av_lfg_init_from_data().
+
+2017-01-17 - 2a4a8653b6 - lavc 57.74.100 - vaapi.h
+ Deprecate struct vaapi_context and the vaapi.h installed header.
+ Callers should set AVCodecContext.hw_frames_ctx instead.
+
+2017-01-12 - dbe9dbed31 - lavfi 6.69.100 - buffersink.h
+ Add av_buffersink_get_*() functions.
+
+2017-01-06 - 9488032e10 - lavf 57.62.100 - avio.h
+ Add avio_get_dyn_buf()
+
+2016-12-10 - f542b152aa - lavu 55.43.100 - imgutils.h
+ Add av_image_check_size2()
+
+2016-12-07 - e7a6f8c972 - lavc 57.67.100 / 57.29.0 - avcodec.h
+ Add AV_PKT_DATA_SPHERICAL packet side data to export AVSphericalMapping
+ information from containers.
+
+2016-12-07 - 8f58ecc344 - lavu 55.42.100 / 55.30.0 - spherical.h
+ Add AV_FRAME_DATA_SPHERICAL value, av_spherical_alloc() API and
+ AVSphericalMapping type to export and describe spherical video properties.
+
+2016-11-18 - 2ab50647ff - lavf 57.58.100 - avformat.h
+ Add av_stream_add_side_data().
+
+2016-11-13 - 775a8477b7 - lavu 55.39.100 - hwcontext_vaapi.h
+ Add AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE.
+
+2016-11-13 - a8d51bb424 - lavu 55.38.100 - hwcontext_vaapi.h
+ Add driver quirks field to VAAPI-specific hwdevice and enum with
+ members AV_VAAPI_DRIVER_QUIRK_* to represent its values.
+
+2016-11-10 - 638b216d4f - lavu 55.36.100 - pixfmt.h
+ Add AV_PIX_FMT_GRAY12(LE/BE).
+
+-------- 8< --------- FFmpeg 3.2 was cut here -------- 8< ---------
+
+2016-10-24 - 73ead47 - lavf 57.55.100 - avformat.h
+ Add AV_DISPOSITION_TIMED_THUMBNAILS
+
+2016-10-24 - a246fef - lavf 57.54.100 - avformat.h
+ Add avformat_init_output() and AVSTREAM_INIT_IN_ macros
+
+2016-10-22 - f5495c9 - lavu 55.33.100 - avassert.h
+ Add av_assert0_fpu() / av_assert2_fpu()
+
+2016-10-07 - 3f9137c / 32c8359 - lavc 57.61.100 / 57.24.0 - avcodec.h
+ Decoders now export the frame timestamp as AVFrame.pts. It was
+ previously exported as AVFrame.pkt_pts, which is now deprecated.
+
+ Note: When decoding, AVFrame.pts uses the stream/packet timebase,
+ and not the codec timebase.
+
+2016-09-28 - eba0414 - lavu 55.32.100 / 55.16.0 - hwcontext.h hwcontext_qsv.h
+ Add AV_HWDEVICE_TYPE_QSV and a new installed header with QSV-specific
+ hwcontext definitions.
+
+2016-09-26 - 32c25f0 - lavc 57.59.100 / 57.23.0 - avcodec.h
+ AVCodecContext.hw_frames_ctx now may be used by decoders.
+
+2016-09-27 - f0b6f72 - lavf 57.51.100 - avformat.h
+ Add av_stream_get_codec_timebase()
+
+2016-09-27 - 23c0779 - lswr 2.2.100 - swresample.h
+ Add swr_build_matrix().
+
+2016-09-23 - 30d3e36 - lavc 57.58.100 - avcodec.h
+ Add AV_CODEC_CAP_AVOID_PROBING codec capability flag.
+
+2016-09-14 - ae1dd0c - lavf 57.49.100 - avformat.h
+ Add avformat_transfer_internal_stream_timing_info helper to help with stream
+ copy.
+
+2016-08-29 - 4493390 - lavfi 6.58.100 - avfilter.h
+ Add AVFilterContext.nb_threads.
+
+2016-08-15 - c3c4c72 - lavc 57.53.100 - avcodec.h
+ Add trailing_padding to AVCodecContext to match the corresponding
+ field in AVCodecParameters.
+
+2016-08-15 - b746ed7 - lavc 57.52.100 - avcodec.h
+ Add a new API for chained BSF filters and passthrough (null) BSF --
+ av_bsf_list_alloc(), av_bsf_list_free(), av_bsf_list_append(),
+ av_bsf_list_append2(), av_bsf_list_finalize(), av_bsf_list_parse_str()
+ and av_bsf_get_null_filter().
+
+2016-08-04 - 82a33c8 - lavf 57.46.100 - avformat.h
+ Add av_get_frame_filename2()
+
+2016-07-09 - 775389f / 90f469a - lavc 57.50.100 / 57.20.0 - avcodec.h
+ Add FF_PROFILE_H264_MULTIVIEW_HIGH and FF_PROFILE_H264_STEREO_HIGH.
+
+2016-06-30 - c1c7e0ab - lavf 57.41.100 - avformat.h
+ Moved codecpar field from AVStream to the end of the struct, so that
+ the following private fields are in the same location as in FFmpeg 3.0 (lavf 57.25.100).
+
+2016-06-30 - 042fb69d - lavu 55.28.100 - frame.h
+ Moved hw_frames_ctx field from AVFrame to the end of the struct, so that
+ the following private fields are in the same location as in FFmpeg 3.0 (lavu 55.17.103).
+
+2016-06-29 - 1a751455 - lavfi 6.47.100 - avfilter.h
+ Fix accidental ABI breakage in AVFilterContext.
+ ABI was broken in 8688d3a, lavfi 6.42.100 and released as ffmpeg 3.1.
+
+ Because of this, ffmpeg and ffplay built against lavfi>=6.42.100 will not be
+ compatible with lavfi>=6.47.100. Potentially also affects other users of
+ libavfilter if they are using one of the affected fields.
+
+-------- 8< --------- FFmpeg 3.1 was cut here -------- 8< ---------
+
+2016-06-26 - 481f320 / 1c9e861 - lavu 55.27.100 / 55.13.0 - hwcontext.h
+ Add av_hwdevice_ctx_create().
+
+2016-06-26 - b95534b / e47b8bb - lavc 57.48.101 / 57.19.1 - avcodec.h
+ Adjust values for JPEG 2000 profiles.
+
+2016-06-23 - 5d75e46 / db7968b - lavf 57.40.100 / 57.7.0 - avio.h
+ Add AVIODataMarkerType, write_data_type, ignore_boundary_point and
+ avio_write_marker.
+
+2016-06-23 - abb3cc4 / 0c4468d - lavu 55.26.100 / 55.12.0 - opt.h
+ Add av_stereo3d_type_name() and av_stereo3d_from_name().
+
+2016-06-22 - 3689efe / c46db38 - lavu 55.25.100 / 55.11.0 - hwcontext_dxva2.h
+ Add new installed header with DXVA2-specific hwcontext definitions.
+
+2016-04-27 - fb91871 - lavu 55.23.100 - log.h
+ Add a new function av_log_format_line2() which returns number of bytes
+ written to the target buffer.
+
+2016-04-21 - 7fc329e - lavc 57.37.100 - avcodec.h
+ Add a new audio/video encoding and decoding API with decoupled input
+ and output -- avcodec_send_packet(), avcodec_receive_frame(),
+ avcodec_send_frame() and avcodec_receive_packet().
+
+2016-04-17 - af9cac1 / 33d1898 - lavc 57.35.100 / 57.15.0 - avcodec.h
+ Add a new bitstream filtering API working with AVPackets.
+ Deprecate the old bitstream filtering API.
+
+2016-04-14 - 8688d3a / 07a844f - lavfi 6.42.100 / 6.3.0 - avfilter.h
+ Add AVFilterContext.hw_device_ctx.
+
+2016-04-14 - 28abb21 / 551c677 - lavu 55.22.100 / 55.9.0 - hwcontext_vaapi.h
+ Add new installed header with VAAPI-specific hwcontext definitions.
+
+2016-04-14 - afccfaf / b1f01e8 - lavu 55.21.100 / 55.7.0 - hwcontext.h
+ Add AVHWFramesConstraints and associated API.
+
+2016-04-11 - 6f69f7a / 9200514 - lavf 57.33.100 / 57.5.0 - avformat.h
+ Add AVStream.codecpar, deprecate AVStream.codec.
+
+2016-04-02 - e8a9b64 - lavu 55.20.100 - base64.h
+ Add AV_BASE64_DECODE_SIZE(x) macro.
+
+2016-xx-xx - lavc 57.33.100 / 57.14.0 - avcodec.h
+ f9b1cf1 / 998e1b8 - Add AVCodecParameters and its related API.
+ e6053b3 / a806834 - Add av_get_audio_frame_duration2().
+
+2016-03-11 - 6d8ab35 - lavf/lavc 57.28.101
+ Add requirement to bitstream filtering API that returned packets with
+ size == 0 and side_data_elems == 0 are to be skipped by the caller.
+
+2016-03-04 - 9362973 - lavf 57.28.100
+ Add protocol blacklisting API
+
+2016-02-28 - 4dd4d53 - lavc 57.27.101
+ Validate AVFrame returned by get_buffer2 to have required
+ planes not NULL and unused planes set to NULL as crashes
+ and buffer overflow are possible with certain streams if
+ that is not the case.
+
+2016-02-26 - 30e7685 - lavc 57.27.100 - avcodec.h
+ "flags2" decoding option now allows the flag "ass_ro_flush_noop" preventing
+ the reset of the ASS ReadOrder field on flush. This affects the content of
+ AVSubtitles.rects[N]->ass when "sub_text_format" is set to "ass" (see
+ previous entry).
+
+2016-02-26 - 2941282 - lavc 57.26.100 - avcodec.h
+ Add a "sub_text_format" subtitles decoding option allowing the values "ass"
+ (recommended) and "ass_with_timings" (not recommended, deprecated, default).
+ The default value for this option will change to "ass" at the next major
+ libavcodec version bump.
+
+ The current default is "ass_with_timings" for compatibility. This means that
+ all subtitles text decoders currently still output ASS with timings printed
+ as strings in the AVSubtitles.rects[N]->ass fields.
+
+ Setting "sub_text_format" to "ass" allows a better timing accuracy (ASS
+ timing is limited to a 1/100 time base, so this is relevant for any subtitles
+ format needing a bigger one), ease timing adjustments, and prevents the need
+ of removing the timing from the decoded string yourself. This form is also
+ known as "the Matroska form". The timing information (start time, duration)
+ can be found in the AVSubtitles fields.
+
+2016-02-24 - 7e49cdd / 7b3214d0 - lavc 57.25.100 / 57.13.0 - avcodec.h
+ Add AVCodecContext.hw_frames_ctx.
+
+2016-02-24 - 1042402 / b3dd30d - lavfi 6.36.100 / 6.2.0 - avfilter.h
+ avfilter.h - Add AVFilterLink.hw_frames_ctx.
+ buffersrc.h - Add AVBufferSrcParameters and functions for handling it.
+
+2016-02-23 - 14f7a3d - lavc 57.25.100
+ Add AV_PKT_DATA_MPEGTS_STREAM_ID for exporting the MPEGTS stream ID.
+
+2016-02-18 - 08acab8 - lavu 55.18.100 - audio_fifo.h
+ Add av_audio_fifo_peek_at().
+
+2016-xx-xx - lavu 55.18.100 / 55.6.0
+ 26abd51 / 721a4ef buffer.h - Add av_buffer_pool_init2().
+ 1a70878 / 89923e4 hwcontext.h - Add a new installed header hwcontext.h with a new API
+ for handling hwaccel frames.
+ 6992276 / ad884d1 hwcontext_cuda.h - Add a new installed header hwcontext_cuda.h with
+ CUDA-specific hwcontext definitions.
+ d779d8d / a001ce3 hwcontext_vdpau.h - Add a new installed header hwcontext_vdpau.h with
+ VDPAU-specific hwcontext definitions.
+ 63c3e35 / 7bc780c pixfmt.h - Add AV_PIX_FMT_CUDA.
+
+-------- 8< --------- FFmpeg 3.0 was cut here -------- 8< ---------
+
+2016-02-10 - bc9a596 / 9f61abc - lavf 57.25.100 / 57.3.0 - avformat.h
+ Add AVFormatContext.opaque, io_open and io_close, allowing custom IO
+
+2016-02-01 - 1dba837 - lavf 57.24.100 - avformat.h, avio.h
+ Add protocol_whitelist to AVFormatContext, AVIOContext
+
+2016-01-31 - 66e9d2f - lavu 55.17.100 - frame.h
+ Add AV_FRAME_DATA_GOP_TIMECODE for exporting MPEG1/2 GOP timecodes.
+
+2016-01-01 - 5e8b053 / 2c68113 - lavc 57.21.100 / 57.12.0 - avcodec.h
+ Add AVCodecDescriptor.profiles and avcodec_profile_name().
+
+2015-12-28 - 1f9139b - lavf 57.21.100 - avformat.h
+ Add automatic bitstream filtering; add av_apply_bitstream_filters()
+
+2015-12-22 - 39a09e9 - lavfi 6.21.101 - avfilter.h
+ Deprecate avfilter_link_set_closed().
+ Applications are not supposed to mess with links,
+ they should close the sinks.
+
+2015-12-17 - lavc 57.18.100 / 57.11.0 - avcodec.h dirac.h
+ xxxxxxx - Add av_packet_add_side_data().
+ xxxxxxx - Add AVCodecContext.coded_side_data.
+ xxxxxxx - Add AVCPBProperties API.
+ xxxxxxx - Add a new public header dirac.h containing
+ av_dirac_parse_sequence_header()
+
+2015-12-11 - 676a93f - lavf 57.20.100 - avformat.h
+ Add av_program_add_stream_index()
+
+2015-11-29 - 93fb4a4 - lavc 57.16.101 - avcodec.h
+ Deprecate rtp_callback without replacement, i.e. it won't be possible to
+ get image slices before the full frame is encoded any more. The libavformat
+ rtpenc muxer can still be used for RFC-2190 packetization.
+
+2015-11-22 - fe20e34 - lavc 57.16.100 - avcodec.h
+ Add AV_PKT_DATA_FALLBACK_TRACK for making fallback associations between
+ streams.
+
+2015-11-22 - ad317c9 - lavf 57.19.100 - avformat.h
+ Add av_stream_new_side_data().
+
+2015-11-22 - e12f403 - lavu 55.8.100 - xtea.h
+ Add av_xtea_le_init and av_xtea_le_crypt
+
+2015-11-18 - lavu 55.7.100 - mem.h
+ Add av_fast_mallocz()
+
+2015-10-29 - lavc 57.12.100 / 57.8.0 - avcodec.h
+ xxxxxx - Deprecate av_free_packet(). Use av_packet_unref() as replacement,
+ it resets the packet in a more consistent way.
+ xxxxxx - Deprecate av_dup_packet(), it is a no-op for most cases.
+ Use av_packet_ref() to make a non-refcounted AVPacket refcounted.
+ xxxxxx - Add av_packet_alloc(), av_packet_clone(), av_packet_free().
+ They match the AVFrame functions with the same name.
+
+2015-10-27 - 1e477a9 - lavu 55.5.100 - cpu.h
+ Add AV_CPU_FLAG_AESNI.
+
+2015-10-22 - ee573b4 / a17a766 - lavc 57.9.100 / 57.5.0 - avcodec.h
+ Add data and linesize array to AVSubtitleRect, to be used instead of
+ the ones from the embedded AVPicture.
+
+2015-10-22 - 866a417 / dc923bc - lavc 57.8.100 / 57.0.0 - qsv.h
+ Add an API for allocating opaque surfaces.
+
+2015-10-15 - 2c2d162 - lavf 57.4.100
+ Remove the latm demuxer that was a duplicate of the loas demuxer.
+
+2015-10-14 - b994788 / 11c5f43 - lavu 55.4.100 / 55.2.0 - dict.h
+ Change return type of av_dict_copy() from void to int, so that a proper
+ error code can be reported.
+
+2015-09-29 - b01891a / 948f3c1 - lavc 57.3.100 / 57.2.0 - avcodec.h
+ Change type of AVPacket.duration from int to int64_t.
+
+2015-09-17 - 7c46f24 / e3d4784 - lavc 57.3.100 / 57.2.0 - d3d11va.h
+ Add av_d3d11va_alloc_context(). This function must from now on be used for
+ allocating AVD3D11VAContext.
+
+2015-09-15 - lavf 57.2.100 - avformat.h
+ probesize and max_analyze_duration switched to 64bit, both
+ are only accessible through AVOptions
+
+2015-09-15 - lavf 57.1.100 - avformat.h
+ bit_rate was changed to 64bit, make sure you update any
+ printf() or other type sensitive code
+
+2015-09-15 - lavc 57.2.100 - avcodec.h
+ bit_rate/rc_max_rate/rc_min_rate were changed to 64bit, make sure you update
+ any printf() or other type sensitive code
+
+2015-09-07 - lavu 55.0.100 / 55.0.0
+ c734b34 / b8b5d82 - Change type of AVPixFmtDescriptor.flags from uint8_t to uint64_t.
+ f53569a / 6b3ef7f - Change type of AVComponentDescriptor fields from uint16_t to int
+ and drop bit packing.
+ 151aa2e / 2268db2 - Add step, offset, and depth to AVComponentDescriptor to replace
+ the deprecated step_minus1, offset_plus1, and depth_minus1.
+
+-------- 8< --------- FFmpeg 2.8 was cut here -------- 8< ---------
+
+2015-08-27 - 1dd854e1 - lavc 56.58.100 - vaapi.h
+ Deprecate old VA-API context (vaapi_context) fields that were only
+ set and used by libavcodec. They are all managed internally now.
+
+2015-08-19 - 9f8e57ef - lavu 54.31.100 - pixfmt.h
+ Add a unique pixel format for VA-API (AV_PIX_FMT_VAAPI) that
+ indicates the nature of the underlying storage: a VA surface. This
+ yields the same value as AV_PIX_FMT_VAAPI_VLD.
+ Deprecate old VA-API related pixel formats: AV_PIX_FMT_VAAPI_MOCO,
+ AV_PIX_FMT_VAAPI_IDCT, AV_PIX_FMT_VAAPI_VLD.
+
+2015-08-02 - lavu 54.30.100 / 54.17.0
+ 9ed59f1 / 7a7df34c - Add av_blowfish_alloc().
+ a130ec9 / ae365453 - Add av_rc4_alloc().
+ 9ca1997 / 5d8bea3b - Add av_xtea_alloc().
+ 3cf08e9 / d9e8b47e - Add av_des_alloc().
+
+2015-07-27 - lavc 56.56.100 / 56.35.0 - avcodec.h
+ 94d68a4 / 7c6eb0a1 - Rename CODEC_FLAG* defines to AV_CODEC_FLAG*.
+ 444e987 / def97856 - Rename CODEC_CAP_* defines to AV_CODEC_CAP_*.
+ 29d147c / 059a9348 - Rename FF_INPUT_BUFFER_PADDING_SIZE and FF_MIN_BUFFER_SIZE
+ to AV_INPUT_BUFFER_PADDING_SIZE and AV_INPUT_BUFFER_MIN_SIZE.
+
+2015-07-22 - c40ecff - lavc 56.51.100 - avcodec.h
+ Add AV_PKT_DATA_QUALITY_STATS to export the quality value, PSNR, and pict_type
+ of an AVPacket.
+
+2015-07-16 - 8dad213 - lavc 56.49.100
+ Add av_codec_get_codec_properties(), FF_CODEC_PROPERTY_LOSSLESS
+ and FF_CODEC_PROPERTY_CLOSED_CAPTIONS
+
+2015-07-03 - d563e13 / 83212943 - lavu 54.28.100 / 56.15.0
+ Add av_version_info().
+
+-------- 8< --------- FFmpeg 2.7 was cut here -------- 8< ---------
+
+2015-06-04 - cc17b43 - lswr 1.2.100
+ Add swr_get_out_samples()
+
+2015-05-27 - c312bfa - lavu 54.26.100 - cpu.h
+ Add AV_CPU_FLAG_AVXSLOW.
+
+2015-05-26 - 1fb9b2a - lavu 54.25.100 - rational.h
+ Add av_q2intfloat().
+
+2015-05-13 - cc48409 / e7c5e17 - lavc 56.39.100 / 56.23.0
+ Add av_vda_default_init2.
+
+2015-05-11 - 541d75f - lavf 56.33.100 - avformat.h
+ Add AVOpenCallback AVFormatContext.open_cb
+
+2015-05-07 - a7dd933 - 56.38.100 - avcodec.h
+ Add av_packet_side_data_name().
+
+2015-05-07 - 01e59d4 - 56.37.102 - avcodec.h
+ Add FF_PROFILE_VP9_2 and FF_PROFILE_VP9_3.
+
+2015-05-04 - 079b7f6 - 56.37.100 - avcodec.h
+ Add FF_PROFILE_VP9_0 and FF_PROFILE_VP9_1.
+
+2015-04-22 - 748d481 - lavf 56.31.100 - avformat.h
+ Add AVFMT_FLAG_FAST_SEEK flag. Some formats (initially mp3) use it to enable
+ fast, but inaccurate seeking.
+
+2015-04-20 - 8e8219e / c253340 - lavu 54.23.100 / 54.12.0 - log.h
+ Add AV_LOG_TRACE for extremely verbose debugging.
+
+2015-04-02 - 26e0e393 - lavf 56.29.100 - avio.h
+ Add AVIODirEntryType.AVIO_ENTRY_SERVER.
+ Add AVIODirEntryType.AVIO_ENTRY_SHARE.
+ Add AVIODirEntryType.AVIO_ENTRY_WORKGROUP.
+
+2015-03-31 - 3188696 - 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.
+
+ 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-03-29 - 268ff17 / c484561 - lavu 54.21.100 / 54.10.0 - pixfmt.h
+ Add AV_PIX_FMT_MMAL for MMAL hardware acceleration.
+
+2015-03-19 - 11fe56c - 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.
+
+2015-02-19 - e375511 / 5b1d9ce - lavu 54.19.100 / 54.9.0
+ Add AV_PIX_FMT_QSV for QSV hardware acceleration.
+
+2015-02-14 - ba22295 - lavc 56.21.102
+ Deprecate VIMA decoder.
+
+2015-01-27 - 62a82c6 / 728685f - lavc 56.21.100 / 56.12.0, lavu 54.18.100 / 54.8.0 - avcodec.h, frame.h
+ Add AV_PKT_DATA_AUDIO_SERVICE_TYPE and AV_FRAME_DATA_AUDIO_SERVICE_TYPE for
+ storing the audio service type as side data.
+
+2015-01-16 - a47c933 - lavf 56.19.100 - avformat.h
+ Add data_codec and data_codec_id for storing codec of data stream
+
+2015-01-11 - 007c33d - lavd 56.4.100 - avdevice.h
+ Add avdevice_list_input_sources().
+ Add avdevice_list_output_sinks().
+
+2014-12-25 - d7aaeea / c220a60 - lavc 56.19.100 / 56.10.0 - vdpau.h
+ Add av_vdpau_get_surface_parameters().
+
+2014-12-25 - ddb9a24 / 6c99c92 - lavc 56.18.100 / 56.9.0 - avcodec.h
+ Add AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH flag to av_vdpau_bind_context().
+
+2014-12-25 - d16079a / 57b6704 - lavc 56.17.100 / 56.8.0 - avcodec.h
+ Add AVCodecContext.sw_pix_fmt.
+
+2014-12-04 - 6e9ac02 - lavc 56.14.100 - dv_profile.h
+ Add av_dv_codec_profile2().
+
+-------- 8< --------- FFmpeg 2.5 was cut here -------- 8< ---------
+
+2014-11-21 - ab922f9 - lavu 54.15.100 - dict.h
+ Add av_dict_get_string().
+
+2014-11-18 - a54a51c - lavu 54.14.100 - float_dsp.h
+ Add avpriv_float_dsp_alloc().
+
+2014-11-16 - 6690d4c3 - lavf 56.13.100 - avformat.h
+ Add AVStream.recommended_encoder_configuration with accessors.
+
+2014-11-16 - bee5844d - lavu 54.13.100 - opt.h
+ Add av_opt_serialize().
+
+2014-11-16 - eec69332 - lavu 54.12.100 - opt.h
+ Add av_opt_is_set_to_default().
+
+2014-11-06 - 44fa267 / 5e80fb7 - lavc 56.11.100 / 56.6.0 - vorbis_parser.h
+ Add a public API for parsing vorbis packets.
+
+2014-10-15 - 17085a0 / 7ea1b34 - lavc 56.7.100 / 56.5.0 - avcodec.h
+ Replace AVCodecContext.time_base used for decoding
+ with AVCodecContext.framerate.
+
+2014-10-15 - 51c810e / d565fef1 - lavc 56.6.100 / 56.4.0 - avcodec.h
+ Add AV_HWACCEL_FLAG_IGNORE_LEVEL flag to av_vdpau_bind_context().
+
+2014-10-13 - da21895 / 2df0c32e - lavc 56.5.100 / 56.3.0 - avcodec.h
+ Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
+ for audio encoding.
+
+2014-10-08 - bb44f7d / 5a419b2 - lavu 54.10.100 / 54.4.0 - pixdesc.h
+ Add API to return the name of frame and context color properties.
+
+2014-10-06 - a61899a / e3e158e - lavc 56.3.100 / 56.2.0 - vdpau.h
+ Add av_vdpau_bind_context(). This function should now be used for creating
+ (or resetting) a AVVDPAUContext instead of av_vdpau_alloc_context().
+
+2014-10-02 - cdd6f05 - lavc 56.2.100 - avcodec.h
+2014-10-02 - cdd6f05 - lavu 54.9.100 - frame.h
+ Add AV_FRAME_DATA_SKIP_SAMPLES. Add lavc CODEC_FLAG2_SKIP_MANUAL and
+ AVOption "skip_manual", which makes lavc export skip information via
+ AV_FRAME_DATA_SKIP_SAMPLES AVFrame side data, instead of skipping and
+ discarding samples automatically.
+
+2014-10-02 - 0d92b0d - lavu 54.8.100 - avstring.h
+ Add av_match_list()
+
+2014-09-24 - ac68295 - libpostproc 53.1.100
+ Add visualization support
+
+2014-09-19 - 6edd6a4 - lavc 56.1.101 - dv_profile.h
+ deprecate avpriv_dv_frame_profile2(), which was made public by accident.
+
+
+-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
+
+2014-08-25 - 215db29 / b263f8f - lavf 56.3.100 / 56.3.0 - avformat.h
+ Add AVFormatContext.max_ts_probe.
+
+2014-08-28 - f30a815 / 9301486 - lavc 56.1.100 / 56.1.0 - avcodec.h
+ Add AV_PKT_DATA_STEREO3D to export container-level stereo3d information.
+
+2014-08-23 - 8fc9bd0 - lavu 54.7.100 - dict.h
+ AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL arguments are now
+ freed even on error. This is consistent with the behaviour all users
+ of it we could find expect.
+
+2014-08-21 - 980a5b0 - lavu 54.6.100 - frame.h motion_vector.h
+ Add AV_FRAME_DATA_MOTION_VECTORS side data and AVMotionVector structure
+
+2014-08-16 - b7d5e01 - lswr 1.1.100 - swresample.h
+ Add AVFrame based API
+
+2014-08-16 - c2829dc - lavu 54.4.100 - dict.h
+ Add av_dict_set_int helper function.
+
+2014-08-13 - c8571c6 / 8ddc326 - lavu 54.3.100 / 54.3.0 - mem.h
+ Add av_strndup().
+
+2014-08-13 - 2ba4577 / a8c104a - lavu 54.2.100 / 54.2.0 - opt.h
+ Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support
+ dictionary types being set as options.
+
+2014-08-13 - afbd4b7e09 - lavf 56.01.0 - avformat.h
+ Add AVFormatContext.event_flags and AVStream.event_flags for signaling to
+ the user when events happen in the file/stream.
+
+2014-08-10 - 78eaaa8 / fb1ddcd - lavr 2.1.0 - avresample.h
+ Add avresample_convert_frame() and avresample_config().
+
+2014-08-10 - 78eaaa8 / fb1ddcd - lavu 54.1.100 / 54.1.0 - error.h
+ Add AVERROR_INPUT_CHANGED and AVERROR_OUTPUT_CHANGED.
+
+2014-08-08 - 3841f2a / d35b94f - lavc 55.73.102 / 55.57.4 - avcodec.h
+ Deprecate FF_IDCT_XVIDMMX define and xvidmmx idct option.
+ Replaced by FF_IDCT_XVID and xvid respectively.
+
+2014-08-08 - 5c3c671 - lavf 55.53.100 - avio.h
+ Add avio_feof() and deprecate url_feof().
+
+2014-08-07 - bb789016d4 - lsws 2.1.3 - swscale.h
+ sws_getContext is not going to be removed in the future.
+
+2014-08-07 - a561662 / ad1ee5f - lavc 55.73.101 / 55.57.3 - avcodec.h
+ reordered_opaque is not going to be removed in the future.
+
+2014-08-02 - 28a2107 - lavu 52.98.100 - pixelutils.h
+ Add pixelutils API with SAD functions
+
+2014-08-04 - 6017c98 / e9abafc - lavu 52.97.100 / 53.22.0 - pixfmt.h
+ Add AV_PIX_FMT_YA16 pixel format for 16 bit packed gray with alpha.
+
+2014-08-04 - 4c8bc6f / e96c3b8 - lavu 52.96.101 / 53.21.1 - avstring.h
+ Rename AV_PIX_FMT_Y400A to AV_PIX_FMT_YA8 to better identify the format.
+ An alias pixel format and color space name are provided for compatibility.
+
+2014-08-04 - 073c074 / d2962e9 - lavu 52.96.100 / 53.21.0 - pixdesc.h
+ Support name aliases for pixel formats.
+
+2014-08-03 - 71d008e / 1ef9e83 - lavc 55.72.101 / 55.57.2 - avcodec.h
+2014-08-03 - 71d008e / 1ef9e83 - lavu 52.95.100 / 53.20.0 - frame.h
+ Deprecate AVCodecContext.dtg_active_format and use side-data instead.
+
+2014-08-03 - e680c73 - lavc 55.72.100 - avcodec.h
+ Add get_pixels() to AVDCT
+
+2014-08-03 - 9400603 / 9f17685 - lavc 55.71.101 / 55.57.1 - avcodec.h
+ Deprecate unused FF_IDCT_IPP define and ipp avcodec option.
+ Deprecate unused FF_DEBUG_PTS define and pts avcodec option.
+ Deprecate unused FF_CODER_TYPE_DEFLATE define and deflate avcodec option.
+ Deprecate unused FF_DCT_INT define and int avcodec option.
+ Deprecate unused avcodec option scenechange_factor.
+
+2014-07-30 - ba3e331 - lavu 52.94.100 - frame.h
+ Add av_frame_side_data_name()
+
+2014-07-29 - 80a3a66 / 3a19405 - lavf 56.01.100 / 56.01.0 - avformat.h
+ Add mime_type field to AVProbeData, which now MUST be initialized in
+ order to avoid uninitialized reads of the mime_type pointer, likely
+ leading to crashes.
+ Typically, this means you will do 'AVProbeData pd = { 0 };' instead of
+ 'AVProbeData pd;'.
+
+2014-07-29 - 31e0b5d / 69e7336 - lavu 52.92.100 / 53.19.0 - avstring.h
+ Make name matching function from lavf public as av_match_name().
+
+2014-07-28 - 2e5c8b0 / c5fca01 - lavc 55.71.100 / 55.57.0 - avcodec.h
+ Add AV_CODEC_PROP_REORDER to mark codecs supporting frame reordering.
+
+2014-07-27 - ff9a154 - lavf 55.50.100 - avformat.h
+ New field int64_t probesize2 instead of deprecated
+ field int probesize.
+
+2014-07-27 - 932ff70 - lavc 55.70.100 - avdct.h
+ Add AVDCT / avcodec_dct_alloc() / avcodec_dct_init().
+
+2014-07-23 - 8a4c086 - lavf 55.49.100 - avio.h
+ Add avio_read_to_bprint()
+
+
+-------- 8< --------- FFmpeg 2.3 was cut here -------- 8< ---------
+
+2014-07-14 - 62227a7 - lavf 55.47.100 - avformat.h
+ Add av_stream_get_parser()
+
+2014-07-09 - c67690f / a54f03b - lavu 52.92.100 / 53.18.0 - display.h
+ Add av_display_matrix_flip() to flip the transformation matrix.
+
+2014-07-09 - 1b58f13 / f6ee61f - lavc 55.69.100 / 55.56.0 - dv_profile.h
+ Add a public API for DV profile handling.
+
+2014-06-20 - 0dceefc / 9e500ef - lavu 52.90.100 / 53.17.0 - imgutils.h
+ Add av_image_check_sar().
+
+2014-06-20 - 4a99333 / 874390e - lavc 55.68.100 / 55.55.0 - avcodec.h
+ Add av_packet_rescale_ts() to simplify timestamp conversion.
+
+2014-06-18 - ac293b6 / 194be1f - lavf 55.44.100 / 55.20.0 - avformat.h
+ The proper way for providing a hint about the desired timebase to the muxers
+ is now setting AVStream.time_base, instead of AVStream.codec.time_base as was
+ done previously. The old method is now deprecated.
+
+2014-06-11 - 67d29da - lavc 55.66.101 - avcodec.h
+ Increase FF_INPUT_BUFFER_PADDING_SIZE to 32 due to some corner cases needing
+ it
+
+2014-06-10 - 5482780 - lavf 55.43.100 - avformat.h
+ New field int64_t max_analyze_duration2 instead of deprecated
+ int max_analyze_duration.
+
+2014-05-30 - 00759d7 - lavu 52.89.100 - opt.h
+ Add av_opt_copy()
+
+2014-06-01 - 03bb99a / 0957b27 - lavc 55.66.100 / 55.54.0 - avcodec.h
+ Add AVCodecContext.side_data_only_packets to allow encoders to output packets
+ with only side data. This option may become mandatory in the future, so all
+ users are recommended to update their code and enable this option.
+
+2014-06-01 - 6e8e9f1 / 8c02adc - lavu 52.88.100 / 53.16.0 - frame.h, pixfmt.h
+ Move all color-related enums (AVColorPrimaries, AVColorSpace, AVColorRange,
+ AVColorTransferCharacteristic, and AVChromaLocation) inside lavu.
+ And add AVFrame fields for them.
+
+2014-05-29 - bdb2e80 / b2d4565 - lavr 1.3.0 - avresample.h
+ Add avresample_max_output_samples
+
+2014-05-28 - d858ee7 / 6d21259 - lavf 55.42.100 / 55.19.0 - avformat.h
+ Add strict_std_compliance and related AVOptions to support experimental
+ muxing.
+
+2014-05-26 - 55cc60c - lavu 52.87.100 - threadmessage.h
+ Add thread message queue API.
+
+2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
+ Add format_probesize to AVFormatContext.
+
+2014-05-20 - 7d25af1 / c23c96b - lavf 55.39.100 / 55.18.0 - avformat.h
+ Add av_stream_get_side_data() to access stream-level side data
+ in the same way as av_packet_get_side_data().
+
+2014-05-20 - 7336e39 - lavu 52.86.100 - fifo.h
+ Add av_fifo_alloc_array() function.
+
+2014-05-19 - ef1d4ee / bddd8cb - lavu 52.85.100 / 53.15.0 - frame.h, display.h
+ Add AV_FRAME_DATA_DISPLAYMATRIX for exporting frame-level
+ spatial rendering on video frames for proper display.
+
+2014-05-19 - ef1d4ee / bddd8cb - lavc 55.64.100 / 55.53.0 - avcodec.h
+ Add AV_PKT_DATA_DISPLAYMATRIX for exporting packet-level
+ spatial rendering on video frames for proper display.
+
+2014-05-19 - 999a99c / a312f71 - lavf 55.38.101 / 55.17.1 - avformat.h
+ Deprecate AVStream.pts and the AVFrac struct, which was its only use case.
+ See use av_stream_get_end_pts()
+
+2014-05-18 - 68c0518 / fd05602 - lavc 55.63.100 / 55.52.0 - avcodec.h
+ Add avcodec_free_context(). From now on it should be used for freeing
+ AVCodecContext.
+
+2014-05-17 - 0eec06e / 1bd0bdc - lavu 52.84.100 / 54.5.0 - time.h
+ Add av_gettime_relative() av_gettime_relative_is_monotonic()
+
+2014-05-15 - eacf7d6 / 0c1959b - lavf 55.38.100 / 55.17.0 - avformat.h
+ Add AVFMT_FLAG_BITEXACT flag. Muxers now use it instead of checking
+ CODEC_FLAG_BITEXACT on the first stream.
+
+2014-05-15 - 96cb4c8 - lswr 0.19.100 - swresample.h
+ Add swr_close()
+
+2014-05-11 - 14aef38 / 66e6c8a - lavu 52.83.100 / 53.14.0 - pixfmt.h
+ Add AV_PIX_FMT_VDA for new-style VDA acceleration.
+
+2014-05-07 - 351f611 - lavu 52.82.100 - fifo.h
+ Add av_fifo_freep() function.
+
+2014-05-02 - ba52fb11 - lavu 52.81.100 - opt.h
+ Add av_opt_set_dict2() function.
+
+2014-05-01 - e77b985 / a2941c8 - lavc 55.60.103 / 55.50.3 - avcodec.h
+ Deprecate CODEC_FLAG_MV0. It is replaced by the flag "mv0" in the
+ "mpv_flags" private option of the mpegvideo encoders.
+
+2014-05-01 - e40ae8c / 6484149 - lavc 55.60.102 / 55.50.2 - avcodec.h
+ Deprecate CODEC_FLAG_GMC. It is replaced by the "gmc" private option of the
+ libxvid encoder.
+
+2014-05-01 - 1851643 / b2c3171 - lavc 55.60.101 / 55.50.1 - avcodec.h
+ Deprecate CODEC_FLAG_NORMALIZE_AQP. It is replaced by the flag "naq" in the
+ "mpv_flags" private option of the mpegvideo encoders.
+
+2014-05-01 - cac07d0 / 5fcceda - avcodec.h
+ Deprecate CODEC_FLAG_INPUT_PRESERVED. Its functionality is replaced by passing
+ reference-counted frames to encoders.
+
+2014-04-30 - 617e866 - lavu 52.81.100 - pixdesc.h
+ Add av_find_best_pix_fmt_of_2(), av_get_pix_fmt_loss()
+ Deprecate avcodec_get_pix_fmt_loss(), avcodec_find_best_pix_fmt_of_2()
+
+2014-04-29 - 1bf6396 - lavc 55.60.100 - avcodec.h
+ Add AVCodecDescriptor.mime_types field.
+
+2014-04-29 - b804eb4 - lavu 52.80.100 - hash.h
+ Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64().
+
+2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h
+ Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs.
+
+2014-04-22 - 502512e /dac7e8a - lavu 53.13.0 / 52.78.100 - avutil.h
+ Add av_get_time_base_q().
+
+2014-04-17 - a8d01a7 / 0983d48 - lavu 53.12.0 / 52.77.100 - crc.h
+ Add AV_CRC_16_ANSI_LE crc variant.
+
+2014-04-15 - ef818d8 - lavf 55.37.101 - avformat.h
+ Add av_format_inject_global_side_data()
+
+2014-04-12 - 4f698be - lavu 52.76.100 - log.h
+ Add av_log_get_flags()
+
+2014-04-11 - 6db42a2b - lavd 55.12.100 - avdevice.h
+ Add avdevice_capabilities_create() function.
+ Add avdevice_capabilities_free() function.
+
+2014-04-07 - 0a1cc04 / 8b17243 - lavu 52.75.100 / 53.11.0 - pixfmt.h
+ Add AV_PIX_FMT_YVYU422 pixel format.
+
+2014-04-04 - c1d0536 / 8542f9c - lavu 52.74.100 / 53.10.0 - replaygain.h
+ Full scale for peak values is now 100000 (instead of UINT32_MAX) and values
+ may overflow.
+
+2014-04-03 - c16e006 / 7763118 - lavu 52.73.100 / 53.9.0 - log.h
+ Add AV_LOG(c) macro to have 256 color debug messages.
+
+2014-04-03 - eaed4da9 - lavu 52.72.100 - opt.h
+ Add AV_OPT_MULTI_COMPONENT_RANGE define to allow return
+ multi-component option ranges.
+
+2014-03-29 - cd50a44b - lavu 52.70.100 - mem.h
+ Add av_dynarray_add_nofree() function.
+
+2014-02-24 - 3e1f241 / d161ae0 - lavu 52.69.100 / 53.8.0 - frame.h
+ Add av_frame_remove_side_data() for removing a single side data
+ instance from a frame.
+
+2014-03-24 - 83e8978 / 5a7e35d - lavu 52.68.100 / 53.7.0 - frame.h, replaygain.h
+ Add AV_FRAME_DATA_REPLAYGAIN for exporting replaygain tags.
+ Add a new header replaygain.h with the AVReplayGain struct.
+
+2014-03-24 - 83e8978 / 5a7e35d - lavc 55.54.100 / 55.36.0 - avcodec.h
+ Add AV_PKT_DATA_REPLAYGAIN for exporting replaygain tags.
+
+2014-03-24 - 595ba3b / 25b3258 - lavf 55.35.100 / 55.13.0 - avformat.h
+ Add AVStream.side_data and AVStream.nb_side_data for exporting stream-global
+ side data (e.g. replaygain tags, video rotation)
+
+2014-03-24 - bd34e26 / 0e2c3ee - lavc 55.53.100 / 55.35.0 - avcodec.h
+ Give the name AVPacketSideData to the previously anonymous struct used for
+ AVPacket.side_data.
+
+
+-------- 8< --------- FFmpeg 2.2 was cut here -------- 8< ---------
+
+2014-03-18 - 37c07d4 - lsws 2.5.102
+ Make gray16 full-scale.
+
+2014-03-16 - 6b1ca17 / 1481d24 - lavu 52.67.100 / 53.6.0 - pixfmt.h
+ Add RGBA64_LIBAV pixel format and variants for compatibility
+
+2014-03-11 - 3f3229c - lavf 55.34.101 - avformat.h
+ Set AVFormatContext.start_time_realtime when demuxing.
+
+2014-03-03 - 06fed440 - lavd 55.11.100 - avdevice.h
+ Add av_input_audio_device_next().
+ Add av_input_video_device_next().
+ Add av_output_audio_device_next().
+ Add av_output_video_device_next().
+
+2014-02-24 - fff5262 / 1155fd0 - lavu 52.66.100 / 53.5.0 - frame.h
+ Add av_frame_copy() for copying the frame data.
+
+2014-02-24 - a66be60 - lswr 0.18.100 - swresample.h
+ Add swr_is_initialized() for checking whether a resample context is initialized.
+
+2014-02-22 - 5367c0b / 7e86c27 - lavr 1.2.0 - avresample.h
+ Add avresample_is_open() for checking whether a resample context is open.
+
+2014-02-19 - 6a24d77 / c3ecd96 - lavu 52.65.100 / 53.4.0 - opt.h
+ Add AV_OPT_FLAG_EXPORT and AV_OPT_FLAG_READONLY to mark options meant (only)
+ for reading.
+
+2014-02-19 - f4c8d00 / 6bb8720 - lavu 52.64.101 / 53.3.1 - opt.h
+ Deprecate unused AV_OPT_FLAG_METADATA.
+
+2014-02-16 - 81c3f81 - lavd 55.10.100 - avdevice.h
+ Add avdevice_list_devices() and avdevice_free_list_devices()
+
+2014-02-16 - db3c970 - lavf 55.33.100 - avio.h
+ Add avio_find_protocol_name() to find out the name of the protocol that would
+ be selected for a given URL.
+
+2014-02-15 - a2bc6c1 / c98f316 - lavu 52.64.100 / 53.3.0 - frame.h
+ Add AV_FRAME_DATA_DOWNMIX_INFO value to the AVFrameSideDataType enum and
+ downmix_info.h API, which identify downmix-related metadata.
+
+2014-02-11 - 1b05ac2 - lavf 55.32.100 - avformat.h
+ Add av_write_uncoded_frame() and av_interleaved_write_uncoded_frame().
+
+2014-02-04 - 3adb5f8 / d9ae103 - lavf 55.30.100 / 55.11.0 - avformat.h
+ Add AVFormatContext.max_interleave_delta for controlling amount of buffering
+ when interleaving.
+
+2014-02-02 - 5871ee5 - lavf 55.29.100 - avformat.h
+ Add output_ts_offset muxing option to AVFormatContext.
+
+2014-01-27 - 102bd64 - lavd 55.7.100 - avdevice.h
+ lavf 55.28.100 - avformat.h
+ Add avdevice_dev_to_app_control_message() function.
+
+2014-01-27 - 7151411 - lavd 55.6.100 - avdevice.h
+ lavf 55.27.100 - avformat.h
+ Add avdevice_app_to_dev_control_message() function.
+
+2014-01-24 - 86bee79 - lavf 55.26.100 - avformat.h
+ Add AVFormatContext option metadata_header_padding to allow control over the
+ amount of padding added.
+
+2014-01-20 - eef74b2 / 93c553c - lavc 55.48.102 / 55.32.1 - avcodec.h
+ Edges are not required anymore on video buffers allocated by get_buffer2()
+ (i.e. as if the CODEC_FLAG_EMU_EDGE flag was always on). Deprecate
+ CODEC_FLAG_EMU_EDGE and avcodec_get_edge_width().
+
+2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h
+ Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags().
+
+2014-01-19 - 3532dd5 - lavu 52.63.100 - rational.h
+ Add av_make_q() function.
+
+2014-01-05 - 4cf4da9 / 5b4797a - lavu 52.62.100 / 53.2.0 - frame.h
+ Add AV_FRAME_DATA_MATRIXENCODING value to the AVFrameSideDataType enum, which
+ identifies AVMatrixEncoding data.
+
+2014-01-05 - 751385f / 5c437fb - lavu 52.61.100 / 53.1.0 - channel_layout.h
+ Add values for various Dolby flags to the AVMatrixEncoding enum.
+
+2014-01-04 - b317f94 - lavu 52.60.100 - mathematics.h
+ Add av_add_stable() function.
+
+2013-12-22 - 911676c - lavu 52.59.100 - avstring.h
+ Add av_strnlen() function.
+
+2013-12-09 - 64f73ac - lavu 52.57.100 - opencl.h
+ Add av_opencl_benchmark() function.
+
+2013-11-30 - 82b2e9c - lavu 52.56.100 - ffversion.h
+ Moves version.h to libavutil/ffversion.h.
+ Install ffversion.h and make it public.
+
+2013-12-11 - 29c83d2 / b9fb59d,409a143 / 9431356,44967ab / d7b3ee9 - lavc 55.45.101 / 55.28.1 - avcodec.h
+ av_frame_alloc(), av_frame_unref() and av_frame_free() now can and should be
+ used instead of avcodec_alloc_frame(), avcodec_get_frame_defaults() and
+ avcodec_free_frame() respectively. The latter three functions are deprecated.
+
+2013-12-09 - 7a60348 / 7e244c6- - lavu 52.58.100 / 52.20.0 - frame.h
+ Add AV_FRAME_DATA_STEREO3D value to the AVFrameSideDataType enum and
+ stereo3d.h API, that identify codec-independent stereo3d information.
+
+2013-11-26 - 625b290 / 1eaac1d- - lavu 52.55.100 / 52.19.0 - frame.h
+ Add AV_FRAME_DATA_A53_CC value to the AVFrameSideDataType enum, which
+ identifies ATSC A53 Part 4 Closed Captions data.
+
+2013-11-22 - 6859065 - lavu 52.54.100 - avstring.h
+ Add av_utf8_decode() function.
+
+2013-11-22 - fb7d70c - lavc 55.44.100 - avcodec.h
+ Add HEVC profiles
+
+2013-11-20 - c28b61c - lavc 55.44.100 - avcodec.h
+ Add av_packet_{un,}pack_dictionary()
+ Add AV_PKT_METADATA_UPDATE side data type, used to transmit key/value
+ strings between a stream and the application.
+
+2013-11-14 - 7c888ae / cce3e0a - lavu 52.53.100 / 52.18.0 - mem.h
+ Move av_fast_malloc() and av_fast_realloc() for libavcodec to libavutil.
+
+2013-11-14 - b71e4d8 / 8941971 - lavc 55.43.100 / 55.27.0 - avcodec.h
+ Deprecate AVCodecContext.error_rate, it is replaced by the 'error_rate'
+ private option of the mpegvideo encoder family.
+
+2013-11-14 - 31c09b7 / 728c465 - lavc 55.42.100 / 55.26.0 - vdpau.h
+ Add av_vdpau_get_profile().
+ Add av_vdpau_alloc_context(). This function must from now on be
+ used for allocating AVVDPAUContext.
+
+2013-11-04 - be41f21 / cd8f772 - lavc 55.41.100 / 55.25.0 - avcodec.h
+ lavu 52.51.100 - frame.h
+ Add ITU-R BT.2020 and other not yet included values to color primaries,
+ transfer characteristics and colorspaces.
+
+2013-11-04 - 85cabf1 - lavu 52.50.100 - avutil.h
+ Add av_fopen_utf8()
+
+2013-10-31 - 78265fc / 28096e0 - lavu 52.49.100 / 52.17.0 - frame.h
+ Add AVFrame.flags and AV_FRAME_FLAG_CORRUPT.
+
+
+-------- 8< --------- FFmpeg 2.1 was cut here -------- 8< ---------
+
+2013-10-27 - dbe6f9f - lavc 55.39.100 - avcodec.h
+ Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2.
+
+2013-10-27 - d61617a - lavu 52.48.100 - parseutils.h
+ Add av_get_known_color_name().
+
+2013-10-17 - 8696e51 - lavu 52.47.100 - opt.h
+ Add AV_OPT_TYPE_CHANNEL_LAYOUT and channel layout option handlers
+ av_opt_get_channel_layout() and av_opt_set_channel_layout().
+
+2013-10-06 - ccf96f8 -libswscale 2.5.101 - options.c
+ Change default scaler to bicubic
+
+2013-10-03 - e57dba0 - lavc 55.34.100 - avcodec.h
+ Add av_codec_get_max_lowres()
+
+2013-10-02 - 5082fcc - lavf 55.19.100 - avformat.h
+ Add audio/video/subtitle AVCodec fields to AVFormatContext to force specific
+ decoders
+
+2013-09-28 - 7381d31 / 0767bfd - lavfi 3.88.100 / 3.11.0 - avfilter.h
+ Add AVFilterGraph.execute and AVFilterGraph.opaque for custom slice threading
+ implementations.
+
+2013-09-21 - 85f8a3c / e208e6d - lavu 52.46.100 / 52.16.0 - pixfmt.h
+ Add interleaved 4:2:2 8/10-bit formats AV_PIX_FMT_NV16 and
+ AV_PIX_FMT_NV20.
+
+2013-09-16 - c74c3fb / 3feb3d6 - lavu 52.44.100 / 52.15.0 - mem.h
+ Add av_reallocp.
+
+2013-09-04 - 3e1f507 - lavc 55.31.101 - avcodec.h
+ avcodec_close() argument can be NULL.
+
+2013-09-04 - 36cd017a - lavf 55.16.101 - avformat.h
+ avformat_close_input() argument can be NULL and point on NULL.
+
+2013-08-29 - e31db62 - lavf 55.15.100 - avformat.h
+ Add av_format_get_probe_score().
+
+2013-08-15 - 1e0e193 - lsws 2.5.100 -
+ Add a sws_dither AVOption, allowing to set the dither algorithm used
+
+2013-08-11 - d404fe35 - lavc 55.27.100 - vdpau.h
+ Add a render2 alternative to the render callback function.
+
+2013-08-11 - af05edc - lavc 55.26.100 - vdpau.h
+ Add allocation function for AVVDPAUContext, allowing
+ to extend it in the future without breaking ABI/API.
+
+2013-08-10 - 67a580f / 5a9a9d4 - lavc 55.25.100 / 55.16.0 - avcodec.h
+ Extend AVPacket API with av_packet_unref, av_packet_ref,
+ av_packet_move_ref, av_packet_copy_props, av_packet_free_side_data.
+
+2013-08-05 - 9547e3e / f824535 - lavc 55.22.100 / 55.13.0 - avcodec.h
+ Deprecate the bitstream-related members from struct AVVDPAUContext.
+ The bitstream buffers no longer need to be explicitly freed.
+
+2013-08-05 - 3b805dc / 549294f - lavc 55.21.100 / 55.12.0 - avcodec.h
+ Deprecate the CODEC_CAP_HWACCEL_VDPAU codec capability. Use CODEC_CAP_HWACCEL
+ and select the AV_PIX_FMT_VDPAU format with get_format() instead.
+
+2013-08-05 - 4ee0984 / a0ad5d0 - lavu 52.41.100 / 52.14.0 - pixfmt.h
+ Deprecate AV_PIX_FMT_VDPAU_*. Use AV_PIX_FMT_VDPAU instead.
+
+2013-08-02 - 82fdfe8 / a8b1927 - lavc 55.20.100 / 55.11.0 - avcodec.h
+ Add output_picture_number to AVCodecParserContext.
+
+2013-07-23 - abc8110 - lavc 55.19.100 - avcodec.h
+ Add avcodec_chroma_pos_to_enum()
+ Add avcodec_enum_to_chroma_pos()
+
+
+-------- 8< --------- FFmpeg 2.0 was cut here -------- 8< ---------
+
+2013-07-03 - 838bd73 - lavfi 3.78.100 - avfilter.h
+ Deprecate avfilter_graph_parse() in favor of the equivalent
+ avfilter_graph_parse_ptr().
+
+2013-06-24 - af5f9c0 / 95d5246 - lavc 55.17.100 / 55.10.0 - avcodec.h
+ Add MPEG-2 AAC profiles
+
+2013-06-25 - af5f9c0 / 95d5246 - lavf 55.10.100 - avformat.h
+ Add AV_DISPOSITION_* flags to indicate text track kind.
+
+2013-06-15 - 99b8cd0 - lavu 52.36.100
+ Add AVRIPEMD:
+ av_ripemd_alloc()
+ av_ripemd_init()
+ av_ripemd_update()
+ av_ripemd_final()
+
+2013-06-10 - 82ef670 - lavu 52.35.101 - hmac.h
+ Add AV_HMAC_SHA224, AV_HMAC_SHA256, AV_HMAC_SHA384, AV_HMAC_SHA512
+
+2013-06-04 - 30b491f / fc962d4 - lavu 52.35.100 / 52.13.0 - mem.h
+ Add av_realloc_array and av_reallocp_array
+
+2013-05-30 - 682b227 - lavu 52.35.100
+ Add AVSHA512:
+ av_sha512_alloc()
+ av_sha512_init()
+ av_sha512_update()
+ av_sha512_final()
+
+2013-05-24 - 8d4e969 / 129bb23 - lavfi 3.10.0 / 3.70.100 - avfilter.h
+ Add support for slice multithreading to lavfi. Filters supporting threading
+ are marked with AVFILTER_FLAG_SLICE_THREADS.
+ New fields AVFilterContext.thread_type, AVFilterGraph.thread_type and
+ AVFilterGraph.nb_threads (accessible directly or through AVOptions) may be
+ used to configure multithreading.
+
+2013-05-24 - fe40a9f / 2a6eaea - lavu 52.12.0 / 52.34.100 - cpu.h
+ Add av_cpu_count() function for getting the number of logical CPUs.
+
+2013-05-24 - 0c25c39 / b493847 - lavc 55.7.0 / 55.12.100 - avcodec.h
+ Add picture_structure to AVCodecParserContext.
+
+2013-05-17 - 3a751ea - lavu 52.33.100 - opt.h
+ Add AV_OPT_TYPE_COLOR value to AVOptionType enum.
+
+2013-05-13 - e398416 - lavu 52.31.100 - mem.h
+ Add av_dynarray2_add().
+
+2013-05-12 - 1776177 - lavfi 3.65.100
+ Add AVFILTER_FLAG_SUPPORT_TIMELINE* filter flags.
+
+2013-04-19 - 380cfce - lavc 55.4.100
+ Add AV_CODEC_PROP_TEXT_SUB property for text based subtitles codec.
+
+2013-04-18 - 7c1a002 - lavf 55.3.100
+ The matroska demuxer can now output proper verbatim ASS packets. It will
+ become the default starting lavf 56.0.100.
+
+2013-04-10 - af0d270 - lavu 25.26.100 - avutil.h,opt.h
+ Add av_int_list_length()
+ and av_opt_set_int_list().
+
+2013-03-30 - 5c73645 - lavu 52.24.100 - samplefmt.h
+ Add av_samples_alloc_array_and_samples().
+
+2013-03-29 - ef7b6b4 - lavf 55.1.100 - avformat.h
+ Add av_guess_frame_rate()
+
+2013-03-20 - 8d928a9 - lavu 52.22.100 - opt.h
+ Add AV_OPT_TYPE_DURATION value to AVOptionType enum.
+
+2013-03-17 - 7aa9af5 - lavu 52.20.100 - opt.h
+ Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum.
+
+
+-------- 8< --------- FFmpeg 1.2 was cut here -------- 8< ---------
+
+2013-03-07 - 9767ec6 - lavu 52.18.100 - avstring.h,bprint.h
+ Add av_escape() and av_bprint_escape() API.
+
+2013-02-24 - b59cd08 - lavfi 3.41.100 - buffersink.h
+ Add sample_rates field to AVABufferSinkParams.
+
+2013-01-17 - a1a707f - lavf 54.61.100
+ Add av_codec_get_tag2().
+
+2013-01-01 - 2eb2e17 - lavfi 3.34.100
+ Add avfilter_get_audio_buffer_ref_from_arrays_channels.
+
+
+-------- 8< --------- FFmpeg 1.1 was cut here -------- 8< ---------
+
+2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h
+ Add AVFilterLink.channels, avfilter_link_get_channels()
+ and avfilter_ref_get_channels().
+
+2012-12-15 - 96d815fc - lavc 54.80.100 - avcodec.h
+ Add pkt_size field to AVFrame.
+
+2012-11-25 - c70ec631 - lavu 52.9.100 - opt.h
+ Add the following convenience functions to opt.h:
+ av_opt_get_image_size
+ av_opt_get_pixel_fmt
+ av_opt_get_sample_fmt
+ av_opt_set_image_size
+ av_opt_set_pixel_fmt
+ av_opt_set_sample_fmt
+
+2012-11-17 - 4cd74c81 - lavu 52.8.100 - bprint.h
+ Add av_bprint_strftime().
+
+2012-11-15 - 92648107 - lavu 52.7.100 - opt.h
+ Add av_opt_get_key_value().
+
+2012-11-13 - 79456652 - lavfi 3.23.100 - avfilter.h
+ Add channels field to AVFilterBufferRefAudioProps.
+
+2012-11-03 - 481fdeee - lavu 52.3.100 - opt.h
+ Add AV_OPT_TYPE_SAMPLE_FMT value to AVOptionType enum.
+
+2012-10-21 - 6fb2fd8 - lavc 54.68.100 - avcodec.h
+ lavfi 3.20.100 - avfilter.h
+ Add AV_PKT_DATA_STRINGS_METADATA side data type, used to transmit key/value
+ strings between AVPacket and AVFrame, and add metadata field to
+ AVCodecContext (which shall not be accessed by users; see AVFrame metadata
+ instead).
+
+2012-09-27 - a70b493 - lavd 54.3.100 - version.h
+ Add LIBAVDEVICE_IDENT symbol.
+
+2012-09-27 - a70b493 - lavfi 3.18.100 - version.h
+ Add LIBAVFILTER_IDENT symbol.
+
+2012-09-27 - a70b493 - libswr 0.16.100 - version.h
+ Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD
+ and LIBSWRESAMPLE_IDENT symbols.
+
+
+-------- 8< --------- FFmpeg 1.0 was cut here -------- 8< ---------
+
+2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h
+ Add av_small_strptime() time parsing function.
+
+ Can be used as a stripped-down replacement for strptime(), on
+ systems which do not support it.
+
+2012-08-25 - 2626cc4 - lavf 54.28.100
+ Matroska demuxer now identifies SRT subtitles as AV_CODEC_ID_SUBRIP instead
+ of AV_CODEC_ID_TEXT.
+
+2012-08-13 - 5c0d8bc - lavfi 3.8.100 - avfilter.h
+ Add avfilter_get_class() function, and priv_class field to AVFilter
+ struct.
+
+2012-08-12 - a25346e - lavu 51.69.100 - opt.h
+ Add AV_OPT_FLAG_FILTERING_PARAM symbol in opt.h.
+
+2012-07-31 - 23fc4dd - lavc 54.46.100
+ Add channels field to AVFrame.
+
+2012-07-30 - f893904 - lavu 51.66.100
+ Add av_get_channel_description()
+ and av_get_standard_channel_layout() functions.
+
+2012-07-21 - 016a472 - lavc 54.43.100
+ Add decode_error_flags field to AVFrame.
+
+2012-07-20 - b062936 - lavf 54.18.100
+ Add avformat_match_stream_specifier() function.
+
+2012-07-14 - f49ec1b - lavc 54.38.100 - avcodec.h
+ Add metadata to AVFrame, and the accessor functions
+ av_frame_get_metadata() and av_frame_set_metadata().
+
+2012-07-10 - 0e003d8 - lavc 54.33.100
+ Add av_fast_padded_mallocz().
+
+2012-07-10 - 21d5609 - lavfi 3.2.0 - avfilter.h
+ Add init_opaque() callback to AVFilter struct.
+
+2012-06-26 - e6674e4 - lavu 51.63.100 - imgutils.h
+ Add functions to libavutil/imgutils.h:
+ av_image_get_buffer_size()
+ av_image_fill_arrays()
+ av_image_copy_to_buffer()
+
+2012-06-24 - c41899a - lavu 51.62.100 - version.h
+ version moved from avutil.h to version.h
+
+2012-04-11 - 359abb1 - lavu 51.58.100 - error.h
+ Add av_make_error_string() and av_err2str() utilities to
+ libavutil/error.h.
+
+2012-06-05 - 62b39d4 - lavc 54.24.100
+ Add pkt_duration field to AVFrame.
+
+2012-05-24 - f2ee065 - lavu 51.54.100
+ Move AVPALETTE_SIZE and AVPALETTE_COUNT macros from
+ libavcodec/avcodec.h to libavutil/pixfmt.h.
+
+2012-05-14 - 94a9ac1 - lavf 54.5.100
+ Add av_guess_sample_aspect_ratio() function.
+
+2012-04-20 - 65fa7bc - lavfi 2.70.100
+ Add avfilter_unref_bufferp() to avfilter.h.
+
+2012-04-13 - 162e400 - lavfi 2.68.100
+ Install libavfilter/asrc_abuffer.h public header.
+
+2012-03-26 - a67d9cf - lavfi 2.66.100
+ Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions.
+
+2013-05-15 - ff46809 / e6c4ac7 - lavu 52.32.100 / 52.11.0 - pixdesc.h
+ Replace PIX_FMT_* flags with AV_PIX_FMT_FLAG_*.
+
+2013-04-03 - 6fc58a8 / 507b1e4 - lavc 55.7.100 / 55.4.0 - avcodec.h
+ Add field_order to AVCodecParserContext.
+
+2013-04-19 - f4b05cd / 5e83d9a - lavc 55.5.100 / 55.2.0 - avcodec.h
+ Add CODEC_FLAG_UNALIGNED to allow decoders to produce unaligned output.
+
+2013-04-11 - lavfi 3.53.100 / 3.8.0
+ 231fd44 / 38f0c07 - Move all content from avfiltergraph.h to avfilter.h. Deprecate
+ avfilterhraph.h, user applications should include just avfilter.h
+ 86070b8 / bc1a985 - Add avfilter_graph_alloc_filter(), deprecate avfilter_open() and
+ avfilter_graph_add_filter().
+ 4fde705 / 1113672 - Add AVFilterContext.graph pointing to the AVFilterGraph that contains the
+ filter.
+ 710b0aa / 48a5ada - Add avfilter_init_str(), deprecate avfilter_init_filter().
+ 46de9ba / 1ba95a9 - Add avfilter_init_dict().
+ 16fc24b / 7cdd737 - Add AVFilter.flags field and AVFILTER_FLAG_DYNAMIC_{INPUTS,OUTPUTS} flags.
+ f4db6bf / 7e8fe4b - Add avfilter_pad_count() for counting filter inputs/outputs.
+ 835cc0f / fa2a34c - Add avfilter_next(), deprecate av_filter_next().
+ Deprecate avfilter_uninit().
+
+2013-04-09 - lavfi 3.51.100 / 3.7.0 - avfilter.h
+ 0594ef0 / b439c99 - Add AVFilter.priv_class for exporting filter options through the
+ AVOptions API in the similar way private options work in lavc and lavf.
+ 44d4488 / 8114c10 - Add avfilter_get_class().
+ Switch all filters to use AVOptions.
+
+2013-03-19 - 17ebef2 / 2c328a9 - lavu 52.20.100 / 52.9.0 - pixdesc.h
+ Add av_pix_fmt_count_planes() function for counting planes in a pixel format.
+
+2013-03-16 - ecade98 / 42c7c61 - lavfi 3.47.100 / 3.6.0
+ Add AVFilterGraph.nb_filters, deprecate AVFilterGraph.filter_count.
+
+2013-03-08 - Reference counted buffers - lavu 52.8.0, lavc 55.0.100 / 55.0.0, lavf 55.0.100 / 55.0.0,
+lavd 54.4.100 / 54.0.0, lavfi 3.5.0
+ 36099df / 8e401db, 532f31a / 1cec062 - add a new API for reference counted buffers and buffer
+ pools (new header libavutil/buffer.h).
+ 2653e12 / 1afddbe - add AVPacket.buf to allow reference counting for the AVPacket data.
+ Add av_packet_from_data() function for constructing packets from
+ av_malloc()ed data.
+ c4e8821 / 7ecc2d4 - move AVFrame from lavc to lavu (new header libavutil/frame.h), add
+ AVFrame.buf/extended_buf to allow reference counting for the AVFrame
+ data. Add new API for working with reference-counted AVFrames.
+ 80e9e63 / 759001c - add the refcounted_frames field to AVCodecContext to make audio and
+ video decoders return reference-counted frames. Add get_buffer2()
+ callback to AVCodecContext which allocates reference-counted frames.
+ Add avcodec_default_get_buffer2() as the default get_buffer2()
+ implementation.
+ Deprecate AVCodecContext.get_buffer() / release_buffer() /
+ reget_buffer(), avcodec_default_get_buffer(),
+ avcodec_default_reget_buffer(), avcodec_default_release_buffer().
+ Remove avcodec_default_free_buffers(), which should not have ever
+ been called from outside of lavc.
+ Deprecate the following AVFrame fields:
+ * base -- is now stored in AVBufferRef
+ * reference, type, buffer_hints -- are unnecessary in the new API
+ * hwaccel_picture_private, owner, thread_opaque -- should not
+ have been accessed from outside of lavc
+ * qscale_table, qstride, qscale_type, mbskip_table, motion_val,
+ mb_type, dct_coeff, ref_index -- mpegvideo-specific tables,
+ which are not exported anymore.
+ a05a44e / 7e35037 - switch libavfilter to use AVFrame instead of AVFilterBufferRef. Add
+ av_buffersrc_add_frame(), deprecate av_buffersrc_buffer().
+ Add av_buffersink_get_frame() and av_buffersink_get_samples(),
+ deprecate av_buffersink_read() and av_buffersink_read_samples().
+ Deprecate AVFilterBufferRef and all functions for working with it.
+
+2013-03-17 - 6c17ff8 / 12c5c1d - lavu 52.19.100 / 52.8.0 - avstring.h
+ Add av_isdigit, av_isgraph, av_isspace, av_isxdigit.
+
+2013-02-23 - 71cf094 / 9f12235 - lavfi 3.40.100 / 3.4.0 - avfiltergraph.h
+ Add resample_lavr_opts to AVFilterGraph for setting libavresample options
+ for auto-inserted resample filters.
+
+2013-01-25 - e7e14bc / 38c1466 - lavu 52.17.100 / 52.7.0 - dict.h
+ Add av_dict_parse_string() to set multiple key/value pairs at once from a
+ string.
+
+2013-01-25 - 25be630 / b85a5e8 - lavu 52.16.100 / 52.6.0 - avstring.h
+ Add av_strnstr()
+
+2013-01-15 - e7e0186 / 8ee288d - lavu 52.15.100 / 52.5.0 - hmac.h
+ Add AVHMAC.
+
+2013-01-13 - 8ee7b38 / 44e065d - lavc 54.87.100 / 54.36.0 - vdpau.h
+ Add AVVDPAUContext struct for VDPAU hardware-accelerated decoding.
+
+2013-01-12 - dae382b / 169fb94 - lavu 52.14.100 / 52.4.0 - pixdesc.h
+ Add AV_PIX_FMT_VDPAU flag.
+
+2013-01-07 - 249fca3 / 074a00d - lavr 1.1.0
+ Add avresample_set_channel_mapping() for input channel reordering,
+ duplication, and silencing.
+
+2012-12-29 - lavu 52.13.100 / 52.3.0 - avstring.h
+ 2ce43b3 / d8fd06c - Add av_basename() and av_dirname().
+ e13d5e9 / c1a02e8 - Add av_pix_fmt_get_chroma_sub_sample and deprecate
+ avcodec_get_chroma_sub_sample.
+
+2012-11-11 - 03b0787 / 5980f5d - lavu 52.6.100 / 52.2.0 - audioconvert.h
+ Rename audioconvert.h to channel_layout.h. audioconvert.h is now deprecated.
+
+2012-10-21 - e3a91c5 / a893655 - lavu 51.77.100 / 51.45.0 - error.h
+ Add AVERROR_EXPERIMENTAL
+
+2012-10-12 - a33ed6b / d2fcb35 - lavu 51.76.100 / 51.44.0 - pixdesc.h
+ Add functions for accessing pixel format descriptors.
+ Accessing the av_pix_fmt_descriptors array directly is now
+ deprecated.
+
+2012-10-11 - f391e40 / 9a92aea - lavu 51.75.100 / 51.43.0 - aes.h, md5.h, sha.h, tree.h
+ Add functions for allocating the opaque contexts for the algorithms,
+
+2012-10-10 - de31814 / b522000 - lavf 54.32.100 / 54.18.0 - avio.h
+ Add avio_closep to complement avio_close.
+
+2012-10-08 - ae77266 / 78071a1 - lavu 51.74.100 / 51.42.0 - pixfmt.h
+ Rename PixelFormat to AVPixelFormat and all PIX_FMT_* to AV_PIX_FMT_*.
+ To provide backwards compatibility, PixelFormat is now #defined as
+ AVPixelFormat.
+ Note that this can break user code that includes pixfmt.h and uses the
+ 'PixelFormat' identifier. Such code should either #undef PixelFormat
+ or stop using the PixelFormat name.
+
+2012-10-05 - 55c49af / e7ba5b1 - lavr 1.0.0 - avresample.h
+ Data planes parameters to avresample_convert() and
+ avresample_read() are now uint8_t** instead of void**.
+ Libavresample is now stable.
+
+2012-09-26 - 3ba0dab7 / 1384df64 - lavf 54.29.101 / 56.06.3 - avformat.h
+ Add AVFormatContext.avoid_negative_ts.
+
+2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
+ Add avcodec_free_frame(). This function must now
+ be used for freeing an AVFrame.
+
+2012-09-12 - e3e09f2 / 8919fee - lavu 51.73.100 / 51.41.0 - audioconvert.h
+ Added AV_CH_LOW_FREQUENCY_2 channel mask value.
+
+2012-09-04 - b21b5b0 / 686a329 - lavu 51.71.100 / 51.40.0 - opt.h
+ Reordered the fields in default_val in AVOption, changed which
+ default_val field is used for which AVOptionType.
+
+2012-08-30 - 98298eb / a231832 - lavc 54.54.101 / 54.26.1 - avcodec.h
+ Add codec descriptor properties AV_CODEC_PROP_LOSSY and
+ AV_CODEC_PROP_LOSSLESS.
+
+2012-08-18 - lavc 54.26 - avcodec.h
+ Add codec descriptors for accessing codec properties without having
+ to refer to a specific decoder or encoder.
+
+ f5f3684 / c223d79 - Add an AVCodecDescriptor struct and functions
+ avcodec_descriptor_get() and avcodec_descriptor_next().
+ f5f3684 / 51efed1 - Add AVCodecDescriptor.props and AV_CODEC_PROP_INTRA_ONLY.
+ 6c180b3 / 91e59fe - Add avcodec_descriptor_get_by_name().
+
+2012-08-08 - f5f3684 / 987170c - lavu 51.68.100 / 51.38.0 - dict.h
+ Add av_dict_count().
+
+2012-08-07 - 7a72695 / 104e10f - lavc 54.51.100 / 54.25.0 - avcodec.h
+ Rename CodecID to AVCodecID and all CODEC_ID_* to AV_CODEC_ID_*.
+ To provide backwards compatibility, CodecID is now #defined as AVCodecID.
+ Note that this can break user code that includes avcodec.h and uses the
+ 'CodecID' identifier. Such code should either #undef CodecID or stop using the
+ CodecID name.
+
+2012-08-03 - e776ee8 / 239fdf1 - lavu 51.66.101 / 51.37.1 - cpu.h
+ lsws 2.1.1 - swscale.h
+ Rename AV_CPU_FLAG_MMX2 ---> AV_CPU_FLAG_MMXEXT.
+ Rename SWS_CPU_CAPS_MMX2 ---> SWS_CPU_CAPS_MMXEXT.
+
+2012-07-29 - 7c26761 / 681ed00 - lavf 54.22.100 / 54.13.0 - avformat.h
+ Add AVFMT_FLAG_NOBUFFER for low latency use cases.
+
+2012-07-10 - fbe0245 / f3e5e6f - lavu 51.65.100 / 51.37.0
+ Add av_malloc_array() and av_mallocz_array()
+
+2012-06-22 - e847f41 / d3d3a32 - lavu 51.61.100 / 51.34.0
+ Add av_usleep()
+
+2012-06-20 - 4da42eb / ae0a301 - lavu 51.60.100 / 51.33.0
+ Move av_gettime() to libavutil, add libavutil/time.h
+
+2012-06-09 - 82edf67 / 3971be0 - lavr 0.0.3
+ Add a parameter to avresample_build_matrix() for Dolby/DPLII downmixing.
+
+2012-06-12 - c7b9eab / 9baeff9 - lavfi 2.79.100 / 2.23.0 - avfilter.h
+ Add AVFilterContext.nb_inputs/outputs. Deprecate
+ AVFilterContext.input/output_count.
+
+2012-06-12 - c7b9eab / 84b9fbe - lavfi 2.79.100 / 2.22.0 - avfilter.h
+ Add avfilter_pad_get_type() and avfilter_pad_get_name(). Those
+ should now be used instead of accessing AVFilterPad members
+ directly.
+
+2012-06-12 - 3630a07 / b0f0dfc - lavu 51.57.100 / 51.32.0 - audioconvert.h
+ Add av_get_channel_layout_channel_index(), av_get_channel_name()
+ and av_channel_layout_extract_channel().
+
+2012-05-25 - 53ce990 / 154486f - lavu 51.55.100 / 51.31.0 - opt.h
+ Add av_opt_set_bin()
+
+2012-05-15 - lavfi 2.74.100 / 2.17.0
+ Add support for audio filters
+ 61930bd / ac71230, 1cbf7fb / a2cd9be - add video/audio buffer sink in a new installed
+ header buffersink.h
+ 1cbf7fb / 720c6b7 - add av_buffersrc_write_frame(), deprecate
+ av_vsrc_buffer_add_frame()
+ 61930bd / ab16504 - add avfilter_copy_buf_props()
+ 61930bd / 9453c9e - add extended_data to AVFilterBuffer
+ 61930bd / 1b8c927 - add avfilter_get_audio_buffer_ref_from_arrays()
+
+2012-05-09 - lavu 51.53.100 / 51.30.0 - samplefmt.h
+ 61930bd / 142e740 - add av_samples_copy()
+ 61930bd / 6d7f617 - add av_samples_set_silence()
+
+2012-05-09 - 61930bd / a5117a2 - lavc 54.21.101 / 54.13.1
+ For audio formats with fixed frame size, the last frame
+ no longer needs to be padded with silence, libavcodec
+ will handle this internally (effectively all encoders
+ behave as if they had CODEC_CAP_SMALL_LAST_FRAME set).
+
+2012-05-07 - 653d117 / 828bd08 - lavc 54.20.100 / 54.13.0 - avcodec.h
+ Add sample_rate and channel_layout fields to AVFrame.
+
+2012-05-01 - 2330eb1 / 4010d72 - lavr 0.0.1
+ Change AV_MIX_COEFF_TYPE_Q6 to AV_MIX_COEFF_TYPE_Q8.
+
+2012-04-25 - e890b68 / 3527a73 - lavu 51.48.100 / 51.29.0 - cpu.h
+ Add av_parse_cpu_flags()
+
+2012-04-24 - 3ead79e / c8af852 - lavr 0.0.0
+ Add libavresample audio conversion library
+
+2012-04-20 - 3194ab7 / 0c0d1bc - lavu 51.47.100 / 51.28.0 - audio_fifo.h
+ Add audio FIFO functions:
+ av_audio_fifo_free()
+ av_audio_fifo_alloc()
+ av_audio_fifo_realloc()
+ av_audio_fifo_write()
+ av_audio_fifo_read()
+ av_audio_fifo_drain()
+ av_audio_fifo_reset()
+ av_audio_fifo_size()
+ av_audio_fifo_space()
+
+2012-04-14 - lavfi 2.70.100 / 2.16.0 - avfiltergraph.h
+ 7432bcf / d7bcc71 Add avfilter_graph_parse2().
+
+2012-04-08 - 6bfb304 / 4d693b0 - lavu 51.46.100 / 51.27.0 - samplefmt.h
+ Add av_get_packed_sample_fmt() and av_get_planar_sample_fmt()
+
+2012-03-21 - b75c67d - lavu 51.43.100
+ Add bprint.h for bprint API.
+
+2012-02-21 - 9cbf17e - lavc 54.4.100
+ Add av_get_pcm_codec() function.
+
+2012-02-16 - 560b224 - libswr 0.7.100
+ Add swr_set_matrix() function.
+
+2012-02-09 - c28e7af - lavu 51.39.100
+ Add a new installed header libavutil/timestamp.h with timestamp
+ utilities.
+
+2012-02-06 - 70ffda3 - lavu 51.38.100
+ Add av_parse_ratio() function to parseutils.h.
+
+2012-02-06 - 70ffda3 - lavu 51.38.100
+ Add AV_LOG_MAX_OFFSET macro to log.h.
+
+2012-02-02 - 0eaa123 - lavu 51.37.100
+ Add public timecode helpers.
+
+2012-01-24 - 0c3577b - lavfi 2.60.100
+ Add avfilter_graph_dump.
+
+2012-03-20 - 0ebd836 / 3c90cc2 - lavfo 54.2.0
+ Deprecate av_read_packet(), use av_read_frame() with
+ AVFMT_FLAG_NOPARSE | AVFMT_FLAG_NOFILLIN in AVFormatContext.flags
+
+2012-03-05 - lavc 54.10.100 / 54.8.0
+ f095391 / 6699d07 Add av_get_exact_bits_per_sample()
+ f095391 / 9524cf7 Add av_get_audio_frame_duration()
+
+2012-03-04 - 2af8f2c / 44fe77b - lavc 54.8.100 / 54.7.0 - avcodec.h
+ Add av_codec_is_encoder/decoder().
+
+2012-03-01 - 1eb7f39 / 442c132 - lavc 54.5.100 / 54.3.0 - avcodec.h
+ Add av_packet_shrink_side_data.
+
+2012-02-29 - 79ae084 / dd2a4bc - lavf 54.2.100 / 54.2.0 - avformat.h
+ Add AVStream.attached_pic and AV_DISPOSITION_ATTACHED_PIC,
+ used for dealing with attached pictures/cover art.
+
+2012-02-25 - 305e4b3 / c9bca80 - lavu 51.41.100 / 51.24.0 - error.h
+ Add AVERROR_UNKNOWN
+ NOTE: this was backported to 0.8
+
+2012-02-20 - eadd426 / e9cda85 - lavc 54.2.100 / 54.2.0
+ Add duration field to AVCodecParserContext
+
+2012-02-20 - eadd426 / 0b42a93 - lavu 51.40.100 / 51.23.1 - mathematics.h
+ Add av_rescale_q_rnd()
+
+2012-02-08 - f2b20b7 / 38d5533 - lavu 51.38.101 / 51.22.1 - pixdesc.h
+ Add PIX_FMT_PSEUDOPAL flag.
+
+2012-02-08 - f2b20b7 / 52f82a1 - lavc 54.2.100 / 54.1.0
+ Add avcodec_encode_video2() and deprecate avcodec_encode_video().
+
+2012-02-01 - 4c677df / 316fc74 - lavc 54.1.0
+ Add av_fast_padded_malloc() as alternative for av_realloc() when aligned
+ memory is required. The buffer will always have FF_INPUT_BUFFER_PADDING_SIZE
+ zero-padded bytes at the end.
+
+2012-01-31 - a369a6b / dd6d3b0 - lavf 54.1.0
+ Add avformat_get_riff_video_tags() and avformat_get_riff_audio_tags().
+ NOTE: this was backported to 0.8
+
+2012-01-31 - a369a6b / af08d9a - lavc 54.1.0
+ Add avcodec_is_open() function.
+ NOTE: this was backported to 0.8
+
+2012-01-30 - 151ecc2 / 8b93312 - lavu 51.36.100 / 51.22.0 - intfloat.h
+ Add a new installed header libavutil/intfloat.h with int/float punning
+ functions.
+ NOTE: this was backported to 0.8
+
+2012-01-25 - lavf 53.31.100 / 53.22.0
+ 3c5fe5b / f1caf01 Allow doing av_write_frame(ctx, NULL) for flushing possible
+ buffered data within a muxer. Added AVFMT_ALLOW_FLUSH for
+ muxers supporting it (av_write_frame makes sure it is called
+ only for muxers with this flag).
+
+2012-01-15 - lavc 53.56.105 / 53.34.0
+ New audio encoding API:
+ 67f5650 / b2c75b6 Add CODEC_CAP_VARIABLE_FRAME_SIZE capability for use by audio
+ encoders.
+ 67f5650 / 5ee5fa0 Add avcodec_fill_audio_frame() as a convenience function.
+ 67f5650 / b2c75b6 Add avcodec_encode_audio2() and deprecate avcodec_encode_audio().
+ Add AVCodec.encode2().
+
+2012-01-12 - b18e17e / 3167dc9 - lavfi 2.59.100 / 2.15.0
+ Add a new installed header -- libavfilter/version.h -- with version macros.
+
+
+-------- 8< --------- FFmpeg 0.9 was cut here -------- 8< ---------
+
+2011-12-08 - a502939 - lavfi 2.52.0
+ Add av_buffersink_poll_frame() to buffersink.h.
+
+2011-12-08 - 26c6fec - lavu 51.31.0
+ Add av_log_format_line.
+
+2011-12-03 - 976b095 - lavu 51.30.0
+ Add AVERROR_BUG.
+
+2011-11-24 - 573ffbb - lavu 51.28.1
+ Add av_get_alt_sample_fmt() to samplefmt.h.
+
+2011-11-03 - 96949da - lavu 51.23.0
+ Add av_strcasecmp() and av_strncasecmp() to avstring.h.
+
+2011-10-20 - b35e9e1 - lavu 51.22.0
+ Add av_strtok() to avstring.h.
+
+2012-01-03 - ad1c8dd / b73ec05 - lavu 51.34.100 / 51.21.0
+ Add av_popcount64
+
+2011-12-18 - 7c29313 / 8400b12 - lavc 53.46.1 / 53.28.1
+ Deprecate AVFrame.age. The field is unused.
+
+2011-12-12 - 8bc7fe4 / 5266045 - lavf 53.25.0 / 53.17.0
+ Add avformat_close_input().
+ Deprecate av_close_input_file() and av_close_input_stream().
+
+2011-12-09 - c59b80c / b2890f5 - lavu 51.32.0 / 51.20.0 - audioconvert.h
+ Expand the channel layout list.
+
+2011-12-02 - e4de716 / 0eea212 - lavc 53.40.0 / 53.25.0
+ Add nb_samples and extended_data fields to AVFrame.
+ Deprecate AVCODEC_MAX_AUDIO_FRAME_SIZE.
+ Deprecate avcodec_decode_audio3() in favor of avcodec_decode_audio4().
+ avcodec_decode_audio4() writes output samples to an AVFrame, which allows
+ audio decoders to use get_buffer().
+
+2011-12-04 - e4de716 / 560f773 - lavc 53.40.0 / 53.24.0
+ Change AVFrame.data[4]/base[4]/linesize[4]/error[4] to [8] at next major bump.
+ Change AVPicture.data[4]/linesize[4] to [8] at next major bump.
+ Change AVCodecContext.error[4] to [8] at next major bump.
+ Add AV_NUM_DATA_POINTERS to simplify the bump transition.
+
+2011-11-24 - lavu 51.29.0 / 51.19.0
+ 92afb43 / bd97b2e - add planar RGB pixel formats
+ 92afb43 / 6b0768e - add PIX_FMT_PLANAR and PIX_FMT_RGB pixel descriptions
+
+2011-11-23 - 8e576d5 / bbb46f3 - lavu 51.27.0 / 51.18.0
+ Add av_samples_get_buffer_size(), av_samples_fill_arrays(), and
+ av_samples_alloc(), to samplefmt.h.
+
+2011-11-23 - 8e576d5 / 8889cc4 - lavu 51.27.0 / 51.17.0
+ Add planar sample formats and av_sample_fmt_is_planar() to samplefmt.h.
+
+2011-11-19 - dbb38bc / f3a29b7 - lavc 53.36.0 / 53.21.0
+ Move some AVCodecContext fields to a new private struct, AVCodecInternal,
+ which is accessed from a new field, AVCodecContext.internal.
+ - fields moved:
+ AVCodecContext.internal_buffer --> AVCodecInternal.buffer
+ AVCodecContext.internal_buffer_count --> AVCodecInternal.buffer_count
+ AVCodecContext.is_copy --> AVCodecInternal.is_copy
+
+2011-11-16 - 8709ba9 / 6270671 - lavu 51.26.0 / 51.16.0
+ Add av_timegm()
+
+2011-11-13 - lavf 53.21.0 / 53.15.0
+ New interrupt callback API, allowing per-AVFormatContext/AVIOContext
+ interrupt callbacks.
+ 5f268ca / 6aa0b98 Add AVIOInterruptCB struct and the interrupt_callback field to
+ AVFormatContext.
+ 5f268ca / 1dee0ac Add avio_open2() with additional parameters. Those are
+ an interrupt callback and an options AVDictionary.
+ This will allow passing AVOptions to protocols after lavf
+ 54.0.
+
+2011-11-06 - 13b7781 / ba04ecf - lavu 51.24.0 / 51.14.0
+ Add av_strcasecmp() and av_strncasecmp() to avstring.h.
+
+2011-11-06 - 13b7781 / 07b172f - lavu 51.24.0 / 51.13.0
+ Add av_toupper()/av_tolower()
+
+2011-11-05 - d8cab5c / b6d08f4 - lavf 53.19.0 / 53.13.0
+ Add avformat_network_init()/avformat_network_deinit()
+
+2011-10-27 - 6faf0a2 / 512557b - lavc 53.24.0 / 53.15.0
+ Remove avcodec_parse_frame.
+ Deprecate AVCodecContext.parse_only and CODEC_CAP_PARSE_ONLY.
+
+2011-10-19 - d049257 / 569129a - lavf 53.17.0 / 53.10.0
+ Add avformat_new_stream(). Deprecate av_new_stream().
+
+2011-10-13 - 91eb1b1 / b631fba - lavf 53.16.0 / 53.9.0
+ Add AVFMT_NO_BYTE_SEEK AVInputFormat flag.
+
+2011-10-12 - lavu 51.21.0 / 51.12.0
+ AVOptions API rewrite.
+
+ - f884ef0 / 145f741 FF_OPT_TYPE* renamed to AV_OPT_TYPE_*
+ - new setting/getting functions with slightly different semantics:
+ f884ef0 / dac66da av_set_string3 -> av_opt_set
+ av_set_double -> av_opt_set_double
+ av_set_q -> av_opt_set_q
+ av_set_int -> av_opt_set_int
+
+ f884ef0 / 41d9d51 av_get_string -> av_opt_get
+ av_get_double -> av_opt_get_double
+ av_get_q -> av_opt_get_q
+ av_get_int -> av_opt_get_int
+
+ - f884ef0 / 8c5dcaa trivial rename av_next_option -> av_opt_next
+ - f884ef0 / 641c7af new functions - av_opt_child_next, av_opt_child_class_next
+ and av_opt_find2()
+
+2011-09-22 - a70e787 - lavu 51.17.0
+ Add av_x_if_null().
+
+2011-09-18 - 645cebb - lavc 53.16.0
+ Add showall flag2
+
+2011-09-16 - ea8de10 - lavfi 2.42.0
+ Add avfilter_all_channel_layouts.
+
+2011-09-16 - 9899037 - lavfi 2.41.0
+ Rename avfilter_all_* function names to avfilter_make_all_*.
+
+ In particular, apply the renames:
+ avfilter_all_formats -> avfilter_make_all_formats
+ avfilter_all_channel_layouts -> avfilter_make_all_channel_layouts
+ avfilter_all_packing_formats -> avfilter_make_all_packing_formats
+
+2011-09-12 - 4381bdd - lavfi 2.40.0
+ Change AVFilterBufferRefAudioProps.sample_rate type from uint32_t to int.
+
+2011-09-12 - 2c03174 - lavfi 2.40.0
+ Simplify signature for avfilter_get_audio_buffer(), make it
+ consistent with avfilter_get_video_buffer().
+
+2011-09-06 - 4f7dfe1 - lavfi 2.39.0
+ Rename libavfilter/vsink_buffer.h to libavfilter/buffersink.h.
+
+2011-09-06 - c4415f6 - lavfi 2.38.0
+ Unify video and audio sink API.
+
+ In particular, add av_buffersink_get_buffer_ref(), deprecate
+ av_vsink_buffer_get_video_buffer_ref() and change the value for the
+ opaque field passed to the abuffersink init function.
+
+2011-09-04 - 61e2e29 - lavu 51.16.0
+ Add av_asprintf().
+
+2011-08-22 - dacd827 - lavf 53.10.0
+ Add av_find_program_from_stream().
+
+2011-08-20 - 69e2c1a - lavu 51.13.0
+ Add av_get_media_type_string().
+
+2011-09-03 - 1889c67 / fb4ca26 - lavc 53.13.0
+ lavf 53.11.0
+ lsws 2.1.0
+ Add {avcodec,avformat,sws}_get_class().
+
+2011-08-03 - 1889c67 / c11fb82 - lavu 51.15.0
+ Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function.
+
+2011-08-14 - 323b930 - lavu 51.12.0
+ Add av_fifo_peek2(), deprecate av_fifo_peek().
+
+2011-08-26 - lavu 51.14.0 / 51.9.0
+ - 976a8b2 / add41de..976a8b2 / abc78a5 Do not include intfloat_readwrite.h,
+ mathematics.h, rational.h, pixfmt.h, or log.h from avutil.h.
+
+2011-08-16 - 27fbe31 / 48f9e45 - lavf 53.11.0 / 53.8.0
+ Add avformat_query_codec().
+
+2011-08-16 - 27fbe31 / bca06e7 - lavc 53.11.0
+ Add avcodec_get_type().
+
+2011-08-06 - 0cb233c / 2f63440 - lavf 53.7.0
+ Add error_recognition to AVFormatContext.
+
+2011-08-02 - 1d186e9 / 9d39cbf - lavc 53.9.1
+ Add AV_PKT_FLAG_CORRUPT AVPacket flag.
+
+2011-07-16 - b57df29 - lavfi 2.27.0
+ Add audio packing negotiation fields and helper functions.
+
+ In particular, add AVFilterPacking enum, planar, in_packings and
+ out_packings fields to AVFilterLink, and the functions:
+ avfilter_set_common_packing_formats()
+ avfilter_all_packing_formats()
+
+2011-07-10 - 3602ad7 / a67c061 - lavf 53.6.0
+ Add avformat_find_stream_info(), deprecate av_find_stream_info().
+ NOTE: this was backported to 0.7
+
+2011-07-10 - 3602ad7 / 0b950fe - lavc 53.8.0
+ Add avcodec_open2(), deprecate avcodec_open().
+ NOTE: this was backported to 0.7
+
+ Add avcodec_alloc_context3. Deprecate avcodec_alloc_context() and
+ avcodec_alloc_context2().
+
+2011-07-01 - b442ca6 - lavf 53.5.0 - avformat.h
+ Add function av_get_output_timestamp().
+
+2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h
+ Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum.
+
+
+-------- 8< --------- FFmpeg 0.7 was cut here -------- 8< ---------
+
+
+
+-------- 8< --------- FFmpeg 0.8 was cut here -------- 8< ---------
+
+2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h
+ Add layout negotiation fields and helper functions.
+
+ In particular, add in_chlayouts and out_chlayouts to AVFilterLink,
+ and the functions:
+ avfilter_set_common_sample_formats()
+ avfilter_set_common_channel_layouts()
+ avfilter_all_channel_layouts()
+
+2011-06-19 - 527ca39 - lavfi 2.22.0 - AVFilterFormats
+ Change type of AVFilterFormats.formats from int * to int64_t *,
+ and update formats handling API accordingly.
+
+ avfilter_make_format_list() still takes a int32_t array and converts
+ it to int64_t. A new function, avfilter_make_format64_list(), that
+ takes int64_t arrays has been added.
+
+2011-06-19 - 44f669e - lavfi 2.21.0 - vsink_buffer.h
+ Add video sink buffer and vsink_buffer.h public header.
+
+2011-06-12 - 9fdf772 - lavfi 2.18.0 - avcodec.h
+ Add avfilter_get_video_buffer_ref_from_frame() function in
+ libavfilter/avcodec.h.
+
+2011-06-12 - c535494 - lavfi 2.17.0 - avfiltergraph.h
+ Add avfilter_inout_alloc() and avfilter_inout_free() functions.
+
+2011-06-12 - 6119b23 - lavfi 2.16.0 - avfilter_graph_parse()
+ Change avfilter_graph_parse() signature.
+
+2011-06-23 - 686959e / 67e9ae1 - lavu 51.10.0 / 51.8.0 - attributes.h
+ Add av_printf_format().
+
+2011-06-16 - 2905e3f / 05e84c9, 2905e3f / 25de595 - lavf 53.4.0 / 53.2.0 - avformat.h
+ Add avformat_open_input and avformat_write_header().
+ Deprecate av_open_input_stream, av_open_input_file,
+ AVFormatParameters and av_write_header.
+
+2011-06-16 - 2905e3f / 7e83e1c, 2905e3f / dc59ec5 - lavu 51.9.0 / 51.7.0 - opt.h
+ Add av_opt_set_dict() and av_opt_find().
+ Deprecate av_find_opt().
+ Add AV_DICT_APPEND flag.
+
+2011-06-10 - 45fb647 / cb7c11c - lavu 51.6.0 - opt.h
+ Add av_opt_flag_is_set().
+
+2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays
+ Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h.
+
+2011-06-09 - f9ecb84 / d9f80ea - lavu 51.8.0 - AVMetadata
+ Move AVMetadata from lavf to lavu and rename it to
+ AVDictionary -- new installed header dict.h.
+ All av_metadata_* functions renamed to av_dict_*.
+
+2011-06-07 - d552f61 / a6703fa - lavu 51.8.0 - av_get_bytes_per_sample()
+ Add av_get_bytes_per_sample() in libavutil/samplefmt.h.
+ Deprecate av_get_bits_per_sample_fmt().
+
+2011-06-05 - f956924 / b39b062 - lavu 51.8.0 - opt.h
+ Add av_opt_free convenience function.
+
+2011-06-06 - 95a0242 - lavfi 2.14.0 - AVFilterBufferRefAudioProps
+ Remove AVFilterBufferRefAudioProps.size, and use nb_samples in
+ avfilter_get_audio_buffer() and avfilter_default_get_audio_buffer() in
+ place of size.
+
+2011-06-06 - 0bc2cca - lavu 51.6.0 - av_samples_alloc()
+ Switch nb_channels and nb_samples parameters order in
+ av_samples_alloc().
+
+2011-06-06 - e1c7414 - lavu 51.5.0 - av_samples_*
+ Change the data layout created by av_samples_fill_arrays() and
+ av_samples_alloc().
+
+2011-06-06 - 27bcf55 - lavfi 2.13.0 - vsrc_buffer.h
+ Make av_vsrc_buffer_add_video_buffer_ref() accepts an additional
+ flags parameter in input.
+
+2011-06-03 - e977ca2 - lavfi 2.12.0 - avfilter_link_free()
+ Add avfilter_link_free() function.
+
+2011-06-02 - 5ad38d9 - lavu 51.4.0 - av_force_cpu_flags()
+ Add av_cpu_flags() in libavutil/cpu.h.
+
+2011-05-28 - e71f260 - lavu 51.3.0 - pixdesc.h
+ Add av_get_pix_fmt_name() in libavutil/pixdesc.h, and deprecate
+ avcodec_get_pix_fmt_name() in libavcodec/avcodec.h in its favor.
+
+2011-05-25 - 39e4206 / 30315a8 - lavf 53.3.0 - avformat.h
+ Add fps_probe_size to AVFormatContext.
+
+2011-05-22 - 5ecdfd0 - lavf 53.2.0 - avformat.h
+ Introduce avformat_alloc_output_context2() and deprecate
+ avformat_alloc_output_context().
+
+2011-05-22 - 83db719 - lavfi 2.10.0 - vsrc_buffer.h
+ Make libavfilter/vsrc_buffer.h public.
+
+2011-05-19 - c000a9f - lavfi 2.8.0 - avcodec.h
+ Add av_vsrc_buffer_add_frame() to libavfilter/avcodec.h.
+
+2011-05-14 - 9fdf772 - lavfi 2.6.0 - avcodec.h
+ Add avfilter_get_video_buffer_ref_from_frame() to libavfilter/avcodec.h.
+
+2011-05-18 - 75a37b5 / 64150ff - lavc 53.7.0 - AVCodecContext.request_sample_fmt
+ Add request_sample_fmt field to AVCodecContext.
+
+2011-05-10 - 59eb12f / 188dea1 - lavc 53.6.0 - avcodec.h
+ Deprecate AVLPCType and the following fields in
+ AVCodecContext: lpc_coeff_precision, prediction_order_method,
+ min_partition_order, max_partition_order, lpc_type, lpc_passes.
+ Corresponding FLAC encoder options should be used instead.
+
+2011-05-07 - 9fdf772 - lavfi 2.5.0 - avcodec.h
+ Add libavfilter/avcodec.h header and avfilter_copy_frame_props()
+ function.
+
+2011-05-07 - 18ded93 - lavc 53.5.0 - AVFrame
+ Add format field to AVFrame.
+
+2011-05-07 - 22333a6 - lavc 53.4.0 - AVFrame
+ Add width and height fields to AVFrame.
+
+2011-05-01 - 35fe66a - lavfi 2.4.0 - avfilter.h
+ Rename AVFilterBufferRefVideoProps.pixel_aspect to
+ sample_aspect_ratio.
+
+2011-05-01 - 77e9dee - lavc 53.3.0 - AVFrame
+ Add a sample_aspect_ratio field to AVFrame.
+
+2011-05-01 - 1ba5727 - lavc 53.2.0 - AVFrame
+ Add a pkt_pos field to AVFrame.
+
+2011-04-29 - 35ceaa7 - lavu 51.2.0 - mem.h
+ Add av_dynarray_add function for adding
+ an element to a dynamic array.
+
+2011-04-26 - d7e5aeb / bebe72f - lavu 51.1.0 - avutil.h
+ Add AVPictureType enum and av_get_picture_type_char(), deprecate
+ FF_*_TYPE defines and av_get_pict_type_char() defined in
+ libavcodec/avcodec.h.
+
+2011-04-26 - d7e5aeb / 10d3940 - lavfi 2.3.0 - avfilter.h
+ Add pict_type and key_frame fields to AVFilterBufferRefVideo.
+
+2011-04-26 - d7e5aeb / 7a11c82 - lavfi 2.2.0 - vsrc_buffer
+ Add sample_aspect_ratio fields to vsrc_buffer arguments
+
+2011-04-21 - 8772156 / 94f7451 - lavc 53.1.0 - avcodec.h
+ Add CODEC_CAP_SLICE_THREADS for codecs supporting sliced threading.
+
+2011-04-15 - lavc 52.120.0 - avcodec.h
+ AVPacket structure got additional members for passing side information:
+ c407984 / 4de339e introduce side information for AVPacket
+ c407984 / 2d8591c make containers pass palette change in AVPacket
+
+2011-04-12 - lavf 52.107.0 - avio.h
+ Avio cleanup, part II - deprecate the entire URLContext API:
+ c55780d / 175389c add avio_check as a replacement for url_exist
+ 9891004 / ff1ec0c add avio_pause and avio_seek_time as replacements
+ for _av_url_read_fseek/fpause
+ d4d0932 / cdc6a87 deprecate av_protocol_next(), avio_enum_protocols
+ should be used instead.
+ c88caa5 / 80c6e23 rename url_set_interrupt_cb->avio_set_interrupt_cb.
+ c88caa5 / f87b1b3 rename open flags: URL_* -> AVIO_*
+ d4d0932 / f8270bb add avio_enum_protocols.
+ d4d0932 / 5593f03 deprecate URLProtocol.
+ d4d0932 / c486dad deprecate URLContext.
+ d4d0932 / 026e175 deprecate the typedef for URLInterruptCB
+ c88caa5 / 8e76a19 deprecate av_register_protocol2.
+ 11d7841 / b840484 deprecate URL_PROTOCOL_FLAG_NESTED_SCHEME
+ 11d7841 / 1305d93 deprecate av_url_read_seek
+ 11d7841 / fa104e1 deprecate av_url_read_pause
+ 434f248 / 727c7aa deprecate url_get_filename().
+ 434f248 / 5958df3 deprecate url_max_packet_size().
+ 434f248 / 1869ea0 deprecate url_get_file_handle().
+ 434f248 / 32a97d4 deprecate url_filesize().
+ 434f248 / e52a914 deprecate url_close().
+ 434f248 / 58a48c6 deprecate url_seek().
+ 434f248 / 925e908 deprecate url_write().
+ 434f248 / dce3756 deprecate url_read_complete().
+ 434f248 / bc371ac deprecate url_read().
+ 434f248 / 0589da0 deprecate url_open().
+ 434f248 / 62eaaea deprecate url_connect.
+ 434f248 / 5652bb9 deprecate url_alloc.
+ 434f248 / 333e894 deprecate url_open_protocol
+ 434f248 / e230705 deprecate url_poll and URLPollEntry
+
+2011-04-08 - lavf 52.106.0 - avformat.h
+ Minor avformat.h cleanup:
+ d4d0932 / a9bf9d8 deprecate av_guess_image2_codec
+ d4d0932 / c3675df rename avf_sdp_create->av_sdp_create
+
+2011-04-03 - lavf 52.105.0 - avio.h
+ Large-scale renaming/deprecating of AVIOContext-related functions:
+ 2cae980 / 724f6a0 deprecate url_fdopen
+ 2cae980 / 403ee83 deprecate url_open_dyn_packet_buf
+ 2cae980 / 6dc7d80 rename url_close_dyn_buf -> avio_close_dyn_buf
+ 2cae980 / b92c545 rename url_open_dyn_buf -> avio_open_dyn_buf
+ 2cae980 / 8978fed introduce an AVIOContext.seekable field as a replacement for
+ AVIOContext.is_streamed and url_is_streamed()
+ 1caa412 / b64030f deprecate get_checksum()
+ 1caa412 / 4c4427a deprecate init_checksum()
+ 2fd41c9 / 4ec153b deprecate udp_set_remote_url/get_local_port
+ 4fa0e24 / 933e90a deprecate av_url_read_fseek/fpause
+ 4fa0e24 / 8d9769a deprecate url_fileno
+ 0fecf26 / b7f2fdd rename put_flush_packet -> avio_flush
+ 0fecf26 / 35f1023 deprecate url_close_buf
+ 0fecf26 / 83fddae deprecate url_open_buf
+ 0fecf26 / d9d86e0 rename url_fprintf -> avio_printf
+ 0fecf26 / 59f65d9 deprecate url_setbufsize
+ 6947b0c / 3e68b3b deprecate url_ferror
+ e8bb2e2 deprecate url_fget_max_packet_size
+ 76aa876 rename url_fsize -> avio_size
+ e519753 deprecate url_fgetc
+ 655e45e deprecate url_fgets
+ a2704c9 rename url_ftell -> avio_tell
+ e16ead0 deprecate get_strz() in favor of avio_get_str
+ 0300db8,2af07d3 rename url_fskip -> avio_skip
+ 6b4aa5d rename url_fseek -> avio_seek
+ 61840b4 deprecate put_tag
+ 22a3212 rename url_fopen/fclose -> avio_open/close.
+ 0ac8e2b deprecate put_nbyte
+ 77eb550 rename put_byte -> avio_w8
+ put_[b/l]e -> avio_w[b/l]
+ put_buffer -> avio_write
+ b7effd4 rename get_byte -> avio_r8,
+ get_[b/l]e -> avio_r[b/l]
+ get_buffer -> avio_read
+ b3db9ce deprecate get_partial_buffer
+ 8d9ac96 rename av_alloc_put_byte -> avio_alloc_context
+
+2011-03-25 - 27ef7b1 / 34b47d7 - lavc 52.115.0 - AVCodecContext.audio_service_type
+ Add audio_service_type field to AVCodecContext.
+
+2011-03-17 - e309fdc - lavu 50.40.0 - pixfmt.h
+ Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats
+
+2011-03-02 - 863c471 - lavf 52.103.0 - av_pkt_dump2, av_pkt_dump_log2
+ Add new functions av_pkt_dump2, av_pkt_dump_log2 that uses the
+ source stream timebase for outputting timestamps. Deprecate
+ av_pkt_dump and av_pkt_dump_log.
+
+2011-02-20 - e731b8d - lavf 52.102.0 - avio.h
+ * e731b8d - rename init_put_byte() to ffio_init_context(), deprecating the
+ original, and move it to a private header so it is no longer
+ part of our public API. Instead, use av_alloc_put_byte().
+ * ae628ec - rename ByteIOContext to AVIOContext.
+
+2011-02-16 - 09d171b - lavf 52.101.0 - avformat.h
+ lavu 52.39.0 - parseutils.h
+ * 610219a - Add av_ prefix to dump_format().
+ * f6c7375 - Replace parse_date() in lavf with av_parse_time() in lavu.
+ * ab0287f - Move find_info_tag from lavf to lavu and add av_prefix to it.
+
+2011-02-15 - lavu 52.38.0 - merge libavcore
+ libavcore is merged back completely into libavutil
+
+2011-02-10 - 55bad0c - lavc 52.113.0 - vbv_delay
+ Add vbv_delay field to AVCodecContext
+
+2011-02-14 - 24a83bd - lavf 52.100.0 - AV_DISPOSITION_CLEAN_EFFECTS
+ Add AV_DISPOSITION_CLEAN_EFFECTS disposition flag.
+
+2011-02-14 - 910b5b8 - lavfi 1.76.0 - AVFilterLink sample_aspect_ratio
+ Add sample_aspect_ratio field to AVFilterLink.
+
+2011-02-10 - 12c14cd - lavf 52.99.0 - AVStream.disposition
+ Add AV_DISPOSITION_HEARING_IMPAIRED and AV_DISPOSITION_VISUAL_IMPAIRED.
+
+2011-02-09 - c0b102c - lavc 52.112.0 - avcodec_thread_init()
+ Deprecate avcodec_thread_init()/avcodec_thread_free() use; instead
+ set thread_count before calling avcodec_open.
+
+2011-02-09 - 37b00b4 - lavc 52.111.0 - threading API
+ Add CODEC_CAP_FRAME_THREADS with new restrictions on get_buffer()/
+ release_buffer()/draw_horiz_band() callbacks for appropriate codecs.
+ Add thread_type and active_thread_type fields to AVCodecContext.
+
+2011-02-08 - 3940caa - lavf 52.98.0 - av_probe_input_buffer
+ Add av_probe_input_buffer() to avformat.h for probing format from a
+ ByteIOContext.
+
+2011-02-06 - fe174fc - lavf 52.97.0 - avio.h
+ Add flag for non-blocking protocols: URL_FLAG_NONBLOCK
+
+2011-02-04 - f124b08 - lavf 52.96.0 - avformat_free_context()
+ Add avformat_free_context() in avformat.h.
+
+2011-02-03 - f5b82f4 - lavc 52.109.0 - add CODEC_ID_PRORES
+ Add CODEC_ID_PRORES to avcodec.h.
+
+2011-02-03 - fe9a3fb - lavc 52.109.0 - H.264 profile defines
+ Add defines for H.264 * Constrained Baseline and Intra profiles
+
+2011-02-02 - lavf 52.95.0
+ * 50196a9 - add a new installed header version.h.
+ * 4efd5cf, dccbd97, 93b78d1 - add several variants of public
+ avio_{put,get}_str* functions. Deprecate corresponding semi-public
+ {put,get}_str*.
+
+2011-02-02 - dfd2a00 - lavu 50.37.0 - log.h
+ Make av_dlog public.
+
+2011-01-31 - 7b3ea55 - lavfi 1.76.0 - vsrc_buffer
+ Add sample_aspect_ratio fields to vsrc_buffer arguments
+
+2011-01-31 - 910b5b8 - lavfi 1.75.0 - AVFilterLink sample_aspect_ratio
+ Add sample_aspect_ratio field to AVFilterLink.
+
+2011-01-15 - a242ac3 - lavfi 1.74.0 - AVFilterBufferRefAudioProps
+ Rename AVFilterBufferRefAudioProps.samples_nb to nb_samples.
+
+2011-01-14 - 7f88a5b - lavf 52.93.0 - av_metadata_copy()
+ Add av_metadata_copy() in avformat.h.
+
+2011-01-07 - 81c623f - lavc 52.107.0 - deprecate reordered_opaque
+ Deprecate reordered_opaque in favor of pkt_pts/dts.
+
+2011-01-07 - 1919fea - lavc 52.106.0 - pkt_dts
+ Add pkt_dts to AVFrame, this will in the future allow multithreading decoders
+ to not mess up dts.
+
+2011-01-07 - 393cbb9 - lavc 52.105.0 - pkt_pts
+ Add pkt_pts to AVFrame.
+
+2011-01-07 - 060ec0a - lavc 52.104.0 - av_get_profile_name()
+ Add av_get_profile_name to libavcodec/avcodec.h.
+
+2010-12-27 - 0ccabee - lavfi 1.71.0 - AV_PERM_NEG_LINESIZES
+ Add AV_PERM_NEG_LINESIZES in avfilter.h.
+
+2010-12-27 - 9128ae0 - lavf 52.91.0 - av_find_best_stream()
+ Add av_find_best_stream to libavformat/avformat.h.
+
+2010-12-27 - 107a7e3 - lavf 52.90.0
+ Add AVFMT_NOSTREAMS flag for formats with no streams,
+ like e.g. text metadata.
+
+2010-12-22 - 0328b9e - lavu 50.36.0 - file.h
+ Add functions av_file_map() and av_file_unmap() in file.h.
+
+2010-12-19 - 0bc55f5 - lavu 50.35.0 - error.h
+ Add "not found" error codes:
+ AVERROR_DEMUXER_NOT_FOUND
+ AVERROR_MUXER_NOT_FOUND
+ AVERROR_DECODER_NOT_FOUND
+ AVERROR_ENCODER_NOT_FOUND
+ AVERROR_PROTOCOL_NOT_FOUND
+ AVERROR_FILTER_NOT_FOUND
+ AVERROR_BSF_NOT_FOUND
+ AVERROR_STREAM_NOT_FOUND
+
+2010-12-09 - c61cdd0 - lavcore 0.16.0 - avcore.h
+ Move AV_NOPTS_VALUE, AV_TIME_BASE, AV_TIME_BASE_Q symbols from
+ avcodec.h to avcore.h.
+
+2010-12-04 - 16cfc96 - lavc 52.98.0 - CODEC_CAP_NEG_LINESIZES
+ Add CODEC_CAP_NEG_LINESIZES codec capability flag in avcodec.h.
+
+2010-12-04 - bb4afa1 - lavu 50.34.0 - av_get_pix_fmt_string()
+ Deprecate avcodec_pix_fmt_string() in favor of
+ pixdesc.h/av_get_pix_fmt_string().
+
+2010-12-04 - 4da12e3 - lavcore 0.15.0 - av_image_alloc()
+ Add av_image_alloc() to libavcore/imgutils.h.
+
+2010-12-02 - 037be76 - lavfi 1.67.0 - avfilter_graph_create_filter()
+ Add function avfilter_graph_create_filter() in avfiltergraph.h.
+
+2010-11-25 - 4723bc2 - lavfi 1.65.0 - avfilter_get_video_buffer_ref_from_arrays()
+ Add function avfilter_get_video_buffer_ref_from_arrays() in
+ avfilter.h.
+
+2010-11-21 - 176a615 - lavcore 0.14.0 - audioconvert.h
+ Add a public audio channel API in audioconvert.h, and deprecate the
+ corresponding functions in libavcodec:
+ avcodec_get_channel_name()
+ avcodec_get_channel_layout()
+ avcodec_get_channel_layout_string()
+ avcodec_channel_layout_num_channels()
+ and the CH_* macros defined in libavcodec/avcodec.h.
+
+2010-11-21 - 6bfc268 - lavf 52.85.0 - avformat.h
+ Add av_append_packet().
+
+2010-11-21 - a08d918 - lavc 52.97.0 - avcodec.h
+ Add av_grow_packet().
+
+2010-11-17 - 0985e1a - lavcore 0.13.0 - parseutils.h
+ Add av_parse_color() declared in libavcore/parseutils.h.
+
+2010-11-13 - cb2c971 - lavc 52.95.0 - AVCodecContext
+ Add AVCodecContext.subtitle_header and AVCodecContext.subtitle_header_size
+ fields.
+
+2010-11-13 - 5aaea02 - lavfi 1.62.0 - avfiltergraph.h
+ Make avfiltergraph.h public.
+
+2010-11-13 - 4fcbb2a - lavfi 1.61.0 - avfiltergraph.h
+ Remove declarations from avfiltergraph.h for the functions:
+ avfilter_graph_check_validity()
+ avfilter_graph_config_links()
+ avfilter_graph_config_formats()
+ which are now internal.
+ Use avfilter_graph_config() instead.
+
+2010-11-08 - d2af720 - lavu 50.33.0 - eval.h
+ Deprecate functions:
+ av_parse_and_eval_expr(),
+ av_parse_expr(),
+ av_eval_expr(),
+ av_free_expr(),
+ in favor of the functions:
+ av_expr_parse_and_eval(),
+ av_expr_parse(),
+ av_expr_eval(),
+ av_expr_free().
+
+2010-11-08 - 24de0ed - lavfi 1.59.0 - avfilter_free()
+ Rename avfilter_destroy() to avfilter_free().
+ This change breaks libavfilter API/ABI.
+
+2010-11-07 - 1e80a0e - lavfi 1.58.0 - avfiltergraph.h
+ Remove graphparser.h header, move AVFilterInOut and
+ avfilter_graph_parse() declarations to libavfilter/avfiltergraph.h.
+
+2010-11-07 - 7313132 - lavfi 1.57.0 - AVFilterInOut
+ Rename field AVFilterInOut.filter to AVFilterInOut.filter_ctx.
+ This change breaks libavfilter API.
+
+2010-11-04 - 97dd1e4 - lavfi 1.56.0 - avfilter_graph_free()
+ Rename avfilter_graph_destroy() to avfilter_graph_free().
+ This change breaks libavfilter API/ABI.
+
+2010-11-04 - e15aeea - lavfi 1.55.0 - avfilter_graph_alloc()
+ Add avfilter_graph_alloc() to libavfilter/avfiltergraph.h.
+
+2010-11-02 - 6f84cd1 - lavcore 0.12.0 - av_get_bits_per_sample_fmt()
+ Add av_get_bits_per_sample_fmt() to libavcore/samplefmt.h and
+ deprecate av_get_bits_per_sample_format().
+
+2010-11-02 - d63e456 - lavcore 0.11.0 - samplefmt.h
+ Add sample format functions in libavcore/samplefmt.h:
+ av_get_sample_fmt_name(),
+ av_get_sample_fmt(),
+ av_get_sample_fmt_string(),
+ and deprecate the corresponding libavcodec/audioconvert.h functions:
+ avcodec_get_sample_fmt_name(),
+ avcodec_get_sample_fmt(),
+ avcodec_sample_fmt_string().
+
+2010-11-02 - 262d1c5 - lavcore 0.10.0 - samplefmt.h
+ Define enum AVSampleFormat in libavcore/samplefmt.h, deprecate enum
+ SampleFormat.
+
+2010-10-16 - 2a24df9 - lavfi 1.52.0 - avfilter_graph_config()
+ Add the function avfilter_graph_config() in avfiltergraph.h.
+
+2010-10-15 - 03700d3 - lavf 52.83.0 - metadata API
+ Change demuxers to export metadata in generic format and
+ muxers to accept generic format. Deprecate the public
+ conversion API.
+
+2010-10-10 - 867ae7a - lavfi 1.49.0 - AVFilterLink.time_base
+ Add time_base field to AVFilterLink.
+
+2010-09-27 - c85eef4 - lavu 50.31.0 - av_set_options_string()
+ Move av_set_options_string() from libavfilter/parseutils.h to
+ libavutil/opt.h.
+
+2010-09-27 - acc0490 - lavfi 1.47.0 - AVFilterLink
+ Make the AVFilterLink fields srcpad and dstpad store the pointers to
+ the source and destination pads, rather than their indexes.
+
+2010-09-27 - 372e288 - lavu 50.30.0 - av_get_token()
+ Move av_get_token() from libavfilter/parseutils.h to
+ libavutil/avstring.h.
+
+2010-09-26 - 635d4ae - lsws 0.12.0 - swscale.h
+ Add the functions sws_alloc_context() and sws_init_context().
+
+2010-09-26 - 6ed0404 - lavu 50.29.0 - opt.h
+ Move libavcodec/opt.h to libavutil/opt.h.
+
+2010-09-24 - 1c1c80f - lavu 50.28.0 - av_log_set_flags()
+ Default of av_log() changed due to many problems to the old no repeat
+ detection. Read the docs of AV_LOG_SKIP_REPEATED in log.h before
+ enabling it for your app!.
+
+2010-09-24 - f66eb58 - lavc 52.90.0 - av_opt_show2()
+ Deprecate av_opt_show() in favor or av_opt_show2().
+
+2010-09-14 - bc6f0af - lavu 50.27.0 - av_popcount()
+ Add av_popcount() to libavutil/common.h.
+
+2010-09-08 - c6c98d0 - lavu 50.26.0 - av_get_cpu_flags()
+ Add av_get_cpu_flags().
+
+2010-09-07 - 34017fd - lavcore 0.9.0 - av_image_copy()
+ Add av_image_copy().
+
+2010-09-07 - 9686abb - lavcore 0.8.0 - av_image_copy_plane()
+ Add av_image_copy_plane().
+
+2010-09-07 - 9b7269e - lavcore 0.7.0 - imgutils.h
+ Adopt hierarchical scheme for the imgutils.h function names,
+ deprecate the old names.
+
+2010-09-04 - 7160bb7 - lavu 50.25.0 - AV_CPU_FLAG_*
+ Deprecate the FF_MM_* flags defined in libavcodec/avcodec.h in favor
+ of the AV_CPU_FLAG_* flags defined in libavutil/cpu.h.
+
+2010-08-26 - 5da19b5 - lavc 52.87.0 - avcodec_get_channel_layout()
+ Add avcodec_get_channel_layout() in audioconvert.h.
+
+2010-08-20 - e344336 - lavcore 0.6.0 - av_fill_image_max_pixsteps()
+ Rename av_fill_image_max_pixstep() to av_fill_image_max_pixsteps().
+
+2010-08-18 - a6ddf8b - lavcore 0.5.0 - av_fill_image_max_pixstep()
+ Add av_fill_image_max_pixstep() in imgutils.h.
+
+2010-08-17 - 4f2d2e4 - lavu 50.24.0 - AV_NE()
+ Add the AV_NE macro.
+
+2010-08-17 - ad2c950 - lavfi 1.36.0 - audio framework
+ Implement AVFilterBufferRefAudioProps struct for audio properties,
+ get_audio_buffer(), filter_samples() functions and related changes.
+
+2010-08-12 - 81c1eca - lavcore 0.4.0 - av_get_image_linesize()
+ Add av_get_image_linesize() in imgutils.h.
+
+2010-08-11 - c1db7bf - lavfi 1.34.0 - AVFilterBufferRef
+ Resize data and linesize arrays in AVFilterBufferRef to 8.
+
+ This change breaks libavfilter API/ABI.
+
+2010-08-11 - 9f08d80 - lavc 52.85.0 - av_picture_data_copy()
+ Add av_picture_data_copy in avcodec.h.
+
+2010-08-11 - 84c0386 - lavfi 1.33.0 - avfilter_open()
+ Change avfilter_open() signature:
+ AVFilterContext *avfilter_open(AVFilter *filter, const char *inst_name) ->
+ int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name);
+
+ This change breaks libavfilter API/ABI.
+
+2010-08-11 - cc80caf - lavfi 1.32.0 - AVFilterBufferRef
+ Add a type field to AVFilterBufferRef, and move video specific
+ properties to AVFilterBufferRefVideoProps.
+
+ This change breaks libavfilter API/ABI.
+
+2010-08-07 - 5d4890d - lavfi 1.31.0 - AVFilterLink
+ Rename AVFilterLink fields:
+ AVFilterLink.srcpic -> AVFilterLink.src_buf
+ AVFilterLink.cur_pic -> AVFilterLink.cur_buf
+ AVFilterLink.outpic -> AVFilterLink.out_buf
+
+2010-08-07 - 7fce481 - lavfi 1.30.0
+ Rename functions and fields:
+ avfilter_(un)ref_pic -> avfilter_(un)ref_buffer
+ avfilter_copy_picref_props -> avfilter_copy_buffer_ref_props
+ AVFilterBufferRef.pic -> AVFilterBufferRef.buffer
+
+2010-08-07 - ecc8dad - lavfi 1.29.0 - AVFilterBufferRef
+ Rename AVFilterPicRef to AVFilterBufferRef.
+
+2010-08-07 - d54e094 - lavfi 1.28.0 - AVFilterBuffer
+ Move format field from AVFilterBuffer to AVFilterPicRef.
+
+2010-08-06 - bf176f5 - lavcore 0.3.0 - av_check_image_size()
+ Deprecate avcodec_check_dimensions() in favor of the function
+ av_check_image_size() defined in libavcore/imgutils.h.
+
+2010-07-30 - 56b5e9d - lavfi 1.27.0 - AVFilterBuffer
+ Increase size of the arrays AVFilterBuffer.data and
+ AVFilterBuffer.linesize from 4 to 8.
+
+ This change breaks libavfilter ABI.
+
+2010-07-29 - e7bd48a - lavcore 0.2.0 - imgutils.h
+ Add functions av_fill_image_linesizes() and
+ av_fill_image_pointers(), declared in libavcore/imgutils.h.
+
+2010-07-27 - 126b638 - lavcore 0.1.0 - parseutils.h
+ Deprecate av_parse_video_frame_size() and av_parse_video_frame_rate()
+ defined in libavcodec in favor of the newly added functions
+ av_parse_video_size() and av_parse_video_rate() declared in
+ libavcore/parseutils.h.
+
+2010-07-23 - 4485247 - lavu 50.23.0 - mathematics.h
+ Add the M_PHI constant definition.
+
+2010-07-22 - bdab614 - lavfi 1.26.0 - media format generalization
+ Add a type field to AVFilterLink.
+
+ Change the field types:
+ enum PixelFormat format -> int format in AVFilterBuffer
+ enum PixelFormat *formats -> int *formats in AVFilterFormats
+ enum PixelFormat *format -> int format in AVFilterLink
+
+ Change the function signatures:
+ AVFilterFormats *avfilter_make_format_list(const enum PixelFormat *pix_fmts); ->
+ AVFilterFormats *avfilter_make_format_list(const int *fmts);
+
+ int avfilter_add_colorspace(AVFilterFormats **avff, enum PixelFormat pix_fmt); ->
+ int avfilter_add_format (AVFilterFormats **avff, int fmt);
+
+ AVFilterFormats *avfilter_all_colorspaces(void); ->
+ AVFilterFormats *avfilter_all_formats (enum AVMediaType type);
+
+ This change breaks libavfilter API/ABI.
+
+2010-07-21 - aac6ca6 - lavcore 0.0.0
+ Add libavcore.
+
+2010-07-17 - b5c582f - lavfi 1.25.0 - AVFilterBuffer
+ Remove w and h fields from AVFilterBuffer.
+
+2010-07-17 - f0d77b2 - lavfi 1.24.0 - AVFilterBuffer
+ Rename AVFilterPic to AVFilterBuffer.
+
+2010-07-17 - 57fe80f - lavf 52.74.0 - url_fskip()
+ Make url_fskip() return an int error code instead of void.
+
+2010-07-11 - 23940f1 - lavc 52.83.0
+ Add AVCodecContext.lpc_type and AVCodecContext.lpc_passes fields.
+ Add AVLPCType enum.
+ Deprecate AVCodecContext.use_lpc.
+
+2010-07-11 - e1d7c88 - lavc 52.82.0 - avsubtitle_free()
+ Add a function for free the contents of a AVSubtitle generated by
+ avcodec_decode_subtitle.
+
+2010-07-11 - b91d08f - lavu 50.22.0 - bswap.h and intreadwrite.h
+ Make the bswap.h and intreadwrite.h API public.
+
+2010-07-08 - ce1cd1c - lavu 50.21.0 - pixdesc.h
+ Rename read/write_line() to av_read/write_image_line().
+
+2010-07-07 - 4d508e4 - lavfi 1.21.0 - avfilter_copy_picref_props()
+ Add avfilter_copy_picref_props().
+
+2010-07-03 - 2d525ef - lavc 52.79.0
+ Add FF_COMPLIANCE_UNOFFICIAL and change all instances of
+ FF_COMPLIANCE_INOFFICIAL to use FF_COMPLIANCE_UNOFFICIAL.
+
+2010-07-02 - 89eec74 - lavu 50.20.0 - lfg.h
+ Export av_lfg_init(), av_lfg_get(), av_mlfg_get(), and av_bmg_get() through
+ lfg.h.
+
+2010-06-28 - a52e2c3 - lavfi 1.20.1 - av_parse_color()
+ Extend av_parse_color() syntax, make it accept an alpha value specifier and
+ set the alpha value to 255 by default.
+
+2010-06-22 - 735cf6b - lavf 52.71.0 - URLProtocol.priv_data_size, priv_data_class
+ Add priv_data_size and priv_data_class to URLProtocol.
+
+2010-06-22 - ffbb289 - lavf 52.70.0 - url_alloc(), url_connect()
+ Add url_alloc() and url_connect().
+
+2010-06-22 - 9b07a2d - lavf 52.69.0 - av_register_protocol2()
+ Add av_register_protocol2(), deprecating av_register_protocol().
+
+2010-06-09 - 65db058 - lavu 50.19.0 - av_compare_mod()
+ Add av_compare_mod() to libavutil/mathematics.h.
+
+2010-06-05 - 0b99215 - lavu 50.18.0 - eval API
+ Make the eval API public.
+
+2010-06-04 - 31878fc - lavu 50.17.0 - AV_BASE64_SIZE
+ Add AV_BASE64_SIZE() macro.
+
+2010-06-02 - 7e566bb - lavc 52.73.0 - av_get_codec_tag_string()
+ Add av_get_codec_tag_string().
+
+
+-------- 8< --------- FFmpeg 0.6 was cut here -------- 8< ---------
+
+2010-06-01 - 2b99142 - lsws 0.11.0 - convertPalette API
+ Add sws_convertPalette8ToPacked32() and sws_convertPalette8ToPacked24().
+
+2010-05-26 - 93ebfee - lavc 52.72.0 - CODEC_CAP_EXPERIMENTAL
+ Add CODEC_CAP_EXPERIMENTAL flag.
+ NOTE: this was backported to 0.6
+
+2010-05-23 - 9977863 - lavu 50.16.0 - av_get_random_seed()
+ Add av_get_random_seed().
+
+2010-05-18 - 796ac23 - lavf 52.63.0 - AVFMT_FLAG_RTP_HINT
+ Add AVFMT_FLAG_RTP_HINT as possible value for AVFormatContext.flags.
+ NOTE: this was backported to 0.6
+
+2010-05-09 - b6bc205 - lavfi 1.20.0 - AVFilterPicRef
+ Add interlaced and top_field_first fields to AVFilterPicRef.
+
+2010-05-01 - 8e2ee18 - lavf 52.62.0 - probe function
+ Add av_probe_input_format2 to API, it allows ignoring probe
+ results below given score and returns the actual probe score.
+
+2010-04-01 - 3dd6180 - lavf 52.61.0 - metadata API
+ Add a flag for av_metadata_set2() to disable overwriting of
+ existing tags.
+
+2010-04-01 - 0fb49b5 - lavc 52.66.0
+ Add avcodec_get_edge_width().
+
+2010-03-31 - d103218 - lavc 52.65.0
+ Add avcodec_copy_context().
+
+2010-03-31 - 1a70d12 - lavf 52.60.0 - av_match_ext()
+ Make av_match_ext() public.
+
+2010-03-31 - 1149150 - lavu 50.14.0 - AVMediaType
+ Move AVMediaType enum from libavcodec to libavutil.
+
+2010-03-31 - 72415b2 - lavc 52.64.0 - AVMediaType
+ Define AVMediaType enum, and use it instead of enum CodecType, which
+ is deprecated and will be dropped at the next major bump.
+
+2010-03-25 - 8795823 - lavu 50.13.0 - av_strerror()
+ Implement av_strerror().
+
+2010-03-23 - e1484eb - lavc 52.60.0 - av_dct_init()
+ Support DCT-I and DST-I.
+
+2010-03-15 - b8819c8 - lavf 52.56.0 - AVFormatContext.start_time_realtime
+ Add AVFormatContext.start_time_realtime field.
+
+2010-03-13 - 5bb5c1d - lavfi 1.18.0 - AVFilterPicRef.pos
+ Add AVFilterPicRef.pos field.
+
+2010-03-13 - 60c144f - lavu 50.12.0 - error.h
+ Move error code definitions from libavcodec/avcodec.h to
+ the new public header libavutil/error.h.
+
+2010-03-07 - c709483 - lavc 52.56.0 - avfft.h
+ Add public FFT interface.
+
+2010-03-06 - ac6ef86 - lavu 50.11.0 - av_stristr()
+ Add av_stristr().
+
+2010-03-03 - 4b83fc0 - lavu 50.10.0 - av_tree_enumerate()
+ Add av_tree_enumerate().
+
+2010-02-07 - b687c1a - lavu 50.9.0 - av_compare_ts()
+ Add av_compare_ts().
+
+2010-02-05 - 3f3dc76 - lsws 0.10.0 - sws_getCoefficients()
+ Add sws_getCoefficients().
+
+2010-02-01 - ca76a11 - lavf 52.50.0 - metadata API
+ Add a list of generic tag names, change 'author' -> 'artist',
+ 'year' -> 'date'.
+
+2010-01-30 - 80a07f6 - lavu 50.8.0 - av_get_pix_fmt()
+ Add av_get_pix_fmt().
+
+2010-01-21 - 01cc47d - lsws 0.9.0 - sws_scale()
+ Change constness attributes of sws_scale() parameters.
+
+2010-01-10 - 3fb8e77 - lavfi 1.15.0 - avfilter_graph_config_links()
+ Add a log_ctx parameter to avfilter_graph_config_links().
+
+2010-01-07 - 8e9767f - lsws 0.8.0 - sws_isSupported{In,Out}put()
+ Add sws_isSupportedInput() and sws_isSupportedOutput() functions.
+
+2010-01-06 - c1d662f - lavfi 1.14.0 - avfilter_add_colorspace()
+ Change the avfilter_add_colorspace() signature, make it accept an
+ (AVFilterFormats **) rather than an (AVFilterFormats *) as before.
+
+2010-01-03 - 4fd1f18 - lavfi 1.13.0 - avfilter_add_colorspace()
+ Add avfilter_add_colorspace().
+
+2010-01-02 - 8eb631f - lavf 52.46.0 - av_match_ext()
+ Add av_match_ext(), it should be used in place of match_ext().
+
+2010-01-01 - a1f547b - lavf 52.45.0 - av_guess_format()
+ Add av_guess_format(), it should be used in place of guess_format().
+
+2009-12-13 - a181981 - lavf 52.43.0 - metadata API
+ Add av_metadata_set2(), AV_METADATA_DONT_STRDUP_KEY and
+ AV_METADATA_DONT_STRDUP_VAL.
+
+2009-12-13 - 277c733 - lavu 50.7.0 - avstring.h API
+ Add av_d2str().
+
+2009-12-13 - 02b398e - lavc 52.42.0 - AVStream
+ Add avg_frame_rate.
+
+2009-12-12 - 3ba69a1 - lavu 50.6.0 - av_bmg_next()
+ Introduce the av_bmg_next() function.
+
+2009-12-05 - a13a543 - lavfi 1.12.0 - avfilter_draw_slice()
+ Add a slice_dir parameter to avfilter_draw_slice().
+
+2009-11-26 - 4cc3f6a - lavfi 1.11.0 - AVFilter
+ Remove the next field from AVFilter, this is not anymore required.
+
+2009-11-25 - 1433c4a - lavfi 1.10.0 - avfilter_next()
+ Introduce the avfilter_next() function.
+
+2009-11-25 - 86a60fa - lavfi 1.9.0 - avfilter_register()
+ Change the signature of avfilter_register() to make it return an
+ int. This is required since now the registration operation may fail.
+
+2009-11-25 - 74a0059 - lavu 50.5.0 - pixdesc.h API
+ Make the pixdesc.h API public.
+
+2009-10-27 - 243110f - lavfi 1.5.0 - AVFilter.next
+ Add a next field to AVFilter, this is used for simplifying the
+ registration and management of the registered filters.
+
+2009-10-23 - cccd292 - lavfi 1.4.1 - AVFilter.description
+ Add a description field to AVFilter.
+
+2009-10-19 - 6b5dc05 - lavfi 1.3.0 - avfilter_make_format_list()
+ Change the interface of avfilter_make_format_list() from
+ avfilter_make_format_list(int n, ...) to
+ avfilter_make_format_list(enum PixelFormat *pix_fmts).
+
+2009-10-18 - 0eb4ff9 - lavfi 1.0.0 - avfilter_get_video_buffer()
+ Make avfilter_get_video_buffer() recursive and add the w and h
+ parameters to it.
+
+2009-10-07 - 46c40e4 - lavfi 0.5.1 - AVFilterPic
+ Add w and h fields to AVFilterPic.
+
+2009-06-22 - 92400be - lavf 52.34.1 - AVFormatContext.packet_size
+ This is now an unsigned int instead of a signed int.
+
+2009-06-19 - a4276ba - lavc 52.32.0 - AVSubtitle.pts
+ Add a pts field to AVSubtitle which gives the subtitle packet pts
+ in AV_TIME_BASE. Some subtitle de-/encoders (e.g. XSUB) will
+ not work right without this.
+
+2009-06-03 - 8f3f2e0 - lavc 52.30.2 - AV_PKT_FLAG_KEY
+ PKT_FLAG_KEY has been deprecated and will be dropped at the next
+ major version. Use AV_PKT_FLAG_KEY instead.
+
+2009-06-01 - f988ce6 - lavc 52.30.0 - av_lockmgr_register()
+ av_lockmgr_register() can be used to register a callback function
+ that lavc (and in the future, libraries that depend on lavc) can use
+ to implement mutexes. The application should provide a callback function
+ that implements the AV_LOCK_* operations described in avcodec.h.
+ When the lock manager is registered, FFmpeg is guaranteed to behave
+ correctly in a multi-threaded application.
+
+2009-04-30 - ce1d9c8 - lavc 52.28.0 - av_free_packet()
+ av_free_packet() is no longer an inline function. It is now exported.
+
+2009-04-11 - 80d403f - lavc 52.25.0 - deprecate av_destruct_packet_nofree()
+ Please use NULL instead. This has been supported since r16506
+ (lavf > 52.23.1, lavc > 52.10.0).
+
+2009-04-07 - 7a00bba - lavc 52.23.0 - avcodec_decode_video/audio/subtitle
+ The old decoding functions are deprecated, all new code should use the
+ new functions avcodec_decode_video2(), avcodec_decode_audio3() and
+ avcodec_decode_subtitle2(). These new functions take an AVPacket *pkt
+ argument instead of a const uint8_t *buf / int buf_size pair.
+
+2009-04-03 - 7b09db3 - lavu 50.3.0 - av_fifo_space()
+ Introduce the av_fifo_space() function.
+
+2009-04-02 - fabd246 - lavc 52.23.0 - AVPacket
+ Move AVPacket declaration from libavformat/avformat.h to
+ libavcodec/avcodec.h.
+
+2009-03-22 - 6e08ca9 - lavu 50.2.0 - RGB32 pixel formats
+ Convert the pixel formats PIX_FMT_ARGB, PIX_FMT_RGBA, PIX_FMT_ABGR,
+ PIX_FMT_BGRA, which were defined as macros, into enum PixelFormat values.
+ Conversely PIX_FMT_RGB32, PIX_FMT_RGB32_1, PIX_FMT_BGR32 and
+ PIX_FMT_BGR32_1 are now macros.
+ avcodec_get_pix_fmt() now recognizes the "rgb32" and "bgr32" aliases.
+ Re-sort the enum PixelFormat list accordingly.
+ This change breaks API/ABI backward compatibility.
+
+2009-03-22 - f82674e - lavu 50.1.0 - PIX_FMT_RGB5X5 endian variants
+ Add the enum PixelFormat values:
+ PIX_FMT_RGB565BE, PIX_FMT_RGB565LE, PIX_FMT_RGB555BE, PIX_FMT_RGB555LE,
+ PIX_FMT_BGR565BE, PIX_FMT_BGR565LE, PIX_FMT_BGR555BE, PIX_FMT_BGR555LE.
+
+2009-03-21 - ee6624e - lavu 50.0.0 - av_random*
+ The Mersenne Twister PRNG implemented through the av_random* functions
+ was removed. Use the lagged Fibonacci PRNG through the av_lfg* functions
+ instead.
+
+2009-03-08 - 41dd680 - lavu 50.0.0 - AVFifoBuffer
+ av_fifo_init, av_fifo_read, av_fifo_write and av_fifo_realloc were dropped
+ and replaced by av_fifo_alloc, av_fifo_generic_read, av_fifo_generic_write
+ and av_fifo_realloc2.
+ In addition, the order of the function arguments of av_fifo_generic_read
+ was changed to match av_fifo_generic_write.
+ The AVFifoBuffer/struct AVFifoBuffer may only be used in an opaque way by
+ applications, they may not use sizeof() or directly access members.
+
+2009-03-01 - ec26457 - lavf 52.31.0 - Generic metadata API
+ Introduce a new metadata API (see av_metadata_get() and friends).
+ The old API is now deprecated and should not be used anymore. This especially
+ includes the following structure fields:
+ - AVFormatContext.title
+ - AVFormatContext.author
+ - AVFormatContext.copyright
+ - AVFormatContext.comment
+ - AVFormatContext.album
+ - AVFormatContext.year
+ - AVFormatContext.track
+ - AVFormatContext.genre
+ - AVStream.language
+ - AVStream.filename
+ - AVProgram.provider_name
+ - AVProgram.name
+ - AVChapter.title
diff --git a/extern/ffmpeg/doc/Doxyfile b/extern/ffmpeg/doc/Doxyfile
new file mode 100644
index 0000000000..e4732e9a3a
--- /dev/null
+++ b/extern/ffmpeg/doc/Doxyfile
@@ -0,0 +1,2359 @@
+# Doxyfile 1.8.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = FFmpeg
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = 4.4.2
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doc/doxy
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH = .
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH = .
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = YES
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if ... \endif and \cond
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT =
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = *.git \
+ *.d
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH = doc/examples/ tools/
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *.c
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+#
+#
+# where is the value of the INPUT_FILTER tag, and is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# compiled with the --with-libclang option.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use + S
+# (what the is depends on the OS and browser, but it is typically
+# , /, or both). Inside the search box use the to jump into the search results window, the results can be navigated
+# using the . Press to select an item or to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing +. Also here use the
+# to select a filter and or to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is referred to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = __attribute__(x)= \
+ "DECLARE_ALIGNED(n,t,v)=t v" \
+ offsetof(x,y)=0x42 \
+ av_alloc_size(...)= \
+ AV_GCC_VERSION_AT_LEAST(x,y)=1 \
+ AV_GCC_VERSION_AT_MOST(x,y)=0 \
+ __GNUC__
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/extern/ffmpeg/doc/Makefile b/extern/ffmpeg/doc/Makefile
new file mode 100644
index 0000000000..fa4996b5a3
--- /dev/null
+++ b/extern/ffmpeg/doc/Makefile
@@ -0,0 +1,154 @@
+LIBRARIES-$(CONFIG_AVUTIL) += libavutil
+LIBRARIES-$(CONFIG_SWSCALE) += libswscale
+LIBRARIES-$(CONFIG_SWRESAMPLE) += libswresample
+LIBRARIES-$(CONFIG_AVCODEC) += libavcodec
+LIBRARIES-$(CONFIG_AVFORMAT) += libavformat
+LIBRARIES-$(CONFIG_AVDEVICE) += libavdevice
+LIBRARIES-$(CONFIG_AVFILTER) += libavfilter
+
+COMPONENTS-$(CONFIG_AVUTIL) += ffmpeg-utils
+COMPONENTS-$(CONFIG_SWSCALE) += ffmpeg-scaler
+COMPONENTS-$(CONFIG_SWRESAMPLE) += ffmpeg-resampler
+COMPONENTS-$(CONFIG_AVCODEC) += ffmpeg-codecs ffmpeg-bitstream-filters
+COMPONENTS-$(CONFIG_AVFORMAT) += ffmpeg-formats ffmpeg-protocols
+COMPONENTS-$(CONFIG_AVDEVICE) += ffmpeg-devices
+COMPONENTS-$(CONFIG_AVFILTER) += ffmpeg-filters
+
+MANPAGES1 = $(AVPROGS-yes:%=doc/%.1) $(AVPROGS-yes:%=doc/%-all.1) $(COMPONENTS-yes:%=doc/%.1)
+MANPAGES3 = $(LIBRARIES-yes:%=doc/%.3)
+MANPAGES = $(MANPAGES1) $(MANPAGES3)
+PODPAGES = $(AVPROGS-yes:%=doc/%.pod) $(AVPROGS-yes:%=doc/%-all.pod) $(COMPONENTS-yes:%=doc/%.pod) $(LIBRARIES-yes:%=doc/%.pod)
+HTMLPAGES = $(AVPROGS-yes:%=doc/%.html) $(AVPROGS-yes:%=doc/%-all.html) $(COMPONENTS-yes:%=doc/%.html) $(LIBRARIES-yes:%=doc/%.html) \
+ doc/developer.html \
+ doc/faq.html \
+ doc/fate.html \
+ doc/general.html \
+ doc/git-howto.html \
+ doc/mailing-list-faq.html \
+ doc/nut.html \
+ doc/platform.html \
+
+TXTPAGES = doc/fate.txt \
+
+
+DOCS-$(CONFIG_HTMLPAGES) += $(HTMLPAGES)
+DOCS-$(CONFIG_PODPAGES) += $(PODPAGES)
+DOCS-$(CONFIG_MANPAGES) += $(MANPAGES)
+DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES)
+DOCS = $(DOCS-yes)
+
+all-$(CONFIG_DOC): doc
+
+doc: documentation
+
+apidoc: doc/doxy/html
+documentation: $(DOCS)
+
+TEXIDEP = perl $(SRC_PATH)/doc/texidep.pl $(SRC_PATH) $< $@ >$(@:%=%.d)
+
+doc/%.txt: TAG = TXT
+doc/%.txt: doc/%.texi
+ $(Q)$(TEXIDEP)
+ $(M)makeinfo --force --no-headers -o $@ $< 2>/dev/null
+
+GENTEXI = format codec
+GENTEXI := $(GENTEXI:%=doc/avoptions_%.texi)
+
+$(GENTEXI): TAG = GENTEXI
+$(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF)
+ $(M)doc/print_options $* > $@
+
+doc/%.html: TAG = HTML
+doc/%-all.html: TAG = HTML
+
+ifdef HAVE_MAKEINFO_HTML
+doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
+ $(Q)$(TEXIDEP)
+ $(M)makeinfo --html -I doc --no-split -D config-not-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
+
+doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
+ $(Q)$(TEXIDEP)
+ $(M)makeinfo --html -I doc --no-split -D config-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
+else
+doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
+ $(Q)$(TEXIDEP)
+ $(M)texi2html -I doc -monolithic --D=config-not-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
+
+doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
+ $(Q)$(TEXIDEP)
+ $(M)texi2html -I doc -monolithic --D=config-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
+endif
+
+doc/%.pod: TAG = POD
+doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
+ $(Q)$(TEXIDEP)
+ $(M)perl $(SRC_PATH)/doc/texi2pod.pl -Dconfig-not-all=yes -Idoc $< $@
+
+doc/%-all.pod: TAG = POD
+doc/%-all.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
+ $(Q)$(TEXIDEP)
+ $(M)perl $(SRC_PATH)/doc/texi2pod.pl -Dconfig-all=yes -Idoc $< $@
+
+doc/%.1 doc/%.3: TAG = MAN
+doc/%.1: doc/%.pod $(GENTEXI)
+ $(M)pod2man --section=1 --center=" " --release=" " --date=" " $< > $@
+doc/%.3: doc/%.pod $(GENTEXI)
+ $(M)pod2man --section=3 --center=" " --release=" " --date=" " $< > $@
+
+$(DOCS) doc/doxy/html: | doc/
+
+DOXY_INPUT = $(INSTHEADERS)
+DOXY_INPUT_DEPS = $(addprefix $(SRC_PATH)/, $(DOXY_INPUT)) ffbuild/config.mak
+
+doc/doxy/html: TAG = DOXY
+doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(SRC_PATH)/doc/doxy-wrapper.sh $(DOXY_INPUT_DEPS)
+ $(M)OUT_DIR=$$PWD/doc/doxy; cd $(SRC_PATH); ./doc/doxy-wrapper.sh $$OUT_DIR $< $(DOXYGEN) $(DOXY_INPUT);
+
+install-doc: install-html install-man
+
+install-html:
+
+install-man:
+
+ifdef CONFIG_HTMLPAGES
+install-progs-$(CONFIG_DOC): install-html
+
+install-html: $(HTMLPAGES)
+ $(Q)mkdir -p "$(DOCDIR)"
+ $(INSTALL) -m 644 $(HTMLPAGES) "$(DOCDIR)"
+endif
+
+ifdef CONFIG_MANPAGES
+install-progs-$(CONFIG_DOC): install-man
+
+install-man: $(MANPAGES)
+ $(Q)mkdir -p "$(MANDIR)/man1"
+ $(INSTALL) -m 644 $(MANPAGES1) "$(MANDIR)/man1"
+ $(Q)mkdir -p "$(MANDIR)/man3"
+ $(INSTALL) -m 644 $(MANPAGES3) "$(MANDIR)/man3"
+endif
+
+uninstall: uninstall-doc
+
+uninstall-doc: uninstall-html uninstall-man
+
+uninstall-html:
+ $(RM) -r "$(DOCDIR)"
+
+uninstall-man:
+ $(RM) $(addprefix "$(MANDIR)/man1/",$(AVPROGS-yes:%=%.1) $(AVPROGS-yes:%=%-all.1) $(COMPONENTS-yes:%=%.1))
+ $(RM) $(addprefix "$(MANDIR)/man3/",$(LIBRARIES-yes:%=%.3))
+
+clean:: docclean
+
+distclean:: docclean
+ $(RM) doc/config.texi
+
+docclean::
+ $(RM) $(CLEANSUFFIXES:%=doc/%)
+ $(RM) $(TXTPAGES) doc/*.html doc/*.pod doc/*.1 doc/*.3 doc/avoptions_*.texi
+ $(RM) -r doc/doxy/html
+
+-include $(wildcard $(DOCS:%=%.d))
+
+.PHONY: apidoc doc documentation
diff --git a/extern/ffmpeg/doc/authors.texi b/extern/ffmpeg/doc/authors.texi
new file mode 100644
index 0000000000..6c8c1d7efa
--- /dev/null
+++ b/extern/ffmpeg/doc/authors.texi
@@ -0,0 +1,11 @@
+@chapter Authors
+
+The FFmpeg developers.
+
+For details about the authorship, see the Git history of the project
+(git://source.ffmpeg.org/ffmpeg), e.g. by typing the command
+@command{git log} in the FFmpeg source directory, or browsing the
+online repository at @url{http://source.ffmpeg.org}.
+
+Maintainers for the specific components are listed in the file
+@file{MAINTAINERS} in the source code tree.
diff --git a/extern/ffmpeg/doc/avoptions_codec.texi b/extern/ffmpeg/doc/avoptions_codec.texi
new file mode 100644
index 0000000000..a6365b9fe2
--- /dev/null
+++ b/extern/ffmpeg/doc/avoptions_codec.texi
@@ -0,0 +1,1010 @@
+@c DO NOT EDIT THIS FILE!
+@c It was generated by print_options.
+
+@section Codec AVOptions
+@table @option
+@item -b[:stream_specifier] @var{integer} (@emph{output,audio,video})
+set bitrate (in bits/s)
+@item -ab[:stream_specifier] @var{integer} (@emph{output,audio})
+set bitrate (in bits/s)
+@item -bt[:stream_specifier] @var{integer} (@emph{output,video})
+Set video bitrate tolerance (in bits/s). In 1-pass mode, bitrate tolerance specifies how far ratecontrol is willing to deviate from the target average bitrate value. This is not related to minimum/maximum bitrate. Lowering tolerance too much has an adverse effect on quality.
+@item -flags[:stream_specifier] @var{flags} (@emph{input/output,audio,video,subtitles})
+
+Possible values:
+@table @samp
+@item unaligned
+allow decoders to produce unaligned output
+@item mv4
+use four motion vectors per macroblock (MPEG-4)
+@item qpel
+use 1/4-pel motion compensation
+@item loop
+use loop filter
+@item qscale
+use fixed qscale
+@item pass1
+use internal 2-pass ratecontrol in first pass mode
+@item pass2
+use internal 2-pass ratecontrol in second pass mode
+@item gray
+only decode/encode grayscale
+@item psnr
+error[?] variables will be set during encoding
+@item truncated
+Input bitstream might be randomly truncated
+@item ildct
+use interlaced DCT
+@item low_delay
+force low delay
+@item global_header
+place global headers in extradata instead of every keyframe
+@item bitexact
+use only bitexact functions (except (I)DCT)
+@item aic
+H.263 advanced intra coding / MPEG-4 AC prediction
+@item ilme
+interlaced motion estimation
+@item cgop
+closed GOP
+@item output_corrupt
+Output even potentially corrupted frames
+@item drop_changed
+Drop frames whose parameters differ from first decoded frame
+@end table
+@item -flags2[:stream_specifier] @var{flags} (@emph{input/output,audio,video,subtitles})
+
+Possible values:
+@table @samp
+@item fast
+allow non-spec-compliant speedup tricks
+@item noout
+skip bitstream encoding
+@item ignorecrop
+ignore cropping information from sps
+@item local_header
+place global headers at every keyframe instead of in extradata
+@item chunks
+Frame data might be split into multiple chunks
+@item showall
+Show all frames before the first keyframe
+@item export_mvs
+export motion vectors through frame side data
+@item skip_manual
+do not skip samples and export skip information as frame side data
+@item ass_ro_flush_noop
+do not reset ASS ReadOrder field on flush
+@end table
+@item -export_side_data[:stream_specifier] @var{flags} (@emph{input/output,audio,video,subtitles})
+Export metadata as side data
+
+Possible values:
+@table @samp
+@item mvs
+export motion vectors through frame side data
+@item prft
+export Producer Reference Time through packet side data
+@item venc_params
+export video encoding parameters through frame side data
+@item film_grain
+export film grain parameters through frame side data
+@end table
+@item -g[:stream_specifier] @var{integer} (@emph{output,video})
+set the group of picture (GOP) size
+@item -ar[:stream_specifier] @var{integer} (@emph{input/output,audio})
+set audio sampling rate (in Hz)
+@item -ac[:stream_specifier] @var{integer} (@emph{input/output,audio})
+set number of audio channels
+@item -cutoff[:stream_specifier] @var{integer} (@emph{output,audio})
+set cutoff bandwidth
+@item -frame_size[:stream_specifier] @var{integer} (@emph{output,audio})
+@item -qcomp[:stream_specifier] @var{float} (@emph{output,video})
+video quantizer scale compression (VBR). Constant of ratecontrol equation. Recommended range for default rc_eq: 0.0-1.0
+@item -qblur[:stream_specifier] @var{float} (@emph{output,video})
+video quantizer scale blur (VBR)
+@item -qmin[:stream_specifier] @var{integer} (@emph{output,video})
+minimum video quantizer scale (VBR)
+@item -qmax[:stream_specifier] @var{integer} (@emph{output,video})
+maximum video quantizer scale (VBR)
+@item -qdiff[:stream_specifier] @var{integer} (@emph{output,video})
+maximum difference between the quantizer scales (VBR)
+@item -bf[:stream_specifier] @var{integer} (@emph{output,video})
+set maximum number of B-frames between non-B-frames
+@item -b_qfactor[:stream_specifier] @var{float} (@emph{output,video})
+QP factor between P- and B-frames
+@item -b_strategy[:stream_specifier] @var{integer} (@emph{output,video})
+strategy to choose between I/P/B-frames
+@item -ps[:stream_specifier] @var{integer} (@emph{output,video})
+RTP payload size in bytes
+@item -bug[:stream_specifier] @var{flags} (@emph{input,video})
+work around not autodetected encoder bugs
+
+Possible values:
+@table @samp
+@item autodetect
+
+@item xvid_ilace
+Xvid interlacing bug (autodetected if FOURCC == XVIX)
+@item ump4
+(autodetected if FOURCC == UMP4)
+@item no_padding
+padding bug (autodetected)
+@item amv
+
+@item qpel_chroma
+
+@item std_qpel
+old standard qpel (autodetected per FOURCC/version)
+@item qpel_chroma2
+
+@item direct_blocksize
+direct-qpel-blocksize bug (autodetected per FOURCC/version)
+@item edge
+edge padding bug (autodetected per FOURCC/version)
+@item hpel_chroma
+
+@item dc_clip
+
+@item ms
+work around various bugs in Microsoft's broken decoders
+@item trunc
+truncated frames
+@item iedge
+
+@end table
+@item -strict[:stream_specifier] @var{integer} (@emph{input/output,audio,video})
+how strictly to follow the standards
+
+Possible values:
+@table @samp
+@item very
+strictly conform to a older more strict version of the spec or reference software
+@item strict
+strictly conform to all the things in the spec no matter what the consequences
+@item normal
+
+@item unofficial
+allow unofficial extensions
+@item experimental
+allow non-standardized experimental things
+@end table
+@item -b_qoffset[:stream_specifier] @var{float} (@emph{output,video})
+QP offset between P- and B-frames
+@item -err_detect[:stream_specifier] @var{flags} (@emph{input/output,audio,video,subtitles})
+set error detection flags
+
+Possible values:
+@table @samp
+@item crccheck
+verify embedded CRCs
+@item bitstream
+detect bitstream specification deviations
+@item buffer
+detect improper bitstream length
+@item explode
+abort decoding on minor error detection
+@item ignore_err
+ignore errors
+@item careful
+consider things that violate the spec, are fast to check and have not been seen in the wild as errors
+@item compliant
+consider all spec non compliancies as errors
+@item aggressive
+consider things that a sane encoder should not do as an error
+@end table
+@item -mpeg_quant[:stream_specifier] @var{integer} (@emph{output,video})
+use MPEG quantizers instead of H.263
+@item -maxrate[:stream_specifier] @var{integer} (@emph{output,audio,video})
+maximum bitrate (in bits/s). Used for VBV together with bufsize.
+@item -minrate[:stream_specifier] @var{integer} (@emph{output,audio,video})
+minimum bitrate (in bits/s). Most useful in setting up a CBR encode. It is of little use otherwise.
+@item -bufsize[:stream_specifier] @var{integer} (@emph{output,audio,video})
+set ratecontrol buffer size (in bits)
+@item -i_qfactor[:stream_specifier] @var{float} (@emph{output,video})
+QP factor between P- and I-frames
+@item -i_qoffset[:stream_specifier] @var{float} (@emph{output,video})
+QP offset between P- and I-frames
+@item -dct[:stream_specifier] @var{integer} (@emph{output,video})
+DCT algorithm
+
+Possible values:
+@table @samp
+@item auto
+autoselect a good one
+@item fastint
+fast integer
+@item int
+accurate integer
+@item mmx
+
+@item altivec
+
+@item faan
+floating point AAN DCT
+@end table
+@item -lumi_mask[:stream_specifier] @var{float} (@emph{output,video})
+compresses bright areas stronger than medium ones
+@item -tcplx_mask[:stream_specifier] @var{float} (@emph{output,video})
+temporal complexity masking
+@item -scplx_mask[:stream_specifier] @var{float} (@emph{output,video})
+spatial complexity masking
+@item -p_mask[:stream_specifier] @var{float} (@emph{output,video})
+inter masking
+@item -dark_mask[:stream_specifier] @var{float} (@emph{output,video})
+compresses dark areas stronger than medium ones
+@item -idct[:stream_specifier] @var{integer} (@emph{input/output,video})
+select IDCT implementation
+
+Possible values:
+@table @samp
+@item auto
+
+@item int
+
+@item simple
+
+@item simplemmx
+
+@item arm
+
+@item altivec
+
+@item simplearm
+
+@item simplearmv5te
+
+@item simplearmv6
+
+@item simpleneon
+
+@item xvid
+
+@item xvidmmx
+deprecated, for compatibility only
+@item faani
+floating point AAN IDCT
+@item simpleauto
+
+@end table
+@item -ec[:stream_specifier] @var{flags} (@emph{input,video})
+set error concealment strategy
+
+Possible values:
+@table @samp
+@item guess_mvs
+iterative motion vector (MV) search (slow)
+@item deblock
+use strong deblock filter for damaged MBs
+@item favor_inter
+favor predicting from the previous frame
+@end table
+@item -pred[:stream_specifier] @var{integer} (@emph{output,video})
+prediction method
+
+Possible values:
+@table @samp
+@item left
+
+@item plane
+
+@item median
+
+@end table
+@item -aspect[:stream_specifier] @var{rational number} (@emph{output,video})
+sample aspect ratio
+@item -sar[:stream_specifier] @var{rational number} (@emph{output,video})
+sample aspect ratio
+@item -debug[:stream_specifier] @var{flags} (@emph{input/output,audio,video,subtitles})
+print specific debug info
+
+Possible values:
+@table @samp
+@item pict
+picture info
+@item rc
+rate control
+@item bitstream
+
+@item mb_type
+macroblock (MB) type
+@item qp
+per-block quantization parameter (QP)
+@item dct_coeff
+
+@item green_metadata
+
+@item skip
+
+@item startcode
+
+@item er
+error recognition
+@item mmco
+memory management control operations (H.264)
+@item bugs
+
+@item buffers
+picture buffer allocations
+@item thread_ops
+threading operations
+@item nomc
+skip motion compensation
+@end table
+@item -dia_size[:stream_specifier] @var{integer} (@emph{output,video})
+diamond type & size for motion estimation
+@item -last_pred[:stream_specifier] @var{integer} (@emph{output,video})
+amount of motion predictors from the previous frame
+@item -preme[:stream_specifier] @var{integer} (@emph{output,video})
+pre motion estimation
+@item -pre_dia_size[:stream_specifier] @var{integer} (@emph{output,video})
+diamond type & size for motion estimation pre-pass
+@item -subq[:stream_specifier] @var{integer} (@emph{output,video})
+sub-pel motion estimation quality
+@item -me_range[:stream_specifier] @var{integer} (@emph{output,video})
+limit motion vectors range (1023 for DivX player)
+@item -global_quality[:stream_specifier] @var{integer} (@emph{output,audio,video})
+@item -coder[:stream_specifier] @var{integer} (@emph{output,video})
+
+Possible values:
+@table @samp
+@item vlc
+variable length coder / Huffman coder
+@item ac
+arithmetic coder
+@item raw
+raw (no encoding)
+@item rle
+run-length coder
+@end table
+@item -context[:stream_specifier] @var{integer} (@emph{output,video})
+context model
+@item -mbd[:stream_specifier] @var{integer} (@emph{output,video})
+macroblock decision algorithm (high quality mode)
+
+Possible values:
+@table @samp
+@item simple
+use mbcmp
+@item bits
+use fewest bits
+@item rd
+use best rate distortion
+@end table
+@item -sc_threshold[:stream_specifier] @var{integer} (@emph{output,video})
+scene change threshold
+@item -nr[:stream_specifier] @var{integer} (@emph{output,video})
+noise reduction
+@item -rc_init_occupancy[:stream_specifier] @var{integer} (@emph{output,video})
+number of bits which should be loaded into the rc buffer before decoding starts
+@item -threads[:stream_specifier] @var{integer} (@emph{input/output,audio,video})
+set the number of threads
+
+Possible values:
+@table @samp
+@item auto
+autodetect a suitable number of threads to use
+@end table
+@item -dc[:stream_specifier] @var{integer} (@emph{output,video})
+intra_dc_precision
+@item -nssew[:stream_specifier] @var{integer} (@emph{output,video})
+nsse weight
+@item -skip_top[:stream_specifier] @var{integer} (@emph{input,video})
+number of macroblock rows at the top which are skipped
+@item -skip_bottom[:stream_specifier] @var{integer} (@emph{input,video})
+number of macroblock rows at the bottom which are skipped
+@item -profile[:stream_specifier] @var{integer} (@emph{output,audio,video})
+
+Possible values:
+@table @samp
+@item unknown
+
+@item main10
+
+@end table
+@item -level[:stream_specifier] @var{integer} (@emph{output,audio,video})
+
+Possible values:
+@table @samp
+@item unknown
+
+@end table
+@item -lowres[:stream_specifier] @var{integer} (@emph{input,audio,video})
+decode at 1= 1/2, 2=1/4, 3=1/8 resolutions
+@item -skip_threshold[:stream_specifier] @var{integer} (@emph{output,video})
+frame skip threshold
+@item -skip_factor[:stream_specifier] @var{integer} (@emph{output,video})
+frame skip factor
+@item -skip_exp[:stream_specifier] @var{integer} (@emph{output,video})
+frame skip exponent
+@item -skipcmp[:stream_specifier] @var{integer} (@emph{output,video})
+frame skip compare function
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item dctmax
+
+@item chroma
+
+@item msad
+sum of absolute differences, median predicted
+@end table
+@item -cmp[:stream_specifier] @var{integer} (@emph{output,video})
+full-pel ME compare function
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item dctmax
+
+@item chroma
+
+@item msad
+sum of absolute differences, median predicted
+@end table
+@item -subcmp[:stream_specifier] @var{integer} (@emph{output,video})
+sub-pel ME compare function
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item dctmax
+
+@item chroma
+
+@item msad
+sum of absolute differences, median predicted
+@end table
+@item -mbcmp[:stream_specifier] @var{integer} (@emph{output,video})
+macroblock compare function
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item dctmax
+
+@item chroma
+
+@item msad
+sum of absolute differences, median predicted
+@end table
+@item -ildctcmp[:stream_specifier] @var{integer} (@emph{output,video})
+interlaced DCT compare function
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item dctmax
+
+@item chroma
+
+@item msad
+sum of absolute differences, median predicted
+@end table
+@item -precmp[:stream_specifier] @var{integer} (@emph{output,video})
+pre motion estimation compare function
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item dctmax
+
+@item chroma
+
+@item msad
+sum of absolute differences, median predicted
+@end table
+@item -mblmin[:stream_specifier] @var{integer} (@emph{output,video})
+minimum macroblock Lagrange factor (VBR)
+@item -mblmax[:stream_specifier] @var{integer} (@emph{output,video})
+maximum macroblock Lagrange factor (VBR)
+@item -mepc[:stream_specifier] @var{integer} (@emph{output,video})
+motion estimation bitrate penalty compensation (1.0 = 256)
+@item -skip_loop_filter[:stream_specifier] @var{integer} (@emph{input,video})
+skip loop filtering process for the selected frames
+
+Possible values:
+@table @samp
+@item none
+discard no frame
+@item default
+discard useless frames
+@item noref
+discard all non-reference frames
+@item bidir
+discard all bidirectional frames
+@item nokey
+discard all frames except keyframes
+@item nointra
+discard all frames except I frames
+@item all
+discard all frames
+@end table
+@item -skip_idct[:stream_specifier] @var{integer} (@emph{input,video})
+skip IDCT/dequantization for the selected frames
+
+Possible values:
+@table @samp
+@item none
+discard no frame
+@item default
+discard useless frames
+@item noref
+discard all non-reference frames
+@item bidir
+discard all bidirectional frames
+@item nokey
+discard all frames except keyframes
+@item nointra
+discard all frames except I frames
+@item all
+discard all frames
+@end table
+@item -skip_frame[:stream_specifier] @var{integer} (@emph{input,video})
+skip decoding for the selected frames
+
+Possible values:
+@table @samp
+@item none
+discard no frame
+@item default
+discard useless frames
+@item noref
+discard all non-reference frames
+@item bidir
+discard all bidirectional frames
+@item nokey
+discard all frames except keyframes
+@item nointra
+discard all frames except I frames
+@item all
+discard all frames
+@end table
+@item -bidir_refine[:stream_specifier] @var{integer} (@emph{output,video})
+refine the two motion vectors used in bidirectional macroblocks
+@item -brd_scale[:stream_specifier] @var{integer} (@emph{output,video})
+downscale frames for dynamic B-frame decision
+@item -keyint_min[:stream_specifier] @var{integer} (@emph{output,video})
+minimum interval between IDR-frames
+@item -refs[:stream_specifier] @var{integer} (@emph{output,video})
+reference frames to consider for motion compensation
+@item -chromaoffset[:stream_specifier] @var{integer} (@emph{output,video})
+chroma QP offset from luma
+@item -trellis[:stream_specifier] @var{integer} (@emph{output,audio,video})
+rate-distortion optimal quantization
+@item -mv0_threshold[:stream_specifier] @var{integer} (@emph{output,video})
+@item -b_sensitivity[:stream_specifier] @var{integer} (@emph{output,video})
+adjust sensitivity of b_frame_strategy 1
+@item -compression_level[:stream_specifier] @var{integer} (@emph{output,audio,video})
+@item -min_prediction_order[:stream_specifier] @var{integer} (@emph{output,audio})
+@item -max_prediction_order[:stream_specifier] @var{integer} (@emph{output,audio})
+@item -timecode_frame_start[:stream_specifier] @var{integer} (@emph{output,video})
+GOP timecode frame start number, in non-drop-frame format
+@item -channel_layout[:stream_specifier] @var{value} (@emph{input/output,audio})
+
+Possible values:
+@table @samp
+@end table
+@item -request_channel_layout[:stream_specifier] @var{value} (@emph{input,audio})
+
+Possible values:
+@table @samp
+@end table
+@item -rc_max_vbv_use[:stream_specifier] @var{float} (@emph{output,video})
+@item -rc_min_vbv_use[:stream_specifier] @var{float} (@emph{output,video})
+@item -ticks_per_frame[:stream_specifier] @var{integer} (@emph{input/output,audio,video})
+@item -color_primaries[:stream_specifier] @var{integer} (@emph{input/output,video})
+color primaries
+
+Possible values:
+@table @samp
+@item bt709
+BT.709
+@item unknown
+Unspecified
+@item bt470m
+BT.470 M
+@item bt470bg
+BT.470 BG
+@item smpte170m
+SMPTE 170 M
+@item smpte240m
+SMPTE 240 M
+@item film
+Film
+@item bt2020
+BT.2020
+@item smpte428
+SMPTE 428-1
+@item smpte428_1
+SMPTE 428-1
+@item smpte431
+SMPTE 431-2
+@item smpte432
+SMPTE 422-1
+@item jedec-p22
+JEDEC P22
+@item ebu3213
+EBU 3213-E
+@item unspecified
+Unspecified
+@end table
+@item -color_trc[:stream_specifier] @var{integer} (@emph{input/output,video})
+color transfer characteristics
+
+Possible values:
+@table @samp
+@item bt709
+BT.709
+@item unknown
+Unspecified
+@item gamma22
+BT.470 M
+@item gamma28
+BT.470 BG
+@item smpte170m
+SMPTE 170 M
+@item smpte240m
+SMPTE 240 M
+@item linear
+Linear
+@item log100
+Log
+@item log316
+Log square root
+@item iec61966-2-4
+IEC 61966-2-4
+@item bt1361e
+BT.1361
+@item iec61966-2-1
+IEC 61966-2-1
+@item bt2020-10
+BT.2020 - 10 bit
+@item bt2020-12
+BT.2020 - 12 bit
+@item smpte2084
+SMPTE 2084
+@item smpte428
+SMPTE 428-1
+@item arib-std-b67
+ARIB STD-B67
+@item unspecified
+Unspecified
+@item log
+Log
+@item log_sqrt
+Log square root
+@item iec61966_2_4
+IEC 61966-2-4
+@item bt1361
+BT.1361
+@item iec61966_2_1
+IEC 61966-2-1
+@item bt2020_10bit
+BT.2020 - 10 bit
+@item bt2020_12bit
+BT.2020 - 12 bit
+@item smpte428_1
+SMPTE 428-1
+@end table
+@item -colorspace[:stream_specifier] @var{integer} (@emph{input/output,video})
+color space
+
+Possible values:
+@table @samp
+@item rgb
+RGB
+@item bt709
+BT.709
+@item unknown
+Unspecified
+@item fcc
+FCC
+@item bt470bg
+BT.470 BG
+@item smpte170m
+SMPTE 170 M
+@item smpte240m
+SMPTE 240 M
+@item ycgco
+YCGCO
+@item bt2020nc
+BT.2020 NCL
+@item bt2020c
+BT.2020 CL
+@item smpte2085
+SMPTE 2085
+@item chroma-derived-nc
+Chroma-derived NCL
+@item chroma-derived-c
+Chroma-derived CL
+@item ictcp
+ICtCp
+@item unspecified
+Unspecified
+@item ycocg
+YCGCO
+@item bt2020_ncl
+BT.2020 NCL
+@item bt2020_cl
+BT.2020 CL
+@end table
+@item -color_range[:stream_specifier] @var{integer} (@emph{input/output,video})
+color range
+
+Possible values:
+@table @samp
+@item unknown
+Unspecified
+@item tv
+MPEG (219*2^(n-8))
+@item pc
+JPEG (2^n-1)
+@item unspecified
+Unspecified
+@item mpeg
+MPEG (219*2^(n-8))
+@item jpeg
+JPEG (2^n-1)
+@end table
+@item -chroma_sample_location[:stream_specifier] @var{integer} (@emph{input/output,video})
+chroma sample location
+
+Possible values:
+@table @samp
+@item unknown
+Unspecified
+@item left
+Left
+@item center
+Center
+@item topleft
+Top-left
+@item top
+Top
+@item bottomleft
+Bottom-left
+@item bottom
+Bottom
+@item unspecified
+Unspecified
+@end table
+@item -slices[:stream_specifier] @var{integer} (@emph{output,video})
+set the number of slices, used in parallelized encoding
+@item -thread_type[:stream_specifier] @var{flags} (@emph{input/output,audio,video})
+select multithreading type
+
+Possible values:
+@table @samp
+@item slice
+
+@item frame
+
+@end table
+@item -audio_service_type[:stream_specifier] @var{integer} (@emph{output,audio})
+audio service type
+
+Possible values:
+@table @samp
+@item ma
+Main Audio Service
+@item ef
+Effects
+@item vi
+Visually Impaired
+@item hi
+Hearing Impaired
+@item di
+Dialogue
+@item co
+Commentary
+@item em
+Emergency
+@item vo
+Voice Over
+@item ka
+Karaoke
+@end table
+@item -request_sample_fmt[:stream_specifier] @var{value} (@emph{input,audio})
+sample format audio decoders should prefer
+
+Possible values:
+@table @samp
+@end table
+@item -sub_charenc[:stream_specifier] @var{string} (@emph{input,subtitles})
+set input text subtitles character encoding
+@item -sub_charenc_mode[:stream_specifier] @var{flags} (@emph{input,subtitles})
+set input text subtitles character encoding mode
+
+Possible values:
+@table @samp
+@item do_nothing
+
+@item auto
+
+@item pre_decoder
+
+@item ignore
+
+@end table
+@item -sub_text_format[:stream_specifier] @var{integer} (@emph{input,subtitles})
+set decoded text subtitle format
+
+Possible values:
+@table @samp
+@item ass
+
+@item ass_with_timings
+
+@end table
+@item -refcounted_frames[:stream_specifier] @var{value} (@emph{input,audio,video})
+@item -side_data_only_packets[:stream_specifier] @var{value} (@emph{output,audio,video})
+@item -apply_cropping[:stream_specifier] @var{value} (@emph{input,video})
+@item -skip_alpha[:stream_specifier] @var{value} (@emph{input,video})
+Skip processing alpha
+@item -field_order[:stream_specifier] @var{integer} (@emph{input/output,video})
+Field order
+
+Possible values:
+@table @samp
+@item progressive
+
+@item tt
+
+@item bb
+
+@item tb
+
+@item bt
+
+@end table
+@item -dump_separator[:stream_specifier] @var{string} (@emph{input/output,audio,video,subtitles})
+set information dump field separator
+@item -codec_whitelist[:stream_specifier] @var{string} (@emph{input,audio,video,subtitles})
+List of decoders that are allowed to be used
+@item -max_pixels[:stream_specifier] @var{integer} (@emph{input/output,audio,video,subtitles})
+Maximum number of pixels
+@item -max_samples[:stream_specifier] @var{integer} (@emph{input/output,audio})
+Maximum number of samples
+@item -hwaccel_flags[:stream_specifier] @var{flags} (@emph{input,video})
+
+Possible values:
+@table @samp
+@item ignore_level
+ignore level even if the codec level used is unknown or higher than the maximum supported level reported by the hardware driver
+@item allow_high_depth
+allow to output YUV pixel formats with a different chroma sampling than 4:2:0 and/or other than 8 bits per component
+@item allow_profile_mismatch
+attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream
+@end table
+@item -extra_hw_frames[:stream_specifier] @var{integer} (@emph{input,video})
+Number of extra hardware frames to allocate for the user
+@item -discard_damaged_percentage[:stream_specifier] @var{integer} (@emph{input,video})
+Percentage of damaged samples to discard a frame
+@end table
diff --git a/extern/ffmpeg/doc/avoptions_format.texi b/extern/ffmpeg/doc/avoptions_format.texi
new file mode 100644
index 0000000000..8deac91b69
--- /dev/null
+++ b/extern/ffmpeg/doc/avoptions_format.texi
@@ -0,0 +1,206 @@
+@c DO NOT EDIT THIS FILE!
+@c It was generated by print_options.
+
+@section Format AVOptions
+@table @option
+@item -avioflags @var{flags} (@emph{input/output})
+
+Possible values:
+@table @samp
+@item direct
+reduce buffering
+@end table
+@item -probesize @var{integer} (@emph{input})
+set probing size
+@item -formatprobesize @var{integer} (@emph{input})
+number of bytes to probe file format
+@item -packetsize @var{integer} (@emph{output})
+set packet size
+@item -fflags @var{flags} (@emph{input/output})
+
+Possible values:
+@table @samp
+@item flush_packets
+reduce the latency by flushing out packets immediately
+@item ignidx
+ignore index
+@item genpts
+generate pts
+@item nofillin
+do not fill in missing values that can be exactly calculated
+@item noparse
+disable AVParsers, this needs nofillin too
+@item igndts
+ignore dts
+@item discardcorrupt
+discard corrupted frames
+@item sortdts
+try to interleave outputted packets by dts
+@item keepside
+deprecated, does nothing
+@item fastseek
+fast but inaccurate seeks
+@item latm
+deprecated, does nothing
+@item nobuffer
+reduce the latency introduced by optional buffering
+@item bitexact
+do not write random/volatile data
+@item shortest
+stop muxing with the shortest stream
+@item autobsf
+add needed bsfs automatically
+@end table
+@item -seek2any @var{value} (@emph{input})
+allow seeking to non-keyframes on demuxer level when supported
+@item -analyzeduration @var{integer} (@emph{input})
+specify how many microseconds are analyzed to probe the input
+@item -cryptokey @var{hexadecimal string} (@emph{input})
+decryption key
+@item -indexmem @var{integer} (@emph{input})
+max memory used for timestamp index (per stream)
+@item -rtbufsize @var{integer} (@emph{input})
+max memory used for buffering real-time frames
+@item -fdebug @var{flags} (@emph{input/output})
+print specific debug info
+
+Possible values:
+@table @samp
+@item ts
+
+@end table
+@item -max_delay @var{integer} (@emph{input/output})
+maximum muxing or demuxing delay in microseconds
+@item -start_time_realtime @var{integer} (@emph{output})
+wall-clock time when stream begins (PTS==0)
+@item -fpsprobesize @var{integer} (@emph{input})
+number of frames used to probe fps
+@item -audio_preload @var{integer} (@emph{output})
+microseconds by which audio packets should be interleaved earlier
+@item -chunk_duration @var{integer} (@emph{output})
+microseconds for each chunk
+@item -chunk_size @var{integer} (@emph{output})
+size in bytes for each chunk
+@item -f_err_detect @var{flags} (@emph{input})
+set error detection flags (deprecated; use err_detect, save via avconv)
+
+Possible values:
+@table @samp
+@item crccheck
+verify embedded CRCs
+@item bitstream
+detect bitstream specification deviations
+@item buffer
+detect improper bitstream length
+@item explode
+abort decoding on minor error detection
+@item ignore_err
+ignore errors
+@item careful
+consider things that violate the spec, are fast to check and have not been seen in the wild as errors
+@item compliant
+consider all spec non compliancies as errors
+@item aggressive
+consider things that a sane encoder shouldn't do as an error
+@end table
+@item -err_detect @var{flags} (@emph{input})
+set error detection flags
+
+Possible values:
+@table @samp
+@item crccheck
+verify embedded CRCs
+@item bitstream
+detect bitstream specification deviations
+@item buffer
+detect improper bitstream length
+@item explode
+abort decoding on minor error detection
+@item ignore_err
+ignore errors
+@item careful
+consider things that violate the spec, are fast to check and have not been seen in the wild as errors
+@item compliant
+consider all spec non compliancies as errors
+@item aggressive
+consider things that a sane encoder shouldn't do as an error
+@end table
+@item -use_wallclock_as_timestamps @var{value} (@emph{input})
+use wallclock as timestamps
+@item -skip_initial_bytes @var{integer} (@emph{input})
+set number of bytes to skip before reading header and frames
+@item -correct_ts_overflow @var{value} (@emph{input})
+correct single timestamp overflows
+@item -flush_packets @var{integer} (@emph{output})
+enable flushing of the I/O context after each packet
+@item -metadata_header_padding @var{integer} (@emph{output})
+set number of bytes to be written as padding in a metadata header
+@item -output_ts_offset @var{value} (@emph{output})
+set output timestamp offset
+@item -max_interleave_delta @var{integer} (@emph{output})
+maximum buffering duration for interleaving
+@item -f_strict @var{integer} (@emph{input/output})
+how strictly to follow the standards (deprecated; use strict, save via avconv)
+
+Possible values:
+@table @samp
+@item very
+strictly conform to a older more strict version of the spec or reference software
+@item strict
+strictly conform to all the things in the spec no matter what the consequences
+@item normal
+
+@item unofficial
+allow unofficial extensions
+@item experimental
+allow non-standardized experimental variants
+@end table
+@item -strict @var{integer} (@emph{input/output})
+how strictly to follow the standards
+
+Possible values:
+@table @samp
+@item very
+strictly conform to a older more strict version of the spec or reference software
+@item strict
+strictly conform to all the things in the spec no matter what the consequences
+@item normal
+
+@item unofficial
+allow unofficial extensions
+@item experimental
+allow non-standardized experimental variants
+@end table
+@item -max_ts_probe @var{integer} (@emph{input})
+maximum number of packets to read while waiting for the first timestamp
+@item -avoid_negative_ts @var{integer} (@emph{output})
+shift timestamps so they start at 0
+
+Possible values:
+@table @samp
+@item auto
+enabled when required by target format
+@item disabled
+do not change timestamps
+@item make_non_negative
+shift timestamps so they are non negative
+@item make_zero
+shift timestamps so they start at 0
+@end table
+@item -dump_separator @var{string} (@emph{input/output})
+set information dump field separator
+@item -codec_whitelist @var{string} (@emph{input})
+List of decoders that are allowed to be used
+@item -format_whitelist @var{string} (@emph{input})
+List of demuxers that are allowed to be used
+@item -protocol_whitelist @var{string} (@emph{input})
+List of protocols that are allowed to be used
+@item -protocol_blacklist @var{string} (@emph{input})
+List of protocols that are not allowed to be used
+@item -max_streams @var{integer} (@emph{input})
+maximum number of streams
+@item -skip_estimate_duration_from_pts @var{value} (@emph{input})
+skip duration calculation in estimate_timings_from_pts
+@item -max_probe_packets @var{integer} (@emph{input})
+Maximum number of packets to probe a codec
+@end table
diff --git a/extern/ffmpeg/doc/bitstream_filters.texi b/extern/ffmpeg/doc/bitstream_filters.texi
new file mode 100644
index 0000000000..60e729484d
--- /dev/null
+++ b/extern/ffmpeg/doc/bitstream_filters.texi
@@ -0,0 +1,799 @@
+@chapter Bitstream Filters
+@c man begin BITSTREAM FILTERS
+
+When you configure your FFmpeg build, all the supported bitstream
+filters are enabled by default. You can list all available ones using
+the configure option @code{--list-bsfs}.
+
+You can disable all the bitstream filters using the configure option
+@code{--disable-bsfs}, and selectively enable any bitstream filter using
+the option @code{--enable-bsf=BSF}, or you can disable a particular
+bitstream filter using the option @code{--disable-bsf=BSF}.
+
+The option @code{-bsfs} of the ff* tools will display the list of
+all the supported bitstream filters included in your build.
+
+The ff* tools have a -bsf option applied per stream, taking a
+comma-separated list of filters, whose parameters follow the filter
+name after a '='.
+
+@example
+ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1:opt2=str2][,filter2] OUTPUT
+@end example
+
+Below is a description of the currently available bitstream filters,
+with their parameters, if any.
+
+@section aac_adtstoasc
+
+Convert MPEG-2/4 AAC ADTS to an MPEG-4 Audio Specific Configuration
+bitstream.
+
+This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4
+ADTS header and removes the ADTS header.
+
+This filter is required for example when copying an AAC stream from a
+raw ADTS AAC or an MPEG-TS container to MP4A-LATM, to an FLV file, or
+to MOV/MP4 files and related formats such as 3GP or M4A. Please note
+that it is auto-inserted for MP4A-LATM and MOV/MP4 and related formats.
+
+@section av1_metadata
+
+Modify metadata embedded in an AV1 stream.
+
+@table @option
+@item td
+Insert or remove temporal delimiter OBUs in all temporal units of the
+stream.
+
+@table @samp
+@item insert
+Insert a TD at the beginning of every TU which does not already have one.
+@item remove
+Remove the TD from the beginning of every TU which has one.
+@end table
+
+@item color_primaries
+@item transfer_characteristics
+@item matrix_coefficients
+Set the color description fields in the stream (see AV1 section 6.4.2).
+
+@item color_range
+Set the color range in the stream (see AV1 section 6.4.2; note that
+this cannot be set for streams using BT.709 primaries, sRGB transfer
+characteristic and identity (RGB) matrix coefficients).
+@table @samp
+@item tv
+Limited range.
+@item pc
+Full range.
+@end table
+
+@item chroma_sample_position
+Set the chroma sample location in the stream (see AV1 section 6.4.2).
+This can only be set for 4:2:0 streams.
+
+@table @samp
+@item vertical
+Left position (matching the default in MPEG-2 and H.264).
+@item colocated
+Top-left position.
+@end table
+
+@item tick_rate
+Set the tick rate (@emph{num_units_in_display_tick / time_scale}) in
+the timing info in the sequence header.
+@item num_ticks_per_picture
+Set the number of ticks in each picture, to indicate that the stream
+has a fixed framerate. Ignored if @option{tick_rate} is not also set.
+
+@item delete_padding
+Deletes Padding OBUs.
+
+@end table
+
+@section chomp
+
+Remove zero padding at the end of a packet.
+
+@section dca_core
+
+Extract the core from a DCA/DTS stream, dropping extensions such as
+DTS-HD.
+
+@section dump_extra
+
+Add extradata to the beginning of the filtered packets except when
+said packets already exactly begin with the extradata that is intended
+to be added.
+
+@table @option
+@item freq
+The additional argument specifies which packets should be filtered.
+It accepts the values:
+@table @samp
+@item k
+@item keyframe
+add extradata to all key packets
+
+@item e
+@item all
+add extradata to all packets
+@end table
+@end table
+
+If not specified it is assumed @samp{k}.
+
+For example the following @command{ffmpeg} command forces a global
+header (thus disabling individual packet headers) in the H.264 packets
+generated by the @code{libx264} encoder, but corrects them by adding
+the header stored in extradata to the key packets:
+@example
+ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
+@end example
+
+@section eac3_core
+
+Extract the core from a E-AC-3 stream, dropping extra channels.
+
+@section extract_extradata
+
+Extract the in-band extradata.
+
+Certain codecs allow the long-term headers (e.g. MPEG-2 sequence headers,
+or H.264/HEVC (VPS/)SPS/PPS) to be transmitted either "in-band" (i.e. as a part
+of the bitstream containing the coded frames) or "out of band" (e.g. on the
+container level). This latter form is called "extradata" in FFmpeg terminology.
+
+This bitstream filter detects the in-band headers and makes them available as
+extradata.
+
+@table @option
+@item remove
+When this option is enabled, the long-term headers are removed from the
+bitstream after extraction.
+@end table
+
+@section filter_units
+
+Remove units with types in or not in a given set from the stream.
+
+@table @option
+@item pass_types
+List of unit types or ranges of unit types to pass through while removing
+all others. This is specified as a '|'-separated list of unit type values
+or ranges of values with '-'.
+
+@item remove_types
+Identical to @option{pass_types}, except the units in the given set
+removed and all others passed through.
+@end table
+
+Extradata is unchanged by this transformation, but note that if the stream
+contains inline parameter sets then the output may be unusable if they are
+removed.
+
+For example, to remove all non-VCL NAL units from an H.264 stream:
+@example
+ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=pass_types=1-5' OUTPUT
+@end example
+
+To remove all AUDs, SEI and filler from an H.265 stream:
+@example
+ffmpeg -i INPUT -c:v copy -bsf:v 'filter_units=remove_types=35|38-40' OUTPUT
+@end example
+
+@section hapqa_extract
+
+Extract Rgb or Alpha part of an HAPQA file, without recompression, in order to create an HAPQ or an HAPAlphaOnly file.
+
+@table @option
+@item texture
+Specifies the texture to keep.
+
+@table @option
+@item color
+@item alpha
+@end table
+
+@end table
+
+Convert HAPQA to HAPQ
+@example
+ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=color -tag:v HapY -metadata:s:v:0 encoder="HAPQ" hapq_file.mov
+@end example
+
+Convert HAPQA to HAPAlphaOnly
+@example
+ffmpeg -i hapqa_inputfile.mov -c copy -bsf:v hapqa_extract=texture=alpha -tag:v HapA -metadata:s:v:0 encoder="HAPAlpha Only" hapalphaonly_file.mov
+@end example
+
+@section h264_metadata
+
+Modify metadata embedded in an H.264 stream.
+
+@table @option
+@item aud
+Insert or remove AUD NAL units in all access units of the stream.
+
+@table @samp
+@item insert
+@item remove
+@end table
+
+@item sample_aspect_ratio
+Set the sample aspect ratio of the stream in the VUI parameters.
+
+@item overscan_appropriate_flag
+Set whether the stream is suitable for display using overscan
+or not (see H.264 section E.2.1).
+
+@item video_format
+@item video_full_range_flag
+Set the video format in the stream (see H.264 section E.2.1 and
+table E-2).
+
+@item colour_primaries
+@item transfer_characteristics
+@item matrix_coefficients
+Set the colour description in the stream (see H.264 section E.2.1
+and tables E-3, E-4 and E-5).
+
+@item chroma_sample_loc_type
+Set the chroma sample location in the stream (see H.264 section
+E.2.1 and figure E-1).
+
+@item tick_rate
+Set the tick rate (num_units_in_tick / time_scale) in the VUI
+parameters. This is the smallest time unit representable in the
+stream, and in many cases represents the field rate of the stream
+(double the frame rate).
+@item fixed_frame_rate_flag
+Set whether the stream has fixed framerate - typically this indicates
+that the framerate is exactly half the tick rate, but the exact
+meaning is dependent on interlacing and the picture structure (see
+H.264 section E.2.1 and table E-6).
+
+@item crop_left
+@item crop_right
+@item crop_top
+@item crop_bottom
+Set the frame cropping offsets in the SPS. These values will replace
+the current ones if the stream is already cropped.
+
+These fields are set in pixels. Note that some sizes may not be
+representable if the chroma is subsampled or the stream is interlaced
+(see H.264 section 7.4.2.1.1).
+
+@item sei_user_data
+Insert a string as SEI unregistered user data. The argument must
+be of the form @emph{UUID+string}, where the UUID is as hex digits
+possibly separated by hyphens, and the string can be anything.
+
+For example, @samp{086f3693-b7b3-4f2c-9653-21492feee5b8+hello} will
+insert the string ``hello'' associated with the given UUID.
+
+@item delete_filler
+Deletes both filler NAL units and filler SEI messages.
+
+@item level
+Set the level in the SPS. Refer to H.264 section A.3 and tables A-1
+to A-5.
+
+The argument must be the name of a level (for example, @samp{4.2}), a
+level_idc value (for example, @samp{42}), or the special name @samp{auto}
+indicating that the filter should attempt to guess the level from the
+input stream properties.
+
+@end table
+
+@section h264_mp4toannexb
+
+Convert an H.264 bitstream from length prefixed mode to start code
+prefixed mode (as defined in the Annex B of the ITU-T H.264
+specification).
+
+This is required by some streaming formats, typically the MPEG-2
+transport stream format (muxer @code{mpegts}).
+
+For example to remux an MP4 file containing an H.264 stream to mpegts
+format with @command{ffmpeg}, you can use the command:
+
+@example
+ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts
+@end example
+
+Please note that this filter is auto-inserted for MPEG-TS (muxer
+@code{mpegts}) and raw H.264 (muxer @code{h264}) output formats.
+
+@section h264_redundant_pps
+
+This applies a specific fixup to some Blu-ray streams which contain
+redundant PPSs modifying irrelevant parameters of the stream which
+confuse other transformations which require correct extradata.
+
+A new single global PPS is created, and all of the redundant PPSs
+within the stream are removed.
+
+@section hevc_metadata
+
+Modify metadata embedded in an HEVC stream.
+
+@table @option
+@item aud
+Insert or remove AUD NAL units in all access units of the stream.
+
+@table @samp
+@item insert
+@item remove
+@end table
+
+@item sample_aspect_ratio
+Set the sample aspect ratio in the stream in the VUI parameters.
+
+@item video_format
+@item video_full_range_flag
+Set the video format in the stream (see H.265 section E.3.1 and
+table E.2).
+
+@item colour_primaries
+@item transfer_characteristics
+@item matrix_coefficients
+Set the colour description in the stream (see H.265 section E.3.1
+and tables E.3, E.4 and E.5).
+
+@item chroma_sample_loc_type
+Set the chroma sample location in the stream (see H.265 section
+E.3.1 and figure E.1).
+
+@item tick_rate
+Set the tick rate in the VPS and VUI parameters (num_units_in_tick /
+time_scale). Combined with @option{num_ticks_poc_diff_one}, this can
+set a constant framerate in the stream. Note that it is likely to be
+overridden by container parameters when the stream is in a container.
+
+@item num_ticks_poc_diff_one
+Set poc_proportional_to_timing_flag in VPS and VUI and use this value
+to set num_ticks_poc_diff_one_minus1 (see H.265 sections 7.4.3.1 and
+E.3.1). Ignored if @option{tick_rate} is not also set.
+
+@item crop_left
+@item crop_right
+@item crop_top
+@item crop_bottom
+Set the conformance window cropping offsets in the SPS. These values
+will replace the current ones if the stream is already cropped.
+
+These fields are set in pixels. Note that some sizes may not be
+representable if the chroma is subsampled (H.265 section 7.4.3.2.1).
+
+@item level
+Set the level in the VPS and SPS. See H.265 section A.4 and tables
+A.6 and A.7.
+
+The argument must be the name of a level (for example, @samp{5.1}), a
+@emph{general_level_idc} value (for example, @samp{153} for level 5.1),
+or the special name @samp{auto} indicating that the filter should
+attempt to guess the level from the input stream properties.
+
+@end table
+
+@section hevc_mp4toannexb
+
+Convert an HEVC/H.265 bitstream from length prefixed mode to start code
+prefixed mode (as defined in the Annex B of the ITU-T H.265
+specification).
+
+This is required by some streaming formats, typically the MPEG-2
+transport stream format (muxer @code{mpegts}).
+
+For example to remux an MP4 file containing an HEVC stream to mpegts
+format with @command{ffmpeg}, you can use the command:
+
+@example
+ffmpeg -i INPUT.mp4 -codec copy -bsf:v hevc_mp4toannexb OUTPUT.ts
+@end example
+
+Please note that this filter is auto-inserted for MPEG-TS (muxer
+@code{mpegts}) and raw HEVC/H.265 (muxer @code{h265} or
+@code{hevc}) output formats.
+
+@section imxdump
+
+Modifies the bitstream to fit in MOV and to be usable by the Final Cut
+Pro decoder. This filter only applies to the mpeg2video codec, and is
+likely not needed for Final Cut Pro 7 and newer with the appropriate
+@option{-tag:v}.
+
+For example, to remux 30 MB/sec NTSC IMX to MOV:
+
+@example
+ffmpeg -i input.mxf -c copy -bsf:v imxdump -tag:v mx3n output.mov
+@end example
+
+@section mjpeg2jpeg
+
+Convert MJPEG/AVI1 packets to full JPEG/JFIF packets.
+
+MJPEG is a video codec wherein each video frame is essentially a
+JPEG image. The individual frames can be extracted without loss,
+e.g. by
+
+@example
+ffmpeg -i ../some_mjpeg.avi -c:v copy frames_%d.jpg
+@end example
+
+Unfortunately, these chunks are incomplete JPEG images, because
+they lack the DHT segment required for decoding. Quoting from
+@url{http://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml}:
+
+Avery Lee, writing in the rec.video.desktop newsgroup in 2001,
+commented that "MJPEG, or at least the MJPEG in AVIs having the
+MJPG fourcc, is restricted JPEG with a fixed -- and *omitted* --
+Huffman table. The JPEG must be YCbCr colorspace, it must be 4:2:2,
+and it must use basic Huffman encoding, not arithmetic or
+progressive. . . . You can indeed extract the MJPEG frames and
+decode them with a regular JPEG decoder, but you have to prepend
+the DHT segment to them, or else the decoder won't have any idea
+how to decompress the data. The exact table necessary is given in
+the OpenDML spec."
+
+This bitstream filter patches the header of frames extracted from an MJPEG
+stream (carrying the AVI1 header ID and lacking a DHT segment) to
+produce fully qualified JPEG images.
+
+@example
+ffmpeg -i mjpeg-movie.avi -c:v copy -bsf:v mjpeg2jpeg frame_%d.jpg
+exiftran -i -9 frame*.jpg
+ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
+@end example
+
+@section mjpegadump
+
+Add an MJPEG A header to the bitstream, to enable decoding by
+Quicktime.
+
+@anchor{mov2textsub}
+@section mov2textsub
+
+Extract a representable text file from MOV subtitles, stripping the
+metadata header from each subtitle packet.
+
+See also the @ref{text2movsub} filter.
+
+@section mp3decomp
+
+Decompress non-standard compressed MP3 audio headers.
+
+@section mpeg2_metadata
+
+Modify metadata embedded in an MPEG-2 stream.
+
+@table @option
+@item display_aspect_ratio
+Set the display aspect ratio in the stream.
+
+The following fixed values are supported:
+@table @option
+@item 4/3
+@item 16/9
+@item 221/100
+@end table
+Any other value will result in square pixels being signalled instead
+(see H.262 section 6.3.3 and table 6-3).
+
+@item frame_rate
+Set the frame rate in the stream. This is constructed from a table
+of known values combined with a small multiplier and divisor - if
+the supplied value is not exactly representable, the nearest
+representable value will be used instead (see H.262 section 6.3.3
+and table 6-4).
+
+@item video_format
+Set the video format in the stream (see H.262 section 6.3.6 and
+table 6-6).
+
+@item colour_primaries
+@item transfer_characteristics
+@item matrix_coefficients
+Set the colour description in the stream (see H.262 section 6.3.6
+and tables 6-7, 6-8 and 6-9).
+
+@end table
+
+@section mpeg4_unpack_bframes
+
+Unpack DivX-style packed B-frames.
+
+DivX-style packed B-frames are not valid MPEG-4 and were only a
+workaround for the broken Video for Windows subsystem.
+They use more space, can cause minor AV sync issues, require more
+CPU power to decode (unless the player has some decoded picture queue
+to compensate the 2,0,2,0 frame per packet style) and cause
+trouble if copied into a standard container like mp4 or mpeg-ps/ts,
+because MPEG-4 decoders may not be able to decode them, since they are
+not valid MPEG-4.
+
+For example to fix an AVI file containing an MPEG-4 stream with
+DivX-style packed B-frames using @command{ffmpeg}, you can use the command:
+
+@example
+ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
+@end example
+
+@section noise
+
+Damages the contents of packets or simply drops them without damaging the
+container. Can be used for fuzzing or testing error resilience/concealment.
+
+Parameters:
+@table @option
+@item amount
+A numeral string, whose value is related to how often output bytes will
+be modified. Therefore, values below or equal to 0 are forbidden, and
+the lower the more frequent bytes will be modified, with 1 meaning
+every byte is modified.
+@item dropamount
+A numeral string, whose value is related to how often packets will be dropped.
+Therefore, values below or equal to 0 are forbidden, and the lower the more
+frequent packets will be dropped, with 1 meaning every packet is dropped.
+@end table
+
+The following example applies the modification to every byte but does not drop
+any packets.
+@example
+ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv
+@end example
+
+@section null
+This bitstream filter passes the packets through unchanged.
+
+@section pcm_rechunk
+
+Repacketize PCM audio to a fixed number of samples per packet or a fixed packet
+rate per second. This is similar to the @ref{asetnsamples,,asetnsamples audio
+filter,ffmpeg-filters} but works on audio packets instead of audio frames.
+
+@table @option
+@item nb_out_samples, n
+Set the number of samples per each output audio packet. The number is intended
+as the number of samples @emph{per each channel}. Default value is 1024.
+
+@item pad, p
+If set to 1, the filter will pad the last audio packet with silence, so that it
+will contain the same number of samples (or roughly the same number of samples,
+see @option{frame_rate}) as the previous ones. Default value is 1.
+
+@item frame_rate, r
+This option makes the filter output a fixed number of packets per second instead
+of a fixed number of samples per packet. If the audio sample rate is not
+divisible by the frame rate then the number of samples will not be constant but
+will vary slightly so that each packet will start as close to the frame
+boundary as possible. Using this option has precedence over @option{nb_out_samples}.
+@end table
+
+You can generate the well known 1602-1601-1602-1601-1602 pattern of 48kHz audio
+for NTSC frame rate using the @option{frame_rate} option.
+@example
+ffmpeg -f lavfi -i sine=r=48000:d=1 -c pcm_s16le -bsf pcm_rechunk=r=30000/1001 -f framecrc -
+@end example
+
+@section prores_metadata
+
+Modify color property metadata embedded in prores stream.
+
+@table @option
+@item color_primaries
+Set the color primaries.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same color primaries property (default).
+
+@item unknown
+@item bt709
+@item bt470bg
+BT601 625
+
+@item smpte170m
+BT601 525
+
+@item bt2020
+@item smpte431
+DCI P3
+
+@item smpte432
+P3 D65
+
+@end table
+
+@item transfer_characteristics
+Set the color transfer.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same transfer characteristics property (default).
+
+@item unknown
+@item bt709
+BT 601, BT 709, BT 2020
+@item smpte2084
+SMPTE ST 2084
+@item arib-std-b67
+ARIB STD-B67
+@end table
+
+
+@item matrix_coefficients
+Set the matrix coefficient.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same colorspace property (default).
+
+@item unknown
+@item bt709
+@item smpte170m
+BT 601
+
+@item bt2020nc
+@end table
+@end table
+
+Set Rec709 colorspace for each frame of the file
+@example
+ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709 output.mov
+@end example
+
+Set Hybrid Log-Gamma parameters for each frame of the file
+@example
+ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt2020:color_trc=arib-std-b67:colorspace=bt2020nc output.mov
+@end example
+
+@section remove_extra
+
+Remove extradata from packets.
+
+It accepts the following parameter:
+@table @option
+@item freq
+Set which frame types to remove extradata from.
+
+@table @samp
+@item k
+Remove extradata from non-keyframes only.
+
+@item keyframe
+Remove extradata from keyframes only.
+
+@item e, all
+Remove extradata from all frames.
+
+@end table
+@end table
+
+@section setts
+Set PTS and DTS in packets.
+
+It accepts the following parameters:
+@table @option
+@item ts
+@item pts
+@item dts
+Set expressions for PTS, DTS or both.
+@end table
+
+The expressions are evaluated through the eval API and can contain the following
+constants:
+
+@table @option
+@item N
+The count of the input packet. Starting from 0.
+
+@item TS
+The demux timestamp in input in case of @code{ts} or @code{dts} option or presentation
+timestamp in case of @code{pts} option.
+
+@item POS
+The original position in the file of the packet, or undefined if undefined
+for the current packet
+
+@item DTS
+The demux timestamp in input.
+
+@item PTS
+The presentation timestamp in input.
+
+@item STARTDTS
+The DTS of the first packet.
+
+@item STARTPTS
+The PTS of the first packet.
+
+@item PREV_INDTS
+The previous input DTS.
+
+@item PREV_INPTS
+The previous input PTS.
+
+@item PREV_OUTDTS
+The previous output DTS.
+
+@item PREV_OUTPTS
+The previous output PTS.
+
+@item TB
+The timebase of stream packet belongs.
+
+@item SR
+The sample rate of stream packet belongs.
+@end table
+
+@anchor{text2movsub}
+@section text2movsub
+
+Convert text subtitles to MOV subtitles (as used by the @code{mov_text}
+codec) with metadata headers.
+
+See also the @ref{mov2textsub} filter.
+
+@section trace_headers
+
+Log trace output containing all syntax elements in the coded stream
+headers (everything above the level of individual coded blocks).
+This can be useful for debugging low-level stream issues.
+
+Supports AV1, H.264, H.265, (M)JPEG, MPEG-2 and VP9, but depending
+on the build only a subset of these may be available.
+
+@section truehd_core
+
+Extract the core from a TrueHD stream, dropping ATMOS data.
+
+@section vp9_metadata
+
+Modify metadata embedded in a VP9 stream.
+
+@table @option
+@item color_space
+Set the color space value in the frame header. Note that any frame
+set to RGB will be implicitly set to PC range and that RGB is
+incompatible with profiles 0 and 2.
+@table @samp
+@item unknown
+@item bt601
+@item bt709
+@item smpte170
+@item smpte240
+@item bt2020
+@item rgb
+@end table
+
+@item color_range
+Set the color range value in the frame header. Note that any value
+imposed by the color space will take precedence over this value.
+@table @samp
+@item tv
+@item pc
+@end table
+@end table
+
+@section vp9_superframe
+
+Merge VP9 invisible (alt-ref) frames back into VP9 superframes. This
+fixes merging of split/segmented VP9 streams where the alt-ref frame
+was split from its visible counterpart.
+
+@section vp9_superframe_split
+
+Split VP9 superframes into single frames.
+
+@section vp9_raw_reorder
+
+Given a VP9 stream with correct timestamps but possibly out of order,
+insert additional show-existing-frame packets to correct the ordering.
+
+@c man end BITSTREAM FILTERS
diff --git a/extern/ffmpeg/doc/bootstrap.min.css b/extern/ffmpeg/doc/bootstrap.min.css
new file mode 100644
index 0000000000..6f68017d58
--- /dev/null
+++ b/extern/ffmpeg/doc/bootstrap.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
diff --git a/extern/ffmpeg/doc/build_system.txt b/extern/ffmpeg/doc/build_system.txt
new file mode 100644
index 0000000000..0b1b0c2054
--- /dev/null
+++ b/extern/ffmpeg/doc/build_system.txt
@@ -0,0 +1,66 @@
+FFmpeg currently uses a custom build system, this text attempts to document
+some of its obscure features and options.
+
+Makefile variables:
+
+V
+ Disable the default terse mode, the full command issued by make and its
+ output will be shown on the screen.
+
+DBG
+ Preprocess x86 external assembler files to a .dbg.asm file in the object
+ directory, which then gets compiled. Helps in developing those assembler
+ files.
+
+DESTDIR
+ Destination directory for the install targets, useful to prepare packages
+ or install FFmpeg in cross-environments.
+
+GEN
+ Set to ‘1’ to generate the missing or mismatched references.
+
+Makefile targets:
+
+all
+ Default target, builds all the libraries and the executables.
+
+fate
+ Run the fate test suite, note that you must have installed it.
+
+fate-list
+ List all fate/regression test targets.
+
+install
+ Install headers, libraries and programs.
+
+examples
+ Build all examples located in doc/examples.
+
+checkheaders
+ Check headers dependencies.
+
+alltools
+ Build all tools in tools directory.
+
+config
+ Reconfigure the project with the current configuration.
+
+tools/target_dec__fuzzer
+ Build fuzzer to fuzz the specified decoder.
+
+tools/target_bsf__fuzzer
+ Build fuzzer to fuzz the specified bitstream filter.
+
+Useful standard make commands:
+make -t
+ Touch all files that otherwise would be built, this is useful to reduce
+ unneeded rebuilding when changing headers, but note that you must force rebuilds
+ of files that actually need it by hand then.
+
+make -j
+ Rebuild with multiple jobs at the same time. Faster on multi processor systems.
+
+make -k
+ Continue build in case of errors, this is useful for the regression tests
+ sometimes but note that it will still not run all reg tests.
+
diff --git a/extern/ffmpeg/doc/codecs.texi b/extern/ffmpeg/doc/codecs.texi
new file mode 100644
index 0000000000..9add7629cf
--- /dev/null
+++ b/extern/ffmpeg/doc/codecs.texi
@@ -0,0 +1,1154 @@
+@anchor{codec-options}
+@chapter Codec Options
+@c man begin CODEC OPTIONS
+
+libavcodec provides some generic global options, which can be set on
+all the encoders and decoders. In addition each codec may support
+so-called private options, which are specific for a given codec.
+
+Sometimes, a global option may only affect a specific kind of codec,
+and may be nonsensical or ignored by another, so you need to be aware
+of the meaning of the specified options. Also some options are
+meant only for decoding or encoding.
+
+Options may be set by specifying -@var{option} @var{value} in the
+FFmpeg tools, or by setting the value explicitly in the
+@code{AVCodecContext} options or using the @file{libavutil/opt.h} API
+for programmatic use.
+
+The list of supported options follow:
+
+@table @option
+@item b @var{integer} (@emph{encoding,audio,video})
+Set bitrate in bits/s. Default value is 200K.
+
+@item ab @var{integer} (@emph{encoding,audio})
+Set audio bitrate (in bits/s). Default value is 128K.
+
+@item bt @var{integer} (@emph{encoding,video})
+Set video bitrate tolerance (in bits/s). In 1-pass mode, bitrate
+tolerance specifies how far ratecontrol is willing to deviate from the
+target average bitrate value. This is not related to min/max
+bitrate. Lowering tolerance too much has an adverse effect on quality.
+
+@item flags @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
+Set generic flags.
+
+Possible values:
+@table @samp
+@item mv4
+Use four motion vector by macroblock (mpeg4).
+@item qpel
+Use 1/4 pel motion compensation.
+@item loop
+Use loop filter.
+@item qscale
+Use fixed qscale.
+@item pass1
+Use internal 2pass ratecontrol in first pass mode.
+@item pass2
+Use internal 2pass ratecontrol in second pass mode.
+@item gray
+Only decode/encode grayscale.
+@item psnr
+Set error[?] variables during encoding.
+@item truncated
+Input bitstream might be randomly truncated.
+@item drop_changed
+Don't output frames whose parameters differ from first decoded frame in stream.
+Error AVERROR_INPUT_CHANGED is returned when a frame is dropped.
+
+@item ildct
+Use interlaced DCT.
+@item low_delay
+Force low delay.
+@item global_header
+Place global headers in extradata instead of every keyframe.
+@item bitexact
+Only write platform-, build- and time-independent data. (except (I)DCT).
+This ensures that file and data checksums are reproducible and match between
+platforms. Its primary use is for regression testing.
+@item aic
+Apply H263 advanced intra coding / mpeg4 ac prediction.
+@item ilme
+Apply interlaced motion estimation.
+@item cgop
+Use closed gop.
+@item output_corrupt
+Output even potentially corrupted frames.
+@end table
+
+@item time_base @var{rational number}
+Set codec time base.
+
+It is the fundamental unit of time (in seconds) in terms of which
+frame timestamps are represented. For fixed-fps content, timebase
+should be @code{1 / frame_rate} and timestamp increments should be
+identically 1.
+
+@item g @var{integer} (@emph{encoding,video})
+Set the group of picture (GOP) size. Default value is 12.
+
+@item ar @var{integer} (@emph{decoding/encoding,audio})
+Set audio sampling rate (in Hz).
+
+@item ac @var{integer} (@emph{decoding/encoding,audio})
+Set number of audio channels.
+
+@item cutoff @var{integer} (@emph{encoding,audio})
+Set cutoff bandwidth. (Supported only by selected encoders, see
+their respective documentation sections.)
+
+@item frame_size @var{integer} (@emph{encoding,audio})
+Set audio frame size.
+
+Each submitted frame except the last must contain exactly frame_size
+samples per channel. May be 0 when the codec has
+CODEC_CAP_VARIABLE_FRAME_SIZE set, in that case the frame size is not
+restricted. It is set by some decoders to indicate constant frame
+size.
+
+@item frame_number @var{integer}
+Set the frame number.
+
+@item delay @var{integer}
+
+@item qcomp @var{float} (@emph{encoding,video})
+Set video quantizer scale compression (VBR). It is used as a constant
+in the ratecontrol equation. Recommended range for default rc_eq:
+0.0-1.0.
+
+@item qblur @var{float} (@emph{encoding,video})
+Set video quantizer scale blur (VBR).
+
+@item qmin @var{integer} (@emph{encoding,video})
+Set min video quantizer scale (VBR). Must be included between -1 and
+69, default value is 2.
+
+@item qmax @var{integer} (@emph{encoding,video})
+Set max video quantizer scale (VBR). Must be included between -1 and
+1024, default value is 31.
+
+@item qdiff @var{integer} (@emph{encoding,video})
+Set max difference between the quantizer scale (VBR).
+
+@item bf @var{integer} (@emph{encoding,video})
+Set max number of B frames between non-B-frames.
+
+Must be an integer between -1 and 16. 0 means that B-frames are
+disabled. If a value of -1 is used, it will choose an automatic value
+depending on the encoder.
+
+Default value is 0.
+
+@item b_qfactor @var{float} (@emph{encoding,video})
+Set qp factor between P and B frames.
+
+@item b_strategy @var{integer} (@emph{encoding,video})
+Set strategy to choose between I/P/B-frames.
+
+@item ps @var{integer} (@emph{encoding,video})
+Set RTP payload size in bytes.
+
+@item mv_bits @var{integer}
+@item header_bits @var{integer}
+@item i_tex_bits @var{integer}
+@item p_tex_bits @var{integer}
+@item i_count @var{integer}
+@item p_count @var{integer}
+@item skip_count @var{integer}
+@item misc_bits @var{integer}
+@item frame_bits @var{integer}
+@item codec_tag @var{integer}
+@item bug @var{flags} (@emph{decoding,video})
+Workaround not auto detected encoder bugs.
+
+Possible values:
+@table @samp
+@item autodetect
+
+@item xvid_ilace
+Xvid interlacing bug (autodetected if fourcc==XVIX)
+@item ump4
+(autodetected if fourcc==UMP4)
+@item no_padding
+padding bug (autodetected)
+@item amv
+
+@item qpel_chroma
+
+@item std_qpel
+old standard qpel (autodetected per fourcc/version)
+@item qpel_chroma2
+
+@item direct_blocksize
+direct-qpel-blocksize bug (autodetected per fourcc/version)
+@item edge
+edge padding bug (autodetected per fourcc/version)
+@item hpel_chroma
+
+@item dc_clip
+
+@item ms
+Workaround various bugs in microsoft broken decoders.
+@item trunc
+trancated frames
+@end table
+
+@item strict @var{integer} (@emph{decoding/encoding,audio,video})
+Specify how strictly to follow the standards.
+
+Possible values:
+@table @samp
+@item very
+strictly conform to an older more strict version of the spec or reference software
+@item strict
+strictly conform to all the things in the spec no matter what consequences
+@item normal
+
+@item unofficial
+allow unofficial extensions
+@item experimental
+allow non standardized experimental things, experimental
+(unfinished/work in progress/not well tested) decoders and encoders.
+Note: experimental decoders can pose a security risk, do not use this for
+decoding untrusted input.
+@end table
+
+@item b_qoffset @var{float} (@emph{encoding,video})
+Set QP offset between P and B frames.
+
+@item err_detect @var{flags} (@emph{decoding,audio,video})
+Set error detection flags.
+
+Possible values:
+@table @samp
+@item crccheck
+verify embedded CRCs
+@item bitstream
+detect bitstream specification deviations
+@item buffer
+detect improper bitstream length
+@item explode
+abort decoding on minor error detection
+@item ignore_err
+ignore decoding errors, and continue decoding.
+This is useful if you want to analyze the content of a video and thus want
+everything to be decoded no matter what. This option will not result in a video
+that is pleasing to watch in case of errors.
+@item careful
+consider things that violate the spec and have not been seen in the wild as errors
+@item compliant
+consider all spec non compliancies as errors
+@item aggressive
+consider things that a sane encoder should not do as an error
+@end table
+
+@item has_b_frames @var{integer}
+
+@item block_align @var{integer}
+
+@item mpeg_quant @var{integer} (@emph{encoding,video})
+Use MPEG quantizers instead of H.263.
+
+@item rc_override_count @var{integer}
+
+@item maxrate @var{integer} (@emph{encoding,audio,video})
+Set max bitrate tolerance (in bits/s). Requires bufsize to be set.
+
+@item minrate @var{integer} (@emph{encoding,audio,video})
+Set min bitrate tolerance (in bits/s). Most useful in setting up a CBR
+encode. It is of little use elsewise.
+
+@item bufsize @var{integer} (@emph{encoding,audio,video})
+Set ratecontrol buffer size (in bits).
+
+@item i_qfactor @var{float} (@emph{encoding,video})
+Set QP factor between P and I frames.
+
+@item i_qoffset @var{float} (@emph{encoding,video})
+Set QP offset between P and I frames.
+
+@item dct @var{integer} (@emph{encoding,video})
+Set DCT algorithm.
+
+Possible values:
+@table @samp
+@item auto
+autoselect a good one (default)
+@item fastint
+fast integer
+@item int
+accurate integer
+@item mmx
+
+@item altivec
+
+@item faan
+floating point AAN DCT
+@end table
+
+@item lumi_mask @var{float} (@emph{encoding,video})
+Compress bright areas stronger than medium ones.
+
+@item tcplx_mask @var{float} (@emph{encoding,video})
+Set temporal complexity masking.
+
+@item scplx_mask @var{float} (@emph{encoding,video})
+Set spatial complexity masking.
+
+@item p_mask @var{float} (@emph{encoding,video})
+Set inter masking.
+
+@item dark_mask @var{float} (@emph{encoding,video})
+Compress dark areas stronger than medium ones.
+
+@item idct @var{integer} (@emph{decoding/encoding,video})
+Select IDCT implementation.
+
+Possible values:
+@table @samp
+@item auto
+
+@item int
+
+@item simple
+
+@item simplemmx
+
+@item simpleauto
+Automatically pick a IDCT compatible with the simple one
+
+@item arm
+
+@item altivec
+
+@item sh4
+
+@item simplearm
+
+@item simplearmv5te
+
+@item simplearmv6
+
+@item simpleneon
+
+@item xvid
+
+@item faani
+floating point AAN IDCT
+@end table
+
+@item slice_count @var{integer}
+
+@item ec @var{flags} (@emph{decoding,video})
+Set error concealment strategy.
+
+Possible values:
+@table @samp
+@item guess_mvs
+iterative motion vector (MV) search (slow)
+@item deblock
+use strong deblock filter for damaged MBs
+@item favor_inter
+favor predicting from the previous frame instead of the current
+@end table
+
+@item bits_per_coded_sample @var{integer}
+
+@item pred @var{integer} (@emph{encoding,video})
+Set prediction method.
+
+Possible values:
+@table @samp
+@item left
+
+@item plane
+
+@item median
+
+@end table
+
+@item aspect @var{rational number} (@emph{encoding,video})
+Set sample aspect ratio.
+
+@item sar @var{rational number} (@emph{encoding,video})
+Set sample aspect ratio. Alias to @var{aspect}.
+
+@item debug @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
+Print specific debug info.
+
+Possible values:
+@table @samp
+@item pict
+picture info
+@item rc
+rate control
+@item bitstream
+
+@item mb_type
+macroblock (MB) type
+@item qp
+per-block quantization parameter (QP)
+@item dct_coeff
+
+@item green_metadata
+display complexity metadata for the upcoming frame, GoP or for a given duration.
+
+@item skip
+
+@item startcode
+
+@item er
+error recognition
+@item mmco
+memory management control operations (H.264)
+@item bugs
+
+@item buffers
+picture buffer allocations
+@item thread_ops
+threading operations
+@item nomc
+skip motion compensation
+@end table
+
+@item cmp @var{integer} (@emph{encoding,video})
+Set full pel me compare function.
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast (default)
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item w53
+5/3 wavelet, only used in snow
+@item w97
+9/7 wavelet, only used in snow
+@item dctmax
+
+@item chroma
+
+@end table
+
+@item subcmp @var{integer} (@emph{encoding,video})
+Set sub pel me compare function.
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast (default)
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item w53
+5/3 wavelet, only used in snow
+@item w97
+9/7 wavelet, only used in snow
+@item dctmax
+
+@item chroma
+
+@end table
+
+@item mbcmp @var{integer} (@emph{encoding,video})
+Set macroblock compare function.
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast (default)
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item w53
+5/3 wavelet, only used in snow
+@item w97
+9/7 wavelet, only used in snow
+@item dctmax
+
+@item chroma
+
+@end table
+
+@item ildctcmp @var{integer} (@emph{encoding,video})
+Set interlaced dct compare function.
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast (default)
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item w53
+5/3 wavelet, only used in snow
+@item w97
+9/7 wavelet, only used in snow
+@item dctmax
+
+@item chroma
+
+@end table
+
+@item dia_size @var{integer} (@emph{encoding,video})
+Set diamond type & size for motion estimation.
+@table @samp
+@item (1024, INT_MAX)
+full motion estimation(slowest)
+@item (768, 1024]
+umh motion estimation
+@item (512, 768]
+hex motion estimation
+@item (256, 512]
+l2s diamond motion estimation
+@item [2,256]
+var diamond motion estimation
+@item (-1, 2)
+small diamond motion estimation
+@item -1
+funny diamond motion estimation
+@item (INT_MIN, -1)
+sab diamond motion estimation
+@end table
+
+@item last_pred @var{integer} (@emph{encoding,video})
+Set amount of motion predictors from the previous frame.
+
+@item preme @var{integer} (@emph{encoding,video})
+Set pre motion estimation.
+
+@item precmp @var{integer} (@emph{encoding,video})
+Set pre motion estimation compare function.
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast (default)
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item w53
+5/3 wavelet, only used in snow
+@item w97
+9/7 wavelet, only used in snow
+@item dctmax
+
+@item chroma
+
+@end table
+
+@item pre_dia_size @var{integer} (@emph{encoding,video})
+Set diamond type & size for motion estimation pre-pass.
+
+@item subq @var{integer} (@emph{encoding,video})
+Set sub pel motion estimation quality.
+
+@item me_range @var{integer} (@emph{encoding,video})
+Set limit motion vectors range (1023 for DivX player).
+
+@item global_quality @var{integer} (@emph{encoding,audio,video})
+
+@item coder @var{integer} (@emph{encoding,video})
+
+Possible values:
+@table @samp
+@item vlc
+variable length coder / huffman coder
+@item ac
+arithmetic coder
+@item raw
+raw (no encoding)
+@item rle
+run-length coder
+@end table
+
+@item context @var{integer} (@emph{encoding,video})
+Set context model.
+
+@item slice_flags @var{integer}
+
+@item mbd @var{integer} (@emph{encoding,video})
+Set macroblock decision algorithm (high quality mode).
+
+Possible values:
+@table @samp
+@item simple
+use mbcmp (default)
+@item bits
+use fewest bits
+@item rd
+use best rate distortion
+@end table
+
+@item sc_threshold @var{integer} (@emph{encoding,video})
+Set scene change threshold.
+
+@item nr @var{integer} (@emph{encoding,video})
+Set noise reduction.
+
+@item rc_init_occupancy @var{integer} (@emph{encoding,video})
+Set number of bits which should be loaded into the rc buffer before
+decoding starts.
+
+@item flags2 @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
+
+Possible values:
+@table @samp
+@item fast
+Allow non spec compliant speedup tricks.
+@item noout
+Skip bitstream encoding.
+@item ignorecrop
+Ignore cropping information from sps.
+@item local_header
+Place global headers at every keyframe instead of in extradata.
+@item chunks
+Frame data might be split into multiple chunks.
+@item showall
+Show all frames before the first keyframe.
+@item export_mvs
+Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
+for codecs that support it. See also @file{doc/examples/export_mvs.c}.
+@item skip_manual
+Do not skip samples and export skip information as frame side data.
+@item ass_ro_flush_noop
+Do not reset ASS ReadOrder field on flush.
+@end table
+
+@item export_side_data @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
+
+Possible values:
+@table @samp
+@item mvs
+Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
+for codecs that support it. See also @file{doc/examples/export_mvs.c}.
+@item prft
+Export encoder Producer Reference Time into packet side-data (see @code{AV_PKT_DATA_PRFT})
+for codecs that support it.
+@item venc_params
+Export video encoding parameters through frame side data (see @code{AV_FRAME_DATA_VIDEO_ENC_PARAMS})
+for codecs that support it. At present, those are H.264 and VP9.
+@item film_grain
+Export film grain parameters through frame side data (see @code{AV_FRAME_DATA_FILM_GRAIN_PARAMS}).
+Supported at present by AV1 decoders.
+@end table
+
+@item threads @var{integer} (@emph{decoding/encoding,video})
+Set the number of threads to be used, in case the selected codec
+implementation supports multi-threading.
+
+Possible values:
+@table @samp
+@item auto, 0
+automatically select the number of threads to set
+@end table
+
+Default value is @samp{auto}.
+
+@item dc @var{integer} (@emph{encoding,video})
+Set intra_dc_precision.
+
+@item nssew @var{integer} (@emph{encoding,video})
+Set nsse weight.
+
+@item skip_top @var{integer} (@emph{decoding,video})
+Set number of macroblock rows at the top which are skipped.
+
+@item skip_bottom @var{integer} (@emph{decoding,video})
+Set number of macroblock rows at the bottom which are skipped.
+
+@item profile @var{integer} (@emph{encoding,audio,video})
+
+Set encoder codec profile. Default value is @samp{unknown}. Encoder specific
+profiles are documented in the relevant encoder documentation.
+
+@item level @var{integer} (@emph{encoding,audio,video})
+
+Possible values:
+@table @samp
+@item unknown
+
+@end table
+
+@item lowres @var{integer} (@emph{decoding,audio,video})
+Decode at 1= 1/2, 2=1/4, 3=1/8 resolutions.
+
+@item skip_threshold @var{integer} (@emph{encoding,video})
+Set frame skip threshold.
+
+@item skip_factor @var{integer} (@emph{encoding,video})
+Set frame skip factor.
+
+@item skip_exp @var{integer} (@emph{encoding,video})
+Set frame skip exponent.
+Negative values behave identical to the corresponding positive ones, except
+that the score is normalized.
+Positive values exist primarily for compatibility reasons and are not so useful.
+
+@item skipcmp @var{integer} (@emph{encoding,video})
+Set frame skip compare function.
+
+Possible values:
+@table @samp
+@item sad
+sum of absolute differences, fast (default)
+@item sse
+sum of squared errors
+@item satd
+sum of absolute Hadamard transformed differences
+@item dct
+sum of absolute DCT transformed differences
+@item psnr
+sum of squared quantization errors (avoid, low quality)
+@item bit
+number of bits needed for the block
+@item rd
+rate distortion optimal, slow
+@item zero
+0
+@item vsad
+sum of absolute vertical differences
+@item vsse
+sum of squared vertical differences
+@item nsse
+noise preserving sum of squared differences
+@item w53
+5/3 wavelet, only used in snow
+@item w97
+9/7 wavelet, only used in snow
+@item dctmax
+
+@item chroma
+
+@end table
+
+@item mblmin @var{integer} (@emph{encoding,video})
+Set min macroblock lagrange factor (VBR).
+
+@item mblmax @var{integer} (@emph{encoding,video})
+Set max macroblock lagrange factor (VBR).
+
+@item mepc @var{integer} (@emph{encoding,video})
+Set motion estimation bitrate penalty compensation (1.0 = 256).
+
+@item skip_loop_filter @var{integer} (@emph{decoding,video})
+@item skip_idct @var{integer} (@emph{decoding,video})
+@item skip_frame @var{integer} (@emph{decoding,video})
+
+Make decoder discard processing depending on the frame type selected
+by the option value.
+
+@option{skip_loop_filter} skips frame loop filtering, @option{skip_idct}
+skips frame IDCT/dequantization, @option{skip_frame} skips decoding.
+
+Possible values:
+@table @samp
+@item none
+Discard no frame.
+
+@item default
+Discard useless frames like 0-sized frames.
+
+@item noref
+Discard all non-reference frames.
+
+@item bidir
+Discard all bidirectional frames.
+
+@item nokey
+Discard all frames excepts keyframes.
+
+@item nointra
+Discard all frames except I frames.
+
+@item all
+Discard all frames.
+@end table
+
+Default value is @samp{default}.
+
+@item bidir_refine @var{integer} (@emph{encoding,video})
+Refine the two motion vectors used in bidirectional macroblocks.
+
+@item brd_scale @var{integer} (@emph{encoding,video})
+Downscale frames for dynamic B-frame decision.
+
+@item keyint_min @var{integer} (@emph{encoding,video})
+Set minimum interval between IDR-frames.
+
+@item refs @var{integer} (@emph{encoding,video})
+Set reference frames to consider for motion compensation.
+
+@item chromaoffset @var{integer} (@emph{encoding,video})
+Set chroma qp offset from luma.
+
+@item trellis @var{integer} (@emph{encoding,audio,video})
+Set rate-distortion optimal quantization.
+
+@item mv0_threshold @var{integer} (@emph{encoding,video})
+@item b_sensitivity @var{integer} (@emph{encoding,video})
+Adjust sensitivity of b_frame_strategy 1.
+
+@item compression_level @var{integer} (@emph{encoding,audio,video})
+@item min_prediction_order @var{integer} (@emph{encoding,audio})
+@item max_prediction_order @var{integer} (@emph{encoding,audio})
+@item timecode_frame_start @var{integer} (@emph{encoding,video})
+Set GOP timecode frame start number, in non drop frame format.
+
+@item bits_per_raw_sample @var{integer}
+@item channel_layout @var{integer} (@emph{decoding/encoding,audio})
+
+Possible values:
+@table @samp
+@end table
+@item request_channel_layout @var{integer} (@emph{decoding,audio})
+
+Possible values:
+@table @samp
+@end table
+@item rc_max_vbv_use @var{float} (@emph{encoding,video})
+@item rc_min_vbv_use @var{float} (@emph{encoding,video})
+@item ticks_per_frame @var{integer} (@emph{decoding/encoding,audio,video})
+
+@item color_primaries @var{integer} (@emph{decoding/encoding,video})
+Possible values:
+@table @samp
+@item bt709
+BT.709
+@item bt470m
+BT.470 M
+@item bt470bg
+BT.470 BG
+@item smpte170m
+SMPTE 170 M
+@item smpte240m
+SMPTE 240 M
+@item film
+Film
+@item bt2020
+BT.2020
+@item smpte428
+@item smpte428_1
+SMPTE ST 428-1
+@item smpte431
+SMPTE 431-2
+@item smpte432
+SMPTE 432-1
+@item jedec-p22
+JEDEC P22
+@end table
+
+@item color_trc @var{integer} (@emph{decoding/encoding,video})
+Possible values:
+@table @samp
+@item bt709
+BT.709
+@item gamma22
+BT.470 M
+@item gamma28
+BT.470 BG
+@item smpte170m
+SMPTE 170 M
+@item smpte240m
+SMPTE 240 M
+@item linear
+Linear
+@item log
+@item log100
+Log
+@item log_sqrt
+@item log316
+Log square root
+@item iec61966_2_4
+@item iec61966-2-4
+IEC 61966-2-4
+@item bt1361
+@item bt1361e
+BT.1361
+@item iec61966_2_1
+@item iec61966-2-1
+IEC 61966-2-1
+@item bt2020_10
+@item bt2020_10bit
+BT.2020 - 10 bit
+@item bt2020_12
+@item bt2020_12bit
+BT.2020 - 12 bit
+@item smpte2084
+SMPTE ST 2084
+@item smpte428
+@item smpte428_1
+SMPTE ST 428-1
+@item arib-std-b67
+ARIB STD-B67
+@end table
+
+@item colorspace @var{integer} (@emph{decoding/encoding,video})
+Possible values:
+@table @samp
+@item rgb
+RGB
+@item bt709
+BT.709
+@item fcc
+FCC
+@item bt470bg
+BT.470 BG
+@item smpte170m
+SMPTE 170 M
+@item smpte240m
+SMPTE 240 M
+@item ycocg
+YCOCG
+@item bt2020nc
+@item bt2020_ncl
+BT.2020 NCL
+@item bt2020c
+@item bt2020_cl
+BT.2020 CL
+@item smpte2085
+SMPTE 2085
+@item chroma-derived-nc
+Chroma-derived NCL
+@item chroma-derived-c
+Chroma-derived CL
+@item ictcp
+ICtCp
+@end table
+
+@item color_range @var{integer} (@emph{decoding/encoding,video})
+If used as input parameter, it serves as a hint to the decoder, which
+color_range the input has.
+Possible values:
+@table @samp
+@item tv
+@item mpeg
+MPEG (219*2^(n-8))
+@item pc
+@item jpeg
+JPEG (2^n-1)
+@end table
+
+@item chroma_sample_location @var{integer} (@emph{decoding/encoding,video})
+Possible values:
+@table @samp
+@item left
+
+@item center
+
+@item topleft
+
+@item top
+
+@item bottomleft
+
+@item bottom
+
+@end table
+
+@item log_level_offset @var{integer}
+Set the log level offset.
+
+@item slices @var{integer} (@emph{encoding,video})
+Number of slices, used in parallelized encoding.
+
+@item thread_type @var{flags} (@emph{decoding/encoding,video})
+Select which multithreading methods to use.
+
+Use of @samp{frame} will increase decoding delay by one frame per
+thread, so clients which cannot provide future frames should not use
+it.
+
+Possible values:
+@table @samp
+@item slice
+Decode more than one part of a single frame at once.
+
+Multithreading using slices works only when the video was encoded with
+slices.
+
+@item frame
+Decode more than one frame at once.
+@end table
+
+Default value is @samp{slice+frame}.
+
+@item audio_service_type @var{integer} (@emph{encoding,audio})
+Set audio service type.
+
+Possible values:
+@table @samp
+@item ma
+Main Audio Service
+@item ef
+Effects
+@item vi
+Visually Impaired
+@item hi
+Hearing Impaired
+@item di
+Dialogue
+@item co
+Commentary
+@item em
+Emergency
+@item vo
+Voice Over
+@item ka
+Karaoke
+@end table
+
+@item request_sample_fmt @var{sample_fmt} (@emph{decoding,audio})
+Set sample format audio decoders should prefer. Default value is
+@code{none}.
+
+@item pkt_timebase @var{rational number}
+
+@item sub_charenc @var{encoding} (@emph{decoding,subtitles})
+Set the input subtitles character encoding.
+
+@item field_order @var{field_order} (@emph{video})
+Set/override the field order of the video.
+Possible values:
+@table @samp
+@item progressive
+Progressive video
+@item tt
+Interlaced video, top field coded and displayed first
+@item bb
+Interlaced video, bottom field coded and displayed first
+@item tb
+Interlaced video, top coded first, bottom displayed first
+@item bt
+Interlaced video, bottom coded first, top displayed first
+@end table
+
+@item skip_alpha @var{bool} (@emph{decoding,video})
+Set to 1 to disable processing alpha (transparency). This works like the
+@samp{gray} flag in the @option{flags} option which skips chroma information
+instead of alpha. Default is 0.
+
+@item codec_whitelist @var{list} (@emph{input})
+"," separated list of allowed decoders. By default all are allowed.
+
+@item dump_separator @var{string} (@emph{input})
+Separator used to separate the fields printed on the command line about the
+Stream parameters.
+For example, to separate the fields with newlines and indentation:
+@example
+ffprobe -dump_separator "
+ " -i ~/videos/matrixbench_mpeg2.mpg
+@end example
+
+@item max_pixels @var{integer} (@emph{decoding/encoding,video})
+Maximum number of pixels per image. This value can be used to avoid out of
+memory failures due to large images.
+
+@item apply_cropping @var{bool} (@emph{decoding,video})
+Enable cropping if cropping parameters are multiples of the required
+alignment for the left and top parameters. If the alignment is not met the
+cropping will be partially applied to maintain alignment.
+Default is 1 (enabled).
+Note: The required alignment depends on if @code{AV_CODEC_FLAG_UNALIGNED} is set and the
+CPU. @code{AV_CODEC_FLAG_UNALIGNED} cannot be changed from the command line. Also hardware
+decoders will not apply left/top Cropping.
+
+
+@end table
+
+@c man end CODEC OPTIONS
+
+@ifclear config-writeonly
+@include decoders.texi
+@end ifclear
+@ifclear config-readonly
+@include encoders.texi
+@end ifclear
diff --git a/extern/ffmpeg/doc/config.texi b/extern/ffmpeg/doc/config.texi
new file mode 100644
index 0000000000..0af7d05ab8
--- /dev/null
+++ b/extern/ffmpeg/doc/config.texi
@@ -0,0 +1,2689 @@
+@c auto-generated by configure - do not modify!
+@c @set arch-aarch64 no
+@c @set arch-alpha no
+@c @set arch-arm no
+@c @set arch-avr32 no
+@c @set arch-avr32-ap no
+@c @set arch-avr32-uc no
+@c @set arch-bfin no
+@c @set arch-ia64 no
+@c @set arch-m68k no
+@c @set arch-mips no
+@c @set arch-mips64 no
+@c @set arch-parisc no
+@c @set arch-ppc no
+@c @set arch-ppc64 no
+@c @set arch-s390 no
+@c @set arch-sh4 no
+@c @set arch-sparc no
+@c @set arch-sparc64 no
+@c @set arch-tilegx no
+@c @set arch-tilepro no
+@c @set arch-tomi no
+@set arch-x86 yes
+@c @set arch-x86-32 no
+@set arch-x86-64 yes
+@c @set have-armv5te no
+@c @set have-armv6 no
+@c @set have-armv6t2 no
+@c @set have-armv8 no
+@c @set have-neon no
+@c @set have-vfp no
+@c @set have-vfpv3 no
+@c @set have-setend no
+@c @set have-altivec no
+@c @set have-dcbzl no
+@c @set have-ldbrx no
+@c @set have-power8 no
+@c @set have-ppc4xx no
+@c @set have-vsx no
+@set have-aesni yes
+@set have-amd3dnow yes
+@set have-amd3dnowext yes
+@set have-avx yes
+@set have-avx2 yes
+@set have-avx512 yes
+@set have-fma3 yes
+@set have-fma4 yes
+@set have-mmx yes
+@set have-mmxext yes
+@set have-sse yes
+@set have-sse2 yes
+@set have-sse3 yes
+@set have-sse4 yes
+@set have-sse42 yes
+@set have-ssse3 yes
+@set have-xop yes
+@c @set have-cpunop no
+@set have-i686 yes
+@c @set have-mipsfpu no
+@c @set have-mips32r2 no
+@c @set have-mips32r5 no
+@c @set have-mips64r2 no
+@c @set have-mips32r6 no
+@c @set have-mips64r6 no
+@c @set have-mipsdsp no
+@c @set have-mipsdspr2 no
+@c @set have-msa no
+@c @set have-msa2 no
+@c @set have-loongson2 no
+@c @set have-loongson3 no
+@c @set have-mmi no
+@c @set have-armv5te-external no
+@c @set have-armv6-external no
+@c @set have-armv6t2-external no
+@c @set have-armv8-external no
+@c @set have-neon-external no
+@c @set have-vfp-external no
+@c @set have-vfpv3-external no
+@c @set have-setend-external no
+@c @set have-altivec-external no
+@c @set have-dcbzl-external no
+@c @set have-ldbrx-external no
+@c @set have-power8-external no
+@c @set have-ppc4xx-external no
+@c @set have-vsx-external no
+@set have-aesni-external yes
+@set have-amd3dnow-external yes
+@set have-amd3dnowext-external yes
+@set have-avx-external yes
+@set have-avx2-external yes
+@set have-avx512-external yes
+@set have-fma3-external yes
+@set have-fma4-external yes
+@set have-mmx-external yes
+@set have-mmxext-external yes
+@set have-sse-external yes
+@set have-sse2-external yes
+@set have-sse3-external yes
+@set have-sse4-external yes
+@set have-sse42-external yes
+@set have-ssse3-external yes
+@set have-xop-external yes
+@c @set have-cpunop-external no
+@c @set have-i686-external no
+@c @set have-mipsfpu-external no
+@c @set have-mips32r2-external no
+@c @set have-mips32r5-external no
+@c @set have-mips64r2-external no
+@c @set have-mips32r6-external no
+@c @set have-mips64r6-external no
+@c @set have-mipsdsp-external no
+@c @set have-mipsdspr2-external no
+@c @set have-msa-external no
+@c @set have-msa2-external no
+@c @set have-loongson2-external no
+@c @set have-loongson3-external no
+@c @set have-mmi-external no
+@c @set have-armv5te-inline no
+@c @set have-armv6-inline no
+@c @set have-armv6t2-inline no
+@c @set have-armv8-inline no
+@c @set have-neon-inline no
+@c @set have-vfp-inline no
+@c @set have-vfpv3-inline no
+@c @set have-setend-inline no
+@c @set have-altivec-inline no
+@c @set have-dcbzl-inline no
+@c @set have-ldbrx-inline no
+@c @set have-power8-inline no
+@c @set have-ppc4xx-inline no
+@c @set have-vsx-inline no
+@c @set have-aesni-inline no
+@c @set have-amd3dnow-inline no
+@c @set have-amd3dnowext-inline no
+@c @set have-avx-inline no
+@c @set have-avx2-inline no
+@c @set have-avx512-inline no
+@c @set have-fma3-inline no
+@c @set have-fma4-inline no
+@c @set have-mmx-inline no
+@c @set have-mmxext-inline no
+@c @set have-sse-inline no
+@c @set have-sse2-inline no
+@c @set have-sse3-inline no
+@c @set have-sse4-inline no
+@c @set have-sse42-inline no
+@c @set have-ssse3-inline no
+@c @set have-xop-inline no
+@c @set have-cpunop-inline no
+@c @set have-i686-inline no
+@c @set have-mipsfpu-inline no
+@c @set have-mips32r2-inline no
+@c @set have-mips32r5-inline no
+@c @set have-mips64r2-inline no
+@c @set have-mips32r6-inline no
+@c @set have-mips64r6-inline no
+@c @set have-mipsdsp-inline no
+@c @set have-mipsdspr2-inline no
+@c @set have-msa-inline no
+@c @set have-msa2-inline no
+@c @set have-loongson2-inline no
+@c @set have-loongson3-inline no
+@c @set have-mmi-inline no
+@set have-aligned-stack yes
+@set have-fast-64bit yes
+@set have-fast-clz yes
+@set have-fast-cmov yes
+@set have-local-aligned yes
+@set have-simd-align-16 yes
+@set have-simd-align-32 yes
+@set have-simd-align-64 yes
+@c @set have-atomic-cas-ptr no
+@c @set have-machine-rw-barrier no
+@set have-memorybarrier yes
+@c @set have-mm-empty no
+@set have-rdtsc yes
+@c @set have-sem-timedwait no
+@c @set have-sync-val-compare-and-swap no
+@c @set have-cabs no
+@c @set have-cexp no
+@c @set have-inline-asm no
+@c @set have-symver no
+@set have-x86asm yes
+@c @set have-bigendian no
+@set have-fast-unaligned yes
+@c @set have-arpa-inet-h no
+@c @set have-asm-types-h no
+@c @set have-cdio-paranoia-h no
+@c @set have-cdio-paranoia-paranoia-h no
+@c @set have-cuda-h no
+@c @set have-dispatch-dispatch-h no
+@c @set have-dev-bktr-ioctl-bt848-h no
+@c @set have-dev-bktr-ioctl-meteor-h no
+@c @set have-dev-ic-bt8xx-h no
+@c @set have-dev-video-bktr-ioctl-bt848-h no
+@c @set have-dev-video-meteor-ioctl-meteor-h no
+@set have-direct-h yes
+@c @set have-dirent-h no
+@set have-dxgidebug-h yes
+@set have-dxva-h yes
+@c @set have-es2-gl-h no
+@c @set have-gsm-h no
+@set have-io-h yes
+@c @set have-linux-dma-buf-h no
+@c @set have-linux-perf-event-h no
+@c @set have-machine-ioctl-bt848-h no
+@c @set have-machine-ioctl-meteor-h no
+@set have-malloc-h yes
+@c @set have-opencv2-core-core-c-h no
+@c @set have-opengl-gl3-h no
+@c @set have-poll-h no
+@c @set have-sys-param-h no
+@c @set have-sys-resource-h no
+@c @set have-sys-select-h no
+@c @set have-sys-soundcard-h no
+@c @set have-sys-time-h no
+@c @set have-sys-un-h no
+@c @set have-sys-videoio-h no
+@c @set have-termios-h no
+@c @set have-udplite-h no
+@c @set have-unistd-h no
+@c @set have-valgrind-valgrind-h no
+@set have-windows-h yes
+@set have-winsock2-h yes
+@c @set have-intrinsics-neon no
+@set have-atanf yes
+@set have-atan2f yes
+@set have-cbrt yes
+@set have-cbrtf yes
+@set have-copysign yes
+@set have-cosf yes
+@set have-erf yes
+@set have-exp2 yes
+@set have-exp2f yes
+@set have-expf yes
+@set have-hypot yes
+@set have-isfinite yes
+@set have-isinf yes
+@set have-isnan yes
+@set have-ldexpf yes
+@set have-llrint yes
+@set have-llrintf yes
+@set have-log2 yes
+@set have-log2f yes
+@set have-log10f yes
+@set have-lrint yes
+@set have-lrintf yes
+@set have-powf yes
+@set have-rint yes
+@set have-round yes
+@set have-roundf yes
+@set have-sinf yes
+@set have-trunc yes
+@set have-truncf yes
+@set have-dos-paths yes
+@set have-libc-msvcrt yes
+@c @set have-mmal-parameter-video-max-num-callbacks no
+@c @set have-section-data-rel-ro no
+@set have-threads yes
+@c @set have-uwp no
+@c @set have-winrt no
+@set have-access yes
+@set have-aligned-malloc yes
+@c @set have-arc4random no
+@c @set have-clock-gettime no
+@set have-closesocket yes
+@set have-commandlinetoargvw yes
+@c @set have-fcntl no
+@set have-getaddrinfo yes
+@c @set have-gethrtime no
+@c @set have-getopt no
+@set have-getmodulehandle yes
+@set have-getprocessaffinitymask yes
+@set have-getprocessmemoryinfo yes
+@set have-getprocesstimes yes
+@c @set have-getrusage no
+@set have-getstdhandle yes
+@set have-getsystemtimeasfiletime yes
+@c @set have-gettimeofday no
+@c @set have-glob no
+@c @set have-glxgetprocaddress no
+@c @set have-gmtime-r no
+@c @set have-inet-aton no
+@set have-isatty yes
+@set have-kbhit yes
+@c @set have-localtime-r no
+@c @set have-lstat no
+@c @set have-lzo1x-999-compress no
+@c @set have-mach-absolute-time no
+@set have-mapviewoffile yes
+@c @set have-memalign no
+@c @set have-mkstemp no
+@c @set have-mmap no
+@c @set have-mprotect no
+@c @set have-nanosleep no
+@set have-peeknamedpipe yes
+@c @set have-posix-memalign no
+@c @set have-pthread-cancel no
+@c @set have-sched-getaffinity no
+@c @set have-secitemimport no
+@set have-setconsoletextattribute yes
+@set have-setconsolectrlhandler yes
+@set have-setdlldirectory yes
+@set have-setmode yes
+@c @set have-setrlimit no
+@set have-sleep yes
+@c @set have-strerror-r no
+@c @set have-sysconf no
+@c @set have-sysctl no
+@c @set have-usleep no
+@c @set have-utgetostypefromstring no
+@set have-virtualalloc yes
+@c @set have-wglgetprocaddress no
+@set have-bcrypt yes
+@c @set have-vaapi-drm no
+@c @set have-vaapi-x11 no
+@c @set have-vdpau-x11 no
+@c @set have-pthreads no
+@c @set have-os2threads no
+@set have-w32threads yes
+@c @set have-as-arch-directive no
+@c @set have-as-dn-directive no
+@c @set have-as-fpu-directive no
+@c @set have-as-func no
+@c @set have-as-object-arch no
+@c @set have-asm-mod-q no
+@c @set have-blocks-extension no
+@c @set have-ebp-available no
+@c @set have-ebx-available no
+@c @set have-gnu-as no
+@c @set have-gnu-windres no
+@c @set have-ibm-asm no
+@c @set have-inline-asm-direct-symbol-refs no
+@c @set have-inline-asm-labels no
+@c @set have-inline-asm-nonlocal-labels no
+@set have-pragma-deprecated yes
+@c @set have-rsync-contimeout no
+@c @set have-symver-asm-label no
+@c @set have-symver-gnu-asm no
+@c @set have-vfp-args no
+@c @set have-xform-asm no
+@c @set have-xmm-clobbers no
+@c @set have-kcmvideocodectype-hevc no
+@c @set have-kcmvideocodectype-hevcwithalpha no
+@c @set have-kcvpixelformattype-420ypcbcr10biplanarvideorange no
+@c @set have-kcvimagebuffertransferfunction-smpte-st-2084-pq no
+@c @set have-kcvimagebuffertransferfunction-itu-r-2100-hlg no
+@c @set have-kcvimagebuffertransferfunction-linear no
+@set have-socklen-t yes
+@set have-struct-addrinfo yes
+@set have-struct-group-source-req yes
+@set have-struct-ip-mreq-source yes
+@set have-struct-ipv6-mreq yes
+@c @set have-struct-msghdr-msg-flags no
+@set have-struct-pollfd yes
+@c @set have-struct-rusage-ru-maxrss no
+@c @set have-struct-sctp-event-subscribe no
+@set have-struct-sockaddr-in6 yes
+@c @set have-struct-sockaddr-sa-len no
+@set have-struct-sockaddr-storage yes
+@c @set have-struct-stat-st-mtim-tv-nsec no
+@c @set have-struct-v4l2-frmivalenum-discrete no
+@c @set have-libdrm-getfb2 no
+@set have-makeinfo yes
+@set have-makeinfo-html yes
+@c @set have-opencl-d3d11 no
+@c @set have-opencl-drm-arm no
+@c @set have-opencl-drm-beignet no
+@c @set have-opencl-dxva2 no
+@c @set have-opencl-vaapi-beignet no
+@c @set have-opencl-vaapi-intel-media no
+@set have-perl yes
+@set have-pod2man yes
+@c @set have-texi2html no
+@c @set config-doc no
+@set config-htmlpages yes
+@set config-manpages yes
+@set config-podpages yes
+@set config-txtpages yes
+@set config-avio-list-dir-example yes
+@set config-avio-reading-example yes
+@set config-decode-audio-example yes
+@set config-decode-video-example yes
+@set config-demuxing-decoding-example yes
+@set config-encode-audio-example yes
+@set config-encode-video-example yes
+@set config-extract-mvs-example yes
+@set config-filter-audio-example yes
+@set config-filtering-audio-example yes
+@set config-filtering-video-example yes
+@c @set config-http-multiclient-example no
+@set config-hw-decode-example yes
+@set config-metadata-example yes
+@set config-muxing-example yes
+@c @set config-qsvdec-example no
+@set config-remuxing-example yes
+@set config-resampling-audio-example yes
+@set config-scaling-video-example yes
+@set config-transcode-aac-example yes
+@set config-transcoding-example yes
+@c @set config-vaapi-encode-example no
+@c @set config-vaapi-transcode-example no
+@c @set config-avisynth no
+@c @set config-frei0r no
+@c @set config-libcdio no
+@c @set config-libdavs2 no
+@c @set config-librubberband no
+@c @set config-libvidstab no
+@c @set config-libx264 no
+@c @set config-libx265 no
+@c @set config-libxavs no
+@c @set config-libxavs2 no
+@c @set config-libxvid no
+@c @set config-decklink no
+@c @set config-libfdk-aac no
+@c @set config-openssl no
+@c @set config-libtls no
+@c @set config-gmp no
+@c @set config-libaribb24 no
+@c @set config-liblensfun no
+@c @set config-libopencore-amrnb no
+@c @set config-libopencore-amrwb no
+@c @set config-libvo-amrwbenc no
+@c @set config-mbedtls no
+@c @set config-rkmpp no
+@c @set config-libsmbclient no
+@c @set config-chromaprint no
+@c @set config-gcrypt no
+@c @set config-gnutls no
+@c @set config-jni no
+@c @set config-ladspa no
+@c @set config-libaom no
+@c @set config-libass no
+@c @set config-libbluray no
+@c @set config-libbs2b no
+@c @set config-libcaca no
+@c @set config-libcelt no
+@c @set config-libcodec2 no
+@c @set config-libdav1d no
+@c @set config-libdc1394 no
+@c @set config-libdrm no
+@c @set config-libflite no
+@c @set config-libfontconfig no
+@c @set config-libfreetype no
+@c @set config-libfribidi no
+@c @set config-libglslang no
+@c @set config-libgme no
+@c @set config-libgsm no
+@c @set config-libiec61883 no
+@c @set config-libilbc no
+@c @set config-libjack no
+@c @set config-libklvanc no
+@c @set config-libkvazaar no
+@c @set config-libmodplug no
+@c @set config-libmp3lame no
+@c @set config-libmysofa no
+@c @set config-libopencv no
+@c @set config-libopenh264 no
+@c @set config-libopenjpeg no
+@c @set config-libopenmpt no
+@c @set config-libopenvino no
+@c @set config-libopus no
+@c @set config-libpulse no
+@c @set config-librabbitmq no
+@c @set config-librav1e no
+@c @set config-librist no
+@c @set config-librsvg no
+@c @set config-librtmp no
+@c @set config-libshine no
+@c @set config-libsmbclient no
+@c @set config-libsnappy no
+@c @set config-libsoxr no
+@c @set config-libspeex no
+@c @set config-libsrt no
+@c @set config-libssh no
+@c @set config-libsvtav1 no
+@c @set config-libtensorflow no
+@c @set config-libtesseract no
+@c @set config-libtheora no
+@c @set config-libtwolame no
+@c @set config-libuavs3d no
+@c @set config-libv4l2 no
+@c @set config-libvmaf no
+@c @set config-libvorbis no
+@c @set config-libvpx no
+@c @set config-libwebp no
+@c @set config-libxml2 no
+@c @set config-libzimg no
+@c @set config-libzmq no
+@c @set config-libzvbi no
+@c @set config-lv2 no
+@c @set config-mediacodec no
+@c @set config-openal no
+@c @set config-opengl no
+@c @set config-pocketsphinx no
+@c @set config-vapoursynth no
+@c @set config-alsa no
+@c @set config-appkit no
+@c @set config-avfoundation no
+@c @set config-bzlib no
+@c @set config-coreimage no
+@c @set config-iconv no
+@c @set config-libxcb no
+@c @set config-libxcb-shm no
+@c @set config-libxcb-shape no
+@c @set config-libxcb-xfixes no
+@c @set config-lzma no
+@set config-mediafoundation yes
+@set config-schannel yes
+@c @set config-sdl2 no
+@c @set config-securetransport no
+@c @set config-sndio no
+@c @set config-xlib no
+@c @set config-zlib no
+@c @set config-cuda-nvcc no
+@c @set config-cuda-sdk no
+@c @set config-libnpp no
+@c @set config-libmfx no
+@c @set config-mmal no
+@c @set config-omx no
+@c @set config-opencl no
+@c @set config-vulkan no
+@c @set config-amf no
+@c @set config-audiotoolbox no
+@c @set config-crystalhd no
+@c @set config-cuda no
+@set config-cuda-llvm yes
+@c @set config-cuvid no
+@set config-d3d11va yes
+@set config-dxva2 yes
+@c @set config-ffnvcodec no
+@c @set config-nvdec no
+@c @set config-nvenc no
+@c @set config-vaapi no
+@c @set config-vdpau no
+@c @set config-videotoolbox no
+@c @set config-v4l2-m2m no
+@c @set config-xvmc no
+@c @set config-ftrapv no
+@c @set config-gray no
+@c @set config-hardcoded-tables no
+@c @set config-omx-rpi no
+@set config-runtime-cpudetect yes
+@set config-safe-bitstream-reader yes
+@set config-shared yes
+@c @set config-small no
+@c @set config-static no
+@set config-swscale-alpha yes
+@c @set config-gpl no
+@c @set config-nonfree no
+@c @set config-version3 no
+@set config-avdevice yes
+@set config-avfilter yes
+@set config-swscale yes
+@c @set config-postproc no
+@set config-avformat yes
+@set config-avcodec yes
+@set config-swresample yes
+@c @set config-avresample no
+@set config-avutil yes
+@c @set config-ffplay no
+@c @set config-ffprobe no
+@c @set config-ffmpeg no
+@set config-dct yes
+@set config-dwt yes
+@set config-error-resilience yes
+@set config-faan yes
+@set config-fast-unaligned yes
+@set config-fft yes
+@set config-lsp yes
+@set config-lzo yes
+@set config-mdct yes
+@set config-pixelutils yes
+@set config-network yes
+@set config-rdft yes
+@c @set config-autodetect no
+@c @set config-fontconfig no
+@set config-large-tests yes
+@c @set config-linux-perf no
+@c @set config-memory-poisoning no
+@c @set config-neon-clobber-test no
+@c @set config-ossfuzz no
+@set config-pic yes
+@c @set config-thumb no
+@c @set config-valgrind-backtrace no
+@c @set config-xmm-clobber-test no
+@set config-bsfs yes
+@set config-decoders yes
+@set config-encoders yes
+@set config-hwaccels yes
+@set config-parsers yes
+@set config-indevs yes
+@c @set config-outdevs no
+@set config-filters yes
+@set config-demuxers yes
+@set config-muxers yes
+@set config-protocols yes
+@set config-aandcttables yes
+@set config-ac3dsp yes
+@set config-adts-header yes
+@set config-atsc-a53 yes
+@set config-audio-frame-queue yes
+@set config-audiodsp yes
+@set config-blockdsp yes
+@set config-bswapdsp yes
+@set config-cabac yes
+@set config-cbs yes
+@set config-cbs-av1 yes
+@set config-cbs-h264 yes
+@set config-cbs-h265 yes
+@c @set config-cbs-jpeg no
+@set config-cbs-mpeg2 yes
+@set config-cbs-vp9 yes
+@set config-dirac-parse yes
+@set config-dnn yes
+@set config-dvprofile yes
+@set config-exif yes
+@set config-faandct yes
+@set config-faanidct yes
+@set config-fdctdsp yes
+@set config-flacdsp yes
+@set config-fmtconvert yes
+@set config-frame-thread-encoder yes
+@set config-g722dsp yes
+@set config-golomb yes
+@c @set config-gplv3 no
+@set config-h263dsp yes
+@set config-h264chroma yes
+@set config-h264dsp yes
+@set config-h264parse yes
+@set config-h264pred yes
+@set config-h264qpel yes
+@set config-hevcparse yes
+@set config-hpeldsp yes
+@set config-huffman yes
+@set config-huffyuvdsp yes
+@set config-huffyuvencdsp yes
+@set config-idctdsp yes
+@set config-iirfilter yes
+@set config-mdct15 yes
+@set config-intrax8 yes
+@set config-iso-media yes
+@set config-ividsp yes
+@set config-jpegtables yes
+@c @set config-lgplv3 no
+@c @set config-libx262 no
+@set config-llauddsp yes
+@set config-llviddsp yes
+@set config-llvidencdsp yes
+@set config-lpc yes
+@set config-lzf yes
+@set config-me-cmp yes
+@set config-mpeg-er yes
+@set config-mpegaudio yes
+@set config-mpegaudiodsp yes
+@set config-mpegaudioheader yes
+@set config-mpegvideo yes
+@set config-mpegvideoenc yes
+@set config-mss34dsp yes
+@set config-pixblockdsp yes
+@set config-qpeldsp yes
+@c @set config-qsv no
+@c @set config-qsvdec no
+@c @set config-qsvenc no
+@c @set config-qsvvpp no
+@set config-rangecoder yes
+@set config-riffdec yes
+@set config-riffenc yes
+@set config-rtpdec yes
+@set config-rtpenc-chain yes
+@set config-rv34dsp yes
+@set config-scene-sad yes
+@set config-sinewin yes
+@set config-snappy yes
+@set config-srtp yes
+@set config-startcode yes
+@set config-texturedsp yes
+@c @set config-texturedspenc no
+@set config-tpeldsp yes
+@c @set config-vaapi-1 no
+@c @set config-vaapi-encode no
+@set config-vc1dsp yes
+@set config-videodsp yes
+@set config-vp3dsp yes
+@set config-vp56dsp yes
+@set config-vp8dsp yes
+@set config-wma-freqs yes
+@set config-wmv2dsp yes
+@set config-aac-adtstoasc-bsf yes
+@set config-av1-frame-merge-bsf yes
+@set config-av1-frame-split-bsf yes
+@set config-av1-metadata-bsf yes
+@set config-chomp-bsf yes
+@set config-dump-extradata-bsf yes
+@set config-dca-core-bsf yes
+@set config-eac3-core-bsf yes
+@set config-extract-extradata-bsf yes
+@set config-filter-units-bsf yes
+@set config-h264-metadata-bsf yes
+@set config-h264-mp4toannexb-bsf yes
+@set config-h264-redundant-pps-bsf yes
+@set config-hapqa-extract-bsf yes
+@set config-hevc-metadata-bsf yes
+@set config-hevc-mp4toannexb-bsf yes
+@set config-imx-dump-header-bsf yes
+@set config-mjpeg2jpeg-bsf yes
+@set config-mjpega-dump-header-bsf yes
+@set config-mp3-header-decompress-bsf yes
+@set config-mpeg2-metadata-bsf yes
+@set config-mpeg4-unpack-bframes-bsf yes
+@set config-mov2textsub-bsf yes
+@set config-noise-bsf yes
+@set config-null-bsf yes
+@set config-opus-metadata-bsf yes
+@set config-pcm-rechunk-bsf yes
+@set config-prores-metadata-bsf yes
+@set config-remove-extradata-bsf yes
+@set config-setts-bsf yes
+@set config-text2movsub-bsf yes
+@set config-trace-headers-bsf yes
+@set config-truehd-core-bsf yes
+@set config-vp9-metadata-bsf yes
+@set config-vp9-raw-reorder-bsf yes
+@set config-vp9-superframe-bsf yes
+@set config-vp9-superframe-split-bsf yes
+@set config-aasc-decoder yes
+@set config-aic-decoder yes
+@set config-alias-pix-decoder yes
+@set config-agm-decoder yes
+@set config-amv-decoder yes
+@set config-anm-decoder yes
+@set config-ansi-decoder yes
+@c @set config-apng-decoder no
+@set config-arbc-decoder yes
+@set config-argo-decoder yes
+@set config-asv1-decoder yes
+@set config-asv2-decoder yes
+@set config-aura-decoder yes
+@set config-aura2-decoder yes
+@set config-avrp-decoder yes
+@set config-avrn-decoder yes
+@set config-avs-decoder yes
+@set config-avui-decoder yes
+@set config-ayuv-decoder yes
+@set config-bethsoftvid-decoder yes
+@set config-bfi-decoder yes
+@set config-bink-decoder yes
+@set config-bitpacked-decoder yes
+@set config-bmp-decoder yes
+@set config-bmv-video-decoder yes
+@set config-brender-pix-decoder yes
+@set config-c93-decoder yes
+@set config-cavs-decoder yes
+@set config-cdgraphics-decoder yes
+@set config-cdtoons-decoder yes
+@set config-cdxl-decoder yes
+@set config-cfhd-decoder yes
+@set config-cinepak-decoder yes
+@set config-clearvideo-decoder yes
+@set config-cljr-decoder yes
+@set config-cllc-decoder yes
+@set config-comfortnoise-decoder yes
+@set config-cpia-decoder yes
+@set config-cri-decoder yes
+@set config-cscd-decoder yes
+@set config-cyuv-decoder yes
+@set config-dds-decoder yes
+@set config-dfa-decoder yes
+@set config-dirac-decoder yes
+@set config-dnxhd-decoder yes
+@set config-dpx-decoder yes
+@set config-dsicinvideo-decoder yes
+@set config-dvaudio-decoder yes
+@set config-dvvideo-decoder yes
+@c @set config-dxa-decoder no
+@set config-dxtory-decoder yes
+@set config-dxv-decoder yes
+@set config-eacmv-decoder yes
+@set config-eamad-decoder yes
+@set config-eatgq-decoder yes
+@set config-eatgv-decoder yes
+@set config-eatqi-decoder yes
+@set config-eightbps-decoder yes
+@set config-eightsvx-exp-decoder yes
+@set config-eightsvx-fib-decoder yes
+@set config-escape124-decoder yes
+@set config-escape130-decoder yes
+@c @set config-exr-decoder no
+@set config-ffv1-decoder yes
+@set config-ffvhuff-decoder yes
+@set config-fic-decoder yes
+@set config-fits-decoder yes
+@c @set config-flashsv-decoder no
+@c @set config-flashsv2-decoder no
+@set config-flic-decoder yes
+@set config-flv-decoder yes
+@set config-fmvc-decoder yes
+@set config-fourxm-decoder yes
+@set config-fraps-decoder yes
+@set config-frwu-decoder yes
+@c @set config-g2m-decoder no
+@set config-gdv-decoder yes
+@set config-gif-decoder yes
+@set config-h261-decoder yes
+@set config-h263-decoder yes
+@set config-h263i-decoder yes
+@set config-h263p-decoder yes
+@c @set config-h263-v4l2m2m-decoder no
+@set config-h264-decoder yes
+@c @set config-h264-crystalhd-decoder no
+@c @set config-h264-v4l2m2m-decoder no
+@c @set config-h264-mediacodec-decoder no
+@c @set config-h264-mmal-decoder no
+@c @set config-h264-qsv-decoder no
+@c @set config-h264-rkmpp-decoder no
+@set config-hap-decoder yes
+@set config-hevc-decoder yes
+@c @set config-hevc-qsv-decoder no
+@c @set config-hevc-rkmpp-decoder no
+@c @set config-hevc-v4l2m2m-decoder no
+@set config-hnm4-video-decoder yes
+@set config-hq-hqa-decoder yes
+@set config-hqx-decoder yes
+@set config-huffyuv-decoder yes
+@set config-hymt-decoder yes
+@set config-idcin-decoder yes
+@set config-iff-ilbm-decoder yes
+@set config-imm4-decoder yes
+@set config-imm5-decoder yes
+@set config-indeo2-decoder yes
+@set config-indeo3-decoder yes
+@set config-indeo4-decoder yes
+@set config-indeo5-decoder yes
+@set config-interplay-video-decoder yes
+@set config-ipu-decoder yes
+@set config-jpeg2000-decoder yes
+@set config-jpegls-decoder yes
+@set config-jv-decoder yes
+@set config-kgv1-decoder yes
+@set config-kmvc-decoder yes
+@set config-lagarith-decoder yes
+@set config-loco-decoder yes
+@c @set config-lscr-decoder no
+@set config-m101-decoder yes
+@set config-magicyuv-decoder yes
+@set config-mdec-decoder yes
+@set config-mimic-decoder yes
+@set config-mjpeg-decoder yes
+@set config-mjpegb-decoder yes
+@set config-mmvideo-decoder yes
+@set config-mobiclip-decoder yes
+@set config-motionpixels-decoder yes
+@set config-mpeg1video-decoder yes
+@set config-mpeg2video-decoder yes
+@set config-mpeg4-decoder yes
+@c @set config-mpeg4-crystalhd-decoder no
+@c @set config-mpeg4-v4l2m2m-decoder no
+@c @set config-mpeg4-mmal-decoder no
+@set config-mpegvideo-decoder yes
+@c @set config-mpeg1-v4l2m2m-decoder no
+@c @set config-mpeg2-mmal-decoder no
+@c @set config-mpeg2-crystalhd-decoder no
+@c @set config-mpeg2-v4l2m2m-decoder no
+@c @set config-mpeg2-qsv-decoder no
+@c @set config-mpeg2-mediacodec-decoder no
+@set config-msa1-decoder yes
+@c @set config-mscc-decoder no
+@set config-msmpeg4v1-decoder yes
+@set config-msmpeg4v2-decoder yes
+@set config-msmpeg4v3-decoder yes
+@c @set config-msmpeg4-crystalhd-decoder no
+@set config-msp2-decoder yes
+@set config-msrle-decoder yes
+@set config-mss1-decoder yes
+@set config-mss2-decoder yes
+@set config-msvideo1-decoder yes
+@set config-mszh-decoder yes
+@set config-mts2-decoder yes
+@set config-mv30-decoder yes
+@set config-mvc1-decoder yes
+@set config-mvc2-decoder yes
+@set config-mvdv-decoder yes
+@c @set config-mvha-decoder no
+@c @set config-mwsc-decoder no
+@set config-mxpeg-decoder yes
+@set config-notchlc-decoder yes
+@set config-nuv-decoder yes
+@set config-paf-video-decoder yes
+@set config-pam-decoder yes
+@set config-pbm-decoder yes
+@set config-pcx-decoder yes
+@set config-pfm-decoder yes
+@set config-pgm-decoder yes
+@set config-pgmyuv-decoder yes
+@set config-pgx-decoder yes
+@set config-photocd-decoder yes
+@set config-pictor-decoder yes
+@set config-pixlet-decoder yes
+@c @set config-png-decoder no
+@set config-ppm-decoder yes
+@set config-prores-decoder yes
+@set config-prosumer-decoder yes
+@set config-psd-decoder yes
+@set config-ptx-decoder yes
+@set config-qdraw-decoder yes
+@set config-qpeg-decoder yes
+@set config-qtrle-decoder yes
+@set config-r10k-decoder yes
+@set config-r210-decoder yes
+@c @set config-rasc-decoder no
+@set config-rawvideo-decoder yes
+@set config-rl2-decoder yes
+@set config-roq-decoder yes
+@set config-rpza-decoder yes
+@c @set config-rscc-decoder no
+@set config-rv10-decoder yes
+@set config-rv20-decoder yes
+@set config-rv30-decoder yes
+@set config-rv40-decoder yes
+@set config-s302m-decoder yes
+@set config-sanm-decoder yes
+@set config-scpr-decoder yes
+@c @set config-screenpresso-decoder no
+@set config-sga-decoder yes
+@set config-sgi-decoder yes
+@set config-sgirle-decoder yes
+@set config-sheervideo-decoder yes
+@set config-simbiosis-imx-decoder yes
+@set config-smacker-decoder yes
+@set config-smc-decoder yes
+@set config-smvjpeg-decoder yes
+@set config-snow-decoder yes
+@set config-sp5x-decoder yes
+@set config-speedhq-decoder yes
+@c @set config-srgc-decoder no
+@set config-sunrast-decoder yes
+@set config-svq1-decoder yes
+@set config-svq3-decoder yes
+@set config-targa-decoder yes
+@set config-targa-y216-decoder yes
+@c @set config-tdsc-decoder no
+@set config-theora-decoder yes
+@set config-thp-decoder yes
+@set config-tiertexseqvideo-decoder yes
+@set config-tiff-decoder yes
+@set config-tmv-decoder yes
+@set config-truemotion1-decoder yes
+@set config-truemotion2-decoder yes
+@set config-truemotion2rt-decoder yes
+@c @set config-tscc-decoder no
+@set config-tscc2-decoder yes
+@set config-txd-decoder yes
+@set config-ulti-decoder yes
+@set config-utvideo-decoder yes
+@set config-v210-decoder yes
+@set config-v210x-decoder yes
+@set config-v308-decoder yes
+@set config-v408-decoder yes
+@set config-v410-decoder yes
+@set config-vb-decoder yes
+@set config-vble-decoder yes
+@set config-vc1-decoder yes
+@c @set config-vc1-crystalhd-decoder no
+@set config-vc1image-decoder yes
+@c @set config-vc1-mmal-decoder no
+@c @set config-vc1-qsv-decoder no
+@c @set config-vc1-v4l2m2m-decoder no
+@set config-vcr1-decoder yes
+@set config-vmdvideo-decoder yes
+@set config-vmnc-decoder yes
+@set config-vp3-decoder yes
+@set config-vp4-decoder yes
+@set config-vp5-decoder yes
+@set config-vp6-decoder yes
+@set config-vp6a-decoder yes
+@set config-vp6f-decoder yes
+@set config-vp7-decoder yes
+@set config-vp8-decoder yes
+@c @set config-vp8-rkmpp-decoder no
+@c @set config-vp8-v4l2m2m-decoder no
+@set config-vp9-decoder yes
+@c @set config-vp9-rkmpp-decoder no
+@c @set config-vp9-v4l2m2m-decoder no
+@set config-vqa-decoder yes
+@set config-webp-decoder yes
+@c @set config-wcmv-decoder no
+@set config-wrapped-avframe-decoder yes
+@set config-wmv1-decoder yes
+@set config-wmv2-decoder yes
+@set config-wmv3-decoder yes
+@c @set config-wmv3-crystalhd-decoder no
+@set config-wmv3image-decoder yes
+@set config-wnv1-decoder yes
+@set config-xan-wc3-decoder yes
+@set config-xan-wc4-decoder yes
+@set config-xbm-decoder yes
+@set config-xface-decoder yes
+@set config-xl-decoder yes
+@set config-xpm-decoder yes
+@set config-xwd-decoder yes
+@set config-y41p-decoder yes
+@set config-ylc-decoder yes
+@set config-yop-decoder yes
+@set config-yuv4-decoder yes
+@set config-zero12v-decoder yes
+@c @set config-zerocodec-decoder no
+@c @set config-zlib-decoder no
+@c @set config-zmbv-decoder no
+@set config-aac-decoder yes
+@set config-aac-fixed-decoder yes
+@set config-aac-latm-decoder yes
+@set config-ac3-decoder yes
+@set config-ac3-fixed-decoder yes
+@set config-acelp-kelvin-decoder yes
+@set config-alac-decoder yes
+@set config-als-decoder yes
+@set config-amrnb-decoder yes
+@set config-amrwb-decoder yes
+@set config-ape-decoder yes
+@set config-aptx-decoder yes
+@set config-aptx-hd-decoder yes
+@set config-atrac1-decoder yes
+@set config-atrac3-decoder yes
+@set config-atrac3al-decoder yes
+@set config-atrac3p-decoder yes
+@set config-atrac3pal-decoder yes
+@set config-atrac9-decoder yes
+@set config-binkaudio-dct-decoder yes
+@set config-binkaudio-rdft-decoder yes
+@set config-bmv-audio-decoder yes
+@set config-cook-decoder yes
+@set config-dca-decoder yes
+@set config-dolby-e-decoder yes
+@set config-dsd-lsbf-decoder yes
+@set config-dsd-msbf-decoder yes
+@set config-dsd-lsbf-planar-decoder yes
+@set config-dsd-msbf-planar-decoder yes
+@set config-dsicinaudio-decoder yes
+@set config-dss-sp-decoder yes
+@set config-dst-decoder yes
+@set config-eac3-decoder yes
+@set config-evrc-decoder yes
+@set config-fastaudio-decoder yes
+@set config-ffwavesynth-decoder yes
+@set config-flac-decoder yes
+@set config-g723-1-decoder yes
+@set config-g729-decoder yes
+@set config-gsm-decoder yes
+@set config-gsm-ms-decoder yes
+@set config-hca-decoder yes
+@set config-hcom-decoder yes
+@set config-iac-decoder yes
+@set config-ilbc-decoder yes
+@set config-imc-decoder yes
+@set config-interplay-acm-decoder yes
+@set config-mace3-decoder yes
+@set config-mace6-decoder yes
+@set config-metasound-decoder yes
+@set config-mlp-decoder yes
+@set config-mp1-decoder yes
+@set config-mp1float-decoder yes
+@set config-mp2-decoder yes
+@set config-mp2float-decoder yes
+@set config-mp3float-decoder yes
+@set config-mp3-decoder yes
+@set config-mp3adufloat-decoder yes
+@set config-mp3adu-decoder yes
+@set config-mp3on4float-decoder yes
+@set config-mp3on4-decoder yes
+@set config-mpc7-decoder yes
+@set config-mpc8-decoder yes
+@set config-nellymoser-decoder yes
+@set config-on2avc-decoder yes
+@set config-opus-decoder yes
+@set config-paf-audio-decoder yes
+@set config-qcelp-decoder yes
+@set config-qdm2-decoder yes
+@set config-qdmc-decoder yes
+@set config-ra-144-decoder yes
+@set config-ra-288-decoder yes
+@set config-ralf-decoder yes
+@set config-sbc-decoder yes
+@set config-shorten-decoder yes
+@set config-sipr-decoder yes
+@set config-siren-decoder yes
+@set config-smackaud-decoder yes
+@set config-sonic-decoder yes
+@set config-tak-decoder yes
+@set config-truehd-decoder yes
+@set config-truespeech-decoder yes
+@set config-tta-decoder yes
+@set config-twinvq-decoder yes
+@set config-vmdaudio-decoder yes
+@set config-vorbis-decoder yes
+@set config-wavpack-decoder yes
+@set config-wmalossless-decoder yes
+@set config-wmapro-decoder yes
+@set config-wmav1-decoder yes
+@set config-wmav2-decoder yes
+@set config-wmavoice-decoder yes
+@set config-ws-snd1-decoder yes
+@set config-xma1-decoder yes
+@set config-xma2-decoder yes
+@set config-pcm-alaw-decoder yes
+@set config-pcm-bluray-decoder yes
+@set config-pcm-dvd-decoder yes
+@set config-pcm-f16le-decoder yes
+@set config-pcm-f24le-decoder yes
+@set config-pcm-f32be-decoder yes
+@set config-pcm-f32le-decoder yes
+@set config-pcm-f64be-decoder yes
+@set config-pcm-f64le-decoder yes
+@set config-pcm-lxf-decoder yes
+@set config-pcm-mulaw-decoder yes
+@set config-pcm-s8-decoder yes
+@set config-pcm-s8-planar-decoder yes
+@set config-pcm-s16be-decoder yes
+@set config-pcm-s16be-planar-decoder yes
+@set config-pcm-s16le-decoder yes
+@set config-pcm-s16le-planar-decoder yes
+@set config-pcm-s24be-decoder yes
+@set config-pcm-s24daud-decoder yes
+@set config-pcm-s24le-decoder yes
+@set config-pcm-s24le-planar-decoder yes
+@set config-pcm-s32be-decoder yes
+@set config-pcm-s32le-decoder yes
+@set config-pcm-s32le-planar-decoder yes
+@set config-pcm-s64be-decoder yes
+@set config-pcm-s64le-decoder yes
+@set config-pcm-sga-decoder yes
+@set config-pcm-u8-decoder yes
+@set config-pcm-u16be-decoder yes
+@set config-pcm-u16le-decoder yes
+@set config-pcm-u24be-decoder yes
+@set config-pcm-u24le-decoder yes
+@set config-pcm-u32be-decoder yes
+@set config-pcm-u32le-decoder yes
+@set config-pcm-vidc-decoder yes
+@set config-derf-dpcm-decoder yes
+@set config-gremlin-dpcm-decoder yes
+@set config-interplay-dpcm-decoder yes
+@set config-roq-dpcm-decoder yes
+@set config-sdx2-dpcm-decoder yes
+@set config-sol-dpcm-decoder yes
+@set config-xan-dpcm-decoder yes
+@set config-adpcm-4xm-decoder yes
+@set config-adpcm-adx-decoder yes
+@set config-adpcm-afc-decoder yes
+@set config-adpcm-agm-decoder yes
+@set config-adpcm-aica-decoder yes
+@set config-adpcm-argo-decoder yes
+@set config-adpcm-ct-decoder yes
+@set config-adpcm-dtk-decoder yes
+@set config-adpcm-ea-decoder yes
+@set config-adpcm-ea-maxis-xa-decoder yes
+@set config-adpcm-ea-r1-decoder yes
+@set config-adpcm-ea-r2-decoder yes
+@set config-adpcm-ea-r3-decoder yes
+@set config-adpcm-ea-xas-decoder yes
+@set config-adpcm-g722-decoder yes
+@set config-adpcm-g726-decoder yes
+@set config-adpcm-g726le-decoder yes
+@set config-adpcm-ima-amv-decoder yes
+@set config-adpcm-ima-alp-decoder yes
+@set config-adpcm-ima-apc-decoder yes
+@set config-adpcm-ima-apm-decoder yes
+@set config-adpcm-ima-cunning-decoder yes
+@set config-adpcm-ima-dat4-decoder yes
+@set config-adpcm-ima-dk3-decoder yes
+@set config-adpcm-ima-dk4-decoder yes
+@set config-adpcm-ima-ea-eacs-decoder yes
+@set config-adpcm-ima-ea-sead-decoder yes
+@set config-adpcm-ima-iss-decoder yes
+@set config-adpcm-ima-moflex-decoder yes
+@set config-adpcm-ima-mtf-decoder yes
+@set config-adpcm-ima-oki-decoder yes
+@set config-adpcm-ima-qt-decoder yes
+@set config-adpcm-ima-rad-decoder yes
+@set config-adpcm-ima-ssi-decoder yes
+@set config-adpcm-ima-smjpeg-decoder yes
+@set config-adpcm-ima-wav-decoder yes
+@set config-adpcm-ima-ws-decoder yes
+@set config-adpcm-ms-decoder yes
+@set config-adpcm-mtaf-decoder yes
+@set config-adpcm-psx-decoder yes
+@set config-adpcm-sbpro-2-decoder yes
+@set config-adpcm-sbpro-3-decoder yes
+@set config-adpcm-sbpro-4-decoder yes
+@set config-adpcm-swf-decoder yes
+@set config-adpcm-thp-decoder yes
+@set config-adpcm-thp-le-decoder yes
+@set config-adpcm-vima-decoder yes
+@set config-adpcm-xa-decoder yes
+@set config-adpcm-yamaha-decoder yes
+@set config-adpcm-zork-decoder yes
+@set config-ssa-decoder yes
+@set config-ass-decoder yes
+@set config-ccaption-decoder yes
+@set config-dvbsub-decoder yes
+@set config-dvdsub-decoder yes
+@set config-jacosub-decoder yes
+@set config-microdvd-decoder yes
+@set config-movtext-decoder yes
+@set config-mpl2-decoder yes
+@set config-pgssub-decoder yes
+@set config-pjs-decoder yes
+@set config-realtext-decoder yes
+@set config-sami-decoder yes
+@set config-srt-decoder yes
+@set config-stl-decoder yes
+@set config-subrip-decoder yes
+@set config-subviewer-decoder yes
+@set config-subviewer1-decoder yes
+@set config-text-decoder yes
+@set config-vplayer-decoder yes
+@set config-webvtt-decoder yes
+@set config-xsub-decoder yes
+@c @set config-aac-at-decoder no
+@c @set config-ac3-at-decoder no
+@c @set config-adpcm-ima-qt-at-decoder no
+@c @set config-alac-at-decoder no
+@c @set config-amr-nb-at-decoder no
+@c @set config-eac3-at-decoder no
+@c @set config-gsm-ms-at-decoder no
+@c @set config-ilbc-at-decoder no
+@c @set config-mp1-at-decoder no
+@c @set config-mp2-at-decoder no
+@c @set config-mp3-at-decoder no
+@c @set config-pcm-alaw-at-decoder no
+@c @set config-pcm-mulaw-at-decoder no
+@c @set config-qdmc-at-decoder no
+@c @set config-qdm2-at-decoder no
+@c @set config-libaribb24-decoder no
+@c @set config-libcelt-decoder no
+@c @set config-libcodec2-decoder no
+@c @set config-libdav1d-decoder no
+@c @set config-libdavs2-decoder no
+@c @set config-libfdk-aac-decoder no
+@c @set config-libgsm-decoder no
+@c @set config-libgsm-ms-decoder no
+@c @set config-libilbc-decoder no
+@c @set config-libopencore-amrnb-decoder no
+@c @set config-libopencore-amrwb-decoder no
+@c @set config-libopenjpeg-decoder no
+@c @set config-libopus-decoder no
+@c @set config-librsvg-decoder no
+@c @set config-libspeex-decoder no
+@c @set config-libuavs3d-decoder no
+@c @set config-libvorbis-decoder no
+@c @set config-libvpx-vp8-decoder no
+@c @set config-libvpx-vp9-decoder no
+@c @set config-libzvbi-teletext-decoder no
+@set config-bintext-decoder yes
+@set config-xbin-decoder yes
+@set config-idf-decoder yes
+@c @set config-libaom-av1-decoder no
+@set config-av1-decoder yes
+@c @set config-av1-cuvid-decoder no
+@c @set config-av1-qsv-decoder no
+@c @set config-libopenh264-decoder no
+@c @set config-h264-cuvid-decoder no
+@c @set config-hevc-cuvid-decoder no
+@c @set config-hevc-mediacodec-decoder no
+@c @set config-mjpeg-cuvid-decoder no
+@c @set config-mjpeg-qsv-decoder no
+@c @set config-mpeg1-cuvid-decoder no
+@c @set config-mpeg2-cuvid-decoder no
+@c @set config-mpeg4-cuvid-decoder no
+@c @set config-mpeg4-mediacodec-decoder no
+@c @set config-vc1-cuvid-decoder no
+@c @set config-vp8-cuvid-decoder no
+@c @set config-vp8-mediacodec-decoder no
+@c @set config-vp8-qsv-decoder no
+@c @set config-vp9-cuvid-decoder no
+@c @set config-vp9-mediacodec-decoder no
+@c @set config-vp9-qsv-decoder no
+@set config-a64multi-encoder yes
+@set config-a64multi5-encoder yes
+@set config-alias-pix-encoder yes
+@set config-amv-encoder yes
+@c @set config-apng-encoder no
+@set config-asv1-encoder yes
+@set config-asv2-encoder yes
+@set config-avrp-encoder yes
+@set config-avui-encoder yes
+@set config-ayuv-encoder yes
+@set config-bmp-encoder yes
+@set config-cfhd-encoder yes
+@set config-cinepak-encoder yes
+@set config-cljr-encoder yes
+@set config-comfortnoise-encoder yes
+@set config-dnxhd-encoder yes
+@set config-dpx-encoder yes
+@set config-dvvideo-encoder yes
+@c @set config-exr-encoder no
+@set config-ffv1-encoder yes
+@set config-ffvhuff-encoder yes
+@set config-fits-encoder yes
+@c @set config-flashsv-encoder no
+@c @set config-flashsv2-encoder no
+@set config-flv-encoder yes
+@set config-gif-encoder yes
+@set config-h261-encoder yes
+@set config-h263-encoder yes
+@set config-h263p-encoder yes
+@c @set config-hap-encoder no
+@set config-huffyuv-encoder yes
+@set config-jpeg2000-encoder yes
+@set config-jpegls-encoder yes
+@set config-ljpeg-encoder yes
+@set config-magicyuv-encoder yes
+@set config-mjpeg-encoder yes
+@set config-mpeg1video-encoder yes
+@set config-mpeg2video-encoder yes
+@set config-mpeg4-encoder yes
+@set config-msmpeg4v2-encoder yes
+@set config-msmpeg4v3-encoder yes
+@set config-msvideo1-encoder yes
+@set config-pam-encoder yes
+@set config-pbm-encoder yes
+@set config-pcx-encoder yes
+@set config-pfm-encoder yes
+@set config-pgm-encoder yes
+@set config-pgmyuv-encoder yes
+@c @set config-png-encoder no
+@set config-ppm-encoder yes
+@set config-prores-encoder yes
+@set config-prores-aw-encoder yes
+@set config-prores-ks-encoder yes
+@set config-qtrle-encoder yes
+@set config-r10k-encoder yes
+@set config-r210-encoder yes
+@set config-rawvideo-encoder yes
+@set config-roq-encoder yes
+@set config-rpza-encoder yes
+@set config-rv10-encoder yes
+@set config-rv20-encoder yes
+@set config-s302m-encoder yes
+@set config-sgi-encoder yes
+@set config-snow-encoder yes
+@set config-speedhq-encoder yes
+@set config-sunrast-encoder yes
+@set config-svq1-encoder yes
+@set config-targa-encoder yes
+@set config-tiff-encoder yes
+@set config-utvideo-encoder yes
+@set config-v210-encoder yes
+@set config-v308-encoder yes
+@set config-v408-encoder yes
+@set config-v410-encoder yes
+@set config-vc2-encoder yes
+@set config-wrapped-avframe-encoder yes
+@set config-wmv1-encoder yes
+@set config-wmv2-encoder yes
+@set config-xbm-encoder yes
+@set config-xface-encoder yes
+@set config-xwd-encoder yes
+@set config-y41p-encoder yes
+@set config-yuv4-encoder yes
+@c @set config-zlib-encoder no
+@c @set config-zmbv-encoder no
+@set config-aac-encoder yes
+@set config-ac3-encoder yes
+@set config-ac3-fixed-encoder yes
+@set config-alac-encoder yes
+@set config-aptx-encoder yes
+@set config-aptx-hd-encoder yes
+@set config-dca-encoder yes
+@set config-eac3-encoder yes
+@set config-flac-encoder yes
+@set config-g723-1-encoder yes
+@set config-mlp-encoder yes
+@set config-mp2-encoder yes
+@set config-mp2fixed-encoder yes
+@set config-nellymoser-encoder yes
+@set config-opus-encoder yes
+@set config-ra-144-encoder yes
+@set config-sbc-encoder yes
+@set config-sonic-encoder yes
+@set config-sonic-ls-encoder yes
+@set config-truehd-encoder yes
+@set config-tta-encoder yes
+@set config-vorbis-encoder yes
+@set config-wavpack-encoder yes
+@set config-wmav1-encoder yes
+@set config-wmav2-encoder yes
+@set config-pcm-alaw-encoder yes
+@set config-pcm-dvd-encoder yes
+@set config-pcm-f32be-encoder yes
+@set config-pcm-f32le-encoder yes
+@set config-pcm-f64be-encoder yes
+@set config-pcm-f64le-encoder yes
+@set config-pcm-mulaw-encoder yes
+@set config-pcm-s8-encoder yes
+@set config-pcm-s8-planar-encoder yes
+@set config-pcm-s16be-encoder yes
+@set config-pcm-s16be-planar-encoder yes
+@set config-pcm-s16le-encoder yes
+@set config-pcm-s16le-planar-encoder yes
+@set config-pcm-s24be-encoder yes
+@set config-pcm-s24daud-encoder yes
+@set config-pcm-s24le-encoder yes
+@set config-pcm-s24le-planar-encoder yes
+@set config-pcm-s32be-encoder yes
+@set config-pcm-s32le-encoder yes
+@set config-pcm-s32le-planar-encoder yes
+@set config-pcm-s64be-encoder yes
+@set config-pcm-s64le-encoder yes
+@set config-pcm-u8-encoder yes
+@set config-pcm-u16be-encoder yes
+@set config-pcm-u16le-encoder yes
+@set config-pcm-u24be-encoder yes
+@set config-pcm-u24le-encoder yes
+@set config-pcm-u32be-encoder yes
+@set config-pcm-u32le-encoder yes
+@set config-pcm-vidc-encoder yes
+@set config-roq-dpcm-encoder yes
+@set config-adpcm-adx-encoder yes
+@set config-adpcm-argo-encoder yes
+@set config-adpcm-g722-encoder yes
+@set config-adpcm-g726-encoder yes
+@set config-adpcm-g726le-encoder yes
+@set config-adpcm-ima-amv-encoder yes
+@set config-adpcm-ima-alp-encoder yes
+@set config-adpcm-ima-apm-encoder yes
+@set config-adpcm-ima-qt-encoder yes
+@set config-adpcm-ima-ssi-encoder yes
+@set config-adpcm-ima-wav-encoder yes
+@set config-adpcm-ms-encoder yes
+@set config-adpcm-swf-encoder yes
+@set config-adpcm-yamaha-encoder yes
+@set config-ssa-encoder yes
+@set config-ass-encoder yes
+@set config-dvbsub-encoder yes
+@set config-dvdsub-encoder yes
+@set config-movtext-encoder yes
+@set config-srt-encoder yes
+@set config-subrip-encoder yes
+@set config-text-encoder yes
+@set config-ttml-encoder yes
+@set config-webvtt-encoder yes
+@set config-xsub-encoder yes
+@c @set config-aac-at-encoder no
+@c @set config-alac-at-encoder no
+@c @set config-ilbc-at-encoder no
+@c @set config-pcm-alaw-at-encoder no
+@c @set config-pcm-mulaw-at-encoder no
+@c @set config-libaom-av1-encoder no
+@c @set config-libcodec2-encoder no
+@c @set config-libfdk-aac-encoder no
+@c @set config-libgsm-encoder no
+@c @set config-libgsm-ms-encoder no
+@c @set config-libilbc-encoder no
+@c @set config-libmp3lame-encoder no
+@c @set config-libopencore-amrnb-encoder no
+@c @set config-libopenjpeg-encoder no
+@c @set config-libopus-encoder no
+@c @set config-librav1e-encoder no
+@c @set config-libshine-encoder no
+@c @set config-libspeex-encoder no
+@c @set config-libsvtav1-encoder no
+@c @set config-libtheora-encoder no
+@c @set config-libtwolame-encoder no
+@c @set config-libvo-amrwbenc-encoder no
+@c @set config-libvorbis-encoder no
+@c @set config-libvpx-vp8-encoder no
+@c @set config-libvpx-vp9-encoder no
+@c @set config-libwebp-anim-encoder no
+@c @set config-libwebp-encoder no
+@c @set config-libx262-encoder no
+@c @set config-libx264-encoder no
+@c @set config-libx264rgb-encoder no
+@c @set config-libx265-encoder no
+@c @set config-libxavs-encoder no
+@c @set config-libxavs2-encoder no
+@c @set config-libxvid-encoder no
+@set config-aac-mf-encoder yes
+@set config-ac3-mf-encoder yes
+@c @set config-h263-v4l2m2m-encoder no
+@c @set config-libopenh264-encoder no
+@c @set config-h264-amf-encoder no
+@set config-h264-mf-encoder yes
+@c @set config-h264-nvenc-encoder no
+@c @set config-h264-omx-encoder no
+@c @set config-h264-qsv-encoder no
+@c @set config-h264-v4l2m2m-encoder no
+@c @set config-h264-vaapi-encoder no
+@c @set config-h264-videotoolbox-encoder no
+@c @set config-nvenc-encoder no
+@c @set config-nvenc-h264-encoder no
+@c @set config-nvenc-hevc-encoder no
+@c @set config-hevc-amf-encoder no
+@set config-hevc-mf-encoder yes
+@c @set config-hevc-nvenc-encoder no
+@c @set config-hevc-qsv-encoder no
+@c @set config-hevc-v4l2m2m-encoder no
+@c @set config-hevc-vaapi-encoder no
+@c @set config-hevc-videotoolbox-encoder no
+@c @set config-libkvazaar-encoder no
+@c @set config-mjpeg-qsv-encoder no
+@c @set config-mjpeg-vaapi-encoder no
+@set config-mp3-mf-encoder yes
+@c @set config-mpeg2-qsv-encoder no
+@c @set config-mpeg2-vaapi-encoder no
+@c @set config-mpeg4-omx-encoder no
+@c @set config-mpeg4-v4l2m2m-encoder no
+@c @set config-vp8-v4l2m2m-encoder no
+@c @set config-vp8-vaapi-encoder no
+@c @set config-vp9-vaapi-encoder no
+@c @set config-vp9-qsv-encoder no
+@set config-av1-d3d11va-hwaccel yes
+@set config-av1-d3d11va2-hwaccel yes
+@set config-av1-dxva2-hwaccel yes
+@c @set config-av1-nvdec-hwaccel no
+@c @set config-av1-vaapi-hwaccel no
+@c @set config-h263-vaapi-hwaccel no
+@c @set config-h263-videotoolbox-hwaccel no
+@set config-h264-d3d11va-hwaccel yes
+@set config-h264-d3d11va2-hwaccel yes
+@set config-h264-dxva2-hwaccel yes
+@c @set config-h264-nvdec-hwaccel no
+@c @set config-h264-vaapi-hwaccel no
+@c @set config-h264-vdpau-hwaccel no
+@c @set config-h264-videotoolbox-hwaccel no
+@set config-hevc-d3d11va-hwaccel yes
+@set config-hevc-d3d11va2-hwaccel yes
+@set config-hevc-dxva2-hwaccel yes
+@c @set config-hevc-nvdec-hwaccel no
+@c @set config-hevc-vaapi-hwaccel no
+@c @set config-hevc-vdpau-hwaccel no
+@c @set config-hevc-videotoolbox-hwaccel no
+@c @set config-mjpeg-nvdec-hwaccel no
+@c @set config-mjpeg-vaapi-hwaccel no
+@c @set config-mpeg1-nvdec-hwaccel no
+@c @set config-mpeg1-vdpau-hwaccel no
+@c @set config-mpeg1-videotoolbox-hwaccel no
+@c @set config-mpeg1-xvmc-hwaccel no
+@set config-mpeg2-d3d11va-hwaccel yes
+@set config-mpeg2-d3d11va2-hwaccel yes
+@c @set config-mpeg2-nvdec-hwaccel no
+@set config-mpeg2-dxva2-hwaccel yes
+@c @set config-mpeg2-vaapi-hwaccel no
+@c @set config-mpeg2-vdpau-hwaccel no
+@c @set config-mpeg2-videotoolbox-hwaccel no
+@c @set config-mpeg2-xvmc-hwaccel no
+@c @set config-mpeg4-nvdec-hwaccel no
+@c @set config-mpeg4-vaapi-hwaccel no
+@c @set config-mpeg4-vdpau-hwaccel no
+@c @set config-mpeg4-videotoolbox-hwaccel no
+@set config-vc1-d3d11va-hwaccel yes
+@set config-vc1-d3d11va2-hwaccel yes
+@set config-vc1-dxva2-hwaccel yes
+@c @set config-vc1-nvdec-hwaccel no
+@c @set config-vc1-vaapi-hwaccel no
+@c @set config-vc1-vdpau-hwaccel no
+@c @set config-vp8-nvdec-hwaccel no
+@c @set config-vp8-vaapi-hwaccel no
+@set config-vp9-d3d11va-hwaccel yes
+@set config-vp9-d3d11va2-hwaccel yes
+@set config-vp9-dxva2-hwaccel yes
+@c @set config-vp9-nvdec-hwaccel no
+@c @set config-vp9-vaapi-hwaccel no
+@c @set config-vp9-vdpau-hwaccel no
+@set config-wmv3-d3d11va-hwaccel yes
+@set config-wmv3-d3d11va2-hwaccel yes
+@set config-wmv3-dxva2-hwaccel yes
+@c @set config-wmv3-nvdec-hwaccel no
+@c @set config-wmv3-vaapi-hwaccel no
+@c @set config-wmv3-vdpau-hwaccel no
+@set config-aac-parser yes
+@set config-aac-latm-parser yes
+@set config-ac3-parser yes
+@set config-adx-parser yes
+@set config-av1-parser yes
+@set config-avs2-parser yes
+@set config-avs3-parser yes
+@set config-bmp-parser yes
+@set config-cavsvideo-parser yes
+@set config-cook-parser yes
+@set config-cri-parser yes
+@set config-dca-parser yes
+@set config-dirac-parser yes
+@set config-dnxhd-parser yes
+@set config-dolby-e-parser yes
+@set config-dpx-parser yes
+@set config-dvaudio-parser yes
+@set config-dvbsub-parser yes
+@set config-dvdsub-parser yes
+@set config-dvd-nav-parser yes
+@set config-flac-parser yes
+@set config-g723-1-parser yes
+@set config-g729-parser yes
+@set config-gif-parser yes
+@set config-gsm-parser yes
+@set config-h261-parser yes
+@set config-h263-parser yes
+@set config-h264-parser yes
+@set config-hevc-parser yes
+@set config-ipu-parser yes
+@set config-jpeg2000-parser yes
+@set config-mjpeg-parser yes
+@set config-mlp-parser yes
+@set config-mpeg4video-parser yes
+@set config-mpegaudio-parser yes
+@set config-mpegvideo-parser yes
+@set config-opus-parser yes
+@set config-png-parser yes
+@set config-pnm-parser yes
+@set config-rv30-parser yes
+@set config-rv40-parser yes
+@set config-sbc-parser yes
+@set config-sipr-parser yes
+@set config-tak-parser yes
+@set config-vc1-parser yes
+@set config-vorbis-parser yes
+@set config-vp3-parser yes
+@set config-vp8-parser yes
+@set config-vp9-parser yes
+@set config-webp-parser yes
+@set config-xbm-parser yes
+@set config-xma-parser yes
+@c @set config-alsa-indev no
+@c @set config-android-camera-indev no
+@c @set config-avfoundation-indev no
+@c @set config-bktr-indev no
+@c @set config-decklink-indev no
+@set config-dshow-indev yes
+@c @set config-fbdev-indev no
+@set config-gdigrab-indev yes
+@c @set config-iec61883-indev no
+@c @set config-jack-indev no
+@c @set config-kmsgrab-indev no
+@set config-lavfi-indev yes
+@c @set config-openal-indev no
+@c @set config-oss-indev no
+@c @set config-pulse-indev no
+@c @set config-sndio-indev no
+@c @set config-v4l2-indev no
+@set config-vfwcap-indev yes
+@c @set config-xcbgrab-indev no
+@c @set config-libcdio-indev no
+@c @set config-libdc1394-indev no
+@c @set config-alsa-outdev no
+@c @set config-audiotoolbox-outdev no
+@c @set config-caca-outdev no
+@c @set config-decklink-outdev no
+@c @set config-fbdev-outdev no
+@c @set config-opengl-outdev no
+@c @set config-oss-outdev no
+@c @set config-pulse-outdev no
+@c @set config-sdl2-outdev no
+@c @set config-sndio-outdev no
+@c @set config-v4l2-outdev no
+@c @set config-xv-outdev no
+@set config-abench-filter yes
+@set config-acompressor-filter yes
+@set config-acontrast-filter yes
+@set config-acopy-filter yes
+@set config-acue-filter yes
+@set config-acrossfade-filter yes
+@set config-acrossover-filter yes
+@set config-acrusher-filter yes
+@set config-adeclick-filter yes
+@set config-adeclip-filter yes
+@set config-adelay-filter yes
+@set config-adenorm-filter yes
+@set config-aderivative-filter yes
+@set config-aecho-filter yes
+@set config-aemphasis-filter yes
+@set config-aeval-filter yes
+@set config-aexciter-filter yes
+@set config-afade-filter yes
+@set config-afftdn-filter yes
+@set config-afftfilt-filter yes
+@set config-afir-filter yes
+@set config-aformat-filter yes
+@set config-afreqshift-filter yes
+@set config-agate-filter yes
+@set config-aiir-filter yes
+@set config-aintegral-filter yes
+@set config-ainterleave-filter yes
+@set config-alimiter-filter yes
+@set config-allpass-filter yes
+@set config-aloop-filter yes
+@set config-amerge-filter yes
+@set config-ametadata-filter yes
+@set config-amix-filter yes
+@set config-amultiply-filter yes
+@set config-anequalizer-filter yes
+@set config-anlmdn-filter yes
+@set config-anlms-filter yes
+@set config-anull-filter yes
+@set config-apad-filter yes
+@set config-aperms-filter yes
+@set config-aphaser-filter yes
+@set config-aphaseshift-filter yes
+@set config-apulsator-filter yes
+@set config-arealtime-filter yes
+@set config-aresample-filter yes
+@set config-areverse-filter yes
+@set config-arnndn-filter yes
+@set config-aselect-filter yes
+@set config-asendcmd-filter yes
+@set config-asetnsamples-filter yes
+@set config-asetpts-filter yes
+@set config-asetrate-filter yes
+@set config-asettb-filter yes
+@set config-ashowinfo-filter yes
+@set config-asidedata-filter yes
+@set config-asoftclip-filter yes
+@set config-asplit-filter yes
+@c @set config-asr-filter no
+@set config-astats-filter yes
+@set config-astreamselect-filter yes
+@set config-asubboost-filter yes
+@set config-asubcut-filter yes
+@set config-asupercut-filter yes
+@set config-asuperpass-filter yes
+@set config-asuperstop-filter yes
+@set config-atempo-filter yes
+@set config-atrim-filter yes
+@set config-axcorrelate-filter yes
+@c @set config-azmq-filter no
+@set config-bandpass-filter yes
+@set config-bandreject-filter yes
+@set config-bass-filter yes
+@set config-biquad-filter yes
+@c @set config-bs2b-filter no
+@c @set config-chromaber-vulkan-filter no
+@set config-channelmap-filter yes
+@set config-channelsplit-filter yes
+@set config-chorus-filter yes
+@set config-compand-filter yes
+@set config-compensationdelay-filter yes
+@set config-crossfeed-filter yes
+@set config-crystalizer-filter yes
+@set config-dcshift-filter yes
+@set config-deesser-filter yes
+@set config-drmeter-filter yes
+@set config-dynaudnorm-filter yes
+@set config-earwax-filter yes
+@set config-ebur128-filter yes
+@set config-equalizer-filter yes
+@set config-extrastereo-filter yes
+@set config-firequalizer-filter yes
+@set config-flanger-filter yes
+@set config-haas-filter yes
+@set config-hdcd-filter yes
+@set config-headphone-filter yes
+@set config-highpass-filter yes
+@set config-highshelf-filter yes
+@set config-join-filter yes
+@c @set config-ladspa-filter no
+@set config-loudnorm-filter yes
+@set config-lowpass-filter yes
+@set config-lowshelf-filter yes
+@c @set config-lv2-filter no
+@set config-mcompand-filter yes
+@set config-pan-filter yes
+@set config-replaygain-filter yes
+@c @set config-resample-filter no
+@c @set config-rubberband-filter no
+@set config-sidechaincompress-filter yes
+@set config-sidechaingate-filter yes
+@set config-silencedetect-filter yes
+@set config-silenceremove-filter yes
+@c @set config-sofalizer-filter no
+@set config-speechnorm-filter yes
+@set config-stereotools-filter yes
+@set config-stereowiden-filter yes
+@set config-superequalizer-filter yes
+@set config-surround-filter yes
+@set config-treble-filter yes
+@set config-tremolo-filter yes
+@set config-vibrato-filter yes
+@set config-volume-filter yes
+@set config-volumedetect-filter yes
+@set config-aevalsrc-filter yes
+@set config-afirsrc-filter yes
+@set config-anoisesrc-filter yes
+@set config-anullsrc-filter yes
+@c @set config-flite-filter no
+@set config-hilbert-filter yes
+@set config-sinc-filter yes
+@set config-sine-filter yes
+@set config-anullsink-filter yes
+@set config-addroi-filter yes
+@set config-alphaextract-filter yes
+@set config-alphamerge-filter yes
+@set config-amplify-filter yes
+@c @set config-ass-filter no
+@set config-atadenoise-filter yes
+@set config-avgblur-filter yes
+@c @set config-avgblur-opencl-filter no
+@c @set config-avgblur-vulkan-filter no
+@set config-bbox-filter yes
+@set config-bench-filter yes
+@set config-bilateral-filter yes
+@set config-bitplanenoise-filter yes
+@set config-blackdetect-filter yes
+@c @set config-blackframe-filter no
+@set config-blend-filter yes
+@set config-bm3d-filter yes
+@c @set config-boxblur-filter no
+@c @set config-boxblur-opencl-filter no
+@set config-bwdif-filter yes
+@set config-cas-filter yes
+@set config-chromahold-filter yes
+@set config-chromakey-filter yes
+@set config-chromanr-filter yes
+@set config-chromashift-filter yes
+@set config-ciescope-filter yes
+@set config-codecview-filter yes
+@set config-colorbalance-filter yes
+@set config-colorchannelmixer-filter yes
+@set config-colorcontrast-filter yes
+@set config-colorcorrect-filter yes
+@set config-colorize-filter yes
+@set config-colorkey-filter yes
+@c @set config-colorkey-opencl-filter no
+@set config-colorhold-filter yes
+@set config-colorlevels-filter yes
+@c @set config-colormatrix-filter no
+@set config-colorspace-filter yes
+@set config-colortemperature-filter yes
+@set config-convolution-filter yes
+@c @set config-convolution-opencl-filter no
+@set config-convolve-filter yes
+@set config-copy-filter yes
+@c @set config-coreimage-filter no
+@c @set config-cover-rect-filter no
+@set config-crop-filter yes
+@c @set config-cropdetect-filter no
+@set config-cue-filter yes
+@set config-curves-filter yes
+@set config-datascope-filter yes
+@set config-dblur-filter yes
+@set config-dctdnoiz-filter yes
+@set config-deband-filter yes
+@set config-deblock-filter yes
+@set config-decimate-filter yes
+@set config-deconvolve-filter yes
+@set config-dedot-filter yes
+@set config-deflate-filter yes
+@set config-deflicker-filter yes
+@c @set config-deinterlace-qsv-filter no
+@c @set config-deinterlace-vaapi-filter no
+@set config-dejudder-filter yes
+@c @set config-delogo-filter no
+@c @set config-denoise-vaapi-filter no
+@set config-derain-filter yes
+@set config-deshake-filter yes
+@c @set config-deshake-opencl-filter no
+@set config-despill-filter yes
+@set config-detelecine-filter yes
+@set config-dilation-filter yes
+@c @set config-dilation-opencl-filter no
+@set config-displace-filter yes
+@set config-dnn-processing-filter yes
+@set config-doubleweave-filter yes
+@set config-drawbox-filter yes
+@set config-drawgraph-filter yes
+@set config-drawgrid-filter yes
+@c @set config-drawtext-filter no
+@set config-edgedetect-filter yes
+@set config-elbg-filter yes
+@set config-entropy-filter yes
+@set config-epx-filter yes
+@c @set config-eq-filter no
+@set config-erosion-filter yes
+@c @set config-erosion-opencl-filter no
+@set config-estdif-filter yes
+@set config-exposure-filter yes
+@set config-extractplanes-filter yes
+@set config-fade-filter yes
+@set config-fftdnoiz-filter yes
+@set config-fftfilt-filter yes
+@set config-field-filter yes
+@set config-fieldhint-filter yes
+@set config-fieldmatch-filter yes
+@set config-fieldorder-filter yes
+@set config-fillborders-filter yes
+@c @set config-find-rect-filter no
+@set config-floodfill-filter yes
+@set config-format-filter yes
+@set config-fps-filter yes
+@set config-framepack-filter yes
+@set config-framerate-filter yes
+@set config-framestep-filter yes
+@set config-freezedetect-filter yes
+@set config-freezeframes-filter yes
+@c @set config-frei0r-filter no
+@c @set config-fspp-filter no
+@set config-gblur-filter yes
+@set config-geq-filter yes
+@set config-gradfun-filter yes
+@set config-graphmonitor-filter yes
+@set config-greyedge-filter yes
+@set config-haldclut-filter yes
+@set config-hflip-filter yes
+@c @set config-histeq-filter no
+@set config-histogram-filter yes
+@c @set config-hqdn3d-filter no
+@set config-hqx-filter yes
+@set config-hstack-filter yes
+@set config-hue-filter yes
+@set config-hwdownload-filter yes
+@set config-hwmap-filter yes
+@set config-hwupload-filter yes
+@c @set config-hwupload-cuda-filter no
+@set config-hysteresis-filter yes
+@set config-identity-filter yes
+@set config-idet-filter yes
+@set config-il-filter yes
+@set config-inflate-filter yes
+@c @set config-interlace-filter no
+@set config-interleave-filter yes
+@c @set config-kerndeint-filter no
+@set config-kirsch-filter yes
+@set config-lagfun-filter yes
+@set config-lenscorrection-filter yes
+@c @set config-lensfun-filter no
+@c @set config-libvmaf-filter no
+@set config-limiter-filter yes
+@set config-loop-filter yes
+@set config-lumakey-filter yes
+@set config-lut-filter yes
+@set config-lut1d-filter yes
+@set config-lut2-filter yes
+@set config-lut3d-filter yes
+@set config-lutrgb-filter yes
+@set config-lutyuv-filter yes
+@set config-maskedclamp-filter yes
+@set config-maskedmax-filter yes
+@set config-maskedmerge-filter yes
+@set config-maskedmin-filter yes
+@set config-maskedthreshold-filter yes
+@set config-maskfun-filter yes
+@c @set config-mcdeint-filter no
+@set config-median-filter yes
+@set config-mergeplanes-filter yes
+@set config-mestimate-filter yes
+@set config-metadata-filter yes
+@set config-midequalizer-filter yes
+@set config-minterpolate-filter yes
+@set config-mix-filter yes
+@set config-monochrome-filter yes
+@c @set config-mpdecimate-filter no
+@set config-msad-filter yes
+@set config-negate-filter yes
+@set config-nlmeans-filter yes
+@c @set config-nlmeans-opencl-filter no
+@c @set config-nnedi-filter no
+@set config-noformat-filter yes
+@set config-noise-filter yes
+@set config-normalize-filter yes
+@set config-null-filter yes
+@c @set config-ocr-filter no
+@c @set config-ocv-filter no
+@set config-oscilloscope-filter yes
+@set config-overlay-filter yes
+@c @set config-overlay-opencl-filter no
+@c @set config-overlay-qsv-filter no
+@c @set config-overlay-vulkan-filter no
+@c @set config-overlay-cuda-filter no
+@c @set config-owdenoise-filter no
+@set config-pad-filter yes
+@c @set config-pad-opencl-filter no
+@set config-palettegen-filter yes
+@set config-paletteuse-filter yes
+@set config-perms-filter yes
+@c @set config-perspective-filter no
+@c @set config-phase-filter no
+@set config-photosensitivity-filter yes
+@set config-pixdesctest-filter yes
+@set config-pixscope-filter yes
+@c @set config-pp-filter no
+@c @set config-pp7-filter no
+@set config-premultiply-filter yes
+@set config-prewitt-filter yes
+@c @set config-prewitt-opencl-filter no
+@c @set config-procamp-vaapi-filter no
+@c @set config-program-opencl-filter no
+@set config-pseudocolor-filter yes
+@set config-psnr-filter yes
+@c @set config-pullup-filter no
+@set config-qp-filter yes
+@set config-random-filter yes
+@set config-readeia608-filter yes
+@set config-readvitc-filter yes
+@set config-realtime-filter yes
+@set config-remap-filter yes
+@set config-removegrain-filter yes
+@set config-removelogo-filter yes
+@c @set config-repeatfields-filter no
+@set config-reverse-filter yes
+@set config-rgbashift-filter yes
+@set config-roberts-filter yes
+@c @set config-roberts-opencl-filter no
+@set config-rotate-filter yes
+@c @set config-sab-filter no
+@set config-scale-filter yes
+@c @set config-scale-cuda-filter no
+@c @set config-scale-npp-filter no
+@c @set config-scale-qsv-filter no
+@c @set config-scale-vaapi-filter no
+@c @set config-scale-vulkan-filter no
+@set config-scale2ref-filter yes
+@set config-scdet-filter yes
+@set config-scroll-filter yes
+@set config-select-filter yes
+@set config-selectivecolor-filter yes
+@set config-sendcmd-filter yes
+@set config-separatefields-filter yes
+@set config-setdar-filter yes
+@set config-setfield-filter yes
+@set config-setparams-filter yes
+@set config-setpts-filter yes
+@set config-setrange-filter yes
+@set config-setsar-filter yes
+@set config-settb-filter yes
+@c @set config-sharpness-vaapi-filter no
+@set config-shear-filter yes
+@set config-showinfo-filter yes
+@set config-showpalette-filter yes
+@set config-shuffleframes-filter yes
+@set config-shufflepixels-filter yes
+@set config-shuffleplanes-filter yes
+@set config-sidedata-filter yes
+@set config-signalstats-filter yes
+@c @set config-signature-filter no
+@c @set config-smartblur-filter no
+@set config-sobel-filter yes
+@c @set config-sobel-opencl-filter no
+@set config-split-filter yes
+@c @set config-spp-filter no
+@set config-sr-filter yes
+@set config-ssim-filter yes
+@c @set config-stereo3d-filter no
+@set config-streamselect-filter yes
+@c @set config-subtitles-filter no
+@c @set config-super2xsai-filter no
+@set config-swaprect-filter yes
+@set config-swapuv-filter yes
+@set config-tblend-filter yes
+@set config-telecine-filter yes
+@set config-thistogram-filter yes
+@set config-threshold-filter yes
+@set config-thumbnail-filter yes
+@c @set config-thumbnail-cuda-filter no
+@set config-tile-filter yes
+@c @set config-tinterlace-filter no
+@set config-tlut2-filter yes
+@set config-tmedian-filter yes
+@set config-tmidequalizer-filter yes
+@set config-tmix-filter yes
+@set config-tonemap-filter yes
+@c @set config-tonemap-opencl-filter no
+@c @set config-tonemap-vaapi-filter no
+@set config-tpad-filter yes
+@set config-transpose-filter yes
+@c @set config-transpose-npp-filter no
+@c @set config-transpose-opencl-filter no
+@c @set config-transpose-vaapi-filter no
+@set config-trim-filter yes
+@set config-unpremultiply-filter yes
+@set config-unsharp-filter yes
+@c @set config-unsharp-opencl-filter no
+@set config-untile-filter yes
+@c @set config-uspp-filter no
+@set config-v360-filter yes
+@c @set config-vaguedenoiser-filter no
+@set config-vectorscope-filter yes
+@set config-vflip-filter yes
+@set config-vfrdet-filter yes
+@set config-vibrance-filter yes
+@c @set config-vidstabdetect-filter no
+@c @set config-vidstabtransform-filter no
+@set config-vif-filter yes
+@set config-vignette-filter yes
+@set config-vmafmotion-filter yes
+@c @set config-vpp-qsv-filter no
+@set config-vstack-filter yes
+@set config-w3fdif-filter yes
+@set config-waveform-filter yes
+@set config-weave-filter yes
+@set config-xbr-filter yes
+@set config-xfade-filter yes
+@c @set config-xfade-opencl-filter no
+@set config-xmedian-filter yes
+@set config-xstack-filter yes
+@set config-yadif-filter yes
+@c @set config-yadif-cuda-filter no
+@set config-yaepblur-filter yes
+@c @set config-zmq-filter no
+@set config-zoompan-filter yes
+@c @set config-zscale-filter no
+@set config-allrgb-filter yes
+@set config-allyuv-filter yes
+@set config-cellauto-filter yes
+@set config-color-filter yes
+@c @set config-coreimagesrc-filter no
+@c @set config-frei0r-src-filter no
+@set config-gradients-filter yes
+@set config-haldclutsrc-filter yes
+@set config-life-filter yes
+@set config-mandelbrot-filter yes
+@c @set config-mptestsrc-filter no
+@set config-nullsrc-filter yes
+@c @set config-openclsrc-filter no
+@set config-pal75bars-filter yes
+@set config-pal100bars-filter yes
+@set config-rgbtestsrc-filter yes
+@set config-sierpinski-filter yes
+@set config-smptebars-filter yes
+@set config-smptehdbars-filter yes
+@set config-testsrc-filter yes
+@set config-testsrc2-filter yes
+@set config-yuvtestsrc-filter yes
+@set config-nullsink-filter yes
+@set config-abitscope-filter yes
+@set config-adrawgraph-filter yes
+@set config-agraphmonitor-filter yes
+@set config-ahistogram-filter yes
+@set config-aphasemeter-filter yes
+@set config-avectorscope-filter yes
+@set config-concat-filter yes
+@set config-showcqt-filter yes
+@set config-showfreqs-filter yes
+@set config-showspatial-filter yes
+@set config-showspectrum-filter yes
+@set config-showspectrumpic-filter yes
+@set config-showvolume-filter yes
+@set config-showwaves-filter yes
+@set config-showwavespic-filter yes
+@set config-spectrumsynth-filter yes
+@set config-amovie-filter yes
+@set config-movie-filter yes
+@set config-afifo-filter yes
+@set config-fifo-filter yes
+@set config-aa-demuxer yes
+@set config-aac-demuxer yes
+@set config-aax-demuxer yes
+@set config-ac3-demuxer yes
+@set config-ace-demuxer yes
+@set config-acm-demuxer yes
+@set config-act-demuxer yes
+@set config-adf-demuxer yes
+@set config-adp-demuxer yes
+@set config-ads-demuxer yes
+@set config-adx-demuxer yes
+@set config-aea-demuxer yes
+@set config-afc-demuxer yes
+@set config-aiff-demuxer yes
+@set config-aix-demuxer yes
+@set config-alp-demuxer yes
+@set config-amr-demuxer yes
+@set config-amrnb-demuxer yes
+@set config-amrwb-demuxer yes
+@set config-anm-demuxer yes
+@set config-apc-demuxer yes
+@set config-ape-demuxer yes
+@set config-apm-demuxer yes
+@set config-apng-demuxer yes
+@set config-aptx-demuxer yes
+@set config-aptx-hd-demuxer yes
+@set config-aqtitle-demuxer yes
+@set config-argo-asf-demuxer yes
+@set config-argo-brp-demuxer yes
+@set config-asf-demuxer yes
+@set config-asf-o-demuxer yes
+@set config-ass-demuxer yes
+@set config-ast-demuxer yes
+@set config-au-demuxer yes
+@set config-av1-demuxer yes
+@set config-avi-demuxer yes
+@c @set config-avisynth-demuxer no
+@set config-avr-demuxer yes
+@set config-avs-demuxer yes
+@set config-avs2-demuxer yes
+@set config-avs3-demuxer yes
+@set config-bethsoftvid-demuxer yes
+@set config-bfi-demuxer yes
+@set config-bintext-demuxer yes
+@set config-bink-demuxer yes
+@set config-binka-demuxer yes
+@set config-bit-demuxer yes
+@set config-bmv-demuxer yes
+@set config-bfstm-demuxer yes
+@set config-brstm-demuxer yes
+@set config-boa-demuxer yes
+@set config-c93-demuxer yes
+@set config-caf-demuxer yes
+@set config-cavsvideo-demuxer yes
+@set config-cdg-demuxer yes
+@set config-cdxl-demuxer yes
+@set config-cine-demuxer yes
+@set config-codec2-demuxer yes
+@set config-codec2raw-demuxer yes
+@set config-concat-demuxer yes
+@c @set config-dash-demuxer no
+@set config-data-demuxer yes
+@set config-daud-demuxer yes
+@set config-dcstr-demuxer yes
+@set config-derf-demuxer yes
+@set config-dfa-demuxer yes
+@set config-dhav-demuxer yes
+@set config-dirac-demuxer yes
+@set config-dnxhd-demuxer yes
+@set config-dsf-demuxer yes
+@set config-dsicin-demuxer yes
+@set config-dss-demuxer yes
+@set config-dts-demuxer yes
+@set config-dtshd-demuxer yes
+@set config-dv-demuxer yes
+@set config-dvbsub-demuxer yes
+@set config-dvbtxt-demuxer yes
+@set config-dxa-demuxer yes
+@set config-ea-demuxer yes
+@set config-ea-cdata-demuxer yes
+@set config-eac3-demuxer yes
+@set config-epaf-demuxer yes
+@set config-ffmetadata-demuxer yes
+@set config-filmstrip-demuxer yes
+@set config-fits-demuxer yes
+@set config-flac-demuxer yes
+@set config-flic-demuxer yes
+@set config-flv-demuxer yes
+@set config-live-flv-demuxer yes
+@set config-fourxm-demuxer yes
+@set config-frm-demuxer yes
+@set config-fsb-demuxer yes
+@set config-fwse-demuxer yes
+@set config-g722-demuxer yes
+@set config-g723-1-demuxer yes
+@set config-g726-demuxer yes
+@set config-g726le-demuxer yes
+@set config-g729-demuxer yes
+@set config-gdv-demuxer yes
+@set config-genh-demuxer yes
+@set config-gif-demuxer yes
+@set config-gsm-demuxer yes
+@set config-gxf-demuxer yes
+@set config-h261-demuxer yes
+@set config-h263-demuxer yes
+@set config-h264-demuxer yes
+@set config-hca-demuxer yes
+@set config-hcom-demuxer yes
+@set config-hevc-demuxer yes
+@set config-hls-demuxer yes
+@set config-hnm-demuxer yes
+@set config-ico-demuxer yes
+@set config-idcin-demuxer yes
+@set config-idf-demuxer yes
+@set config-iff-demuxer yes
+@set config-ifv-demuxer yes
+@set config-ilbc-demuxer yes
+@set config-image2-demuxer yes
+@set config-image2pipe-demuxer yes
+@set config-image2-alias-pix-demuxer yes
+@set config-image2-brender-pix-demuxer yes
+@set config-ingenient-demuxer yes
+@set config-ipmovie-demuxer yes
+@set config-ipu-demuxer yes
+@set config-ircam-demuxer yes
+@set config-iss-demuxer yes
+@set config-iv8-demuxer yes
+@set config-ivf-demuxer yes
+@set config-ivr-demuxer yes
+@set config-jacosub-demuxer yes
+@set config-jv-demuxer yes
+@set config-kux-demuxer yes
+@set config-kvag-demuxer yes
+@set config-lmlm4-demuxer yes
+@set config-loas-demuxer yes
+@set config-luodat-demuxer yes
+@set config-lrc-demuxer yes
+@set config-lvf-demuxer yes
+@set config-lxf-demuxer yes
+@set config-m4v-demuxer yes
+@set config-mca-demuxer yes
+@set config-mcc-demuxer yes
+@set config-matroska-demuxer yes
+@set config-mgsts-demuxer yes
+@set config-microdvd-demuxer yes
+@set config-mjpeg-demuxer yes
+@set config-mjpeg-2000-demuxer yes
+@set config-mlp-demuxer yes
+@set config-mlv-demuxer yes
+@set config-mm-demuxer yes
+@set config-mmf-demuxer yes
+@set config-mods-demuxer yes
+@set config-moflex-demuxer yes
+@set config-mov-demuxer yes
+@set config-mp3-demuxer yes
+@set config-mpc-demuxer yes
+@set config-mpc8-demuxer yes
+@set config-mpegps-demuxer yes
+@set config-mpegts-demuxer yes
+@set config-mpegtsraw-demuxer yes
+@set config-mpegvideo-demuxer yes
+@set config-mpjpeg-demuxer yes
+@set config-mpl2-demuxer yes
+@set config-mpsub-demuxer yes
+@set config-msf-demuxer yes
+@set config-msnwc-tcp-demuxer yes
+@set config-msp-demuxer yes
+@set config-mtaf-demuxer yes
+@set config-mtv-demuxer yes
+@set config-musx-demuxer yes
+@set config-mv-demuxer yes
+@set config-mvi-demuxer yes
+@set config-mxf-demuxer yes
+@set config-mxg-demuxer yes
+@set config-nc-demuxer yes
+@set config-nistsphere-demuxer yes
+@set config-nsp-demuxer yes
+@set config-nsv-demuxer yes
+@set config-nut-demuxer yes
+@set config-nuv-demuxer yes
+@set config-obu-demuxer yes
+@set config-ogg-demuxer yes
+@set config-oma-demuxer yes
+@set config-paf-demuxer yes
+@set config-pcm-alaw-demuxer yes
+@set config-pcm-mulaw-demuxer yes
+@set config-pcm-vidc-demuxer yes
+@set config-pcm-f64be-demuxer yes
+@set config-pcm-f64le-demuxer yes
+@set config-pcm-f32be-demuxer yes
+@set config-pcm-f32le-demuxer yes
+@set config-pcm-s32be-demuxer yes
+@set config-pcm-s32le-demuxer yes
+@set config-pcm-s24be-demuxer yes
+@set config-pcm-s24le-demuxer yes
+@set config-pcm-s16be-demuxer yes
+@set config-pcm-s16le-demuxer yes
+@set config-pcm-s8-demuxer yes
+@set config-pcm-u32be-demuxer yes
+@set config-pcm-u32le-demuxer yes
+@set config-pcm-u24be-demuxer yes
+@set config-pcm-u24le-demuxer yes
+@set config-pcm-u16be-demuxer yes
+@set config-pcm-u16le-demuxer yes
+@set config-pcm-u8-demuxer yes
+@set config-pjs-demuxer yes
+@set config-pmp-demuxer yes
+@set config-pp-bnk-demuxer yes
+@set config-pva-demuxer yes
+@set config-pvf-demuxer yes
+@set config-qcp-demuxer yes
+@set config-r3d-demuxer yes
+@set config-rawvideo-demuxer yes
+@set config-realtext-demuxer yes
+@set config-redspark-demuxer yes
+@set config-rl2-demuxer yes
+@set config-rm-demuxer yes
+@set config-roq-demuxer yes
+@set config-rpl-demuxer yes
+@set config-rsd-demuxer yes
+@set config-rso-demuxer yes
+@set config-rtp-demuxer yes
+@set config-rtsp-demuxer yes
+@set config-s337m-demuxer yes
+@set config-sami-demuxer yes
+@set config-sap-demuxer yes
+@set config-sbc-demuxer yes
+@set config-sbg-demuxer yes
+@set config-scc-demuxer yes
+@set config-sdp-demuxer yes
+@set config-sdr2-demuxer yes
+@set config-sds-demuxer yes
+@set config-sdx-demuxer yes
+@set config-segafilm-demuxer yes
+@set config-ser-demuxer yes
+@set config-sga-demuxer yes
+@set config-shorten-demuxer yes
+@set config-siff-demuxer yes
+@set config-simbiosis-imx-demuxer yes
+@set config-sln-demuxer yes
+@set config-smacker-demuxer yes
+@set config-smjpeg-demuxer yes
+@set config-smush-demuxer yes
+@set config-sol-demuxer yes
+@set config-sox-demuxer yes
+@set config-spdif-demuxer yes
+@set config-srt-demuxer yes
+@set config-str-demuxer yes
+@set config-stl-demuxer yes
+@set config-subviewer1-demuxer yes
+@set config-subviewer-demuxer yes
+@set config-sup-demuxer yes
+@set config-svag-demuxer yes
+@set config-svs-demuxer yes
+@set config-swf-demuxer yes
+@set config-tak-demuxer yes
+@set config-tedcaptions-demuxer yes
+@set config-thp-demuxer yes
+@set config-threedostr-demuxer yes
+@set config-tiertexseq-demuxer yes
+@set config-tmv-demuxer yes
+@set config-truehd-demuxer yes
+@set config-tta-demuxer yes
+@set config-txd-demuxer yes
+@set config-tty-demuxer yes
+@set config-ty-demuxer yes
+@set config-v210-demuxer yes
+@set config-v210x-demuxer yes
+@set config-vag-demuxer yes
+@set config-vc1-demuxer yes
+@set config-vc1t-demuxer yes
+@set config-vividas-demuxer yes
+@set config-vivo-demuxer yes
+@set config-vmd-demuxer yes
+@set config-vobsub-demuxer yes
+@set config-voc-demuxer yes
+@set config-vpk-demuxer yes
+@set config-vplayer-demuxer yes
+@set config-vqf-demuxer yes
+@set config-w64-demuxer yes
+@set config-wav-demuxer yes
+@set config-wc3-demuxer yes
+@set config-webm-dash-manifest-demuxer yes
+@set config-webvtt-demuxer yes
+@set config-wsaud-demuxer yes
+@set config-wsd-demuxer yes
+@set config-wsvqa-demuxer yes
+@set config-wtv-demuxer yes
+@set config-wve-demuxer yes
+@set config-wv-demuxer yes
+@set config-xa-demuxer yes
+@set config-xbin-demuxer yes
+@set config-xmv-demuxer yes
+@set config-xvag-demuxer yes
+@set config-xwma-demuxer yes
+@set config-yop-demuxer yes
+@set config-yuv4mpegpipe-demuxer yes
+@set config-image-bmp-pipe-demuxer yes
+@set config-image-cri-pipe-demuxer yes
+@set config-image-dds-pipe-demuxer yes
+@set config-image-dpx-pipe-demuxer yes
+@set config-image-exr-pipe-demuxer yes
+@set config-image-gif-pipe-demuxer yes
+@set config-image-j2k-pipe-demuxer yes
+@set config-image-jpeg-pipe-demuxer yes
+@set config-image-jpegls-pipe-demuxer yes
+@set config-image-pam-pipe-demuxer yes
+@set config-image-pbm-pipe-demuxer yes
+@set config-image-pcx-pipe-demuxer yes
+@set config-image-pgmyuv-pipe-demuxer yes
+@set config-image-pgm-pipe-demuxer yes
+@set config-image-pgx-pipe-demuxer yes
+@set config-image-photocd-pipe-demuxer yes
+@set config-image-pictor-pipe-demuxer yes
+@set config-image-png-pipe-demuxer yes
+@set config-image-ppm-pipe-demuxer yes
+@set config-image-psd-pipe-demuxer yes
+@set config-image-qdraw-pipe-demuxer yes
+@set config-image-sgi-pipe-demuxer yes
+@set config-image-svg-pipe-demuxer yes
+@set config-image-sunrast-pipe-demuxer yes
+@set config-image-tiff-pipe-demuxer yes
+@set config-image-webp-pipe-demuxer yes
+@set config-image-xbm-pipe-demuxer yes
+@set config-image-xpm-pipe-demuxer yes
+@set config-image-xwd-pipe-demuxer yes
+@c @set config-libgme-demuxer no
+@c @set config-libmodplug-demuxer no
+@c @set config-libopenmpt-demuxer no
+@c @set config-vapoursynth-demuxer no
+@set config-a64-muxer yes
+@set config-ac3-muxer yes
+@set config-adts-muxer yes
+@set config-adx-muxer yes
+@set config-aiff-muxer yes
+@set config-alp-muxer yes
+@set config-amr-muxer yes
+@set config-amv-muxer yes
+@set config-apm-muxer yes
+@set config-apng-muxer yes
+@set config-aptx-muxer yes
+@set config-aptx-hd-muxer yes
+@set config-argo-asf-muxer yes
+@set config-asf-muxer yes
+@set config-ass-muxer yes
+@set config-ast-muxer yes
+@set config-asf-stream-muxer yes
+@set config-au-muxer yes
+@set config-avi-muxer yes
+@set config-avm2-muxer yes
+@set config-avs2-muxer yes
+@set config-bit-muxer yes
+@set config-caf-muxer yes
+@set config-cavsvideo-muxer yes
+@set config-codec2-muxer yes
+@set config-codec2raw-muxer yes
+@set config-crc-muxer yes
+@set config-dash-muxer yes
+@set config-data-muxer yes
+@set config-daud-muxer yes
+@set config-dirac-muxer yes
+@set config-dnxhd-muxer yes
+@set config-dts-muxer yes
+@set config-dv-muxer yes
+@set config-eac3-muxer yes
+@set config-f4v-muxer yes
+@set config-ffmetadata-muxer yes
+@set config-fifo-muxer yes
+@set config-fifo-test-muxer yes
+@set config-filmstrip-muxer yes
+@set config-fits-muxer yes
+@set config-flac-muxer yes
+@set config-flv-muxer yes
+@set config-framecrc-muxer yes
+@set config-framehash-muxer yes
+@set config-framemd5-muxer yes
+@set config-g722-muxer yes
+@set config-g723-1-muxer yes
+@set config-g726-muxer yes
+@set config-g726le-muxer yes
+@set config-gif-muxer yes
+@set config-gsm-muxer yes
+@set config-gxf-muxer yes
+@set config-h261-muxer yes
+@set config-h263-muxer yes
+@set config-h264-muxer yes
+@set config-hash-muxer yes
+@set config-hds-muxer yes
+@set config-hevc-muxer yes
+@set config-hls-muxer yes
+@set config-ico-muxer yes
+@set config-ilbc-muxer yes
+@set config-image2-muxer yes
+@set config-image2pipe-muxer yes
+@set config-ipod-muxer yes
+@set config-ircam-muxer yes
+@set config-ismv-muxer yes
+@set config-ivf-muxer yes
+@set config-jacosub-muxer yes
+@set config-kvag-muxer yes
+@set config-latm-muxer yes
+@set config-lrc-muxer yes
+@set config-m4v-muxer yes
+@set config-md5-muxer yes
+@set config-matroska-muxer yes
+@set config-matroska-audio-muxer yes
+@set config-microdvd-muxer yes
+@set config-mjpeg-muxer yes
+@set config-mlp-muxer yes
+@set config-mmf-muxer yes
+@set config-mov-muxer yes
+@set config-mp2-muxer yes
+@set config-mp3-muxer yes
+@set config-mp4-muxer yes
+@set config-mpeg1system-muxer yes
+@set config-mpeg1vcd-muxer yes
+@set config-mpeg1video-muxer yes
+@set config-mpeg2dvd-muxer yes
+@set config-mpeg2svcd-muxer yes
+@set config-mpeg2video-muxer yes
+@set config-mpeg2vob-muxer yes
+@set config-mpegts-muxer yes
+@set config-mpjpeg-muxer yes
+@set config-mxf-muxer yes
+@set config-mxf-d10-muxer yes
+@set config-mxf-opatom-muxer yes
+@set config-null-muxer yes
+@set config-nut-muxer yes
+@set config-oga-muxer yes
+@set config-ogg-muxer yes
+@set config-ogv-muxer yes
+@set config-oma-muxer yes
+@set config-opus-muxer yes
+@set config-pcm-alaw-muxer yes
+@set config-pcm-mulaw-muxer yes
+@set config-pcm-vidc-muxer yes
+@set config-pcm-f64be-muxer yes
+@set config-pcm-f64le-muxer yes
+@set config-pcm-f32be-muxer yes
+@set config-pcm-f32le-muxer yes
+@set config-pcm-s32be-muxer yes
+@set config-pcm-s32le-muxer yes
+@set config-pcm-s24be-muxer yes
+@set config-pcm-s24le-muxer yes
+@set config-pcm-s16be-muxer yes
+@set config-pcm-s16le-muxer yes
+@set config-pcm-s8-muxer yes
+@set config-pcm-u32be-muxer yes
+@set config-pcm-u32le-muxer yes
+@set config-pcm-u24be-muxer yes
+@set config-pcm-u24le-muxer yes
+@set config-pcm-u16be-muxer yes
+@set config-pcm-u16le-muxer yes
+@set config-pcm-u8-muxer yes
+@set config-psp-muxer yes
+@set config-rawvideo-muxer yes
+@set config-rm-muxer yes
+@set config-roq-muxer yes
+@set config-rso-muxer yes
+@set config-rtp-muxer yes
+@set config-rtp-mpegts-muxer yes
+@set config-rtsp-muxer yes
+@set config-sap-muxer yes
+@set config-sbc-muxer yes
+@set config-scc-muxer yes
+@set config-segafilm-muxer yes
+@set config-segment-muxer yes
+@set config-stream-segment-muxer yes
+@set config-singlejpeg-muxer yes
+@set config-smjpeg-muxer yes
+@set config-smoothstreaming-muxer yes
+@set config-sox-muxer yes
+@set config-spx-muxer yes
+@set config-spdif-muxer yes
+@set config-srt-muxer yes
+@set config-streamhash-muxer yes
+@set config-sup-muxer yes
+@set config-swf-muxer yes
+@set config-tee-muxer yes
+@set config-tg2-muxer yes
+@set config-tgp-muxer yes
+@set config-mkvtimestamp-v2-muxer yes
+@set config-truehd-muxer yes
+@set config-tta-muxer yes
+@set config-ttml-muxer yes
+@set config-uncodedframecrc-muxer yes
+@set config-vc1-muxer yes
+@set config-vc1t-muxer yes
+@set config-voc-muxer yes
+@set config-w64-muxer yes
+@set config-wav-muxer yes
+@set config-webm-muxer yes
+@set config-webm-dash-manifest-muxer yes
+@set config-webm-chunk-muxer yes
+@set config-webp-muxer yes
+@set config-webvtt-muxer yes
+@set config-wtv-muxer yes
+@set config-wv-muxer yes
+@set config-yuv4mpegpipe-muxer yes
+@c @set config-chromaprint-muxer no
+@set config-async-protocol yes
+@c @set config-bluray-protocol no
+@set config-cache-protocol yes
+@set config-concat-protocol yes
+@set config-crypto-protocol yes
+@set config-data-protocol yes
+@c @set config-ffrtmpcrypt-protocol no
+@set config-ffrtmphttp-protocol yes
+@set config-file-protocol yes
+@set config-ftp-protocol yes
+@set config-gopher-protocol yes
+@set config-gophers-protocol yes
+@set config-hls-protocol yes
+@set config-http-protocol yes
+@set config-httpproxy-protocol yes
+@set config-https-protocol yes
+@set config-icecast-protocol yes
+@set config-mmsh-protocol yes
+@set config-mmst-protocol yes
+@set config-md5-protocol yes
+@set config-pipe-protocol yes
+@set config-prompeg-protocol yes
+@set config-rtmp-protocol yes
+@c @set config-rtmpe-protocol no
+@set config-rtmps-protocol yes
+@set config-rtmpt-protocol yes
+@c @set config-rtmpte-protocol no
+@set config-rtmpts-protocol yes
+@set config-rtp-protocol yes
+@c @set config-sctp-protocol no
+@set config-srtp-protocol yes
+@set config-subfile-protocol yes
+@set config-tee-protocol yes
+@set config-tcp-protocol yes
+@set config-tls-protocol yes
+@set config-udp-protocol yes
+@set config-udplite-protocol yes
+@c @set config-unix-protocol no
+@c @set config-libamqp-protocol no
+@c @set config-librist-protocol no
+@c @set config-librtmp-protocol no
+@c @set config-librtmpe-protocol no
+@c @set config-librtmps-protocol no
+@c @set config-librtmpt-protocol no
+@c @set config-librtmpte-protocol no
+@c @set config-libsrt-protocol no
+@c @set config-libssh-protocol no
+@c @set config-libsmbclient-protocol no
+@c @set config-libzmq-protocol no
diff --git a/extern/ffmpeg/doc/decoders.texi b/extern/ffmpeg/doc/decoders.texi
new file mode 100644
index 0000000000..27c6ba4a5d
--- /dev/null
+++ b/extern/ffmpeg/doc/decoders.texi
@@ -0,0 +1,398 @@
+@chapter Decoders
+@c man begin DECODERS
+
+Decoders are configured elements in FFmpeg which allow the decoding of
+multimedia streams.
+
+When you configure your FFmpeg build, all the supported native decoders
+are enabled by default. Decoders requiring an external library must be enabled
+manually via the corresponding @code{--enable-lib} option. You can list all
+available decoders using the configure option @code{--list-decoders}.
+
+You can disable all the decoders with the configure option
+@code{--disable-decoders} and selectively enable / disable single decoders
+with the options @code{--enable-decoder=@var{DECODER}} /
+@code{--disable-decoder=@var{DECODER}}.
+
+The option @code{-decoders} of the ff* tools will display the list of
+enabled decoders.
+
+@c man end DECODERS
+
+@chapter Video Decoders
+@c man begin VIDEO DECODERS
+
+A description of some of the currently available video decoders
+follows.
+
+@section av1
+
+AOMedia Video 1 (AV1) decoder.
+
+@subsection Options
+
+@table @option
+
+@item operating_point
+Select an operating point of a scalable AV1 bitstream (0 - 31). Default is 0.
+
+@end table
+
+@section rawvideo
+
+Raw video decoder.
+
+This decoder decodes rawvideo streams.
+
+@subsection Options
+
+@table @option
+@item top @var{top_field_first}
+Specify the assumed field type of the input video.
+@table @option
+@item -1
+the video is assumed to be progressive (default)
+@item 0
+bottom-field-first is assumed
+@item 1
+top-field-first is assumed
+@end table
+
+@end table
+
+@section libdav1d
+
+dav1d AV1 decoder.
+
+libdav1d allows libavcodec to decode the AOMedia Video 1 (AV1) codec.
+Requires the presence of the libdav1d headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-libdav1d}.
+
+@subsection Options
+
+The following options are supported by the libdav1d wrapper.
+
+@table @option
+
+@item framethreads
+Set amount of frame threads to use during decoding. The default value is 0 (autodetect).
+
+@item tilethreads
+Set amount of tile threads to use during decoding. The default value is 0 (autodetect).
+
+@item filmgrain
+Apply film grain to the decoded video if present in the bitstream. Defaults to the
+internal default of the library.
+
+@item oppoint
+Select an operating point of a scalable AV1 bitstream (0 - 31). Defaults to the
+internal default of the library.
+
+@item alllayers
+Output all spatial layers of a scalable AV1 bitstream. The default value is false.
+
+@end table
+
+@section libdavs2
+
+AVS2-P2/IEEE1857.4 video decoder wrapper.
+
+This decoder allows libavcodec to decode AVS2 streams with davs2 library.
+
+@c man end VIDEO DECODERS
+
+@section libuavs3d
+
+AVS3-P2/IEEE1857.10 video decoder.
+
+libuavs3d allows libavcodec to decode AVS3 streams.
+Requires the presence of the libuavs3d headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-libuavs3d}.
+
+@subsection Options
+
+The following option is supported by the libuavs3d wrapper.
+
+@table @option
+
+@item frame_threads
+Set amount of frame threads to use during decoding. The default value is 0 (autodetect).
+
+@end table
+
+@c man end VIDEO DECODERS
+
+@chapter Audio Decoders
+@c man begin AUDIO DECODERS
+
+A description of some of the currently available audio decoders
+follows.
+
+@section ac3
+
+AC-3 audio decoder.
+
+This decoder implements part of ATSC A/52:2010 and ETSI TS 102 366, as well as
+the undocumented RealAudio 3 (a.k.a. dnet).
+
+@subsection AC-3 Decoder Options
+
+@table @option
+
+@item -drc_scale @var{value}
+Dynamic Range Scale Factor. The factor to apply to dynamic range values
+from the AC-3 stream. This factor is applied exponentially. The default value is 1.
+There are 3 notable scale factor ranges:
+@table @option
+@item drc_scale == 0
+DRC disabled. Produces full range audio.
+@item 0 < drc_scale <= 1
+DRC enabled. Applies a fraction of the stream DRC value.
+Audio reproduction is between full range and full compression.
+@item drc_scale > 1
+DRC enabled. Applies drc_scale asymmetrically.
+Loud sounds are fully compressed. Soft sounds are enhanced.
+@end table
+
+@end table
+
+@section flac
+
+FLAC audio decoder.
+
+This decoder aims to implement the complete FLAC specification from Xiph.
+
+@subsection FLAC Decoder options
+
+@table @option
+
+@item -use_buggy_lpc
+The lavc FLAC encoder used to produce buggy streams with high lpc values
+(like the default value). This option makes it possible to decode such streams
+correctly by using lavc's old buggy lpc logic for decoding.
+
+@end table
+
+@section ffwavesynth
+
+Internal wave synthesizer.
+
+This decoder generates wave patterns according to predefined sequences. Its
+use is purely internal and the format of the data it accepts is not publicly
+documented.
+
+@section libcelt
+
+libcelt decoder wrapper.
+
+libcelt allows libavcodec to decode the Xiph CELT ultra-low delay audio codec.
+Requires the presence of the libcelt headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-libcelt}.
+
+@section libgsm
+
+libgsm decoder wrapper.
+
+libgsm allows libavcodec to decode the GSM full rate audio codec. Requires
+the presence of the libgsm headers and library during configuration. You need
+to explicitly configure the build with @code{--enable-libgsm}.
+
+This decoder supports both the ordinary GSM and the Microsoft variant.
+
+@section libilbc
+
+libilbc decoder wrapper.
+
+libilbc allows libavcodec to decode the Internet Low Bitrate Codec (iLBC)
+audio codec. Requires the presence of the libilbc headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libilbc}.
+
+@subsection Options
+
+The following option is supported by the libilbc wrapper.
+
+@table @option
+@item enhance
+
+Enable the enhancement of the decoded audio when set to 1. The default
+value is 0 (disabled).
+
+@end table
+
+@section libopencore-amrnb
+
+libopencore-amrnb decoder wrapper.
+
+libopencore-amrnb allows libavcodec to decode the Adaptive Multi-Rate
+Narrowband audio codec. Using it requires the presence of the
+libopencore-amrnb headers and library during configuration. You need to
+explicitly configure the build with @code{--enable-libopencore-amrnb}.
+
+An FFmpeg native decoder for AMR-NB exists, so users can decode AMR-NB
+without this library.
+
+@section libopencore-amrwb
+
+libopencore-amrwb decoder wrapper.
+
+libopencore-amrwb allows libavcodec to decode the Adaptive Multi-Rate
+Wideband audio codec. Using it requires the presence of the
+libopencore-amrwb headers and library during configuration. You need to
+explicitly configure the build with @code{--enable-libopencore-amrwb}.
+
+An FFmpeg native decoder for AMR-WB exists, so users can decode AMR-WB
+without this library.
+
+@section libopus
+
+libopus decoder wrapper.
+
+libopus allows libavcodec to decode the Opus Interactive Audio Codec.
+Requires the presence of the libopus headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libopus}.
+
+An FFmpeg native decoder for Opus exists, so users can decode Opus
+without this library.
+
+@c man end AUDIO DECODERS
+
+@chapter Subtitles Decoders
+@c man begin SUBTILES DECODERS
+
+@section libaribb24
+
+ARIB STD-B24 caption decoder.
+
+Implements profiles A and C of the ARIB STD-B24 standard.
+
+@subsection libaribb24 Decoder Options
+
+@table @option
+
+@item -aribb24-base-path @var{path}
+Sets the base path for the libaribb24 library. This is utilized for reading of
+configuration files (for custom unicode conversions), and for dumping of
+non-text symbols as images under that location.
+
+Unset by default.
+
+@item -aribb24-skip-ruby-text @var{boolean}
+Tells the decoder wrapper to skip text blocks that contain half-height ruby
+text.
+
+Enabled by default.
+
+@end table
+
+@section dvbsub
+
+@subsection Options
+
+@table @option
+@item compute_clut
+@table @option
+@item -1
+Compute clut if no matching CLUT is in the stream.
+@item 0
+Never compute CLUT
+@item 1
+Always compute CLUT and override the one provided in the stream.
+@end table
+@item dvb_substream
+Selects the dvb substream, or all substreams if -1 which is default.
+
+@end table
+
+@section dvdsub
+
+This codec decodes the bitmap subtitles used in DVDs; the same subtitles can
+also be found in VobSub file pairs and in some Matroska files.
+
+@subsection Options
+
+@table @option
+@item palette
+Specify the global palette used by the bitmaps. When stored in VobSub, the
+palette is normally specified in the index file; in Matroska, the palette is
+stored in the codec extra-data in the same format as in VobSub. In DVDs, the
+palette is stored in the IFO file, and therefore not available when reading
+from dumped VOB files.
+
+The format for this option is a string containing 16 24-bits hexadecimal
+numbers (without 0x prefix) separated by commas, for example @code{0d00ee,
+ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
+7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
+
+@item ifo_palette
+Specify the IFO file from which the global palette is obtained.
+(experimental)
+
+@item forced_subs_only
+Only decode subtitle entries marked as forced. Some titles have forced
+and non-forced subtitles in the same track. Setting this flag to @code{1}
+will only keep the forced subtitles. Default value is @code{0}.
+@end table
+
+@section libzvbi-teletext
+
+Libzvbi allows libavcodec to decode DVB teletext pages and DVB teletext
+subtitles. Requires the presence of the libzvbi headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libzvbi}.
+
+@subsection Options
+
+@table @option
+@item txt_page
+List of teletext page numbers to decode. Pages that do not match the specified
+list are dropped. You may use the special @code{*} string to match all pages,
+or @code{subtitle} to match all subtitle pages.
+Default value is *.
+@item txt_default_region
+Set default character set used for decoding, a value between 0 and 87 (see
+ETS 300 706, Section 15, Table 32). Default value is -1, which does not
+override the libzvbi default. This option is needed for some legacy level 1.0
+transmissions which cannot signal the proper charset.
+@item txt_chop_top
+Discards the top teletext line. Default value is 1.
+@item txt_format
+Specifies the format of the decoded subtitles.
+@table @option
+@item bitmap
+The default format, you should use this for teletext pages, because certain
+graphics and colors cannot be expressed in simple text or even ASS.
+@item text
+Simple text based output without formatting.
+@item ass
+Formatted ASS output, subtitle pages and teletext pages are returned in
+different styles, subtitle pages are stripped down to text, but an effort is
+made to keep the text alignment and the formatting.
+@end table
+@item txt_left
+X offset of generated bitmaps, default is 0.
+@item txt_top
+Y offset of generated bitmaps, default is 0.
+@item txt_chop_spaces
+Chops leading and trailing spaces and removes empty lines from the generated
+text. This option is useful for teletext based subtitles where empty spaces may
+be present at the start or at the end of the lines or empty lines may be
+present between the subtitle lines because of double-sized teletext characters.
+Default value is 1.
+@item txt_duration
+Sets the display duration of the decoded teletext pages or subtitles in
+milliseconds. Default value is -1 which means infinity or until the next
+subtitle event comes.
+@item txt_transparent
+Force transparent background of the generated teletext bitmaps. Default value
+is 0 which means an opaque background.
+@item txt_opacity
+Sets the opacity (0-255) of the teletext background. If
+@option{txt_transparent} is not set, it only affects characters between a start
+box and an end box, typically subtitles. Default value is 0 if
+@option{txt_transparent} is set, 255 otherwise.
+
+@end table
+
+@c man end SUBTILES DECODERS
diff --git a/extern/ffmpeg/doc/default.css b/extern/ffmpeg/doc/default.css
new file mode 100644
index 0000000000..bf50200c28
--- /dev/null
+++ b/extern/ffmpeg/doc/default.css
@@ -0,0 +1,165 @@
+a.summary-letter {
+ text-decoration: none;
+}
+
+a {
+ color: #2D6198;
+}
+
+a:visited {
+ color: #884488;
+}
+
+#banner {
+ background-color: white;
+ position: relative;
+ text-align: center;
+}
+
+#banner img {
+ margin-bottom: 1px;
+ margin-top: 5px;
+}
+
+#body {
+ margin-left: 1em;
+ margin-right: 1em;
+}
+
+body {
+ background-color: #313131;
+ margin: 0;
+ text-align: justify;
+}
+
+.center {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+}
+
+#container {
+ background-color: white;
+ color: #202020;
+ margin-left: 1em;
+ margin-right: 1em;
+}
+
+#footer {
+ text-align: center;
+}
+
+h1 a, h2 a, h3 a, h4 a {
+ text-decoration: inherit;
+ color: inherit;
+}
+
+h1, h2, h3, h4 {
+ padding-left: 0.4em;
+ border-radius: 4px;
+ padding-bottom: 0.25em;
+ padding-top: 0.25em;
+ border: 1px solid #6A996A;
+}
+
+h1 {
+ background-color: #7BB37B;
+ color: #151515;
+ font-size: 1.2em;
+ padding-bottom: 0.3em;
+ padding-top: 0.3em;
+}
+
+h2 {
+ color: #313131;
+ font-size: 1.0em;
+ background-color: #ABE3AB;
+}
+
+h3 {
+ color: #313131;
+ font-size: 0.9em;
+ margin-bottom: -6px;
+ background-color: #BBF3BB;
+}
+
+h4 {
+ color: #313131;
+ font-size: 0.8em;
+ margin-bottom: -8px;
+ background-color: #D1FDD1;
+}
+
+img {
+ border: 0;
+}
+
+#navbar {
+ background-color: #738073;
+ border-bottom: 1px solid #5C665C;
+ border-top: 1px solid #5C665C;
+ margin-top: 12px;
+ padding: 0.3em;
+ position: relative;
+ text-align: center;
+}
+
+#navbar a, #navbar_secondary a {
+ color: white;
+ padding: 0.3em;
+ text-decoration: none;
+}
+
+#navbar a:hover, #navbar_secondary a:hover {
+ background-color: #313131;
+ color: white;
+ text-decoration: none;
+}
+
+#navbar_secondary {
+ background-color: #738073;
+ border-bottom: 1px solid #5C665C;
+ border-left: 1px solid #5C665C;
+ border-right: 1px solid #5C665C;
+ padding: 0.3em;
+ position: relative;
+ text-align: center;
+}
+
+p {
+ margin-left: 1em;
+ margin-right: 1em;
+}
+
+pre {
+ margin-left: 3em;
+ margin-right: 3em;
+ padding: 0.3em;
+ border: 1px solid #bbb;
+ background-color: #f7f7f7;
+}
+
+dl dt {
+ font-weight: bold;
+}
+
+#proj_desc {
+ font-size: 1.2em;
+}
+
+#repos {
+ margin-left: 1em;
+ margin-right: 1em;
+ border-collapse: collapse;
+ border: solid 1px #6A996A;
+}
+
+#repos th {
+ background-color: #7BB37B;
+ border: solid 1px #6A996A;
+}
+
+#repos td {
+ padding: 0.2em;
+ border: solid 1px #6A996A;
+}
diff --git a/extern/ffmpeg/doc/demuxers.texi b/extern/ffmpeg/doc/demuxers.texi
new file mode 100644
index 0000000000..3c15ab9eee
--- /dev/null
+++ b/extern/ffmpeg/doc/demuxers.texi
@@ -0,0 +1,835 @@
+@chapter Demuxers
+@c man begin DEMUXERS
+
+Demuxers are configured elements in FFmpeg that can read the
+multimedia streams from a particular type of file.
+
+When you configure your FFmpeg build, all the supported demuxers
+are enabled by default. You can list all available ones using the
+configure option @code{--list-demuxers}.
+
+You can disable all the demuxers using the configure option
+@code{--disable-demuxers}, and selectively enable a single demuxer with
+the option @code{--enable-demuxer=@var{DEMUXER}}, or disable it
+with the option @code{--disable-demuxer=@var{DEMUXER}}.
+
+The option @code{-demuxers} of the ff* tools will display the list of
+enabled demuxers. Use @code{-formats} to view a combined list of
+enabled demuxers and muxers.
+
+The description of some of the currently available demuxers follows.
+
+@section aa
+
+Audible Format 2, 3, and 4 demuxer.
+
+This demuxer is used to demux Audible Format 2, 3, and 4 (.aa) files.
+
+@section apng
+
+Animated Portable Network Graphics demuxer.
+
+This demuxer is used to demux APNG files.
+All headers, but the PNG signature, up to (but not including) the first
+fcTL chunk are transmitted as extradata.
+Frames are then split as being all the chunks between two fcTL ones, or
+between the last fcTL and IEND chunks.
+
+@table @option
+@item -ignore_loop @var{bool}
+Ignore the loop variable in the file if set.
+@item -max_fps @var{int}
+Maximum framerate in frames per second (0 for no limit).
+@item -default_fps @var{int}
+Default framerate in frames per second when none is specified in the file
+(0 meaning as fast as possible).
+@end table
+
+@section asf
+
+Advanced Systems Format demuxer.
+
+This demuxer is used to demux ASF files and MMS network streams.
+
+@table @option
+@item -no_resync_search @var{bool}
+Do not try to resynchronize by looking for a certain optional start code.
+@end table
+
+@anchor{concat}
+@section concat
+
+Virtual concatenation script demuxer.
+
+This demuxer reads a list of files and other directives from a text file and
+demuxes them one after the other, as if all their packets had been muxed
+together.
+
+The timestamps in the files are adjusted so that the first file starts at 0
+and each next file starts where the previous one finishes. Note that it is
+done globally and may cause gaps if all streams do not have exactly the same
+length.
+
+All files must have the same streams (same codecs, same time base, etc.).
+
+The duration of each file is used to adjust the timestamps of the next file:
+if the duration is incorrect (because it was computed using the bit-rate or
+because the file is truncated, for example), it can cause artifacts. The
+@code{duration} directive can be used to override the duration stored in
+each file.
+
+@subsection Syntax
+
+The script is a text file in extended-ASCII, with one directive per line.
+Empty lines, leading spaces and lines starting with '#' are ignored. The
+following directive is recognized:
+
+@table @option
+
+@item @code{file @var{path}}
+Path to a file to read; special characters and spaces must be escaped with
+backslash or single quotes.
+
+All subsequent file-related directives apply to that file.
+
+@item @code{ffconcat version 1.0}
+Identify the script type and version. It also sets the @option{safe} option
+to 1 if it was -1.
+
+To make FFmpeg recognize the format automatically, this directive must
+appear exactly as is (no extra space or byte-order-mark) on the very first
+line of the script.
+
+@item @code{duration @var{dur}}
+Duration of the file. This information can be specified from the file;
+specifying it here may be more efficient or help if the information from the
+file is not available or accurate.
+
+If the duration is set for all files, then it is possible to seek in the
+whole concatenated video.
+
+@item @code{inpoint @var{timestamp}}
+In point of the file. When the demuxer opens the file it instantly seeks to the
+specified timestamp. Seeking is done so that all streams can be presented
+successfully at In point.
+
+This directive works best with intra frame codecs, because for non-intra frame
+ones you will usually get extra packets before the actual In point and the
+decoded content will most likely contain frames before In point too.
+
+For each file, packets before the file In point will have timestamps less than
+the calculated start timestamp of the file (negative in case of the first
+file), and the duration of the files (if not specified by the @code{duration}
+directive) will be reduced based on their specified In point.
+
+Because of potential packets before the specified In point, packet timestamps
+may overlap between two concatenated files.
+
+@item @code{outpoint @var{timestamp}}
+Out point of the file. When the demuxer reaches the specified decoding
+timestamp in any of the streams, it handles it as an end of file condition and
+skips the current and all the remaining packets from all streams.
+
+Out point is exclusive, which means that the demuxer will not output packets
+with a decoding timestamp greater or equal to Out point.
+
+This directive works best with intra frame codecs and formats where all streams
+are tightly interleaved. For non-intra frame codecs you will usually get
+additional packets with presentation timestamp after Out point therefore the
+decoded content will most likely contain frames after Out point too. If your
+streams are not tightly interleaved you may not get all the packets from all
+streams before Out point and you may only will be able to decode the earliest
+stream until Out point.
+
+The duration of the files (if not specified by the @code{duration}
+directive) will be reduced based on their specified Out point.
+
+@item @code{file_packet_metadata @var{key=value}}
+Metadata of the packets of the file. The specified metadata will be set for
+each file packet. You can specify this directive multiple times to add multiple
+metadata entries.
+
+@item @code{stream}
+Introduce a stream in the virtual file.
+All subsequent stream-related directives apply to the last introduced
+stream.
+Some streams properties must be set in order to allow identifying the
+matching streams in the subfiles.
+If no streams are defined in the script, the streams from the first file are
+copied.
+
+@item @code{exact_stream_id @var{id}}
+Set the id of the stream.
+If this directive is given, the string with the corresponding id in the
+subfiles will be used.
+This is especially useful for MPEG-PS (VOB) files, where the order of the
+streams is not reliable.
+
+@end table
+
+@subsection Options
+
+This demuxer accepts the following option:
+
+@table @option
+
+@item safe
+If set to 1, reject unsafe file paths. A file path is considered safe if it
+does not contain a protocol specification and is relative and all components
+only contain characters from the portable character set (letters, digits,
+period, underscore and hyphen) and have no period at the beginning of a
+component.
+
+If set to 0, any file name is accepted.
+
+The default is 1.
+
+-1 is equivalent to 1 if the format was automatically
+probed and 0 otherwise.
+
+@item auto_convert
+If set to 1, try to perform automatic conversions on packet data to make the
+streams concatenable.
+The default is 1.
+
+Currently, the only conversion is adding the h264_mp4toannexb bitstream
+filter to H.264 streams in MP4 format. This is necessary in particular if
+there are resolution changes.
+
+@item segment_time_metadata
+If set to 1, every packet will contain the @var{lavf.concat.start_time} and the
+@var{lavf.concat.duration} packet metadata values which are the start_time and
+the duration of the respective file segments in the concatenated output
+expressed in microseconds. The duration metadata is only set if it is known
+based on the concat file.
+The default is 0.
+
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Use absolute filenames and include some comments:
+@example
+# my first filename
+file /mnt/share/file-1.wav
+# my second filename including whitespace
+file '/mnt/share/file 2.wav'
+# my third filename including whitespace plus single quote
+file '/mnt/share/file 3'\''.wav'
+@end example
+
+@item
+Allow for input format auto-probing, use safe filenames and set the duration of
+the first file:
+@example
+ffconcat version 1.0
+
+file file-1.wav
+duration 20.0
+
+file subdir/file-2.wav
+@end example
+@end itemize
+
+@section dash
+
+Dynamic Adaptive Streaming over HTTP demuxer.
+
+This demuxer presents all AVStreams found in the manifest.
+By setting the discard flags on AVStreams the caller can decide
+which streams to actually receive.
+Each stream mirrors the @code{id} and @code{bandwidth} properties from the
+@code{} as metadata keys named "id" and "variant_bitrate" respectively.
+
+@section flv, live_flv
+
+Adobe Flash Video Format demuxer.
+
+This demuxer is used to demux FLV files and RTMP network streams. In case of live network streams, if you force format, you may use live_flv option instead of flv to survive timestamp discontinuities.
+
+@example
+ffmpeg -f flv -i myfile.flv ...
+ffmpeg -f live_flv -i rtmp:///anything/key ....
+@end example
+
+
+@table @option
+@item -flv_metadata @var{bool}
+Allocate the streams according to the onMetaData array content.
+
+@item -flv_ignore_prevtag @var{bool}
+Ignore the size of previous tag value.
+
+@item -flv_full_metadata @var{bool}
+Output all context of the onMetadata.
+@end table
+
+@section gif
+
+Animated GIF demuxer.
+
+It accepts the following options:
+
+@table @option
+@item min_delay
+Set the minimum valid delay between frames in hundredths of seconds.
+Range is 0 to 6000. Default value is 2.
+
+@item max_gif_delay
+Set the maximum valid delay between frames in hundredth of seconds.
+Range is 0 to 65535. Default value is 65535 (nearly eleven minutes),
+the maximum value allowed by the specification.
+
+@item default_delay
+Set the default delay between frames in hundredths of seconds.
+Range is 0 to 6000. Default value is 10.
+
+@item ignore_loop
+GIF files can contain information to loop a certain number of times (or
+infinitely). If @option{ignore_loop} is set to 1, then the loop setting
+from the input will be ignored and looping will not occur. If set to 0,
+then looping will occur and will cycle the number of times according to
+the GIF. Default value is 1.
+@end table
+
+For example, with the overlay filter, place an infinitely looping GIF
+over another video:
+@example
+ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
+@end example
+
+Note that in the above example the shortest option for overlay filter is
+used to end the output video at the length of the shortest input file,
+which in this case is @file{input.mp4} as the GIF in this example loops
+infinitely.
+
+@section hls
+
+HLS demuxer
+
+Apple HTTP Live Streaming demuxer.
+
+This demuxer presents all AVStreams from all variant streams.
+The id field is set to the bitrate variant index number. By setting
+the discard flags on AVStreams (by pressing 'a' or 'v' in ffplay),
+the caller can decide which variant streams to actually receive.
+The total bitrate of the variant that the stream belongs to is
+available in a metadata key named "variant_bitrate".
+
+It accepts the following options:
+
+@table @option
+@item live_start_index
+segment index to start live streams at (negative values are from the end).
+
+@item allowed_extensions
+',' separated list of file extensions that hls is allowed to access.
+
+@item max_reload
+Maximum number of times a insufficient list is attempted to be reloaded.
+Default value is 1000.
+
+@item m3u8_hold_counters
+The maximum number of times to load m3u8 when it refreshes without new segments.
+Default value is 1000.
+
+@item http_persistent
+Use persistent HTTP connections. Applicable only for HTTP streams.
+Enabled by default.
+
+@item http_multiple
+Use multiple HTTP connections for downloading HTTP segments.
+Enabled by default for HTTP/1.1 servers.
+
+@item http_seekable
+Use HTTP partial requests for downloading HTTP segments.
+0 = disable, 1 = enable, -1 = auto, Default is auto.
+@end table
+
+@section image2
+
+Image file demuxer.
+
+This demuxer reads from a list of image files specified by a pattern.
+The syntax and meaning of the pattern is specified by the
+option @var{pattern_type}.
+
+The pattern may contain a suffix which is used to automatically
+determine the format of the images contained in the files.
+
+The size, the pixel format, and the format of each image must be the
+same for all the files in the sequence.
+
+This demuxer accepts the following options:
+@table @option
+@item framerate
+Set the frame rate for the video stream. It defaults to 25.
+@item loop
+If set to 1, loop over the input. Default value is 0.
+@item pattern_type
+Select the pattern type used to interpret the provided filename.
+
+@var{pattern_type} accepts one of the following values.
+@table @option
+@item none
+Disable pattern matching, therefore the video will only contain the specified
+image. You should use this option if you do not want to create sequences from
+multiple images and your filenames may contain special pattern characters.
+@item sequence
+Select a sequence pattern type, used to specify a sequence of files
+indexed by sequential numbers.
+
+A sequence pattern may contain the string "%d" or "%0@var{N}d", which
+specifies the position of the characters representing a sequential
+number in each filename matched by the pattern. If the form
+"%d0@var{N}d" is used, the string representing the number in each
+filename is 0-padded and @var{N} is the total number of 0-padded
+digits representing the number. The literal character '%' can be
+specified in the pattern with the string "%%".
+
+If the sequence pattern contains "%d" or "%0@var{N}d", the first filename of
+the file list specified by the pattern must contain a number
+inclusively contained between @var{start_number} and
+@var{start_number}+@var{start_number_range}-1, and all the following
+numbers must be sequential.
+
+For example the pattern "img-%03d.bmp" will match a sequence of
+filenames of the form @file{img-001.bmp}, @file{img-002.bmp}, ...,
+@file{img-010.bmp}, etc.; the pattern "i%%m%%g-%d.jpg" will match a
+sequence of filenames of the form @file{i%m%g-1.jpg},
+@file{i%m%g-2.jpg}, ..., @file{i%m%g-10.jpg}, etc.
+
+Note that the pattern must not necessarily contain "%d" or
+"%0@var{N}d", for example to convert a single image file
+@file{img.jpeg} you can employ the command:
+@example
+ffmpeg -i img.jpeg img.png
+@end example
+
+@item glob
+Select a glob wildcard pattern type.
+
+The pattern is interpreted like a @code{glob()} pattern. This is only
+selectable if libavformat was compiled with globbing support.
+
+@item glob_sequence @emph{(deprecated, will be removed)}
+Select a mixed glob wildcard/sequence pattern.
+
+If your version of libavformat was compiled with globbing support, and
+the provided pattern contains at least one glob meta character among
+@code{%*?[]@{@}} that is preceded by an unescaped "%", the pattern is
+interpreted like a @code{glob()} pattern, otherwise it is interpreted
+like a sequence pattern.
+
+All glob special characters @code{%*?[]@{@}} must be prefixed
+with "%". To escape a literal "%" you shall use "%%".
+
+For example the pattern @code{foo-%*.jpeg} will match all the
+filenames prefixed by "foo-" and terminating with ".jpeg", and
+@code{foo-%?%?%?.jpeg} will match all the filenames prefixed with
+"foo-", followed by a sequence of three characters, and terminating
+with ".jpeg".
+
+This pattern type is deprecated in favor of @var{glob} and
+@var{sequence}.
+@end table
+
+Default value is @var{glob_sequence}.
+@item pixel_format
+Set the pixel format of the images to read. If not specified the pixel
+format is guessed from the first image file in the sequence.
+@item start_number
+Set the index of the file matched by the image file pattern to start
+to read from. Default value is 0.
+@item start_number_range
+Set the index interval range to check when looking for the first image
+file in the sequence, starting from @var{start_number}. Default value
+is 5.
+@item ts_from_file
+If set to 1, will set frame timestamp to modification time of image file. Note
+that monotonity of timestamps is not provided: images go in the same order as
+without this option. Default value is 0.
+If set to 2, will set frame timestamp to the modification time of the image file in
+nanosecond precision.
+@item video_size
+Set the video size of the images to read. If not specified the video
+size is guessed from the first image file in the sequence.
+@item export_path_metadata
+If set to 1, will add two extra fields to the metadata found in input, making them
+also available for other filters (see @var{drawtext} filter for examples). Default
+value is 0. The extra fields are described below:
+@table @option
+@item lavf.image2dec.source_path
+Corresponds to the full path to the input file being read.
+@item lavf.image2dec.source_basename
+Corresponds to the name of the file being read.
+@end table
+
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Use @command{ffmpeg} for creating a video from the images in the file
+sequence @file{img-001.jpeg}, @file{img-002.jpeg}, ..., assuming an
+input frame rate of 10 frames per second:
+@example
+ffmpeg -framerate 10 -i 'img-%03d.jpeg' out.mkv
+@end example
+
+@item
+As above, but start by reading from a file with index 100 in the sequence:
+@example
+ffmpeg -framerate 10 -start_number 100 -i 'img-%03d.jpeg' out.mkv
+@end example
+
+@item
+Read images matching the "*.png" glob pattern , that is all the files
+terminating with the ".png" suffix:
+@example
+ffmpeg -framerate 10 -pattern_type glob -i "*.png" out.mkv
+@end example
+@end itemize
+
+@section libgme
+
+The Game Music Emu library is a collection of video game music file emulators.
+
+See @url{https://bitbucket.org/mpyne/game-music-emu/overview} for more information.
+
+It accepts the following options:
+
+@table @option
+
+@item track_index
+Set the index of which track to demux. The demuxer can only export one track.
+Track indexes start at 0. Default is to pick the first track. Number of tracks
+is exported as @var{tracks} metadata entry.
+
+@item sample_rate
+Set the sampling rate of the exported track. Range is 1000 to 999999. Default is 44100.
+
+@item max_size @emph{(bytes)}
+The demuxer buffers the entire file into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of files that can be read.
+Default is 50 MiB.
+
+@end table
+
+@section libmodplug
+
+ModPlug based module demuxer
+
+See @url{https://github.com/Konstanty/libmodplug}
+
+It will export one 2-channel 16-bit 44.1 kHz audio stream.
+Optionally, a @code{pal8} 16-color video stream can be exported with or without printed metadata.
+
+It accepts the following options:
+
+@table @option
+@item noise_reduction
+Apply a simple low-pass filter. Can be 1 (on) or 0 (off). Default is 0.
+
+@item reverb_depth
+Set amount of reverb. Range 0-100. Default is 0.
+
+@item reverb_delay
+Set delay in ms, clamped to 40-250 ms. Default is 0.
+
+@item bass_amount
+Apply bass expansion a.k.a. XBass or megabass. Range is 0 (quiet) to 100 (loud). Default is 0.
+
+@item bass_range
+Set cutoff i.e. upper-bound for bass frequencies. Range is 10-100 Hz. Default is 0.
+
+@item surround_depth
+Apply a Dolby Pro-Logic surround effect. Range is 0 (quiet) to 100 (heavy). Default is 0.
+
+@item surround_delay
+Set surround delay in ms, clamped to 5-40 ms. Default is 0.
+
+@item max_size
+The demuxer buffers the entire file into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of files that can be read. Range is 0 to 100 MiB.
+0 removes buffer size limit (not recommended). Default is 5 MiB.
+
+@item video_stream_expr
+String which is evaluated using the eval API to assign colors to the generated video stream.
+Variables which can be used are @code{x}, @code{y}, @code{w}, @code{h}, @code{t}, @code{speed},
+@code{tempo}, @code{order}, @code{pattern} and @code{row}.
+
+@item video_stream
+Generate video stream. Can be 1 (on) or 0 (off). Default is 0.
+
+@item video_stream_w
+Set video frame width in 'chars' where one char indicates 8 pixels. Range is 20-512. Default is 30.
+
+@item video_stream_h
+Set video frame height in 'chars' where one char indicates 8 pixels. Range is 20-512. Default is 30.
+
+@item video_stream_ptxt
+Print metadata on video stream. Includes @code{speed}, @code{tempo}, @code{order}, @code{pattern},
+@code{row} and @code{ts} (time in ms). Can be 1 (on) or 0 (off). Default is 1.
+
+@end table
+
+@section libopenmpt
+
+libopenmpt based module demuxer
+
+See @url{https://lib.openmpt.org/libopenmpt/} for more information.
+
+Some files have multiple subsongs (tracks) this can be set with the @option{subsong}
+option.
+
+It accepts the following options:
+
+@table @option
+@item subsong
+Set the subsong index. This can be either 'all', 'auto', or the index of the
+subsong. Subsong indexes start at 0. The default is 'auto'.
+
+The default value is to let libopenmpt choose.
+
+@item layout
+Set the channel layout. Valid values are 1, 2, and 4 channel layouts.
+The default value is STEREO.
+
+@item sample_rate
+Set the sample rate for libopenmpt to output.
+Range is from 1000 to INT_MAX. The value default is 48000.
+@end table
+
+@section mov/mp4/3gp
+
+Demuxer for Quicktime File Format & ISO/IEC Base Media File Format (ISO/IEC 14496-12 or MPEG-4 Part 12, ISO/IEC 15444-12 or JPEG 2000 Part 12).
+
+Registered extensions: mov, mp4, m4a, 3gp, 3g2, mj2, psp, m4b, ism, ismv, isma, f4v
+
+@subsection Options
+
+This demuxer accepts the following options:
+@table @option
+@item enable_drefs
+Enable loading of external tracks, disabled by default.
+Enabling this can theoretically leak information in some use cases.
+
+@item use_absolute_path
+Allows loading of external tracks via absolute paths, disabled by default.
+Enabling this poses a security risk. It should only be enabled if the source
+is known to be non-malicious.
+
+@item seek_streams_individually
+When seeking, identify the closest point in each stream individually and demux packets in
+that stream from identified point. This can lead to a different sequence of packets compared
+to demuxing linearly from the beginning. Default is true.
+
+@item ignore_editlist
+Ignore any edit list atoms. The demuxer, by default, modifies the stream index to reflect the
+timeline described by the edit list. Default is false.
+
+@item advanced_editlist
+Modify the stream index to reflect the timeline described by the edit list. @code{ignore_editlist}
+must be set to false for this option to be effective.
+If both @code{ignore_editlist} and this option are set to false, then only the
+start of the stream index is modified to reflect initial dwell time or starting timestamp
+described by the edit list. Default is true.
+
+@item ignore_chapters
+Don't parse chapters. This includes GoPro 'HiLight' tags/moments. Note that chapters are
+only parsed when input is seekable. Default is false.
+
+@item use_mfra_for
+For seekable fragmented input, set fragment's starting timestamp from media fragment random access box, if present.
+
+Following options are available:
+@table @samp
+@item auto
+Auto-detect whether to set mfra timestamps as PTS or DTS @emph{(default)}
+
+@item dts
+Set mfra timestamps as DTS
+
+@item pts
+Set mfra timestamps as PTS
+
+@item 0
+Don't use mfra box to set timestamps
+@end table
+
+@item export_all
+Export unrecognized boxes within the @var{udta} box as metadata entries. The first four
+characters of the box type are set as the key. Default is false.
+
+@item export_xmp
+Export entire contents of @var{XMP_} box and @var{uuid} box as a string with key @code{xmp}. Note that
+if @code{export_all} is set and this option isn't, the contents of @var{XMP_} box are still exported
+but with key @code{XMP_}. Default is false.
+
+@item activation_bytes
+4-byte key required to decrypt Audible AAX and AAX+ files. See Audible AAX subsection below.
+
+@item audible_fixed_key
+Fixed key used for handling Audible AAX/AAX+ files. It has been pre-set so should not be necessary to
+specify.
+
+@item decryption_key
+16-byte key, in hex, to decrypt files encrypted using ISO Common Encryption (CENC/AES-128 CTR; ISO/IEC 23001-7).
+@end table
+
+@subsection Audible AAX
+
+Audible AAX files are encrypted M4B files, and they can be decrypted by specifying a 4 byte activation secret.
+@example
+ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4
+@end example
+
+@section mpegts
+
+MPEG-2 transport stream demuxer.
+
+This demuxer accepts the following options:
+@table @option
+@item resync_size
+Set size limit for looking up a new synchronization. Default value is
+65536.
+
+@item skip_unknown_pmt
+Skip PMTs for programs not defined in the PAT. Default value is 0.
+
+@item fix_teletext_pts
+Override teletext packet PTS and DTS values with the timestamps calculated
+from the PCR of the first program which the teletext stream is part of and is
+not discarded. Default value is 1, set this option to 0 if you want your
+teletext packet PTS and DTS values untouched.
+
+@item ts_packetsize
+Output option carrying the raw packet size in bytes.
+Show the detected raw packet size, cannot be set by the user.
+
+@item scan_all_pmts
+Scan and combine all PMTs. The value is an integer with value from -1
+to 1 (-1 means automatic setting, 1 means enabled, 0 means
+disabled). Default value is -1.
+
+@item merge_pmt_versions
+Re-use existing streams when a PMT's version is updated and elementary
+streams move to different PIDs. Default value is 0.
+@end table
+
+@section mpjpeg
+
+MJPEG encapsulated in multi-part MIME demuxer.
+
+This demuxer allows reading of MJPEG, where each frame is represented as a part of
+multipart/x-mixed-replace stream.
+@table @option
+
+@item strict_mime_boundary
+Default implementation applies a relaxed standard to multi-part MIME boundary detection,
+to prevent regression with numerous existing endpoints not generating a proper MIME
+MJPEG stream. Turning this option on by setting it to 1 will result in a stricter check
+of the boundary value.
+@end table
+
+@section rawvideo
+
+Raw video demuxer.
+
+This demuxer allows one to read raw video data. Since there is no header
+specifying the assumed video parameters, the user must specify them
+in order to be able to decode the data correctly.
+
+This demuxer accepts the following options:
+@table @option
+
+@item framerate
+Set input video frame rate. Default value is 25.
+
+@item pixel_format
+Set the input video pixel format. Default value is @code{yuv420p}.
+
+@item video_size
+Set the input video size. This value must be specified explicitly.
+@end table
+
+For example to read a rawvideo file @file{input.raw} with
+@command{ffplay}, assuming a pixel format of @code{rgb24}, a video
+size of @code{320x240}, and a frame rate of 10 images per second, use
+the command:
+@example
+ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 input.raw
+@end example
+
+@section sbg
+
+SBaGen script demuxer.
+
+This demuxer reads the script language used by SBaGen
+@url{http://uazu.net/sbagen/} to generate binaural beats sessions. A SBG
+script looks like that:
+@example
+-SE
+a: 300-2.5/3 440+4.5/0
+b: 300-2.5/0 440+4.5/3
+off: -
+NOW == a
++0:07:00 == b
++0:14:00 == a
++0:21:00 == b
++0:30:00 off
+@end example
+
+A SBG script can mix absolute and relative timestamps. If the script uses
+either only absolute timestamps (including the script start time) or only
+relative ones, then its layout is fixed, and the conversion is
+straightforward. On the other hand, if the script mixes both kind of
+timestamps, then the @var{NOW} reference for relative timestamps will be
+taken from the current time of day at the time the script is read, and the
+script layout will be frozen according to that reference. That means that if
+the script is directly played, the actual times will match the absolute
+timestamps up to the sound controller's clock accuracy, but if the user
+somehow pauses the playback or seeks, all times will be shifted accordingly.
+
+@section tedcaptions
+
+JSON captions used for @url{http://www.ted.com/, TED Talks}.
+
+TED does not provide links to the captions, but they can be guessed from the
+page. The file @file{tools/bookmarklets.html} from the FFmpeg source tree
+contains a bookmarklet to expose them.
+
+This demuxer accepts the following option:
+@table @option
+@item start_time
+Set the start time of the TED talk, in milliseconds. The default is 15000
+(15s). It is used to sync the captions with the downloadable videos, because
+they include a 15s intro.
+@end table
+
+Example: convert the captions to a format most players understand:
+@example
+ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt
+@end example
+
+@section vapoursynth
+
+Vapoursynth wrapper.
+
+Due to security concerns, Vapoursynth scripts will not
+be autodetected so the input format has to be forced. For ff* CLI tools,
+add @code{-f vapoursynth} before the input @code{-i yourscript.vpy}.
+
+This demuxer accepts the following option:
+@table @option
+@item max_script_size
+The demuxer buffers the entire script into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of scripts that can be read.
+Default is 1 MiB.
+@end table
+
+@c man end DEMUXERS
diff --git a/extern/ffmpeg/doc/dev_community/community.md b/extern/ffmpeg/doc/dev_community/community.md
new file mode 100644
index 0000000000..21e08e20e3
--- /dev/null
+++ b/extern/ffmpeg/doc/dev_community/community.md
@@ -0,0 +1,79 @@
+# FFmpeg project
+
+## Organisation
+
+The FFmpeg project is organized through a community working on global consensus.
+
+Decisions are taken by the ensemble of active members, through voting and
+are aided by two committees.
+
+## General Assembly
+
+The ensemble of active members is called the General Assembly (GA).
+
+The General Assembly is sovereign and legitimate for all its decisions
+regarding the FFmpeg project.
+
+The General Assembly is made up of active contributors.
+
+Contributors are considered "active contributors" if they have pushed more
+than 20 patches in the last 36 months in the main FFmpeg repository, or
+if they have been voted in by the GA.
+
+Additional members are added to the General Assembly through a vote after
+proposal by a member of the General Assembly.
+They are part of the GA for two years, after which they need a confirmation by
+the GA.
+
+## Voting
+
+Voting is done using a ranked voting system, currently running on https://vote.ffmpeg.org/ .
+
+Majority vote means more than 50% of the expressed ballots.
+
+## Technical Committee
+
+The Technical Committee (TC) is here to arbitrate and make decisions when
+technical conflicts occur in the project.
+They will consider the merits of all the positions, judge them and make a
+decision.
+
+The TC resolves technical conflicts but is not a technical steering committee.
+
+Decisions by the TC are binding for all the contributors.
+
+Decisions made by the TC can be re-opened after 1 year or by a majority vote
+of the General Assembly, requested by one of the member of the GA.
+
+The TC is elected by the General Assembly for a duration of 1 year, and
+is composed of 5 members.
+Members can be re-elected if they wish. A majority vote in the General Assembly
+can trigger a new election of the TC.
+
+The members of the TC can be elected from outside of the GA.
+Candidates for election can either be suggested or self-nominated.
+
+The conflict resolution process is detailed in the [resolution process](resolution_process.md) document.
+
+## Community committee
+
+The Community Committee (CC) is here to arbitrage and make decisions when
+inter-personal conflicts occur in the project. It will decide quickly and
+take actions, for the sake of the project.
+
+The CC can remove privileges of offending members, including removal of
+commit access and temporary ban from the community.
+
+Decisions made by the CC can be re-opened after 1 year or by a majority vote
+of the General Assembly. Indefinite bans from the community must be confirmed
+by the General Assembly, in a majority vote.
+
+The CC is elected by the General Assembly for a duration of 1 year, and is
+composed of 5 members.
+Members can be re-elected if they wish. A majority vote in the General Assembly
+can trigger a new election of the CC.
+
+The members of the CC can be elected from outside of the GA.
+Candidates for election can either be suggested or self-nominated.
+
+The CC is governed by and responsible for enforcing the Code of Conduct.
diff --git a/extern/ffmpeg/doc/dev_community/resolution_process.md b/extern/ffmpeg/doc/dev_community/resolution_process.md
new file mode 100644
index 0000000000..4ed0b63c43
--- /dev/null
+++ b/extern/ffmpeg/doc/dev_community/resolution_process.md
@@ -0,0 +1,91 @@
+# Technical Committee
+
+_This document only makes sense with the rules from [the community document](community)_.
+
+The Technical Committee (**TC**) is here to arbitrate and make decisions when
+technical conflicts occur in the project.
+
+The TC main role is to resolve technical conflicts.
+It is therefore not a technical steering committee, but it is understood that
+some decisions might impact the future of the project.
+
+# Process
+
+## Seizing
+
+The TC can take possession of any technical matter that it sees fit.
+
+To involve the TC in a matter, email tc@ or CC them on an ongoing discussion.
+
+As members of TC are developers, they also can email tc@ to raise an issue.
+
+## Announcement
+
+The TC, once seized, must announce itself on the main mailing list, with a _[TC]_ tag.
+
+The TC has 2 modes of operation: a RFC one and an internal one.
+
+If the TC thinks it needs the input from the larger community, the TC can call
+for a RFC. Else, it can decide by itself.
+
+If the disagreement involves a member of the TC, that member should recuse
+themselves from the decision.
+
+The decision to use a RFC process or an internal discussion is a discretionary
+decision of the TC.
+
+The TC can also reject a seizure for a few reasons such as:
+the matter was not discussed enough previously; it lacks expertise to reach a
+beneficial decision on the matter; or the matter is too trivial.
+
+### RFC call
+
+In the RFC mode, one person from the TC posts on the mailing list the
+technical question and will request input from the community.
+
+The mail will have the following specification:
+* a precise title
+* a specific tag [TC RFC]
+* a top-level email
+* contain a precise question that does not exceed 100 words and that is answerable by developers
+* may have an extra description, or a link to a previous discussion, if deemed necessary,
+* contain a precise end date for the answers.
+
+The answers from the community must be on the main mailing list and must have
+the following specification:
+* keep the tag and the title unchanged
+* limited to 400 words
+* a first-level, answering directly to the main email
+* answering to the question.
+
+Further replies to answers are permitted, as long as they conform to the
+community standards of politeness, they are limited to 100 words, and are not
+nested more than once. (max-depth=2)
+
+After the end-date, mails on the thread will be ignored.
+
+Violations of those rules will be escalated through the Community Committee.
+
+After all the emails are in, the TC has 96 hours to give its final decision.
+Exceptionally, the TC can request an extra delay, that will be notified on the
+mailing list.
+
+### Within TC
+
+In the internal case, the TC has 96 hours to give its final decision.
+Exceptionally, the TC can request an extra delay.
+
+
+## Decisions
+
+The decisions from the TC will be sent on the mailing list, with the _[TC]_ tag.
+
+Internally, the TC should take decisions with a majority, or using
+ranked-choice voting.
+
+The decision from the TC should be published with a summary of the reasons that
+lead to this decision.
+
+The decisions from the TC are final, until the matters are reopened after
+no less than one year.
+
diff --git a/extern/ffmpeg/doc/developer.html b/extern/ffmpeg/doc/developer.html
index 2bf37991b3..416116c877 100644
--- a/extern/ffmpeg/doc/developer.html
+++ b/extern/ffmpeg/doc/developer.html
@@ -1,84 +1,55 @@
-
+
-
-
+
+
+Developer Documentation
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
Developer Documentation
+
-
Developer Documentation
-
-
-
Table of Contents
-
-
-
-
+
-
+
1 Notes for external developers# TOC
This document is mostly useful for internal FFmpeg developers.
External developers who need to use the API in their application should
refer to the API doxygen documentation in the public headers, and
-check the examples in ‘doc/examples ’ and in the source code to
+check the examples in doc/examples and in the source code to
see how the public API is employed.
You can use the FFmpeg libraries in your commercial program, but you
@@ -88,19 +59,17 @@
There are 3 ways by which code gets into ffmpeg.
+
There are 2 ways by which code gets into FFmpeg:
- Submitting Patches to the main developer mailing list
- see Submitting patches for details.
+ Submitting patches to the ffmpeg-devel mailing list.
+ See Submitting patches for details.
Directly committing changes to the main tree.
- Committing changes to a git clone, for example on github.com or
- gitorious.org. And asking us to merge these changes.
Whichever way, changes should be reviewed by the maintainer of the code
@@ -108,27 +77,25 @@
1.2 Contributing
The developer making the commit and the author are responsible for their changes
and should try to fix issues their commit causes.
-
-
-1.3 Coding Rules
+
+3 Coding Rules# TOC
-1.3.1 Code formatting conventions
+3.1 Code formatting conventions# TOC
There are the following guidelines regarding the indentation in files:
-
-Indent size is 4.
+ Indent size is 4.
-
-The TAB character is forbidden outside of Makefiles as is any
+ The TAB character is forbidden outside of Makefiles as is any
form of trailing whitespace. Commits containing either will be
rejected by the git repository.
-
-You should try to limit your code lines to 80 characters; however, do so if
+ You should try to limit your code lines to 80 characters; however, do so if
and only if this improves readability.
+
+ K&R coding style is used.
The presentation is one inspired by ’indent -i4 -kr -nut’.
@@ -136,7 +103,7 @@
minimize the bug count.
-1.3.2 Comments
+3.2 Comments# TOC
Use the JavaDoc/Doxygen format (see examples below) so that code documentation
can be generated automatically. All nontrivial functions should have a comment
above them explaining what the function does, even if it is just one sentence.
@@ -146,7 +113,8 @@
1.3.2 Comments <
//! with /// and similar. Also @ syntax should be employed
for markup commands, i.e. use @param and not \param.
- /**
+
+
/**
* @file
* MPEG codec.
* @author ...
@@ -157,7 +125,7 @@ 1.3.2 Comments <
* more text ...
* ...
*/
-typedef struct Foobar{
+typedef struct Foobar {
int var1; /**< var1 description */
int var2; ///< var2 description
/** var3 description */
@@ -173,26 +141,30 @@ 1.3.2 Comments <
*/
int myfunc(int my_parameter)
...
-
+
-
1.3.3 C language features
+
3.3 C language features# TOC
FFmpeg is programmed in the ISO C90 language with a few additional
features from ISO C99, namely:
-
-the ‘inline ’ keyword;
+ the ‘inline ’ keyword;
+
+ ‘// ’ comments;
+
+ designated struct initializers (‘struct s x = { .i = 17 }; ’);
-
-‘// ’ comments;
+ compound literals (‘x = (struct s) { 17, 23 }; ’).
-
-designated struct initializers (‘struct s x = { .i = 17 }; ’)
+ for loops with variable definition (‘for (int i = 0; i < 8; i++) ’);
-
-compound literals (‘x = (struct s) { 17, 23 }; ’)
+ Variadic macros (‘#define ARRAY(nb, ...) (int[nb + 1]){ nb, __VA_ARGS__ } ’);
+
+ Implementation defined behavior for signed integers is assumed to match the
+expected behavior for two’s complement. Non representable values in integer
+casts are binary truncated. Shift right of signed values uses sign extension.
These features are supported by all compilers we care about, so we will not
@@ -204,48 +176,39 @@
1.3.3 C
additional C99 features or GCC extensions. Especially watch out for:
-
-mixing statements and declarations;
+ mixing statements and declarations;
-
-‘long long ’ (use ‘int64_t ’ instead);
+ ‘long long ’ (use ‘int64_t ’ instead);
-
-‘__attribute__ ’ not protected by ‘#ifdef __GNUC__ ’ or similar;
+ ‘__attribute__ ’ not protected by ‘#ifdef __GNUC__ ’ or similar;
-
-GCC statement expressions (‘(x = ({ int y = 4; y; }) ’).
+ GCC statement expressions (‘(x = ({ int y = 4; y; }) ’).
-1.3.4 Naming conventions
+3.4 Naming conventions# TOC
All names should be composed with underscores (_), not CamelCase. For example,
‘avfilter_get_video_buffer ’ is an acceptable function name and
‘AVFilterGetVideo ’ is not. The exception from this are type names, like
-for example structs and enums; they should always be in the CamelCase
+for example structs and enums; they should always be in CamelCase.
There are the following conventions for naming variables and functions:
-For Emacs, add these roughly equivalent lines to your ‘.emacs.d/init.el ’:
-
(c-add-style "ffmpeg"
+For Emacs, add these roughly equivalent lines to your .emacs.d/init.el :
+
+
-1.4 Development Policy
+4 Development Policy# TOC
-
-
-Contributions should be licensed under the
+
+4.1 Patches/Committing# TOC
+
+Contributions should be licensed under the
LGPL 2.1 ,
including an "or any later version" clause, or, if you prefer
a gift-style license, the
-ISC or
+ISC or
MIT license.
GPL 2 including
an "or any later version" clause is also acceptable, but LGPL is
preferred.
If you add a new file, give it a proper license header. Do not copy and
paste it from a random place, use an existing file as template.
-
-
-You must not commit code which breaks FFmpeg! (Meaning unfinished but
-enabled code which breaks compilation or compiles but does not work or
-breaks the regression tests)
-You can commit unfinished stuff (for testing etc), but it must be disabled
-(#ifdef etc) by default so it does not interfere with other developers’
-work.
-
-
-The commit message should have a short first line in the form of
+
+
+This means unfinished code which is enabled and breaks compilation,
+or compiles but does not work/breaks the regression tests. Code which
+is unfinished but disabled may be permitted under-circumstances, like
+missing samples or an implementation with a small subset of features.
+Always check the mailing list for any reviewers with issues and test
+FATE before you push.
+
+
+The commit message should have a short first line in the form of
a ‘topic: short description ’ as a header, separated by a newline
from the body consisting of an explanation of why the change is necessary.
If the commit fixes a known bug on the bug tracker, the commit message
should include its bug ID. Referring to the issue on the bug tracker does
not exempt you from writing an excerpt of the bug in the commit message.
-
-
-You do not have to over-test things. If it works for you, and you think it
-should work for others, then commit. If your code has problems
-(portability, triggers compiler bugs, unusual environment etc) they will be
-reported and eventually fixed.
-
-
-Do not commit unrelated changes together, split them into self-contained
-pieces. Also do not forget that if part B depends on part A, but A does not
-depend on B, then A can and should be committed first and separate from B.
-Keeping changes well split into self-contained parts makes reviewing and
-understanding them on the commit log mailing list easier. This also helps
-in case of debugging later on.
+
+
+If it works for you, others, and passes FATE then it should be OK to commit
+it, provided it fits the other committing criteria. You should not worry about
+over-testing things. If your code has problems (portability, triggers
+compiler bugs, unusual environment etc) they will be reported and eventually
+fixed.
+
+
+They should be split them into self-contained pieces. Also do not forget
+that if part B depends on part A, but A does not depend on B, then A can
+and should be committed first and separate from B. Keeping changes well
+split into self-contained parts makes reviewing and understanding them on
+the commit log mailing list easier. This also helps in case of debugging
+later on.
Also if you have doubts about splitting or not splitting, do not hesitate to
ask/discuss it on the developer mailing list.
-
-
-Do not change behavior of the programs (renaming options etc) or public
-API or ABI without first discussing it on the ffmpeg-devel mailing list.
-Do not remove functionality from the code. Just improve!
-
-Note: Redundant code can be removed.
-
-Do not commit changes to the build system (Makefiles, configure script)
+
+Do not commit changes to the build system (Makefiles, configure script)
which change behavior, defaults etc, without asking first. The same
applies to compiler warning fixes, trivial looking fixes and to code
maintained by other developers. We usually have a reason for doing things
the way we do. Send your changes as patches to the ffmpeg-devel mailing
list, and if the code maintainers say OK, you may commit. This does not
apply to files you wrote and/or maintain.
-
-
-We refuse source indentation and other cosmetic changes if they are mixed
+
+
+We refuse source indentation and other cosmetic changes if they are mixed
with functional changes, such commits will be rejected and removed. Every
developer has his own indentation style, you should not change it. Of course
if you (re)write something, you can use your own style, even though we would
@@ -381,61 +339,49 @@
1.4 Developm
force a given indentation style - we do not.). If you really need to make
indentation changes (try to avoid this), separate them strictly from real
changes.
-
+
NOTE: If you had to put if(){ .. } over a large (> 5 lines) chunk of code,
then either do NOT change the indentation of the inner part within (do not
move it to the right)! or do so in a separate commit
-
-Always fill out the commit log message. Describe in a few lines what you
+
+Always fill out the commit log message. Describe in a few lines what you
changed and why. You can refer to mailing list postings if you fix a
particular bug. Comments such as "fixed!" or "Changed it." are unacceptable.
Recommended format:
-area changed: Short 1 line description
-
-
details describing what and why and giving references.
-
-Make sure the author of the commit is set correctly. (see git commit –author)
+
+
area changed: Short 1 line description
+
+details describing what and why and giving references.
+
+
+
+Make sure the author of the commit is set correctly. (see git commit –author)
If you apply a patch, send an
answer to ffmpeg-devel (or wherever you got the patch from) saying that
you applied the patch.
-
-
-When applying patches that have been discussed (at length) on the mailing
+
+
+When applying patches that have been discussed (at length) on the mailing
list, reference the thread in the log message.
-
-
-Do NOT commit to code actively maintained by others without permission.
-Send a patch to ffmpeg-devel instead. If no one answers within a reasonable
-timeframe (12h for build failures and security fixes, 3 days small changes,
+
+
+Do NOT commit to code actively maintained by others without permission.
+Send a patch to ffmpeg-devel. If no one answers within a reasonable
+time-frame (12h for build failures and security fixes, 3 days small changes,
1 week for big patches) then commit your patch if you think it is OK.
Also note, the maintainer can simply ask for more time to review!
-
-
-Subscribe to the ffmpeg-cvslog mailing list. The diffs of all commits
-are sent there and reviewed by all the other developers. Bugs and possible
-improvements or general questions regarding commits are discussed there. We
-expect you to react if problems with your code are uncovered.
-
-
-Update the documentation if you change behavior or add features. If you are
-unsure how best to do this, send a patch to ffmpeg-devel, the documentation
-maintainer(s) will review and commit your stuff.
-
-
-Try to keep important discussions and requests (also) on the public
-developer mailing list, so that all developers can benefit from them.
-
-
-Never write to unallocated memory, never write over the end of arrays,
-always check values read from some untrusted source before using them
-as array index or other risky things.
-
-
-Remember to check if you need to bump versions for the specific libav*
-parts (libavutil, libavcodec, libavformat) you are changing. You need
-to change the version integer.
+
+
+4.2 Code# TOC
+
+Do not change behavior of the programs (renaming options etc) or public
+API or ABI without first discussing it on the ffmpeg-devel mailing list.
+Do not remove widely used functionality or features (redundant code can be removed).
+
+
+Depending on the change, you may need to change the version integer.
Incrementing the first component means no backward compatibility to
previous versions (e.g. removal of a function from the public API).
Incrementing the second component means backward compatible change
@@ -444,35 +390,102 @@
1.4 Developm
Incrementing the third component means a noteworthy binary compatible
change (e.g. encoder bug fix that matters for the decoder). The third
component always starts at 100 to distinguish FFmpeg from Libav.
-
-
-Compiler warnings indicate potential bugs or code with bad style. If a type of
+
+
+Compiler warnings indicate potential bugs or code with bad style. If a type of
warning always points to correct and clean code, that warning should
be disabled, not the code changed.
Thus the remaining warnings can either be bugs or correct code.
If it is a bug, the bug has to be fixed. If it is not, the code should
be changed to not generate a warning unless that causes a slowdown
or obfuscates the code.
-
-
-Make sure that no parts of the codebase that you maintain are missing from the
-‘MAINTAINERS ’ file. If something that you want to maintain is missing add it with
+
+
+Never write to unallocated memory, never write over the end of arrays,
+always check values read from some untrusted source before using them
+as array index or other risky things.
+
+
+4.3 Documentation/Other# TOC
+
+It is important to be subscribed to the
+ffmpeg-devel
+mailing list. Almost any non-trivial patch is to be sent there for review.
+Other developers may have comments about your contribution. We expect you see
+those comments, and to improve it if requested. (N.B. Experienced committers
+have other channels, and may sometimes skip review for trivial fixes.) Also,
+discussion here about bug fixes and FFmpeg improvements by other developers may
+be helpful information for you. Finally, by being a list subscriber, your
+contribution will be posted immediately to the list, without the moderation
+hold which messages from non-subscribers experience.
+
+However, it is more important to the project that we receive your patch than
+that you be subscribed to the ffmpeg-devel list. If you have a patch, and don’t
+want to subscribe and discuss the patch, then please do send it to the list
+anyway.
+
+
+Diffs of all commits are sent to the
+ffmpeg-cvslog
+mailing list. Some developers read this list to review all code base changes
+from all sources. Subscribing to this list is not mandatory.
+
+
+Update the documentation if you change behavior or add features. If you are
+unsure how best to do this, send a patch to ffmpeg-devel, the documentation
+maintainer(s) will review and commit your stuff.
+
+
+Try to keep important discussions and requests (also) on the public
+developer mailing list, so that all developers can benefit from them.
+
+
+Make sure that no parts of the codebase that you maintain are missing from the
+MAINTAINERS file. If something that you want to maintain is missing add it with
your name after it.
-If at some point you no longer want to maintain some code, then please help
-finding a new maintainer and also don’t forget updating the ‘MAINTAINERS ’ file.
-
-
+If at some point you no longer want to maintain some code, then please help in
+finding a new maintainer and also don’t forget to update the MAINTAINERS file.
+
We think our rules are not too hard. If you have comments, contact us.
-
-
-1.5 Submitting patches
+
+5 Code of conduct# TOC
+
+Be friendly and respectful towards others and third parties.
+Treat others the way you yourself want to be treated.
+
+Be considerate. Not everyone shares the same viewpoint and priorities as you do.
+Different opinions and interpretations help the project.
+Looking at issues from a different perspective assists development.
+
+Do not assume malice for things that can be attributed to incompetence. Even if
+it is malice, it’s rarely good to start with that as initial assumption.
+
+Stay friendly even if someone acts contrarily. Everyone has a bad day
+once in a while.
+If you yourself have a bad day or are angry then try to take a break and reply
+once you are calm and without anger if you have to.
+
+Try to help other team members and cooperate if you can.
+
+The goal of software development is to create technical excellence, not for any
+individual to be better and "win" against the others. Large software projects
+are only possible and successful through teamwork.
+
+If someone struggles do not put them down. Give them a helping hand
+instead and point them in the right direction.
+
+Finally, keep in mind the immortal words of Bill and Ted,
+"Be excellent to each other."
+
+
+6 Submitting patches# TOC
First, read the Coding Rules above if you did not yet, in particular
the rules regarding patch submission.
When you submit your patch, please use git format-patch or
-git send-email. We cannot read other diffs :-)
+git send-email. We cannot read other diffs :-).
Also please do not submit a patch which contains several unrelated changes.
Split it into separate, self-contained pieces. This does not mean splitting
@@ -495,11 +508,15 @@
1.5 Submit
do not attach several unrelated patches to the same mail.
Patches should be posted to the
-ffmpeg-devel
+ffmpeg-devel
mailing list. Use git send-email when possible since it will properly
send patches without requiring extra care. If you cannot, then send patches
as base64-encoded attachments, so your patch is not trashed during
-transmission.
+transmission. Also ensure the correct mime type is used
+(text/x-diff or text/x-patch or at least text/plain) and that only one
+patch is inline or attached per mail.
+You can check https://patchwork.ffmpeg.org , if your patch does not show up, its mime type
+likely was wrong.
Your patch will be reviewed on the mailing list. You will likely be asked
to make some changes and are expected to send in an improved version that
@@ -512,170 +529,133 @@
1.5 Submit
-1.6 New codecs or formats checklist
+7 New codecs or formats checklist# TOC
-
-Did you use av_cold for codec initialization and close functions?
+ Did you use av_cold for codec initialization and close functions?
-
-Did you add a long_name under NULL_IF_CONFIG_SMALL to the AVCodec or
+ Did you add a long_name under NULL_IF_CONFIG_SMALL to the AVCodec or
AVInputFormat/AVOutputFormat struct?
-
-Did you bump the minor version number (and reset the micro version
-number) in ‘libavcodec/version.h ’ or ‘libavformat/version.h ’?
+ Did you bump the minor version number (and reset the micro version
+number) in libavcodec/version.h or libavformat/version.h ?
-
-Did you register it in ‘allcodecs.c ’ or ‘allformats.c ’?
+ Did you register it in allcodecs.c or allformats.c ?
-
-Did you add the AVCodecID to ‘avcodec.h ’?
+ Did you add the AVCodecID to avcodec.h ?
When adding new codec IDs, also add an entry to the codec descriptor
-list in ‘libavcodec/codec_desc.c ’.
+list in libavcodec/codec_desc.c .
-
-If it has a FourCC, did you add it to ‘libavformat/riff.c ’,
+ If it has a FourCC, did you add it to libavformat/riff.c ,
even if it is only a decoder?
-
-Did you add a rule to compile the appropriate files in the Makefile?
+ Did you add a rule to compile the appropriate files in the Makefile?
Remember to do this even if you’re just adding a format to a file that is
already being compiled by some other rule, like a raw demuxer.
-
-Did you add an entry to the table of supported formats or codecs in
-‘doc/general.texi ’?
+ Did you add an entry to the table of supported formats or codecs in
+doc/general.texi ?
-
-Did you add an entry in the Changelog?
+ Did you add an entry in the Changelog?
-
-If it depends on a parser or a library, did you add that dependency in
+ If it depends on a parser or a library, did you add that dependency in
configure?
-
-Did you git add the appropriate files before committing?
+ Did you git add the appropriate files before committing?
-
-Did you make sure it compiles standalone, i.e. with
+ Did you make sure it compiles standalone, i.e. with
configure --disable-everything --enable-decoder=foo
(or --enable-demuxer or whatever your component is)?
-
-1.7 patch submission checklist
+
+8 Patch submission checklist# TOC
-
-Does make fate pass with the patch applied?
+ Does make fate pass with the patch applied?
-
-Was the patch generated with git format-patch or send-email?
+ Was the patch generated with git format-patch or send-email?
-
-Did you sign off your patch? (git commit -s)
-See http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/SubmittingPatches for the meaning
-of sign off.
+ Did you sign-off your patch? (git commit -s)
+See Sign your work for the meaning
+of sign-off .
-
-Did you provide a clear git commit log message?
+ Did you provide a clear git commit log message?
-
-Is the patch against latest FFmpeg git master branch?
+ Is the patch against latest FFmpeg git master branch?
-
-Are you subscribed to ffmpeg-devel?
+ Are you subscribed to ffmpeg-devel?
(the list is subscribers only due to spam)
-
-Have you checked that the changes are minimal, so that the same cannot be
+ Have you checked that the changes are minimal, so that the same cannot be
achieved with a smaller patch and/or simpler final code?
-
-If the change is to speed critical code, did you benchmark it?
+ If the change is to speed critical code, did you benchmark it?
-
-If you did any benchmarks, did you provide them in the mail?
+ If you did any benchmarks, did you provide them in the mail?
-
-Have you checked that the patch does not introduce buffer overflows or
+ Have you checked that the patch does not introduce buffer overflows or
other security issues?
-
-Did you test your decoder or demuxer against damaged data? If no, see
+ Did you test your decoder or demuxer against damaged data? If no, see
tools/trasher, the noise bitstream filter, and
zzuf . Your decoder or demuxer
should not crash, end in a (near) infinite loop, or allocate ridiculous
amounts of memory when fed damaged data.
-
-Does the patch not mix functional and cosmetic changes?
+ Did you test your decoder or demuxer against sample files?
+Samples may be obtained at https://samples.ffmpeg.org .
-
-Did you add tabs or trailing whitespace to the code? Both are forbidden.
+ Does the patch not mix functional and cosmetic changes?
-
-Is the patch attached to the email you send?
+ Did you add tabs or trailing whitespace to the code? Both are forbidden.
-
-Is the mime type of the patch correct? It should be text/x-diff or
+ Is the patch attached to the email you send?
+
+ Is the mime type of the patch correct? It should be text/x-diff or
text/x-patch or at least text/plain and not application/octet-stream.
-
-If the patch fixes a bug, did you provide a verbose analysis of the bug?
+ If the patch fixes a bug, did you provide a verbose analysis of the bug?
-
-If the patch fixes a bug, did you provide enough information, including
+ If the patch fixes a bug, did you provide enough information, including
a sample, so the bug can be reproduced and the fix can be verified?
Note please do not attach samples >100k to mails but rather provide a
-URL, you can upload to ftp://upload.ffmpeg.org
+URL, you can upload to https://streams.videolan.org/upload/ .
-
-Did you provide a verbose summary about what the patch does change?
+ Did you provide a verbose summary about what the patch does change?
-
-Did you provide a verbose explanation why it changes things like it does?
+ Did you provide a verbose explanation why it changes things like it does?
-
-Did you provide a verbose summary of the user visible advantages and
+ Did you provide a verbose summary of the user visible advantages and
disadvantages if the patch is applied?
-
-Did you provide an example so we can verify the new feature added by the
+ Did you provide an example so we can verify the new feature added by the
patch easily?
-
-If you added a new file, did you insert a license header? It should be
+ If you added a new file, did you insert a license header? It should be
taken from FFmpeg, not randomly copied and pasted from somewhere else.
-
-You should maintain alphabetical order in alphabetically ordered lists as
+ You should maintain alphabetical order in alphabetically ordered lists as
long as doing so does not break API/ABI compatibility.
-
-Lines with similar content should be aligned vertically when doing so
+ Lines with similar content should be aligned vertically when doing so
improves readability.
-
-Consider to add a regression test for your code.
+ Consider adding a regression test for your code.
-
-If you added YASM code please check that things still work with –disable-yasm
+ If you added YASM code please check that things still work with –disable-yasm.
-
-Make sure you check the return values of function and return appropriate
+ Make sure you check the return values of function and return appropriate
error codes. Especially memory allocation functions like av_malloc()
are notoriously left unchecked, which is a serious problem.
-
-Test your code with valgrind and or Address Sanitizer to ensure it’s free
+ Test your code with valgrind and or Address Sanitizer to ensure it’s free
of leaks, out of array accesses, etc.
-1.8 Patch review process
+9 Patch review process# TOC
All patches posted to ffmpeg-devel will be reviewed, unless they contain a
clear note that the patch is not for the git master branch.
@@ -701,9 +681,12 @@
1.8 Patch
be rejected. Instead, submit significant changes or new features as
separate patches.
-
-
-1.9 Regression tests
+Everyone is welcome to review patches. Also if you are waiting for your patch
+to be reviewed, please consider helping to review other patches, that is a great
+way to get everyone’s patches reviewed sooner.
+
+
+10 Regression tests# TOC
Before submitting a patch (or committing to the repository), you should at least
test that you did not break anything.
@@ -715,40 +698,35 @@
1.9 Regressi
accordingly].
-1.9.1 Adding files to the fate-suite dataset
+10.1 Adding files to the fate-suite dataset# TOC
When there is no muxer or encoder available to generate test media for a
-specific test then the media has to be inlcuded in the fate-suite.
+specific test then the media has to be included in the fate-suite.
First please make sure that the sample file is as small as possible to test the
respective decoder or demuxer sufficiently. Large files increase network
bandwidth and disk space requirements.
Once you have a working fate test and fate sample, provide in the commit
-message or introductionary message for the patch series that you post to
+message or introductory message for the patch series that you post to
the ffmpeg-devel mailing list, a direct link to download the sample media.
-
-1.9.2 Visualizing Test Coverage
+10.2 Visualizing Test Coverage# TOC
The FFmpeg build system allows visualizing the test coverage in an easy
manner with the coverage tools gcov/lcov. This involves
the following steps:
-
- Configure to compile with instrumentation enabled:
+ Configure to compile with instrumentation enabled:
configure --toolchain=gcov.
-
- Run your test case, either manually or via FATE. This can be either
+ Run your test case, either manually or via FATE. This can be either
the full FATE regression suite, or any arbitrary invocation of any
front-end tool provided by FFmpeg, in any combination.
-
- Run make lcov to generate coverage data in HTML format.
+ Run make lcov to generate coverage data in HTML format.
-
- View lcov/index.html in your preferred HTML viewer.
+ View lcov/index.html in your preferred HTML viewer.
You can use the command make lcov-reset to reset the coverage
@@ -756,7 +734,7 @@
1.
new test.
-1.9.3 Using Valgrind
+10.3 Using Valgrind# TOC
The configure script provides a shortcut for using valgrind to spot bugs
related to memory handling. Just add the option
@@ -769,25 +747,22 @@
1.9.3 Using V
--target-exec='valgrind <your_custom_valgrind_options> option in
your configure line instead.
-
-
-1.10 Release process
+
+11 Release process# TOC
FFmpeg maintains a set of release branches , which are the
recommended deliverable for system integrators and distributors (such as
Linux distributions, etc.). At regular times, a release
manager prepares, tests and publishes tarballs on the
-http://ffmpeg.org website.
+https://ffmpeg.org website.
There are two kinds of releases:
-
-Major releases always include the latest and greatest
+ Major releases always include the latest and greatest
features and functionality.
-
-Point releases are cut from release branches,
+ Point releases are cut from release branches,
which are named release/X, with X being the release
version number.
@@ -802,26 +777,21 @@ 1.10 Release
adjustments to the symbol versioning file. Please discuss such changes
on the ffmpeg-devel mailing list in time to allow forward planning.
-
-
-1.10.1 Criteria for Point Releases
+
+11.1 Criteria for Point Releases# TOC
Changes that match the following criteria are valid candidates for
inclusion into a point release:
-
-Fixes a security issue, preferably identified by a CVE
+ Fixes a security issue, preferably identified by a CVE
number issued by http://cve.mitre.org/ .
-
-Fixes a documented bug in https://trac.ffmpeg.org .
+ Fixes a documented bug in https://trac.ffmpeg.org .
-
-Improves the included documentation.
+ Improves the included documentation.
-
-Retains both source code and binary compatibility with previous
+ Retains both source code and binary compatibility with previous
point releases of the same release branch.
@@ -829,49 +799,42 @@
-1.10.2 Release Checklist
+11.2 Release Checklist# TOC
The release process involves the following steps:
-
-Ensure that the ‘RELEASE ’ file contains the version number for
+ Ensure that the RELEASE file contains the version number for
the upcoming release.
-
-Add the release at https://trac.ffmpeg.org/admin/ticket/versions .
+ Add the release at https://trac.ffmpeg.org/admin/ticket/versions .
-
-Announce the intent to do a release to the mailing list.
+ Announce the intent to do a release to the mailing list.
-
-Make sure all relevant security fixes have been backported. See
+ Make sure all relevant security fixes have been backported. See
https://ffmpeg.org/security.html .
-
-Ensure that the FATE regression suite still passes in the release
+ Ensure that the FATE regression suite still passes in the release
branch on at least i386 and amd64
(cf. Regression tests ).
-
-Prepare the release tarballs in bz2 and gz formats, and
+ Prepare the release tarballs in bz2 and gz formats, and
supplementing files that contain gpg signatures
-
-Publish the tarballs at http://ffmpeg.org/releases . Create and
+ Publish the tarballs at https://ffmpeg.org/releases . Create and
push an annotated tag in the form nX, with X
containing the version number.
-
-Propose and send a patch to the ffmpeg-devel mailing list
+ Propose and send a patch to the ffmpeg-devel mailing list
with a news entry for the website.
-
-Publish the news entry.
+ Publish the news entry.
-
-Send announcement to the mailing list.
+ Send an announcement to the mailing list.
-
+
+
+
+
+
diff --git a/extern/ffmpeg/doc/developer.html.d b/extern/ffmpeg/doc/developer.html.d
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/extern/ffmpeg/doc/developer.texi b/extern/ffmpeg/doc/developer.texi
new file mode 100644
index 0000000000..b33cab0fc7
--- /dev/null
+++ b/extern/ffmpeg/doc/developer.texi
@@ -0,0 +1,866 @@
+\input texinfo @c -*- texinfo -*-
+@documentencoding UTF-8
+
+@settitle Developer Documentation
+@titlepage
+@center @titlefont{Developer Documentation}
+@end titlepage
+
+@top
+
+@contents
+
+@chapter Notes for external developers
+
+This document is mostly useful for internal FFmpeg developers.
+External developers who need to use the API in their application should
+refer to the API doxygen documentation in the public headers, and
+check the examples in @file{doc/examples} and in the source code to
+see how the public API is employed.
+
+You can use the FFmpeg libraries in your commercial program, but you
+are encouraged to @emph{publish any patch you make}. In this case the
+best way to proceed is to send your patches to the ffmpeg-devel
+mailing list following the guidelines illustrated in the remainder of
+this document.
+
+For more detailed legal information about the use of FFmpeg in
+external programs read the @file{LICENSE} file in the source tree and
+consult @url{https://ffmpeg.org/legal.html}.
+
+@chapter Contributing
+
+There are 2 ways by which code gets into FFmpeg:
+@itemize @bullet
+@item Submitting patches to the ffmpeg-devel mailing list.
+ See @ref{Submitting patches} for details.
+@item Directly committing changes to the main tree.
+@end itemize
+
+Whichever way, changes should be reviewed by the maintainer of the code
+before they are committed. And they should follow the @ref{Coding Rules}.
+The developer making the commit and the author are responsible for their changes
+and should try to fix issues their commit causes.
+
+@anchor{Coding Rules}
+@chapter Coding Rules
+
+@section Code formatting conventions
+
+There are the following guidelines regarding the indentation in files:
+
+@itemize @bullet
+@item
+Indent size is 4.
+
+@item
+The TAB character is forbidden outside of Makefiles as is any
+form of trailing whitespace. Commits containing either will be
+rejected by the git repository.
+
+@item
+You should try to limit your code lines to 80 characters; however, do so if
+and only if this improves readability.
+
+@item
+K&R coding style is used.
+@end itemize
+The presentation is one inspired by 'indent -i4 -kr -nut'.
+
+The main priority in FFmpeg is simplicity and small code size in order to
+minimize the bug count.
+
+@section Comments
+Use the JavaDoc/Doxygen format (see examples below) so that code documentation
+can be generated automatically. All nontrivial functions should have a comment
+above them explaining what the function does, even if it is just one sentence.
+All structures and their member variables should be documented, too.
+
+Avoid Qt-style and similar Doxygen syntax with @code{!} in it, i.e. replace
+@code{//!} with @code{///} and similar. Also @@ syntax should be employed
+for markup commands, i.e. use @code{@@param} and not @code{\param}.
+
+@example
+/**
+ * @@file
+ * MPEG codec.
+ * @@author ...
+ */
+
+/**
+ * Summary sentence.
+ * more text ...
+ * ...
+ */
+typedef struct Foobar @{
+ int var1; /**< var1 description */
+ int var2; ///< var2 description
+ /** var3 description */
+ int var3;
+@} Foobar;
+
+/**
+ * Summary sentence.
+ * more text ...
+ * ...
+ * @@param my_parameter description of my_parameter
+ * @@return return value description
+ */
+int myfunc(int my_parameter)
+...
+@end example
+
+@section C language features
+
+FFmpeg is programmed in the ISO C90 language with a few additional
+features from ISO C99, namely:
+
+@itemize @bullet
+@item
+the @samp{inline} keyword;
+
+@item
+@samp{//} comments;
+
+@item
+designated struct initializers (@samp{struct s x = @{ .i = 17 @};});
+
+@item
+compound literals (@samp{x = (struct s) @{ 17, 23 @};}).
+
+@item
+for loops with variable definition (@samp{for (int i = 0; i < 8; i++)});
+
+@item
+Variadic macros (@samp{#define ARRAY(nb, ...) (int[nb + 1])@{ nb, __VA_ARGS__ @}});
+
+@item
+Implementation defined behavior for signed integers is assumed to match the
+expected behavior for two's complement. Non representable values in integer
+casts are binary truncated. Shift right of signed values uses sign extension.
+@end itemize
+
+These features are supported by all compilers we care about, so we will not
+accept patches to remove their use unless they absolutely do not impair
+clarity and performance.
+
+All code must compile with recent versions of GCC and a number of other
+currently supported compilers. To ensure compatibility, please do not use
+additional C99 features or GCC extensions. Especially watch out for:
+
+@itemize @bullet
+@item
+mixing statements and declarations;
+
+@item
+@samp{long long} (use @samp{int64_t} instead);
+
+@item
+@samp{__attribute__} not protected by @samp{#ifdef __GNUC__} or similar;
+
+@item
+GCC statement expressions (@samp{(x = (@{ int y = 4; y; @})}).
+@end itemize
+
+@section Naming conventions
+All names should be composed with underscores (_), not CamelCase. For example,
+@samp{avfilter_get_video_buffer} is an acceptable function name and
+@samp{AVFilterGetVideo} is not. The exception from this are type names, like
+for example structs and enums; they should always be in CamelCase.
+
+There are the following conventions for naming variables and functions:
+
+@itemize @bullet
+@item
+For local variables no prefix is required.
+
+@item
+For file-scope variables and functions declared as @code{static}, no prefix
+is required.
+
+@item
+For variables and functions visible outside of file scope, but only used
+internally by a library, an @code{ff_} prefix should be used,
+e.g. @samp{ff_w64_demuxer}.
+
+@item
+For variables and functions visible outside of file scope, used internally
+across multiple libraries, use @code{avpriv_} as prefix, for example,
+@samp{avpriv_report_missing_feature}.
+
+@item
+Each library has its own prefix for public symbols, in addition to the
+commonly used @code{av_} (@code{avformat_} for libavformat,
+@code{avcodec_} for libavcodec, @code{swr_} for libswresample, etc).
+Check the existing code and choose names accordingly.
+Note that some symbols without these prefixes are also exported for
+retro-compatibility reasons. These exceptions are declared in the
+@code{lib/lib.v} files.
+@end itemize
+
+Furthermore, name space reserved for the system should not be invaded.
+Identifiers ending in @code{_t} are reserved by
+@url{http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html#tag_02_02_02, POSIX}.
+Also avoid names starting with @code{__} or @code{_} followed by an uppercase
+letter as they are reserved by the C standard. Names starting with @code{_}
+are reserved at the file level and may not be used for externally visible
+symbols. If in doubt, just avoid names starting with @code{_} altogether.
+
+@section Miscellaneous conventions
+
+@itemize @bullet
+@item
+fprintf and printf are forbidden in libavformat and libavcodec,
+please use av_log() instead.
+
+@item
+Casts should be used only when necessary. Unneeded parentheses
+should also be avoided if they don't make the code easier to understand.
+@end itemize
+
+@section Editor configuration
+In order to configure Vim to follow FFmpeg formatting conventions, paste
+the following snippet into your @file{.vimrc}:
+@example
+" indentation rules for FFmpeg: 4 spaces, no tabs
+set expandtab
+set shiftwidth=4
+set softtabstop=4
+set cindent
+set cinoptions=(0
+" Allow tabs in Makefiles.
+autocmd FileType make,automake set noexpandtab shiftwidth=8 softtabstop=8
+" Trailing whitespace and tabs are forbidden, so highlight them.
+highlight ForbiddenWhitespace ctermbg=red guibg=red
+match ForbiddenWhitespace /\s\+$\|\t/
+" Do not highlight spaces at the end of line while typing on that line.
+autocmd InsertEnter * match ForbiddenWhitespace /\t\|\s\+\%#\@@ 5 lines) chunk of code,
+then either do NOT change the indentation of the inner part within (do not
+move it to the right)! or do so in a separate commit
+
+@subheading Commit messages should always be filled out properly.
+Always fill out the commit log message. Describe in a few lines what you
+changed and why. You can refer to mailing list postings if you fix a
+particular bug. Comments such as "fixed!" or "Changed it." are unacceptable.
+Recommended format:
+
+@example
+area changed: Short 1 line description
+
+details describing what and why and giving references.
+@end example
+
+@subheading Credit the author of the patch.
+Make sure the author of the commit is set correctly. (see git commit --author)
+If you apply a patch, send an
+answer to ffmpeg-devel (or wherever you got the patch from) saying that
+you applied the patch.
+
+@subheading Complex patches should refer to discussion surrounding them.
+When applying patches that have been discussed (at length) on the mailing
+list, reference the thread in the log message.
+
+@subheading Always wait long enough before pushing changes
+Do NOT commit to code actively maintained by others without permission.
+Send a patch to ffmpeg-devel. If no one answers within a reasonable
+time-frame (12h for build failures and security fixes, 3 days small changes,
+1 week for big patches) then commit your patch if you think it is OK.
+Also note, the maintainer can simply ask for more time to review!
+
+@section Code
+@subheading API/ABI changes should be discussed before they are made.
+Do not change behavior of the programs (renaming options etc) or public
+API or ABI without first discussing it on the ffmpeg-devel mailing list.
+Do not remove widely used functionality or features (redundant code can be removed).
+
+@subheading Remember to check if you need to bump versions for libav*.
+Depending on the change, you may need to change the version integer.
+Incrementing the first component means no backward compatibility to
+previous versions (e.g. removal of a function from the public API).
+Incrementing the second component means backward compatible change
+(e.g. addition of a function to the public API or extension of an
+existing data structure).
+Incrementing the third component means a noteworthy binary compatible
+change (e.g. encoder bug fix that matters for the decoder). The third
+component always starts at 100 to distinguish FFmpeg from Libav.
+
+@subheading Warnings for correct code may be disabled if there is no other option.
+Compiler warnings indicate potential bugs or code with bad style. If a type of
+warning always points to correct and clean code, that warning should
+be disabled, not the code changed.
+Thus the remaining warnings can either be bugs or correct code.
+If it is a bug, the bug has to be fixed. If it is not, the code should
+be changed to not generate a warning unless that causes a slowdown
+or obfuscates the code.
+
+@subheading Check untrusted input properly.
+Never write to unallocated memory, never write over the end of arrays,
+always check values read from some untrusted source before using them
+as array index or other risky things.
+
+@section Documentation/Other
+@subheading Subscribe to the ffmpeg-devel mailing list.
+It is important to be subscribed to the
+@uref{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel, ffmpeg-devel}
+mailing list. Almost any non-trivial patch is to be sent there for review.
+Other developers may have comments about your contribution. We expect you see
+those comments, and to improve it if requested. (N.B. Experienced committers
+have other channels, and may sometimes skip review for trivial fixes.) Also,
+discussion here about bug fixes and FFmpeg improvements by other developers may
+be helpful information for you. Finally, by being a list subscriber, your
+contribution will be posted immediately to the list, without the moderation
+hold which messages from non-subscribers experience.
+
+However, it is more important to the project that we receive your patch than
+that you be subscribed to the ffmpeg-devel list. If you have a patch, and don't
+want to subscribe and discuss the patch, then please do send it to the list
+anyway.
+
+@subheading Subscribe to the ffmpeg-cvslog mailing list.
+Diffs of all commits are sent to the
+@uref{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-cvslog, ffmpeg-cvslog}
+mailing list. Some developers read this list to review all code base changes
+from all sources. Subscribing to this list is not mandatory.
+
+@subheading Keep the documentation up to date.
+Update the documentation if you change behavior or add features. If you are
+unsure how best to do this, send a patch to ffmpeg-devel, the documentation
+maintainer(s) will review and commit your stuff.
+
+@subheading Important discussions should be accessible to all.
+Try to keep important discussions and requests (also) on the public
+developer mailing list, so that all developers can benefit from them.
+
+@subheading Check your entries in MAINTAINERS.
+Make sure that no parts of the codebase that you maintain are missing from the
+@file{MAINTAINERS} file. If something that you want to maintain is missing add it with
+your name after it.
+If at some point you no longer want to maintain some code, then please help in
+finding a new maintainer and also don't forget to update the @file{MAINTAINERS} file.
+
+We think our rules are not too hard. If you have comments, contact us.
+
+@chapter Code of conduct
+
+Be friendly and respectful towards others and third parties.
+Treat others the way you yourself want to be treated.
+
+Be considerate. Not everyone shares the same viewpoint and priorities as you do.
+Different opinions and interpretations help the project.
+Looking at issues from a different perspective assists development.
+
+Do not assume malice for things that can be attributed to incompetence. Even if
+it is malice, it's rarely good to start with that as initial assumption.
+
+Stay friendly even if someone acts contrarily. Everyone has a bad day
+once in a while.
+If you yourself have a bad day or are angry then try to take a break and reply
+once you are calm and without anger if you have to.
+
+Try to help other team members and cooperate if you can.
+
+The goal of software development is to create technical excellence, not for any
+individual to be better and "win" against the others. Large software projects
+are only possible and successful through teamwork.
+
+If someone struggles do not put them down. Give them a helping hand
+instead and point them in the right direction.
+
+Finally, keep in mind the immortal words of Bill and Ted,
+"Be excellent to each other."
+
+@anchor{Submitting patches}
+@chapter Submitting patches
+
+First, read the @ref{Coding Rules} above if you did not yet, in particular
+the rules regarding patch submission.
+
+When you submit your patch, please use @code{git format-patch} or
+@code{git send-email}. We cannot read other diffs :-).
+
+Also please do not submit a patch which contains several unrelated changes.
+Split it into separate, self-contained pieces. This does not mean splitting
+file by file. Instead, make the patch as small as possible while still
+keeping it as a logical unit that contains an individual change, even
+if it spans multiple files. This makes reviewing your patches much easier
+for us and greatly increases your chances of getting your patch applied.
+
+Use the patcheck tool of FFmpeg to check your patch.
+The tool is located in the tools directory.
+
+Run the @ref{Regression tests} before submitting a patch in order to verify
+it does not cause unexpected problems.
+
+It also helps quite a bit if you tell us what the patch does (for example
+'replaces lrint by lrintf'), and why (for example '*BSD isn't C99 compliant
+and has no lrint()')
+
+Also please if you send several patches, send each patch as a separate mail,
+do not attach several unrelated patches to the same mail.
+
+Patches should be posted to the
+@uref{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel, ffmpeg-devel}
+mailing list. Use @code{git send-email} when possible since it will properly
+send patches without requiring extra care. If you cannot, then send patches
+as base64-encoded attachments, so your patch is not trashed during
+transmission. Also ensure the correct mime type is used
+(text/x-diff or text/x-patch or at least text/plain) and that only one
+patch is inline or attached per mail.
+You can check @url{https://patchwork.ffmpeg.org}, if your patch does not show up, its mime type
+likely was wrong.
+
+Your patch will be reviewed on the mailing list. You will likely be asked
+to make some changes and are expected to send in an improved version that
+incorporates the requests from the review. This process may go through
+several iterations. Once your patch is deemed good enough, some developer
+will pick it up and commit it to the official FFmpeg tree.
+
+Give us a few days to react. But if some time passes without reaction,
+send a reminder by email. Your patch should eventually be dealt with.
+
+
+@chapter New codecs or formats checklist
+
+@enumerate
+@item
+Did you use av_cold for codec initialization and close functions?
+
+@item
+Did you add a long_name under NULL_IF_CONFIG_SMALL to the AVCodec or
+AVInputFormat/AVOutputFormat struct?
+
+@item
+Did you bump the minor version number (and reset the micro version
+number) in @file{libavcodec/version.h} or @file{libavformat/version.h}?
+
+@item
+Did you register it in @file{allcodecs.c} or @file{allformats.c}?
+
+@item
+Did you add the AVCodecID to @file{avcodec.h}?
+When adding new codec IDs, also add an entry to the codec descriptor
+list in @file{libavcodec/codec_desc.c}.
+
+@item
+If it has a FourCC, did you add it to @file{libavformat/riff.c},
+even if it is only a decoder?
+
+@item
+Did you add a rule to compile the appropriate files in the Makefile?
+Remember to do this even if you're just adding a format to a file that is
+already being compiled by some other rule, like a raw demuxer.
+
+@item
+Did you add an entry to the table of supported formats or codecs in
+@file{doc/general.texi}?
+
+@item
+Did you add an entry in the Changelog?
+
+@item
+If it depends on a parser or a library, did you add that dependency in
+configure?
+
+@item
+Did you @code{git add} the appropriate files before committing?
+
+@item
+Did you make sure it compiles standalone, i.e. with
+@code{configure --disable-everything --enable-decoder=foo}
+(or @code{--enable-demuxer} or whatever your component is)?
+@end enumerate
+
+
+@chapter Patch submission checklist
+
+@enumerate
+@item
+Does @code{make fate} pass with the patch applied?
+
+@item
+Was the patch generated with git format-patch or send-email?
+
+@item
+Did you sign-off your patch? (@code{git commit -s})
+See @uref{https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/process/submitting-patches.rst, Sign your work} for the meaning
+of @dfn{sign-off}.
+
+@item
+Did you provide a clear git commit log message?
+
+@item
+Is the patch against latest FFmpeg git master branch?
+
+@item
+Are you subscribed to ffmpeg-devel?
+(the list is subscribers only due to spam)
+
+@item
+Have you checked that the changes are minimal, so that the same cannot be
+achieved with a smaller patch and/or simpler final code?
+
+@item
+If the change is to speed critical code, did you benchmark it?
+
+@item
+If you did any benchmarks, did you provide them in the mail?
+
+@item
+Have you checked that the patch does not introduce buffer overflows or
+other security issues?
+
+@item
+Did you test your decoder or demuxer against damaged data? If no, see
+tools/trasher, the noise bitstream filter, and
+@uref{http://caca.zoy.org/wiki/zzuf, zzuf}. Your decoder or demuxer
+should not crash, end in a (near) infinite loop, or allocate ridiculous
+amounts of memory when fed damaged data.
+
+@item
+Did you test your decoder or demuxer against sample files?
+Samples may be obtained at @url{https://samples.ffmpeg.org}.
+
+@item
+Does the patch not mix functional and cosmetic changes?
+
+@item
+Did you add tabs or trailing whitespace to the code? Both are forbidden.
+
+@item
+Is the patch attached to the email you send?
+
+@item
+Is the mime type of the patch correct? It should be text/x-diff or
+text/x-patch or at least text/plain and not application/octet-stream.
+
+@item
+If the patch fixes a bug, did you provide a verbose analysis of the bug?
+
+@item
+If the patch fixes a bug, did you provide enough information, including
+a sample, so the bug can be reproduced and the fix can be verified?
+Note please do not attach samples >100k to mails but rather provide a
+URL, you can upload to @url{https://streams.videolan.org/upload/}.
+
+@item
+Did you provide a verbose summary about what the patch does change?
+
+@item
+Did you provide a verbose explanation why it changes things like it does?
+
+@item
+Did you provide a verbose summary of the user visible advantages and
+disadvantages if the patch is applied?
+
+@item
+Did you provide an example so we can verify the new feature added by the
+patch easily?
+
+@item
+If you added a new file, did you insert a license header? It should be
+taken from FFmpeg, not randomly copied and pasted from somewhere else.
+
+@item
+You should maintain alphabetical order in alphabetically ordered lists as
+long as doing so does not break API/ABI compatibility.
+
+@item
+Lines with similar content should be aligned vertically when doing so
+improves readability.
+
+@item
+Consider adding a regression test for your code.
+
+@item
+If you added YASM code please check that things still work with --disable-yasm.
+
+@item
+Make sure you check the return values of function and return appropriate
+error codes. Especially memory allocation functions like @code{av_malloc()}
+are notoriously left unchecked, which is a serious problem.
+
+@item
+Test your code with valgrind and or Address Sanitizer to ensure it's free
+of leaks, out of array accesses, etc.
+@end enumerate
+
+@chapter Patch review process
+
+All patches posted to ffmpeg-devel will be reviewed, unless they contain a
+clear note that the patch is not for the git master branch.
+Reviews and comments will be posted as replies to the patch on the
+mailing list. The patch submitter then has to take care of every comment,
+that can be by resubmitting a changed patch or by discussion. Resubmitted
+patches will themselves be reviewed like any other patch. If at some point
+a patch passes review with no comments then it is approved, that can for
+simple and small patches happen immediately while large patches will generally
+have to be changed and reviewed many times before they are approved.
+After a patch is approved it will be committed to the repository.
+
+We will review all submitted patches, but sometimes we are quite busy so
+especially for large patches this can take several weeks.
+
+If you feel that the review process is too slow and you are willing to try to
+take over maintainership of the area of code you change then just clone
+git master and maintain the area of code there. We will merge each area from
+where its best maintained.
+
+When resubmitting patches, please do not make any significant changes
+not related to the comments received during review. Such patches will
+be rejected. Instead, submit significant changes or new features as
+separate patches.
+
+Everyone is welcome to review patches. Also if you are waiting for your patch
+to be reviewed, please consider helping to review other patches, that is a great
+way to get everyone's patches reviewed sooner.
+
+@anchor{Regression tests}
+@chapter Regression tests
+
+Before submitting a patch (or committing to the repository), you should at least
+test that you did not break anything.
+
+Running 'make fate' accomplishes this, please see @url{fate.html} for details.
+
+[Of course, some patches may change the results of the regression tests. In
+this case, the reference results of the regression tests shall be modified
+accordingly].
+
+@section Adding files to the fate-suite dataset
+
+When there is no muxer or encoder available to generate test media for a
+specific test then the media has to be included in the fate-suite.
+First please make sure that the sample file is as small as possible to test the
+respective decoder or demuxer sufficiently. Large files increase network
+bandwidth and disk space requirements.
+Once you have a working fate test and fate sample, provide in the commit
+message or introductory message for the patch series that you post to
+the ffmpeg-devel mailing list, a direct link to download the sample media.
+
+@section Visualizing Test Coverage
+
+The FFmpeg build system allows visualizing the test coverage in an easy
+manner with the coverage tools @code{gcov}/@code{lcov}. This involves
+the following steps:
+
+@enumerate
+@item
+ Configure to compile with instrumentation enabled:
+ @code{configure --toolchain=gcov}.
+
+@item
+ Run your test case, either manually or via FATE. This can be either
+ the full FATE regression suite, or any arbitrary invocation of any
+ front-end tool provided by FFmpeg, in any combination.
+
+@item
+ Run @code{make lcov} to generate coverage data in HTML format.
+
+@item
+ View @code{lcov/index.html} in your preferred HTML viewer.
+@end enumerate
+
+You can use the command @code{make lcov-reset} to reset the coverage
+measurements. You will need to rerun @code{make lcov} after running a
+new test.
+
+@section Using Valgrind
+
+The configure script provides a shortcut for using valgrind to spot bugs
+related to memory handling. Just add the option
+@code{--toolchain=valgrind-memcheck} or @code{--toolchain=valgrind-massif}
+to your configure line, and reasonable defaults will be set for running
+FATE under the supervision of either the @strong{memcheck} or the
+@strong{massif} tool of the valgrind suite.
+
+In case you need finer control over how valgrind is invoked, use the
+@code{--target-exec='valgrind } option in
+your configure line instead.
+
+@anchor{Release process}
+@chapter Release process
+
+FFmpeg maintains a set of @strong{release branches}, which are the
+recommended deliverable for system integrators and distributors (such as
+Linux distributions, etc.). At regular times, a @strong{release
+manager} prepares, tests and publishes tarballs on the
+@url{https://ffmpeg.org} website.
+
+There are two kinds of releases:
+
+@enumerate
+@item
+@strong{Major releases} always include the latest and greatest
+features and functionality.
+
+@item
+@strong{Point releases} are cut from @strong{release} branches,
+which are named @code{release/X}, with @code{X} being the release
+version number.
+@end enumerate
+
+Note that we promise to our users that shared libraries from any FFmpeg
+release never break programs that have been @strong{compiled} against
+previous versions of @strong{the same release series} in any case!
+
+However, from time to time, we do make API changes that require adaptations
+in applications. Such changes are only allowed in (new) major releases and
+require further steps such as bumping library version numbers and/or
+adjustments to the symbol versioning file. Please discuss such changes
+on the @strong{ffmpeg-devel} mailing list in time to allow forward planning.
+
+@anchor{Criteria for Point Releases}
+@section Criteria for Point Releases
+
+Changes that match the following criteria are valid candidates for
+inclusion into a point release:
+
+@enumerate
+@item
+Fixes a security issue, preferably identified by a @strong{CVE
+number} issued by @url{http://cve.mitre.org/}.
+
+@item
+Fixes a documented bug in @url{https://trac.ffmpeg.org}.
+
+@item
+Improves the included documentation.
+
+@item
+Retains both source code and binary compatibility with previous
+point releases of the same release branch.
+@end enumerate
+
+The order for checking the rules is (1 OR 2 OR 3) AND 4.
+
+
+@section Release Checklist
+
+The release process involves the following steps:
+
+@enumerate
+@item
+Ensure that the @file{RELEASE} file contains the version number for
+the upcoming release.
+
+@item
+Add the release at @url{https://trac.ffmpeg.org/admin/ticket/versions}.
+
+@item
+Announce the intent to do a release to the mailing list.
+
+@item
+Make sure all relevant security fixes have been backported. See
+@url{https://ffmpeg.org/security.html}.
+
+@item
+Ensure that the FATE regression suite still passes in the release
+branch on at least @strong{i386} and @strong{amd64}
+(cf. @ref{Regression tests}).
+
+@item
+Prepare the release tarballs in @code{bz2} and @code{gz} formats, and
+supplementing files that contain @code{gpg} signatures
+
+@item
+Publish the tarballs at @url{https://ffmpeg.org/releases}. Create and
+push an annotated tag in the form @code{nX}, with @code{X}
+containing the version number.
+
+@item
+Propose and send a patch to the @strong{ffmpeg-devel} mailing list
+with a news entry for the website.
+
+@item
+Publish the news entry.
+
+@item
+Send an announcement to the mailing list.
+@end enumerate
+
+@bye
diff --git a/extern/ffmpeg/doc/devices.texi b/extern/ffmpeg/doc/devices.texi
new file mode 100644
index 0000000000..5e74a962d7
--- /dev/null
+++ b/extern/ffmpeg/doc/devices.texi
@@ -0,0 +1,25 @@
+@chapter Device Options
+@c man begin DEVICE OPTIONS
+
+The libavdevice library provides the same interface as
+libavformat. Namely, an input device is considered like a demuxer, and
+an output device like a muxer, and the interface and generic device
+options are the same provided by libavformat (see the ffmpeg-formats
+manual).
+
+In addition each input or output device may support so-called private
+options, which are specific for that component.
+
+Options may be set by specifying -@var{option} @var{value} in the
+FFmpeg tools, or by setting the value explicitly in the device
+@code{AVFormatContext} options or using the @file{libavutil/opt.h} API
+for programmatic use.
+
+@c man end DEVICE OPTIONS
+
+@ifclear config-writeonly
+@include indevs.texi
+@end ifclear
+@ifclear config-readonly
+@include outdevs.texi
+@end ifclear
diff --git a/extern/ffmpeg/doc/doxy-wrapper.sh b/extern/ffmpeg/doc/doxy-wrapper.sh
new file mode 100644
index 0000000000..fe0102b5bf
--- /dev/null
+++ b/extern/ffmpeg/doc/doxy-wrapper.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+OUT_DIR="${1}"
+DOXYFILE="${2}"
+DOXYGEN="${3}"
+
+shift 3
+
+if [ -e "VERSION" ]; then
+ VERSION=`cat "VERSION"`
+else
+ VERSION=`git describe`
+fi
+
+$DOXYGEN - < (4.0.0).
+
+Default value is 0.
+
+@item signaling
+Set SBR/PS signaling style.
+
+It can assume one of the following values:
+@table @samp
+@item default
+choose signaling implicitly (explicit hierarchical by default,
+implicit if global header is disabled)
+
+@item implicit
+implicit backwards compatible signaling
+
+@item explicit_sbr
+explicit SBR, implicit PS signaling
+
+@item explicit_hierarchical
+explicit hierarchical signaling
+@end table
+
+Default value is @samp{default}.
+
+@item latm
+Output LATM/LOAS encapsulated data if set to 1, disabled if set to 0.
+
+Default value is 0.
+
+@item header_period
+Set StreamMuxConfig and PCE repetition period (in frames) for sending
+in-band configuration buffers within LATM/LOAS transport layer.
+
+Must be a 16-bits non-negative integer.
+
+Default value is 0.
+
+@item vbr
+Set VBR mode, from 1 to 5. 1 is lowest quality (though still pretty
+good) and 5 is highest quality. A value of 0 will disable VBR, and CBR
+(Constant Bit Rate) is enabled.
+
+Currently only the @samp{aac_low} profile supports VBR encoding.
+
+VBR modes 1-5 correspond to roughly the following average bit rates:
+
+@table @samp
+@item 1
+32 kbps/channel
+@item 2
+40 kbps/channel
+@item 3
+48-56 kbps/channel
+@item 4
+64 kbps/channel
+@item 5
+about 80-96 kbps/channel
+@end table
+
+Default value is 0.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Use @command{ffmpeg} to convert an audio file to VBR AAC in an M4A (MP4)
+container:
+@example
+ffmpeg -i input.wav -codec:a libfdk_aac -vbr 3 output.m4a
+@end example
+
+@item
+Use @command{ffmpeg} to convert an audio file to CBR 64k kbps AAC, using the
+High-Efficiency AAC profile:
+@example
+ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he -b:a 64k output.m4a
+@end example
+@end itemize
+
+@anchor{libmp3lame}
+@section libmp3lame
+
+LAME (Lame Ain't an MP3 Encoder) MP3 encoder wrapper.
+
+Requires the presence of the libmp3lame headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libmp3lame}.
+
+See @ref{libshine} for a fixed-point MP3 encoder, although with a
+lower quality.
+
+@subsection Options
+
+The following options are supported by the libmp3lame wrapper. The
+@command{lame}-equivalent of the options are listed in parentheses.
+
+@table @option
+@item b (@emph{-b})
+Set bitrate expressed in bits/s for CBR or ABR. LAME @code{bitrate} is
+expressed in kilobits/s.
+
+@item q (@emph{-V})
+Set constant quality setting for VBR. This option is valid only
+using the @command{ffmpeg} command-line tool. For library interface
+users, use @option{global_quality}.
+
+@item compression_level (@emph{-q})
+Set algorithm quality. Valid arguments are integers in the 0-9 range,
+with 0 meaning highest quality but slowest, and 9 meaning fastest
+while producing the worst quality.
+
+@item cutoff (@emph{--lowpass})
+Set lowpass cutoff frequency. If unspecified, the encoder dynamically
+adjusts the cutoff.
+
+@item reservoir
+Enable use of bit reservoir when set to 1. Default value is 1. LAME
+has this enabled by default, but can be overridden by use
+@option{--nores} option.
+
+@item joint_stereo (@emph{-m j})
+Enable the encoder to use (on a frame by frame basis) either L/R
+stereo or mid/side stereo. Default value is 1.
+
+@item abr (@emph{--abr})
+Enable the encoder to use ABR when set to 1. The @command{lame}
+@option{--abr} sets the target bitrate, while this options only
+tells FFmpeg to use ABR still relies on @option{b} to set bitrate.
+
+@end table
+
+@section libopencore-amrnb
+
+OpenCORE Adaptive Multi-Rate Narrowband encoder.
+
+Requires the presence of the libopencore-amrnb headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libopencore-amrnb --enable-version3}.
+
+This is a mono-only encoder. Officially it only supports 8000Hz sample rate,
+but you can override it by setting @option{strict} to @samp{unofficial} or
+lower.
+
+@subsection Options
+
+@table @option
+
+@item b
+Set bitrate in bits per second. Only the following bitrates are supported,
+otherwise libavcodec will round to the nearest valid bitrate.
+
+@table @option
+@item 4750
+@item 5150
+@item 5900
+@item 6700
+@item 7400
+@item 7950
+@item 10200
+@item 12200
+@end table
+
+@item dtx
+Allow discontinuous transmission (generate comfort noise) when set to 1. The
+default value is 0 (disabled).
+
+@end table
+
+@section libopus
+
+libopus Opus Interactive Audio Codec encoder wrapper.
+
+Requires the presence of the libopus headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libopus}.
+
+@subsection Option Mapping
+
+Most libopus options are modelled after the @command{opusenc} utility from
+opus-tools. The following is an option mapping chart describing options
+supported by the libopus wrapper, and their @command{opusenc}-equivalent
+in parentheses.
+
+@table @option
+
+@item b (@emph{bitrate})
+Set the bit rate in bits/s. FFmpeg's @option{b} option is
+expressed in bits/s, while @command{opusenc}'s @option{bitrate} in
+kilobits/s.
+
+@item vbr (@emph{vbr}, @emph{hard-cbr}, and @emph{cvbr})
+Set VBR mode. The FFmpeg @option{vbr} option has the following
+valid arguments, with the @command{opusenc} equivalent options
+in parentheses:
+
+@table @samp
+@item off (@emph{hard-cbr})
+Use constant bit rate encoding.
+
+@item on (@emph{vbr})
+Use variable bit rate encoding (the default).
+
+@item constrained (@emph{cvbr})
+Use constrained variable bit rate encoding.
+@end table
+
+@item compression_level (@emph{comp})
+Set encoding algorithm complexity. Valid options are integers in
+the 0-10 range. 0 gives the fastest encodes but lower quality, while 10
+gives the highest quality but slowest encoding. The default is 10.
+
+@item frame_duration (@emph{framesize})
+Set maximum frame size, or duration of a frame in milliseconds. The
+argument must be exactly the following: 2.5, 5, 10, 20, 40, 60. Smaller
+frame sizes achieve lower latency but less quality at a given bitrate.
+Sizes greater than 20ms are only interesting at fairly low bitrates.
+The default is 20ms.
+
+@item packet_loss (@emph{expect-loss})
+Set expected packet loss percentage. The default is 0.
+
+@item fec (@emph{n/a})
+Enable inband forward error correction. @option{packet_loss} must be non-zero
+to take advantage - frequency of FEC 'side-data' is proportional to expected packet loss.
+Default is disabled.
+
+@item application (N.A.)
+Set intended application type. Valid options are listed below:
+
+@table @samp
+@item voip
+Favor improved speech intelligibility.
+@item audio
+Favor faithfulness to the input (the default).
+@item lowdelay
+Restrict to only the lowest delay modes.
+@end table
+
+@item cutoff (N.A.)
+Set cutoff bandwidth in Hz. The argument must be exactly one of the
+following: 4000, 6000, 8000, 12000, or 20000, corresponding to
+narrowband, mediumband, wideband, super wideband, and fullband
+respectively. The default is 0 (cutoff disabled).
+
+@item mapping_family (@emph{mapping_family})
+Set channel mapping family to be used by the encoder. The default value of -1
+uses mapping family 0 for mono and stereo inputs, and mapping family 1
+otherwise. The default also disables the surround masking and LFE bandwidth
+optimzations in libopus, and requires that the input contains 8 channels or
+fewer.
+
+Other values include 0 for mono and stereo, 1 for surround sound with masking
+and LFE bandwidth optimizations, and 255 for independent streams with an
+unspecified channel layout.
+
+@item apply_phase_inv (N.A.) (requires libopus >= 1.2)
+If set to 0, disables the use of phase inversion for intensity stereo,
+improving the quality of mono downmixes, but slightly reducing normal stereo
+quality. The default is 1 (phase inversion enabled).
+
+@end table
+
+@anchor{libshine}
+@section libshine
+
+Shine Fixed-Point MP3 encoder wrapper.
+
+Shine is a fixed-point MP3 encoder. It has a far better performance on
+platforms without an FPU, e.g. armel CPUs, and some phones and tablets.
+However, as it is more targeted on performance than quality, it is not on par
+with LAME and other production-grade encoders quality-wise. Also, according to
+the project's homepage, this encoder may not be free of bugs as the code was
+written a long time ago and the project was dead for at least 5 years.
+
+This encoder only supports stereo and mono input. This is also CBR-only.
+
+The original project (last updated in early 2007) is at
+@url{http://sourceforge.net/projects/libshine-fxp/}. We only support the
+updated fork by the Savonet/Liquidsoap project at @url{https://github.com/savonet/shine}.
+
+Requires the presence of the libshine headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libshine}.
+
+See also @ref{libmp3lame}.
+
+@subsection Options
+
+The following options are supported by the libshine wrapper. The
+@command{shineenc}-equivalent of the options are listed in parentheses.
+
+@table @option
+@item b (@emph{-b})
+Set bitrate expressed in bits/s for CBR. @command{shineenc} @option{-b} option
+is expressed in kilobits/s.
+
+@end table
+
+@section libtwolame
+
+TwoLAME MP2 encoder wrapper.
+
+Requires the presence of the libtwolame headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libtwolame}.
+
+@subsection Options
+
+The following options are supported by the libtwolame wrapper. The
+@command{twolame}-equivalent options follow the FFmpeg ones and are in
+parentheses.
+
+@table @option
+@item b (@emph{-b})
+Set bitrate expressed in bits/s for CBR. @command{twolame} @option{b}
+option is expressed in kilobits/s. Default value is 128k.
+
+@item q (@emph{-V})
+Set quality for experimental VBR support. Maximum value range is
+from -50 to 50, useful range is from -10 to 10. The higher the
+value, the better the quality. This option is valid only using the
+@command{ffmpeg} command-line tool. For library interface users,
+use @option{global_quality}.
+
+@item mode (@emph{--mode})
+Set the mode of the resulting audio. Possible values:
+
+@table @samp
+@item auto
+Choose mode automatically based on the input. This is the default.
+@item stereo
+Stereo
+@item joint_stereo
+Joint stereo
+@item dual_channel
+Dual channel
+@item mono
+Mono
+@end table
+
+@item psymodel (@emph{--psyc-mode})
+Set psychoacoustic model to use in encoding. The argument must be
+an integer between -1 and 4, inclusive. The higher the value, the
+better the quality. The default value is 3.
+
+@item energy_levels (@emph{--energy})
+Enable energy levels extensions when set to 1. The default value is
+0 (disabled).
+
+@item error_protection (@emph{--protect})
+Enable CRC error protection when set to 1. The default value is 0
+(disabled).
+
+@item copyright (@emph{--copyright})
+Set MPEG audio copyright flag when set to 1. The default value is 0
+(disabled).
+
+@item original (@emph{--original})
+Set MPEG audio original flag when set to 1. The default value is 0
+(disabled).
+
+@end table
+
+@section libvo-amrwbenc
+
+VisualOn Adaptive Multi-Rate Wideband encoder.
+
+Requires the presence of the libvo-amrwbenc headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libvo-amrwbenc --enable-version3}.
+
+This is a mono-only encoder. Officially it only supports 16000Hz sample
+rate, but you can override it by setting @option{strict} to
+@samp{unofficial} or lower.
+
+@subsection Options
+
+@table @option
+
+@item b
+Set bitrate in bits/s. Only the following bitrates are supported, otherwise
+libavcodec will round to the nearest valid bitrate.
+
+@table @samp
+@item 6600
+@item 8850
+@item 12650
+@item 14250
+@item 15850
+@item 18250
+@item 19850
+@item 23050
+@item 23850
+@end table
+
+@item dtx
+Allow discontinuous transmission (generate comfort noise) when set to 1. The
+default value is 0 (disabled).
+
+@end table
+
+@section libvorbis
+
+libvorbis encoder wrapper.
+
+Requires the presence of the libvorbisenc headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libvorbis}.
+
+@subsection Options
+
+The following options are supported by the libvorbis wrapper. The
+@command{oggenc}-equivalent of the options are listed in parentheses.
+
+To get a more accurate and extensive documentation of the libvorbis
+options, consult the libvorbisenc's and @command{oggenc}'s documentations.
+See @url{http://xiph.org/vorbis/},
+@url{http://wiki.xiph.org/Vorbis-tools}, and oggenc(1).
+
+@table @option
+@item b (@emph{-b})
+Set bitrate expressed in bits/s for ABR. @command{oggenc} @option{-b} is
+expressed in kilobits/s.
+
+@item q (@emph{-q})
+Set constant quality setting for VBR. The value should be a float
+number in the range of -1.0 to 10.0. The higher the value, the better
+the quality. The default value is @samp{3.0}.
+
+This option is valid only using the @command{ffmpeg} command-line tool.
+For library interface users, use @option{global_quality}.
+
+@item cutoff (@emph{--advanced-encode-option lowpass_frequency=N})
+Set cutoff bandwidth in Hz, a value of 0 disables cutoff. @command{oggenc}'s
+related option is expressed in kHz. The default value is @samp{0} (cutoff
+disabled).
+
+@item minrate (@emph{-m})
+Set minimum bitrate expressed in bits/s. @command{oggenc} @option{-m} is
+expressed in kilobits/s.
+
+@item maxrate (@emph{-M})
+Set maximum bitrate expressed in bits/s. @command{oggenc} @option{-M} is
+expressed in kilobits/s. This only has effect on ABR mode.
+
+@item iblock (@emph{--advanced-encode-option impulse_noisetune=N})
+Set noise floor bias for impulse blocks. The value is a float number from
+-15.0 to 0.0. A negative bias instructs the encoder to pay special attention
+to the crispness of transients in the encoded audio. The tradeoff for better
+transient response is a higher bitrate.
+
+@end table
+
+@anchor{mjpegenc}
+@section mjpeg
+
+Motion JPEG encoder.
+
+@subsection Options
+
+@table @option
+@item huffman
+Set the huffman encoding strategy. Possible values:
+
+@table @samp
+@item default
+Use the default huffman tables. This is the default strategy.
+
+@item optimal
+Compute and use optimal huffman tables.
+
+@end table
+@end table
+
+@anchor{wavpackenc}
+@section wavpack
+
+WavPack lossless audio encoder.
+
+@subsection Options
+
+The equivalent options for @command{wavpack} command line utility are listed in
+parentheses.
+
+@subsubsection Shared options
+
+The following shared options are effective for this encoder. Only special notes
+about this particular encoder will be documented here. For the general meaning
+of the options, see @ref{codec-options,,the Codec Options chapter}.
+
+@table @option
+@item frame_size (@emph{--blocksize})
+For this encoder, the range for this option is between 128 and 131072. Default
+is automatically decided based on sample rate and number of channel.
+
+For the complete formula of calculating default, see
+@file{libavcodec/wavpackenc.c}.
+
+@item compression_level (@emph{-f}, @emph{-h}, @emph{-hh}, and @emph{-x})
+@end table
+
+@subsubsection Private options
+
+@table @option
+@item joint_stereo (@emph{-j})
+Set whether to enable joint stereo. Valid values are:
+
+@table @samp
+@item on (@emph{1})
+Force mid/side audio encoding.
+@item off (@emph{0})
+Force left/right audio encoding.
+@item auto
+Let the encoder decide automatically.
+@end table
+
+@item optimize_mono
+Set whether to enable optimization for mono. This option is only effective for
+non-mono streams. Available values:
+
+@table @samp
+@item on
+enabled
+@item off
+disabled
+@end table
+
+@end table
+
+@c man end AUDIO ENCODERS
+
+@chapter Video Encoders
+@c man begin VIDEO ENCODERS
+
+A description of some of the currently available video encoders
+follows.
+
+@section GIF
+
+GIF image/animation encoder.
+
+@subsection Options
+
+@table @option
+@item gifflags @var{integer}
+Sets the flags used for GIF encoding.
+
+@table @option
+@item offsetting
+Enables picture offsetting.
+
+Default is enabled.
+
+@item transdiff
+Enables transparency detection between frames.
+
+Default is enabled.
+
+@end table
+
+@item gifimage @var{integer}
+Enables encoding one full GIF image per frame, rather than an animated GIF.
+
+Default value is @option{0}.
+
+@item global_palette @var{integer}
+Writes a palette to the global GIF header where feasible.
+
+If disabled, every frame will always have a palette written, even if there
+is a global palette supplied.
+
+Default value is @option{1}.
+
+@end table
+
+@section Hap
+
+Vidvox Hap video encoder.
+
+@subsection Options
+
+@table @option
+@item format @var{integer}
+Specifies the Hap format to encode.
+
+@table @option
+@item hap
+@item hap_alpha
+@item hap_q
+@end table
+
+Default value is @option{hap}.
+
+@item chunks @var{integer}
+Specifies the number of chunks to split frames into, between 1 and 64. This
+permits multithreaded decoding of large frames, potentially at the cost of
+data-rate. The encoder may modify this value to divide frames evenly.
+
+Default value is @var{1}.
+
+@item compressor @var{integer}
+Specifies the second-stage compressor to use. If set to @option{none},
+@option{chunks} will be limited to 1, as chunked uncompressed frames offer no
+benefit.
+
+@table @option
+@item none
+@item snappy
+@end table
+
+Default value is @option{snappy}.
+
+@end table
+
+@section jpeg2000
+
+The native jpeg 2000 encoder is lossy by default, the @code{-q:v}
+option can be used to set the encoding quality. Lossless encoding
+can be selected with @code{-pred 1}.
+
+@subsection Options
+
+@table @option
+@item format @var{integer}
+Can be set to either @code{j2k} or @code{jp2} (the default) that
+makes it possible to store non-rgb pix_fmts.
+
+@item tile_width @var{integer}
+Sets tile width. Range is 1 to 1073741824. Default is 256.
+
+@item tile_height @var{integer}
+Sets tile height. Range is 1 to 1073741824. Default is 256.
+
+@item pred @var{integer}
+Allows setting the discrete wavelet transform (DWT) type
+@table @option
+@item dwt97int (Lossy)
+@item dwt53 (Lossless)
+@end table
+Default is @code{dwt97int}
+
+@item sop @var{boolean}
+Enable this to add SOP marker at the start of each packet. Disabled by default.
+
+@item eph @var{boolean}
+Enable this to add EPH marker at the end of each packet header. Disabled by default.
+
+@item prog @var{integer}
+Sets the progression order to be used by the encoder.
+Possible values are:
+@table @option
+@item lrcp
+@item rlcp
+@item rpcl
+@item pcrl
+@item cprl
+@end table
+Set to @code{lrcp} by default.
+
+@item layer_rates @var{string}
+By default, when this option is not used, compression is done using the quality metric.
+This option allows for compression using compression ratio. The compression ratio for each
+level could be specified. The compression ratio of a layer @code{l} species the what ratio of
+total file size is contained in the first @code{l} layers.
+
+Example usage:
+
+@example
+ffmpeg -i input.bmp -c:v jpeg2000 -layer_rates "100,10,1" output.j2k
+@end example
+
+This would compress the image to contain 3 layers, where the data contained in the
+first layer would be compressed by 1000 times, compressed by 100 in the first two layers,
+and shall contain all data while using all 3 layers.
+
+@end table
+
+@section librav1e
+
+rav1e AV1 encoder wrapper.
+
+Requires the presence of the rav1e headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-librav1e}.
+
+@subsection Options
+
+@table @option
+@item qmax
+Sets the maximum quantizer to use when using bitrate mode.
+
+@item qmin
+Sets the minimum quantizer to use when using bitrate mode.
+
+@item qp
+Uses quantizer mode to encode at the given quantizer (0-255).
+
+@item speed
+Selects the speed preset (0-10) to encode with.
+
+@item tiles
+Selects how many tiles to encode with.
+
+@item tile-rows
+Selects how many rows of tiles to encode with.
+
+@item tile-columns
+Selects how many columns of tiles to encode with.
+
+@item rav1e-params
+Set rav1e options using a list of @var{key}=@var{value} pairs separated
+by ":". See @command{rav1e --help} for a list of options.
+
+For example to specify librav1e encoding options with @option{-rav1e-params}:
+
+@example
+ffmpeg -i input -c:v librav1e -b:v 500K -rav1e-params speed=5:low_latency=true output.mp4
+@end example
+
+@end table
+
+@section libaom-av1
+
+libaom AV1 encoder wrapper.
+
+Requires the presence of the libaom headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libaom}.
+
+@subsection Options
+
+The wrapper supports the following standard libavcodec options:
+
+@table @option
+
+@item b
+Set bitrate target in bits/second. By default this will use
+variable-bitrate mode. If @option{maxrate} and @option{minrate} are
+also set to the same value then it will use constant-bitrate mode,
+otherwise if @option{crf} is set as well then it will use
+constrained-quality mode.
+
+@item g keyint_min
+Set key frame placement. The GOP size sets the maximum distance between
+key frames; if zero the output stream will be intra-only. The minimum
+distance is ignored unless it is the same as the GOP size, in which case
+key frames will always appear at a fixed interval. Not set by default,
+so without this option the library has completely free choice about
+where to place key frames.
+
+@item qmin qmax
+Set minimum/maximum quantisation values. Valid range is from 0 to 63
+(warning: this does not match the quantiser values actually used by AV1
+- divide by four to map real quantiser values to this range). Defaults
+to min/max (no constraint).
+
+@item minrate maxrate bufsize rc_init_occupancy
+Set rate control buffering parameters. Not used if not set - defaults
+to unconstrained variable bitrate.
+
+@item threads
+Set the number of threads to use while encoding. This may require the
+@option{tiles} or @option{row-mt} options to also be set to actually
+use the specified number of threads fully. Defaults to the number of
+hardware threads supported by the host machine.
+
+@item profile
+Set the encoding profile. Defaults to using the profile which matches
+the bit depth and chroma subsampling of the input.
+
+@end table
+
+The wrapper also has some specific options:
+
+@table @option
+
+@item cpu-used
+Set the quality/encoding speed tradeoff. Valid range is from 0 to 8,
+higher numbers indicating greater speed and lower quality. The default
+value is 1, which will be slow and high quality.
+
+@item auto-alt-ref
+Enable use of alternate reference frames. Defaults to the internal
+default of the library.
+
+@item arnr-max-frames (@emph{frames})
+Set altref noise reduction max frame count. Default is -1.
+
+@item arnr-strength (@emph{strength})
+Set altref noise reduction filter strength. Range is -1 to 6. Default is -1.
+
+@item aq-mode (@emph{aq-mode})
+Set adaptive quantization mode. Possible values:
+
+@table @samp
+@item none (@emph{0})
+Disabled.
+
+@item variance (@emph{1})
+Variance-based.
+
+@item complexity (@emph{2})
+Complexity-based.
+
+@item cyclic (@emph{3})
+Cyclic refresh.
+@end table
+
+@item tune (@emph{tune})
+Set the distortion metric the encoder is tuned with. Default is @code{psnr}.
+
+@table @samp
+@item psnr (@emph{0})
+
+@item ssim (@emph{1})
+@end table
+
+@item lag-in-frames
+Set the maximum number of frames which the encoder may keep in flight
+at any one time for lookahead purposes. Defaults to the internal
+default of the library.
+
+@item error-resilience
+Enable error resilience features:
+@table @option
+@item default
+Improve resilience against losses of whole frames.
+@end table
+Not enabled by default.
+
+@item crf
+Set the quality/size tradeoff for constant-quality (no bitrate target)
+and constrained-quality (with maximum bitrate target) modes. Valid
+range is 0 to 63, higher numbers indicating lower quality and smaller
+output size. Only used if set; by default only the bitrate target is
+used.
+
+@item static-thresh
+Set a change threshold on blocks below which they will be skipped by
+the encoder. Defined in arbitrary units as a nonnegative integer,
+defaulting to zero (no blocks are skipped).
+
+@item drop-threshold
+Set a threshold for dropping frames when close to rate control bounds.
+Defined as a percentage of the target buffer - when the rate control
+buffer falls below this percentage, frames will be dropped until it
+has refilled above the threshold. Defaults to zero (no frames are
+dropped).
+
+@item denoise-noise-level (@emph{level})
+Amount of noise to be removed for grain synthesis. Grain synthesis is disabled if
+this option is not set or set to 0.
+
+@item denoise-block-size (@emph{pixels})
+Block size used for denoising for grain synthesis. If not set, AV1 codec
+uses the default value of 32.
+
+@item undershoot-pct (@emph{pct})
+Set datarate undershoot (min) percentage of the target bitrate. Range is -1 to 100.
+Default is -1.
+
+@item overshoot-pct (@emph{pct})
+Set datarate overshoot (max) percentage of the target bitrate. Range is -1 to 1000.
+Default is -1.
+
+@item minsection-pct (@emph{pct})
+Minimum percentage variation of the GOP bitrate from the target bitrate. If minsection-pct
+is not set, the libaomenc wrapper computes it as follows: @code{(minrate * 100 / bitrate)}.
+Range is -1 to 100. Default is -1 (unset).
+
+@item maxsection-pct (@emph{pct})
+Maximum percentage variation of the GOP bitrate from the target bitrate. If maxsection-pct
+is not set, the libaomenc wrapper computes it as follows: @code{(maxrate * 100 / bitrate)}.
+Range is -1 to 5000. Default is -1 (unset).
+
+@item frame-parallel (@emph{boolean})
+Enable frame parallel decodability features. Default is true.
+
+@item tiles
+Set the number of tiles to encode the input video with, as columns x
+rows. Larger numbers allow greater parallelism in both encoding and
+decoding, but may decrease coding efficiency. Defaults to the minimum
+number of tiles required by the size of the input video (this is 1x1
+(that is, a single tile) for sizes up to and including 4K).
+
+@item tile-columns tile-rows
+Set the number of tiles as log2 of the number of tile rows and columns.
+Provided for compatibility with libvpx/VP9.
+
+@item row-mt (Requires libaom >= 1.0.0-759-g90a15f4f2)
+Enable row based multi-threading. Disabled by default.
+
+@item enable-cdef (@emph{boolean})
+Enable Constrained Directional Enhancement Filter. The libaom-av1
+encoder enables CDEF by default.
+
+@item enable-restoration (@emph{boolean})
+Enable Loop Restoration Filter. Default is true for libaom-av1.
+
+@item enable-global-motion (@emph{boolean})
+Enable the use of global motion for block prediction. Default is true.
+
+@item enable-intrabc (@emph{boolean})
+Enable block copy mode for intra block prediction. This mode is
+useful for screen content. Default is true.
+
+@item enable-rect-partitions (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable rectangular partitions. Default is true.
+
+@item enable-1to4-partitions (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable 1:4/4:1 partitions. Default is true.
+
+@item enable-ab-partitions (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable AB shape partitions. Default is true.
+
+@item enable-angle-delta (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable angle delta intra prediction. Default is true.
+
+@item enable-cfl-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable chroma predicted from luma intra prediction. Default is true.
+
+@item enable-filter-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable filter intra predictor. Default is true.
+
+@item enable-intra-edge-filter (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable intra edge filter. Default is true.
+
+@item enable-smooth-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable smooth intra prediction mode. Default is true.
+
+@item enable-paeth-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable paeth predictor in intra prediction. Default is true.
+
+@item enable-palette (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable palette prediction mode. Default is true.
+
+@item enable-flip-idtx (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable extended transform type, including FLIPADST_DCT, DCT_FLIPADST,
+FLIPADST_FLIPADST, ADST_FLIPADST, FLIPADST_ADST, IDTX, V_DCT, H_DCT,
+V_ADST, H_ADST, V_FLIPADST, H_FLIPADST. Default is true.
+
+@item enable-tx64 (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable 64-pt transform. Default is true.
+
+@item reduced-tx-type-set (@emph{boolean}) (Requires libaom >= v2.0.0)
+Use reduced set of transform types. Default is false.
+
+@item use-intra-dct-only (@emph{boolean}) (Requires libaom >= v2.0.0)
+Use DCT only for INTRA modes. Default is false.
+
+@item use-inter-dct-only (@emph{boolean}) (Requires libaom >= v2.0.0)
+Use DCT only for INTER modes. Default is false.
+
+@item use-intra-default-tx-only (@emph{boolean}) (Requires libaom >= v2.0.0)
+Use Default-transform only for INTRA modes. Default is false.
+
+@item enable-ref-frame-mvs (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable temporal mv prediction. Default is true.
+
+@item enable-reduced-reference-set (@emph{boolean}) (Requires libaom >= v2.0.0)
+Use reduced set of single and compound references. Default is false.
+
+@item enable-obmc (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable obmc. Default is true.
+
+@item enable-dual-filter (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable dual filter. Default is true.
+
+@item enable-diff-wtd-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable difference-weighted compound. Default is true.
+
+@item enable-dist-wtd-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable distance-weighted compound. Default is true.
+
+@item enable-onesided-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable one sided compound. Default is true.
+
+@item enable-interinter-wedge (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable interinter wedge compound. Default is true.
+
+@item enable-interintra-wedge (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable interintra wedge compound. Default is true.
+
+@item enable-masked-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable masked compound. Default is true.
+
+@item enable-interintra-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable interintra compound. Default is true.
+
+@item enable-smooth-interintra (@emph{boolean}) (Requires libaom >= v2.0.0)
+Enable smooth interintra mode. Default is true.
+
+@item aom-params
+Set libaom options using a list of @var{key}=@var{value} pairs separated
+by ":". For a list of supported options, see @command{aomenc --help} under the
+section "AV1 Specific Options".
+
+For example to specify libaom encoding options with @option{-aom-params}:
+
+@example
+ffmpeg -i input -c:v libaom-av1 -b:v 500K -aom-params tune=psnr:enable-tpl-model=1 output.mp4
+@end example
+
+@end table
+
+@section libsvtav1
+
+SVT-AV1 encoder wrapper.
+
+Requires the presence of the SVT-AV1 headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-libsvtav1}.
+
+@subsection Options
+
+@table @option
+@item profile
+Set the encoding profile.
+
+@item level
+Set the operating point level.
+
+@item tier
+Set the operating point tier.
+
+@item rc
+Set the rate control mode to use.
+
+Possible modes:
+@table @option
+@item cqp
+Constant quantizer: use fixed values of qindex (dependent on the frame type)
+throughout the stream. This mode is the default.
+
+@item vbr
+Variable bitrate: use a target bitrate for the whole stream.
+
+@item cvbr
+Constrained variable bitrate: use a target bitrate for each GOP.
+@end table
+
+@item qmax
+Set the maximum quantizer to use when using a bitrate mode.
+
+@item qmin
+Set the minimum quantizer to use when using a bitrate mode.
+
+@item qp
+Set the quantizer used in cqp rate control mode (0-63).
+
+@item sc_detection
+Enable scene change detection.
+
+@item la_depth
+Set number of frames to look ahead (0-120).
+
+@item preset
+Set the quality-speed tradeoff, in the range 0 to 8. Higher values are
+faster but lower quality. Defaults to 8 (highest speed).
+
+@item tile_rows
+Set log2 of the number of rows of tiles to use (0-6).
+
+@item tile_columns
+Set log2 of the number of columns of tiles to use (0-4).
+
+@end table
+
+@section libkvazaar
+
+Kvazaar H.265/HEVC encoder.
+
+Requires the presence of the libkvazaar headers and library during
+configuration. You need to explicitly configure the build with
+@option{--enable-libkvazaar}.
+
+@subsection Options
+
+@table @option
+
+@item b
+Set target video bitrate in bit/s and enable rate control.
+
+@item kvazaar-params
+Set kvazaar parameters as a list of @var{name}=@var{value} pairs separated
+by commas (,). See kvazaar documentation for a list of options.
+
+@end table
+
+@section libopenh264
+
+Cisco libopenh264 H.264/MPEG-4 AVC encoder wrapper.
+
+This encoder requires the presence of the libopenh264 headers and
+library during configuration. You need to explicitly configure the
+build with @code{--enable-libopenh264}. The library is detected using
+@command{pkg-config}.
+
+For more information about the library see
+@url{http://www.openh264.org}.
+
+@subsection Options
+
+The following FFmpeg global options affect the configurations of the
+libopenh264 encoder.
+
+@table @option
+@item b
+Set the bitrate (as a number of bits per second).
+
+@item g
+Set the GOP size.
+
+@item maxrate
+Set the max bitrate (as a number of bits per second).
+
+@item flags +global_header
+Set global header in the bitstream.
+
+@item slices
+Set the number of slices, used in parallelized encoding. Default value
+is 0. This is only used when @option{slice_mode} is set to
+@samp{fixed}.
+
+@item slice_mode
+Set slice mode. Can assume one of the following possible values:
+
+@table @samp
+@item fixed
+a fixed number of slices
+@item rowmb
+one slice per row of macroblocks
+@item auto
+automatic number of slices according to number of threads
+@item dyn
+dynamic slicing
+@end table
+
+Default value is @samp{auto}.
+
+@item loopfilter
+Enable loop filter, if set to 1 (automatically enabled). To disable
+set a value of 0.
+
+@item profile
+Set profile restrictions. If set to the value of @samp{main} enable
+CABAC (set the @code{SEncParamExt.iEntropyCodingModeFlag} flag to 1).
+
+@item max_nal_size
+Set maximum NAL size in bytes.
+
+@item allow_skip_frames
+Allow skipping frames to hit the target bitrate if set to 1.
+@end table
+
+@section libtheora
+
+libtheora Theora encoder wrapper.
+
+Requires the presence of the libtheora headers and library during
+configuration. You need to explicitly configure the build with
+@code{--enable-libtheora}.
+
+For more information about the libtheora project see
+@url{http://www.theora.org/}.
+
+@subsection Options
+
+The following global options are mapped to internal libtheora options
+which affect the quality and the bitrate of the encoded stream.
+
+@table @option
+@item b
+Set the video bitrate in bit/s for CBR (Constant Bit Rate) mode. In
+case VBR (Variable Bit Rate) mode is enabled this option is ignored.
+
+@item flags
+Used to enable constant quality mode (VBR) encoding through the
+@option{qscale} flag, and to enable the @code{pass1} and @code{pass2}
+modes.
+
+@item g
+Set the GOP size.
+
+@item global_quality
+Set the global quality as an integer in lambda units.
+
+Only relevant when VBR mode is enabled with @code{flags +qscale}. The
+value is converted to QP units by dividing it by @code{FF_QP2LAMBDA},
+clipped in the [0 - 10] range, and then multiplied by 6.3 to get a
+value in the native libtheora range [0-63]. A higher value corresponds
+to a higher quality.
+
+@item q
+Enable VBR mode when set to a non-negative value, and set constant
+quality value as a double floating point value in QP units.
+
+The value is clipped in the [0-10] range, and then multiplied by 6.3
+to get a value in the native libtheora range [0-63].
+
+This option is valid only using the @command{ffmpeg} command-line
+tool. For library interface users, use @option{global_quality}.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Set maximum constant quality (VBR) encoding with @command{ffmpeg}:
+@example
+ffmpeg -i INPUT -codec:v libtheora -q:v 10 OUTPUT.ogg
+@end example
+
+@item
+Use @command{ffmpeg} to convert a CBR 1000 kbps Theora video stream:
+@example
+ffmpeg -i INPUT -codec:v libtheora -b:v 1000k OUTPUT.ogg
+@end example
+@end itemize
+
+@section libvpx
+
+VP8/VP9 format supported through libvpx.
+
+Requires the presence of the libvpx headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-libvpx}.
+
+@subsection Options
+
+The following options are supported by the libvpx wrapper. The
+@command{vpxenc}-equivalent options or values are listed in parentheses
+for easy migration.
+
+To reduce the duplication of documentation, only the private options
+and some others requiring special attention are documented here. For
+the documentation of the undocumented generic options, see
+@ref{codec-options,,the Codec Options chapter}.
+
+To get more documentation of the libvpx options, invoke the command
+@command{ffmpeg -h encoder=libvpx}, @command{ffmpeg -h encoder=libvpx-vp9} or
+@command{vpxenc --help}. Further information is available in the libvpx API
+documentation.
+
+@table @option
+
+@item b (@emph{target-bitrate})
+Set bitrate in bits/s. Note that FFmpeg's @option{b} option is
+expressed in bits/s, while @command{vpxenc}'s @option{target-bitrate} is in
+kilobits/s.
+
+@item g (@emph{kf-max-dist})
+
+@item keyint_min (@emph{kf-min-dist})
+
+@item qmin (@emph{min-q})
+
+@item qmax (@emph{max-q})
+
+@item bufsize (@emph{buf-sz}, @emph{buf-optimal-sz})
+Set ratecontrol buffer size (in bits). Note @command{vpxenc}'s options are
+specified in milliseconds, the libvpx wrapper converts this value as follows:
+@code{buf-sz = bufsize * 1000 / bitrate},
+@code{buf-optimal-sz = bufsize * 1000 / bitrate * 5 / 6}.
+
+@item rc_init_occupancy (@emph{buf-initial-sz})
+Set number of bits which should be loaded into the rc buffer before decoding
+starts. Note @command{vpxenc}'s option is specified in milliseconds, the libvpx
+wrapper converts this value as follows:
+@code{rc_init_occupancy * 1000 / bitrate}.
+
+@item undershoot-pct
+Set datarate undershoot (min) percentage of the target bitrate.
+
+@item overshoot-pct
+Set datarate overshoot (max) percentage of the target bitrate.
+
+@item skip_threshold (@emph{drop-frame})
+
+@item qcomp (@emph{bias-pct})
+
+@item maxrate (@emph{maxsection-pct})
+Set GOP max bitrate in bits/s. Note @command{vpxenc}'s option is specified as a
+percentage of the target bitrate, the libvpx wrapper converts this value as
+follows: @code{(maxrate * 100 / bitrate)}.
+
+@item minrate (@emph{minsection-pct})
+Set GOP min bitrate in bits/s. Note @command{vpxenc}'s option is specified as a
+percentage of the target bitrate, the libvpx wrapper converts this value as
+follows: @code{(minrate * 100 / bitrate)}.
+
+@item minrate, maxrate, b @emph{end-usage=cbr}
+@code{(minrate == maxrate == bitrate)}.
+
+@item crf (@emph{end-usage=cq}, @emph{cq-level})
+
+@item tune (@emph{tune})
+@table @samp
+@item psnr (@emph{psnr})
+@item ssim (@emph{ssim})
+@end table
+
+@item quality, deadline (@emph{deadline})
+@table @samp
+@item best
+Use best quality deadline. Poorly named and quite slow, this option should be
+avoided as it may give worse quality output than good.
+@item good
+Use good quality deadline. This is a good trade-off between speed and quality
+when used with the @option{cpu-used} option.
+@item realtime
+Use realtime quality deadline.
+@end table
+
+@item speed, cpu-used (@emph{cpu-used})
+Set quality/speed ratio modifier. Higher values speed up the encode at the cost
+of quality.
+
+@item nr (@emph{noise-sensitivity})
+
+@item static-thresh
+Set a change threshold on blocks below which they will be skipped by the
+encoder.
+
+@item slices (@emph{token-parts})
+Note that FFmpeg's @option{slices} option gives the total number of partitions,
+while @command{vpxenc}'s @option{token-parts} is given as
+@code{log2(partitions)}.
+
+@item max-intra-rate
+Set maximum I-frame bitrate as a percentage of the target bitrate. A value of 0
+means unlimited.
+
+@item force_key_frames
+@code{VPX_EFLAG_FORCE_KF}
+
+@item Alternate reference frame related
+@table @option
+@item auto-alt-ref
+Enable use of alternate reference frames (2-pass only).
+Values greater than 1 enable multi-layer alternate reference frames (VP9 only).
+@item arnr-maxframes
+Set altref noise reduction max frame count.
+@item arnr-type
+Set altref noise reduction filter type: backward, forward, centered.
+@item arnr-strength
+Set altref noise reduction filter strength.
+@item rc-lookahead, lag-in-frames (@emph{lag-in-frames})
+Set number of frames to look ahead for frametype and ratecontrol.
+@end table
+
+@item error-resilient
+Enable error resiliency features.
+
+@item sharpness @var{integer}
+Increase sharpness at the expense of lower PSNR.
+The valid range is [0, 7].
+
+@item ts-parameters
+Sets the temporal scalability configuration using a :-separated list of
+key=value pairs. For example, to specify temporal scalability parameters
+with @code{ffmpeg}:
+@example
+ffmpeg -i INPUT -c:v libvpx -ts-parameters ts_number_layers=3:\
+ts_target_bitrate=250,500,1000:ts_rate_decimator=4,2,1:\
+ts_periodicity=4:ts_layer_id=0,2,1,2:ts_layering_mode=3 OUTPUT
+@end example
+Below is a brief explanation of each of the parameters, please
+refer to @code{struct vpx_codec_enc_cfg} in @code{vpx/vpx_encoder.h} for more
+details.
+@table @option
+@item ts_number_layers
+Number of temporal coding layers.
+@item ts_target_bitrate
+Target bitrate for each temporal layer (in kbps).
+(bitrate should be inclusive of the lower temporal layer).
+@item ts_rate_decimator
+Frame rate decimation factor for each temporal layer.
+@item ts_periodicity
+Length of the sequence defining frame temporal layer membership.
+@item ts_layer_id
+Template defining the membership of frames to temporal layers.
+@item ts_layering_mode
+(optional) Selecting the temporal structure from a set of pre-defined temporal layering modes.
+Currently supports the following options.
+@table @option
+@item 0
+No temporal layering flags are provided internally,
+relies on flags being passed in using @code{metadata} field in @code{AVFrame}
+with following keys.
+@table @option
+@item vp8-flags
+Sets the flags passed into the encoder to indicate the referencing scheme for
+the current frame.
+Refer to function @code{vpx_codec_encode} in @code{vpx/vpx_encoder.h} for more
+details.
+@item temporal_id
+Explicitly sets the temporal id of the current frame to encode.
+@end table
+@item 2
+Two temporal layers. 0-1...
+@item 3
+Three temporal layers. 0-2-1-2...; with single reference frame.
+@item 4
+Same as option "3", except there is a dependency between
+the two temporal layer 2 frames within the temporal period.
+@end table
+@end table
+
+@item VP9-specific options
+@table @option
+@item lossless
+Enable lossless mode.
+@item tile-columns
+Set number of tile columns to use. Note this is given as
+@code{log2(tile_columns)}. For example, 8 tile columns would be requested by
+setting the @option{tile-columns} option to 3.
+@item tile-rows
+Set number of tile rows to use. Note this is given as @code{log2(tile_rows)}.
+For example, 4 tile rows would be requested by setting the @option{tile-rows}
+option to 2.
+@item frame-parallel
+Enable frame parallel decodability features.
+@item aq-mode
+Set adaptive quantization mode (0: off (default), 1: variance 2: complexity, 3:
+cyclic refresh, 4: equator360).
+@item colorspace @emph{color-space}
+Set input color space. The VP9 bitstream supports signaling the following
+colorspaces:
+@table @option
+@item @samp{rgb} @emph{sRGB}
+@item @samp{bt709} @emph{bt709}
+@item @samp{unspecified} @emph{unknown}
+@item @samp{bt470bg} @emph{bt601}
+@item @samp{smpte170m} @emph{smpte170}
+@item @samp{smpte240m} @emph{smpte240}
+@item @samp{bt2020_ncl} @emph{bt2020}
+@end table
+@item row-mt @var{boolean}
+Enable row based multi-threading.
+@item tune-content
+Set content type: default (0), screen (1), film (2).
+@item corpus-complexity
+Corpus VBR mode is a variant of standard VBR where the complexity distribution
+midpoint is passed in rather than calculated for a specific clip or chunk.
+
+The valid range is [0, 10000]. 0 (default) uses standard VBR.
+@item enable-tpl @var{boolean}
+Enable temporal dependency model.
+@item ref-frame-config
+Using per-frame metadata, set members of the structure @code{vpx_svc_ref_frame_config_t} in @code{vpx/vp8cx.h} to fine-control referencing schemes and frame buffer management.
+@*Use a :-separated list of key=value pairs.
+For example,
+@example
+av_dict_set(&av_frame->metadata, "ref-frame-config", \
+"rfc_update_buffer_slot=7:rfc_lst_fb_idx=0:rfc_gld_fb_idx=1:rfc_alt_fb_idx=2:rfc_reference_last=0:rfc_reference_golden=0:rfc_reference_alt_ref=0");
+@end example
+@table @option
+@item rfc_update_buffer_slot
+Indicates the buffer slot number to update
+@item rfc_update_last
+Indicates whether to update the LAST frame
+@item rfc_update_golden
+Indicates whether to update GOLDEN frame
+@item rfc_update_alt_ref
+Indicates whether to update ALT_REF frame
+@item rfc_lst_fb_idx
+LAST frame buffer index
+@item rfc_gld_fb_idx
+GOLDEN frame buffer index
+@item rfc_alt_fb_idx
+ALT_REF frame buffer index
+@item rfc_reference_last
+Indicates whether to reference LAST frame
+@item rfc_reference_golden
+Indicates whether to reference GOLDEN frame
+@item rfc_reference_alt_ref
+Indicates whether to reference ALT_REF frame
+@item rfc_reference_duration
+Indicates frame duration
+@end table
+@end table
+
+@end table
+
+For more information about libvpx see:
+@url{http://www.webmproject.org/}
+
+@section libwebp
+
+libwebp WebP Image encoder wrapper
+
+libwebp is Google's official encoder for WebP images. It can encode in either
+lossy or lossless mode. Lossy images are essentially a wrapper around a VP8
+frame. Lossless images are a separate codec developed by Google.
+
+@subsection Pixel Format
+
+Currently, libwebp only supports YUV420 for lossy and RGB for lossless due
+to limitations of the format and libwebp. Alpha is supported for either mode.
+Because of API limitations, if RGB is passed in when encoding lossy or YUV is
+passed in for encoding lossless, the pixel format will automatically be
+converted using functions from libwebp. This is not ideal and is done only for
+convenience.
+
+@subsection Options
+
+@table @option
+
+@item -lossless @var{boolean}
+Enables/Disables use of lossless mode. Default is 0.
+
+@item -compression_level @var{integer}
+For lossy, this is a quality/speed tradeoff. Higher values give better quality
+for a given size at the cost of increased encoding time. For lossless, this is
+a size/speed tradeoff. Higher values give smaller size at the cost of increased
+encoding time. More specifically, it controls the number of extra algorithms
+and compression tools used, and varies the combination of these tools. This
+maps to the @var{method} option in libwebp. The valid range is 0 to 6.
+Default is 4.
+
+@item -qscale @var{float}
+For lossy encoding, this controls image quality, 0 to 100. For lossless
+encoding, this controls the effort and time spent at compressing more. The
+default value is 75. Note that for usage via libavcodec, this option is called
+@var{global_quality} and must be multiplied by @var{FF_QP2LAMBDA}.
+
+@item -preset @var{type}
+Configuration preset. This does some automatic settings based on the general
+type of the image.
+@table @option
+@item none
+Do not use a preset.
+@item default
+Use the encoder default.
+@item picture
+Digital picture, like portrait, inner shot
+@item photo
+Outdoor photograph, with natural lighting
+@item drawing
+Hand or line drawing, with high-contrast details
+@item icon
+Small-sized colorful images
+@item text
+Text-like
+@end table
+
+@end table
+
+@section libx264, libx264rgb
+
+x264 H.264/MPEG-4 AVC encoder wrapper.
+
+This encoder requires the presence of the libx264 headers and library
+during configuration. You need to explicitly configure the build with
+@code{--enable-libx264}.
+
+libx264 supports an impressive number of features, including 8x8 and
+4x4 adaptive spatial transform, adaptive B-frame placement, CAVLC/CABAC
+entropy coding, interlacing (MBAFF), lossless mode, psy optimizations
+for detail retention (adaptive quantization, psy-RD, psy-trellis).
+
+Many libx264 encoder options are mapped to FFmpeg global codec
+options, while unique encoder options are provided through private
+options. Additionally the @option{x264opts} and @option{x264-params}
+private options allows one to pass a list of key=value tuples as accepted
+by the libx264 @code{x264_param_parse} function.
+
+The x264 project website is at
+@url{http://www.videolan.org/developers/x264.html}.
+
+The libx264rgb encoder is the same as libx264, except it accepts packed RGB
+pixel formats as input instead of YUV.
+
+@subsection Supported Pixel Formats
+
+x264 supports 8- to 10-bit color spaces. The exact bit depth is controlled at
+x264's configure time.
+
+@subsection Options
+
+The following options are supported by the libx264 wrapper. The
+@command{x264}-equivalent options or values are listed in parentheses
+for easy migration.
+
+To reduce the duplication of documentation, only the private options
+and some others requiring special attention are documented here. For
+the documentation of the undocumented generic options, see
+@ref{codec-options,,the Codec Options chapter}.
+
+To get a more accurate and extensive documentation of the libx264
+options, invoke the command @command{x264 --fullhelp} or consult
+the libx264 documentation.
+
+@table @option
+@item b (@emph{bitrate})
+Set bitrate in bits/s. Note that FFmpeg's @option{b} option is
+expressed in bits/s, while @command{x264}'s @option{bitrate} is in
+kilobits/s.
+
+@item bf (@emph{bframes})
+
+@item g (@emph{keyint})
+
+@item qmin (@emph{qpmin})
+Minimum quantizer scale.
+
+@item qmax (@emph{qpmax})
+Maximum quantizer scale.
+
+@item qdiff (@emph{qpstep})
+Maximum difference between quantizer scales.
+
+@item qblur (@emph{qblur})
+Quantizer curve blur
+
+@item qcomp (@emph{qcomp})
+Quantizer curve compression factor
+
+@item refs (@emph{ref})
+Number of reference frames each P-frame can use. The range is from @var{0-16}.
+
+@item sc_threshold (@emph{scenecut})
+Sets the threshold for the scene change detection.
+
+@item trellis (@emph{trellis})
+Performs Trellis quantization to increase efficiency. Enabled by default.
+
+@item nr (@emph{nr})
+
+@item me_range (@emph{merange})
+Maximum range of the motion search in pixels.
+
+@item me_method (@emph{me})
+Set motion estimation method. Possible values in the decreasing order
+of speed:
+
+@table @samp
+@item dia (@emph{dia})
+@item epzs (@emph{dia})
+Diamond search with radius 1 (fastest). @samp{epzs} is an alias for
+@samp{dia}.
+@item hex (@emph{hex})
+Hexagonal search with radius 2.
+@item umh (@emph{umh})
+Uneven multi-hexagon search.
+@item esa (@emph{esa})
+Exhaustive search.
+@item tesa (@emph{tesa})
+Hadamard exhaustive search (slowest).
+@end table
+
+@item forced-idr
+Normally, when forcing a I-frame type, the encoder can select any type
+of I-frame. This option forces it to choose an IDR-frame.
+
+@item subq (@emph{subme})
+Sub-pixel motion estimation method.
+
+@item b_strategy (@emph{b-adapt})
+Adaptive B-frame placement decision algorithm. Use only on first-pass.
+
+@item keyint_min (@emph{min-keyint})
+Minimum GOP size.
+
+@item coder
+Set entropy encoder. Possible values:
+
+@table @samp
+@item ac
+Enable CABAC.
+
+@item vlc
+Enable CAVLC and disable CABAC. It generates the same effect as
+@command{x264}'s @option{--no-cabac} option.
+@end table
+
+@item cmp
+Set full pixel motion estimation comparison algorithm. Possible values:
+
+@table @samp
+@item chroma
+Enable chroma in motion estimation.
+
+@item sad
+Ignore chroma in motion estimation. It generates the same effect as
+@command{x264}'s @option{--no-chroma-me} option.
+@end table
+
+@item threads (@emph{threads})
+Number of encoding threads.
+
+@item thread_type
+Set multithreading technique. Possible values:
+
+@table @samp
+@item slice
+Slice-based multithreading. It generates the same effect as
+@command{x264}'s @option{--sliced-threads} option.
+@item frame
+Frame-based multithreading.
+@end table
+
+@item flags
+Set encoding flags. It can be used to disable closed GOP and enable
+open GOP by setting it to @code{-cgop}. The result is similar to
+the behavior of @command{x264}'s @option{--open-gop} option.
+
+@item rc_init_occupancy (@emph{vbv-init})
+
+@item preset (@emph{preset})
+Set the encoding preset.
+
+@item tune (@emph{tune})
+Set tuning of the encoding params.
+
+@item profile (@emph{profile})
+Set profile restrictions.
+
+@item fastfirstpass
+Enable fast settings when encoding first pass, when set to 1. When set
+to 0, it has the same effect of @command{x264}'s
+@option{--slow-firstpass} option.
+
+@item crf (@emph{crf})
+Set the quality for constant quality mode.
+
+@item crf_max (@emph{crf-max})
+In CRF mode, prevents VBV from lowering quality beyond this point.
+
+@item qp (@emph{qp})
+Set constant quantization rate control method parameter.
+
+@item aq-mode (@emph{aq-mode})
+Set AQ method. Possible values:
+
+@table @samp
+@item none (@emph{0})
+Disabled.
+
+@item variance (@emph{1})
+Variance AQ (complexity mask).
+
+@item autovariance (@emph{2})
+Auto-variance AQ (experimental).
+@end table
+
+@item aq-strength (@emph{aq-strength})
+Set AQ strength, reduce blocking and blurring in flat and textured areas.
+
+@item psy
+Use psychovisual optimizations when set to 1. When set to 0, it has the
+same effect as @command{x264}'s @option{--no-psy} option.
+
+@item psy-rd (@emph{psy-rd})
+Set strength of psychovisual optimization, in
+@var{psy-rd}:@var{psy-trellis} format.
+
+@item rc-lookahead (@emph{rc-lookahead})
+Set number of frames to look ahead for frametype and ratecontrol.
+
+@item weightb
+Enable weighted prediction for B-frames when set to 1. When set to 0,
+it has the same effect as @command{x264}'s @option{--no-weightb} option.
+
+@item weightp (@emph{weightp})
+Set weighted prediction method for P-frames. Possible values:
+
+@table @samp
+@item none (@emph{0})
+Disabled
+@item simple (@emph{1})
+Enable only weighted refs
+@item smart (@emph{2})
+Enable both weighted refs and duplicates
+@end table
+
+@item ssim (@emph{ssim})
+Enable calculation and printing SSIM stats after the encoding.
+
+@item intra-refresh (@emph{intra-refresh})
+Enable the use of Periodic Intra Refresh instead of IDR frames when set
+to 1.
+
+@item avcintra-class (@emph{class})
+Configure the encoder to generate AVC-Intra.
+Valid values are 50,100 and 200
+
+@item bluray-compat (@emph{bluray-compat})
+Configure the encoder to be compatible with the bluray standard.
+It is a shorthand for setting "bluray-compat=1 force-cfr=1".
+
+@item b-bias (@emph{b-bias})
+Set the influence on how often B-frames are used.
+
+@item b-pyramid (@emph{b-pyramid})
+Set method for keeping of some B-frames as references. Possible values:
+
+@table @samp
+@item none (@emph{none})
+Disabled.
+@item strict (@emph{strict})
+Strictly hierarchical pyramid.
+@item normal (@emph{normal})
+Non-strict (not Blu-ray compatible).
+@end table
+
+@item mixed-refs
+Enable the use of one reference per partition, as opposed to one
+reference per macroblock when set to 1. When set to 0, it has the
+same effect as @command{x264}'s @option{--no-mixed-refs} option.
+
+@item 8x8dct
+Enable adaptive spatial transform (high profile 8x8 transform)
+when set to 1. When set to 0, it has the same effect as
+@command{x264}'s @option{--no-8x8dct} option.
+
+@item fast-pskip
+Enable early SKIP detection on P-frames when set to 1. When set
+to 0, it has the same effect as @command{x264}'s
+@option{--no-fast-pskip} option.
+
+@item aud (@emph{aud})
+Enable use of access unit delimiters when set to 1.
+
+@item mbtree
+Enable use macroblock tree ratecontrol when set to 1. When set
+to 0, it has the same effect as @command{x264}'s
+@option{--no-mbtree} option.
+
+@item deblock (@emph{deblock})
+Set loop filter parameters, in @var{alpha}:@var{beta} form.
+
+@item cplxblur (@emph{cplxblur})
+Set fluctuations reduction in QP (before curve compression).
+
+@item partitions (@emph{partitions})
+Set partitions to consider as a comma-separated list of. Possible
+values in the list:
+
+@table @samp
+@item p8x8
+8x8 P-frame partition.
+@item p4x4
+4x4 P-frame partition.
+@item b8x8
+4x4 B-frame partition.
+@item i8x8
+8x8 I-frame partition.
+@item i4x4
+4x4 I-frame partition.
+(Enabling @samp{p4x4} requires @samp{p8x8} to be enabled. Enabling
+@samp{i8x8} requires adaptive spatial transform (@option{8x8dct}
+option) to be enabled.)
+@item none (@emph{none})
+Do not consider any partitions.
+@item all (@emph{all})
+Consider every partition.
+@end table
+
+@item direct-pred (@emph{direct})
+Set direct MV prediction mode. Possible values:
+
+@table @samp
+@item none (@emph{none})
+Disable MV prediction.
+@item spatial (@emph{spatial})
+Enable spatial predicting.
+@item temporal (@emph{temporal})
+Enable temporal predicting.
+@item auto (@emph{auto})
+Automatically decided.
+@end table
+
+@item slice-max-size (@emph{slice-max-size})
+Set the limit of the size of each slice in bytes. If not specified
+but RTP payload size (@option{ps}) is specified, that is used.
+
+@item stats (@emph{stats})
+Set the file name for multi-pass stats.
+
+@item nal-hrd (@emph{nal-hrd})
+Set signal HRD information (requires @option{vbv-bufsize} to be set).
+Possible values:
+
+@table @samp
+@item none (@emph{none})
+Disable HRD information signaling.
+@item vbr (@emph{vbr})
+Variable bit rate.
+@item cbr (@emph{cbr})
+Constant bit rate (not allowed in MP4 container).
+@end table
+
+@item x264opts (N.A.)
+Set any x264 option, see @command{x264 --fullhelp} for a list.
+
+Argument is a list of @var{key}=@var{value} couples separated by
+":". In @var{filter} and @var{psy-rd} options that use ":" as a separator
+themselves, use "," instead. They accept it as well since long ago but this
+is kept undocumented for some reason.
+
+For example to specify libx264 encoding options with @command{ffmpeg}:
+@example
+ffmpeg -i foo.mpg -c:v libx264 -x264opts keyint=123:min-keyint=20 -an out.mkv
+@end example
+
+@item a53cc @var{boolean}
+Import closed captions (which must be ATSC compatible format) into output.
+Only the mpeg2 and h264 decoders provide these. Default is 1 (on).
+
+@item x264-params (N.A.)
+Override the x264 configuration using a :-separated list of key=value
+parameters.
+
+This option is functionally the same as the @option{x264opts}, but is
+duplicated for compatibility with the Libav fork.
+
+For example to specify libx264 encoding options with @command{ffmpeg}:
+@example
+ffmpeg -i INPUT -c:v libx264 -x264-params level=30:bframes=0:weightp=0:\
+cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:\
+no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT
+@end example
+@end table
+
+Encoding ffpresets for common usages are provided so they can be used with the
+general presets system (e.g. passing the @option{pre} option).
+
+@section libx265
+
+x265 H.265/HEVC encoder wrapper.
+
+This encoder requires the presence of the libx265 headers and library
+during configuration. You need to explicitly configure the build with
+@option{--enable-libx265}.
+
+@subsection Options
+
+@table @option
+@item b
+Sets target video bitrate.
+
+@item bf
+
+@item g
+Set the GOP size.
+
+@item keyint_min
+Minimum GOP size.
+
+@item refs
+Number of reference frames each P-frame can use. The range is from @var{1-16}.
+
+@item preset
+Set the x265 preset.
+
+@item tune
+Set the x265 tune parameter.
+
+@item profile
+Set profile restrictions.
+
+@item crf
+Set the quality for constant quality mode.
+
+@item qp
+Set constant quantization rate control method parameter.
+
+@item qmin
+Minimum quantizer scale.
+
+@item qmax
+Maximum quantizer scale.
+
+@item qdiff
+Maximum difference between quantizer scales.
+
+@item qblur
+Quantizer curve blur
+
+@item qcomp
+Quantizer curve compression factor
+
+@item i_qfactor
+
+@item b_qfactor
+
+@item forced-idr
+Normally, when forcing a I-frame type, the encoder can select any type
+of I-frame. This option forces it to choose an IDR-frame.
+
+@item x265-params
+Set x265 options using a list of @var{key}=@var{value} couples separated
+by ":". See @command{x265 --help} for a list of options.
+
+For example to specify libx265 encoding options with @option{-x265-params}:
+
+@example
+ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4
+@end example
+@end table
+
+@section libxavs2
+
+xavs2 AVS2-P2/IEEE1857.4 encoder wrapper.
+
+This encoder requires the presence of the libxavs2 headers and library
+during configuration. You need to explicitly configure the build with
+@option{--enable-libxavs2}.
+
+The following standard libavcodec options are used:
+@itemize
+@item
+@option{b} / @option{bit_rate}
+@item
+@option{g} / @option{gop_size}
+@item
+@option{bf} / @option{max_b_frames}
+@end itemize
+
+The encoder also has its own specific options:
+@subsection Options
+
+@table @option
+@item lcu_row_threads
+Set the number of parallel threads for rows from 1 to 8 (default 5).
+
+@item initial_qp
+Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
+used to set the initial qp for the first frame.
+
+@item qp
+Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
+used to set the qp value under constant-QP mode.
+
+@item max_qp
+Set the max qp for rate control from 1 to 63 (default 55).
+
+@item min_qp
+Set the min qp for rate control from 1 to 63 (default 20).
+
+@item speed_level
+Set the Speed level from 0 to 9 (default 0). Higher is better but slower.
+
+@item log_level
+Set the log level from -1 to 3 (default 0). -1: none, 0: error,
+1: warning, 2: info, 3: debug.
+
+@item xavs2-params
+Set xavs2 options using a list of @var{key}=@var{value} couples separated
+by ":".
+
+For example to specify libxavs2 encoding options with @option{-xavs2-params}:
+
+@example
+ffmpeg -i input -c:v libxavs2 -xavs2-params RdoqLevel=0 output.avs2
+@end example
+@end table
+
+@section libxvid
+
+Xvid MPEG-4 Part 2 encoder wrapper.
+
+This encoder requires the presence of the libxvidcore headers and library
+during configuration. You need to explicitly configure the build with
+@code{--enable-libxvid --enable-gpl}.
+
+The native @code{mpeg4} encoder supports the MPEG-4 Part 2 format, so
+users can encode to this format without this library.
+
+@subsection Options
+
+The following options are supported by the libxvid wrapper. Some of
+the following options are listed but are not documented, and
+correspond to shared codec options. See @ref{codec-options,,the Codec
+Options chapter} for their documentation. The other shared options
+which are not listed have no effect for the libxvid encoder.
+
+@table @option
+@item b
+
+@item g
+
+@item qmin
+
+@item qmax
+
+@item mpeg_quant
+
+@item threads
+
+@item bf
+
+@item b_qfactor
+
+@item b_qoffset
+
+@item flags
+Set specific encoding flags. Possible values:
+
+@table @samp
+
+@item mv4
+Use four motion vector by macroblock.
+
+@item aic
+Enable high quality AC prediction.
+
+@item gray
+Only encode grayscale.
+
+@item gmc
+Enable the use of global motion compensation (GMC).
+
+@item qpel
+Enable quarter-pixel motion compensation.
+
+@item cgop
+Enable closed GOP.
+
+@item global_header
+Place global headers in extradata instead of every keyframe.
+
+@end table
+
+@item trellis
+
+@item me_method
+Set motion estimation method. Possible values in decreasing order of
+speed and increasing order of quality:
+
+@table @samp
+@item zero
+Use no motion estimation (default).
+
+@item phods
+@item x1
+@item log
+Enable advanced diamond zonal search for 16x16 blocks and half-pixel
+refinement for 16x16 blocks. @samp{x1} and @samp{log} are aliases for
+@samp{phods}.
+
+@item epzs
+Enable all of the things described above, plus advanced diamond zonal
+search for 8x8 blocks, half-pixel refinement for 8x8 blocks, and motion
+estimation on chroma planes.
+
+@item full
+Enable all of the things described above, plus extended 16x16 and 8x8
+blocks search.
+@end table
+
+@item mbd
+Set macroblock decision algorithm. Possible values in the increasing
+order of quality:
+
+@table @samp
+@item simple
+Use macroblock comparing function algorithm (default).
+
+@item bits
+Enable rate distortion-based half pixel and quarter pixel refinement for
+16x16 blocks.
+
+@item rd
+Enable all of the things described above, plus rate distortion-based
+half pixel and quarter pixel refinement for 8x8 blocks, and rate
+distortion-based search using square pattern.
+@end table
+
+@item lumi_aq
+Enable lumi masking adaptive quantization when set to 1. Default is 0
+(disabled).
+
+@item variance_aq
+Enable variance adaptive quantization when set to 1. Default is 0
+(disabled).
+
+When combined with @option{lumi_aq}, the resulting quality will not
+be better than any of the two specified individually. In other
+words, the resulting quality will be the worse one of the two
+effects.
+
+@item ssim
+Set structural similarity (SSIM) displaying method. Possible values:
+
+@table @samp
+@item off
+Disable displaying of SSIM information.
+
+@item avg
+Output average SSIM at the end of encoding to stdout. The format of
+showing the average SSIM is:
+
+@example
+Average SSIM: %f
+@end example
+
+For users who are not familiar with C, %f means a float number, or
+a decimal (e.g. 0.939232).
+
+@item frame
+Output both per-frame SSIM data during encoding and average SSIM at
+the end of encoding to stdout. The format of per-frame information
+is:
+
+@example
+ SSIM: avg: %1.3f min: %1.3f max: %1.3f
+@end example
+
+For users who are not familiar with C, %1.3f means a float number
+rounded to 3 digits after the dot (e.g. 0.932).
+
+@end table
+
+@item ssim_acc
+Set SSIM accuracy. Valid options are integers within the range of
+0-4, while 0 gives the most accurate result and 4 computes the
+fastest.
+
+@end table
+
+@section MediaFoundation
+
+This provides wrappers to encoders (both audio and video) in the
+MediaFoundation framework. It can access both SW and HW encoders.
+Video encoders can take input in either of nv12 or yuv420p form
+(some encoders support both, some support only either - in practice,
+nv12 is the safer choice, especially among HW encoders).
+
+@section mpeg2
+
+MPEG-2 video encoder.
+
+@subsection Options
+
+@table @option
+@item profile
+Select the mpeg2 profile to encode:
+
+@table @samp
+@item 422
+@item high
+@item ss
+Spatially Scalable
+@item snr
+SNR Scalable
+@item main
+@item simple
+@end table
+
+@item level
+Select the mpeg2 level to encode:
+
+@table @samp
+@item high
+@item high1440
+@item main
+@item low
+@end table
+
+@item seq_disp_ext @var{integer}
+Specifies if the encoder should write a sequence_display_extension to the
+output.
+@table @option
+@item -1
+@itemx auto
+Decide automatically to write it or not (this is the default) by checking if
+the data to be written is different from the default or unspecified values.
+@item 0
+@itemx never
+Never write it.
+@item 1
+@itemx always
+Always write it.
+@end table
+@item video_format @var{integer}
+Specifies the video_format written into the sequence display extension
+indicating the source of the video pictures. The default is @samp{unspecified},
+can be @samp{component}, @samp{pal}, @samp{ntsc}, @samp{secam} or @samp{mac}.
+For maximum compatibility, use @samp{component}.
+@item a53cc @var{boolean}
+Import closed captions (which must be ATSC compatible format) into output.
+Default is 1 (on).
+@end table
+
+@section png
+
+PNG image encoder.
+
+@subsection Private options
+
+@table @option
+@item dpi @var{integer}
+Set physical density of pixels, in dots per inch, unset by default
+@item dpm @var{integer}
+Set physical density of pixels, in dots per meter, unset by default
+@end table
+
+@section ProRes
+
+Apple ProRes encoder.
+
+FFmpeg contains 2 ProRes encoders, the prores-aw and prores-ks encoder.
+The used encoder can be chosen with the @code{-vcodec} option.
+
+@subsection Private Options for prores-ks
+
+@table @option
+@item profile @var{integer}
+Select the ProRes profile to encode
+@table @samp
+@item proxy
+@item lt
+@item standard
+@item hq
+@item 4444
+@item 4444xq
+@end table
+
+@item quant_mat @var{integer}
+Select quantization matrix.
+@table @samp
+@item auto
+@item default
+@item proxy
+@item lt
+@item standard
+@item hq
+@end table
+If set to @var{auto}, the matrix matching the profile will be picked.
+If not set, the matrix providing the highest quality, @var{default}, will be
+picked.
+
+@item bits_per_mb @var{integer}
+How many bits to allot for coding one macroblock. Different profiles use
+between 200 and 2400 bits per macroblock, the maximum is 8000.
+
+@item mbs_per_slice @var{integer}
+Number of macroblocks in each slice (1-8); the default value (8)
+should be good in almost all situations.
+
+@item vendor @var{string}
+Override the 4-byte vendor ID.
+A custom vendor ID like @var{apl0} would claim the stream was produced by
+the Apple encoder.
+
+@item alpha_bits @var{integer}
+Specify number of bits for alpha component.
+Possible values are @var{0}, @var{8} and @var{16}.
+Use @var{0} to disable alpha plane coding.
+
+@end table
+
+@subsection Speed considerations
+
+In the default mode of operation the encoder has to honor frame constraints
+(i.e. not produce frames with size bigger than requested) while still making
+output picture as good as possible.
+A frame containing a lot of small details is harder to compress and the encoder
+would spend more time searching for appropriate quantizers for each slice.
+
+Setting a higher @option{bits_per_mb} limit will improve the speed.
+
+For the fastest encoding speed set the @option{qscale} parameter (4 is the
+recommended value) and do not set a size constraint.
+
+@section QSV encoders
+
+The family of Intel QuickSync Video encoders (MPEG-2, H.264, HEVC, JPEG/MJPEG and VP9)
+
+The ratecontrol method is selected as follows:
+
+@itemize @bullet
+@item
+When @option{global_quality} is specified, a quality-based mode is used.
+Specifically this means either
+@itemize @minus
+@item
+@var{CQP} - constant quantizer scale, when the @option{qscale} codec flag is
+also set (the @option{-qscale} ffmpeg option).
+
+@item
+@var{LA_ICQ} - intelligent constant quality with lookahead, when the
+@option{look_ahead} option is also set.
+
+@item
+@var{ICQ} -- intelligent constant quality otherwise.
+@end itemize
+
+@item
+Otherwise, a bitrate-based mode is used. For all of those, you should specify at
+least the desired average bitrate with the @option{b} option.
+@itemize @minus
+@item
+@var{LA} - VBR with lookahead, when the @option{look_ahead} option is specified.
+
+@item
+@var{VCM} - video conferencing mode, when the @option{vcm} option is set.
+
+@item
+@var{CBR} - constant bitrate, when @option{maxrate} is specified and equal to
+the average bitrate.
+
+@item
+@var{VBR} - variable bitrate, when @option{maxrate} is specified, but is higher
+than the average bitrate.
+
+@item
+@var{AVBR} - average VBR mode, when @option{maxrate} is not specified. This mode
+is further configured by the @option{avbr_accuracy} and
+@option{avbr_convergence} options.
+@end itemize
+@end itemize
+
+Note that depending on your system, a different mode than the one you specified
+may be selected by the encoder. Set the verbosity level to @var{verbose} or
+higher to see the actual settings used by the QSV runtime.
+
+Additional libavcodec global options are mapped to MSDK options as follows:
+
+@itemize
+@item
+@option{g/gop_size} -> @option{GopPicSize}
+
+@item
+@option{bf/max_b_frames}+1 -> @option{GopRefDist}
+
+@item
+@option{rc_init_occupancy/rc_initial_buffer_occupancy} ->
+@option{InitialDelayInKB}
+
+@item
+@option{slices} -> @option{NumSlice}
+
+@item
+@option{refs} -> @option{NumRefFrame}
+
+@item
+@option{b_strategy/b_frame_strategy} -> @option{BRefType}
+
+@item
+@option{cgop/CLOSED_GOP} codec flag -> @option{GopOptFlag}
+
+@item
+For the @var{CQP} mode, the @option{i_qfactor/i_qoffset} and
+@option{b_qfactor/b_qoffset} set the difference between @var{QPP} and @var{QPI},
+and @var{QPP} and @var{QPB} respectively.
+
+@item
+Setting the @option{coder} option to the value @var{vlc} will make the H.264
+encoder use CAVLC instead of CABAC.
+
+@end itemize
+
+@section snow
+
+@subsection Options
+
+@table @option
+@item iterative_dia_size
+dia size for the iterative motion estimation
+@end table
+
+@section VAAPI encoders
+
+Wrappers for hardware encoders accessible via VAAPI.
+
+These encoders only accept input in VAAPI hardware surfaces. If you have input
+in software frames, use the @option{hwupload} filter to upload them to the GPU.
+
+The following standard libavcodec options are used:
+@itemize
+@item
+@option{g} / @option{gop_size}
+@item
+@option{bf} / @option{max_b_frames}
+@item
+@option{profile}
+
+If not set, this will be determined automatically from the format of the input
+frames and the profiles supported by the driver.
+@item
+@option{level}
+@item
+@option{b} / @option{bit_rate}
+@item
+@option{maxrate} / @option{rc_max_rate}
+@item
+@option{bufsize} / @option{rc_buffer_size}
+@item
+@option{rc_init_occupancy} / @option{rc_initial_buffer_occupancy}
+@item
+@option{compression_level}
+
+Speed / quality tradeoff: higher values are faster / worse quality.
+@item
+@option{q} / @option{global_quality}
+
+Size / quality tradeoff: higher values are smaller / worse quality.
+@item
+@option{qmin}
+@item
+@option{qmax}
+@item
+@option{i_qfactor} / @option{i_quant_factor}
+@item
+@option{i_qoffset} / @option{i_quant_offset}
+@item
+@option{b_qfactor} / @option{b_quant_factor}
+@item
+@option{b_qoffset} / @option{b_quant_offset}
+@item
+@option{slices}
+@end itemize
+
+All encoders support the following options:
+@table @option
+@item low_power
+Some drivers/platforms offer a second encoder for some codecs intended to use
+less power than the default encoder; setting this option will attempt to use
+that encoder. Note that it may support a reduced feature set, so some other
+options may not be available in this mode.
+
+@item idr_interval
+Set the number of normal intra frames between full-refresh (IDR) frames in
+open-GOP mode. The intra frames are still IRAPs, but will not include global
+headers and may have non-decodable leading pictures.
+
+@item b_depth
+Set the B-frame reference depth. When set to one (the default), all B-frames
+will refer only to P- or I-frames. When set to greater values multiple layers
+of B-frames will be present, frames in each layer only referring to frames in
+higher layers.
+
+@item rc_mode
+Set the rate control mode to use. A given driver may only support a subset of
+modes.
+
+Possible modes:
+@table @option
+@item auto
+Choose the mode automatically based on driver support and the other options.
+This is the default.
+@item CQP
+Constant-quality.
+@item CBR
+Constant-bitrate.
+@item VBR
+Variable-bitrate.
+@item ICQ
+Intelligent constant-quality.
+@item QVBR
+Quality-defined variable-bitrate.
+@item AVBR
+Average variable bitrate.
+@end table
+
+@end table
+
+Each encoder also has its own specific options:
+@table @option
+
+@item h264_vaapi
+@option{profile} sets the value of @emph{profile_idc} and the @emph{constraint_set*_flag}s.
+@option{level} sets the value of @emph{level_idc}.
+
+@table @option
+@item coder
+Set entropy encoder (default is @emph{cabac}). Possible values:
+
+@table @samp
+@item ac
+@item cabac
+Use CABAC.
+
+@item vlc
+@item cavlc
+Use CAVLC.
+@end table
+
+@item aud
+Include access unit delimiters in the stream (not included by default).
+
+@item sei
+Set SEI message types to include.
+Some combination of the following values:
+@table @samp
+@item identifier
+Include a @emph{user_data_unregistered} message containing information about
+the encoder.
+@item timing
+Include picture timing parameters (@emph{buffering_period} and
+@emph{pic_timing} messages).
+@item recovery_point
+Include recovery points where appropriate (@emph{recovery_point} messages).
+@end table
+
+@end table
+
+@item hevc_vaapi
+@option{profile} and @option{level} set the values of
+@emph{general_profile_idc} and @emph{general_level_idc} respectively.
+
+@table @option
+@item aud
+Include access unit delimiters in the stream (not included by default).
+
+@item tier
+Set @emph{general_tier_flag}. This may affect the level chosen for the stream
+if it is not explicitly specified.
+
+@item sei
+Set SEI message types to include.
+Some combination of the following values:
+@table @samp
+@item hdr
+Include HDR metadata if the input frames have it
+(@emph{mastering_display_colour_volume} and @emph{content_light_level}
+messages).
+@end table
+
+@item tiles
+Set the number of tiles to encode the input video with, as columns x rows.
+Larger numbers allow greater parallelism in both encoding and decoding, but
+may decrease coding efficiency.
+
+@end table
+
+@item mjpeg_vaapi
+Only baseline DCT encoding is supported. The encoder always uses the standard
+quantisation and huffman tables - @option{global_quality} scales the standard
+quantisation table (range 1-100).
+
+For YUV, 4:2:0, 4:2:2 and 4:4:4 subsampling modes are supported. RGB is also
+supported, and will create an RGB JPEG.
+
+@table @option
+@item jfif
+Include JFIF header in each frame (not included by default).
+@item huffman
+Include standard huffman tables (on by default). Turning this off will save
+a few hundred bytes in each output frame, but may lose compatibility with some
+JPEG decoders which don't fully handle MJPEG.
+@end table
+
+@item mpeg2_vaapi
+@option{profile} and @option{level} set the value of @emph{profile_and_level_indication}.
+
+@item vp8_vaapi
+B-frames are not supported.
+
+@option{global_quality} sets the @emph{q_idx} used for non-key frames (range 0-127).
+
+@table @option
+@item loop_filter_level
+@item loop_filter_sharpness
+Manually set the loop filter parameters.
+@end table
+
+@item vp9_vaapi
+@option{global_quality} sets the @emph{q_idx} used for P-frames (range 0-255).
+
+@table @option
+@item loop_filter_level
+@item loop_filter_sharpness
+Manually set the loop filter parameters.
+@end table
+
+B-frames are supported, but the output stream is always in encode order rather than display
+order. If B-frames are enabled, it may be necessary to use the @option{vp9_raw_reorder}
+bitstream filter to modify the output stream to display frames in the correct order.
+
+Only normal frames are produced - the @option{vp9_superframe} bitstream filter may be
+required to produce a stream usable with all decoders.
+
+@end table
+
+@section vc2
+
+SMPTE VC-2 (previously BBC Dirac Pro). This codec was primarily aimed at
+professional broadcasting but since it supports yuv420, yuv422 and yuv444 at
+8 (limited range or full range), 10 or 12 bits, this makes it suitable for
+other tasks which require low overhead and low compression (like screen
+recording).
+
+@subsection Options
+
+@table @option
+
+@item b
+Sets target video bitrate. Usually that's around 1:6 of the uncompressed
+video bitrate (e.g. for 1920x1080 50fps yuv422p10 that's around 400Mbps). Higher
+values (close to the uncompressed bitrate) turn on lossless compression mode.
+
+@item field_order
+Enables field coding when set (e.g. to tt - top field first) for interlaced
+inputs. Should increase compression with interlaced content as it splits the
+fields and encodes each separately.
+
+@item wavelet_depth
+Sets the total amount of wavelet transforms to apply, between 1 and 5 (default).
+Lower values reduce compression and quality. Less capable decoders may not be
+able to handle values of @option{wavelet_depth} over 3.
+
+@item wavelet_type
+Sets the transform type. Currently only @var{5_3} (LeGall) and @var{9_7}
+(Deslauriers-Dubuc)
+are implemented, with 9_7 being the one with better compression and thus
+is the default.
+
+@item slice_width
+@item slice_height
+Sets the slice size for each slice. Larger values result in better compression.
+For compatibility with other more limited decoders use @option{slice_width} of
+32 and @option{slice_height} of 8.
+
+@item tolerance
+Sets the undershoot tolerance of the rate control system in percent. This is
+to prevent an expensive search from being run.
+
+@item qm
+Sets the quantization matrix preset to use by default or when @option{wavelet_depth}
+is set to 5
+@itemize @minus
+@item
+@var{default}
+Uses the default quantization matrix from the specifications, extended with
+values for the fifth level. This provides a good balance between keeping detail
+and omitting artifacts.
+
+@item
+@var{flat}
+Use a completely zeroed out quantization matrix. This increases PSNR but might
+reduce perception. Use in bogus benchmarks.
+
+@item
+@var{color}
+Reduces detail but attempts to preserve color at extremely low bitrates.
+@end itemize
+
+@end table
+
+@c man end VIDEO ENCODERS
+
+@chapter Subtitles Encoders
+@c man begin SUBTITLES ENCODERS
+
+@section dvdsub
+
+This codec encodes the bitmap subtitle format that is used in DVDs.
+Typically they are stored in VOBSUB file pairs (*.idx + *.sub),
+and they can also be used in Matroska files.
+
+@subsection Options
+
+@table @option
+@item palette
+Specify the global palette used by the bitmaps.
+
+The format for this option is a string containing 16 24-bits hexadecimal
+numbers (without 0x prefix) separated by commas, for example @code{0d00ee,
+ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
+7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
+
+@item even_rows_fix
+When set to 1, enable a work-around that makes the number of pixel rows
+even in all subtitles. This fixes a problem with some players that
+cut off the bottom row if the number is odd. The work-around just adds
+a fully transparent row if needed. The overhead is low, typically
+one byte per subtitle on average.
+
+By default, this work-around is disabled.
+@end table
+
+@c man end SUBTITLES ENCODERS
diff --git a/extern/ffmpeg/doc/errno.txt b/extern/ffmpeg/doc/errno.txt
new file mode 100644
index 0000000000..933a4de51e
--- /dev/null
+++ b/extern/ffmpeg/doc/errno.txt
@@ -0,0 +1,174 @@
+The following table lists most error codes found in various operating
+systems supported by FFmpeg.
+
+ OS
+Code Std F LBMWwb Text (YMMV)
+
+E2BIG POSIX ++++++ Argument list too long
+EACCES POSIX ++++++ Permission denied
+EADDRINUSE POSIX +++..+ Address in use
+EADDRNOTAVAIL POSIX +++..+ Cannot assign requested address
+EADV +..... Advertise error
+EAFNOSUPPORT POSIX +++..+ Address family not supported
+EAGAIN POSIX + ++++++ Resource temporarily unavailable
+EALREADY POSIX +++..+ Operation already in progress
+EAUTH .++... Authentication error
+EBADARCH ..+... Bad CPU type in executable
+EBADE +..... Invalid exchange
+EBADEXEC ..+... Bad executable
+EBADF POSIX ++++++ Bad file descriptor
+EBADFD +..... File descriptor in bad state
+EBADMACHO ..+... Malformed Macho file
+EBADMSG POSIX ++4... Bad message
+EBADR +..... Invalid request descriptor
+EBADRPC .++... RPC struct is bad
+EBADRQC +..... Invalid request code
+EBADSLT +..... Invalid slot
+EBFONT +..... Bad font file format
+EBUSY POSIX - ++++++ Device or resource busy
+ECANCELED POSIX +++... Operation canceled
+ECHILD POSIX ++++++ No child processes
+ECHRNG +..... Channel number out of range
+ECOMM +..... Communication error on send
+ECONNABORTED POSIX +++..+ Software caused connection abort
+ECONNREFUSED POSIX - +++ss+ Connection refused
+ECONNRESET POSIX +++..+ Connection reset
+EDEADLK POSIX ++++++ Resource deadlock avoided
+EDEADLOCK +..++. File locking deadlock error
+EDESTADDRREQ POSIX +++... Destination address required
+EDEVERR ..+... Device error
+EDOM C89 - ++++++ Numerical argument out of domain
+EDOOFUS .F.... Programming error
+EDOTDOT +..... RFS specific error
+EDQUOT POSIX +++... Disc quota exceeded
+EEXIST POSIX ++++++ File exists
+EFAULT POSIX - ++++++ Bad address
+EFBIG POSIX - ++++++ File too large
+EFTYPE .++... Inappropriate file type or format
+EHOSTDOWN +++... Host is down
+EHOSTUNREACH POSIX +++..+ No route to host
+EHWPOISON +..... Memory page has hardware error
+EIDRM POSIX +++... Identifier removed
+EILSEQ C99 ++++++ Illegal byte sequence
+EINPROGRESS POSIX - +++ss+ Operation in progress
+EINTR POSIX - ++++++ Interrupted system call
+EINVAL POSIX + ++++++ Invalid argument
+EIO POSIX + ++++++ I/O error
+EISCONN POSIX +++..+ Socket is already connected
+EISDIR POSIX ++++++ Is a directory
+EISNAM +..... Is a named type file
+EKEYEXPIRED +..... Key has expired
+EKEYREJECTED +..... Key was rejected by service
+EKEYREVOKED +..... Key has been revoked
+EL2HLT +..... Level 2 halted
+EL2NSYNC +..... Level 2 not synchronized
+EL3HLT +..... Level 3 halted
+EL3RST +..... Level 3 reset
+ELIBACC +..... Can not access a needed shared library
+ELIBBAD +..... Accessing a corrupted shared library
+ELIBEXEC +..... Cannot exec a shared library directly
+ELIBMAX +..... Too many shared libraries
+ELIBSCN +..... .lib section in a.out corrupted
+ELNRNG +..... Link number out of range
+ELOOP POSIX +++..+ Too many levels of symbolic links
+EMEDIUMTYPE +..... Wrong medium type
+EMFILE POSIX ++++++ Too many open files
+EMLINK POSIX ++++++ Too many links
+EMSGSIZE POSIX +++..+ Message too long
+EMULTIHOP POSIX ++4... Multihop attempted
+ENAMETOOLONG POSIX - ++++++ File name too long
+ENAVAIL +..... No XENIX semaphores available
+ENEEDAUTH .++... Need authenticator
+ENETDOWN POSIX +++..+ Network is down
+ENETRESET SUSv3 +++..+ Network dropped connection on reset
+ENETUNREACH POSIX +++..+ Network unreachable
+ENFILE POSIX ++++++ Too many open files in system
+ENOANO +..... No anode
+ENOATTR .++... Attribute not found
+ENOBUFS POSIX - +++..+ No buffer space available
+ENOCSI +..... No CSI structure available
+ENODATA XSR +N4... No message available
+ENODEV POSIX - ++++++ No such device
+ENOENT POSIX - ++++++ No such file or directory
+ENOEXEC POSIX ++++++ Exec format error
+ENOFILE ...++. No such file or directory
+ENOKEY +..... Required key not available
+ENOLCK POSIX ++++++ No locks available
+ENOLINK POSIX ++4... Link has been severed
+ENOMEDIUM +..... No medium found
+ENOMEM POSIX ++++++ Not enough space
+ENOMSG POSIX +++..+ No message of desired type
+ENONET +..... Machine is not on the network
+ENOPKG +..... Package not installed
+ENOPROTOOPT POSIX +++..+ Protocol not available
+ENOSPC POSIX ++++++ No space left on device
+ENOSR XSR +N4... No STREAM resources
+ENOSTR XSR +N4... Not a STREAM
+ENOSYS POSIX + ++++++ Function not implemented
+ENOTBLK +++... Block device required
+ENOTCONN POSIX +++..+ Socket is not connected
+ENOTDIR POSIX ++++++ Not a directory
+ENOTEMPTY POSIX ++++++ Directory not empty
+ENOTNAM +..... Not a XENIX named type file
+ENOTRECOVERABLE SUSv4 - +..... State not recoverable
+ENOTSOCK POSIX +++..+ Socket operation on non-socket
+ENOTSUP POSIX +++... Operation not supported
+ENOTTY POSIX ++++++ Inappropriate I/O control operation
+ENOTUNIQ +..... Name not unique on network
+ENXIO POSIX ++++++ No such device or address
+EOPNOTSUPP POSIX +++..+ Operation not supported (on socket)
+EOVERFLOW POSIX +++..+ Value too large to be stored in data type
+EOWNERDEAD SUSv4 +..... Owner died
+EPERM POSIX - ++++++ Operation not permitted
+EPFNOSUPPORT +++..+ Protocol family not supported
+EPIPE POSIX - ++++++ Broken pipe
+EPROCLIM .++... Too many processes
+EPROCUNAVAIL .++... Bad procedure for program
+EPROGMISMATCH .++... Program version wrong
+EPROGUNAVAIL .++... RPC prog. not avail
+EPROTO POSIX ++4... Protocol error
+EPROTONOSUPPORT POSIX - +++ss+ Protocol not supported
+EPROTOTYPE POSIX +++..+ Protocol wrong type for socket
+EPWROFF ..+... Device power is off
+ERANGE C89 - ++++++ Result too large
+EREMCHG +..... Remote address changed
+EREMOTE +++... Object is remote
+EREMOTEIO +..... Remote I/O error
+ERESTART +..... Interrupted system call should be restarted
+ERFKILL +..... Operation not possible due to RF-kill
+EROFS POSIX ++++++ Read-only file system
+ERPCMISMATCH .++... RPC version wrong
+ESHLIBVERS ..+... Shared library version mismatch
+ESHUTDOWN +++..+ Cannot send after socket shutdown
+ESOCKTNOSUPPORT +++... Socket type not supported
+ESPIPE POSIX ++++++ Illegal seek
+ESRCH POSIX ++++++ No such process
+ESRMNT +..... Srmount error
+ESTALE POSIX +++..+ Stale NFS file handle
+ESTRPIPE +..... Streams pipe error
+ETIME XSR +N4... Stream ioctl timeout
+ETIMEDOUT POSIX - +++ss+ Connection timed out
+ETOOMANYREFS +++... Too many references: cannot splice
+ETXTBSY POSIX +++... Text file busy
+EUCLEAN +..... Structure needs cleaning
+EUNATCH +..... Protocol driver not attached
+EUSERS +++... Too many users
+EWOULDBLOCK POSIX +++..+ Operation would block
+EXDEV POSIX ++++++ Cross-device link
+EXFULL +..... Exchange full
+
+Notations:
+
+F: used in FFmpeg (-: a few times, +: a lot)
+
+SUSv3: Single Unix Specification, version 3
+SUSv4: Single Unix Specification, version 4
+XSR: XSI STREAMS (obsolete)
+
+OS: availability on some supported operating systems
+L: GNU/Linux
+B: BSD (F: FreeBSD, N: NetBSD)
+M: MacOS X
+W: Microsoft Windows (s: emulated with winsock, see libavformat/network.h)
+w: Mingw32 (3.17) and Mingw64 (2.0.1)
+b: BeOS
diff --git a/extern/ffmpeg/doc/examples/Makefile b/extern/ffmpeg/doc/examples/Makefile
new file mode 100644
index 0000000000..81bfd34d5d
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/Makefile
@@ -0,0 +1,64 @@
+EXAMPLES-$(CONFIG_AVIO_LIST_DIR_EXAMPLE) += avio_list_dir
+EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading
+EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE) += decode_audio
+EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video
+EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding
+EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio
+EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video
+EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs
+EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio
+EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio
+EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video
+EXAMPLES-$(CONFIG_HTTP_MULTICLIENT_EXAMPLE) += http_multiclient
+EXAMPLES-$(CONFIG_HW_DECODE_EXAMPLE) += hw_decode
+EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata
+EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing
+EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec
+EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing
+EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio
+EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video
+EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE) += transcode_aac
+EXAMPLES-$(CONFIG_TRANSCODING_EXAMPLE) += transcoding
+EXAMPLES-$(CONFIG_VAAPI_ENCODE_EXAMPLE) += vaapi_encode
+EXAMPLES-$(CONFIG_VAAPI_TRANSCODE_EXAMPLE) += vaapi_transcode
+
+EXAMPLES := $(EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)$(EXESUF))
+EXAMPLES_G := $(EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)_g$(EXESUF))
+ALL_EXAMPLES := $(EXAMPLES) $(EXAMPLES-:%=doc/examples/%$(PROGSSUF)$(EXESUF))
+ALL_EXAMPLES_G := $(EXAMPLES_G) $(EXAMPLES-:%=doc/examples/%$(PROGSSUF)_g$(EXESUF))
+PROGS += $(EXAMPLES)
+
+EXAMPLE_MAKEFILE := $(SRC_PATH)/doc/examples/Makefile
+EXAMPLES_FILES := $(wildcard $(SRC_PATH)/doc/examples/*.c) $(SRC_PATH)/doc/examples/README $(EXAMPLE_MAKEFILE)
+
+$(foreach P,$(EXAMPLES),$(eval OBJS-$(P:%$(PROGSSUF)$(EXESUF)=%) = $(P:%$(PROGSSUF)$(EXESUF)=%).o))
+$(EXAMPLES_G): %$(PROGSSUF)_g$(EXESUF): %.o
+
+examples: $(EXAMPLES)
+
+$(EXAMPLES:%$(PROGSSUF)$(EXESUF)=%.o): | doc/examples
+OUTDIRS += doc/examples
+
+DOXY_INPUT += $(EXAMPLES:%$(PROGSSUF)$(EXESUF)=%.c)
+
+install: install-examples
+
+install-examples: $(EXAMPLES_FILES)
+ $(Q)mkdir -p "$(DATADIR)/examples"
+ $(INSTALL) -m 644 $(EXAMPLES_FILES) "$(DATADIR)/examples"
+ $(INSTALL) -m 644 $(EXAMPLE_MAKEFILE:%=%.example) "$(DATADIR)/examples/Makefile"
+
+uninstall: uninstall-examples
+
+uninstall-examples:
+ $(RM) -r "$(DATADIR)/examples"
+
+examplesclean:
+ $(RM) $(ALL_EXAMPLES) $(ALL_EXAMPLES_G)
+ $(RM) $(CLEANSUFFIXES:%=doc/examples/%)
+
+docclean:: examplesclean
+
+-include $(wildcard $(EXAMPLES:%$(PROGSSUF)$(EXESUF)=%.d))
+
+.PHONY: examples
diff --git a/extern/ffmpeg/doc/examples/Makefile.example b/extern/ffmpeg/doc/examples/Makefile.example
new file mode 100644
index 0000000000..a232d97f98
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/Makefile.example
@@ -0,0 +1,50 @@
+# use pkg-config for getting CFLAGS and LDLIBS
+FFMPEG_LIBS= libavdevice \
+ libavformat \
+ libavfilter \
+ libavcodec \
+ libswresample \
+ libswscale \
+ libavutil \
+
+CFLAGS += -Wall -g
+CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
+LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
+
+EXAMPLES= avio_list_dir \
+ avio_reading \
+ decode_audio \
+ decode_video \
+ demuxing_decoding \
+ encode_audio \
+ encode_video \
+ extract_mvs \
+ filtering_video \
+ filtering_audio \
+ http_multiclient \
+ hw_decode \
+ metadata \
+ muxing \
+ remuxing \
+ resampling_audio \
+ scaling_video \
+ transcode_aac \
+ transcoding \
+
+OBJS=$(addsuffix .o,$(EXAMPLES))
+
+# the following examples make explicit use of the math library
+avcodec: LDLIBS += -lm
+encode_audio: LDLIBS += -lm
+muxing: LDLIBS += -lm
+resampling_audio: LDLIBS += -lm
+
+.phony: all clean-test clean
+
+all: $(OBJS) $(EXAMPLES)
+
+clean-test:
+ $(RM) test*.pgm test.h264 test.mp2 test.sw test.mpg
+
+clean: clean-test
+ $(RM) $(EXAMPLES) $(OBJS)
diff --git a/extern/ffmpeg/doc/examples/README b/extern/ffmpeg/doc/examples/README
index cb408814f0..c1ce619d35 100644
--- a/extern/ffmpeg/doc/examples/README
+++ b/extern/ffmpeg/doc/examples/README
@@ -5,14 +5,19 @@ Both following use cases rely on pkg-config and make, thus make sure
that you have them installed and working on your system.
-1) Build the installed examples in a generic read/write user directory
+Method 1: build the installed examples in a generic read/write user directory
Copy to a read/write user directory and just use "make", it will link
to the libraries on your system, assuming the PKG_CONFIG_PATH is
correctly configured.
-2) Build the examples in-tree
+Method 2: build the examples in-tree
Assuming you are in the source FFmpeg checkout directory, you need to build
-FFmpeg (no need to make install in any prefix). Then you can go into
-doc/examples and run a command such as PKG_CONFIG_PATH=pc-uninstalled make.
+FFmpeg (no need to make install in any prefix). Then just run "make examples".
+This will build the examples using the FFmpeg build system. You can clean those
+examples using "make examplesclean"
+
+If you want to try the dedicated Makefile examples (to emulate the first
+method), go into doc/examples and run a command such as
+PKG_CONFIG_PATH=pc-uninstalled make.
diff --git a/extern/ffmpeg/doc/examples/avio_list_dir.c b/extern/ffmpeg/doc/examples/avio_list_dir.c
new file mode 100644
index 0000000000..3073baaefa
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/avio_list_dir.c
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2014 Lukasz Marek
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include
+#include
+#include
+
+static const char *type_string(int type)
+{
+ switch (type) {
+ case AVIO_ENTRY_DIRECTORY:
+ return "";
+ case AVIO_ENTRY_FILE:
+ return "";
+ case AVIO_ENTRY_BLOCK_DEVICE:
+ return "";
+ case AVIO_ENTRY_CHARACTER_DEVICE:
+ return "";
+ case AVIO_ENTRY_NAMED_PIPE:
+ return "";
+ case AVIO_ENTRY_SYMBOLIC_LINK:
+ return " ";
+ case AVIO_ENTRY_SOCKET:
+ return "";
+ case AVIO_ENTRY_SERVER:
+ return "";
+ case AVIO_ENTRY_SHARE:
+ return "";
+ case AVIO_ENTRY_WORKGROUP:
+ return "";
+ case AVIO_ENTRY_UNKNOWN:
+ default:
+ break;
+ }
+ return "";
+}
+
+static int list_op(const char *input_dir)
+{
+ AVIODirEntry *entry = NULL;
+ AVIODirContext *ctx = NULL;
+ int cnt, ret;
+ char filemode[4], uid_and_gid[20];
+
+ if ((ret = avio_open_dir(&ctx, input_dir, NULL)) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot open directory: %s.\n", av_err2str(ret));
+ goto fail;
+ }
+
+ cnt = 0;
+ for (;;) {
+ if ((ret = avio_read_dir(ctx, &entry)) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot list directory: %s.\n", av_err2str(ret));
+ goto fail;
+ }
+ if (!entry)
+ break;
+ if (entry->filemode == -1) {
+ snprintf(filemode, 4, "???");
+ } else {
+ snprintf(filemode, 4, "%3"PRIo64, entry->filemode);
+ }
+ snprintf(uid_and_gid, 20, "%"PRId64"(%"PRId64")", entry->user_id, entry->group_id);
+ if (cnt == 0)
+ av_log(NULL, AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
+ "TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED",
+ "ACCESSED", "STATUS_CHANGED");
+ av_log(NULL, AV_LOG_INFO, "%-9s %12"PRId64" %30s %10s %s %16"PRId64" %16"PRId64" %16"PRId64"\n",
+ type_string(entry->type),
+ entry->size,
+ entry->name,
+ uid_and_gid,
+ filemode,
+ entry->modification_timestamp,
+ entry->access_timestamp,
+ entry->status_change_timestamp);
+ avio_free_directory_entry(&entry);
+ cnt++;
+ };
+
+ fail:
+ avio_close_dir(&ctx);
+ return ret;
+}
+
+static void usage(const char *program_name)
+{
+ fprintf(stderr, "usage: %s input_dir\n"
+ "API example program to show how to list files in directory "
+ "accessed through AVIOContext.\n", program_name);
+}
+
+int main(int argc, char *argv[])
+{
+ int ret;
+
+ av_log_set_level(AV_LOG_DEBUG);
+
+ if (argc < 2) {
+ usage(argv[0]);
+ return 1;
+ }
+
+ avformat_network_init();
+
+ ret = list_op(argv[1]);
+
+ avformat_network_deinit();
+
+ return ret < 0 ? 1 : 0;
+}
diff --git a/extern/ffmpeg/doc/examples/avio_reading.c b/extern/ffmpeg/doc/examples/avio_reading.c
new file mode 100644
index 0000000000..36ee02afa5
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/avio_reading.c
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2014 Stefano Sabatini
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * libavformat AVIOContext API example.
+ *
+ * Make libavformat demuxer access media content through a custom
+ * AVIOContext read callback.
+ * @example avio_reading.c
+ */
+
+#include
+#include
+#include
+#include
+
+struct buffer_data {
+ uint8_t *ptr;
+ size_t size; ///< size left in the buffer
+};
+
+static int read_packet(void *opaque, uint8_t *buf, int buf_size)
+{
+ struct buffer_data *bd = (struct buffer_data *)opaque;
+ buf_size = FFMIN(buf_size, bd->size);
+
+ if (!buf_size)
+ return AVERROR_EOF;
+ printf("ptr:%p size:%zu\n", bd->ptr, bd->size);
+
+ /* copy internal buffer data to buf */
+ memcpy(buf, bd->ptr, buf_size);
+ bd->ptr += buf_size;
+ bd->size -= buf_size;
+
+ return buf_size;
+}
+
+int main(int argc, char *argv[])
+{
+ AVFormatContext *fmt_ctx = NULL;
+ AVIOContext *avio_ctx = NULL;
+ uint8_t *buffer = NULL, *avio_ctx_buffer = NULL;
+ size_t buffer_size, avio_ctx_buffer_size = 4096;
+ char *input_filename = NULL;
+ int ret = 0;
+ struct buffer_data bd = { 0 };
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s input_file\n"
+ "API example program to show how to read from a custom buffer "
+ "accessed through AVIOContext.\n", argv[0]);
+ return 1;
+ }
+ input_filename = argv[1];
+
+ /* slurp file content into buffer */
+ ret = av_file_map(input_filename, &buffer, &buffer_size, 0, NULL);
+ if (ret < 0)
+ goto end;
+
+ /* fill opaque structure used by the AVIOContext read callback */
+ bd.ptr = buffer;
+ bd.size = buffer_size;
+
+ if (!(fmt_ctx = avformat_alloc_context())) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ avio_ctx_buffer = av_malloc(avio_ctx_buffer_size);
+ if (!avio_ctx_buffer) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+ avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size,
+ 0, &bd, &read_packet, NULL, NULL);
+ if (!avio_ctx) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+ fmt_ctx->pb = avio_ctx;
+
+ ret = avformat_open_input(&fmt_ctx, NULL, NULL, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Could not open input\n");
+ goto end;
+ }
+
+ ret = avformat_find_stream_info(fmt_ctx, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Could not find stream information\n");
+ goto end;
+ }
+
+ av_dump_format(fmt_ctx, 0, input_filename, 0);
+
+end:
+ avformat_close_input(&fmt_ctx);
+
+ /* note: the internal buffer could have changed, and be != avio_ctx_buffer */
+ if (avio_ctx)
+ av_freep(&avio_ctx->buffer);
+ avio_context_free(&avio_ctx);
+
+ av_file_unmap(buffer, buffer_size);
+
+ if (ret < 0) {
+ fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/decode_audio.c b/extern/ffmpeg/doc/examples/decode_audio.c
new file mode 100644
index 0000000000..6c2a8ed550
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/decode_audio.c
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * audio decoding with libavcodec API example
+ *
+ * @example decode_audio.c
+ */
+
+#include
+#include
+#include
+
+#include
+#include
+
+#include
+
+#define AUDIO_INBUF_SIZE 20480
+#define AUDIO_REFILL_THRESH 4096
+
+static int get_format_from_sample_fmt(const char **fmt,
+ enum AVSampleFormat sample_fmt)
+{
+ int i;
+ struct sample_fmt_entry {
+ enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le;
+ } sample_fmt_entries[] = {
+ { AV_SAMPLE_FMT_U8, "u8", "u8" },
+ { AV_SAMPLE_FMT_S16, "s16be", "s16le" },
+ { AV_SAMPLE_FMT_S32, "s32be", "s32le" },
+ { AV_SAMPLE_FMT_FLT, "f32be", "f32le" },
+ { AV_SAMPLE_FMT_DBL, "f64be", "f64le" },
+ };
+ *fmt = NULL;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) {
+ struct sample_fmt_entry *entry = &sample_fmt_entries[i];
+ if (sample_fmt == entry->sample_fmt) {
+ *fmt = AV_NE(entry->fmt_be, entry->fmt_le);
+ return 0;
+ }
+ }
+
+ fprintf(stderr,
+ "sample format %s is not supported as output format\n",
+ av_get_sample_fmt_name(sample_fmt));
+ return -1;
+}
+
+static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
+ FILE *outfile)
+{
+ int i, ch;
+ int ret, data_size;
+
+ /* send the packet with the compressed data to the decoder */
+ ret = avcodec_send_packet(dec_ctx, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error submitting the packet to the decoder\n");
+ exit(1);
+ }
+
+ /* read all the output frames (in general there may be any number of them */
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(dec_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ return;
+ else if (ret < 0) {
+ fprintf(stderr, "Error during decoding\n");
+ exit(1);
+ }
+ data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);
+ if (data_size < 0) {
+ /* This should not occur, checking just for paranoia */
+ fprintf(stderr, "Failed to calculate data size\n");
+ exit(1);
+ }
+ for (i = 0; i < frame->nb_samples; i++)
+ for (ch = 0; ch < dec_ctx->channels; ch++)
+ fwrite(frame->data[ch] + data_size*i, 1, data_size, outfile);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ const char *outfilename, *filename;
+ const AVCodec *codec;
+ AVCodecContext *c= NULL;
+ AVCodecParserContext *parser = NULL;
+ int len, ret;
+ FILE *f, *outfile;
+ uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
+ uint8_t *data;
+ size_t data_size;
+ AVPacket *pkt;
+ AVFrame *decoded_frame = NULL;
+ enum AVSampleFormat sfmt;
+ int n_channels = 0;
+ const char *fmt;
+
+ if (argc <= 2) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ exit(0);
+ }
+ filename = argv[1];
+ outfilename = argv[2];
+
+ pkt = av_packet_alloc();
+
+ /* find the MPEG audio decoder */
+ codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
+ if (!codec) {
+ fprintf(stderr, "Codec not found\n");
+ exit(1);
+ }
+
+ parser = av_parser_init(codec->id);
+ if (!parser) {
+ fprintf(stderr, "Parser not found\n");
+ exit(1);
+ }
+
+ c = avcodec_alloc_context3(codec);
+ if (!c) {
+ fprintf(stderr, "Could not allocate audio codec context\n");
+ exit(1);
+ }
+
+ /* open it */
+ if (avcodec_open2(c, codec, NULL) < 0) {
+ fprintf(stderr, "Could not open codec\n");
+ exit(1);
+ }
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ fprintf(stderr, "Could not open %s\n", filename);
+ exit(1);
+ }
+ outfile = fopen(outfilename, "wb");
+ if (!outfile) {
+ av_free(c);
+ exit(1);
+ }
+
+ /* decode until eof */
+ data = inbuf;
+ data_size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
+
+ while (data_size > 0) {
+ if (!decoded_frame) {
+ if (!(decoded_frame = av_frame_alloc())) {
+ fprintf(stderr, "Could not allocate audio frame\n");
+ exit(1);
+ }
+ }
+
+ ret = av_parser_parse2(parser, c, &pkt->data, &pkt->size,
+ data, data_size,
+ AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Error while parsing\n");
+ exit(1);
+ }
+ data += ret;
+ data_size -= ret;
+
+ if (pkt->size)
+ decode(c, pkt, decoded_frame, outfile);
+
+ if (data_size < AUDIO_REFILL_THRESH) {
+ memmove(inbuf, data, data_size);
+ data = inbuf;
+ len = fread(data + data_size, 1,
+ AUDIO_INBUF_SIZE - data_size, f);
+ if (len > 0)
+ data_size += len;
+ }
+ }
+
+ /* flush the decoder */
+ pkt->data = NULL;
+ pkt->size = 0;
+ decode(c, pkt, decoded_frame, outfile);
+
+ /* print output pcm infomations, because there have no metadata of pcm */
+ sfmt = c->sample_fmt;
+
+ if (av_sample_fmt_is_planar(sfmt)) {
+ const char *packed = av_get_sample_fmt_name(sfmt);
+ printf("Warning: the sample format the decoder produced is planar "
+ "(%s). This example will output the first channel only.\n",
+ packed ? packed : "?");
+ sfmt = av_get_packed_sample_fmt(sfmt);
+ }
+
+ n_channels = c->channels;
+ if ((ret = get_format_from_sample_fmt(&fmt, sfmt)) < 0)
+ goto end;
+
+ printf("Play the output audio file with the command:\n"
+ "ffplay -f %s -ac %d -ar %d %s\n",
+ fmt, n_channels, c->sample_rate,
+ outfilename);
+end:
+ fclose(outfile);
+ fclose(f);
+
+ avcodec_free_context(&c);
+ av_parser_close(parser);
+ av_frame_free(&decoded_frame);
+ av_packet_free(&pkt);
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/decode_video.c b/extern/ffmpeg/doc/examples/decode_video.c
new file mode 100644
index 0000000000..18ee90a6c0
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/decode_video.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * video decoding with libavcodec API example
+ *
+ * @example decode_video.c
+ */
+
+#include
+#include
+#include
+
+#include
+
+#define INBUF_SIZE 4096
+
+static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
+ char *filename)
+{
+ FILE *f;
+ int i;
+
+ f = fopen(filename,"wb");
+ fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255);
+ for (i = 0; i < ysize; i++)
+ fwrite(buf + i * wrap, 1, xsize, f);
+ fclose(f);
+}
+
+static void decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket *pkt,
+ const char *filename)
+{
+ char buf[1024];
+ int ret;
+
+ ret = avcodec_send_packet(dec_ctx, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error sending a packet for decoding\n");
+ exit(1);
+ }
+
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(dec_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ return;
+ else if (ret < 0) {
+ fprintf(stderr, "Error during decoding\n");
+ exit(1);
+ }
+
+ printf("saving frame %3d\n", dec_ctx->frame_number);
+ fflush(stdout);
+
+ /* the picture is allocated by the decoder. no need to
+ free it */
+ snprintf(buf, sizeof(buf), "%s-%d", filename, dec_ctx->frame_number);
+ pgm_save(frame->data[0], frame->linesize[0],
+ frame->width, frame->height, buf);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ const char *filename, *outfilename;
+ const AVCodec *codec;
+ AVCodecParserContext *parser;
+ AVCodecContext *c= NULL;
+ FILE *f;
+ AVFrame *frame;
+ uint8_t inbuf[INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
+ uint8_t *data;
+ size_t data_size;
+ int ret;
+ AVPacket *pkt;
+
+ if (argc <= 2) {
+ fprintf(stderr, "Usage: %s \n"
+ "And check your input file is encoded by mpeg1video please.\n", argv[0]);
+ exit(0);
+ }
+ filename = argv[1];
+ outfilename = argv[2];
+
+ pkt = av_packet_alloc();
+ if (!pkt)
+ exit(1);
+
+ /* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) */
+ memset(inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+ /* find the MPEG-1 video decoder */
+ codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
+ if (!codec) {
+ fprintf(stderr, "Codec not found\n");
+ exit(1);
+ }
+
+ parser = av_parser_init(codec->id);
+ if (!parser) {
+ fprintf(stderr, "parser not found\n");
+ exit(1);
+ }
+
+ c = avcodec_alloc_context3(codec);
+ if (!c) {
+ fprintf(stderr, "Could not allocate video codec context\n");
+ exit(1);
+ }
+
+ /* For some codecs, such as msmpeg4 and mpeg4, width and height
+ MUST be initialized there because this information is not
+ available in the bitstream. */
+
+ /* open it */
+ if (avcodec_open2(c, codec, NULL) < 0) {
+ fprintf(stderr, "Could not open codec\n");
+ exit(1);
+ }
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ fprintf(stderr, "Could not open %s\n", filename);
+ exit(1);
+ }
+
+ frame = av_frame_alloc();
+ if (!frame) {
+ fprintf(stderr, "Could not allocate video frame\n");
+ exit(1);
+ }
+
+ while (!feof(f)) {
+ /* read raw data from the input file */
+ data_size = fread(inbuf, 1, INBUF_SIZE, f);
+ if (!data_size)
+ break;
+
+ /* use the parser to split the data into frames */
+ data = inbuf;
+ while (data_size > 0) {
+ ret = av_parser_parse2(parser, c, &pkt->data, &pkt->size,
+ data, data_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Error while parsing\n");
+ exit(1);
+ }
+ data += ret;
+ data_size -= ret;
+
+ if (pkt->size)
+ decode(c, frame, pkt, outfilename);
+ }
+ }
+
+ /* flush the decoder */
+ decode(c, frame, NULL, outfilename);
+
+ fclose(f);
+
+ av_parser_close(parser);
+ avcodec_free_context(&c);
+ av_frame_free(&frame);
+ av_packet_free(&pkt);
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/decoding_encoding.c b/extern/ffmpeg/doc/examples/decoding_encoding.c
deleted file mode 100644
index 976b611cc1..0000000000
--- a/extern/ffmpeg/doc/examples/decoding_encoding.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Copyright (c) 2001 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libavcodec API use example.
- *
- * Note that libavcodec only handles codecs (mpeg, mpeg4, etc...),
- * not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the
- * format handling
- * @example doc/examples/decoding_encoding.c
- */
-
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#define INBUF_SIZE 4096
-#define AUDIO_INBUF_SIZE 20480
-#define AUDIO_REFILL_THRESH 4096
-
-/* check that a given sample format is supported by the encoder */
-static int check_sample_fmt(AVCodec *codec, enum AVSampleFormat sample_fmt)
-{
- const enum AVSampleFormat *p = codec->sample_fmts;
-
- while (*p != AV_SAMPLE_FMT_NONE) {
- if (*p == sample_fmt)
- return 1;
- p++;
- }
- return 0;
-}
-
-/* just pick the highest supported samplerate */
-static int select_sample_rate(AVCodec *codec)
-{
- const int *p;
- int best_samplerate = 0;
-
- if (!codec->supported_samplerates)
- return 44100;
-
- p = codec->supported_samplerates;
- while (*p) {
- best_samplerate = FFMAX(*p, best_samplerate);
- p++;
- }
- return best_samplerate;
-}
-
-/* select layout with the highest channel count */
-static int select_channel_layout(AVCodec *codec)
-{
- const uint64_t *p;
- uint64_t best_ch_layout = 0;
- int best_nb_channels = 0;
-
- if (!codec->channel_layouts)
- return AV_CH_LAYOUT_STEREO;
-
- p = codec->channel_layouts;
- while (*p) {
- int nb_channels = av_get_channel_layout_nb_channels(*p);
-
- if (nb_channels > best_nb_channels) {
- best_ch_layout = *p;
- best_nb_channels = nb_channels;
- }
- p++;
- }
- return best_ch_layout;
-}
-
-/*
- * Audio encoding example
- */
-static void audio_encode_example(const char *filename)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- AVFrame *frame;
- AVPacket pkt;
- int i, j, k, ret, got_output;
- int buffer_size;
- FILE *f;
- uint16_t *samples;
- float t, tincr;
-
- printf("Encode audio file %s\n", filename);
-
- /* find the MP2 encoder */
- codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate audio codec context\n");
- exit(1);
- }
-
- /* put sample parameters */
- c->bit_rate = 64000;
-
- /* check that the encoder supports s16 pcm input */
- c->sample_fmt = AV_SAMPLE_FMT_S16;
- if (!check_sample_fmt(codec, c->sample_fmt)) {
- fprintf(stderr, "Encoder does not support sample format %s",
- av_get_sample_fmt_name(c->sample_fmt));
- exit(1);
- }
-
- /* select other audio parameters supported by the encoder */
- c->sample_rate = select_sample_rate(codec);
- c->channel_layout = select_channel_layout(codec);
- c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "wb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
-
- /* frame containing input raw audio */
- frame = avcodec_alloc_frame();
- if (!frame) {
- fprintf(stderr, "Could not allocate audio frame\n");
- exit(1);
- }
-
- frame->nb_samples = c->frame_size;
- frame->format = c->sample_fmt;
- frame->channel_layout = c->channel_layout;
-
- /* the codec gives us the frame size, in samples,
- * we calculate the size of the samples buffer in bytes */
- buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size,
- c->sample_fmt, 0);
- samples = av_malloc(buffer_size);
- if (!samples) {
- fprintf(stderr, "Could not allocate %d bytes for samples buffer\n",
- buffer_size);
- exit(1);
- }
- /* setup the data pointers in the AVFrame */
- ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
- (const uint8_t*)samples, buffer_size, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not setup audio frame\n");
- exit(1);
- }
-
- /* encode a single tone sound */
- t = 0;
- tincr = 2 * M_PI * 440.0 / c->sample_rate;
- for(i=0;i<200;i++) {
- av_init_packet(&pkt);
- pkt.data = NULL; // packet data will be allocated by the encoder
- pkt.size = 0;
-
- for (j = 0; j < c->frame_size; j++) {
- samples[2*j] = (int)(sin(t) * 10000);
-
- for (k = 1; k < c->channels; k++)
- samples[2*j + k] = samples[2*j];
- t += tincr;
- }
- /* encode the samples */
- ret = avcodec_encode_audio2(c, &pkt, frame, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding audio frame\n");
- exit(1);
- }
- if (got_output) {
- fwrite(pkt.data, 1, pkt.size, f);
- av_free_packet(&pkt);
- }
- }
-
- /* get the delayed frames */
- for (got_output = 1; got_output; i++) {
- ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding frame\n");
- exit(1);
- }
-
- if (got_output) {
- fwrite(pkt.data, 1, pkt.size, f);
- av_free_packet(&pkt);
- }
- }
- fclose(f);
-
- av_freep(&samples);
- avcodec_free_frame(&frame);
- avcodec_close(c);
- av_free(c);
-}
-
-/*
- * Audio decoding.
- */
-static void audio_decode_example(const char *outfilename, const char *filename)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- int len;
- FILE *f, *outfile;
- uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
- AVPacket avpkt;
- AVFrame *decoded_frame = NULL;
-
- av_init_packet(&avpkt);
-
- printf("Decode audio file %s to %s\n", filename, outfilename);
-
- /* find the mpeg audio decoder */
- codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate audio codec context\n");
- exit(1);
- }
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "rb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
- outfile = fopen(outfilename, "wb");
- if (!outfile) {
- av_free(c);
- exit(1);
- }
-
- /* decode until eof */
- avpkt.data = inbuf;
- avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
-
- while (avpkt.size > 0) {
- int got_frame = 0;
-
- if (!decoded_frame) {
- if (!(decoded_frame = avcodec_alloc_frame())) {
- fprintf(stderr, "Could not allocate audio frame\n");
- exit(1);
- }
- } else
- avcodec_get_frame_defaults(decoded_frame);
-
- len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
- if (len < 0) {
- fprintf(stderr, "Error while decoding\n");
- exit(1);
- }
- if (got_frame) {
- /* if a frame has been decoded, output it */
- int data_size = av_samples_get_buffer_size(NULL, c->channels,
- decoded_frame->nb_samples,
- c->sample_fmt, 1);
- fwrite(decoded_frame->data[0], 1, data_size, outfile);
- }
- avpkt.size -= len;
- avpkt.data += len;
- avpkt.dts =
- avpkt.pts = AV_NOPTS_VALUE;
- if (avpkt.size < AUDIO_REFILL_THRESH) {
- /* Refill the input buffer, to avoid trying to decode
- * incomplete frames. Instead of this, one could also use
- * a parser, or use a proper container format through
- * libavformat. */
- memmove(inbuf, avpkt.data, avpkt.size);
- avpkt.data = inbuf;
- len = fread(avpkt.data + avpkt.size, 1,
- AUDIO_INBUF_SIZE - avpkt.size, f);
- if (len > 0)
- avpkt.size += len;
- }
- }
-
- fclose(outfile);
- fclose(f);
-
- avcodec_close(c);
- av_free(c);
- avcodec_free_frame(&decoded_frame);
-}
-
-/*
- * Video encoding example
- */
-static void video_encode_example(const char *filename, int codec_id)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- int i, ret, x, y, got_output;
- FILE *f;
- AVFrame *frame;
- AVPacket pkt;
- uint8_t endcode[] = { 0, 0, 1, 0xb7 };
-
- printf("Encode video file %s\n", filename);
-
- /* find the mpeg1 video encoder */
- codec = avcodec_find_encoder(codec_id);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate video codec context\n");
- exit(1);
- }
-
- /* put sample parameters */
- c->bit_rate = 400000;
- /* resolution must be a multiple of two */
- c->width = 352;
- c->height = 288;
- /* frames per second */
- c->time_base= (AVRational){1,25};
- c->gop_size = 10; /* emit one intra frame every ten frames */
- c->max_b_frames=1;
- c->pix_fmt = AV_PIX_FMT_YUV420P;
-
- if(codec_id == AV_CODEC_ID_H264)
- av_opt_set(c->priv_data, "preset", "slow", 0);
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "wb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
-
- frame = avcodec_alloc_frame();
- if (!frame) {
- fprintf(stderr, "Could not allocate video frame\n");
- exit(1);
- }
- frame->format = c->pix_fmt;
- frame->width = c->width;
- frame->height = c->height;
-
- /* the image can be allocated by any means and av_image_alloc() is
- * just the most convenient way if av_malloc() is to be used */
- ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height,
- c->pix_fmt, 32);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate raw picture buffer\n");
- exit(1);
- }
-
- /* encode 1 second of video */
- for(i=0;i<25;i++) {
- av_init_packet(&pkt);
- pkt.data = NULL; // packet data will be allocated by the encoder
- pkt.size = 0;
-
- fflush(stdout);
- /* prepare a dummy image */
- /* Y */
- for(y=0;yheight;y++) {
- for(x=0;xwidth;x++) {
- frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
- }
- }
-
- /* Cb and Cr */
- for(y=0;yheight/2;y++) {
- for(x=0;xwidth/2;x++) {
- frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
- frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
- }
- }
-
- frame->pts = i;
-
- /* encode the image */
- ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding frame\n");
- exit(1);
- }
-
- if (got_output) {
- printf("Write frame %3d (size=%5d)\n", i, pkt.size);
- fwrite(pkt.data, 1, pkt.size, f);
- av_free_packet(&pkt);
- }
- }
-
- /* get the delayed frames */
- for (got_output = 1; got_output; i++) {
- fflush(stdout);
-
- ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding frame\n");
- exit(1);
- }
-
- if (got_output) {
- printf("Write frame %3d (size=%5d)\n", i, pkt.size);
- fwrite(pkt.data, 1, pkt.size, f);
- av_free_packet(&pkt);
- }
- }
-
- /* add sequence end code to have a real mpeg file */
- fwrite(endcode, 1, sizeof(endcode), f);
- fclose(f);
-
- avcodec_close(c);
- av_free(c);
- av_freep(&frame->data[0]);
- avcodec_free_frame(&frame);
- printf("\n");
-}
-
-/*
- * Video decoding example
- */
-
-static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
- char *filename)
-{
- FILE *f;
- int i;
-
- f=fopen(filename,"w");
- fprintf(f,"P5\n%d %d\n%d\n",xsize,ysize,255);
- for(i=0;idata[0], frame->linesize[0],
- avctx->width, avctx->height, buf);
- (*frame_count)++;
- }
- if (pkt->data) {
- pkt->size -= len;
- pkt->data += len;
- }
- return 0;
-}
-
-static void video_decode_example(const char *outfilename, const char *filename)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- int frame_count;
- FILE *f;
- AVFrame *frame;
- uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
- AVPacket avpkt;
-
- av_init_packet(&avpkt);
-
- /* set end of buffer to 0 (this ensures that no overreading happens for damaged mpeg streams) */
- memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
-
- printf("Decode video file %s to %s\n", filename, outfilename);
-
- /* find the mpeg1 video decoder */
- codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate video codec context\n");
- exit(1);
- }
-
- if(codec->capabilities&CODEC_CAP_TRUNCATED)
- c->flags|= CODEC_FLAG_TRUNCATED; /* we do not send complete frames */
-
- /* For some codecs, such as msmpeg4 and mpeg4, width and height
- MUST be initialized there because this information is not
- available in the bitstream. */
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "rb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
-
- frame = avcodec_alloc_frame();
- if (!frame) {
- fprintf(stderr, "Could not allocate video frame\n");
- exit(1);
- }
-
- frame_count = 0;
- for(;;) {
- avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
- if (avpkt.size == 0)
- break;
-
- /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio)
- and this is the only method to use them because you cannot
- know the compressed data size before analysing it.
-
- BUT some other codecs (msmpeg4, mpeg4) are inherently frame
- based, so you must call them with all the data for one
- frame exactly. You must also initialize 'width' and
- 'height' before initializing them. */
-
- /* NOTE2: some codecs allow the raw parameters (frame size,
- sample rate) to be changed at any frame. We handle this, so
- you should also take care of it */
-
- /* here, we use a stream based decoder (mpeg1video), so we
- feed decoder and see if it could decode a frame */
- avpkt.data = inbuf;
- while (avpkt.size > 0)
- if (decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 0) < 0)
- exit(1);
- }
-
- /* some codecs, such as MPEG, transmit the I and P frame with a
- latency of one frame. You must do the following to have a
- chance to get the last frame of the video */
- avpkt.data = NULL;
- avpkt.size = 0;
- decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1);
-
- fclose(f);
-
- avcodec_close(c);
- av_free(c);
- avcodec_free_frame(&frame);
- printf("\n");
-}
-
-int main(int argc, char **argv)
-{
- const char *output_type;
-
- /* register all the codecs */
- avcodec_register_all();
-
- if (argc < 2) {
- printf("usage: %s output_type\n"
- "API example program to decode/encode a media stream with libavcodec.\n"
- "This program generates a synthetic stream and encodes it to a file\n"
- "named test.h264, test.mp2 or test.mpg depending on output_type.\n"
- "The encoded stream is then decoded and written to a raw data output.\n"
- "output_type must be choosen between 'h264', 'mp2', 'mpg'.\n",
- argv[0]);
- return 1;
- }
- output_type = argv[1];
-
- if (!strcmp(output_type, "h264")) {
- video_encode_example("test.h264", AV_CODEC_ID_H264);
- } else if (!strcmp(output_type, "mp2")) {
- audio_encode_example("test.mp2");
- audio_decode_example("test.sw", "test.mp2");
- } else if (!strcmp(output_type, "mpg")) {
- video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
- video_decode_example("test%02d.pgm", "test.mpg");
- } else {
- fprintf(stderr, "Invalid output type '%s', choose between 'h264', 'mp2', or 'mpg'\n",
- output_type);
- return 1;
- }
-
- return 0;
-}
diff --git a/extern/ffmpeg/doc/examples/demuxing.c b/extern/ffmpeg/doc/examples/demuxing_decoding.c
similarity index 56%
rename from extern/ffmpeg/doc/examples/demuxing.c
rename to extern/ffmpeg/doc/examples/demuxing_decoding.c
index e459cf003e..db5e0cb951 100644
--- a/extern/ffmpeg/doc/examples/demuxing.c
+++ b/extern/ffmpeg/doc/examples/demuxing_decoding.c
@@ -22,11 +22,11 @@
/**
* @file
- * libavformat demuxing API use example.
+ * Demuxing and decoding example.
*
* Show how to use the libavformat and libavcodec API to demux and
* decode audio and video data.
- * @example doc/examples/demuxing.c
+ * @example demuxing_decoding.c
*/
#include
@@ -36,6 +36,8 @@
static AVFormatContext *fmt_ctx = NULL;
static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx;
+static int width, height;
+static enum AVPixelFormat pix_fmt;
static AVStream *video_stream = NULL, *audio_stream = NULL;
static const char *src_filename = NULL;
static const char *video_dst_filename = NULL;
@@ -49,80 +51,106 @@ static int video_dst_bufsize;
static int video_stream_idx = -1, audio_stream_idx = -1;
static AVFrame *frame = NULL;
-static AVPacket pkt;
+static AVPacket *pkt = NULL;
static int video_frame_count = 0;
static int audio_frame_count = 0;
-static int decode_packet(int *got_frame, int cached)
+static int output_video_frame(AVFrame *frame)
+{
+ if (frame->width != width || frame->height != height ||
+ frame->format != pix_fmt) {
+ /* To handle this change, one could call av_image_alloc again and
+ * decode the following frames into another rawvideo file. */
+ fprintf(stderr, "Error: Width, height and pixel format have to be "
+ "constant in a rawvideo file, but the width, height or "
+ "pixel format of the input video changed:\n"
+ "old: width = %d, height = %d, format = %s\n"
+ "new: width = %d, height = %d, format = %s\n",
+ width, height, av_get_pix_fmt_name(pix_fmt),
+ frame->width, frame->height,
+ av_get_pix_fmt_name(frame->format));
+ return -1;
+ }
+
+ printf("video_frame n:%d coded_n:%d\n",
+ video_frame_count++, frame->coded_picture_number);
+
+ /* copy decoded frame to destination buffer:
+ * this is required since rawvideo expects non aligned data */
+ av_image_copy(video_dst_data, video_dst_linesize,
+ (const uint8_t **)(frame->data), frame->linesize,
+ pix_fmt, width, height);
+
+ /* write to rawvideo file */
+ fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
+ return 0;
+}
+
+static int output_audio_frame(AVFrame *frame)
+{
+ size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(frame->format);
+ printf("audio_frame n:%d nb_samples:%d pts:%s\n",
+ audio_frame_count++, frame->nb_samples,
+ av_ts2timestr(frame->pts, &audio_dec_ctx->time_base));
+
+ /* Write the raw audio data samples of the first plane. This works
+ * fine for packed formats (e.g. AV_SAMPLE_FMT_S16). However,
+ * most audio decoders output planar audio, which uses a separate
+ * plane of audio samples for each channel (e.g. AV_SAMPLE_FMT_S16P).
+ * In other words, this code will write only the first audio channel
+ * in these cases.
+ * You should use libswresample or libavfilter to convert the frame
+ * to packed data. */
+ fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file);
+
+ return 0;
+}
+
+static int decode_packet(AVCodecContext *dec, const AVPacket *pkt)
{
int ret = 0;
- int decoded = pkt.size;
- if (pkt.stream_index == video_stream_idx) {
- /* decode video frame */
- ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
+ // submit the packet to the decoder
+ ret = avcodec_send_packet(dec, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error submitting a packet for decoding (%s)\n", av_err2str(ret));
+ return ret;
+ }
+
+ // get all the available frames from the decoder
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(dec, frame);
if (ret < 0) {
- fprintf(stderr, "Error decoding video frame\n");
+ // those two return values are special and mean there is no output
+ // frame available, but there were no errors during decoding
+ if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
+ return 0;
+
+ fprintf(stderr, "Error during decoding (%s)\n", av_err2str(ret));
return ret;
}
- if (*got_frame) {
- printf("video_frame%s n:%d coded_n:%d pts:%s\n",
- cached ? "(cached)" : "",
- video_frame_count++, frame->coded_picture_number,
- av_ts2timestr(frame->pts, &video_dec_ctx->time_base));
+ // write the frame data to output file
+ if (dec->codec->type == AVMEDIA_TYPE_VIDEO)
+ ret = output_video_frame(frame);
+ else
+ ret = output_audio_frame(frame);
- /* copy decoded frame to destination buffer:
- * this is required since rawvideo expects non aligned data */
- av_image_copy(video_dst_data, video_dst_linesize,
- (const uint8_t **)(frame->data), frame->linesize,
- video_dec_ctx->pix_fmt, video_dec_ctx->width, video_dec_ctx->height);
-
- /* write to rawvideo file */
- fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
- }
- } else if (pkt.stream_index == audio_stream_idx) {
- /* decode audio frame */
- ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt);
- if (ret < 0) {
- fprintf(stderr, "Error decoding audio frame\n");
+ av_frame_unref(frame);
+ if (ret < 0)
return ret;
- }
- /* Some audio decoders decode only part of the packet, and have to be
- * called again with the remainder of the packet data.
- * Sample: fate-suite/lossless-audio/luckynight-partial.shn
- * Also, some decoders might over-read the packet. */
- decoded = FFMIN(ret, pkt.size);
-
- if (*got_frame) {
- size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(frame->format);
- printf("audio_frame%s n:%d nb_samples:%d pts:%s\n",
- cached ? "(cached)" : "",
- audio_frame_count++, frame->nb_samples,
- av_ts2timestr(frame->pts, &audio_dec_ctx->time_base));
-
- /* Write the raw audio data samples of the first plane. This works
- * fine for packed formats (e.g. AV_SAMPLE_FMT_S16). However,
- * most audio decoders output planar audio, which uses a separate
- * plane of audio samples for each channel (e.g. AV_SAMPLE_FMT_S16P).
- * In other words, this code will write only the first audio channel
- * in these cases.
- * You should use libswresample or libavfilter to convert the frame
- * to packed data. */
- fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file);
- }
}
- return decoded;
+ return 0;
}
static int open_codec_context(int *stream_idx,
- AVFormatContext *fmt_ctx, enum AVMediaType type)
+ AVCodecContext **dec_ctx, AVFormatContext *fmt_ctx, enum AVMediaType type)
{
- int ret;
+ int ret, stream_index;
AVStream *st;
- AVCodecContext *dec_ctx = NULL;
AVCodec *dec = NULL;
+ AVDictionary *opts = NULL;
ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
if (ret < 0) {
@@ -130,23 +158,39 @@ static int open_codec_context(int *stream_idx,
av_get_media_type_string(type), src_filename);
return ret;
} else {
- *stream_idx = ret;
- st = fmt_ctx->streams[*stream_idx];
+ stream_index = ret;
+ st = fmt_ctx->streams[stream_index];
/* find decoder for the stream */
- dec_ctx = st->codec;
- dec = avcodec_find_decoder(dec_ctx->codec_id);
+ dec = avcodec_find_decoder(st->codecpar->codec_id);
if (!dec) {
fprintf(stderr, "Failed to find %s codec\n",
av_get_media_type_string(type));
+ return AVERROR(EINVAL);
+ }
+
+ /* Allocate a codec context for the decoder */
+ *dec_ctx = avcodec_alloc_context3(dec);
+ if (!*dec_ctx) {
+ fprintf(stderr, "Failed to allocate the %s codec context\n",
+ av_get_media_type_string(type));
+ return AVERROR(ENOMEM);
+ }
+
+ /* Copy codec parameters from input stream to output codec context */
+ if ((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) {
+ fprintf(stderr, "Failed to copy %s codec parameters to decoder context\n",
+ av_get_media_type_string(type));
return ret;
}
- if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
+ /* Init the decoders */
+ if ((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) {
fprintf(stderr, "Failed to open %s codec\n",
av_get_media_type_string(type));
return ret;
}
+ *stream_idx = stream_index;
}
return 0;
@@ -183,24 +227,21 @@ static int get_format_from_sample_fmt(const char **fmt,
int main (int argc, char **argv)
{
- int ret = 0, got_frame;
+ int ret = 0;
if (argc != 4) {
- fprintf(stderr, "usage: %s input_file video_output_file audio_output_file\n"
+ fprintf(stderr, "usage: %s input_file video_output_file audio_output_file\n"
"API example program to show how to read frames from an input file.\n"
"This program reads frames from a file, decodes them, and writes decoded\n"
"video frames to a rawvideo file named video_output_file, and decoded\n"
- "audio frames to a rawaudio file named audio_output_file.\n"
- "\n", argv[0]);
+ "audio frames to a rawaudio file named audio_output_file.\n",
+ argv[0]);
exit(1);
}
src_filename = argv[1];
video_dst_filename = argv[2];
audio_dst_filename = argv[3];
- /* register all formats and codecs */
- av_register_all();
-
/* open input file, and allocate format context */
if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
fprintf(stderr, "Could not open source file %s\n", src_filename);
@@ -213,9 +254,8 @@ int main (int argc, char **argv)
exit(1);
}
- if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
+ if (open_codec_context(&video_stream_idx, &video_dec_ctx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
video_stream = fmt_ctx->streams[video_stream_idx];
- video_dec_ctx = video_stream->codec;
video_dst_file = fopen(video_dst_filename, "wb");
if (!video_dst_file) {
@@ -225,9 +265,11 @@ int main (int argc, char **argv)
}
/* allocate image where the decoded image will be put */
+ width = video_dec_ctx->width;
+ height = video_dec_ctx->height;
+ pix_fmt = video_dec_ctx->pix_fmt;
ret = av_image_alloc(video_dst_data, video_dst_linesize,
- video_dec_ctx->width, video_dec_ctx->height,
- video_dec_ctx->pix_fmt, 1);
+ width, height, pix_fmt, 1);
if (ret < 0) {
fprintf(stderr, "Could not allocate raw video buffer\n");
goto end;
@@ -235,12 +277,11 @@ int main (int argc, char **argv)
video_dst_bufsize = ret;
}
- if (open_codec_context(&audio_stream_idx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
+ if (open_codec_context(&audio_stream_idx, &audio_dec_ctx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
audio_stream = fmt_ctx->streams[audio_stream_idx];
- audio_dec_ctx = audio_stream->codec;
audio_dst_file = fopen(audio_dst_filename, "wb");
if (!audio_dst_file) {
- fprintf(stderr, "Could not open destination file %s\n", video_dst_filename);
+ fprintf(stderr, "Could not open destination file %s\n", audio_dst_filename);
ret = 1;
goto end;
}
@@ -255,17 +296,19 @@ int main (int argc, char **argv)
goto end;
}
- frame = avcodec_alloc_frame();
+ frame = av_frame_alloc();
if (!frame) {
fprintf(stderr, "Could not allocate frame\n");
ret = AVERROR(ENOMEM);
goto end;
}
- /* initialize packet, set data to NULL, let the demuxer fill it */
- av_init_packet(&pkt);
- pkt.data = NULL;
- pkt.size = 0;
+ pkt = av_packet_alloc();
+ if (!pkt) {
+ fprintf(stderr, "Could not allocate packet\n");
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
if (video_stream)
printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename);
@@ -273,31 +316,30 @@ int main (int argc, char **argv)
printf("Demuxing audio from file '%s' into '%s'\n", src_filename, audio_dst_filename);
/* read frames from the file */
- while (av_read_frame(fmt_ctx, &pkt) >= 0) {
- AVPacket orig_pkt = pkt;
- do {
- ret = decode_packet(&got_frame, 0);
- if (ret < 0)
- break;
- pkt.data += ret;
- pkt.size -= ret;
- } while (pkt.size > 0);
- av_free_packet(&orig_pkt);
+ while (av_read_frame(fmt_ctx, pkt) >= 0) {
+ // check if the packet belongs to a stream we are interested in, otherwise
+ // skip it
+ if (pkt->stream_index == video_stream_idx)
+ ret = decode_packet(video_dec_ctx, pkt);
+ else if (pkt->stream_index == audio_stream_idx)
+ ret = decode_packet(audio_dec_ctx, pkt);
+ av_packet_unref(pkt);
+ if (ret < 0)
+ break;
}
- /* flush cached frames */
- pkt.data = NULL;
- pkt.size = 0;
- do {
- decode_packet(&got_frame, 1);
- } while (got_frame);
+ /* flush the decoders */
+ if (video_dec_ctx)
+ decode_packet(video_dec_ctx, NULL);
+ if (audio_dec_ctx)
+ decode_packet(audio_dec_ctx, NULL);
printf("Demuxing succeeded.\n");
if (video_stream) {
printf("Play the output video file with the command:\n"
"ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
- av_get_pix_fmt_name(video_dec_ctx->pix_fmt), video_dec_ctx->width, video_dec_ctx->height,
+ av_get_pix_fmt_name(pix_fmt), width, height,
video_dst_filename);
}
@@ -325,16 +367,15 @@ int main (int argc, char **argv)
}
end:
- if (video_dec_ctx)
- avcodec_close(video_dec_ctx);
- if (audio_dec_ctx)
- avcodec_close(audio_dec_ctx);
+ avcodec_free_context(&video_dec_ctx);
+ avcodec_free_context(&audio_dec_ctx);
avformat_close_input(&fmt_ctx);
if (video_dst_file)
fclose(video_dst_file);
if (audio_dst_file)
fclose(audio_dst_file);
- av_free(frame);
+ av_packet_free(&pkt);
+ av_frame_free(&frame);
av_free(video_dst_data[0]);
return ret < 0;
diff --git a/extern/ffmpeg/doc/examples/encode_audio.c b/extern/ffmpeg/doc/examples/encode_audio.c
new file mode 100644
index 0000000000..ab3586be7f
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/encode_audio.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * audio encoding with libavcodec API example.
+ *
+ * @example encode_audio.c
+ */
+
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+#include
+
+/* check that a given sample format is supported by the encoder */
+static int check_sample_fmt(const AVCodec *codec, enum AVSampleFormat sample_fmt)
+{
+ const enum AVSampleFormat *p = codec->sample_fmts;
+
+ while (*p != AV_SAMPLE_FMT_NONE) {
+ if (*p == sample_fmt)
+ return 1;
+ p++;
+ }
+ return 0;
+}
+
+/* just pick the highest supported samplerate */
+static int select_sample_rate(const AVCodec *codec)
+{
+ const int *p;
+ int best_samplerate = 0;
+
+ if (!codec->supported_samplerates)
+ return 44100;
+
+ p = codec->supported_samplerates;
+ while (*p) {
+ if (!best_samplerate || abs(44100 - *p) < abs(44100 - best_samplerate))
+ best_samplerate = *p;
+ p++;
+ }
+ return best_samplerate;
+}
+
+/* select layout with the highest channel count */
+static int select_channel_layout(const AVCodec *codec)
+{
+ const uint64_t *p;
+ uint64_t best_ch_layout = 0;
+ int best_nb_channels = 0;
+
+ if (!codec->channel_layouts)
+ return AV_CH_LAYOUT_STEREO;
+
+ p = codec->channel_layouts;
+ while (*p) {
+ int nb_channels = av_get_channel_layout_nb_channels(*p);
+
+ if (nb_channels > best_nb_channels) {
+ best_ch_layout = *p;
+ best_nb_channels = nb_channels;
+ }
+ p++;
+ }
+ return best_ch_layout;
+}
+
+static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt,
+ FILE *output)
+{
+ int ret;
+
+ /* send the frame for encoding */
+ ret = avcodec_send_frame(ctx, frame);
+ if (ret < 0) {
+ fprintf(stderr, "Error sending the frame to the encoder\n");
+ exit(1);
+ }
+
+ /* read all the available output packets (in general there may be any
+ * number of them */
+ while (ret >= 0) {
+ ret = avcodec_receive_packet(ctx, pkt);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ return;
+ else if (ret < 0) {
+ fprintf(stderr, "Error encoding audio frame\n");
+ exit(1);
+ }
+
+ fwrite(pkt->data, 1, pkt->size, output);
+ av_packet_unref(pkt);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ const char *filename;
+ const AVCodec *codec;
+ AVCodecContext *c= NULL;
+ AVFrame *frame;
+ AVPacket *pkt;
+ int i, j, k, ret;
+ FILE *f;
+ uint16_t *samples;
+ float t, tincr;
+
+ if (argc <= 1) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ return 0;
+ }
+ filename = argv[1];
+
+ /* find the MP2 encoder */
+ codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
+ if (!codec) {
+ fprintf(stderr, "Codec not found\n");
+ exit(1);
+ }
+
+ c = avcodec_alloc_context3(codec);
+ if (!c) {
+ fprintf(stderr, "Could not allocate audio codec context\n");
+ exit(1);
+ }
+
+ /* put sample parameters */
+ c->bit_rate = 64000;
+
+ /* check that the encoder supports s16 pcm input */
+ c->sample_fmt = AV_SAMPLE_FMT_S16;
+ if (!check_sample_fmt(codec, c->sample_fmt)) {
+ fprintf(stderr, "Encoder does not support sample format %s",
+ av_get_sample_fmt_name(c->sample_fmt));
+ exit(1);
+ }
+
+ /* select other audio parameters supported by the encoder */
+ c->sample_rate = select_sample_rate(codec);
+ c->channel_layout = select_channel_layout(codec);
+ c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
+
+ /* open it */
+ if (avcodec_open2(c, codec, NULL) < 0) {
+ fprintf(stderr, "Could not open codec\n");
+ exit(1);
+ }
+
+ f = fopen(filename, "wb");
+ if (!f) {
+ fprintf(stderr, "Could not open %s\n", filename);
+ exit(1);
+ }
+
+ /* packet for holding encoded output */
+ pkt = av_packet_alloc();
+ if (!pkt) {
+ fprintf(stderr, "could not allocate the packet\n");
+ exit(1);
+ }
+
+ /* frame containing input raw audio */
+ frame = av_frame_alloc();
+ if (!frame) {
+ fprintf(stderr, "Could not allocate audio frame\n");
+ exit(1);
+ }
+
+ frame->nb_samples = c->frame_size;
+ frame->format = c->sample_fmt;
+ frame->channel_layout = c->channel_layout;
+
+ /* allocate the data buffers */
+ ret = av_frame_get_buffer(frame, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Could not allocate audio data buffers\n");
+ exit(1);
+ }
+
+ /* encode a single tone sound */
+ t = 0;
+ tincr = 2 * M_PI * 440.0 / c->sample_rate;
+ for (i = 0; i < 200; i++) {
+ /* make sure the frame is writable -- makes a copy if the encoder
+ * kept a reference internally */
+ ret = av_frame_make_writable(frame);
+ if (ret < 0)
+ exit(1);
+ samples = (uint16_t*)frame->data[0];
+
+ for (j = 0; j < c->frame_size; j++) {
+ samples[2*j] = (int)(sin(t) * 10000);
+
+ for (k = 1; k < c->channels; k++)
+ samples[2*j + k] = samples[2*j];
+ t += tincr;
+ }
+ encode(c, frame, pkt, f);
+ }
+
+ /* flush the encoder */
+ encode(c, NULL, pkt, f);
+
+ fclose(f);
+
+ av_frame_free(&frame);
+ av_packet_free(&pkt);
+ avcodec_free_context(&c);
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/encode_video.c b/extern/ffmpeg/doc/examples/encode_video.c
new file mode 100644
index 0000000000..908eb203d5
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/encode_video.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * video encoding with libavcodec API example
+ *
+ * @example encode_video.c
+ */
+
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+
+static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt,
+ FILE *outfile)
+{
+ int ret;
+
+ /* send the frame to the encoder */
+ if (frame)
+ printf("Send frame %3"PRId64"\n", frame->pts);
+
+ ret = avcodec_send_frame(enc_ctx, frame);
+ if (ret < 0) {
+ fprintf(stderr, "Error sending a frame for encoding\n");
+ exit(1);
+ }
+
+ while (ret >= 0) {
+ ret = avcodec_receive_packet(enc_ctx, pkt);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ return;
+ else if (ret < 0) {
+ fprintf(stderr, "Error during encoding\n");
+ exit(1);
+ }
+
+ printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);
+ fwrite(pkt->data, 1, pkt->size, outfile);
+ av_packet_unref(pkt);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ const char *filename, *codec_name;
+ const AVCodec *codec;
+ AVCodecContext *c= NULL;
+ int i, ret, x, y;
+ FILE *f;
+ AVFrame *frame;
+ AVPacket *pkt;
+ uint8_t endcode[] = { 0, 0, 1, 0xb7 };
+
+ if (argc <= 2) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ exit(0);
+ }
+ filename = argv[1];
+ codec_name = argv[2];
+
+ /* find the mpeg1video encoder */
+ codec = avcodec_find_encoder_by_name(codec_name);
+ if (!codec) {
+ fprintf(stderr, "Codec '%s' not found\n", codec_name);
+ exit(1);
+ }
+
+ c = avcodec_alloc_context3(codec);
+ if (!c) {
+ fprintf(stderr, "Could not allocate video codec context\n");
+ exit(1);
+ }
+
+ pkt = av_packet_alloc();
+ if (!pkt)
+ exit(1);
+
+ /* put sample parameters */
+ c->bit_rate = 400000;
+ /* resolution must be a multiple of two */
+ c->width = 352;
+ c->height = 288;
+ /* frames per second */
+ c->time_base = (AVRational){1, 25};
+ c->framerate = (AVRational){25, 1};
+
+ /* emit one intra frame every ten frames
+ * check frame pict_type before passing frame
+ * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
+ * then gop_size is ignored and the output of encoder
+ * will always be I frame irrespective to gop_size
+ */
+ c->gop_size = 10;
+ c->max_b_frames = 1;
+ c->pix_fmt = AV_PIX_FMT_YUV420P;
+
+ if (codec->id == AV_CODEC_ID_H264)
+ av_opt_set(c->priv_data, "preset", "slow", 0);
+
+ /* open it */
+ ret = avcodec_open2(c, codec, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Could not open codec: %s\n", av_err2str(ret));
+ exit(1);
+ }
+
+ f = fopen(filename, "wb");
+ if (!f) {
+ fprintf(stderr, "Could not open %s\n", filename);
+ exit(1);
+ }
+
+ frame = av_frame_alloc();
+ if (!frame) {
+ fprintf(stderr, "Could not allocate video frame\n");
+ exit(1);
+ }
+ frame->format = c->pix_fmt;
+ frame->width = c->width;
+ frame->height = c->height;
+
+ ret = av_frame_get_buffer(frame, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Could not allocate the video frame data\n");
+ exit(1);
+ }
+
+ /* encode 1 second of video */
+ for (i = 0; i < 25; i++) {
+ fflush(stdout);
+
+ /* make sure the frame data is writable */
+ ret = av_frame_make_writable(frame);
+ if (ret < 0)
+ exit(1);
+
+ /* prepare a dummy image */
+ /* Y */
+ for (y = 0; y < c->height; y++) {
+ for (x = 0; x < c->width; x++) {
+ frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
+ }
+ }
+
+ /* Cb and Cr */
+ for (y = 0; y < c->height/2; y++) {
+ for (x = 0; x < c->width/2; x++) {
+ frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
+ frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
+ }
+ }
+
+ frame->pts = i;
+
+ /* encode the image */
+ encode(c, frame, pkt, f);
+ }
+
+ /* flush the encoder */
+ encode(c, NULL, pkt, f);
+
+ /* add sequence end code to have a real MPEG file */
+ if (codec->id == AV_CODEC_ID_MPEG1VIDEO || codec->id == AV_CODEC_ID_MPEG2VIDEO)
+ fwrite(endcode, 1, sizeof(endcode), f);
+ fclose(f);
+
+ avcodec_free_context(&c);
+ av_frame_free(&frame);
+ av_packet_free(&pkt);
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/extract_mvs.c b/extern/ffmpeg/doc/examples/extract_mvs.c
new file mode 100644
index 0000000000..de31ccd2b9
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/extract_mvs.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2012 Stefano Sabatini
+ * Copyright (c) 2014 Clément Bœsch
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include
+#include
+
+static AVFormatContext *fmt_ctx = NULL;
+static AVCodecContext *video_dec_ctx = NULL;
+static AVStream *video_stream = NULL;
+static const char *src_filename = NULL;
+
+static int video_stream_idx = -1;
+static AVFrame *frame = NULL;
+static int video_frame_count = 0;
+
+static int decode_packet(const AVPacket *pkt)
+{
+ int ret = avcodec_send_packet(video_dec_ctx, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error while sending a packet to the decoder: %s\n", av_err2str(ret));
+ return ret;
+ }
+
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(video_dec_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+ break;
+ } else if (ret < 0) {
+ fprintf(stderr, "Error while receiving a frame from the decoder: %s\n", av_err2str(ret));
+ return ret;
+ }
+
+ if (ret >= 0) {
+ int i;
+ AVFrameSideData *sd;
+
+ video_frame_count++;
+ sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
+ if (sd) {
+ const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
+ for (i = 0; i < sd->size / sizeof(*mvs); i++) {
+ const AVMotionVector *mv = &mvs[i];
+ printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,0x%"PRIx64"\n",
+ video_frame_count, mv->source,
+ mv->w, mv->h, mv->src_x, mv->src_y,
+ mv->dst_x, mv->dst_y, mv->flags);
+ }
+ }
+ av_frame_unref(frame);
+ }
+ }
+
+ return 0;
+}
+
+static int open_codec_context(AVFormatContext *fmt_ctx, enum AVMediaType type)
+{
+ int ret;
+ AVStream *st;
+ AVCodecContext *dec_ctx = NULL;
+ AVCodec *dec = NULL;
+ AVDictionary *opts = NULL;
+
+ ret = av_find_best_stream(fmt_ctx, type, -1, -1, &dec, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Could not find %s stream in input file '%s'\n",
+ av_get_media_type_string(type), src_filename);
+ return ret;
+ } else {
+ int stream_idx = ret;
+ st = fmt_ctx->streams[stream_idx];
+
+ dec_ctx = avcodec_alloc_context3(dec);
+ if (!dec_ctx) {
+ fprintf(stderr, "Failed to allocate codec\n");
+ return AVERROR(EINVAL);
+ }
+
+ ret = avcodec_parameters_to_context(dec_ctx, st->codecpar);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to copy codec parameters to codec context\n");
+ return ret;
+ }
+
+ /* Init the video decoder */
+ av_dict_set(&opts, "flags2", "+export_mvs", 0);
+ if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
+ fprintf(stderr, "Failed to open %s codec\n",
+ av_get_media_type_string(type));
+ return ret;
+ }
+
+ video_stream_idx = stream_idx;
+ video_stream = fmt_ctx->streams[video_stream_idx];
+ video_dec_ctx = dec_ctx;
+ }
+
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int ret = 0;
+ AVPacket pkt = { 0 };
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ exit(1);
+ }
+ src_filename = argv[1];
+
+ if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
+ fprintf(stderr, "Could not open source file %s\n", src_filename);
+ exit(1);
+ }
+
+ if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
+ fprintf(stderr, "Could not find stream information\n");
+ exit(1);
+ }
+
+ open_codec_context(fmt_ctx, AVMEDIA_TYPE_VIDEO);
+
+ av_dump_format(fmt_ctx, 0, src_filename, 0);
+
+ if (!video_stream) {
+ fprintf(stderr, "Could not find video stream in the input, aborting\n");
+ ret = 1;
+ goto end;
+ }
+
+ frame = av_frame_alloc();
+ if (!frame) {
+ fprintf(stderr, "Could not allocate frame\n");
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
+
+ /* read frames from the file */
+ while (av_read_frame(fmt_ctx, &pkt) >= 0) {
+ if (pkt.stream_index == video_stream_idx)
+ ret = decode_packet(&pkt);
+ av_packet_unref(&pkt);
+ if (ret < 0)
+ break;
+ }
+
+ /* flush cached frames */
+ decode_packet(NULL);
+
+end:
+ avcodec_free_context(&video_dec_ctx);
+ avformat_close_input(&fmt_ctx);
+ av_frame_free(&frame);
+ return ret < 0;
+}
diff --git a/extern/ffmpeg/doc/examples/filter_audio.c b/extern/ffmpeg/doc/examples/filter_audio.c
new file mode 100644
index 0000000000..1611e3d952
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/filter_audio.c
@@ -0,0 +1,363 @@
+/*
+ * copyright (c) 2013 Andrew Kelley
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * libavfilter API usage example.
+ *
+ * @example filter_audio.c
+ * This example will generate a sine wave audio,
+ * pass it through a simple filter chain, and then compute the MD5 checksum of
+ * the output data.
+ *
+ * The filter chain it uses is:
+ * (input) -> abuffer -> volume -> aformat -> abuffersink -> (output)
+ *
+ * abuffer: This provides the endpoint where you can feed the decoded samples.
+ * volume: In this example we hardcode it to 0.90.
+ * aformat: This converts the samples to the samplefreq, channel layout,
+ * and sample format required by the audio device.
+ * abuffersink: This provides the endpoint where you can read the samples after
+ * they have passed through the filter chain.
+ */
+
+#include
+#include
+#include
+#include
+
+#include "libavutil/channel_layout.h"
+#include "libavutil/md5.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/samplefmt.h"
+
+#include "libavfilter/avfilter.h"
+#include "libavfilter/buffersink.h"
+#include "libavfilter/buffersrc.h"
+
+#define INPUT_SAMPLERATE 48000
+#define INPUT_FORMAT AV_SAMPLE_FMT_FLTP
+#define INPUT_CHANNEL_LAYOUT AV_CH_LAYOUT_5POINT0
+
+#define VOLUME_VAL 0.90
+
+static int init_filter_graph(AVFilterGraph **graph, AVFilterContext **src,
+ AVFilterContext **sink)
+{
+ AVFilterGraph *filter_graph;
+ AVFilterContext *abuffer_ctx;
+ const AVFilter *abuffer;
+ AVFilterContext *volume_ctx;
+ const AVFilter *volume;
+ AVFilterContext *aformat_ctx;
+ const AVFilter *aformat;
+ AVFilterContext *abuffersink_ctx;
+ const AVFilter *abuffersink;
+
+ AVDictionary *options_dict = NULL;
+ uint8_t options_str[1024];
+ uint8_t ch_layout[64];
+
+ int err;
+
+ /* Create a new filtergraph, which will contain all the filters. */
+ filter_graph = avfilter_graph_alloc();
+ if (!filter_graph) {
+ fprintf(stderr, "Unable to create filter graph.\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* Create the abuffer filter;
+ * it will be used for feeding the data into the graph. */
+ abuffer = avfilter_get_by_name("abuffer");
+ if (!abuffer) {
+ fprintf(stderr, "Could not find the abuffer filter.\n");
+ return AVERROR_FILTER_NOT_FOUND;
+ }
+
+ abuffer_ctx = avfilter_graph_alloc_filter(filter_graph, abuffer, "src");
+ if (!abuffer_ctx) {
+ fprintf(stderr, "Could not allocate the abuffer instance.\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* Set the filter options through the AVOptions API. */
+ av_get_channel_layout_string(ch_layout, sizeof(ch_layout), 0, INPUT_CHANNEL_LAYOUT);
+ av_opt_set (abuffer_ctx, "channel_layout", ch_layout, AV_OPT_SEARCH_CHILDREN);
+ av_opt_set (abuffer_ctx, "sample_fmt", av_get_sample_fmt_name(INPUT_FORMAT), AV_OPT_SEARCH_CHILDREN);
+ av_opt_set_q (abuffer_ctx, "time_base", (AVRational){ 1, INPUT_SAMPLERATE }, AV_OPT_SEARCH_CHILDREN);
+ av_opt_set_int(abuffer_ctx, "sample_rate", INPUT_SAMPLERATE, AV_OPT_SEARCH_CHILDREN);
+
+ /* Now initialize the filter; we pass NULL options, since we have already
+ * set all the options above. */
+ err = avfilter_init_str(abuffer_ctx, NULL);
+ if (err < 0) {
+ fprintf(stderr, "Could not initialize the abuffer filter.\n");
+ return err;
+ }
+
+ /* Create volume filter. */
+ volume = avfilter_get_by_name("volume");
+ if (!volume) {
+ fprintf(stderr, "Could not find the volume filter.\n");
+ return AVERROR_FILTER_NOT_FOUND;
+ }
+
+ volume_ctx = avfilter_graph_alloc_filter(filter_graph, volume, "volume");
+ if (!volume_ctx) {
+ fprintf(stderr, "Could not allocate the volume instance.\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* A different way of passing the options is as key/value pairs in a
+ * dictionary. */
+ av_dict_set(&options_dict, "volume", AV_STRINGIFY(VOLUME_VAL), 0);
+ err = avfilter_init_dict(volume_ctx, &options_dict);
+ av_dict_free(&options_dict);
+ if (err < 0) {
+ fprintf(stderr, "Could not initialize the volume filter.\n");
+ return err;
+ }
+
+ /* Create the aformat filter;
+ * it ensures that the output is of the format we want. */
+ aformat = avfilter_get_by_name("aformat");
+ if (!aformat) {
+ fprintf(stderr, "Could not find the aformat filter.\n");
+ return AVERROR_FILTER_NOT_FOUND;
+ }
+
+ aformat_ctx = avfilter_graph_alloc_filter(filter_graph, aformat, "aformat");
+ if (!aformat_ctx) {
+ fprintf(stderr, "Could not allocate the aformat instance.\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* A third way of passing the options is in a string of the form
+ * key1=value1:key2=value2.... */
+ snprintf(options_str, sizeof(options_str),
+ "sample_fmts=%s:sample_rates=%d:channel_layouts=0x%"PRIx64,
+ av_get_sample_fmt_name(AV_SAMPLE_FMT_S16), 44100,
+ (uint64_t)AV_CH_LAYOUT_STEREO);
+ err = avfilter_init_str(aformat_ctx, options_str);
+ if (err < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Could not initialize the aformat filter.\n");
+ return err;
+ }
+
+ /* Finally create the abuffersink filter;
+ * it will be used to get the filtered data out of the graph. */
+ abuffersink = avfilter_get_by_name("abuffersink");
+ if (!abuffersink) {
+ fprintf(stderr, "Could not find the abuffersink filter.\n");
+ return AVERROR_FILTER_NOT_FOUND;
+ }
+
+ abuffersink_ctx = avfilter_graph_alloc_filter(filter_graph, abuffersink, "sink");
+ if (!abuffersink_ctx) {
+ fprintf(stderr, "Could not allocate the abuffersink instance.\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* This filter takes no options. */
+ err = avfilter_init_str(abuffersink_ctx, NULL);
+ if (err < 0) {
+ fprintf(stderr, "Could not initialize the abuffersink instance.\n");
+ return err;
+ }
+
+ /* Connect the filters;
+ * in this simple case the filters just form a linear chain. */
+ err = avfilter_link(abuffer_ctx, 0, volume_ctx, 0);
+ if (err >= 0)
+ err = avfilter_link(volume_ctx, 0, aformat_ctx, 0);
+ if (err >= 0)
+ err = avfilter_link(aformat_ctx, 0, abuffersink_ctx, 0);
+ if (err < 0) {
+ fprintf(stderr, "Error connecting filters\n");
+ return err;
+ }
+
+ /* Configure the graph. */
+ err = avfilter_graph_config(filter_graph, NULL);
+ if (err < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error configuring the filter graph\n");
+ return err;
+ }
+
+ *graph = filter_graph;
+ *src = abuffer_ctx;
+ *sink = abuffersink_ctx;
+
+ return 0;
+}
+
+/* Do something useful with the filtered data: this simple
+ * example just prints the MD5 checksum of each plane to stdout. */
+static int process_output(struct AVMD5 *md5, AVFrame *frame)
+{
+ int planar = av_sample_fmt_is_planar(frame->format);
+ int channels = av_get_channel_layout_nb_channels(frame->channel_layout);
+ int planes = planar ? channels : 1;
+ int bps = av_get_bytes_per_sample(frame->format);
+ int plane_size = bps * frame->nb_samples * (planar ? 1 : channels);
+ int i, j;
+
+ for (i = 0; i < planes; i++) {
+ uint8_t checksum[16];
+
+ av_md5_init(md5);
+ av_md5_sum(checksum, frame->extended_data[i], plane_size);
+
+ fprintf(stdout, "plane %d: 0x", i);
+ for (j = 0; j < sizeof(checksum); j++)
+ fprintf(stdout, "%02X", checksum[j]);
+ fprintf(stdout, "\n");
+ }
+ fprintf(stdout, "\n");
+
+ return 0;
+}
+
+/* Construct a frame of audio data to be filtered;
+ * this simple example just synthesizes a sine wave. */
+static int get_input(AVFrame *frame, int frame_num)
+{
+ int err, i, j;
+
+#define FRAME_SIZE 1024
+
+ /* Set up the frame properties and allocate the buffer for the data. */
+ frame->sample_rate = INPUT_SAMPLERATE;
+ frame->format = INPUT_FORMAT;
+ frame->channel_layout = INPUT_CHANNEL_LAYOUT;
+ frame->nb_samples = FRAME_SIZE;
+ frame->pts = frame_num * FRAME_SIZE;
+
+ err = av_frame_get_buffer(frame, 0);
+ if (err < 0)
+ return err;
+
+ /* Fill the data for each channel. */
+ for (i = 0; i < 5; i++) {
+ float *data = (float*)frame->extended_data[i];
+
+ for (j = 0; j < frame->nb_samples; j++)
+ data[j] = sin(2 * M_PI * (frame_num + j) * (i + 1) / FRAME_SIZE);
+ }
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ struct AVMD5 *md5;
+ AVFilterGraph *graph;
+ AVFilterContext *src, *sink;
+ AVFrame *frame;
+ uint8_t errstr[1024];
+ float duration;
+ int err, nb_frames, i;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ return 1;
+ }
+
+ duration = atof(argv[1]);
+ nb_frames = duration * INPUT_SAMPLERATE / FRAME_SIZE;
+ if (nb_frames <= 0) {
+ fprintf(stderr, "Invalid duration: %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Allocate the frame we will be using to store the data. */
+ frame = av_frame_alloc();
+ if (!frame) {
+ fprintf(stderr, "Error allocating the frame\n");
+ return 1;
+ }
+
+ md5 = av_md5_alloc();
+ if (!md5) {
+ fprintf(stderr, "Error allocating the MD5 context\n");
+ return 1;
+ }
+
+ /* Set up the filtergraph. */
+ err = init_filter_graph(&graph, &src, &sink);
+ if (err < 0) {
+ fprintf(stderr, "Unable to init filter graph:");
+ goto fail;
+ }
+
+ /* the main filtering loop */
+ for (i = 0; i < nb_frames; i++) {
+ /* get an input frame to be filtered */
+ err = get_input(frame, i);
+ if (err < 0) {
+ fprintf(stderr, "Error generating input frame:");
+ goto fail;
+ }
+
+ /* Send the frame to the input of the filtergraph. */
+ err = av_buffersrc_add_frame(src, frame);
+ if (err < 0) {
+ av_frame_unref(frame);
+ fprintf(stderr, "Error submitting the frame to the filtergraph:");
+ goto fail;
+ }
+
+ /* Get all the filtered output that is available. */
+ while ((err = av_buffersink_get_frame(sink, frame)) >= 0) {
+ /* now do something with our filtered frame */
+ err = process_output(md5, frame);
+ if (err < 0) {
+ fprintf(stderr, "Error processing the filtered frame:");
+ goto fail;
+ }
+ av_frame_unref(frame);
+ }
+
+ if (err == AVERROR(EAGAIN)) {
+ /* Need to feed more frames in. */
+ continue;
+ } else if (err == AVERROR_EOF) {
+ /* Nothing more to do, finish. */
+ break;
+ } else if (err < 0) {
+ /* An error occurred. */
+ fprintf(stderr, "Error filtering the data:");
+ goto fail;
+ }
+ }
+
+ avfilter_graph_free(&graph);
+ av_frame_free(&frame);
+ av_freep(&md5);
+
+ return 0;
+
+fail:
+ av_strerror(err, errstr, sizeof(errstr));
+ fprintf(stderr, "%s\n", errstr);
+ return 1;
+}
diff --git a/extern/ffmpeg/doc/examples/filtering_audio.c b/extern/ffmpeg/doc/examples/filtering_audio.c
index 35dd4e7d28..834b137cd9 100644
--- a/extern/ffmpeg/doc/examples/filtering_audio.c
+++ b/extern/ffmpeg/doc/examples/filtering_audio.c
@@ -25,15 +25,13 @@
/**
* @file
* API example for audio decoding and filtering
- * @example doc/examples/filtering_audio.c
+ * @example filtering_audio.c
*/
#include
#include
#include
-#include
-#include
#include
#include
#include
@@ -66,12 +64,16 @@ static int open_input_file(const char *filename)
/* select the audio stream */
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0);
if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot find a audio stream in the input file\n");
+ av_log(NULL, AV_LOG_ERROR, "Cannot find an audio stream in the input file\n");
return ret;
}
audio_stream_index = ret;
- dec_ctx = fmt_ctx->streams[audio_stream_index]->codec;
- av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0);
+
+ /* create decoding context */
+ dec_ctx = avcodec_alloc_context3(dec);
+ if (!dec_ctx)
+ return AVERROR(ENOMEM);
+ avcodec_parameters_to_context(dec_ctx, fmt_ctx->streams[audio_stream_index]->codecpar);
/* init the audio decoder */
if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
@@ -85,9 +87,9 @@ static int open_input_file(const char *filename)
static int init_filters(const char *filters_descr)
{
char args[512];
- int ret;
- AVFilter *abuffersrc = avfilter_get_by_name("abuffer");
- AVFilter *abuffersink = avfilter_get_by_name("abuffersink");
+ int ret = 0;
+ const AVFilter *abuffersrc = avfilter_get_by_name("abuffer");
+ const AVFilter *abuffersink = avfilter_get_by_name("abuffersink");
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
static const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, -1 };
@@ -97,6 +99,10 @@ static int init_filters(const char *filters_descr)
AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base;
filter_graph = avfilter_graph_alloc();
+ if (!outputs || !inputs || !filter_graph) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
/* buffer audio source: the decoded frames from the decoder will be inserted here. */
if (!dec_ctx->channel_layout)
@@ -109,7 +115,7 @@ static int init_filters(const char *filters_descr)
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
- return ret;
+ goto end;
}
/* buffer audio sink: to terminate the filter chain. */
@@ -117,47 +123,63 @@ static int init_filters(const char *filters_descr)
NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
- return ret;
+ goto end;
}
ret = av_opt_set_int_list(buffersink_ctx, "sample_fmts", out_sample_fmts, -1,
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
- return ret;
+ goto end;
}
ret = av_opt_set_int_list(buffersink_ctx, "channel_layouts", out_channel_layouts, -1,
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
- return ret;
+ goto end;
}
ret = av_opt_set_int_list(buffersink_ctx, "sample_rates", out_sample_rates, -1,
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
- return ret;
+ goto end;
}
- /* Endpoints for the filter graph. */
+ /*
+ * Set the endpoints for the filter graph. The filter_graph will
+ * be linked to the graph described by filters_descr.
+ */
+
+ /*
+ * The buffer source output must be connected to the input pad of
+ * the first filter described by filters_descr; since the first
+ * filter input label is not specified, it is set to "in" by
+ * default.
+ */
outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0;
outputs->next = NULL;
+ /*
+ * The buffer sink input must be connected to the output pad of
+ * the last filter described by filters_descr; since the last
+ * filter output label is not specified, it is set to "out" by
+ * default.
+ */
inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0;
inputs->next = NULL;
if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
- &inputs, &outputs, NULL)) < 0)
- return ret;
+ &inputs, &outputs, NULL)) < 0)
+ goto end;
if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
- return ret;
+ goto end;
/* Print summary of the sink buffer
* Note: args buffer is reused to store channel layout string */
@@ -168,12 +190,16 @@ static int init_filters(const char *filters_descr)
(char *)av_x_if_null(av_get_sample_fmt_name(outlink->format), "?"),
args);
- return 0;
+end:
+ avfilter_inout_free(&inputs);
+ avfilter_inout_free(&outputs);
+
+ return ret;
}
static void print_frame(const AVFrame *frame)
{
- const int n = frame->nb_samples * av_get_channel_layout_nb_channels(av_frame_get_channel_layout(frame));
+ const int n = frame->nb_samples * av_get_channel_layout_nb_channels(frame->channel_layout);
const uint16_t *p = (uint16_t*)frame->data[0];
const uint16_t *p_end = p + n;
@@ -191,7 +217,6 @@ int main(int argc, char **argv)
AVPacket packet;
AVFrame *frame = av_frame_alloc();
AVFrame *filt_frame = av_frame_alloc();
- int got_frame;
if (!frame || !filt_frame) {
perror("Could not allocate frame");
@@ -202,10 +227,6 @@ int main(int argc, char **argv)
exit(1);
}
- avcodec_register_all();
- av_register_all();
- avfilter_register_all();
-
if ((ret = open_input_file(argv[1])) < 0)
goto end;
if ((ret = init_filters(filter_descr)) < 0)
@@ -217,47 +238,53 @@ int main(int argc, char **argv)
break;
if (packet.stream_index == audio_stream_index) {
- avcodec_get_frame_defaults(frame);
- got_frame = 0;
- ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, &packet);
+ ret = avcodec_send_packet(dec_ctx, &packet);
if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n");
- continue;
+ av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
+ break;
}
- if (got_frame) {
- /* push the audio data from decoded frame into the filtergraph */
- if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, 0) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(dec_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
+ } else if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error while receiving a frame from the decoder\n");
+ goto end;
}
- /* pull filtered audio from the filtergraph */
- while (1) {
- ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
- if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ if (ret >= 0) {
+ /* push the audio data from decoded frame into the filtergraph */
+ if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");
break;
- if(ret < 0)
- goto end;
- print_frame(filt_frame);
- av_frame_unref(filt_frame);
+ }
+
+ /* pull filtered audio from the filtergraph */
+ while (1) {
+ ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ break;
+ if (ret < 0)
+ goto end;
+ print_frame(filt_frame);
+ av_frame_unref(filt_frame);
+ }
+ av_frame_unref(frame);
}
}
}
- av_free_packet(&packet);
+ av_packet_unref(&packet);
}
end:
avfilter_graph_free(&filter_graph);
- if (dec_ctx)
- avcodec_close(dec_ctx);
+ avcodec_free_context(&dec_ctx);
avformat_close_input(&fmt_ctx);
av_frame_free(&frame);
av_frame_free(&filt_frame);
if (ret < 0 && ret != AVERROR_EOF) {
- char buf[1024];
- av_strerror(ret, buf, sizeof(buf));
- fprintf(stderr, "Error occurred: %s\n", buf);
+ fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
exit(1);
}
diff --git a/extern/ffmpeg/doc/examples/filtering_video.c b/extern/ffmpeg/doc/examples/filtering_video.c
index d3c33df040..105a200d93 100644
--- a/extern/ffmpeg/doc/examples/filtering_video.c
+++ b/extern/ffmpeg/doc/examples/filtering_video.c
@@ -24,20 +24,24 @@
/**
* @file
* API example for decoding and filtering
- * @example doc/examples/filtering_video.c
+ * @example filtering_video.c
*/
#define _XOPEN_SOURCE 600 /* for usleep */
#include
+#include
+#include
#include
#include
-#include
-#include
#include
#include
+#include
-const char *filter_descr = "scale=78:24";
+const char *filter_descr = "scale=78:24,transpose=cclock";
+/* other way:
+ scale=78:24 [scl]; [scl] transpose=cclock // assumes "[in]" and "[out]" to be input output pads respectively
+ */
static AVFormatContext *fmt_ctx;
static AVCodecContext *dec_ctx;
@@ -69,7 +73,12 @@ static int open_input_file(const char *filename)
return ret;
}
video_stream_index = ret;
- dec_ctx = fmt_ctx->streams[video_stream_index]->codec;
+
+ /* create decoding context */
+ dec_ctx = avcodec_alloc_context3(dec);
+ if (!dec_ctx)
+ return AVERROR(ENOMEM);
+ avcodec_parameters_to_context(dec_ctx, fmt_ctx->streams[video_stream_index]->codecpar);
/* init the video decoder */
if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
@@ -83,47 +92,71 @@ static int open_input_file(const char *filename)
static int init_filters(const char *filters_descr)
{
char args[512];
- int ret;
- AVFilter *buffersrc = avfilter_get_by_name("buffer");
- AVFilter *buffersink = avfilter_get_by_name("buffersink");
+ int ret = 0;
+ const AVFilter *buffersrc = avfilter_get_by_name("buffer");
+ const AVFilter *buffersink = avfilter_get_by_name("buffersink");
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
+ AVRational time_base = fmt_ctx->streams[video_stream_index]->time_base;
enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE };
- AVBufferSinkParams *buffersink_params;
filter_graph = avfilter_graph_alloc();
+ if (!outputs || !inputs || !filter_graph) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
/* buffer video source: the decoded frames from the decoder will be inserted here. */
snprintf(args, sizeof(args),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
- dec_ctx->time_base.num, dec_ctx->time_base.den,
+ time_base.num, time_base.den,
dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
- return ret;
+ goto end;
}
/* buffer video sink: to terminate the filter chain. */
- buffersink_params = av_buffersink_params_alloc();
- buffersink_params->pixel_fmts = pix_fmts;
ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
- NULL, buffersink_params, filter_graph);
- av_free(buffersink_params);
+ NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
- return ret;
+ goto end;
+ }
+
+ ret = av_opt_set_int_list(buffersink_ctx, "pix_fmts", pix_fmts,
+ AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
+ goto end;
}
- /* Endpoints for the filter graph. */
+ /*
+ * Set the endpoints for the filter graph. The filter_graph will
+ * be linked to the graph described by filters_descr.
+ */
+
+ /*
+ * The buffer source output must be connected to the input pad of
+ * the first filter described by filters_descr; since the first
+ * filter input label is not specified, it is set to "in" by
+ * default.
+ */
outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0;
outputs->next = NULL;
+ /*
+ * The buffer sink input must be connected to the output pad of
+ * the last filter described by filters_descr; since the last
+ * filter output label is not specified, it is set to "out" by
+ * default.
+ */
inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0;
@@ -131,11 +164,16 @@ static int init_filters(const char *filters_descr)
if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
&inputs, &outputs, NULL)) < 0)
- return ret;
+ goto end;
if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
- return ret;
- return 0;
+ goto end;
+
+end:
+ avfilter_inout_free(&inputs);
+ avfilter_inout_free(&outputs);
+
+ return ret;
}
static void display_frame(const AVFrame *frame, AVRational time_base)
@@ -173,22 +211,20 @@ int main(int argc, char **argv)
{
int ret;
AVPacket packet;
- AVFrame *frame = av_frame_alloc();
- AVFrame *filt_frame = av_frame_alloc();
- int got_frame;
+ AVFrame *frame;
+ AVFrame *filt_frame;
- if (!frame || !filt_frame) {
- perror("Could not allocate frame");
- exit(1);
- }
if (argc != 2) {
fprintf(stderr, "Usage: %s file\n", argv[0]);
exit(1);
}
- avcodec_register_all();
- av_register_all();
- avfilter_register_all();
+ frame = av_frame_alloc();
+ filt_frame = av_frame_alloc();
+ if (!frame || !filt_frame) {
+ perror("Could not allocate frame");
+ exit(1);
+ }
if ((ret = open_input_file(argv[1])) < 0)
goto end;
@@ -201,16 +237,22 @@ int main(int argc, char **argv)
break;
if (packet.stream_index == video_stream_index) {
- avcodec_get_frame_defaults(frame);
- got_frame = 0;
- ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &packet);
+ ret = avcodec_send_packet(dec_ctx, &packet);
if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error decoding video\n");
+ av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
break;
}
- if (got_frame) {
- frame->pts = av_frame_get_best_effort_timestamp(frame);
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(dec_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+ break;
+ } else if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error while receiving a frame from the decoder\n");
+ goto end;
+ }
+
+ frame->pts = frame->best_effort_timestamp;
/* push the decoded frame into the filtergraph */
if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
@@ -228,22 +270,20 @@ int main(int argc, char **argv)
display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
av_frame_unref(filt_frame);
}
+ av_frame_unref(frame);
}
}
- av_free_packet(&packet);
+ av_packet_unref(&packet);
}
end:
avfilter_graph_free(&filter_graph);
- if (dec_ctx)
- avcodec_close(dec_ctx);
+ avcodec_free_context(&dec_ctx);
avformat_close_input(&fmt_ctx);
av_frame_free(&frame);
av_frame_free(&filt_frame);
if (ret < 0 && ret != AVERROR_EOF) {
- char buf[1024];
- av_strerror(ret, buf, sizeof(buf));
- fprintf(stderr, "Error occurred: %s\n", buf);
+ fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
exit(1);
}
diff --git a/extern/ffmpeg/doc/examples/http_multiclient.c b/extern/ffmpeg/doc/examples/http_multiclient.c
new file mode 100644
index 0000000000..831e89c60a
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/http_multiclient.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2015 Stephan Holljes
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * libavformat multi-client network API usage example.
+ *
+ * @example http_multiclient.c
+ * This example will serve a file without decoding or demuxing it over http.
+ * Multiple clients can connect and will receive the same file.
+ */
+
+#include
+#include
+#include
+
+static void process_client(AVIOContext *client, const char *in_uri)
+{
+ AVIOContext *input = NULL;
+ uint8_t buf[1024];
+ int ret, n, reply_code;
+ uint8_t *resource = NULL;
+ while ((ret = avio_handshake(client)) > 0) {
+ av_opt_get(client, "resource", AV_OPT_SEARCH_CHILDREN, &resource);
+ // check for strlen(resource) is necessary, because av_opt_get()
+ // may return empty string.
+ if (resource && strlen(resource))
+ break;
+ av_freep(&resource);
+ }
+ if (ret < 0)
+ goto end;
+ av_log(client, AV_LOG_TRACE, "resource=%p\n", resource);
+ if (resource && resource[0] == '/' && !strcmp((resource + 1), in_uri)) {
+ reply_code = 200;
+ } else {
+ reply_code = AVERROR_HTTP_NOT_FOUND;
+ }
+ if ((ret = av_opt_set_int(client, "reply_code", reply_code, AV_OPT_SEARCH_CHILDREN)) < 0) {
+ av_log(client, AV_LOG_ERROR, "Failed to set reply_code: %s.\n", av_err2str(ret));
+ goto end;
+ }
+ av_log(client, AV_LOG_TRACE, "Set reply code to %d\n", reply_code);
+
+ while ((ret = avio_handshake(client)) > 0);
+
+ if (ret < 0)
+ goto end;
+
+ fprintf(stderr, "Handshake performed.\n");
+ if (reply_code != 200)
+ goto end;
+ fprintf(stderr, "Opening input file.\n");
+ if ((ret = avio_open2(&input, in_uri, AVIO_FLAG_READ, NULL, NULL)) < 0) {
+ av_log(input, AV_LOG_ERROR, "Failed to open input: %s: %s.\n", in_uri,
+ av_err2str(ret));
+ goto end;
+ }
+ for(;;) {
+ n = avio_read(input, buf, sizeof(buf));
+ if (n < 0) {
+ if (n == AVERROR_EOF)
+ break;
+ av_log(input, AV_LOG_ERROR, "Error reading from input: %s.\n",
+ av_err2str(n));
+ break;
+ }
+ avio_write(client, buf, n);
+ avio_flush(client);
+ }
+end:
+ fprintf(stderr, "Flushing client\n");
+ avio_flush(client);
+ fprintf(stderr, "Closing client\n");
+ avio_close(client);
+ fprintf(stderr, "Closing input\n");
+ avio_close(input);
+ av_freep(&resource);
+}
+
+int main(int argc, char **argv)
+{
+ AVDictionary *options = NULL;
+ AVIOContext *client = NULL, *server = NULL;
+ const char *in_uri, *out_uri;
+ int ret, pid;
+ av_log_set_level(AV_LOG_TRACE);
+ if (argc < 3) {
+ printf("usage: %s input http://hostname[:port]\n"
+ "API example program to serve http to multiple clients.\n"
+ "\n", argv[0]);
+ return 1;
+ }
+
+ in_uri = argv[1];
+ out_uri = argv[2];
+
+ avformat_network_init();
+
+ if ((ret = av_dict_set(&options, "listen", "2", 0)) < 0) {
+ fprintf(stderr, "Failed to set listen mode for server: %s\n", av_err2str(ret));
+ return ret;
+ }
+ if ((ret = avio_open2(&server, out_uri, AVIO_FLAG_WRITE, NULL, &options)) < 0) {
+ fprintf(stderr, "Failed to open server: %s\n", av_err2str(ret));
+ return ret;
+ }
+ fprintf(stderr, "Entering main loop.\n");
+ for(;;) {
+ if ((ret = avio_accept(server, &client)) < 0)
+ goto end;
+ fprintf(stderr, "Accepted client, forking process.\n");
+ // XXX: Since we don't reap our children and don't ignore signals
+ // this produces zombie processes.
+ pid = fork();
+ if (pid < 0) {
+ perror("Fork failed");
+ ret = AVERROR(errno);
+ goto end;
+ }
+ if (pid == 0) {
+ fprintf(stderr, "In child.\n");
+ process_client(client, in_uri);
+ avio_close(server);
+ exit(0);
+ }
+ if (pid > 0)
+ avio_close(client);
+ }
+end:
+ avio_close(server);
+ if (ret < 0 && ret != AVERROR_EOF) {
+ fprintf(stderr, "Some errors occurred: %s\n", av_err2str(ret));
+ return 1;
+ }
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/hw_decode.c b/extern/ffmpeg/doc/examples/hw_decode.c
new file mode 100644
index 0000000000..71be6e6709
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/hw_decode.c
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2017 Jun Zhao
+ * Copyright (c) 2017 Kaixuan Liu
+ *
+ * HW Acceleration API (video decoding) decode sample
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * HW-Accelerated decoding example.
+ *
+ * @example hw_decode.c
+ * This example shows how to do HW-accelerated decoding with output
+ * frames from the HW video surfaces.
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static AVBufferRef *hw_device_ctx = NULL;
+static enum AVPixelFormat hw_pix_fmt;
+static FILE *output_file = NULL;
+
+static int hw_decoder_init(AVCodecContext *ctx, const enum AVHWDeviceType type)
+{
+ int err = 0;
+
+ if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type,
+ NULL, NULL, 0)) < 0) {
+ fprintf(stderr, "Failed to create specified HW device.\n");
+ return err;
+ }
+ ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
+
+ return err;
+}
+
+static enum AVPixelFormat get_hw_format(AVCodecContext *ctx,
+ const enum AVPixelFormat *pix_fmts)
+{
+ const enum AVPixelFormat *p;
+
+ for (p = pix_fmts; *p != -1; p++) {
+ if (*p == hw_pix_fmt)
+ return *p;
+ }
+
+ fprintf(stderr, "Failed to get HW surface format.\n");
+ return AV_PIX_FMT_NONE;
+}
+
+static int decode_write(AVCodecContext *avctx, AVPacket *packet)
+{
+ AVFrame *frame = NULL, *sw_frame = NULL;
+ AVFrame *tmp_frame = NULL;
+ uint8_t *buffer = NULL;
+ int size;
+ int ret = 0;
+
+ ret = avcodec_send_packet(avctx, packet);
+ if (ret < 0) {
+ fprintf(stderr, "Error during decoding\n");
+ return ret;
+ }
+
+ while (1) {
+ if (!(frame = av_frame_alloc()) || !(sw_frame = av_frame_alloc())) {
+ fprintf(stderr, "Can not alloc frame\n");
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ ret = avcodec_receive_frame(avctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+ av_frame_free(&frame);
+ av_frame_free(&sw_frame);
+ return 0;
+ } else if (ret < 0) {
+ fprintf(stderr, "Error while decoding\n");
+ goto fail;
+ }
+
+ if (frame->format == hw_pix_fmt) {
+ /* retrieve data from GPU to CPU */
+ if ((ret = av_hwframe_transfer_data(sw_frame, frame, 0)) < 0) {
+ fprintf(stderr, "Error transferring the data to system memory\n");
+ goto fail;
+ }
+ tmp_frame = sw_frame;
+ } else
+ tmp_frame = frame;
+
+ size = av_image_get_buffer_size(tmp_frame->format, tmp_frame->width,
+ tmp_frame->height, 1);
+ buffer = av_malloc(size);
+ if (!buffer) {
+ fprintf(stderr, "Can not alloc buffer\n");
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ ret = av_image_copy_to_buffer(buffer, size,
+ (const uint8_t * const *)tmp_frame->data,
+ (const int *)tmp_frame->linesize, tmp_frame->format,
+ tmp_frame->width, tmp_frame->height, 1);
+ if (ret < 0) {
+ fprintf(stderr, "Can not copy image to buffer\n");
+ goto fail;
+ }
+
+ if ((ret = fwrite(buffer, 1, size, output_file)) < 0) {
+ fprintf(stderr, "Failed to dump raw data.\n");
+ goto fail;
+ }
+
+ fail:
+ av_frame_free(&frame);
+ av_frame_free(&sw_frame);
+ av_freep(&buffer);
+ if (ret < 0)
+ return ret;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ AVFormatContext *input_ctx = NULL;
+ int video_stream, ret;
+ AVStream *video = NULL;
+ AVCodecContext *decoder_ctx = NULL;
+ AVCodec *decoder = NULL;
+ AVPacket packet;
+ enum AVHWDeviceType type;
+ int i;
+
+ if (argc < 4) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ return -1;
+ }
+
+ type = av_hwdevice_find_type_by_name(argv[1]);
+ if (type == AV_HWDEVICE_TYPE_NONE) {
+ fprintf(stderr, "Device type %s is not supported.\n", argv[1]);
+ fprintf(stderr, "Available device types:");
+ while((type = av_hwdevice_iterate_types(type)) != AV_HWDEVICE_TYPE_NONE)
+ fprintf(stderr, " %s", av_hwdevice_get_type_name(type));
+ fprintf(stderr, "\n");
+ return -1;
+ }
+
+ /* open the input file */
+ if (avformat_open_input(&input_ctx, argv[2], NULL, NULL) != 0) {
+ fprintf(stderr, "Cannot open input file '%s'\n", argv[2]);
+ return -1;
+ }
+
+ if (avformat_find_stream_info(input_ctx, NULL) < 0) {
+ fprintf(stderr, "Cannot find input stream information.\n");
+ return -1;
+ }
+
+ /* find the video stream information */
+ ret = av_find_best_stream(input_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &decoder, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Cannot find a video stream in the input file\n");
+ return -1;
+ }
+ video_stream = ret;
+
+ for (i = 0;; i++) {
+ const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i);
+ if (!config) {
+ fprintf(stderr, "Decoder %s does not support device type %s.\n",
+ decoder->name, av_hwdevice_get_type_name(type));
+ return -1;
+ }
+ if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&
+ config->device_type == type) {
+ hw_pix_fmt = config->pix_fmt;
+ break;
+ }
+ }
+
+ if (!(decoder_ctx = avcodec_alloc_context3(decoder)))
+ return AVERROR(ENOMEM);
+
+ video = input_ctx->streams[video_stream];
+ if (avcodec_parameters_to_context(decoder_ctx, video->codecpar) < 0)
+ return -1;
+
+ decoder_ctx->get_format = get_hw_format;
+
+ if (hw_decoder_init(decoder_ctx, type) < 0)
+ return -1;
+
+ if ((ret = avcodec_open2(decoder_ctx, decoder, NULL)) < 0) {
+ fprintf(stderr, "Failed to open codec for stream #%u\n", video_stream);
+ return -1;
+ }
+
+ /* open the file to dump raw data */
+ output_file = fopen(argv[3], "w+b");
+
+ /* actual decoding and dump the raw data */
+ while (ret >= 0) {
+ if ((ret = av_read_frame(input_ctx, &packet)) < 0)
+ break;
+
+ if (video_stream == packet.stream_index)
+ ret = decode_write(decoder_ctx, &packet);
+
+ av_packet_unref(&packet);
+ }
+
+ /* flush the decoder */
+ packet.data = NULL;
+ packet.size = 0;
+ ret = decode_write(decoder_ctx, &packet);
+ av_packet_unref(&packet);
+
+ if (output_file)
+ fclose(output_file);
+ avcodec_free_context(&decoder_ctx);
+ avformat_close_input(&input_ctx);
+ av_buffer_unref(&hw_device_ctx);
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/metadata.c b/extern/ffmpeg/doc/examples/metadata.c
index 9c1bcd79d9..b6cfa6bd36 100644
--- a/extern/ffmpeg/doc/examples/metadata.c
+++ b/extern/ffmpeg/doc/examples/metadata.c
@@ -23,7 +23,7 @@
/**
* @file
* Shows how the metadata API can be used in application programs.
- * @example doc/examples/metadata.c
+ * @example metadata.c
*/
#include
@@ -44,10 +44,14 @@ int main (int argc, char **argv)
return 1;
}
- av_register_all();
if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
return ret;
+ if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
+ return ret;
+ }
+
while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
printf("%s=%s\n", tag->key, tag->value);
diff --git a/extern/ffmpeg/doc/examples/muxing.c b/extern/ffmpeg/doc/examples/muxing.c
index a8f979f4be..42f704c258 100644
--- a/extern/ffmpeg/doc/examples/muxing.c
+++ b/extern/ffmpeg/doc/examples/muxing.c
@@ -24,9 +24,9 @@
* @file
* libavformat API example.
*
- * Output a media file in any supported libavformat format.
- * The default codecs are used.
- * @example doc/examples/muxing.c
+ * Output a media file in any supported libavformat format. The default
+ * codecs are used.
+ * @example muxing.c
*/
#include
@@ -34,26 +34,98 @@
#include
#include
+#include
+#include
#include
#include
+#include
#include
#include
#include
-/* 5 seconds stream duration */
-#define STREAM_DURATION 200.0
+#define STREAM_DURATION 10.0
#define STREAM_FRAME_RATE 25 /* 25 images/s */
-#define STREAM_NB_FRAMES ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */
-static int sws_flags = SWS_BICUBIC;
+#define SCALE_FLAGS SWS_BICUBIC
+
+// a wrapper around a single output AVStream
+typedef struct OutputStream {
+ AVStream *st;
+ AVCodecContext *enc;
+
+ /* pts of the next frame that will be generated */
+ int64_t next_pts;
+ int samples_count;
+
+ AVFrame *frame;
+ AVFrame *tmp_frame;
+
+ float t, tincr, tincr2;
+
+ struct SwsContext *sws_ctx;
+ struct SwrContext *swr_ctx;
+} OutputStream;
+
+static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
+{
+ AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base;
+
+ printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
+ av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
+ av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
+ av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
+ pkt->stream_index);
+}
+
+static int write_frame(AVFormatContext *fmt_ctx, AVCodecContext *c,
+ AVStream *st, AVFrame *frame)
+{
+ int ret;
+
+ // send the frame to the encoder
+ ret = avcodec_send_frame(c, frame);
+ if (ret < 0) {
+ fprintf(stderr, "Error sending a frame to the encoder: %s\n",
+ av_err2str(ret));
+ exit(1);
+ }
+
+ while (ret >= 0) {
+ AVPacket pkt = { 0 };
+
+ ret = avcodec_receive_packet(c, &pkt);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ break;
+ else if (ret < 0) {
+ fprintf(stderr, "Error encoding a frame: %s\n", av_err2str(ret));
+ exit(1);
+ }
+
+ /* rescale output packet timestamp values from codec to stream timebase */
+ av_packet_rescale_ts(&pkt, c->time_base, st->time_base);
+ pkt.stream_index = st->index;
+
+ /* Write the compressed frame to the media file. */
+ log_packet(fmt_ctx, &pkt);
+ ret = av_interleaved_write_frame(fmt_ctx, &pkt);
+ av_packet_unref(&pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error while writing output packet: %s\n", av_err2str(ret));
+ exit(1);
+ }
+ }
+
+ return ret == AVERROR_EOF ? 1 : 0;
+}
/* Add an output stream. */
-static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
- enum AVCodecID codec_id)
+static void add_stream(OutputStream *ost, AVFormatContext *oc,
+ AVCodec **codec,
+ enum AVCodecID codec_id)
{
AVCodecContext *c;
- AVStream *st;
+ int i;
/* find the encoder */
*codec = avcodec_find_encoder(codec_id);
@@ -63,20 +135,43 @@ static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
exit(1);
}
- st = avformat_new_stream(oc, *codec);
- if (!st) {
+ ost->st = avformat_new_stream(oc, NULL);
+ if (!ost->st) {
fprintf(stderr, "Could not allocate stream\n");
exit(1);
}
- st->id = oc->nb_streams-1;
- c = st->codec;
+ ost->st->id = oc->nb_streams-1;
+ c = avcodec_alloc_context3(*codec);
+ if (!c) {
+ fprintf(stderr, "Could not alloc an encoding context\n");
+ exit(1);
+ }
+ ost->enc = c;
switch ((*codec)->type) {
case AVMEDIA_TYPE_AUDIO:
- c->sample_fmt = AV_SAMPLE_FMT_FLTP;
+ c->sample_fmt = (*codec)->sample_fmts ?
+ (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
c->bit_rate = 64000;
c->sample_rate = 44100;
- c->channels = 2;
+ if ((*codec)->supported_samplerates) {
+ c->sample_rate = (*codec)->supported_samplerates[0];
+ for (i = 0; (*codec)->supported_samplerates[i]; i++) {
+ if ((*codec)->supported_samplerates[i] == 44100)
+ c->sample_rate = 44100;
+ }
+ }
+ c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
+ c->channel_layout = AV_CH_LAYOUT_STEREO;
+ if ((*codec)->channel_layouts) {
+ c->channel_layout = (*codec)->channel_layouts[0];
+ for (i = 0; (*codec)->channel_layouts[i]; i++) {
+ if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
+ c->channel_layout = AV_CH_LAYOUT_STEREO;
+ }
+ }
+ c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
+ ost->st->time_base = (AVRational){ 1, c->sample_rate };
break;
case AVMEDIA_TYPE_VIDEO:
@@ -90,12 +185,13 @@ static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
* of which frame timestamps are represented. For fixed-fps content,
* timebase should be 1/framerate and timestamp increments should be
* identical to 1. */
- c->time_base.den = STREAM_FRAME_RATE;
- c->time_base.num = 1;
+ ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE };
+ c->time_base = ost->st->time_base;
+
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
c->pix_fmt = STREAM_PIX_FMT;
if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
- /* just for testing, we also add B frames */
+ /* just for testing, we also add B-frames */
c->max_b_frames = 2;
}
if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
@@ -104,7 +200,7 @@ static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
* the motion of the chroma plane does not match the luma plane. */
c->mb_decision = 2;
}
- break;
+ break;
default:
break;
@@ -112,235 +208,248 @@ static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
/* Some formats want stream headers to be separate. */
if (oc->oformat->flags & AVFMT_GLOBALHEADER)
- c->flags |= CODEC_FLAG_GLOBAL_HEADER;
-
- return st;
+ c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
}
/**************************************************************/
/* audio output */
-static float t, tincr, tincr2;
+static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt,
+ uint64_t channel_layout,
+ int sample_rate, int nb_samples)
+{
+ AVFrame *frame = av_frame_alloc();
+ int ret;
+
+ if (!frame) {
+ fprintf(stderr, "Error allocating an audio frame\n");
+ exit(1);
+ }
-static uint8_t **src_samples_data;
-static int src_samples_linesize;
-static int src_nb_samples;
+ frame->format = sample_fmt;
+ frame->channel_layout = channel_layout;
+ frame->sample_rate = sample_rate;
+ frame->nb_samples = nb_samples;
-static int max_dst_nb_samples;
-uint8_t **dst_samples_data;
-int dst_samples_linesize;
-int dst_samples_size;
+ if (nb_samples) {
+ ret = av_frame_get_buffer(frame, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Error allocating an audio buffer\n");
+ exit(1);
+ }
+ }
-struct SwrContext *swr_ctx = NULL;
+ return frame;
+}
-static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
+static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
{
AVCodecContext *c;
+ int nb_samples;
int ret;
+ AVDictionary *opt = NULL;
- c = st->codec;
+ c = ost->enc;
/* open it */
- ret = avcodec_open2(c, codec, NULL);
+ av_dict_copy(&opt, opt_arg, 0);
+ ret = avcodec_open2(c, codec, &opt);
+ av_dict_free(&opt);
if (ret < 0) {
fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
exit(1);
}
/* init signal generator */
- t = 0;
- tincr = 2 * M_PI * 110.0 / c->sample_rate;
+ ost->t = 0;
+ ost->tincr = 2 * M_PI * 110.0 / c->sample_rate;
/* increment frequency by 110 Hz per second */
- tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
+ ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
+
+ if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
+ nb_samples = 10000;
+ else
+ nb_samples = c->frame_size;
- src_nb_samples = c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ?
- 10000 : c->frame_size;
+ ost->frame = alloc_audio_frame(c->sample_fmt, c->channel_layout,
+ c->sample_rate, nb_samples);
+ ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
+ c->sample_rate, nb_samples);
- ret = av_samples_alloc_array_and_samples(&src_samples_data, &src_samples_linesize, c->channels,
- src_nb_samples, c->sample_fmt, 0);
+ /* copy the stream parameters to the muxer */
+ ret = avcodec_parameters_from_context(ost->st->codecpar, c);
if (ret < 0) {
- fprintf(stderr, "Could not allocate source samples\n");
+ fprintf(stderr, "Could not copy the stream parameters\n");
exit(1);
}
/* create resampler context */
- if (c->sample_fmt != AV_SAMPLE_FMT_S16) {
- swr_ctx = swr_alloc();
- if (!swr_ctx) {
- fprintf(stderr, "Could not allocate resampler context\n");
- exit(1);
- }
-
- /* set options */
- av_opt_set_int (swr_ctx, "in_channel_count", c->channels, 0);
- av_opt_set_int (swr_ctx, "in_sample_rate", c->sample_rate, 0);
- av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
- av_opt_set_int (swr_ctx, "out_channel_count", c->channels, 0);
- av_opt_set_int (swr_ctx, "out_sample_rate", c->sample_rate, 0);
- av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
-
- /* initialize the resampling context */
- if ((ret = swr_init(swr_ctx)) < 0) {
- fprintf(stderr, "Failed to initialize the resampling context\n");
- exit(1);
- }
+ ost->swr_ctx = swr_alloc();
+ if (!ost->swr_ctx) {
+ fprintf(stderr, "Could not allocate resampler context\n");
+ exit(1);
}
- /* compute the number of converted samples: buffering is avoided
- * ensuring that the output buffer will contain at least all the
- * converted input samples */
- max_dst_nb_samples = src_nb_samples;
- ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels,
- max_dst_nb_samples, c->sample_fmt, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate destination samples\n");
+ /* set options */
+ av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0);
+ av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0);
+ av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
+ av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0);
+ av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0);
+ av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
+
+ /* initialize the resampling context */
+ if ((ret = swr_init(ost->swr_ctx)) < 0) {
+ fprintf(stderr, "Failed to initialize the resampling context\n");
exit(1);
}
- dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples,
- c->sample_fmt, 0);
}
/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
* 'nb_channels' channels. */
-static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels)
+static AVFrame *get_audio_frame(OutputStream *ost)
{
+ AVFrame *frame = ost->tmp_frame;
int j, i, v;
- int16_t *q;
+ int16_t *q = (int16_t*)frame->data[0];
+
+ /* check if we want to generate more frames */
+ if (av_compare_ts(ost->next_pts, ost->enc->time_base,
+ STREAM_DURATION, (AVRational){ 1, 1 }) > 0)
+ return NULL;
- q = samples;
- for (j = 0; j < frame_size; j++) {
- v = (int)(sin(t) * 10000);
- for (i = 0; i < nb_channels; i++)
+ for (j = 0; j nb_samples; j++) {
+ v = (int)(sin(ost->t) * 10000);
+ for (i = 0; i < ost->enc->channels; i++)
*q++ = v;
- t += tincr;
- tincr += tincr2;
+ ost->t += ost->tincr;
+ ost->tincr += ost->tincr2;
}
+
+ frame->pts = ost->next_pts;
+ ost->next_pts += frame->nb_samples;
+
+ return frame;
}
-static void write_audio_frame(AVFormatContext *oc, AVStream *st)
+/*
+ * encode one audio frame and send it to the muxer
+ * return 1 when encoding is finished, 0 otherwise
+ */
+static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
{
AVCodecContext *c;
- AVPacket pkt = { 0 }; // data and size must be 0;
- AVFrame *frame = avcodec_alloc_frame();
- int got_packet, ret, dst_nb_samples;
+ AVFrame *frame;
+ int ret;
+ int dst_nb_samples;
- av_init_packet(&pkt);
- c = st->codec;
+ c = ost->enc;
- get_audio_frame((int16_t *)src_samples_data[0], src_nb_samples, c->channels);
+ frame = get_audio_frame(ost);
- /* convert samples from native format to destination codec format, using the resampler */
- if (swr_ctx) {
+ if (frame) {
+ /* convert samples from native format to destination codec format, using the resampler */
/* compute destination number of samples */
- dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, c->sample_rate) + src_nb_samples,
+ dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples,
c->sample_rate, c->sample_rate, AV_ROUND_UP);
- if (dst_nb_samples > max_dst_nb_samples) {
- av_free(dst_samples_data[0]);
- ret = av_samples_alloc(dst_samples_data, &dst_samples_linesize, c->channels,
- dst_nb_samples, c->sample_fmt, 0);
- if (ret < 0)
- exit(1);
- max_dst_nb_samples = dst_nb_samples;
- dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, dst_nb_samples,
- c->sample_fmt, 0);
- }
+ av_assert0(dst_nb_samples == frame->nb_samples);
+
+ /* when we pass a frame to the encoder, it may keep a reference to it
+ * internally;
+ * make sure we do not overwrite it here
+ */
+ ret = av_frame_make_writable(ost->frame);
+ if (ret < 0)
+ exit(1);
/* convert to destination format */
- ret = swr_convert(swr_ctx,
- dst_samples_data, dst_nb_samples,
- (const uint8_t **)src_samples_data, src_nb_samples);
+ ret = swr_convert(ost->swr_ctx,
+ ost->frame->data, dst_nb_samples,
+ (const uint8_t **)frame->data, frame->nb_samples);
if (ret < 0) {
fprintf(stderr, "Error while converting\n");
exit(1);
}
- } else {
- dst_samples_data[0] = src_samples_data[0];
- dst_nb_samples = src_nb_samples;
+ frame = ost->frame;
+
+ frame->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base);
+ ost->samples_count += dst_nb_samples;
}
- frame->nb_samples = dst_nb_samples;
- avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
- dst_samples_data[0], dst_samples_size, 0);
+ return write_frame(oc, c, ost->st, frame);
+}
- ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
- if (ret < 0) {
- fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
- exit(1);
- }
+/**************************************************************/
+/* video output */
- if (!got_packet)
- return;
+static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
+{
+ AVFrame *picture;
+ int ret;
- pkt.stream_index = st->index;
+ picture = av_frame_alloc();
+ if (!picture)
+ return NULL;
- /* Write the compressed frame to the media file. */
- ret = av_interleaved_write_frame(oc, &pkt);
- if (ret != 0) {
- fprintf(stderr, "Error while writing audio frame: %s\n",
- av_err2str(ret));
+ picture->format = pix_fmt;
+ picture->width = width;
+ picture->height = height;
+
+ /* allocate the buffers for the frame data */
+ ret = av_frame_get_buffer(picture, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Could not allocate frame data.\n");
exit(1);
}
- avcodec_free_frame(&frame);
-}
-static void close_audio(AVFormatContext *oc, AVStream *st)
-{
- avcodec_close(st->codec);
- av_free(src_samples_data[0]);
- av_free(dst_samples_data[0]);
+ return picture;
}
-/**************************************************************/
-/* video output */
-
-static AVFrame *frame;
-static AVPicture src_picture, dst_picture;
-static int frame_count;
-
-static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st)
+static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
{
int ret;
- AVCodecContext *c = st->codec;
+ AVCodecContext *c = ost->enc;
+ AVDictionary *opt = NULL;
+
+ av_dict_copy(&opt, opt_arg, 0);
/* open the codec */
- ret = avcodec_open2(c, codec, NULL);
+ ret = avcodec_open2(c, codec, &opt);
+ av_dict_free(&opt);
if (ret < 0) {
fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
exit(1);
}
/* allocate and init a re-usable frame */
- frame = avcodec_alloc_frame();
- if (!frame) {
+ ost->frame = alloc_picture(c->pix_fmt, c->width, c->height);
+ if (!ost->frame) {
fprintf(stderr, "Could not allocate video frame\n");
exit(1);
}
- /* Allocate the encoded raw picture. */
- ret = avpicture_alloc(&dst_picture, c->pix_fmt, c->width, c->height);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate picture: %s\n", av_err2str(ret));
- exit(1);
- }
-
/* If the output format is not YUV420P, then a temporary YUV420P
* picture is needed too. It is then converted to the required
* output format. */
+ ost->tmp_frame = NULL;
if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
- ret = avpicture_alloc(&src_picture, AV_PIX_FMT_YUV420P, c->width, c->height);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate temporary picture: %s\n",
- av_err2str(ret));
+ ost->tmp_frame = alloc_picture(AV_PIX_FMT_YUV420P, c->width, c->height);
+ if (!ost->tmp_frame) {
+ fprintf(stderr, "Could not allocate temporary picture\n");
exit(1);
}
}
- /* copy data and linesize picture pointers to frame */
- *((AVPicture *)frame) = dst_picture;
+ /* copy the stream parameters to the muxer */
+ ret = avcodec_parameters_from_context(ost->st->codecpar, c);
+ if (ret < 0) {
+ fprintf(stderr, "Could not copy the stream parameters\n");
+ exit(1);
+ }
}
/* Prepare a dummy image. */
-static void fill_yuv_image(AVPicture *pict, int frame_index,
+static void fill_yuv_image(AVFrame *pict, int frame_index,
int width, int height)
{
int x, y, i;
@@ -361,85 +470,64 @@ static void fill_yuv_image(AVPicture *pict, int frame_index,
}
}
-static void write_video_frame(AVFormatContext *oc, AVStream *st)
+static AVFrame *get_video_frame(OutputStream *ost)
{
- int ret;
- static struct SwsContext *sws_ctx;
- AVCodecContext *c = st->codec;
-
- if (frame_count >= STREAM_NB_FRAMES) {
- /* No more frames to compress. The codec has a latency of a few
- * frames if using B-frames, so we get the last frames by
- * passing the same picture again. */
- } else {
- if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
- /* as we only generate a YUV420P picture, we must convert it
- * to the codec pixel format if needed */
- if (!sws_ctx) {
- sws_ctx = sws_getContext(c->width, c->height, AV_PIX_FMT_YUV420P,
- c->width, c->height, c->pix_fmt,
- sws_flags, NULL, NULL, NULL);
- if (!sws_ctx) {
- fprintf(stderr,
- "Could not initialize the conversion context\n");
- exit(1);
- }
- }
- fill_yuv_image(&src_picture, frame_count, c->width, c->height);
- sws_scale(sws_ctx,
- (const uint8_t * const *)src_picture.data, src_picture.linesize,
- 0, c->height, dst_picture.data, dst_picture.linesize);
- } else {
- fill_yuv_image(&dst_picture, frame_count, c->width, c->height);
- }
- }
+ AVCodecContext *c = ost->enc;
- if (oc->oformat->flags & AVFMT_RAWPICTURE) {
- /* Raw video case - directly store the picture in the packet */
- AVPacket pkt;
- av_init_packet(&pkt);
+ /* check if we want to generate more frames */
+ if (av_compare_ts(ost->next_pts, c->time_base,
+ STREAM_DURATION, (AVRational){ 1, 1 }) > 0)
+ return NULL;
- pkt.flags |= AV_PKT_FLAG_KEY;
- pkt.stream_index = st->index;
- pkt.data = dst_picture.data[0];
- pkt.size = sizeof(AVPicture);
+ /* when we pass a frame to the encoder, it may keep a reference to it
+ * internally; make sure we do not overwrite it here */
+ if (av_frame_make_writable(ost->frame) < 0)
+ exit(1);
- ret = av_interleaved_write_frame(oc, &pkt);
+ if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
+ /* as we only generate a YUV420P picture, we must convert it
+ * to the codec pixel format if needed */
+ if (!ost->sws_ctx) {
+ ost->sws_ctx = sws_getContext(c->width, c->height,
+ AV_PIX_FMT_YUV420P,
+ c->width, c->height,
+ c->pix_fmt,
+ SCALE_FLAGS, NULL, NULL, NULL);
+ if (!ost->sws_ctx) {
+ fprintf(stderr,
+ "Could not initialize the conversion context\n");
+ exit(1);
+ }
+ }
+ fill_yuv_image(ost->tmp_frame, ost->next_pts, c->width, c->height);
+ sws_scale(ost->sws_ctx, (const uint8_t * const *) ost->tmp_frame->data,
+ ost->tmp_frame->linesize, 0, c->height, ost->frame->data,
+ ost->frame->linesize);
} else {
- AVPacket pkt = { 0 };
- int got_packet;
- av_init_packet(&pkt);
+ fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height);
+ }
- /* encode the image */
- ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
- if (ret < 0) {
- fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
- exit(1);
- }
- /* If size is zero, it means the image was buffered. */
+ ost->frame->pts = ost->next_pts++;
- if (!ret && got_packet && pkt.size) {
- pkt.stream_index = st->index;
+ return ost->frame;
+}
- /* Write the compressed frame to the media file. */
- ret = av_interleaved_write_frame(oc, &pkt);
- } else {
- ret = 0;
- }
- }
- if (ret != 0) {
- fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
- exit(1);
- }
- frame_count++;
+/*
+ * encode one video frame and send it to the muxer
+ * return 1 when encoding is finished, 0 otherwise
+ */
+static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
+{
+ return write_frame(oc, ost->enc, ost->st, get_video_frame(ost));
}
-static void close_video(AVFormatContext *oc, AVStream *st)
+static void close_stream(AVFormatContext *oc, OutputStream *ost)
{
- avcodec_close(st->codec);
- av_free(src_picture.data[0]);
- av_free(dst_picture.data[0]);
- av_free(frame);
+ avcodec_free_context(&ost->enc);
+ av_frame_free(&ost->frame);
+ av_frame_free(&ost->tmp_frame);
+ sws_freeContext(ost->sws_ctx);
+ swr_free(&ost->swr_ctx);
}
/**************************************************************/
@@ -447,18 +535,18 @@ static void close_video(AVFormatContext *oc, AVStream *st)
int main(int argc, char **argv)
{
+ OutputStream video_st = { 0 }, audio_st = { 0 };
const char *filename;
AVOutputFormat *fmt;
AVFormatContext *oc;
- AVStream *audio_st, *video_st;
AVCodec *audio_codec, *video_codec;
- double audio_time, video_time;
int ret;
+ int have_video = 0, have_audio = 0;
+ int encode_video = 0, encode_audio = 0;
+ AVDictionary *opt = NULL;
+ int i;
- /* Initialize libavcodec, and register all codecs and formats. */
- av_register_all();
-
- if (argc != 2) {
+ if (argc < 2) {
printf("usage: %s output_file\n"
"API example program to output a media file with libavformat.\n"
"This program generates a synthetic audio and video stream, encodes and\n"
@@ -470,6 +558,10 @@ int main(int argc, char **argv)
}
filename = argv[1];
+ for (i = 2; i+1 < argc; i+=2) {
+ if (!strcmp(argv[i], "-flags") || !strcmp(argv[i], "-fflags"))
+ av_dict_set(&opt, argv[i]+1, argv[i+1], 0);
+ }
/* allocate the output media context */
avformat_alloc_output_context2(&oc, NULL, NULL, filename);
@@ -477,29 +569,31 @@ int main(int argc, char **argv)
printf("Could not deduce output format from file extension: using MPEG.\n");
avformat_alloc_output_context2(&oc, NULL, "mpeg", filename);
}
- if (!oc) {
+ if (!oc)
return 1;
- }
+
fmt = oc->oformat;
/* Add the audio and video streams using the default format codecs
* and initialize the codecs. */
- video_st = NULL;
- audio_st = NULL;
-
if (fmt->video_codec != AV_CODEC_ID_NONE) {
- video_st = add_stream(oc, &video_codec, fmt->video_codec);
+ add_stream(&video_st, oc, &video_codec, fmt->video_codec);
+ have_video = 1;
+ encode_video = 1;
}
if (fmt->audio_codec != AV_CODEC_ID_NONE) {
- audio_st = add_stream(oc, &audio_codec, fmt->audio_codec);
+ add_stream(&audio_st, oc, &audio_codec, fmt->audio_codec);
+ have_audio = 1;
+ encode_audio = 1;
}
/* Now that all the parameters are set, we can open the audio and
* video codecs and allocate the necessary encode buffers. */
- if (video_st)
- open_video(oc, video_codec, video_st);
- if (audio_st)
- open_audio(oc, audio_codec, audio_st);
+ if (have_video)
+ open_video(oc, video_codec, &video_st, opt);
+
+ if (have_audio)
+ open_audio(oc, audio_codec, &audio_st, opt);
av_dump_format(oc, 0, filename, 1);
@@ -514,30 +608,21 @@ int main(int argc, char **argv)
}
/* Write the stream header, if any. */
- ret = avformat_write_header(oc, NULL);
+ ret = avformat_write_header(oc, &opt);
if (ret < 0) {
fprintf(stderr, "Error occurred when opening output file: %s\n",
av_err2str(ret));
return 1;
}
- if (frame)
- frame->pts = 0;
- for (;;) {
- /* Compute current audio and video time. */
- audio_time = audio_st ? audio_st->pts.val * av_q2d(audio_st->time_base) : 0.0;
- video_time = video_st ? video_st->pts.val * av_q2d(video_st->time_base) : 0.0;
-
- if ((!audio_st || audio_time >= STREAM_DURATION) &&
- (!video_st || video_time >= STREAM_DURATION))
- break;
-
- /* write interleaved audio and video frames */
- if (!video_st || (video_st && audio_st && audio_time < video_time)) {
- write_audio_frame(oc, audio_st);
+ while (encode_video || encode_audio) {
+ /* select the stream to encode */
+ if (encode_video &&
+ (!encode_audio || av_compare_ts(video_st.next_pts, video_st.enc->time_base,
+ audio_st.next_pts, audio_st.enc->time_base) <= 0)) {
+ encode_video = !write_video_frame(oc, &video_st);
} else {
- write_video_frame(oc, video_st);
- frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);
+ encode_audio = !write_audio_frame(oc, &audio_st);
}
}
@@ -548,14 +633,14 @@ int main(int argc, char **argv)
av_write_trailer(oc);
/* Close each codec. */
- if (video_st)
- close_video(oc, video_st);
- if (audio_st)
- close_audio(oc, audio_st);
+ if (have_video)
+ close_stream(oc, &video_st);
+ if (have_audio)
+ close_stream(oc, &audio_st);
if (!(fmt->flags & AVFMT_NOFILE))
/* Close the output file. */
- avio_close(oc->pb);
+ avio_closep(&oc->pb);
/* free the stream */
avformat_free_context(oc);
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libavcodec-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libavcodec-uninstalled.pc
new file mode 100644
index 0000000000..72c612c7dd
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libavcodec-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libavcodec
+includedir=.
+
+Name: libavcodec
+Description: FFmpeg codec library
+Version: 58.134.100
+Requires: libswresample >= 3.9.100, libavutil >= 56.70.100
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lavcodec
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libavdevice-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libavdevice-uninstalled.pc
new file mode 100644
index 0000000000..a048bce0fe
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libavdevice-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libavdevice
+includedir=.
+
+Name: libavdevice
+Description: FFmpeg device handling library
+Version: 58.13.100
+Requires: libavfilter >= 7.110.100, libswscale >= 5.9.100, libavformat >= 58.76.100, libavcodec >= 58.134.100, libswresample >= 3.9.100, libavutil >= 56.70.100
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lavdevice
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libavfilter-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libavfilter-uninstalled.pc
new file mode 100644
index 0000000000..68b496ea19
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libavfilter-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libavfilter
+includedir=.
+
+Name: libavfilter
+Description: FFmpeg audio/video filtering library
+Version: 7.110.100
+Requires: libswscale >= 5.9.100, libavformat >= 58.76.100, libavcodec >= 58.134.100, libswresample >= 3.9.100, libavutil >= 56.70.100
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lavfilter
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libavformat-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libavformat-uninstalled.pc
new file mode 100644
index 0000000000..c51637204b
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libavformat-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libavformat
+includedir=.
+
+Name: libavformat
+Description: FFmpeg container format library
+Version: 58.76.100
+Requires: libavcodec >= 58.134.100, libswresample >= 3.9.100, libavutil >= 56.70.100
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lavformat
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libavutil-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libavutil-uninstalled.pc
new file mode 100644
index 0000000000..6afeb96a8f
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libavutil-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libavutil
+includedir=.
+
+Name: libavutil
+Description: FFmpeg utility library
+Version: 56.70.100
+Requires:
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lavutil
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libswresample-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libswresample-uninstalled.pc
new file mode 100644
index 0000000000..4f7e85e34b
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libswresample-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libswresample
+includedir=.
+
+Name: libswresample
+Description: FFmpeg audio resampling library
+Version: 3.9.100
+Requires: libavutil >= 56.70.100
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lswresample
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/pc-uninstalled/libswscale-uninstalled.pc b/extern/ffmpeg/doc/examples/pc-uninstalled/libswscale-uninstalled.pc
new file mode 100644
index 0000000000..82b29dfdd2
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/pc-uninstalled/libswscale-uninstalled.pc
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../../../libswscale
+includedir=.
+
+Name: libswscale
+Description: FFmpeg image rescaling library
+Version: 5.9.100
+Requires: libavutil >= 56.70.100
+Conflicts:
+Libs: -L${libdir} -Wl,-rpath,${libdir} -lswscale
+Cflags: -I${includedir}
diff --git a/extern/ffmpeg/doc/examples/qsvdec.c b/extern/ffmpeg/doc/examples/qsvdec.c
new file mode 100644
index 0000000000..7415eefca5
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/qsvdec.c
@@ -0,0 +1,271 @@
+/*
+ * Copyright (c) 2015 Anton Khirnov
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * Intel QSV-accelerated H.264 decoding example.
+ *
+ * @example qsvdec.c
+ * This example shows how to do QSV-accelerated H.264 decoding with output
+ * frames in the GPU video surfaces.
+ */
+
+#include "config.h"
+
+#include
+
+#include "libavformat/avformat.h"
+#include "libavformat/avio.h"
+
+#include "libavcodec/avcodec.h"
+
+#include "libavutil/buffer.h"
+#include "libavutil/error.h"
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_qsv.h"
+#include "libavutil/mem.h"
+
+typedef struct DecodeContext {
+ AVBufferRef *hw_device_ref;
+} DecodeContext;
+
+static int get_format(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts)
+{
+ while (*pix_fmts != AV_PIX_FMT_NONE) {
+ if (*pix_fmts == AV_PIX_FMT_QSV) {
+ DecodeContext *decode = avctx->opaque;
+ AVHWFramesContext *frames_ctx;
+ AVQSVFramesContext *frames_hwctx;
+ int ret;
+
+ /* create a pool of surfaces to be used by the decoder */
+ avctx->hw_frames_ctx = av_hwframe_ctx_alloc(decode->hw_device_ref);
+ if (!avctx->hw_frames_ctx)
+ return AV_PIX_FMT_NONE;
+ frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
+ frames_hwctx = frames_ctx->hwctx;
+
+ frames_ctx->format = AV_PIX_FMT_QSV;
+ frames_ctx->sw_format = avctx->sw_pix_fmt;
+ frames_ctx->width = FFALIGN(avctx->coded_width, 32);
+ frames_ctx->height = FFALIGN(avctx->coded_height, 32);
+ frames_ctx->initial_pool_size = 32;
+
+ frames_hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET;
+
+ ret = av_hwframe_ctx_init(avctx->hw_frames_ctx);
+ if (ret < 0)
+ return AV_PIX_FMT_NONE;
+
+ return AV_PIX_FMT_QSV;
+ }
+
+ pix_fmts++;
+ }
+
+ fprintf(stderr, "The QSV pixel format not offered in get_format()\n");
+
+ return AV_PIX_FMT_NONE;
+}
+
+static int decode_packet(DecodeContext *decode, AVCodecContext *decoder_ctx,
+ AVFrame *frame, AVFrame *sw_frame,
+ AVPacket *pkt, AVIOContext *output_ctx)
+{
+ int ret = 0;
+
+ ret = avcodec_send_packet(decoder_ctx, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error during decoding\n");
+ return ret;
+ }
+
+ while (ret >= 0) {
+ int i, j;
+
+ ret = avcodec_receive_frame(decoder_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ break;
+ else if (ret < 0) {
+ fprintf(stderr, "Error during decoding\n");
+ return ret;
+ }
+
+ /* A real program would do something useful with the decoded frame here.
+ * We just retrieve the raw data and write it to a file, which is rather
+ * useless but pedagogic. */
+ ret = av_hwframe_transfer_data(sw_frame, frame, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Error transferring the data to system memory\n");
+ goto fail;
+ }
+
+ for (i = 0; i < FF_ARRAY_ELEMS(sw_frame->data) && sw_frame->data[i]; i++)
+ for (j = 0; j < (sw_frame->height >> (i > 0)); j++)
+ avio_write(output_ctx, sw_frame->data[i] + j * sw_frame->linesize[i], sw_frame->width);
+
+fail:
+ av_frame_unref(sw_frame);
+ av_frame_unref(frame);
+
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ AVFormatContext *input_ctx = NULL;
+ AVStream *video_st = NULL;
+ AVCodecContext *decoder_ctx = NULL;
+ const AVCodec *decoder;
+
+ AVPacket pkt = { 0 };
+ AVFrame *frame = NULL, *sw_frame = NULL;
+
+ DecodeContext decode = { NULL };
+
+ AVIOContext *output_ctx = NULL;
+
+ int ret, i;
+
+ if (argc < 3) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ return 1;
+ }
+
+ /* open the input file */
+ ret = avformat_open_input(&input_ctx, argv[1], NULL, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Cannot open input file '%s': ", argv[1]);
+ goto finish;
+ }
+
+ /* find the first H.264 video stream */
+ for (i = 0; i < input_ctx->nb_streams; i++) {
+ AVStream *st = input_ctx->streams[i];
+
+ if (st->codecpar->codec_id == AV_CODEC_ID_H264 && !video_st)
+ video_st = st;
+ else
+ st->discard = AVDISCARD_ALL;
+ }
+ if (!video_st) {
+ fprintf(stderr, "No H.264 video stream in the input file\n");
+ goto finish;
+ }
+
+ /* open the hardware device */
+ ret = av_hwdevice_ctx_create(&decode.hw_device_ref, AV_HWDEVICE_TYPE_QSV,
+ "auto", NULL, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Cannot open the hardware device\n");
+ goto finish;
+ }
+
+ /* initialize the decoder */
+ decoder = avcodec_find_decoder_by_name("h264_qsv");
+ if (!decoder) {
+ fprintf(stderr, "The QSV decoder is not present in libavcodec\n");
+ goto finish;
+ }
+
+ decoder_ctx = avcodec_alloc_context3(decoder);
+ if (!decoder_ctx) {
+ ret = AVERROR(ENOMEM);
+ goto finish;
+ }
+ decoder_ctx->codec_id = AV_CODEC_ID_H264;
+ if (video_st->codecpar->extradata_size) {
+ decoder_ctx->extradata = av_mallocz(video_st->codecpar->extradata_size +
+ AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!decoder_ctx->extradata) {
+ ret = AVERROR(ENOMEM);
+ goto finish;
+ }
+ memcpy(decoder_ctx->extradata, video_st->codecpar->extradata,
+ video_st->codecpar->extradata_size);
+ decoder_ctx->extradata_size = video_st->codecpar->extradata_size;
+ }
+
+ decoder_ctx->opaque = &decode;
+ decoder_ctx->get_format = get_format;
+
+ ret = avcodec_open2(decoder_ctx, NULL, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Error opening the decoder: ");
+ goto finish;
+ }
+
+ /* open the output stream */
+ ret = avio_open(&output_ctx, argv[2], AVIO_FLAG_WRITE);
+ if (ret < 0) {
+ fprintf(stderr, "Error opening the output context: ");
+ goto finish;
+ }
+
+ frame = av_frame_alloc();
+ sw_frame = av_frame_alloc();
+ if (!frame || !sw_frame) {
+ ret = AVERROR(ENOMEM);
+ goto finish;
+ }
+
+ /* actual decoding */
+ while (ret >= 0) {
+ ret = av_read_frame(input_ctx, &pkt);
+ if (ret < 0)
+ break;
+
+ if (pkt.stream_index == video_st->index)
+ ret = decode_packet(&decode, decoder_ctx, frame, sw_frame, &pkt, output_ctx);
+
+ av_packet_unref(&pkt);
+ }
+
+ /* flush the decoder */
+ pkt.data = NULL;
+ pkt.size = 0;
+ ret = decode_packet(&decode, decoder_ctx, frame, sw_frame, &pkt, output_ctx);
+
+finish:
+ if (ret < 0) {
+ char buf[1024];
+ av_strerror(ret, buf, sizeof(buf));
+ fprintf(stderr, "%s\n", buf);
+ }
+
+ avformat_close_input(&input_ctx);
+
+ av_frame_free(&frame);
+ av_frame_free(&sw_frame);
+
+ avcodec_free_context(&decoder_ctx);
+
+ av_buffer_unref(&decode.hw_device_ref);
+
+ avio_close(output_ctx);
+
+ return ret;
+}
diff --git a/extern/ffmpeg/doc/examples/remuxing.c b/extern/ffmpeg/doc/examples/remuxing.c
new file mode 100644
index 0000000000..9e4d1031b4
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/remuxing.c
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2013 Stefano Sabatini
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * libavformat/libavcodec demuxing and muxing API example.
+ *
+ * Remux streams from one container format to another.
+ * @example remuxing.c
+ */
+
+#include
+#include
+
+static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt, const char *tag)
+{
+ AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base;
+
+ printf("%s: pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
+ tag,
+ av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
+ av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
+ av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
+ pkt->stream_index);
+}
+
+int main(int argc, char **argv)
+{
+ AVOutputFormat *ofmt = NULL;
+ AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
+ AVPacket pkt;
+ const char *in_filename, *out_filename;
+ int ret, i;
+ int stream_index = 0;
+ int *stream_mapping = NULL;
+ int stream_mapping_size = 0;
+
+ if (argc < 3) {
+ printf("usage: %s input output\n"
+ "API example program to remux a media file with libavformat and libavcodec.\n"
+ "The output format is guessed according to the file extension.\n"
+ "\n", argv[0]);
+ return 1;
+ }
+
+ in_filename = argv[1];
+ out_filename = argv[2];
+
+ if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
+ fprintf(stderr, "Could not open input file '%s'", in_filename);
+ goto end;
+ }
+
+ if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
+ fprintf(stderr, "Failed to retrieve input stream information");
+ goto end;
+ }
+
+ av_dump_format(ifmt_ctx, 0, in_filename, 0);
+
+ avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
+ if (!ofmt_ctx) {
+ fprintf(stderr, "Could not create output context\n");
+ ret = AVERROR_UNKNOWN;
+ goto end;
+ }
+
+ stream_mapping_size = ifmt_ctx->nb_streams;
+ stream_mapping = av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping));
+ if (!stream_mapping) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ ofmt = ofmt_ctx->oformat;
+
+ for (i = 0; i < ifmt_ctx->nb_streams; i++) {
+ AVStream *out_stream;
+ AVStream *in_stream = ifmt_ctx->streams[i];
+ AVCodecParameters *in_codecpar = in_stream->codecpar;
+
+ if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO &&
+ in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO &&
+ in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) {
+ stream_mapping[i] = -1;
+ continue;
+ }
+
+ stream_mapping[i] = stream_index++;
+
+ out_stream = avformat_new_stream(ofmt_ctx, NULL);
+ if (!out_stream) {
+ fprintf(stderr, "Failed allocating output stream\n");
+ ret = AVERROR_UNKNOWN;
+ goto end;
+ }
+
+ ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to copy codec parameters\n");
+ goto end;
+ }
+ out_stream->codecpar->codec_tag = 0;
+ }
+ av_dump_format(ofmt_ctx, 0, out_filename, 1);
+
+ if (!(ofmt->flags & AVFMT_NOFILE)) {
+ ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
+ if (ret < 0) {
+ fprintf(stderr, "Could not open output file '%s'", out_filename);
+ goto end;
+ }
+ }
+
+ ret = avformat_write_header(ofmt_ctx, NULL);
+ if (ret < 0) {
+ fprintf(stderr, "Error occurred when opening output file\n");
+ goto end;
+ }
+
+ while (1) {
+ AVStream *in_stream, *out_stream;
+
+ ret = av_read_frame(ifmt_ctx, &pkt);
+ if (ret < 0)
+ break;
+
+ in_stream = ifmt_ctx->streams[pkt.stream_index];
+ if (pkt.stream_index >= stream_mapping_size ||
+ stream_mapping[pkt.stream_index] < 0) {
+ av_packet_unref(&pkt);
+ continue;
+ }
+
+ pkt.stream_index = stream_mapping[pkt.stream_index];
+ out_stream = ofmt_ctx->streams[pkt.stream_index];
+ log_packet(ifmt_ctx, &pkt, "in");
+
+ /* copy packet */
+ pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
+ pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
+ pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
+ pkt.pos = -1;
+ log_packet(ofmt_ctx, &pkt, "out");
+
+ ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error muxing packet\n");
+ break;
+ }
+ av_packet_unref(&pkt);
+ }
+
+ av_write_trailer(ofmt_ctx);
+end:
+
+ avformat_close_input(&ifmt_ctx);
+
+ /* close output */
+ if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
+ avio_closep(&ofmt_ctx->pb);
+ avformat_free_context(ofmt_ctx);
+
+ av_freep(&stream_mapping);
+
+ if (ret < 0 && ret != AVERROR_EOF) {
+ fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/extern/ffmpeg/doc/examples/resampling_audio.c b/extern/ffmpeg/doc/examples/resampling_audio.c
index 70db9efe05..f35e7e1779 100644
--- a/extern/ffmpeg/doc/examples/resampling_audio.c
+++ b/extern/ffmpeg/doc/examples/resampling_audio.c
@@ -21,7 +21,7 @@
*/
/**
- * @example doc/examples/resampling_audio.c
+ * @example resampling_audio.c
* libswresample API use example.
*/
@@ -62,7 +62,7 @@ static int get_format_from_sample_fmt(const char **fmt,
/**
* Fill dst buffer with nb_samples, generated starting from t.
*/
-void fill_samples(double *dst, int nb_samples, int nb_channels, int sample_rate, double *t)
+static void fill_samples(double *dst, int nb_samples, int nb_channels, int sample_rate, double *t)
{
int i, j;
double tincr = 1.0 / sample_rate, *dstp = dst;
@@ -168,7 +168,7 @@ int main(int argc, char **argv)
dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) +
src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);
if (dst_nb_samples > max_dst_nb_samples) {
- av_free(dst_data[0]);
+ av_freep(&dst_data[0]);
ret = av_samples_alloc(dst_data, &dst_linesize, dst_nb_channels,
dst_nb_samples, dst_sample_fmt, 1);
if (ret < 0)
@@ -184,6 +184,10 @@ int main(int argc, char **argv)
}
dst_bufsize = av_samples_get_buffer_size(&dst_linesize, dst_nb_channels,
ret, dst_sample_fmt, 1);
+ if (dst_bufsize < 0) {
+ fprintf(stderr, "Could not get sample buffer size\n");
+ goto end;
+ }
printf("t:%f in:%d out:%d\n", t, src_nb_samples, ret);
fwrite(dst_data[0], 1, dst_bufsize, dst_file);
} while (t < 10);
@@ -195,8 +199,7 @@ int main(int argc, char **argv)
fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename);
end:
- if (dst_file)
- fclose(dst_file);
+ fclose(dst_file);
if (src_data)
av_freep(&src_data[0]);
diff --git a/extern/ffmpeg/doc/examples/scaling_video.c b/extern/ffmpeg/doc/examples/scaling_video.c
index be2c510ffa..587f3abe4f 100644
--- a/extern/ffmpeg/doc/examples/scaling_video.c
+++ b/extern/ffmpeg/doc/examples/scaling_video.c
@@ -23,7 +23,7 @@
/**
* @file
* libswscale API use example.
- * @example doc/examples/scaling_video.c
+ * @example scaling_video.c
*/
#include
@@ -132,8 +132,7 @@ int main(int argc, char **argv)
av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);
end:
- if (dst_file)
- fclose(dst_file);
+ fclose(dst_file);
av_freep(&src_data[0]);
av_freep(&dst_data[0]);
sws_freeContext(sws_ctx);
diff --git a/extern/ffmpeg/doc/examples/transcode_aac.c b/extern/ffmpeg/doc/examples/transcode_aac.c
new file mode 100644
index 0000000000..73786ab59b
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/transcode_aac.c
@@ -0,0 +1,893 @@
+/*
+ * Copyright (c) 2013-2018 Andreas Unterweger
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Simple audio converter
+ *
+ * @example transcode_aac.c
+ * Convert an input audio file to AAC in an MP4 container using FFmpeg.
+ * Formats other than MP4 are supported based on the output file extension.
+ * @author Andreas Unterweger (dustsigns@gmail.com)
+ */
+
+#include
+
+#include "libavformat/avformat.h"
+#include "libavformat/avio.h"
+
+#include "libavcodec/avcodec.h"
+
+#include "libavutil/audio_fifo.h"
+#include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
+#include "libavutil/frame.h"
+#include "libavutil/opt.h"
+
+#include "libswresample/swresample.h"
+
+/* The output bit rate in bit/s */
+#define OUTPUT_BIT_RATE 96000
+/* The number of output channels */
+#define OUTPUT_CHANNELS 2
+
+/**
+ * Open an input file and the required decoder.
+ * @param filename File to be opened
+ * @param[out] input_format_context Format context of opened file
+ * @param[out] input_codec_context Codec context of opened file
+ * @return Error code (0 if successful)
+ */
+static int open_input_file(const char *filename,
+ AVFormatContext **input_format_context,
+ AVCodecContext **input_codec_context)
+{
+ AVCodecContext *avctx;
+ AVCodec *input_codec;
+ int error;
+
+ /* Open the input file to read from it. */
+ if ((error = avformat_open_input(input_format_context, filename, NULL,
+ NULL)) < 0) {
+ fprintf(stderr, "Could not open input file '%s' (error '%s')\n",
+ filename, av_err2str(error));
+ *input_format_context = NULL;
+ return error;
+ }
+
+ /* Get information on the input file (number of streams etc.). */
+ if ((error = avformat_find_stream_info(*input_format_context, NULL)) < 0) {
+ fprintf(stderr, "Could not open find stream info (error '%s')\n",
+ av_err2str(error));
+ avformat_close_input(input_format_context);
+ return error;
+ }
+
+ /* Make sure that there is only one stream in the input file. */
+ if ((*input_format_context)->nb_streams != 1) {
+ fprintf(stderr, "Expected one audio input stream, but found %d\n",
+ (*input_format_context)->nb_streams);
+ avformat_close_input(input_format_context);
+ return AVERROR_EXIT;
+ }
+
+ /* Find a decoder for the audio stream. */
+ if (!(input_codec = avcodec_find_decoder((*input_format_context)->streams[0]->codecpar->codec_id))) {
+ fprintf(stderr, "Could not find input codec\n");
+ avformat_close_input(input_format_context);
+ return AVERROR_EXIT;
+ }
+
+ /* Allocate a new decoding context. */
+ avctx = avcodec_alloc_context3(input_codec);
+ if (!avctx) {
+ fprintf(stderr, "Could not allocate a decoding context\n");
+ avformat_close_input(input_format_context);
+ return AVERROR(ENOMEM);
+ }
+
+ /* Initialize the stream parameters with demuxer information. */
+ error = avcodec_parameters_to_context(avctx, (*input_format_context)->streams[0]->codecpar);
+ if (error < 0) {
+ avformat_close_input(input_format_context);
+ avcodec_free_context(&avctx);
+ return error;
+ }
+
+ /* Open the decoder for the audio stream to use it later. */
+ if ((error = avcodec_open2(avctx, input_codec, NULL)) < 0) {
+ fprintf(stderr, "Could not open input codec (error '%s')\n",
+ av_err2str(error));
+ avcodec_free_context(&avctx);
+ avformat_close_input(input_format_context);
+ return error;
+ }
+
+ /* Save the decoder context for easier access later. */
+ *input_codec_context = avctx;
+
+ return 0;
+}
+
+/**
+ * Open an output file and the required encoder.
+ * Also set some basic encoder parameters.
+ * Some of these parameters are based on the input file's parameters.
+ * @param filename File to be opened
+ * @param input_codec_context Codec context of input file
+ * @param[out] output_format_context Format context of output file
+ * @param[out] output_codec_context Codec context of output file
+ * @return Error code (0 if successful)
+ */
+static int open_output_file(const char *filename,
+ AVCodecContext *input_codec_context,
+ AVFormatContext **output_format_context,
+ AVCodecContext **output_codec_context)
+{
+ AVCodecContext *avctx = NULL;
+ AVIOContext *output_io_context = NULL;
+ AVStream *stream = NULL;
+ AVCodec *output_codec = NULL;
+ int error;
+
+ /* Open the output file to write to it. */
+ if ((error = avio_open(&output_io_context, filename,
+ AVIO_FLAG_WRITE)) < 0) {
+ fprintf(stderr, "Could not open output file '%s' (error '%s')\n",
+ filename, av_err2str(error));
+ return error;
+ }
+
+ /* Create a new format context for the output container format. */
+ if (!(*output_format_context = avformat_alloc_context())) {
+ fprintf(stderr, "Could not allocate output format context\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* Associate the output file (pointer) with the container format context. */
+ (*output_format_context)->pb = output_io_context;
+
+ /* Guess the desired container format based on the file extension. */
+ if (!((*output_format_context)->oformat = av_guess_format(NULL, filename,
+ NULL))) {
+ fprintf(stderr, "Could not find output file format\n");
+ goto cleanup;
+ }
+
+ if (!((*output_format_context)->url = av_strdup(filename))) {
+ fprintf(stderr, "Could not allocate url.\n");
+ error = AVERROR(ENOMEM);
+ goto cleanup;
+ }
+
+ /* Find the encoder to be used by its name. */
+ if (!(output_codec = avcodec_find_encoder(AV_CODEC_ID_AAC))) {
+ fprintf(stderr, "Could not find an AAC encoder.\n");
+ goto cleanup;
+ }
+
+ /* Create a new audio stream in the output file container. */
+ if (!(stream = avformat_new_stream(*output_format_context, NULL))) {
+ fprintf(stderr, "Could not create new stream\n");
+ error = AVERROR(ENOMEM);
+ goto cleanup;
+ }
+
+ avctx = avcodec_alloc_context3(output_codec);
+ if (!avctx) {
+ fprintf(stderr, "Could not allocate an encoding context\n");
+ error = AVERROR(ENOMEM);
+ goto cleanup;
+ }
+
+ /* Set the basic encoder parameters.
+ * The input file's sample rate is used to avoid a sample rate conversion. */
+ avctx->channels = OUTPUT_CHANNELS;
+ avctx->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
+ avctx->sample_rate = input_codec_context->sample_rate;
+ avctx->sample_fmt = output_codec->sample_fmts[0];
+ avctx->bit_rate = OUTPUT_BIT_RATE;
+
+ /* Allow the use of the experimental AAC encoder. */
+ avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
+
+ /* Set the sample rate for the container. */
+ stream->time_base.den = input_codec_context->sample_rate;
+ stream->time_base.num = 1;
+
+ /* Some container formats (like MP4) require global headers to be present.
+ * Mark the encoder so that it behaves accordingly. */
+ if ((*output_format_context)->oformat->flags & AVFMT_GLOBALHEADER)
+ avctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+
+ /* Open the encoder for the audio stream to use it later. */
+ if ((error = avcodec_open2(avctx, output_codec, NULL)) < 0) {
+ fprintf(stderr, "Could not open output codec (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ }
+
+ error = avcodec_parameters_from_context(stream->codecpar, avctx);
+ if (error < 0) {
+ fprintf(stderr, "Could not initialize stream parameters\n");
+ goto cleanup;
+ }
+
+ /* Save the encoder context for easier access later. */
+ *output_codec_context = avctx;
+
+ return 0;
+
+cleanup:
+ avcodec_free_context(&avctx);
+ avio_closep(&(*output_format_context)->pb);
+ avformat_free_context(*output_format_context);
+ *output_format_context = NULL;
+ return error < 0 ? error : AVERROR_EXIT;
+}
+
+/**
+ * Initialize one data packet for reading or writing.
+ * @param[out] packet Packet to be initialized
+ * @return Error code (0 if successful)
+ */
+static int init_packet(AVPacket **packet)
+{
+ if (!(*packet = av_packet_alloc())) {
+ fprintf(stderr, "Could not allocate packet\n");
+ return AVERROR(ENOMEM);
+ }
+ return 0;
+}
+
+/**
+ * Initialize one audio frame for reading from the input file.
+ * @param[out] frame Frame to be initialized
+ * @return Error code (0 if successful)
+ */
+static int init_input_frame(AVFrame **frame)
+{
+ if (!(*frame = av_frame_alloc())) {
+ fprintf(stderr, "Could not allocate input frame\n");
+ return AVERROR(ENOMEM);
+ }
+ return 0;
+}
+
+/**
+ * Initialize the audio resampler based on the input and output codec settings.
+ * If the input and output sample formats differ, a conversion is required
+ * libswresample takes care of this, but requires initialization.
+ * @param input_codec_context Codec context of the input file
+ * @param output_codec_context Codec context of the output file
+ * @param[out] resample_context Resample context for the required conversion
+ * @return Error code (0 if successful)
+ */
+static int init_resampler(AVCodecContext *input_codec_context,
+ AVCodecContext *output_codec_context,
+ SwrContext **resample_context)
+{
+ int error;
+
+ /*
+ * Create a resampler context for the conversion.
+ * Set the conversion parameters.
+ * Default channel layouts based on the number of channels
+ * are assumed for simplicity (they are sometimes not detected
+ * properly by the demuxer and/or decoder).
+ */
+ *resample_context = swr_alloc_set_opts(NULL,
+ av_get_default_channel_layout(output_codec_context->channels),
+ output_codec_context->sample_fmt,
+ output_codec_context->sample_rate,
+ av_get_default_channel_layout(input_codec_context->channels),
+ input_codec_context->sample_fmt,
+ input_codec_context->sample_rate,
+ 0, NULL);
+ if (!*resample_context) {
+ fprintf(stderr, "Could not allocate resample context\n");
+ return AVERROR(ENOMEM);
+ }
+ /*
+ * Perform a sanity check so that the number of converted samples is
+ * not greater than the number of samples to be converted.
+ * If the sample rates differ, this case has to be handled differently
+ */
+ av_assert0(output_codec_context->sample_rate == input_codec_context->sample_rate);
+
+ /* Open the resampler with the specified parameters. */
+ if ((error = swr_init(*resample_context)) < 0) {
+ fprintf(stderr, "Could not open resample context\n");
+ swr_free(resample_context);
+ return error;
+ }
+ return 0;
+}
+
+/**
+ * Initialize a FIFO buffer for the audio samples to be encoded.
+ * @param[out] fifo Sample buffer
+ * @param output_codec_context Codec context of the output file
+ * @return Error code (0 if successful)
+ */
+static int init_fifo(AVAudioFifo **fifo, AVCodecContext *output_codec_context)
+{
+ /* Create the FIFO buffer based on the specified output sample format. */
+ if (!(*fifo = av_audio_fifo_alloc(output_codec_context->sample_fmt,
+ output_codec_context->channels, 1))) {
+ fprintf(stderr, "Could not allocate FIFO\n");
+ return AVERROR(ENOMEM);
+ }
+ return 0;
+}
+
+/**
+ * Write the header of the output file container.
+ * @param output_format_context Format context of the output file
+ * @return Error code (0 if successful)
+ */
+static int write_output_file_header(AVFormatContext *output_format_context)
+{
+ int error;
+ if ((error = avformat_write_header(output_format_context, NULL)) < 0) {
+ fprintf(stderr, "Could not write output file header (error '%s')\n",
+ av_err2str(error));
+ return error;
+ }
+ return 0;
+}
+
+/**
+ * Decode one audio frame from the input file.
+ * @param frame Audio frame to be decoded
+ * @param input_format_context Format context of the input file
+ * @param input_codec_context Codec context of the input file
+ * @param[out] data_present Indicates whether data has been decoded
+ * @param[out] finished Indicates whether the end of file has
+ * been reached and all data has been
+ * decoded. If this flag is false, there
+ * is more data to be decoded, i.e., this
+ * function has to be called again.
+ * @return Error code (0 if successful)
+ */
+static int decode_audio_frame(AVFrame *frame,
+ AVFormatContext *input_format_context,
+ AVCodecContext *input_codec_context,
+ int *data_present, int *finished)
+{
+ /* Packet used for temporary storage. */
+ AVPacket *input_packet;
+ int error;
+
+ error = init_packet(&input_packet);
+ if (error < 0)
+ return error;
+
+ /* Read one audio frame from the input file into a temporary packet. */
+ if ((error = av_read_frame(input_format_context, input_packet)) < 0) {
+ /* If we are at the end of the file, flush the decoder below. */
+ if (error == AVERROR_EOF)
+ *finished = 1;
+ else {
+ fprintf(stderr, "Could not read frame (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ }
+ }
+
+ /* Send the audio frame stored in the temporary packet to the decoder.
+ * The input audio stream decoder is used to do this. */
+ if ((error = avcodec_send_packet(input_codec_context, input_packet)) < 0) {
+ fprintf(stderr, "Could not send packet for decoding (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ }
+
+ /* Receive one frame from the decoder. */
+ error = avcodec_receive_frame(input_codec_context, frame);
+ /* If the decoder asks for more data to be able to decode a frame,
+ * return indicating that no data is present. */
+ if (error == AVERROR(EAGAIN)) {
+ error = 0;
+ goto cleanup;
+ /* If the end of the input file is reached, stop decoding. */
+ } else if (error == AVERROR_EOF) {
+ *finished = 1;
+ error = 0;
+ goto cleanup;
+ } else if (error < 0) {
+ fprintf(stderr, "Could not decode frame (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ /* Default case: Return decoded data. */
+ } else {
+ *data_present = 1;
+ goto cleanup;
+ }
+
+cleanup:
+ av_packet_free(&input_packet);
+ return error;
+}
+
+/**
+ * Initialize a temporary storage for the specified number of audio samples.
+ * The conversion requires temporary storage due to the different format.
+ * The number of audio samples to be allocated is specified in frame_size.
+ * @param[out] converted_input_samples Array of converted samples. The
+ * dimensions are reference, channel
+ * (for multi-channel audio), sample.
+ * @param output_codec_context Codec context of the output file
+ * @param frame_size Number of samples to be converted in
+ * each round
+ * @return Error code (0 if successful)
+ */
+static int init_converted_samples(uint8_t ***converted_input_samples,
+ AVCodecContext *output_codec_context,
+ int frame_size)
+{
+ int error;
+
+ /* Allocate as many pointers as there are audio channels.
+ * Each pointer will later point to the audio samples of the corresponding
+ * channels (although it may be NULL for interleaved formats).
+ */
+ if (!(*converted_input_samples = calloc(output_codec_context->channels,
+ sizeof(**converted_input_samples)))) {
+ fprintf(stderr, "Could not allocate converted input sample pointers\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* Allocate memory for the samples of all channels in one consecutive
+ * block for convenience. */
+ if ((error = av_samples_alloc(*converted_input_samples, NULL,
+ output_codec_context->channels,
+ frame_size,
+ output_codec_context->sample_fmt, 0)) < 0) {
+ fprintf(stderr,
+ "Could not allocate converted input samples (error '%s')\n",
+ av_err2str(error));
+ av_freep(&(*converted_input_samples)[0]);
+ free(*converted_input_samples);
+ return error;
+ }
+ return 0;
+}
+
+/**
+ * Convert the input audio samples into the output sample format.
+ * The conversion happens on a per-frame basis, the size of which is
+ * specified by frame_size.
+ * @param input_data Samples to be decoded. The dimensions are
+ * channel (for multi-channel audio), sample.
+ * @param[out] converted_data Converted samples. The dimensions are channel
+ * (for multi-channel audio), sample.
+ * @param frame_size Number of samples to be converted
+ * @param resample_context Resample context for the conversion
+ * @return Error code (0 if successful)
+ */
+static int convert_samples(const uint8_t **input_data,
+ uint8_t **converted_data, const int frame_size,
+ SwrContext *resample_context)
+{
+ int error;
+
+ /* Convert the samples using the resampler. */
+ if ((error = swr_convert(resample_context,
+ converted_data, frame_size,
+ input_data , frame_size)) < 0) {
+ fprintf(stderr, "Could not convert input samples (error '%s')\n",
+ av_err2str(error));
+ return error;
+ }
+
+ return 0;
+}
+
+/**
+ * Add converted input audio samples to the FIFO buffer for later processing.
+ * @param fifo Buffer to add the samples to
+ * @param converted_input_samples Samples to be added. The dimensions are channel
+ * (for multi-channel audio), sample.
+ * @param frame_size Number of samples to be converted
+ * @return Error code (0 if successful)
+ */
+static int add_samples_to_fifo(AVAudioFifo *fifo,
+ uint8_t **converted_input_samples,
+ const int frame_size)
+{
+ int error;
+
+ /* Make the FIFO as large as it needs to be to hold both,
+ * the old and the new samples. */
+ if ((error = av_audio_fifo_realloc(fifo, av_audio_fifo_size(fifo) + frame_size)) < 0) {
+ fprintf(stderr, "Could not reallocate FIFO\n");
+ return error;
+ }
+
+ /* Store the new samples in the FIFO buffer. */
+ if (av_audio_fifo_write(fifo, (void **)converted_input_samples,
+ frame_size) < frame_size) {
+ fprintf(stderr, "Could not write data to FIFO\n");
+ return AVERROR_EXIT;
+ }
+ return 0;
+}
+
+/**
+ * Read one audio frame from the input file, decode, convert and store
+ * it in the FIFO buffer.
+ * @param fifo Buffer used for temporary storage
+ * @param input_format_context Format context of the input file
+ * @param input_codec_context Codec context of the input file
+ * @param output_codec_context Codec context of the output file
+ * @param resampler_context Resample context for the conversion
+ * @param[out] finished Indicates whether the end of file has
+ * been reached and all data has been
+ * decoded. If this flag is false,
+ * there is more data to be decoded,
+ * i.e., this function has to be called
+ * again.
+ * @return Error code (0 if successful)
+ */
+static int read_decode_convert_and_store(AVAudioFifo *fifo,
+ AVFormatContext *input_format_context,
+ AVCodecContext *input_codec_context,
+ AVCodecContext *output_codec_context,
+ SwrContext *resampler_context,
+ int *finished)
+{
+ /* Temporary storage of the input samples of the frame read from the file. */
+ AVFrame *input_frame = NULL;
+ /* Temporary storage for the converted input samples. */
+ uint8_t **converted_input_samples = NULL;
+ int data_present = 0;
+ int ret = AVERROR_EXIT;
+
+ /* Initialize temporary storage for one input frame. */
+ if (init_input_frame(&input_frame))
+ goto cleanup;
+ /* Decode one frame worth of audio samples. */
+ if (decode_audio_frame(input_frame, input_format_context,
+ input_codec_context, &data_present, finished))
+ goto cleanup;
+ /* If we are at the end of the file and there are no more samples
+ * in the decoder which are delayed, we are actually finished.
+ * This must not be treated as an error. */
+ if (*finished) {
+ ret = 0;
+ goto cleanup;
+ }
+ /* If there is decoded data, convert and store it. */
+ if (data_present) {
+ /* Initialize the temporary storage for the converted input samples. */
+ if (init_converted_samples(&converted_input_samples, output_codec_context,
+ input_frame->nb_samples))
+ goto cleanup;
+
+ /* Convert the input samples to the desired output sample format.
+ * This requires a temporary storage provided by converted_input_samples. */
+ if (convert_samples((const uint8_t**)input_frame->extended_data, converted_input_samples,
+ input_frame->nb_samples, resampler_context))
+ goto cleanup;
+
+ /* Add the converted input samples to the FIFO buffer for later processing. */
+ if (add_samples_to_fifo(fifo, converted_input_samples,
+ input_frame->nb_samples))
+ goto cleanup;
+ ret = 0;
+ }
+ ret = 0;
+
+cleanup:
+ if (converted_input_samples) {
+ av_freep(&converted_input_samples[0]);
+ free(converted_input_samples);
+ }
+ av_frame_free(&input_frame);
+
+ return ret;
+}
+
+/**
+ * Initialize one input frame for writing to the output file.
+ * The frame will be exactly frame_size samples large.
+ * @param[out] frame Frame to be initialized
+ * @param output_codec_context Codec context of the output file
+ * @param frame_size Size of the frame
+ * @return Error code (0 if successful)
+ */
+static int init_output_frame(AVFrame **frame,
+ AVCodecContext *output_codec_context,
+ int frame_size)
+{
+ int error;
+
+ /* Create a new frame to store the audio samples. */
+ if (!(*frame = av_frame_alloc())) {
+ fprintf(stderr, "Could not allocate output frame\n");
+ return AVERROR_EXIT;
+ }
+
+ /* Set the frame's parameters, especially its size and format.
+ * av_frame_get_buffer needs this to allocate memory for the
+ * audio samples of the frame.
+ * Default channel layouts based on the number of channels
+ * are assumed for simplicity. */
+ (*frame)->nb_samples = frame_size;
+ (*frame)->channel_layout = output_codec_context->channel_layout;
+ (*frame)->format = output_codec_context->sample_fmt;
+ (*frame)->sample_rate = output_codec_context->sample_rate;
+
+ /* Allocate the samples of the created frame. This call will make
+ * sure that the audio frame can hold as many samples as specified. */
+ if ((error = av_frame_get_buffer(*frame, 0)) < 0) {
+ fprintf(stderr, "Could not allocate output frame samples (error '%s')\n",
+ av_err2str(error));
+ av_frame_free(frame);
+ return error;
+ }
+
+ return 0;
+}
+
+/* Global timestamp for the audio frames. */
+static int64_t pts = 0;
+
+/**
+ * Encode one frame worth of audio to the output file.
+ * @param frame Samples to be encoded
+ * @param output_format_context Format context of the output file
+ * @param output_codec_context Codec context of the output file
+ * @param[out] data_present Indicates whether data has been
+ * encoded
+ * @return Error code (0 if successful)
+ */
+static int encode_audio_frame(AVFrame *frame,
+ AVFormatContext *output_format_context,
+ AVCodecContext *output_codec_context,
+ int *data_present)
+{
+ /* Packet used for temporary storage. */
+ AVPacket *output_packet;
+ int error;
+
+ error = init_packet(&output_packet);
+ if (error < 0)
+ return error;
+
+ /* Set a timestamp based on the sample rate for the container. */
+ if (frame) {
+ frame->pts = pts;
+ pts += frame->nb_samples;
+ }
+
+ /* Send the audio frame stored in the temporary packet to the encoder.
+ * The output audio stream encoder is used to do this. */
+ error = avcodec_send_frame(output_codec_context, frame);
+ /* The encoder signals that it has nothing more to encode. */
+ if (error == AVERROR_EOF) {
+ error = 0;
+ goto cleanup;
+ } else if (error < 0) {
+ fprintf(stderr, "Could not send packet for encoding (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ }
+
+ /* Receive one encoded frame from the encoder. */
+ error = avcodec_receive_packet(output_codec_context, output_packet);
+ /* If the encoder asks for more data to be able to provide an
+ * encoded frame, return indicating that no data is present. */
+ if (error == AVERROR(EAGAIN)) {
+ error = 0;
+ goto cleanup;
+ /* If the last frame has been encoded, stop encoding. */
+ } else if (error == AVERROR_EOF) {
+ error = 0;
+ goto cleanup;
+ } else if (error < 0) {
+ fprintf(stderr, "Could not encode frame (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ /* Default case: Return encoded data. */
+ } else {
+ *data_present = 1;
+ }
+
+ /* Write one audio frame from the temporary packet to the output file. */
+ if (*data_present &&
+ (error = av_write_frame(output_format_context, output_packet)) < 0) {
+ fprintf(stderr, "Could not write frame (error '%s')\n",
+ av_err2str(error));
+ goto cleanup;
+ }
+
+cleanup:
+ av_packet_free(&output_packet);
+ return error;
+}
+
+/**
+ * Load one audio frame from the FIFO buffer, encode and write it to the
+ * output file.
+ * @param fifo Buffer used for temporary storage
+ * @param output_format_context Format context of the output file
+ * @param output_codec_context Codec context of the output file
+ * @return Error code (0 if successful)
+ */
+static int load_encode_and_write(AVAudioFifo *fifo,
+ AVFormatContext *output_format_context,
+ AVCodecContext *output_codec_context)
+{
+ /* Temporary storage of the output samples of the frame written to the file. */
+ AVFrame *output_frame;
+ /* Use the maximum number of possible samples per frame.
+ * If there is less than the maximum possible frame size in the FIFO
+ * buffer use this number. Otherwise, use the maximum possible frame size. */
+ const int frame_size = FFMIN(av_audio_fifo_size(fifo),
+ output_codec_context->frame_size);
+ int data_written;
+
+ /* Initialize temporary storage for one output frame. */
+ if (init_output_frame(&output_frame, output_codec_context, frame_size))
+ return AVERROR_EXIT;
+
+ /* Read as many samples from the FIFO buffer as required to fill the frame.
+ * The samples are stored in the frame temporarily. */
+ if (av_audio_fifo_read(fifo, (void **)output_frame->data, frame_size) < frame_size) {
+ fprintf(stderr, "Could not read data from FIFO\n");
+ av_frame_free(&output_frame);
+ return AVERROR_EXIT;
+ }
+
+ /* Encode one frame worth of audio samples. */
+ if (encode_audio_frame(output_frame, output_format_context,
+ output_codec_context, &data_written)) {
+ av_frame_free(&output_frame);
+ return AVERROR_EXIT;
+ }
+ av_frame_free(&output_frame);
+ return 0;
+}
+
+/**
+ * Write the trailer of the output file container.
+ * @param output_format_context Format context of the output file
+ * @return Error code (0 if successful)
+ */
+static int write_output_file_trailer(AVFormatContext *output_format_context)
+{
+ int error;
+ if ((error = av_write_trailer(output_format_context)) < 0) {
+ fprintf(stderr, "Could not write output file trailer (error '%s')\n",
+ av_err2str(error));
+ return error;
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ AVFormatContext *input_format_context = NULL, *output_format_context = NULL;
+ AVCodecContext *input_codec_context = NULL, *output_codec_context = NULL;
+ SwrContext *resample_context = NULL;
+ AVAudioFifo *fifo = NULL;
+ int ret = AVERROR_EXIT;
+
+ if (argc != 3) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ exit(1);
+ }
+
+ /* Open the input file for reading. */
+ if (open_input_file(argv[1], &input_format_context,
+ &input_codec_context))
+ goto cleanup;
+ /* Open the output file for writing. */
+ if (open_output_file(argv[2], input_codec_context,
+ &output_format_context, &output_codec_context))
+ goto cleanup;
+ /* Initialize the resampler to be able to convert audio sample formats. */
+ if (init_resampler(input_codec_context, output_codec_context,
+ &resample_context))
+ goto cleanup;
+ /* Initialize the FIFO buffer to store audio samples to be encoded. */
+ if (init_fifo(&fifo, output_codec_context))
+ goto cleanup;
+ /* Write the header of the output file container. */
+ if (write_output_file_header(output_format_context))
+ goto cleanup;
+
+ /* Loop as long as we have input samples to read or output samples
+ * to write; abort as soon as we have neither. */
+ while (1) {
+ /* Use the encoder's desired frame size for processing. */
+ const int output_frame_size = output_codec_context->frame_size;
+ int finished = 0;
+
+ /* Make sure that there is one frame worth of samples in the FIFO
+ * buffer so that the encoder can do its work.
+ * Since the decoder's and the encoder's frame size may differ, we
+ * need to FIFO buffer to store as many frames worth of input samples
+ * that they make up at least one frame worth of output samples. */
+ while (av_audio_fifo_size(fifo) < output_frame_size) {
+ /* Decode one frame worth of audio samples, convert it to the
+ * output sample format and put it into the FIFO buffer. */
+ if (read_decode_convert_and_store(fifo, input_format_context,
+ input_codec_context,
+ output_codec_context,
+ resample_context, &finished))
+ goto cleanup;
+
+ /* If we are at the end of the input file, we continue
+ * encoding the remaining audio samples to the output file. */
+ if (finished)
+ break;
+ }
+
+ /* If we have enough samples for the encoder, we encode them.
+ * At the end of the file, we pass the remaining samples to
+ * the encoder. */
+ while (av_audio_fifo_size(fifo) >= output_frame_size ||
+ (finished && av_audio_fifo_size(fifo) > 0))
+ /* Take one frame worth of audio samples from the FIFO buffer,
+ * encode it and write it to the output file. */
+ if (load_encode_and_write(fifo, output_format_context,
+ output_codec_context))
+ goto cleanup;
+
+ /* If we are at the end of the input file and have encoded
+ * all remaining samples, we can exit this loop and finish. */
+ if (finished) {
+ int data_written;
+ /* Flush the encoder as it may have delayed frames. */
+ do {
+ data_written = 0;
+ if (encode_audio_frame(NULL, output_format_context,
+ output_codec_context, &data_written))
+ goto cleanup;
+ } while (data_written);
+ break;
+ }
+ }
+
+ /* Write the trailer of the output file container. */
+ if (write_output_file_trailer(output_format_context))
+ goto cleanup;
+ ret = 0;
+
+cleanup:
+ if (fifo)
+ av_audio_fifo_free(fifo);
+ swr_free(&resample_context);
+ if (output_codec_context)
+ avcodec_free_context(&output_codec_context);
+ if (output_format_context) {
+ avio_closep(&output_format_context->pb);
+ avformat_free_context(output_format_context);
+ }
+ if (input_codec_context)
+ avcodec_free_context(&input_codec_context);
+ if (input_format_context)
+ avformat_close_input(&input_format_context);
+
+ return ret;
+}
diff --git a/extern/ffmpeg/doc/examples/transcoding.c b/extern/ffmpeg/doc/examples/transcoding.c
new file mode 100644
index 0000000000..6ca3089330
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/transcoding.c
@@ -0,0 +1,621 @@
+/*
+ * Copyright (c) 2010 Nicolas George
+ * Copyright (c) 2011 Stefano Sabatini
+ * Copyright (c) 2014 Andrey Utkin
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * API example for demuxing, decoding, filtering, encoding and muxing
+ * @example transcoding.c
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+static AVFormatContext *ifmt_ctx;
+static AVFormatContext *ofmt_ctx;
+typedef struct FilteringContext {
+ AVFilterContext *buffersink_ctx;
+ AVFilterContext *buffersrc_ctx;
+ AVFilterGraph *filter_graph;
+
+ AVPacket *enc_pkt;
+ AVFrame *filtered_frame;
+} FilteringContext;
+static FilteringContext *filter_ctx;
+
+typedef struct StreamContext {
+ AVCodecContext *dec_ctx;
+ AVCodecContext *enc_ctx;
+
+ AVFrame *dec_frame;
+} StreamContext;
+static StreamContext *stream_ctx;
+
+static int open_input_file(const char *filename)
+{
+ int ret;
+ unsigned int i;
+
+ ifmt_ctx = NULL;
+ if ((ret = avformat_open_input(&ifmt_ctx, filename, NULL, NULL)) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
+ return ret;
+ }
+
+ if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
+ return ret;
+ }
+
+ stream_ctx = av_mallocz_array(ifmt_ctx->nb_streams, sizeof(*stream_ctx));
+ if (!stream_ctx)
+ return AVERROR(ENOMEM);
+
+ for (i = 0; i < ifmt_ctx->nb_streams; i++) {
+ AVStream *stream = ifmt_ctx->streams[i];
+ AVCodec *dec = avcodec_find_decoder(stream->codecpar->codec_id);
+ AVCodecContext *codec_ctx;
+ if (!dec) {
+ av_log(NULL, AV_LOG_ERROR, "Failed to find decoder for stream #%u\n", i);
+ return AVERROR_DECODER_NOT_FOUND;
+ }
+ codec_ctx = avcodec_alloc_context3(dec);
+ if (!codec_ctx) {
+ av_log(NULL, AV_LOG_ERROR, "Failed to allocate the decoder context for stream #%u\n", i);
+ return AVERROR(ENOMEM);
+ }
+ ret = avcodec_parameters_to_context(codec_ctx, stream->codecpar);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Failed to copy decoder parameters to input decoder context "
+ "for stream #%u\n", i);
+ return ret;
+ }
+ /* Reencode video & audio and remux subtitles etc. */
+ if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
+ || codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
+ if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
+ codec_ctx->framerate = av_guess_frame_rate(ifmt_ctx, stream, NULL);
+ /* Open decoder */
+ ret = avcodec_open2(codec_ctx, dec, NULL);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
+ return ret;
+ }
+ }
+ stream_ctx[i].dec_ctx = codec_ctx;
+
+ stream_ctx[i].dec_frame = av_frame_alloc();
+ if (!stream_ctx[i].dec_frame)
+ return AVERROR(ENOMEM);
+ }
+
+ av_dump_format(ifmt_ctx, 0, filename, 0);
+ return 0;
+}
+
+static int open_output_file(const char *filename)
+{
+ AVStream *out_stream;
+ AVStream *in_stream;
+ AVCodecContext *dec_ctx, *enc_ctx;
+ AVCodec *encoder;
+ int ret;
+ unsigned int i;
+
+ ofmt_ctx = NULL;
+ avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);
+ if (!ofmt_ctx) {
+ av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
+ return AVERROR_UNKNOWN;
+ }
+
+
+ for (i = 0; i < ifmt_ctx->nb_streams; i++) {
+ out_stream = avformat_new_stream(ofmt_ctx, NULL);
+ if (!out_stream) {
+ av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
+ return AVERROR_UNKNOWN;
+ }
+
+ in_stream = ifmt_ctx->streams[i];
+ dec_ctx = stream_ctx[i].dec_ctx;
+
+ if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
+ || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
+ /* in this example, we choose transcoding to same codec */
+ encoder = avcodec_find_encoder(dec_ctx->codec_id);
+ if (!encoder) {
+ av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
+ return AVERROR_INVALIDDATA;
+ }
+ enc_ctx = avcodec_alloc_context3(encoder);
+ if (!enc_ctx) {
+ av_log(NULL, AV_LOG_FATAL, "Failed to allocate the encoder context\n");
+ return AVERROR(ENOMEM);
+ }
+
+ /* In this example, we transcode to same properties (picture size,
+ * sample rate etc.). These properties can be changed for output
+ * streams easily using filters */
+ if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+ enc_ctx->height = dec_ctx->height;
+ enc_ctx->width = dec_ctx->width;
+ enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
+ /* take first format from list of supported formats */
+ if (encoder->pix_fmts)
+ enc_ctx->pix_fmt = encoder->pix_fmts[0];
+ else
+ enc_ctx->pix_fmt = dec_ctx->pix_fmt;
+ /* video time_base can be set to whatever is handy and supported by encoder */
+ enc_ctx->time_base = av_inv_q(dec_ctx->framerate);
+ } else {
+ enc_ctx->sample_rate = dec_ctx->sample_rate;
+ enc_ctx->channel_layout = dec_ctx->channel_layout;
+ enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
+ /* take first format from list of supported formats */
+ enc_ctx->sample_fmt = encoder->sample_fmts[0];
+ enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate};
+ }
+
+ if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
+ enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+
+ /* Third parameter can be used to pass settings to encoder */
+ ret = avcodec_open2(enc_ctx, encoder, NULL);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
+ return ret;
+ }
+ ret = avcodec_parameters_from_context(out_stream->codecpar, enc_ctx);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Failed to copy encoder parameters to output stream #%u\n", i);
+ return ret;
+ }
+
+ out_stream->time_base = enc_ctx->time_base;
+ stream_ctx[i].enc_ctx = enc_ctx;
+ } else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
+ av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
+ return AVERROR_INVALIDDATA;
+ } else {
+ /* if this stream must be remuxed */
+ ret = avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Copying parameters for stream #%u failed\n", i);
+ return ret;
+ }
+ out_stream->time_base = in_stream->time_base;
+ }
+
+ }
+ av_dump_format(ofmt_ctx, 0, filename, 1);
+
+ if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
+ ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
+ return ret;
+ }
+ }
+
+ /* init muxer, write output file header */
+ ret = avformat_write_header(ofmt_ctx, NULL);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx,
+ AVCodecContext *enc_ctx, const char *filter_spec)
+{
+ char args[512];
+ int ret = 0;
+ const AVFilter *buffersrc = NULL;
+ const AVFilter *buffersink = NULL;
+ AVFilterContext *buffersrc_ctx = NULL;
+ AVFilterContext *buffersink_ctx = NULL;
+ AVFilterInOut *outputs = avfilter_inout_alloc();
+ AVFilterInOut *inputs = avfilter_inout_alloc();
+ AVFilterGraph *filter_graph = avfilter_graph_alloc();
+
+ if (!outputs || !inputs || !filter_graph) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+ buffersrc = avfilter_get_by_name("buffer");
+ buffersink = avfilter_get_by_name("buffersink");
+ if (!buffersrc || !buffersink) {
+ av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
+ ret = AVERROR_UNKNOWN;
+ goto end;
+ }
+
+ snprintf(args, sizeof(args),
+ "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
+ dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
+ dec_ctx->time_base.num, dec_ctx->time_base.den,
+ dec_ctx->sample_aspect_ratio.num,
+ dec_ctx->sample_aspect_ratio.den);
+
+ ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
+ args, NULL, filter_graph);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
+ goto end;
+ }
+
+ ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
+ NULL, NULL, filter_graph);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
+ goto end;
+ }
+
+ ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
+ (uint8_t*)&enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
+ AV_OPT_SEARCH_CHILDREN);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
+ goto end;
+ }
+ } else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
+ buffersrc = avfilter_get_by_name("abuffer");
+ buffersink = avfilter_get_by_name("abuffersink");
+ if (!buffersrc || !buffersink) {
+ av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
+ ret = AVERROR_UNKNOWN;
+ goto end;
+ }
+
+ if (!dec_ctx->channel_layout)
+ dec_ctx->channel_layout =
+ av_get_default_channel_layout(dec_ctx->channels);
+ snprintf(args, sizeof(args),
+ "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
+ dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_rate,
+ av_get_sample_fmt_name(dec_ctx->sample_fmt),
+ dec_ctx->channel_layout);
+ ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
+ args, NULL, filter_graph);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
+ goto end;
+ }
+
+ ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
+ NULL, NULL, filter_graph);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
+ goto end;
+ }
+
+ ret = av_opt_set_bin(buffersink_ctx, "sample_fmts",
+ (uint8_t*)&enc_ctx->sample_fmt, sizeof(enc_ctx->sample_fmt),
+ AV_OPT_SEARCH_CHILDREN);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
+ goto end;
+ }
+
+ ret = av_opt_set_bin(buffersink_ctx, "channel_layouts",
+ (uint8_t*)&enc_ctx->channel_layout,
+ sizeof(enc_ctx->channel_layout), AV_OPT_SEARCH_CHILDREN);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
+ goto end;
+ }
+
+ ret = av_opt_set_bin(buffersink_ctx, "sample_rates",
+ (uint8_t*)&enc_ctx->sample_rate, sizeof(enc_ctx->sample_rate),
+ AV_OPT_SEARCH_CHILDREN);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
+ goto end;
+ }
+ } else {
+ ret = AVERROR_UNKNOWN;
+ goto end;
+ }
+
+ /* Endpoints for the filter graph. */
+ outputs->name = av_strdup("in");
+ outputs->filter_ctx = buffersrc_ctx;
+ outputs->pad_idx = 0;
+ outputs->next = NULL;
+
+ inputs->name = av_strdup("out");
+ inputs->filter_ctx = buffersink_ctx;
+ inputs->pad_idx = 0;
+ inputs->next = NULL;
+
+ if (!outputs->name || !inputs->name) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
+ &inputs, &outputs, NULL)) < 0)
+ goto end;
+
+ if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
+ goto end;
+
+ /* Fill FilteringContext */
+ fctx->buffersrc_ctx = buffersrc_ctx;
+ fctx->buffersink_ctx = buffersink_ctx;
+ fctx->filter_graph = filter_graph;
+
+end:
+ avfilter_inout_free(&inputs);
+ avfilter_inout_free(&outputs);
+
+ return ret;
+}
+
+static int init_filters(void)
+{
+ const char *filter_spec;
+ unsigned int i;
+ int ret;
+ filter_ctx = av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
+ if (!filter_ctx)
+ return AVERROR(ENOMEM);
+
+ for (i = 0; i < ifmt_ctx->nb_streams; i++) {
+ filter_ctx[i].buffersrc_ctx = NULL;
+ filter_ctx[i].buffersink_ctx = NULL;
+ filter_ctx[i].filter_graph = NULL;
+ if (!(ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO
+ || ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO))
+ continue;
+
+
+ if (ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+ filter_spec = "null"; /* passthrough (dummy) filter for video */
+ else
+ filter_spec = "anull"; /* passthrough (dummy) filter for audio */
+ ret = init_filter(&filter_ctx[i], stream_ctx[i].dec_ctx,
+ stream_ctx[i].enc_ctx, filter_spec);
+ if (ret)
+ return ret;
+
+ filter_ctx[i].enc_pkt = av_packet_alloc();
+ if (!filter_ctx[i].enc_pkt)
+ return AVERROR(ENOMEM);
+
+ filter_ctx[i].filtered_frame = av_frame_alloc();
+ if (!filter_ctx[i].filtered_frame)
+ return AVERROR(ENOMEM);
+ }
+ return 0;
+}
+
+static int encode_write_frame(unsigned int stream_index, int flush)
+{
+ StreamContext *stream = &stream_ctx[stream_index];
+ FilteringContext *filter = &filter_ctx[stream_index];
+ AVFrame *filt_frame = flush ? NULL : filter->filtered_frame;
+ AVPacket *enc_pkt = filter->enc_pkt;
+ int ret;
+
+ av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
+ /* encode filtered frame */
+ av_packet_unref(enc_pkt);
+
+ ret = avcodec_send_frame(stream->enc_ctx, filt_frame);
+
+ if (ret < 0)
+ return ret;
+
+ while (ret >= 0) {
+ ret = avcodec_receive_packet(stream->enc_ctx, enc_pkt);
+
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ return 0;
+
+ /* prepare packet for muxing */
+ enc_pkt->stream_index = stream_index;
+ av_packet_rescale_ts(enc_pkt,
+ stream->enc_ctx->time_base,
+ ofmt_ctx->streams[stream_index]->time_base);
+
+ av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
+ /* mux encoded frame */
+ ret = av_interleaved_write_frame(ofmt_ctx, enc_pkt);
+ }
+
+ return ret;
+}
+
+static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
+{
+ FilteringContext *filter = &filter_ctx[stream_index];
+ int ret;
+
+ av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
+ /* push the decoded frame into the filtergraph */
+ ret = av_buffersrc_add_frame_flags(filter->buffersrc_ctx,
+ frame, 0);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
+ return ret;
+ }
+
+ /* pull filtered frames from the filtergraph */
+ while (1) {
+ av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
+ ret = av_buffersink_get_frame(filter->buffersink_ctx,
+ filter->filtered_frame);
+ if (ret < 0) {
+ /* if no more frames for output - returns AVERROR(EAGAIN)
+ * if flushed and no more frames for output - returns AVERROR_EOF
+ * rewrite retcode to 0 to show it as normal procedure completion
+ */
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+ ret = 0;
+ break;
+ }
+
+ filter->filtered_frame->pict_type = AV_PICTURE_TYPE_NONE;
+ ret = encode_write_frame(stream_index, 0);
+ av_frame_unref(filter->filtered_frame);
+ if (ret < 0)
+ break;
+ }
+
+ return ret;
+}
+
+static int flush_encoder(unsigned int stream_index)
+{
+ if (!(stream_ctx[stream_index].enc_ctx->codec->capabilities &
+ AV_CODEC_CAP_DELAY))
+ return 0;
+
+ av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
+ return encode_write_frame(stream_index, 1);
+}
+
+int main(int argc, char **argv)
+{
+ int ret;
+ AVPacket *packet = NULL;
+ unsigned int stream_index;
+ unsigned int i;
+
+ if (argc != 3) {
+ av_log(NULL, AV_LOG_ERROR, "Usage: %s \n", argv[0]);
+ return 1;
+ }
+
+ if ((ret = open_input_file(argv[1])) < 0)
+ goto end;
+ if ((ret = open_output_file(argv[2])) < 0)
+ goto end;
+ if ((ret = init_filters()) < 0)
+ goto end;
+ if (!(packet = av_packet_alloc()))
+ goto end;
+
+ /* read all packets */
+ while (1) {
+ if ((ret = av_read_frame(ifmt_ctx, packet)) < 0)
+ break;
+ stream_index = packet->stream_index;
+ av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
+ stream_index);
+
+ if (filter_ctx[stream_index].filter_graph) {
+ StreamContext *stream = &stream_ctx[stream_index];
+
+ av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n");
+
+ av_packet_rescale_ts(packet,
+ ifmt_ctx->streams[stream_index]->time_base,
+ stream->dec_ctx->time_base);
+ ret = avcodec_send_packet(stream->dec_ctx, packet);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
+ break;
+ }
+
+ while (ret >= 0) {
+ ret = avcodec_receive_frame(stream->dec_ctx, stream->dec_frame);
+ if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
+ break;
+ else if (ret < 0)
+ goto end;
+
+ stream->dec_frame->pts = stream->dec_frame->best_effort_timestamp;
+ ret = filter_encode_write_frame(stream->dec_frame, stream_index);
+ if (ret < 0)
+ goto end;
+ }
+ } else {
+ /* remux this frame without reencoding */
+ av_packet_rescale_ts(packet,
+ ifmt_ctx->streams[stream_index]->time_base,
+ ofmt_ctx->streams[stream_index]->time_base);
+
+ ret = av_interleaved_write_frame(ofmt_ctx, packet);
+ if (ret < 0)
+ goto end;
+ }
+ av_packet_unref(packet);
+ }
+
+ /* flush filters and encoders */
+ for (i = 0; i < ifmt_ctx->nb_streams; i++) {
+ /* flush filter */
+ if (!filter_ctx[i].filter_graph)
+ continue;
+ ret = filter_encode_write_frame(NULL, i);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
+ goto end;
+ }
+
+ /* flush encoder */
+ ret = flush_encoder(i);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
+ goto end;
+ }
+ }
+
+ av_write_trailer(ofmt_ctx);
+end:
+ av_packet_free(&packet);
+ for (i = 0; i < ifmt_ctx->nb_streams; i++) {
+ avcodec_free_context(&stream_ctx[i].dec_ctx);
+ if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && stream_ctx[i].enc_ctx)
+ avcodec_free_context(&stream_ctx[i].enc_ctx);
+ if (filter_ctx && filter_ctx[i].filter_graph) {
+ avfilter_graph_free(&filter_ctx[i].filter_graph);
+ av_packet_free(&filter_ctx[i].enc_pkt);
+ av_frame_free(&filter_ctx[i].filtered_frame);
+ }
+
+ av_frame_free(&stream_ctx[i].dec_frame);
+ }
+ av_free(filter_ctx);
+ av_free(stream_ctx);
+ avformat_close_input(&ifmt_ctx);
+ if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
+ avio_closep(&ofmt_ctx->pb);
+ avformat_free_context(ofmt_ctx);
+
+ if (ret < 0)
+ av_log(NULL, AV_LOG_ERROR, "Error occurred: %s\n", av_err2str(ret));
+
+ return ret ? 1 : 0;
+}
diff --git a/extern/ffmpeg/doc/examples/vaapi_encode.c b/extern/ffmpeg/doc/examples/vaapi_encode.c
new file mode 100644
index 0000000000..46bca1b3fe
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/vaapi_encode.c
@@ -0,0 +1,224 @@
+/*
+ * Video Acceleration API (video encoding) encode sample
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * Intel VAAPI-accelerated encoding example.
+ *
+ * @example vaapi_encode.c
+ * This example shows how to do VAAPI-accelerated encoding. now only support NV12
+ * raw file, usage like: vaapi_encode 1920 1080 input.yuv output.h264
+ *
+ */
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+static int width, height;
+static AVBufferRef *hw_device_ctx = NULL;
+
+static int set_hwframe_ctx(AVCodecContext *ctx, AVBufferRef *hw_device_ctx)
+{
+ AVBufferRef *hw_frames_ref;
+ AVHWFramesContext *frames_ctx = NULL;
+ int err = 0;
+
+ if (!(hw_frames_ref = av_hwframe_ctx_alloc(hw_device_ctx))) {
+ fprintf(stderr, "Failed to create VAAPI frame context.\n");
+ return -1;
+ }
+ frames_ctx = (AVHWFramesContext *)(hw_frames_ref->data);
+ frames_ctx->format = AV_PIX_FMT_VAAPI;
+ frames_ctx->sw_format = AV_PIX_FMT_NV12;
+ frames_ctx->width = width;
+ frames_ctx->height = height;
+ frames_ctx->initial_pool_size = 20;
+ if ((err = av_hwframe_ctx_init(hw_frames_ref)) < 0) {
+ fprintf(stderr, "Failed to initialize VAAPI frame context."
+ "Error code: %s\n",av_err2str(err));
+ av_buffer_unref(&hw_frames_ref);
+ return err;
+ }
+ ctx->hw_frames_ctx = av_buffer_ref(hw_frames_ref);
+ if (!ctx->hw_frames_ctx)
+ err = AVERROR(ENOMEM);
+
+ av_buffer_unref(&hw_frames_ref);
+ return err;
+}
+
+static int encode_write(AVCodecContext *avctx, AVFrame *frame, FILE *fout)
+{
+ int ret = 0;
+ AVPacket *enc_pkt;
+
+ if (!(enc_pkt = av_packet_alloc()))
+ return AVERROR(ENOMEM);
+
+ if ((ret = avcodec_send_frame(avctx, frame)) < 0) {
+ fprintf(stderr, "Error code: %s\n", av_err2str(ret));
+ goto end;
+ }
+ while (1) {
+ ret = avcodec_receive_packet(avctx, enc_pkt);
+ if (ret)
+ break;
+
+ enc_pkt->stream_index = 0;
+ ret = fwrite(enc_pkt->data, enc_pkt->size, 1, fout);
+ av_packet_unref(enc_pkt);
+ }
+
+end:
+ av_packet_free(&enc_pkt);
+ ret = ((ret == AVERROR(EAGAIN)) ? 0 : -1);
+ return ret;
+}
+
+int main(int argc, char *argv[])
+{
+ int size, err;
+ FILE *fin = NULL, *fout = NULL;
+ AVFrame *sw_frame = NULL, *hw_frame = NULL;
+ AVCodecContext *avctx = NULL;
+ AVCodec *codec = NULL;
+ const char *enc_name = "h264_vaapi";
+
+ if (argc < 5) {
+ fprintf(stderr, "Usage: %s \n", argv[0]);
+ return -1;
+ }
+
+ width = atoi(argv[1]);
+ height = atoi(argv[2]);
+ size = width * height;
+
+ if (!(fin = fopen(argv[3], "r"))) {
+ fprintf(stderr, "Fail to open input file : %s\n", strerror(errno));
+ return -1;
+ }
+ if (!(fout = fopen(argv[4], "w+b"))) {
+ fprintf(stderr, "Fail to open output file : %s\n", strerror(errno));
+ err = -1;
+ goto close;
+ }
+
+ err = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI,
+ NULL, NULL, 0);
+ if (err < 0) {
+ fprintf(stderr, "Failed to create a VAAPI device. Error code: %s\n", av_err2str(err));
+ goto close;
+ }
+
+ if (!(codec = avcodec_find_encoder_by_name(enc_name))) {
+ fprintf(stderr, "Could not find encoder.\n");
+ err = -1;
+ goto close;
+ }
+
+ if (!(avctx = avcodec_alloc_context3(codec))) {
+ err = AVERROR(ENOMEM);
+ goto close;
+ }
+
+ avctx->width = width;
+ avctx->height = height;
+ avctx->time_base = (AVRational){1, 25};
+ avctx->framerate = (AVRational){25, 1};
+ avctx->sample_aspect_ratio = (AVRational){1, 1};
+ avctx->pix_fmt = AV_PIX_FMT_VAAPI;
+
+ /* set hw_frames_ctx for encoder's AVCodecContext */
+ if ((err = set_hwframe_ctx(avctx, hw_device_ctx)) < 0) {
+ fprintf(stderr, "Failed to set hwframe context.\n");
+ goto close;
+ }
+
+ if ((err = avcodec_open2(avctx, codec, NULL)) < 0) {
+ fprintf(stderr, "Cannot open video encoder codec. Error code: %s\n", av_err2str(err));
+ goto close;
+ }
+
+ while (1) {
+ if (!(sw_frame = av_frame_alloc())) {
+ err = AVERROR(ENOMEM);
+ goto close;
+ }
+ /* read data into software frame, and transfer them into hw frame */
+ sw_frame->width = width;
+ sw_frame->height = height;
+ sw_frame->format = AV_PIX_FMT_NV12;
+ if ((err = av_frame_get_buffer(sw_frame, 0)) < 0)
+ goto close;
+ if ((err = fread((uint8_t*)(sw_frame->data[0]), size, 1, fin)) <= 0)
+ break;
+ if ((err = fread((uint8_t*)(sw_frame->data[1]), size/2, 1, fin)) <= 0)
+ break;
+
+ if (!(hw_frame = av_frame_alloc())) {
+ err = AVERROR(ENOMEM);
+ goto close;
+ }
+ if ((err = av_hwframe_get_buffer(avctx->hw_frames_ctx, hw_frame, 0)) < 0) {
+ fprintf(stderr, "Error code: %s.\n", av_err2str(err));
+ goto close;
+ }
+ if (!hw_frame->hw_frames_ctx) {
+ err = AVERROR(ENOMEM);
+ goto close;
+ }
+ if ((err = av_hwframe_transfer_data(hw_frame, sw_frame, 0)) < 0) {
+ fprintf(stderr, "Error while transferring frame data to surface."
+ "Error code: %s.\n", av_err2str(err));
+ goto close;
+ }
+
+ if ((err = (encode_write(avctx, hw_frame, fout))) < 0) {
+ fprintf(stderr, "Failed to encode.\n");
+ goto close;
+ }
+ av_frame_free(&hw_frame);
+ av_frame_free(&sw_frame);
+ }
+
+ /* flush encoder */
+ err = encode_write(avctx, NULL, fout);
+ if (err == AVERROR_EOF)
+ err = 0;
+
+close:
+ if (fin)
+ fclose(fin);
+ if (fout)
+ fclose(fout);
+ av_frame_free(&sw_frame);
+ av_frame_free(&hw_frame);
+ avcodec_free_context(&avctx);
+ av_buffer_unref(&hw_device_ctx);
+
+ return err;
+}
diff --git a/extern/ffmpeg/doc/examples/vaapi_transcode.c b/extern/ffmpeg/doc/examples/vaapi_transcode.c
new file mode 100644
index 0000000000..5a1a704a8e
--- /dev/null
+++ b/extern/ffmpeg/doc/examples/vaapi_transcode.c
@@ -0,0 +1,308 @@
+/*
+ * Video Acceleration API (video transcoding) transcode sample
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * @file
+ * Intel VAAPI-accelerated transcoding example.
+ *
+ * @example vaapi_transcode.c
+ * This example shows how to do VAAPI-accelerated transcoding.
+ * Usage: vaapi_transcode input_stream codec output_stream
+ * e.g: - vaapi_transcode input.mp4 h264_vaapi output_h264.mp4
+ * - vaapi_transcode input.mp4 vp9_vaapi output_vp9.ivf
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+
+static AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
+static AVBufferRef *hw_device_ctx = NULL;
+static AVCodecContext *decoder_ctx = NULL, *encoder_ctx = NULL;
+static int video_stream = -1;
+static AVStream *ost;
+static int initialized = 0;
+
+static enum AVPixelFormat get_vaapi_format(AVCodecContext *ctx,
+ const enum AVPixelFormat *pix_fmts)
+{
+ const enum AVPixelFormat *p;
+
+ for (p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) {
+ if (*p == AV_PIX_FMT_VAAPI)
+ return *p;
+ }
+
+ fprintf(stderr, "Unable to decode this file using VA-API.\n");
+ return AV_PIX_FMT_NONE;
+}
+
+static int open_input_file(const char *filename)
+{
+ int ret;
+ AVCodec *decoder = NULL;
+ AVStream *video = NULL;
+
+ if ((ret = avformat_open_input(&ifmt_ctx, filename, NULL, NULL)) < 0) {
+ fprintf(stderr, "Cannot open input file '%s', Error code: %s\n",
+ filename, av_err2str(ret));
+ return ret;
+ }
+
+ if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) < 0) {
+ fprintf(stderr, "Cannot find input stream information. Error code: %s\n",
+ av_err2str(ret));
+ return ret;
+ }
+
+ ret = av_find_best_stream(ifmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &decoder, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Cannot find a video stream in the input file. "
+ "Error code: %s\n", av_err2str(ret));
+ return ret;
+ }
+ video_stream = ret;
+
+ if (!(decoder_ctx = avcodec_alloc_context3(decoder)))
+ return AVERROR(ENOMEM);
+
+ video = ifmt_ctx->streams[video_stream];
+ if ((ret = avcodec_parameters_to_context(decoder_ctx, video->codecpar)) < 0) {
+ fprintf(stderr, "avcodec_parameters_to_context error. Error code: %s\n",
+ av_err2str(ret));
+ return ret;
+ }
+
+ decoder_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
+ if (!decoder_ctx->hw_device_ctx) {
+ fprintf(stderr, "A hardware device reference create failed.\n");
+ return AVERROR(ENOMEM);
+ }
+ decoder_ctx->get_format = get_vaapi_format;
+
+ if ((ret = avcodec_open2(decoder_ctx, decoder, NULL)) < 0)
+ fprintf(stderr, "Failed to open codec for decoding. Error code: %s\n",
+ av_err2str(ret));
+
+ return ret;
+}
+
+static int encode_write(AVPacket *enc_pkt, AVFrame *frame)
+{
+ int ret = 0;
+
+ av_packet_unref(enc_pkt);
+
+ if ((ret = avcodec_send_frame(encoder_ctx, frame)) < 0) {
+ fprintf(stderr, "Error during encoding. Error code: %s\n", av_err2str(ret));
+ goto end;
+ }
+ while (1) {
+ ret = avcodec_receive_packet(encoder_ctx, enc_pkt);
+ if (ret)
+ break;
+
+ enc_pkt->stream_index = 0;
+ av_packet_rescale_ts(enc_pkt, ifmt_ctx->streams[video_stream]->time_base,
+ ofmt_ctx->streams[0]->time_base);
+ ret = av_interleaved_write_frame(ofmt_ctx, enc_pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error during writing data to output file. "
+ "Error code: %s\n", av_err2str(ret));
+ return -1;
+ }
+ }
+
+end:
+ if (ret == AVERROR_EOF)
+ return 0;
+ ret = ((ret == AVERROR(EAGAIN)) ? 0:-1);
+ return ret;
+}
+
+static int dec_enc(AVPacket *pkt, AVCodec *enc_codec)
+{
+ AVFrame *frame;
+ int ret = 0;
+
+ ret = avcodec_send_packet(decoder_ctx, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error during decoding. Error code: %s\n", av_err2str(ret));
+ return ret;
+ }
+
+ while (ret >= 0) {
+ if (!(frame = av_frame_alloc()))
+ return AVERROR(ENOMEM);
+
+ ret = avcodec_receive_frame(decoder_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+ av_frame_free(&frame);
+ return 0;
+ } else if (ret < 0) {
+ fprintf(stderr, "Error while decoding. Error code: %s\n", av_err2str(ret));
+ goto fail;
+ }
+
+ if (!initialized) {
+ /* we need to ref hw_frames_ctx of decoder to initialize encoder's codec.
+ Only after we get a decoded frame, can we obtain its hw_frames_ctx */
+ encoder_ctx->hw_frames_ctx = av_buffer_ref(decoder_ctx->hw_frames_ctx);
+ if (!encoder_ctx->hw_frames_ctx) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ /* set AVCodecContext Parameters for encoder, here we keep them stay
+ * the same as decoder.
+ * xxx: now the sample can't handle resolution change case.
+ */
+ encoder_ctx->time_base = av_inv_q(decoder_ctx->framerate);
+ encoder_ctx->pix_fmt = AV_PIX_FMT_VAAPI;
+ encoder_ctx->width = decoder_ctx->width;
+ encoder_ctx->height = decoder_ctx->height;
+
+ if ((ret = avcodec_open2(encoder_ctx, enc_codec, NULL)) < 0) {
+ fprintf(stderr, "Failed to open encode codec. Error code: %s\n",
+ av_err2str(ret));
+ goto fail;
+ }
+
+ if (!(ost = avformat_new_stream(ofmt_ctx, enc_codec))) {
+ fprintf(stderr, "Failed to allocate stream for output format.\n");
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ ost->time_base = encoder_ctx->time_base;
+ ret = avcodec_parameters_from_context(ost->codecpar, encoder_ctx);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to copy the stream parameters. "
+ "Error code: %s\n", av_err2str(ret));
+ goto fail;
+ }
+
+ /* write the stream header */
+ if ((ret = avformat_write_header(ofmt_ctx, NULL)) < 0) {
+ fprintf(stderr, "Error while writing stream header. "
+ "Error code: %s\n", av_err2str(ret));
+ goto fail;
+ }
+
+ initialized = 1;
+ }
+
+ if ((ret = encode_write(pkt, frame)) < 0)
+ fprintf(stderr, "Error during encoding and writing.\n");
+
+fail:
+ av_frame_free(&frame);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int ret = 0;
+ AVPacket *dec_pkt;
+ AVCodec *enc_codec;
+
+ if (argc != 4) {
+ fprintf(stderr, "Usage: %s \n"
+ "The output format is guessed according to the file extension.\n"
+ "\n", argv[0]);
+ return -1;
+ }
+
+ ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, NULL, NULL, 0);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to create a VAAPI device. Error code: %s\n", av_err2str(ret));
+ return -1;
+ }
+
+ dec_pkt = av_packet_alloc();
+ if (!dec_pkt) {
+ fprintf(stderr, "Failed to allocate decode packet\n");
+ goto end;
+ }
+
+ if ((ret = open_input_file(argv[1])) < 0)
+ goto end;
+
+ if (!(enc_codec = avcodec_find_encoder_by_name(argv[2]))) {
+ fprintf(stderr, "Could not find encoder '%s'\n", argv[2]);
+ ret = -1;
+ goto end;
+ }
+
+ if ((ret = (avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, argv[3]))) < 0) {
+ fprintf(stderr, "Failed to deduce output format from file extension. Error code: "
+ "%s\n", av_err2str(ret));
+ goto end;
+ }
+
+ if (!(encoder_ctx = avcodec_alloc_context3(enc_codec))) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ ret = avio_open(&ofmt_ctx->pb, argv[3], AVIO_FLAG_WRITE);
+ if (ret < 0) {
+ fprintf(stderr, "Cannot open output file. "
+ "Error code: %s\n", av_err2str(ret));
+ goto end;
+ }
+
+ /* read all packets and only transcoding video */
+ while (ret >= 0) {
+ if ((ret = av_read_frame(ifmt_ctx, dec_pkt)) < 0)
+ break;
+
+ if (video_stream == dec_pkt->stream_index)
+ ret = dec_enc(dec_pkt, enc_codec);
+
+ av_packet_unref(dec_pkt);
+ }
+
+ /* flush decoder */
+ av_packet_unref(dec_pkt);
+ ret = dec_enc(dec_pkt, enc_codec);
+
+ /* flush encoder */
+ ret = encode_write(dec_pkt, NULL);
+
+ /* write the trailer for output stream */
+ av_write_trailer(ofmt_ctx);
+
+end:
+ avformat_close_input(&ifmt_ctx);
+ avformat_close_input(&ofmt_ctx);
+ avcodec_free_context(&decoder_ctx);
+ avcodec_free_context(&encoder_ctx);
+ av_buffer_unref(&hw_device_ctx);
+ av_packet_free(&dec_pkt);
+ return ret;
+}
diff --git a/extern/ffmpeg/doc/faq.html b/extern/ffmpeg/doc/faq.html
index 92b62138ce..0745c1b376 100644
--- a/extern/ffmpeg/doc/faq.html
+++ b/extern/ffmpeg/doc/faq.html
@@ -1,106 +1,53 @@
-
+
-
-
+
+
+FFmpeg FAQ
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
FFmpeg FAQ
+
-
FFmpeg FAQ
-
-
-
Table of Contents
-
+
-
1. General Questions
+
1 General Questions# TOC
-
1.1 Why doesn’t FFmpeg support feature [xyz]?
+
1.1 Why doesn’t FFmpeg support feature [xyz]?# TOC
Because no one has taken on that task yet. FFmpeg development is
driven by the tasks that are important to the individual developers.
@@ -108,43 +55,43 @@
-1.2 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?
+1.2 FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?# TOC
No. Windows DLLs are not portable, bloated and often slow.
Moreover FFmpeg strives to support all codecs natively.
A DLL loader is not conducive to that goal.
-
1.3 I cannot read this file although this format seems to be supported by ffmpeg.
+
1.3 I cannot read this file although this format seems to be supported by ffmpeg.# TOC
Even if ffmpeg can read the container format, it may not support all its
codecs. Please consult the supported codec list in the ffmpeg
documentation.
-
1.4 Which codecs are supported by Windows?
+
1.4 Which codecs are supported by Windows?# TOC
Windows does not support standard formats like MPEG very well, unless you
install some additional codecs.
The following list of video codecs should work on most Windows systems:
- ‘msmpeg4v2 ’
+msmpeg4v2
.avi/.asf
- ‘msmpeg4 ’
+msmpeg4
.asf only
- ‘wmv1 ’
+wmv1
.asf only
- ‘wmv2 ’
+wmv2
.asf only
- ‘mpeg4 ’
+mpeg4
Only if you have some MPEG-4 codec like ffdshow or Xvid installed.
- ‘mpeg1video ’
+mpeg1video
.mpg only
@@ -155,34 +102,34 @@
- ‘adpcm_ima_wav ’
- ‘adpcm_ms ’
- ‘pcm_s16le ’
+adpcm_ima_wav
+adpcm_ms
+pcm_s16le
always
- ‘libmp3lame ’
+libmp3lame
If some MP3 codec like LAME is installed.
-2. Compilation
+2 Compilation# TOC
-2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
+2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'# TOC
This is a bug in gcc. Do not report it to us. Instead, please report it to
the gcc developers. Note that we will not add workarounds for gcc bugs.
Also note that (some of) the gcc developers believe this is not a bug or
not a bug they should fix:
-http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203 .
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203 .
Then again, some of them do not know the difference between an undecidable
problem and an NP-hard problem...
-
2.2 I have installed this library with my distro’s package manager. Why does configure not see it?
+
2.2 I have installed this library with my distro’s package manager. Why does configure not see it?# TOC
Distributions usually split libraries in several packages. The main package
contains the files necessary to run programs using the library. The
@@ -190,115 +137,174 @@
+2.3 How do I make pkg-config find my libraries?# TOC
+
+Somewhere along with your libraries, there is a .pc file (or several)
+in a pkgconfig directory. You need to set environment variables to
+point pkg-config to these files.
+
+
If you need to add directories to pkg-config’s search list
+(typical use case: library installed separately), add it to
+$PKG_CONFIG_PATH:
+
+
+
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
+
+
+
If you need to replace pkg-config’s search list
+(typical use case: cross-compiling), set it in
+$PKG_CONFIG_LIBDIR:
+
+
+
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
+
+
+
If you need to know the library’s internal dependencies (typical use: static
+linking), add the --static option to pkg-config:
+
+
+
./configure --pkg-config-flags=--static
+
+
+
+
2.4 How do I use pkg-config when cross-compiling?# TOC
+
+
The best way is to install pkg-config in your cross-compilation
+environment. It will automatically use the cross-compilation libraries.
+
+
You can also use pkg-config from the host environment by
+specifying explicitly --pkg-config=pkg-config to configure.
+In that case, you must point pkg-config to the correct directories
+using the PKG_CONFIG_LIBDIR, as explained in the previous entry.
+
+
As an intermediate solution, you can place in your cross-compilation
+environment a script that calls the host pkg-config with
+PKG_CONFIG_LIBDIR set. That script can look like that:
+
+
+
#!/bin/sh
+PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
+export PKG_CONFIG_LIBDIR
+exec /usr/bin/pkg-config "$@"
+
+
-
3. Usage
+
3 Usage# TOC
-
3.1 ffmpeg does not work; what is wrong?
+
3.1 ffmpeg does not work; what is wrong?# TOC
Try a make distclean in the ffmpeg source directory before the build.
If this does not help see
-(http://ffmpeg.org/bugreports.html ).
+(https://ffmpeg.org/bugreports.html ).
-
3.2 How do I encode single pictures into movies?
+
3.2 How do I encode single pictures into movies?# TOC
First, rename your pictures to follow a numerical sequence.
For example, img1.jpg, img2.jpg, img3.jpg,...
Then you may run:
-
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
-
+
+
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
+
Notice that ‘%d ’ is replaced by the image number.
-
‘img%03d.jpg ’ means the sequence ‘img001.jpg ’, ‘img002.jpg ’, etc.
+
img%03d.jpg means the sequence img001.jpg , img002.jpg , etc.
-
Use the ‘-start_number ’ option to declare a starting number for
+
Use the -start_number option to declare a starting number for
the sequence. This is useful if your sequence does not start with
-‘img001.jpg ’ but is still in a numerical order. The following
-example will start with ‘img100.jpg ’:
+img001.jpg but is still in a numerical order. The following
+example will start with img100.jpg :
-
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
-
+
+
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
+
If you have large number of pictures to rename, you can use the
following command to ease the burden. The command, using the bourne
shell syntax, symbolically links all files in the current directory
-that match *jpg to the ‘/tmp ’ directory in the sequence of
-‘img001.jpg ’, ‘img002.jpg ’ and so on.
+that match *jpg to the /tmp directory in the sequence of
+img001.jpg , img002.jpg and so on.
-
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
-
+
+
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
+
If you want to sequence them by oldest modified first, substitute
$(ls -r -t *jpg) in place of *jpg.
Then run:
-
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
-
+
+
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
+
The same logic is used for any image format that ffmpeg reads.
You can also use cat to pipe images to ffmpeg:
-
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
-
+
+
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
+
-
3.3 How do I encode movie to single pictures?
+
3.3 How do I encode movie to single pictures?# TOC
Use:
-
ffmpeg -i movie.mpg movie%d.jpg
-
+
+
ffmpeg -i movie.mpg movie%d.jpg
+
-
The ‘movie.mpg ’ used as input will be converted to
-‘movie1.jpg ’, ‘movie2.jpg ’, etc...
+
The movie.mpg used as input will be converted to
+movie1.jpg , movie2.jpg , etc...
Instead of relying on file format self-recognition, you may also use
- ‘-c:v ppm ’
- ‘-c:v png ’
- ‘-c:v mjpeg ’
+-c:v ppm
+-c:v png
+-c:v mjpeg
to force the encoding.
Applying that to the previous example:
-
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
-
+
+
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
+
Beware that there is no "jpeg" codec. Use "mjpeg" instead.
-
3.4 Why do I see a slight quality degradation with multithreaded MPEG* encoding?
+
3.4 Why do I see a slight quality degradation with multithreaded MPEG* encoding?# TOC
For multithreaded MPEG* encoding, the encoded slices must be independent,
otherwise thread n would practically have to wait for n-1 to finish, so it’s
quite logical that there is a small reduction of quality. This is not a bug.
-
3.5 How can I read from the standard input or write to the standard output?
+
3.5 How can I read from the standard input or write to the standard output?# TOC
-
Use ‘- ’ as file name.
+
Use - as file name.
-
3.6 -f jpeg doesn’t work.
+
3.6 -f jpeg doesn’t work.# TOC
Try ’-f image2 test%d.jpg’.
-
3.7 Why can I not change the frame rate?
+
3.7 Why can I not change the frame rate?# TOC
Some codecs, like MPEG-1/2, only allow a small number of fixed frame rates.
Choose a different codec with the -c:v command line option.
-
3.8 How do I encode Xvid or DivX video with ffmpeg?
+
3.8 How do I encode Xvid or DivX video with ffmpeg?# TOC
Both Xvid and DivX (version 4+) are implementations of the ISO MPEG-4
standard (note that there are many other coding formats that use this
@@ -309,104 +315,100 @@
-3.9 Which are good parameters for encoding high quality MPEG-4?
+3.9 Which are good parameters for encoding high quality MPEG-4?# TOC
’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’,
-things to try: ’-bf 2’, ’-flags qprd’, ’-flags mv0’, ’-flags skiprd’.
+things to try: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
-
3.10 Which are good parameters for encoding high quality MPEG-1/MPEG-2?
+
3.10 Which are good parameters for encoding high quality MPEG-1/MPEG-2?# TOC
’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’
but beware the ’-g 100’ might cause problems with some decoders.
-Things to try: ’-bf 2’, ’-flags qprd’, ’-flags mv0’, ’-flags skiprd.
+Things to try: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
-
3.11 Interlaced video looks very bad when encoded with ffmpeg, what is wrong?
+
3.11 Interlaced video looks very bad when encoded with ffmpeg, what is wrong?# TOC
You should use ’-flags +ilme+ildct’ and maybe ’-flags +alt’ for interlaced
material, and try ’-top 0/1’ if the result looks really messed-up.
-
3.12 How can I read DirectShow files?
+
3.12 How can I read DirectShow files?# TOC
If you have built FFmpeg with ./configure --enable-avisynth
(only possible on MinGW/Cygwin platforms),
then you may use any file that DirectShow can read as input.
Just create an "input.avs" text file with this single line ...
-
DirectShowSource("C:\path to your file\yourfile.asf")
-
+
+
DirectShowSource("C:\path to your file\yourfile.asf")
+
... and then feed that text file to ffmpeg:
-
+
For ANY other help on AviSynth, please visit the
AviSynth homepage .
-
3.13 How can I join video files?
+
3.13 How can I join video files?# TOC
To "join" video files is quite ambiguous. The following list explains the
different kinds of "joining" and points out how those are addressed in
FFmpeg. To join video files may mean:
-
-To put them one after the other: this is called to concatenate them
+ To put them one after the other: this is called to concatenate them
(in short: concat) and is addressed
in this very faq .
-
-To put them together in the same file, to let the user choose between the
+ To put them together in the same file, to let the user choose between the
different versions (example: different audio languages): this is called to
multiplex them together (in short: mux), and is done by simply
-invoking ffmpeg with several ‘-i ’ options.
+invoking ffmpeg with several -i options.
-
-For audio, to put all channels together in a single stream (example: two
+ For audio, to put all channels together in a single stream (example: two
mono streams into one stereo stream): this is sometimes called to
merge them, and can be done using the
-amerge filter.
+amerge filter.
-
-For audio, to play one on top of the other: this is called to mix
+ For audio, to play one on top of the other: this is called to mix
them, and can be done by first merging them into a single stream and then
-using the pan filter to mix
+using the pan filter to mix
the channels at will.
-
-For video, to display both together, side by side or one on top of a part of
+ For video, to display both together, side by side or one on top of a part of
the other; it can be done using the
-overlay video filter.
+overlay video filter.
-
-
-
3.14 How can I concatenate video files?
+
+
3.14 How can I concatenate video files?# TOC
There are several solutions, depending on the exact circumstances.
-
3.14.1 Concatenating using the concat filter
+
3.14.1 Concatenating using the concat filter # TOC
-
FFmpeg has a concat filter designed specifically for that, with examples in the
+
FFmpeg has a concat filter designed specifically for that, with examples in the
documentation. This operation is recommended if you need to re-encode.
-
3.14.2 Concatenating using the concat demuxer
+
3.14.2 Concatenating using the concat demuxer # TOC
-
FFmpeg has a concat demuxer which you can use when you want to avoid a re-encode and
+
FFmpeg has a concat demuxer which you can use when you want to avoid a re-encode and
your format doesn’t support file level concatenation.
-
3.14.3 Concatenating using the concat protocol (file level)
+
3.14.3 Concatenating using the concat protocol (file level)# TOC
-
FFmpeg has a concat protocol designed specifically for that, with examples in the
+
FFmpeg has a concat protocol designed specifically for that, with examples in the
documentation.
-
A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow to concatenate
+
A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow one to concatenate
video by merely concatenating the files containing them.
Hence you may concatenate your multimedia files by first transcoding them to
@@ -414,36 +416,39 @@
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
+
+
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
-
+
Additionally, you can use the concat protocol instead of cat or
copy which will avoid creation of a potentially huge intermediate file.
- ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
+
+
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
-
+
Note that you may need to escape the character "|" which is special for many
shells.
Another option is usage of named pipes, should your platform support it:
-
mkfifo intermediate1.mpg
+
+
mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
-ffmpeg -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi
-
+ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
+
-3.14.4 Concatenating using raw audio and video
+3.14.4 Concatenating using raw audio and video# TOC
Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also
allow concatenation, and the transcoding step is almost lossless.
@@ -455,70 +460,52 @@
mkfifo temp1.a
+
+
mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
-ffmpeg -i input1.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
-ffmpeg -i input2.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
+ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
+ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
-ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \
+ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
-f yuv4mpegpipe -i all.v \
-y output.flv
rm temp[12].[av] all.[av]
-
+
-
-3.15 -profile option fails when encoding H.264 video with AAC audio
-
-ffmpeg prints an error like
-
- Undefined constant or missing '(' in 'baseline'
-Unable to parse option value "baseline"
-Error setting option profile to value baseline.
-
-
-Short answer: write ‘-profile:v ’ instead of ‘-profile ’.
-
-Long answer: this happens because the ‘-profile ’ option can apply to both
-video and audio. Specifically the AAC encoder also defines some profiles, none
-of which are named baseline .
-
-The solution is to apply the ‘-profile ’ option to the video stream only
-by using Stream specifiers .
-Appending :v to it will do exactly that.
-
-3.16 Using ‘-f lavfi ’, audio becomes mono for no apparent reason.
+3.15 Using -f lavfi , audio becomes mono for no apparent reason.# TOC
-Use ‘-dumpgraph - ’ to find out exactly where the channel layout is
+
Use -dumpgraph - to find out exactly where the channel layout is
lost.
Most likely, it is through auto-inserted aresample. Try to understand
why the converting filter was needed at that place.
-Just before the output is a likely place, as ‘-f lavfi ’ currently
+
Just before the output is a likely place, as -f lavfi currently
only support packed S16.
Then insert the correct aformat explicitly in the filtergraph,
specifying the exact format.
- aformat=sample_fmts=s16:channel_layouts=stereo
-
+
+
aformat=sample_fmts=s16:channel_layouts=stereo
+
-3.17 Why does FFmpeg not see the subtitles in my VOB file?
+3.16 Why does FFmpeg not see the subtitles in my VOB file?# TOC
VOB and a few other formats do not have a global header that describes
everything present in the file. Instead, applications are supposed to scan
the file to see what it contains. Since VOB files are frequently large, only
the beginning is scanned. If the subtitles happen only later in the file,
-they will not be initally detected.
+they will not be initially detected.
Some applications, including the ffmpeg command-line tool, can only
work with streams that were detected during the initial scan; streams that
@@ -529,9 +516,9 @@
-3.18 Why was the ffmpeg ‘-sameq ’ option removed? What to use instead?
+3.17 Why was the ffmpeg -sameq option removed? What to use instead?# TOC
-The ‘-sameq ’ option meant "same quantizer", and made sense only in a
+
The -sameq option meant "same quantizer", and made sense only in a
very limited set of cases. Unfortunately, a lot of people mistook it for
"same quality" and used it in places where it did not make sense: it had
roughly the expected visible effect, but achieved it in a very inefficient
@@ -540,16 +527,117 @@
+3.18 I have a stretched video, why does scaling does not fix it?# TOC
+
+A lot of video codecs and formats can store the aspect ratio of the
+video: this is the ratio between the width and the height of either the full
+image (DAR, display aspect ratio) or individual pixels (SAR, sample aspect
+ratio). For example, EGA screens at resolution 640×350 had 4:3 DAR and 35:48
+SAR.
+
+Most still image processing work with square pixels, i.e. 1:1 SAR, but a lot
+of video standards, especially from the analogic-numeric transition era, use
+non-square pixels.
+
+Most processing filters in FFmpeg handle the aspect ratio to avoid
+stretching the image: cropping adjusts the DAR to keep the SAR constant,
+scaling adjusts the SAR to keep the DAR constant.
+
+If you want to stretch, or “unstretch”, the image, you need to override the
+information with the
+setdar or setsar filters .
+
+Do not forget to examine carefully the original video to check whether the
+stretching comes from the image or from the aspect ratio information.
+
+For example, to fix a badly encoded EGA capture, use the following commands,
+either the first one to upscale to square pixels or the second one to set
+the correct aspect ratio or the third one to avoid transcoding (may not work
+depending on the format / codec / player / phase of the moon):
+
+
+
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
+ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
+ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
+
+
+
+3.19 How do I run ffmpeg as a background task?# TOC
+
+ffmpeg normally checks the console input, for entries like "q" to stop
+and "?" to give help, while performing operations. ffmpeg does not have a way of
+detecting when it is running as a background task.
+When it checks the console input, that can cause the process running ffmpeg
+in the background to suspend.
+
+To prevent those input checks, allowing ffmpeg to run as a background task,
+use the -nostdin option
+in the ffmpeg invocation. This is effective whether you run ffmpeg in a shell
+or invoke ffmpeg in its own process via an operating system API.
+
+As an alternative, when you are running ffmpeg in a shell, you can redirect
+standard input to /dev/null (on Linux and macOS)
+or NUL (on Windows). You can do this redirect either
+on the ffmpeg invocation, or from a shell script which calls ffmpeg.
+
+For example:
+
+
+
ffmpeg -nostdin -i INPUT OUTPUT
+
+
+or (on Linux, macOS, and other UNIX-like shells):
+
+
+
ffmpeg -i INPUT OUTPUT </dev/null
+
+
+or (on Windows):
+
+
+
ffmpeg -i INPUT OUTPUT <NUL
+
+
+
+3.20 How do I prevent ffmpeg from suspending with a message like suspended (tty output) ?# TOC
+
+If you run ffmpeg in the background, you may find that its process suspends.
+There may be a message like suspended (tty output) . The question is how
+to prevent the process from being suspended.
+
+For example:
+
+
+
% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
+[1] 93352
+%
+[1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
+
+
+The message "tty output" notwithstanding, the problem here is that
+ffmpeg normally checks the console input when it runs. The operating system
+detects this, and suspends the process until you can bring it to the
+foreground and attend to it.
+
+The solution is to use the right techniques to tell ffmpeg not to consult
+console input. You can use the
+-nostdin option ,
+or redirect standard input with < /dev/null.
+See FAQ
+How do I run ffmpeg as a background task?
+for details.
+
-4. Development
+4 Development# TOC
-4.1 Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?
+4.1 Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?# TOC
-Yes. Check the ‘doc/examples ’ directory in the source
+
Yes. Check the doc/examples directory in the source
repository, also available online at:
https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples .
@@ -561,33 +649,33 @@ projects.html ).
-4.2 Can you support my C compiler XXX?
+4.2 Can you support my C compiler XXX?# TOC
It depends. If your compiler is C99-compliant, then patches to support
it are likely to be welcome if they do not pollute the source code
with #ifdefs related to the compiler.
-4.3 Is Microsoft Visual C++ supported?
+4.3 Is Microsoft Visual C++ supported?# TOC
Yes. Please see the Microsoft Visual C++
section in the FFmpeg documentation.
-4.4 Can you add automake, libtool or autoconf support?
+4.4 Can you add automake, libtool or autoconf support?# TOC
No. These tools are too bloated and they complicate the build.
-4.5 Why not rewrite FFmpeg in object-oriented C++?
+4.5 Why not rewrite FFmpeg in object-oriented C++?# TOC
FFmpeg is already organized in a highly modular manner and does not need to
be rewritten in a formal object language. Further, many of the developers
favor straight C; it works for them. For more arguments on this matter,
-read "Programming Religion" .
+read "Programming Religion" .
-4.6 Why are the ffmpeg programs devoid of debugging symbols?
+4.6 Why are the ffmpeg programs devoid of debugging symbols?# TOC
The build process creates ffmpeg_g, ffplay_g, etc. which
contain full debug information. Those binaries are stripped to create
@@ -595,14 +683,14 @@
-4.7 I do not like the LGPL, can I contribute code under the GPL instead?
+4.7 I do not like the LGPL, can I contribute code under the GPL instead?# TOC
Yes, as long as the code is optional and can easily and cleanly be placed
under #if CONFIG_GPL without breaking anything. So, for example, a new codec
or filter would be OK under GPL while a bug fix to LGPL code would not.
-4.8 I’m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.
+4.8 I’m using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.# TOC
FFmpeg builds static libraries by default. In static libraries, dependencies
are not handled. That has two consequences. First, you must specify the
@@ -613,14 +701,15 @@
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
-
+
+
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
+
-See ‘doc/example/Makefile ’ and ‘doc/example/pc-uninstalled ’ for
+
See doc/example/Makefile and doc/example/pc-uninstalled for
more details.
-4.9 I’m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.
+4.9 I’m using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.# TOC
FFmpeg is a pure C project, so to use the libraries within your C++ application
you need to explicitly state that you are using a C library. You can do this by
@@ -629,31 +718,31 @@
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3
-4.10 I’m using libavutil from within my C++ application but the compiler complains about ’UINT64_C’ was not declared in this scope
+4.10 I’m using libavutil from within my C++ application but the compiler complains about ’UINT64_C’ was not declared in this scope# TOC
FFmpeg is a pure C project using C99 math features, in order to enable C++
to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS
-4.11 I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?
+4.11 I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?# TOC
You have to create a custom AVIOContext using avio_alloc_context,
-see ‘libavformat/aviobuf.c ’ in FFmpeg and ‘libmpdemux/demux_lavf.c ’ in MPlayer or MPlayer2 sources.
+see libavformat/aviobuf.c in FFmpeg and libmpdemux/demux_lavf.c in MPlayer or MPlayer2 sources.
-4.12 Where is the documentation about ffv1, msmpeg4, asv1, 4xm?
+4.12 Where is the documentation about ffv1, msmpeg4, asv1, 4xm?# TOC
-see http://www.ffmpeg.org/~michael/
+
see https://www.ffmpeg.org/~michael/
-4.13 How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?
+4.13 How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?# TOC
Even if peculiar since it is network oriented, RTP is a container like any
other. You have to demux RTP before feeding the payload to libavcodec.
In this specific case please look at RFC 4629 to see how it should be done.
-4.14 AVStream.r_frame_rate is wrong, it is much larger than the frame rate.
+4.14 AVStream.r_frame_rate is wrong, it is much larger than the frame rate.# TOC
r_frame_rate is NOT the average frame rate, it is the smallest frame rate
that can accurately represent all timestamps. So no, it is not
@@ -663,18 +752,21 @@
-4.15 Why is make fate not running all tests?
+4.15 Why is make fate not running all tests?# TOC
Make sure you have the fate-suite samples and the SAMPLES Make variable
or FATE_SAMPLES environment variable or the --samples
configure option is set to the right path.
-4.16 Why is make fate not finding the samples?
+4.16 Why is make fate not finding the samples?# TOC
Do you happen to have a ~ character in the samples path to indicate a
home directory? The value is used in ways where the shell cannot expand it,
causing FATE to not find files. Just replace ~ by the full path.
-
+
+
+
+
+
diff --git a/extern/ffmpeg/doc/faq.html.d b/extern/ffmpeg/doc/faq.html.d
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/extern/ffmpeg/doc/faq.texi b/extern/ffmpeg/doc/faq.texi
new file mode 100644
index 0000000000..8b165eb436
--- /dev/null
+++ b/extern/ffmpeg/doc/faq.texi
@@ -0,0 +1,686 @@
+\input texinfo @c -*- texinfo -*-
+@documentencoding UTF-8
+
+@settitle FFmpeg FAQ
+@titlepage
+@center @titlefont{FFmpeg FAQ}
+@end titlepage
+
+@top
+
+@contents
+
+@chapter General Questions
+
+@section Why doesn't FFmpeg support feature [xyz]?
+
+Because no one has taken on that task yet. FFmpeg development is
+driven by the tasks that are important to the individual developers.
+If there is a feature that is important to you, the best way to get
+it implemented is to undertake the task yourself or sponsor a developer.
+
+@section FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?
+
+No. Windows DLLs are not portable, bloated and often slow.
+Moreover FFmpeg strives to support all codecs natively.
+A DLL loader is not conducive to that goal.
+
+@section I cannot read this file although this format seems to be supported by ffmpeg.
+
+Even if ffmpeg can read the container format, it may not support all its
+codecs. Please consult the supported codec list in the ffmpeg
+documentation.
+
+@section Which codecs are supported by Windows?
+
+Windows does not support standard formats like MPEG very well, unless you
+install some additional codecs.
+
+The following list of video codecs should work on most Windows systems:
+@table @option
+@item msmpeg4v2
+.avi/.asf
+@item msmpeg4
+.asf only
+@item wmv1
+.asf only
+@item wmv2
+.asf only
+@item mpeg4
+Only if you have some MPEG-4 codec like ffdshow or Xvid installed.
+@item mpeg1video
+.mpg only
+@end table
+Note, ASF files often have .wmv or .wma extensions in Windows. It should also
+be mentioned that Microsoft claims a patent on the ASF format, and may sue
+or threaten users who create ASF files with non-Microsoft software. It is
+strongly advised to avoid ASF where possible.
+
+The following list of audio codecs should work on most Windows systems:
+@table @option
+@item adpcm_ima_wav
+@item adpcm_ms
+@item pcm_s16le
+always
+@item libmp3lame
+If some MP3 codec like LAME is installed.
+@end table
+
+
+@chapter Compilation
+
+@section @code{error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'}
+
+This is a bug in gcc. Do not report it to us. Instead, please report it to
+the gcc developers. Note that we will not add workarounds for gcc bugs.
+
+Also note that (some of) the gcc developers believe this is not a bug or
+not a bug they should fix:
+@url{https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203}.
+Then again, some of them do not know the difference between an undecidable
+problem and an NP-hard problem...
+
+@section I have installed this library with my distro's package manager. Why does @command{configure} not see it?
+
+Distributions usually split libraries in several packages. The main package
+contains the files necessary to run programs using the library. The
+development package contains the files necessary to build programs using the
+library. Sometimes, docs and/or data are in a separate package too.
+
+To build FFmpeg, you need to install the development package. It is usually
+called @file{libfoo-dev} or @file{libfoo-devel}. You can remove it after the
+build is finished, but be sure to keep the main package.
+
+@section How do I make @command{pkg-config} find my libraries?
+
+Somewhere along with your libraries, there is a @file{.pc} file (or several)
+in a @file{pkgconfig} directory. You need to set environment variables to
+point @command{pkg-config} to these files.
+
+If you need to @emph{add} directories to @command{pkg-config}'s search list
+(typical use case: library installed separately), add it to
+@code{$PKG_CONFIG_PATH}:
+
+@example
+export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
+@end example
+
+If you need to @emph{replace} @command{pkg-config}'s search list
+(typical use case: cross-compiling), set it in
+@code{$PKG_CONFIG_LIBDIR}:
+
+@example
+export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
+@end example
+
+If you need to know the library's internal dependencies (typical use: static
+linking), add the @code{--static} option to @command{pkg-config}:
+
+@example
+./configure --pkg-config-flags=--static
+@end example
+
+@section How do I use @command{pkg-config} when cross-compiling?
+
+The best way is to install @command{pkg-config} in your cross-compilation
+environment. It will automatically use the cross-compilation libraries.
+
+You can also use @command{pkg-config} from the host environment by
+specifying explicitly @code{--pkg-config=pkg-config} to @command{configure}.
+In that case, you must point @command{pkg-config} to the correct directories
+using the @code{PKG_CONFIG_LIBDIR}, as explained in the previous entry.
+
+As an intermediate solution, you can place in your cross-compilation
+environment a script that calls the host @command{pkg-config} with
+@code{PKG_CONFIG_LIBDIR} set. That script can look like that:
+
+@example
+#!/bin/sh
+PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
+export PKG_CONFIG_LIBDIR
+exec /usr/bin/pkg-config "$@@"
+@end example
+
+@chapter Usage
+
+@section ffmpeg does not work; what is wrong?
+
+Try a @code{make distclean} in the ffmpeg source directory before the build.
+If this does not help see
+(@url{https://ffmpeg.org/bugreports.html}).
+
+@section How do I encode single pictures into movies?
+
+First, rename your pictures to follow a numerical sequence.
+For example, img1.jpg, img2.jpg, img3.jpg,...
+Then you may run:
+
+@example
+ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
+@end example
+
+Notice that @samp{%d} is replaced by the image number.
+
+@file{img%03d.jpg} means the sequence @file{img001.jpg}, @file{img002.jpg}, etc.
+
+Use the @option{-start_number} option to declare a starting number for
+the sequence. This is useful if your sequence does not start with
+@file{img001.jpg} but is still in a numerical order. The following
+example will start with @file{img100.jpg}:
+
+@example
+ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
+@end example
+
+If you have large number of pictures to rename, you can use the
+following command to ease the burden. The command, using the bourne
+shell syntax, symbolically links all files in the current directory
+that match @code{*jpg} to the @file{/tmp} directory in the sequence of
+@file{img001.jpg}, @file{img002.jpg} and so on.
+
+@example
+x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
+@end example
+
+If you want to sequence them by oldest modified first, substitute
+@code{$(ls -r -t *jpg)} in place of @code{*jpg}.
+
+Then run:
+
+@example
+ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
+@end example
+
+The same logic is used for any image format that ffmpeg reads.
+
+You can also use @command{cat} to pipe images to ffmpeg:
+
+@example
+cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
+@end example
+
+@section How do I encode movie to single pictures?
+
+Use:
+
+@example
+ffmpeg -i movie.mpg movie%d.jpg
+@end example
+
+The @file{movie.mpg} used as input will be converted to
+@file{movie1.jpg}, @file{movie2.jpg}, etc...
+
+Instead of relying on file format self-recognition, you may also use
+@table @option
+@item -c:v ppm
+@item -c:v png
+@item -c:v mjpeg
+@end table
+to force the encoding.
+
+Applying that to the previous example:
+@example
+ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
+@end example
+
+Beware that there is no "jpeg" codec. Use "mjpeg" instead.
+
+@section Why do I see a slight quality degradation with multithreaded MPEG* encoding?
+
+For multithreaded MPEG* encoding, the encoded slices must be independent,
+otherwise thread n would practically have to wait for n-1 to finish, so it's
+quite logical that there is a small reduction of quality. This is not a bug.
+
+@section How can I read from the standard input or write to the standard output?
+
+Use @file{-} as file name.
+
+@section -f jpeg doesn't work.
+
+Try '-f image2 test%d.jpg'.
+
+@section Why can I not change the frame rate?
+
+Some codecs, like MPEG-1/2, only allow a small number of fixed frame rates.
+Choose a different codec with the -c:v command line option.
+
+@section How do I encode Xvid or DivX video with ffmpeg?
+
+Both Xvid and DivX (version 4+) are implementations of the ISO MPEG-4
+standard (note that there are many other coding formats that use this
+same standard). Thus, use '-c:v mpeg4' to encode in these formats. The
+default fourcc stored in an MPEG-4-coded file will be 'FMP4'. If you want
+a different fourcc, use the '-vtag' option. E.g., '-vtag xvid' will
+force the fourcc 'xvid' to be stored as the video fourcc rather than the
+default.
+
+@section Which are good parameters for encoding high quality MPEG-4?
+
+'-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2',
+things to try: '-bf 2', '-mpv_flags qp_rd', '-mpv_flags mv0', '-mpv_flags skip_rd'.
+
+@section Which are good parameters for encoding high quality MPEG-1/MPEG-2?
+
+'-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2'
+but beware the '-g 100' might cause problems with some decoders.
+Things to try: '-bf 2', '-mpv_flags qp_rd', '-mpv_flags mv0', '-mpv_flags skip_rd'.
+
+@section Interlaced video looks very bad when encoded with ffmpeg, what is wrong?
+
+You should use '-flags +ilme+ildct' and maybe '-flags +alt' for interlaced
+material, and try '-top 0/1' if the result looks really messed-up.
+
+@section How can I read DirectShow files?
+
+If you have built FFmpeg with @code{./configure --enable-avisynth}
+(only possible on MinGW/Cygwin platforms),
+then you may use any file that DirectShow can read as input.
+
+Just create an "input.avs" text file with this single line ...
+@example
+DirectShowSource("C:\path to your file\yourfile.asf")
+@end example
+... and then feed that text file to ffmpeg:
+@example
+ffmpeg -i input.avs
+@end example
+
+For ANY other help on AviSynth, please visit the
+@uref{http://www.avisynth.org/, AviSynth homepage}.
+
+@section How can I join video files?
+
+To "join" video files is quite ambiguous. The following list explains the
+different kinds of "joining" and points out how those are addressed in
+FFmpeg. To join video files may mean:
+
+@itemize
+
+@item
+To put them one after the other: this is called to @emph{concatenate} them
+(in short: concat) and is addressed
+@ref{How can I concatenate video files, in this very faq}.
+
+@item
+To put them together in the same file, to let the user choose between the
+different versions (example: different audio languages): this is called to
+@emph{multiplex} them together (in short: mux), and is done by simply
+invoking ffmpeg with several @option{-i} options.
+
+@item
+For audio, to put all channels together in a single stream (example: two
+mono streams into one stereo stream): this is sometimes called to
+@emph{merge} them, and can be done using the
+@url{ffmpeg-filters.html#amerge, @code{amerge}} filter.
+
+@item
+For audio, to play one on top of the other: this is called to @emph{mix}
+them, and can be done by first merging them into a single stream and then
+using the @url{ffmpeg-filters.html#pan, @code{pan}} filter to mix
+the channels at will.
+
+@item
+For video, to display both together, side by side or one on top of a part of
+the other; it can be done using the
+@url{ffmpeg-filters.html#overlay, @code{overlay}} video filter.
+
+@end itemize
+
+@anchor{How can I concatenate video files}
+@section How can I concatenate video files?
+
+There are several solutions, depending on the exact circumstances.
+
+@subsection Concatenating using the concat @emph{filter}
+
+FFmpeg has a @url{ffmpeg-filters.html#concat,
+@code{concat}} filter designed specifically for that, with examples in the
+documentation. This operation is recommended if you need to re-encode.
+
+@subsection Concatenating using the concat @emph{demuxer}
+
+FFmpeg has a @url{ffmpeg-formats.html#concat,
+@code{concat}} demuxer which you can use when you want to avoid a re-encode and
+your format doesn't support file level concatenation.
+
+@subsection Concatenating using the concat @emph{protocol} (file level)
+
+FFmpeg has a @url{ffmpeg-protocols.html#concat,
+@code{concat}} protocol designed specifically for that, with examples in the
+documentation.
+
+A few multimedia containers (MPEG-1, MPEG-2 PS, DV) allow one to concatenate
+video by merely concatenating the files containing them.
+
+Hence you may concatenate your multimedia files by first transcoding them to
+these privileged formats, then using the humble @code{cat} command (or the
+equally humble @code{copy} under Windows), and finally transcoding back to your
+format of choice.
+
+@example
+ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
+ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
+cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
+ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
+@end example
+
+Additionally, you can use the @code{concat} protocol instead of @code{cat} or
+@code{copy} which will avoid creation of a potentially huge intermediate file.
+
+@example
+ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
+ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
+ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
+ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
+@end example
+
+Note that you may need to escape the character "|" which is special for many
+shells.
+
+Another option is usage of named pipes, should your platform support it:
+
+@example
+mkfifo intermediate1.mpg
+mkfifo intermediate2.mpg
+ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
+ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
+cat intermediate1.mpg intermediate2.mpg |\
+ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
+@end example
+
+@subsection Concatenating using raw audio and video
+
+Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also
+allow concatenation, and the transcoding step is almost lossless.
+When using multiple yuv4mpegpipe(s), the first line needs to be discarded
+from all but the first stream. This can be accomplished by piping through
+@code{tail} as seen below. Note that when piping through @code{tail} you
+must use command grouping, @code{@{ ;@}}, to background properly.
+
+For example, let's say we want to concatenate two FLV files into an
+output.flv file:
+
+@example
+mkfifo temp1.a
+mkfifo temp1.v
+mkfifo temp2.a
+mkfifo temp2.v
+mkfifo all.a
+mkfifo all.v
+ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
+ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
+ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
+@{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; @} &
+cat temp1.a temp2.a > all.a &
+cat temp1.v temp2.v > all.v &
+ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
+ -f yuv4mpegpipe -i all.v \
+ -y output.flv
+rm temp[12].[av] all.[av]
+@end example
+
+@section Using @option{-f lavfi}, audio becomes mono for no apparent reason.
+
+Use @option{-dumpgraph -} to find out exactly where the channel layout is
+lost.
+
+Most likely, it is through @code{auto-inserted aresample}. Try to understand
+why the converting filter was needed at that place.
+
+Just before the output is a likely place, as @option{-f lavfi} currently
+only support packed S16.
+
+Then insert the correct @code{aformat} explicitly in the filtergraph,
+specifying the exact format.
+
+@example
+aformat=sample_fmts=s16:channel_layouts=stereo
+@end example
+
+@section Why does FFmpeg not see the subtitles in my VOB file?
+
+VOB and a few other formats do not have a global header that describes
+everything present in the file. Instead, applications are supposed to scan
+the file to see what it contains. Since VOB files are frequently large, only
+the beginning is scanned. If the subtitles happen only later in the file,
+they will not be initially detected.
+
+Some applications, including the @code{ffmpeg} command-line tool, can only
+work with streams that were detected during the initial scan; streams that
+are detected later are ignored.
+
+The size of the initial scan is controlled by two options: @code{probesize}
+(default ~5 Mo) and @code{analyzeduration} (default 5,000,000 µs = 5 s). For
+the subtitle stream to be detected, both values must be large enough.
+
+@section Why was the @command{ffmpeg} @option{-sameq} option removed? What to use instead?
+
+The @option{-sameq} option meant "same quantizer", and made sense only in a
+very limited set of cases. Unfortunately, a lot of people mistook it for
+"same quality" and used it in places where it did not make sense: it had
+roughly the expected visible effect, but achieved it in a very inefficient
+way.
+
+Each encoder has its own set of options to set the quality-vs-size balance,
+use the options for the encoder you are using to set the quality level to a
+point acceptable for your tastes. The most common options to do that are
+@option{-qscale} and @option{-qmax}, but you should peruse the documentation
+of the encoder you chose.
+
+@section I have a stretched video, why does scaling does not fix it?
+
+A lot of video codecs and formats can store the @emph{aspect ratio} of the
+video: this is the ratio between the width and the height of either the full
+image (DAR, display aspect ratio) or individual pixels (SAR, sample aspect
+ratio). For example, EGA screens at resolution 640×350 had 4:3 DAR and 35:48
+SAR.
+
+Most still image processing work with square pixels, i.e. 1:1 SAR, but a lot
+of video standards, especially from the analogic-numeric transition era, use
+non-square pixels.
+
+Most processing filters in FFmpeg handle the aspect ratio to avoid
+stretching the image: cropping adjusts the DAR to keep the SAR constant,
+scaling adjusts the SAR to keep the DAR constant.
+
+If you want to stretch, or “unstretch”, the image, you need to override the
+information with the
+@url{ffmpeg-filters.html#setdar_002c-setsar, @code{setdar or setsar filters}}.
+
+Do not forget to examine carefully the original video to check whether the
+stretching comes from the image or from the aspect ratio information.
+
+For example, to fix a badly encoded EGA capture, use the following commands,
+either the first one to upscale to square pixels or the second one to set
+the correct aspect ratio or the third one to avoid transcoding (may not work
+depending on the format / codec / player / phase of the moon):
+
+@example
+ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
+ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
+ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
+@end example
+
+@anchor{background task}
+@section How do I run ffmpeg as a background task?
+
+ffmpeg normally checks the console input, for entries like "q" to stop
+and "?" to give help, while performing operations. ffmpeg does not have a way of
+detecting when it is running as a background task.
+When it checks the console input, that can cause the process running ffmpeg
+in the background to suspend.
+
+To prevent those input checks, allowing ffmpeg to run as a background task,
+use the @url{ffmpeg.html#stdin-option, @code{-nostdin} option}
+in the ffmpeg invocation. This is effective whether you run ffmpeg in a shell
+or invoke ffmpeg in its own process via an operating system API.
+
+As an alternative, when you are running ffmpeg in a shell, you can redirect
+standard input to @code{/dev/null} (on Linux and macOS)
+or @code{NUL} (on Windows). You can do this redirect either
+on the ffmpeg invocation, or from a shell script which calls ffmpeg.
+
+For example:
+
+@example
+ffmpeg -nostdin -i INPUT OUTPUT
+@end example
+
+or (on Linux, macOS, and other UNIX-like shells):
+
+@example
+ffmpeg -i INPUT OUTPUT ~/tmp/log.txt &
+[1] 93352
+%
+[1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
+@end example
+
+The message "tty output" notwithstanding, the problem here is that
+ffmpeg normally checks the console input when it runs. The operating system
+detects this, and suspends the process until you can bring it to the
+foreground and attend to it.
+
+The solution is to use the right techniques to tell ffmpeg not to consult
+console input. You can use the
+@url{ffmpeg.html#stdin-option, @code{-nostdin} option},
+or redirect standard input with @code{< /dev/null}.
+See FAQ
+@ref{background task, @emph{How do I run ffmpeg as a background task?}}
+for details.
+
+@chapter Development
+
+@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?
+
+Yes. Check the @file{doc/examples} directory in the source
+repository, also available online at:
+@url{https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples}.
+
+Examples are also installed by default, usually in
+@code{$PREFIX/share/ffmpeg/examples}.
+
+Also you may read the Developers Guide of the FFmpeg documentation. Alternatively,
+examine the source code for one of the many open source projects that
+already incorporate FFmpeg at (@url{projects.html}).
+
+@section Can you support my C compiler XXX?
+
+It depends. If your compiler is C99-compliant, then patches to support
+it are likely to be welcome if they do not pollute the source code
+with @code{#ifdef}s related to the compiler.
+
+@section Is Microsoft Visual C++ supported?
+
+Yes. Please see the @uref{platform.html, Microsoft Visual C++}
+section in the FFmpeg documentation.
+
+@section Can you add automake, libtool or autoconf support?
+
+No. These tools are too bloated and they complicate the build.
+
+@section Why not rewrite FFmpeg in object-oriented C++?
+
+FFmpeg is already organized in a highly modular manner and does not need to
+be rewritten in a formal object language. Further, many of the developers
+favor straight C; it works for them. For more arguments on this matter,
+read @uref{https://web.archive.org/web/20111004021423/http://kernel.org/pub/linux/docs/lkml/#s15, "Programming Religion"}.
+
+@section Why are the ffmpeg programs devoid of debugging symbols?
+
+The build process creates @command{ffmpeg_g}, @command{ffplay_g}, etc. which
+contain full debug information. Those binaries are stripped to create
+@command{ffmpeg}, @command{ffplay}, etc. If you need the debug information, use
+the *_g versions.
+
+@section I do not like the LGPL, can I contribute code under the GPL instead?
+
+Yes, as long as the code is optional and can easily and cleanly be placed
+under #if CONFIG_GPL without breaking anything. So, for example, a new codec
+or filter would be OK under GPL while a bug fix to LGPL code would not.
+
+@section I'm using FFmpeg from within my C application but the linker complains about missing symbols from the libraries themselves.
+
+FFmpeg builds static libraries by default. In static libraries, dependencies
+are not handled. That has two consequences. First, you must specify the
+libraries in dependency order: @code{-lavdevice} must come before
+@code{-lavformat}, @code{-lavutil} must come after everything else, etc.
+Second, external libraries that are used in FFmpeg have to be specified too.
+
+An easy way to get the full list of required libraries in dependency order
+is to use @code{pkg-config}.
+
+@example
+c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
+@end example
+
+See @file{doc/example/Makefile} and @file{doc/example/pc-uninstalled} for
+more details.
+
+@section I'm using FFmpeg from within my C++ application but the linker complains about missing symbols which seem to be available.
+
+FFmpeg is a pure C project, so to use the libraries within your C++ application
+you need to explicitly state that you are using a C library. You can do this by
+encompassing your FFmpeg includes using @code{extern "C"}.
+
+See @url{http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3}
+
+@section I'm using libavutil from within my C++ application but the compiler complains about 'UINT64_C' was not declared in this scope
+
+FFmpeg is a pure C project using C99 math features, in order to enable C++
+to use them you have to append -D__STDC_CONSTANT_MACROS to your CXXFLAGS
+
+@section I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?
+
+You have to create a custom AVIOContext using @code{avio_alloc_context},
+see @file{libavformat/aviobuf.c} in FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer or MPlayer2 sources.
+
+@section Where is the documentation about ffv1, msmpeg4, asv1, 4xm?
+
+see @url{https://www.ffmpeg.org/~michael/}
+
+@section How do I feed H.263-RTP (and other codecs in RTP) to libavcodec?
+
+Even if peculiar since it is network oriented, RTP is a container like any
+other. You have to @emph{demux} RTP before feeding the payload to libavcodec.
+In this specific case please look at RFC 4629 to see how it should be done.
+
+@section AVStream.r_frame_rate is wrong, it is much larger than the frame rate.
+
+@code{r_frame_rate} is NOT the average frame rate, it is the smallest frame rate
+that can accurately represent all timestamps. So no, it is not
+wrong if it is larger than the average!
+For example, if you have mixed 25 and 30 fps content, then @code{r_frame_rate}
+will be 150 (it is the least common multiple).
+If you are looking for the average frame rate, see @code{AVStream.avg_frame_rate}.
+
+@section Why is @code{make fate} not running all tests?
+
+Make sure you have the fate-suite samples and the @code{SAMPLES} Make variable
+or @code{FATE_SAMPLES} environment variable or the @code{--samples}
+@command{configure} option is set to the right path.
+
+@section Why is @code{make fate} not finding the samples?
+
+Do you happen to have a @code{~} character in the samples path to indicate a
+home directory? The value is used in ways where the shell cannot expand it,
+causing FATE to not find files. Just replace @code{~} by the full path.
+
+@bye
diff --git a/extern/ffmpeg/doc/fate.html b/extern/ffmpeg/doc/fate.html
index 1361d2355a..3fdd23a944 100644
--- a/extern/ffmpeg/doc/fate.html
+++ b/extern/ffmpeg/doc/fate.html
@@ -1,144 +1,148 @@
-
+
-
-
+
+
+FFmpeg Automated Testing Environment
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
FFmpeg Automated Testing Environment
+
-
FFmpeg Automated Testing Environment
-
-
-
Table of Contents
-
+
-
1. Introduction
+
1 Introduction# TOC
-
FATE is an extended regression suite on the client-side and a means
+
FATE is an extended regression suite on the client-side and a means
for results aggregation and presentation on the server-side.
-
The first part of this document explains how you can use FATE from
+
The first part of this document explains how you can use FATE from
your FFmpeg source directory to test your ffmpeg binary. The second
part describes how you can run FATE to submit the results to FFmpeg’s
FATE server.
-
In any way you can have a look at the publicly viewable FATE results
+
In any way you can have a look at the publicly viewable FATE results
by visiting this website:
-
http://fate.ffmpeg.org/
+
http://fate.ffmpeg.org/
-
This is especially recommended for all people contributing source
+
This is especially recommended for all people contributing source
code to FFmpeg, as it can be seen if some test on some platform broke
with their recent contribution. This usually happens on the platforms
the developers could not test on.
-
The second part of this document describes how you can run FATE to
+
The second part of this document describes how you can run FATE to
submit your results to FFmpeg’s FATE server. If you want to submit your
results be sure to check that your combination of CPU, OS and compiler
is not already listed on the above mentioned website.
-
In the third part you can find a comprehensive listing of FATE makefile
+
In the third part you can find a comprehensive listing of FATE makefile
targets and variables.
-
2. Using FATE from your FFmpeg source directory
+
2 Using FATE from your FFmpeg source directory# TOC
-
If you want to run FATE on your machine you need to have the samples
+
If you want to run FATE on your machine you need to have the samples
in place. You can get the samples via the build target fate-rsync.
Use this command from the top-level source directory:
-
make fate-rsync SAMPLES=fate-suite/
+
+
make fate-rsync SAMPLES=fate-suite/
make fate SAMPLES=fate-suite/
-
+
-
The above commands set the samples location by passing a makefile
+
The above commands set the samples location by passing a makefile
variable via command line. It is also possible to set the samples
location at source configuration time by invoking configure with
-‘–samples=<path to the samples directory>’. Afterwards you can
-invoke the makefile targets without setting the SAMPLES makefile
+--samples=<path to the samples directory> . Afterwards you can
+invoke the makefile targets without setting the SAMPLES makefile
variable. This is illustrated by the following commands:
-
./configure --samples=fate-suite/
+
+
./configure --samples=fate-suite/
make fate-rsync
make fate
-
+
- Yet another way to tell FATE about the location of the sample
+
Yet another way to tell FATE about the location of the sample
directory is by making sure the environment variable FATE_SAMPLES
contains the path to your samples directory. This can be achieved
by e.g. putting that variable in your shell profile or by setting
it in your interactive session.
- FATE_SAMPLES=fate-suite/ make fate
-
+
+
FATE_SAMPLES=fate-suite/ make fate
+
-
+
Do not put a ’~’ character in the samples path to indicate a home
directory. Because of shell nuances, this will cause FATE to fail.
-
-
To use a custom wrapper to run the test, pass ‘--target-exec ’ to
+
+To use a custom wrapper to run the test, pass --target-exec to
configure or set the TARGET_EXEC Make variable.
-3. Submitting the results to the FFmpeg result aggregation server
+3 Submitting the results to the FFmpeg result aggregation server# TOC
- To submit your results to the server you should run fate through the
-shell script ‘tests/fate.sh ’ from the FFmpeg sources. This script needs
+
To submit your results to the server you should run fate through the
+shell script tests/fate.sh from the FFmpeg sources. This script needs
to be invoked with a configuration file as its first argument.
- tests/fate.sh /path/to/fate_config
-
+
+
tests/fate.sh /path/to/fate_config
+
- A configuration file template with comments describing the individual
-configuration variables can be found at ‘doc/fate_config.sh.template ’.
+
A configuration file template with comments describing the individual
+configuration variables can be found at doc/fate_config.sh.template .
- The mentioned configuration template is also available here:
-
slot= # some unique identifier
+The mentioned configuration template is also available here:
+
slot= # some unique identifier
repo=git://source.ffmpeg.org/ffmpeg.git # the source repository
+#branch=release/2.6 # the branch to test
samples= # path to samples directory
workdir= # directory in which to do all the work
#fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report
comment= # optional description
build_only= # set to "yes" for a compile-only instance that skips tests
+ignore_tests=
# the following are optional and map to configure options
arch=
@@ -159,18 +163,20 @@ fate-admin@ffmpeg.org .
- Configure your SSH client to use public key authentication with that key
+
Configure your SSH client to use public key authentication with that key
when connecting to the FATE server. Also do not forget to check the identity
of the server and to accept its host key. This can usually be achieved by
running your SSH client manually and killing it after you accepted the key.
The FATE server’s fingerprint is:
- ‘RSA ’
- d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
+
‘RSA ’
+d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
- ‘ECDSA ’
- 76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
+
‘ECDSA ’
+76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
- If you have problems connecting to the FATE server, it may help to try out
-the ssh command with one or more ‘-v ’ options. You should
+
If you have problems connecting to the FATE server, it may help to try out
+the ssh command with one or more -v options. You should
get detailed output concerning your SSH configuration and the authentication
process.
- The only thing left is to automate the execution of the fate.sh script and
+
The only thing left is to automate the execution of the fate.sh script and
the synchronisation of the samples directory.
+
+4 Uploading new samples to the fate suite# TOC
+
+If you need a sample uploaded send a mail to samples-request.
+
+This is for developers who have an account on the fate suite server.
+If you upload new samples, please make sure they are as small as possible,
+space on each client, network bandwidth and so on benefit from smaller test cases.
+Also keep in mind older checkouts use existing sample files, that means in
+practice generally do not replace, remove or overwrite files as it likely would
+break older checkouts or releases.
+Also all needed samples for a commit should be uploaded, ideally 24
+hours, before the push.
+If you need an account for frequently uploading samples or you wish to help
+others by doing that send a mail to ffmpeg-devel.
+
+
+
#First update your local samples copy:
+rsync -vauL --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X fate-suite.ffmpeg.org:/home/samples/fate-suite/ ~/fate-suite
+
+#Then do a dry run checking what would be uploaded:
+rsync -vanL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+
+#Upload the files:
+rsync -vaL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+
+
-4. FATE makefile targets and variables
+5 FATE makefile targets and variables# TOC
-4.1 Makefile targets
+5.1 Makefile targets# TOC
- ‘fate-rsync ’
+fate-rsync
Download/synchronize sample files to the configured samples directory.
- ‘fate-list ’
+fate-list
Will list all fate/regression test targets.
- ‘fate ’
+fate
Run the FATE test suite (requires the fate-suite dataset).
-4.2 Makefile variables
+5.2 Makefile variables# TOC
- ‘V ’
+V
Verbosity level, can be set to 0, 1 or 2.
- ‘SAMPLES ’
+SAMPLES
Specify or override the path to the FATE samples at make time, it has a
meaning only while running the regression tests.
- ‘THREADS ’
+THREADS
Specify how many threads to use while running regression tests, it is
quite useful to detect thread-related regressions.
- ‘THREAD_TYPE ’
-Specify which threading strategy test, either slice or frame ,
-by default slice+frame
+
THREAD_TYPE
+Specify which threading strategy test, either ‘slice ’ or ‘frame ’,
+by default ‘slice+frame ’
- ‘CPUFLAGS ’
+CPUFLAGS
Specify CPU flags.
- ‘TARGET_EXEC ’
+TARGET_EXEC
Specify or override the wrapper used to run the tests.
-The TARGET_EXEC option provides a way to run FATE wrapped in
+The TARGET_EXEC option provides a way to run FATE wrapped in
valgrind, qemu-user or wine or on remote targets
through ssh.
- ‘GEN ’
-Set to 1 to generate the missing or mismatched references.
-
+GEN
+Set to ‘1 ’ to generate the missing or mismatched references.
+
+
+HWACCEL
+Specify which hardware acceleration to use while running regression tests,
+by default ‘none ’ is used.
+
+
+KEEP
+Set to ‘1 ’ to keep temp files generated by fate test(s) when test is successful.
+Default is ‘0 ’, which removes these files. Files are always kept when a test
+fails.
+
+
-4.3 Examples
+5.3 Examples# TOC
+
+
+
make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
+
+
+
- make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
-
-
+
+
diff --git a/extern/ffmpeg/doc/fate.html.d b/extern/ffmpeg/doc/fate.html.d
new file mode 100644
index 0000000000..471c8aaf9b
--- /dev/null
+++ b/extern/ffmpeg/doc/fate.html.d
@@ -0,0 +1 @@
+doc/fate.html: doc/fate_config.sh.template
diff --git a/extern/ffmpeg/doc/fate.texi b/extern/ffmpeg/doc/fate.texi
new file mode 100644
index 0000000000..c3550785a1
--- /dev/null
+++ b/extern/ffmpeg/doc/fate.texi
@@ -0,0 +1,242 @@
+\input texinfo @c -*- texinfo -*-
+@documentencoding UTF-8
+
+@settitle FFmpeg Automated Testing Environment
+@titlepage
+@center @titlefont{FFmpeg Automated Testing Environment}
+@end titlepage
+
+@node Top
+@top
+
+@contents
+
+@chapter Introduction
+
+FATE is an extended regression suite on the client-side and a means
+for results aggregation and presentation on the server-side.
+
+The first part of this document explains how you can use FATE from
+your FFmpeg source directory to test your ffmpeg binary. The second
+part describes how you can run FATE to submit the results to FFmpeg's
+FATE server.
+
+In any way you can have a look at the publicly viewable FATE results
+by visiting this website:
+
+@url{http://fate.ffmpeg.org/}
+
+This is especially recommended for all people contributing source
+code to FFmpeg, as it can be seen if some test on some platform broke
+with their recent contribution. This usually happens on the platforms
+the developers could not test on.
+
+The second part of this document describes how you can run FATE to
+submit your results to FFmpeg's FATE server. If you want to submit your
+results be sure to check that your combination of CPU, OS and compiler
+is not already listed on the above mentioned website.
+
+In the third part you can find a comprehensive listing of FATE makefile
+targets and variables.
+
+
+@chapter Using FATE from your FFmpeg source directory
+
+If you want to run FATE on your machine you need to have the samples
+in place. You can get the samples via the build target fate-rsync.
+Use this command from the top-level source directory:
+
+@example
+make fate-rsync SAMPLES=fate-suite/
+make fate SAMPLES=fate-suite/
+@end example
+
+The above commands set the samples location by passing a makefile
+variable via command line. It is also possible to set the samples
+location at source configuration time by invoking configure with
+@option{--samples=}. Afterwards you can
+invoke the makefile targets without setting the @var{SAMPLES} makefile
+variable. This is illustrated by the following commands:
+
+@example
+./configure --samples=fate-suite/
+make fate-rsync
+make fate
+@end example
+
+Yet another way to tell FATE about the location of the sample
+directory is by making sure the environment variable FATE_SAMPLES
+contains the path to your samples directory. This can be achieved
+by e.g. putting that variable in your shell profile or by setting
+it in your interactive session.
+
+@example
+FATE_SAMPLES=fate-suite/ make fate
+@end example
+
+@float NOTE
+Do not put a '~' character in the samples path to indicate a home
+directory. Because of shell nuances, this will cause FATE to fail.
+@end float
+
+To use a custom wrapper to run the test, pass @option{--target-exec} to
+@command{configure} or set the @var{TARGET_EXEC} Make variable.
+
+
+@chapter Submitting the results to the FFmpeg result aggregation server
+
+To submit your results to the server you should run fate through the
+shell script @file{tests/fate.sh} from the FFmpeg sources. This script needs
+to be invoked with a configuration file as its first argument.
+
+@example
+tests/fate.sh /path/to/fate_config
+@end example
+
+A configuration file template with comments describing the individual
+configuration variables can be found at @file{doc/fate_config.sh.template}.
+
+@ifhtml
+The mentioned configuration template is also available here:
+@verbatiminclude fate_config.sh.template
+@end ifhtml
+
+Create a configuration that suits your needs, based on the configuration
+template. The @env{slot} configuration variable can be any string that is not
+yet used, but it is suggested that you name it adhering to the following
+pattern @samp{@var{arch}-@var{os}-@var{compiler}-@var{compiler version}}. The
+configuration file itself will be sourced in a shell script, therefore all
+shell features may be used. This enables you to setup the environment as you
+need it for your build.
+
+For your first test runs the @env{fate_recv} variable should be empty or
+commented out. This will run everything as normal except that it will omit
+the submission of the results to the server. The following files should be
+present in $workdir as specified in the configuration file:
+
+@itemize
+ @item configure.log
+ @item compile.log
+ @item test.log
+ @item report
+ @item version
+@end itemize
+
+When you have everything working properly you can create an SSH key pair
+and send the public key to the FATE server administrator who can be contacted
+at the email address @email{fate-admin@@ffmpeg.org}.
+
+Configure your SSH client to use public key authentication with that key
+when connecting to the FATE server. Also do not forget to check the identity
+of the server and to accept its host key. This can usually be achieved by
+running your SSH client manually and killing it after you accepted the key.
+The FATE server's fingerprint is:
+
+@table @samp
+@item RSA
+ d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
+@item ECDSA
+ 76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
+@end table
+
+If you have problems connecting to the FATE server, it may help to try out
+the @command{ssh} command with one or more @option{-v} options. You should
+get detailed output concerning your SSH configuration and the authentication
+process.
+
+The only thing left is to automate the execution of the fate.sh script and
+the synchronisation of the samples directory.
+
+@chapter Uploading new samples to the fate suite
+
+If you need a sample uploaded send a mail to samples-request.
+
+This is for developers who have an account on the fate suite server.
+If you upload new samples, please make sure they are as small as possible,
+space on each client, network bandwidth and so on benefit from smaller test cases.
+Also keep in mind older checkouts use existing sample files, that means in
+practice generally do not replace, remove or overwrite files as it likely would
+break older checkouts or releases.
+Also all needed samples for a commit should be uploaded, ideally 24
+hours, before the push.
+If you need an account for frequently uploading samples or you wish to help
+others by doing that send a mail to ffmpeg-devel.
+
+@example
+#First update your local samples copy:
+rsync -vauL --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X fate-suite.ffmpeg.org:/home/samples/fate-suite/ ~/fate-suite
+
+#Then do a dry run checking what would be uploaded:
+rsync -vanL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+
+#Upload the files:
+rsync -vaL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+@end example
+
+
+@chapter FATE makefile targets and variables
+
+@section Makefile targets
+
+@table @option
+@item fate-rsync
+Download/synchronize sample files to the configured samples directory.
+
+@item fate-list
+Will list all fate/regression test targets.
+
+@item fate
+Run the FATE test suite (requires the fate-suite dataset).
+@end table
+
+@section Makefile variables
+
+@table @env
+@item V
+Verbosity level, can be set to 0, 1 or 2.
+ @itemize
+ @item 0: show just the test arguments
+ @item 1: show just the command used in the test
+ @item 2: show everything
+ @end itemize
+
+@item SAMPLES
+Specify or override the path to the FATE samples at make time, it has a
+meaning only while running the regression tests.
+
+@item THREADS
+Specify how many threads to use while running regression tests, it is
+quite useful to detect thread-related regressions.
+
+@item THREAD_TYPE
+Specify which threading strategy test, either @samp{slice} or @samp{frame},
+by default @samp{slice+frame}
+
+@item CPUFLAGS
+Specify CPU flags.
+
+@item TARGET_EXEC
+Specify or override the wrapper used to run the tests.
+The @env{TARGET_EXEC} option provides a way to run FATE wrapped in
+@command{valgrind}, @command{qemu-user} or @command{wine} or on remote targets
+through @command{ssh}.
+
+@item GEN
+Set to @samp{1} to generate the missing or mismatched references.
+
+@item HWACCEL
+Specify which hardware acceleration to use while running regression tests,
+by default @samp{none} is used.
+
+@item KEEP
+Set to @samp{1} to keep temp files generated by fate test(s) when test is successful.
+Default is @samp{0}, which removes these files. Files are always kept when a test
+fails.
+
+@end table
+
+@section Examples
+
+@example
+make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
+@end example
diff --git a/extern/ffmpeg/doc/fate.txt b/extern/ffmpeg/doc/fate.txt
new file mode 100644
index 0000000000..b61e4e4fdd
--- /dev/null
+++ b/extern/ffmpeg/doc/fate.txt
@@ -0,0 +1,219 @@
+FFmpeg Automated Testing Environment
+************************************
+
+
+1 Introduction
+2 Using FATE from your FFmpeg source directory
+3 Submitting the results to the FFmpeg result aggregation server
+4 Uploading new samples to the fate suite
+5 FATE makefile targets and variables
+ 5.1 Makefile targets
+ 5.2 Makefile variables
+ 5.3 Examples
+1 Introduction
+**************
+
+FATE is an extended regression suite on the client-side and a means for
+results aggregation and presentation on the server-side.
+
+ The first part of this document explains how you can use FATE from
+your FFmpeg source directory to test your ffmpeg binary. The second
+part describes how you can run FATE to submit the results to FFmpeg’s
+FATE server.
+
+ In any way you can have a look at the publicly viewable FATE results
+by visiting this website:
+
+
+
+ This is especially recommended for all people contributing source
+code to FFmpeg, as it can be seen if some test on some platform broke
+with their recent contribution. This usually happens on the platforms
+the developers could not test on.
+
+ The second part of this document describes how you can run FATE to
+submit your results to FFmpeg’s FATE server. If you want to submit your
+results be sure to check that your combination of CPU, OS and compiler
+is not already listed on the above mentioned website.
+
+ In the third part you can find a comprehensive listing of FATE
+makefile targets and variables.
+
+2 Using FATE from your FFmpeg source directory
+**********************************************
+
+If you want to run FATE on your machine you need to have the samples in
+place. You can get the samples via the build target fate-rsync. Use
+this command from the top-level source directory:
+
+ make fate-rsync SAMPLES=fate-suite/
+ make fate SAMPLES=fate-suite/
+
+ The above commands set the samples location by passing a makefile
+variable via command line. It is also possible to set the samples
+location at source configuration time by invoking configure with
+‘--samples=’. Afterwards you can invoke
+the makefile targets without setting the SAMPLES makefile variable.
+This is illustrated by the following commands:
+
+ ./configure --samples=fate-suite/
+ make fate-rsync
+ make fate
+
+ Yet another way to tell FATE about the location of the sample
+directory is by making sure the environment variable FATE_SAMPLES
+contains the path to your samples directory. This can be achieved by
+e.g. putting that variable in your shell profile or by setting it in
+your interactive session.
+
+ FATE_SAMPLES=fate-suite/ make fate
+
+Do not put a ’~’ character in the samples path to indicate a home
+directory. Because of shell nuances, this will cause FATE to fail.
+
+NOTE
+
+ To use a custom wrapper to run the test, pass ‘--target-exec’ to
+‘configure’ or set the TARGET_EXEC Make variable.
+
+3 Submitting the results to the FFmpeg result aggregation server
+****************************************************************
+
+To submit your results to the server you should run fate through the
+shell script ‘tests/fate.sh’ from the FFmpeg sources. This script needs
+to be invoked with a configuration file as its first argument.
+
+ tests/fate.sh /path/to/fate_config
+
+ A configuration file template with comments describing the individual
+configuration variables can be found at ‘doc/fate_config.sh.template’.
+
+ Create a configuration that suits your needs, based on the
+configuration template. The ‘slot’ configuration variable can be any
+string that is not yet used, but it is suggested that you name it
+adhering to the following pattern ‘ARCH-OS-COMPILER-COMPILER VERSION’.
+The configuration file itself will be sourced in a shell script,
+therefore all shell features may be used. This enables you to setup the
+environment as you need it for your build.
+
+ For your first test runs the ‘fate_recv’ variable should be empty or
+commented out. This will run everything as normal except that it will
+omit the submission of the results to the server. The following files
+should be present in $workdir as specified in the configuration file:
+
+ • configure.log
+ • compile.log
+ • test.log
+ • report
+ • version
+
+ When you have everything working properly you can create an SSH key
+pair and send the public key to the FATE server administrator who can be
+contacted at the email address .
+
+ Configure your SSH client to use public key authentication with that
+key when connecting to the FATE server. Also do not forget to check the
+identity of the server and to accept its host key. This can usually be
+achieved by running your SSH client manually and killing it after you
+accepted the key. The FATE server’s fingerprint is:
+
+‘RSA’
+ d3:f1:83:97:a4:75:2b:a6:fb:d6:e8:aa:81:93:97:51
+‘ECDSA’
+ 76:9f:68:32:04:1e:d5:d4:ec:47:3f:dc:fc:18:17:86
+
+ If you have problems connecting to the FATE server, it may help to
+try out the ‘ssh’ command with one or more ‘-v’ options. You should get
+detailed output concerning your SSH configuration and the authentication
+process.
+
+ The only thing left is to automate the execution of the fate.sh
+script and the synchronisation of the samples directory.
+
+4 Uploading new samples to the fate suite
+*****************************************
+
+If you need a sample uploaded send a mail to samples-request.
+
+ This is for developers who have an account on the fate suite server.
+If you upload new samples, please make sure they are as small as
+possible, space on each client, network bandwidth and so on benefit from
+smaller test cases. Also keep in mind older checkouts use existing
+sample files, that means in practice generally do not replace, remove or
+overwrite files as it likely would break older checkouts or releases.
+Also all needed samples for a commit should be uploaded, ideally 24
+hours, before the push. If you need an account for frequently uploading
+samples or you wish to help others by doing that send a mail to
+ffmpeg-devel.
+
+ #First update your local samples copy:
+ rsync -vauL --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X fate-suite.ffmpeg.org:/home/samples/fate-suite/ ~/fate-suite
+
+ #Then do a dry run checking what would be uploaded:
+ rsync -vanL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+
+ #Upload the files:
+ rsync -vaL --no-g --chmod=Dg+s,Duo+x,ug+rw,o+r,o-w,+X ~/fate-suite/ fate-suite.ffmpeg.org:/home/samples/fate-suite
+
+5 FATE makefile targets and variables
+*************************************
+
+5.1 Makefile targets
+====================
+
+‘fate-rsync’
+ Download/synchronize sample files to the configured samples
+ directory.
+
+‘fate-list’
+ Will list all fate/regression test targets.
+
+‘fate’
+ Run the FATE test suite (requires the fate-suite dataset).
+
+5.2 Makefile variables
+======================
+
+‘V’
+ Verbosity level, can be set to 0, 1 or 2.
+ • 0: show just the test arguments
+ • 1: show just the command used in the test
+ • 2: show everything
+
+‘SAMPLES’
+ Specify or override the path to the FATE samples at make time, it
+ has a meaning only while running the regression tests.
+
+‘THREADS’
+ Specify how many threads to use while running regression tests, it
+ is quite useful to detect thread-related regressions.
+
+‘THREAD_TYPE’
+ Specify which threading strategy test, either ‘slice’ or ‘frame’,
+ by default ‘slice+frame’
+
+‘CPUFLAGS’
+ Specify CPU flags.
+
+‘TARGET_EXEC’
+ Specify or override the wrapper used to run the tests. The
+ ‘TARGET_EXEC’ option provides a way to run FATE wrapped in
+ ‘valgrind’, ‘qemu-user’ or ‘wine’ or on remote targets through
+ ‘ssh’.
+
+‘GEN’
+ Set to ‘1’ to generate the missing or mismatched references.
+
+‘HWACCEL’
+ Specify which hardware acceleration to use while running regression
+ tests, by default ‘none’ is used.
+
+‘KEEP’
+ Set to ‘1’ to keep temp files generated by fate test(s) when test
+ is successful. Default is ‘0’, which removes these files. Files
+ are always kept when a test fails.
+
+5.3 Examples
+============
+
+ make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
diff --git a/extern/ffmpeg/doc/fate.txt.d b/extern/ffmpeg/doc/fate.txt.d
new file mode 100644
index 0000000000..2b29e69cea
--- /dev/null
+++ b/extern/ffmpeg/doc/fate.txt.d
@@ -0,0 +1 @@
+doc/fate.txt: doc/fate_config.sh.template
diff --git a/extern/ffmpeg/doc/fate_config.sh.template b/extern/ffmpeg/doc/fate_config.sh.template
new file mode 100644
index 0000000000..ab1bda45e4
--- /dev/null
+++ b/extern/ffmpeg/doc/fate_config.sh.template
@@ -0,0 +1,33 @@
+slot= # some unique identifier
+repo=git://source.ffmpeg.org/ffmpeg.git # the source repository
+#branch=release/2.6 # the branch to test
+samples= # path to samples directory
+workdir= # directory in which to do all the work
+#fate_recv="ssh -T fate@fate.ffmpeg.org" # command to submit report
+comment= # optional description
+build_only= # set to "yes" for a compile-only instance that skips tests
+ignore_tests=
+
+# the following are optional and map to configure options
+arch=
+cpu=
+cross_prefix=
+as=
+cc=
+ld=
+target_os=
+sysroot=
+target_exec=
+target_path=
+target_samples=
+extra_cflags=
+extra_ldflags=
+extra_libs=
+extra_conf= # extra configure options not covered above
+
+#make= # name of GNU make if not 'make'
+makeopts= # extra options passed to 'make'
+#makeopts_fate= # extra options passed to 'make' when running tests,
+ # defaulting to makeopts above if this is not set
+#tar= # command to create a tar archive from its arguments on stdout,
+ # defaults to 'tar c'
diff --git a/extern/ffmpeg/doc/ffmpeg-all.1 b/extern/ffmpeg/doc/ffmpeg-all.1
new file mode 100644
index 0000000000..752cced029
--- /dev/null
+++ b/extern/ffmpeg/doc/ffmpeg-all.1
@@ -0,0 +1,50729 @@
+.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "FFMPEG-ALL 1"
+.TH FFMPEG-ALL 1 " " " " " "
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+ffmpeg \- ffmpeg video converter
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+ffmpeg [\fIglobal_options\fR] {[\fIinput_file_options\fR] \-i \fIinput_url\fR} ... {[\fIoutput_file_options\fR] \fIoutput_url\fR} ...
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBffmpeg\fR is a very fast video and audio converter that can also grab from
+a live audio/video source. It can also convert between arbitrary sample
+rates and resize video on the fly with a high quality polyphase filter.
+.PP
+\&\fBffmpeg\fR reads from an arbitrary number of input \*(L"files\*(R" (which can be regular
+files, pipes, network streams, grabbing devices, etc.), specified by the
+\&\f(CW\*(C`\-i\*(C'\fR option, and writes to an arbitrary number of output \*(L"files\*(R", which are
+specified by a plain output url. Anything found on the command line which
+cannot be interpreted as an option is considered to be an output url.
+.PP
+Each input or output url can, in principle, contain any number of streams of
+different types (video/audio/subtitle/attachment/data). The allowed number and/or
+types of streams may be limited by the container format. Selecting which
+streams from which inputs will go into which output is either done automatically
+or with the \f(CW\*(C`\-map\*(C'\fR option (see the Stream selection chapter).
+.PP
+To refer to input files in options, you must use their indices (0\-based). E.g.
+the first input file is \f(CW0\fR, the second is \f(CW1\fR, etc. Similarly, streams
+within a file are referred to by their indices. E.g. \f(CW\*(C`2:3\*(C'\fR refers to the
+fourth stream in the third input file. Also see the Stream specifiers chapter.
+.PP
+As a general rule, options are applied to the next specified
+file. Therefore, order is important, and you can have the same
+option on the command line multiple times. Each occurrence is
+then applied to the next input or output file.
+Exceptions from this rule are the global options (e.g. verbosity level),
+which should be specified first.
+.PP
+Do not mix input and output files \*(-- first specify all input files, then all
+output files. Also do not mix options which belong to different files. All
+options apply \s-1ONLY\s0 to the next input or output file and are reset between files.
+.IP "\(bu" 4
+To set the video bitrate of the output file to 64 kbit/s:
+.Sp
+.Vb 1
+\& ffmpeg \-i input.avi \-b:v 64k \-bufsize 64k output.avi
+.Ve
+.IP "\(bu" 4
+To force the frame rate of the output file to 24 fps:
+.Sp
+.Vb 1
+\& ffmpeg \-i input.avi \-r 24 output.avi
+.Ve
+.IP "\(bu" 4
+To force the frame rate of the input file (valid for raw formats only)
+to 1 fps and the frame rate of the output file to 24 fps:
+.Sp
+.Vb 1
+\& ffmpeg \-r 1 \-i input.m2v \-r 24 output.avi
+.Ve
+.PP
+The format option may be needed for raw input files.
+.SH "DETAILED DESCRIPTION"
+.IX Header "DETAILED DESCRIPTION"
+The transcoding process in \fBffmpeg\fR for each output can be described by
+the following diagram:
+.PP
+.Vb 10
+\& _\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_
+\& | | | |
+\& | input | demuxer | encoded data | decoder
+\& | file | \-\-\-\-\-\-\-\-\-> | packets | \-\-\-\-\-+
+\& |_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_| |
+\& v
+\& _\|_\|_\|_\|_\|_\|_\|_\|_
+\& | |
+\& | decoded |
+\& | frames |
+\& |_\|_\|_\|_\|_\|_\|_\|_\|_|
+\& _\|_\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_ |
+\& | | | | |
+\& | output | <\-\-\-\-\-\-\-\- | encoded data | <\-\-\-\-+
+\& | file | muxer | packets | encoder
+\& |_\|_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_|
+.Ve
+.PP
+\&\fBffmpeg\fR calls the libavformat library (containing demuxers) to read
+input files and get packets containing encoded data from them. When there are
+multiple input files, \fBffmpeg\fR tries to keep them synchronized by
+tracking lowest timestamp on any active input stream.
+.PP
+Encoded packets are then passed to the decoder (unless streamcopy is selected
+for the stream, see further for a description). The decoder produces
+uncompressed frames (raw video/PCM audio/...) which can be processed further by
+filtering (see next section). After filtering, the frames are passed to the
+encoder, which encodes them and outputs encoded packets. Finally those are
+passed to the muxer, which writes the encoded packets to the output file.
+.SS "Filtering"
+.IX Subsection "Filtering"
+Before encoding, \fBffmpeg\fR can process raw audio and video frames using
+filters from the libavfilter library. Several chained filters form a filter
+graph. \fBffmpeg\fR distinguishes between two types of filtergraphs:
+simple and complex.
+.PP
+\fISimple filtergraphs\fR
+.IX Subsection "Simple filtergraphs"
+.PP
+Simple filtergraphs are those that have exactly one input and output, both of
+the same type. In the above diagram they can be represented by simply inserting
+an additional step between decoding and encoding:
+.PP
+.Vb 10
+\& _\|_\|_\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_
+\& | | | |
+\& | decoded | | encoded data |
+\& | frames |\e _ | packets |
+\& |_\|_\|_\|_\|_\|_\|_\|_\|_| \e /||_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_|
+\& \e _\|_\|_\|_\|_\|_\|_\|_\|_\|_ /
+\& simple _\e|| | / encoder
+\& filtergraph | filtered |/
+\& | frames |
+\& |_\|_\|_\|_\|_\|_\|_\|_\|_\|_|
+.Ve
+.PP
+Simple filtergraphs are configured with the per-stream \fB\-filter\fR option
+(with \fB\-vf\fR and \fB\-af\fR aliases for video and audio respectively).
+A simple filtergraph for video can look for example like this:
+.PP
+.Vb 4
+\& _\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_
+\& | | | | | | | |
+\& | input | \-\-\-> | deinterlace | \-\-\-> | scale | \-\-\-> | output |
+\& |_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_|
+.Ve
+.PP
+Note that some filters change frame properties but not frame contents. E.g. the
+\&\f(CW\*(C`fps\*(C'\fR filter in the example above changes number of frames, but does not
+touch the frame contents. Another example is the \f(CW\*(C`setpts\*(C'\fR filter, which
+only sets timestamps and otherwise passes the frames unchanged.
+.PP
+\fIComplex filtergraphs\fR
+.IX Subsection "Complex filtergraphs"
+.PP
+Complex filtergraphs are those which cannot be described as simply a linear
+processing chain applied to one stream. This is the case, for example, when the graph has
+more than one input and/or output, or when output stream type is different from
+input. They can be represented with the following diagram:
+.PP
+.Vb 10
+\& _\|_\|_\|_\|_\|_\|_\|_\|_
+\& | |
+\& | input 0 |\e _\|_\|_\|_\|_\|_\|_\|_\|_\|_
+\& |_\|_\|_\|_\|_\|_\|_\|_\|_| \e | |
+\& \e _\|_\|_\|_\|_\|_\|_\|_\|_ /| output 0 |
+\& \e | | / |_\|_\|_\|_\|_\|_\|_\|_\|_\|_|
+\& _\|_\|_\|_\|_\|_\|_\|_\|_ \e| complex | /
+\& | | | |/
+\& | input 1 |\-\-\-\->| filter |\e
+\& |_\|_\|_\|_\|_\|_\|_\|_\|_| | | \e _\|_\|_\|_\|_\|_\|_\|_\|_\|_
+\& /| graph | \e | |
+\& / | | \e| output 1 |
+\& _\|_\|_\|_\|_\|_\|_\|_\|_ / |_\|_\|_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_\|_\|_|
+\& | | /
+\& | input 2 |/
+\& |_\|_\|_\|_\|_\|_\|_\|_\|_|
+.Ve
+.PP
+Complex filtergraphs are configured with the \fB\-filter_complex\fR option.
+Note that this option is global, since a complex filtergraph, by its nature,
+cannot be unambiguously associated with a single stream or file.
+.PP
+The \fB\-lavfi\fR option is equivalent to \fB\-filter_complex\fR.
+.PP
+A trivial example of a complex filtergraph is the \f(CW\*(C`overlay\*(C'\fR filter, which
+has two video inputs and one video output, containing one video overlaid on top
+of the other. Its audio counterpart is the \f(CW\*(C`amix\*(C'\fR filter.
+.SS "Stream copy"
+.IX Subsection "Stream copy"
+Stream copy is a mode selected by supplying the \f(CW\*(C`copy\*(C'\fR parameter to the
+\&\fB\-codec\fR option. It makes \fBffmpeg\fR omit the decoding and encoding
+step for the specified stream, so it does only demuxing and muxing. It is useful
+for changing the container format or modifying container-level metadata. The
+diagram above will, in this case, simplify to this:
+.PP
+.Vb 5
+\& _\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_ _\|_\|_\|_\|_\|_\|_\|_
+\& | | | | | |
+\& | input | demuxer | encoded data | muxer | output |
+\& | file | \-\-\-\-\-\-\-\-\-> | packets | \-\-\-\-\-\-\-> | file |
+\& |_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_| |_\|_\|_\|_\|_\|_\|_\|_|
+.Ve
+.PP
+Since there is no decoding or encoding, it is very fast and there is no quality
+loss. However, it might not work in some cases because of many factors. Applying
+filters is obviously also impossible, since filters work on uncompressed data.
+.SH "STREAM SELECTION"
+.IX Header "STREAM SELECTION"
+\&\fBffmpeg\fR provides the \f(CW\*(C`\-map\*(C'\fR option for manual control of stream selection in each
+output file. Users can skip \f(CW\*(C`\-map\*(C'\fR and let ffmpeg perform automatic stream selection as
+described below. The \f(CW\*(C`\-vn / \-an / \-sn / \-dn\*(C'\fR options can be used to skip inclusion of
+video, audio, subtitle and data streams respectively, whether manually mapped or automatically
+selected, except for those streams which are outputs of complex filtergraphs.
+.SS "Description"
+.IX Subsection "Description"
+The sub-sections that follow describe the various rules that are involved in stream selection.
+The examples that follow next show how these rules are applied in practice.
+.PP
+While every effort is made to accurately reflect the behavior of the program, FFmpeg is under
+continuous development and the code may have changed since the time of this writing.
+.PP
+\fIAutomatic stream selection\fR
+.IX Subsection "Automatic stream selection"
+.PP
+In the absence of any map options for a particular output file, ffmpeg inspects the output
+format to check which type of streams can be included in it, viz. video, audio and/or
+subtitles. For each acceptable stream type, ffmpeg will pick one stream, when available,
+from among all the inputs.
+.PP
+It will select that stream based upon the following criteria:
+.IP "\(bu" 4
+for video, it is the stream with the highest resolution,
+.IP "\(bu" 4
+for audio, it is the stream with the most channels,
+.IP "\(bu" 4
+for subtitles, it is the first subtitle stream found but there's a caveat.
+The output format's default subtitle encoder can be either text-based or image-based,
+and only a subtitle stream of the same type will be chosen.
+.PP
+In the case where several streams of the same type rate equally, the stream with the lowest
+index is chosen.
+.PP
+Data or attachment streams are not automatically selected and can only be included
+using \f(CW\*(C`\-map\*(C'\fR.
+.PP
+\fIManual stream selection\fR
+.IX Subsection "Manual stream selection"
+.PP
+When \f(CW\*(C`\-map\*(C'\fR is used, only user-mapped streams are included in that output file,
+with one possible exception for filtergraph outputs described below.
+.PP
+\fIComplex filtergraphs\fR
+.IX Subsection "Complex filtergraphs"
+.PP
+If there are any complex filtergraph output streams with unlabeled pads, they will be added
+to the first output file. This will lead to a fatal error if the stream type is not supported
+by the output format. In the absence of the map option, the inclusion of these streams leads
+to the automatic stream selection of their types being skipped. If map options are present,
+these filtergraph streams are included in addition to the mapped streams.
+.PP
+Complex filtergraph output streams with labeled pads must be mapped once and exactly once.
+.PP
+\fIStream handling\fR
+.IX Subsection "Stream handling"
+.PP
+Stream handling is independent of stream selection, with an exception for subtitles described
+below. Stream handling is set via the \f(CW\*(C`\-codec\*(C'\fR option addressed to streams within a
+specific \fIoutput\fR file. In particular, codec options are applied by ffmpeg after the
+stream selection process and thus do not influence the latter. If no \f(CW\*(C`\-codec\*(C'\fR option is
+specified for a stream type, ffmpeg will select the default encoder registered by the output
+file muxer.
+.PP
+An exception exists for subtitles. If a subtitle encoder is specified for an output file, the
+first subtitle stream found of any type, text or image, will be included. ffmpeg does not validate
+if the specified encoder can convert the selected stream or if the converted stream is acceptable
+within the output format. This applies generally as well: when the user sets an encoder manually,
+the stream selection process cannot check if the encoded stream can be muxed into the output file.
+If it cannot, ffmpeg will abort and \fIall\fR output files will fail to be processed.
+.SS "Examples"
+.IX Subsection "Examples"
+The following examples illustrate the behavior, quirks and limitations of ffmpeg's stream
+selection methods.
+.PP
+They assume the following three input files.
+.PP
+.Vb 3
+\& input file \*(AqA.avi\*(Aq
+\& stream 0: video 640x360
+\& stream 1: audio 2 channels
+\&
+\& input file \*(AqB.mp4\*(Aq
+\& stream 0: video 1920x1080
+\& stream 1: audio 2 channels
+\& stream 2: subtitles (text)
+\& stream 3: audio 5.1 channels
+\& stream 4: subtitles (text)
+\&
+\& input file \*(AqC.mkv\*(Aq
+\& stream 0: video 1280x720
+\& stream 1: audio 2 channels
+\& stream 2: subtitles (image)
+.Ve
+.PP
+Example: automatic stream selection
+.IX Subsection "Example: automatic stream selection"
+.PP
+.Vb 1
+\& ffmpeg \-i A.avi \-i B.mp4 out1.mkv out2.wav \-map 1:a \-c:a copy out3.mov
+.Ve
+.PP
+There are three output files specified, and for the first two, no \f(CW\*(C`\-map\*(C'\fR options
+are set, so ffmpeg will select streams for these two files automatically.
+.PP
+\&\fIout1.mkv\fR is a Matroska container file and accepts video, audio and subtitle streams,
+so ffmpeg will try to select one of each type.For video, it will select \f(CW\*(C`stream 0\*(C'\fR from \fIB.mp4\fR, which has the highest
+resolution among all the input video streams.For audio, it will select \f(CW\*(C`stream 3\*(C'\fR from \fIB.mp4\fR, since it has the greatest
+number of channels.For subtitles, it will select \f(CW\*(C`stream 2\*(C'\fR from \fIB.mp4\fR, which is the first subtitle
+stream from among \fIA.avi\fR and \fIB.mp4\fR.
+.PP
+\&\fIout2.wav\fR accepts only audio streams, so only \f(CW\*(C`stream 3\*(C'\fR from \fIB.mp4\fR is
+selected.
+.PP
+For \fIout3.mov\fR, since a \f(CW\*(C`\-map\*(C'\fR option is set, no automatic stream selection will
+occur. The \f(CW\*(C`\-map 1:a\*(C'\fR option will select all audio streams from the second input
+\&\fIB.mp4\fR. No other streams will be included in this output file.
+.PP
+For the first two outputs, all included streams will be transcoded. The encoders chosen will
+be the default ones registered by each output format, which may not match the codec of the
+selected input streams.
+.PP
+For the third output, codec option for audio streams has been set
+to \f(CW\*(C`copy\*(C'\fR, so no decoding-filtering-encoding operations will occur, or \fIcan\fR occur.
+Packets of selected streams shall be conveyed from the input file and muxed within the output
+file.
+.PP
+Example: automatic subtitles selection
+.IX Subsection "Example: automatic subtitles selection"
+.PP
+.Vb 1
+\& ffmpeg \-i C.mkv out1.mkv \-c:s dvdsub \-an out2.mkv
+.Ve
+.PP
+Although \fIout1.mkv\fR is a Matroska container file which accepts subtitle streams, only a
+video and audio stream shall be selected. The subtitle stream of \fIC.mkv\fR is image-based
+and the default subtitle encoder of the Matroska muxer is text-based, so a transcode operation
+for the subtitles is expected to fail and hence the stream isn't selected. However, in
+\&\fIout2.mkv\fR, a subtitle encoder is specified in the command and so, the subtitle stream is
+selected, in addition to the video stream. The presence of \f(CW\*(C`\-an\*(C'\fR disables audio stream
+selection for \fIout2.mkv\fR.
+.PP
+Example: unlabeled filtergraph outputs
+.IX Subsection "Example: unlabeled filtergraph outputs"
+.PP
+.Vb 1
+\& ffmpeg \-i A.avi \-i C.mkv \-i B.mp4 \-filter_complex "overlay" out1.mp4 out2.srt
+.Ve
+.PP
+A filtergraph is setup here using the \f(CW\*(C`\-filter_complex\*(C'\fR option and consists of a single
+video filter. The \f(CW\*(C`overlay\*(C'\fR filter requires exactly two video inputs, but none are
+specified, so the first two available video streams are used, those of \fIA.avi\fR and
+\&\fIC.mkv\fR. The output pad of the filter has no label and so is sent to the first output file
+\&\fIout1.mp4\fR. Due to this, automatic selection of the video stream is skipped, which would
+have selected the stream in \fIB.mp4\fR. The audio stream with most channels viz. \f(CW\*(C`stream 3\*(C'\fR
+in \fIB.mp4\fR, is chosen automatically. No subtitle stream is chosen however, since the \s-1MP4\s0
+format has no default subtitle encoder registered, and the user hasn't specified a subtitle encoder.
+.PP
+The 2nd output file, \fIout2.srt\fR, only accepts text-based subtitle streams. So, even though
+the first subtitle stream available belongs to \fIC.mkv\fR, it is image-based and hence skipped.
+The selected stream, \f(CW\*(C`stream 2\*(C'\fR in \fIB.mp4\fR, is the first text-based subtitle stream.
+.PP
+Example: labeled filtergraph outputs
+.IX Subsection "Example: labeled filtergraph outputs"
+.PP
+.Vb 4
+\& ffmpeg \-i A.avi \-i B.mp4 \-i C.mkv \-filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \e
+\& \-map \*(Aq[outv]\*(Aq \-an out1.mp4 \e
+\& out2.mkv \e
+\& \-map \*(Aq[outv]\*(Aq \-map 1:a:0 out3.mkv
+.Ve
+.PP
+The above command will fail, as the output pad labelled \f(CW\*(C`[outv]\*(C'\fR has been mapped twice.
+None of the output files shall be processed.
+.PP
+.Vb 4
+\& ffmpeg \-i A.avi \-i B.mp4 \-i C.mkv \-filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \e
+\& \-an out1.mp4 \e
+\& out2.mkv \e
+\& \-map 1:a:0 out3.mkv
+.Ve
+.PP
+This command above will also fail as the hue filter output has a label, \f(CW\*(C`[outv]\*(C'\fR,
+and hasn't been mapped anywhere.
+.PP
+The command should be modified as follows,
+.PP
+.Vb 4
+\& ffmpeg \-i A.avi \-i B.mp4 \-i C.mkv \-filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \e
+\& \-map \*(Aq[outv1]\*(Aq \-an out1.mp4 \e
+\& out2.mkv \e
+\& \-map \*(Aq[outv2]\*(Aq \-map 1:a:0 out3.mkv
+.Ve
+.PP
+The video stream from \fIB.mp4\fR is sent to the hue filter, whose output is cloned once using
+the split filter, and both outputs labelled. Then a copy each is mapped to the first and third
+output files.
+.PP
+The overlay filter, requiring two video inputs, uses the first two unused video streams. Those
+are the streams from \fIA.avi\fR and \fIC.mkv\fR. The overlay output isn't labelled, so it is
+sent to the first output file \fIout1.mp4\fR, regardless of the presence of the \f(CW\*(C`\-map\*(C'\fR option.
+.PP
+The aresample filter is sent the first unused audio stream, that of \fIA.avi\fR. Since this filter
+output is also unlabelled, it too is mapped to the first output file. The presence of \f(CW\*(C`\-an\*(C'\fR
+only suppresses automatic or manual stream selection of audio streams, not outputs sent from
+filtergraphs. Both these mapped streams shall be ordered before the mapped stream in \fIout1.mp4\fR.
+.PP
+The video, audio and subtitle streams mapped to \f(CW\*(C`out2.mkv\*(C'\fR are entirely determined by
+automatic stream selection.
+.PP
+\&\fIout3.mkv\fR consists of the cloned video output from the hue filter and the first audio
+stream from \fIB.mp4\fR.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+All the numerical options, if not specified otherwise, accept a string
+representing a number as input, which may be followed by one of the \s-1SI\s0
+unit prefixes, for example: 'K', 'M', or 'G'.
+.PP
+If 'i' is appended to the \s-1SI\s0 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 \s-1SI\s0 unit
+prefix multiplies the value by 8. This allows using, for example:
+\&'\s-1KB\s0', 'MiB', 'G' and 'B' as number suffixes.
+.PP
+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 \*(L"no\*(R". For example using \*(L"\-nofoo\*(R"
+will set the boolean option with name \*(L"foo\*(R" to false.
+.SS "Stream specifiers"
+.IX Subsection "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.
+.PP
+A stream specifier is a string generally appended to the option name and
+separated from it by a colon. E.g. \f(CW\*(C`\-codec:a:1 ac3\*(C'\fR contains the
+\&\f(CW\*(C`a:1\*(C'\fR stream specifier, which matches the second audio stream. Therefore, it
+would select the ac3 codec for the second audio stream.
+.PP
+A stream specifier can match several streams, so that the option is applied to all
+of them. E.g. the stream specifier in \f(CW\*(C`\-b:a 128k\*(C'\fR matches all audio
+streams.
+.PP
+An empty stream specifier matches all streams. For example, \f(CW\*(C`\-codec copy\*(C'\fR
+or \f(CW\*(C`\-codec: copy\*(C'\fR would copy all the streams without reencoding.
+.PP
+Possible forms of stream specifiers are:
+.IP "\fIstream_index\fR" 4
+.IX Item "stream_index"
+Matches the stream with this index. E.g. \f(CW\*(C`\-threads:1 4\*(C'\fR would set the
+thread count for the second stream to 4. If \fIstream_index\fR is used as an
+additional stream specifier (see below), then it selects stream number
+\&\fIstream_index\fR from the matching streams. Stream numbering is based on the
+order of the streams as detected by libavformat except when a program \s-1ID\s0 is
+also specified. In this case it is based on the ordering of the streams in the
+program.
+.IP "\fIstream_type\fR\fB[:\fR\fIadditional_stream_specifier\fR\fB]\fR" 4
+.IX Item "stream_type[:additional_stream_specifier]"
+\&\fIstream_type\fR is one of following: 'v' or 'V' for video, 'a' for audio, 's'
+for subtitle, 'd' for data, and 't' for attachments. 'v' matches all video
+streams, 'V' only matches video streams which are not attached pictures, video
+thumbnails or cover arts. If \fIadditional_stream_specifier\fR is used, then
+it matches streams which both have this type and match the
+\&\fIadditional_stream_specifier\fR. Otherwise, it matches all streams of the
+specified type.
+.IP "\fBp:\fR\fIprogram_id\fR\fB[:\fR\fIadditional_stream_specifier\fR\fB]\fR" 4
+.IX Item "p:program_id[:additional_stream_specifier]"
+Matches streams which are in the program with the id \fIprogram_id\fR. If
+\&\fIadditional_stream_specifier\fR is used, then it matches streams which both
+are part of the program and match the \fIadditional_stream_specifier\fR.
+.IP "\fB#\fR\fIstream_id\fR \fBor i:\fR\fIstream_id\fR" 4
+.IX Item "#stream_id or i:stream_id"
+Match the stream by stream id (e.g. \s-1PID\s0 in MPEG-TS container).
+.IP "\fBm:\fR\fIkey\fR\fB[:\fR\fIvalue\fR\fB]\fR" 4
+.IX Item "m:key[:value]"
+Matches streams with the metadata tag \fIkey\fR having the specified value. If
+\&\fIvalue\fR is not given, matches streams that contain the given tag with any
+value.
+.IP "\fBu\fR" 4
+.IX 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.
+.Sp
+Note that in \fBffmpeg\fR, matching by metadata will only work properly for
+input files.
+.SS "Generic options"
+.IX Subsection "Generic options"
+These options are shared amongst the ff* tools.
+.IP "\fB\-L\fR" 4
+.IX Item "-L"
+Show license.
+.IP "\fB\-h, \-?, \-help, \-\-help [\fR\fIarg\fR\fB]\fR" 4
+.IX Item "-h, -?, -help, --help [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.
+.Sp
+Possible values of \fIarg\fR are:
+.RS 4
+.IP "\fBlong\fR" 4
+.IX Item "long"
+Print advanced tool options in addition to the basic tool options.
+.IP "\fBfull\fR" 4
+.IX Item "full"
+Print complete list of options, including shared and private options
+for encoders, decoders, demuxers, muxers, filters, etc.
+.IP "\fBdecoder=\fR\fIdecoder_name\fR" 4
+.IX Item "decoder=decoder_name"
+Print detailed information about the decoder named \fIdecoder_name\fR. Use the
+\&\fB\-decoders\fR option to get a list of all decoders.
+.IP "\fBencoder=\fR\fIencoder_name\fR" 4
+.IX Item "encoder=encoder_name"
+Print detailed information about the encoder named \fIencoder_name\fR. Use the
+\&\fB\-encoders\fR option to get a list of all encoders.
+.IP "\fBdemuxer=\fR\fIdemuxer_name\fR" 4
+.IX Item "demuxer=demuxer_name"
+Print detailed information about the demuxer named \fIdemuxer_name\fR. Use the
+\&\fB\-formats\fR option to get a list of all demuxers and muxers.
+.IP "\fBmuxer=\fR\fImuxer_name\fR" 4
+.IX Item "muxer=muxer_name"
+Print detailed information about the muxer named \fImuxer_name\fR. Use the
+\&\fB\-formats\fR option to get a list of all muxers and demuxers.
+.IP "\fBfilter=\fR\fIfilter_name\fR" 4
+.IX Item "filter=filter_name"
+Print detailed information about the filter named \fIfilter_name\fR. Use the
+\&\fB\-filters\fR option to get a list of all filters.
+.IP "\fBbsf=\fR\fIbitstream_filter_name\fR" 4
+.IX Item "bsf=bitstream_filter_name"
+Print detailed information about the bitstream filter named \fIbitstream_filter_name\fR.
+Use the \fB\-bsfs\fR option to get a list of all bitstream filters.
+.IP "\fBprotocol=\fR\fIprotocol_name\fR" 4
+.IX Item "protocol=protocol_name"
+Print detailed information about the protocol named \fIprotocol_name\fR.
+Use the \fB\-protocols\fR option to get a list of all protocols.
+.RE
+.RS 4
+.RE
+.IP "\fB\-version\fR" 4
+.IX Item "-version"
+Show version.
+.IP "\fB\-buildconf\fR" 4
+.IX Item "-buildconf"
+Show the build configuration, one option per line.
+.IP "\fB\-formats\fR" 4
+.IX Item "-formats"
+Show available formats (including devices).
+.IP "\fB\-demuxers\fR" 4
+.IX Item "-demuxers"
+Show available demuxers.
+.IP "\fB\-muxers\fR" 4
+.IX Item "-muxers"
+Show available muxers.
+.IP "\fB\-devices\fR" 4
+.IX Item "-devices"
+Show available devices.
+.IP "\fB\-codecs\fR" 4
+.IX Item "-codecs"
+Show all codecs known to libavcodec.
+.Sp
+Note that the term 'codec' is used throughout this documentation as a shortcut
+for what is more correctly called a media bitstream format.
+.IP "\fB\-decoders\fR" 4
+.IX Item "-decoders"
+Show available decoders.
+.IP "\fB\-encoders\fR" 4
+.IX Item "-encoders"
+Show all available encoders.
+.IP "\fB\-bsfs\fR" 4
+.IX Item "-bsfs"
+Show available bitstream filters.
+.IP "\fB\-protocols\fR" 4
+.IX Item "-protocols"
+Show available protocols.
+.IP "\fB\-filters\fR" 4
+.IX Item "-filters"
+Show available libavfilter filters.
+.IP "\fB\-pix_fmts\fR" 4
+.IX Item "-pix_fmts"
+Show available pixel formats.
+.IP "\fB\-sample_fmts\fR" 4
+.IX Item "-sample_fmts"
+Show available sample formats.
+.IP "\fB\-layouts\fR" 4
+.IX Item "-layouts"
+Show channel names and standard channel layouts.
+.IP "\fB\-colors\fR" 4
+.IX Item "-colors"
+Show recognized color names.
+.IP "\fB\-sources\fR \fIdevice\fR\fB[,\fR\fIopt1\fR\fB=\fR\fIval1\fR\fB[,\fR\fIopt2\fR\fB=\fR\fIval2\fR\fB]...]\fR" 4
+.IX Item "-sources device[,opt1=val1[,opt2=val2]...]"
+Show autodetected sources of the input device.
+Some devices may provide system-dependent source names that cannot be autodetected.
+The returned list cannot be assumed to be always complete.
+.Sp
+.Vb 1
+\& ffmpeg \-sources pulse,server=192.168.0.4
+.Ve
+.IP "\fB\-sinks\fR \fIdevice\fR\fB[,\fR\fIopt1\fR\fB=\fR\fIval1\fR\fB[,\fR\fIopt2\fR\fB=\fR\fIval2\fR\fB]...]\fR" 4
+.IX Item "-sinks device[,opt1=val1[,opt2=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.
+.Sp
+.Vb 1
+\& ffmpeg \-sinks pulse,server=192.168.0.4
+.Ve
+.IP "\fB\-loglevel [\fR\fIflags\fR\fB+]\fR\fIloglevel\fR \fB| \-v [\fR\fIflags\fR\fB+]\fR\fIloglevel\fR" 4
+.IX Item "-loglevel [flags+]loglevel | -v [flags+]loglevel"
+Set logging level and flags used by the library.
+.Sp
+The optional \fIflags\fR prefix can consist of the following values:
+.RS 4
+.IP "\fBrepeat\fR" 4
+.IX Item "repeat"
+Indicates that repeated log output should not be compressed to the first line
+and the \*(L"Last message repeated n times\*(R" line will be omitted.
+.IP "\fBlevel\fR" 4
+.IX Item "level"
+Indicates that log output should add a \f(CW\*(C`[level]\*(C'\fR prefix to each message
+line. This can be used as an alternative to log coloring, e.g. when dumping the
+log to file.
+.RE
+.RS 4
+.Sp
+Flags can also be used alone by adding a '+'/'\-' prefix to set/reset a single
+flag without affecting other \fIflags\fR or changing \fIloglevel\fR. When
+setting both \fIflags\fR and \fIloglevel\fR, a '+' separator is expected
+between the last \fIflags\fR value and before \fIloglevel\fR.
+.Sp
+\&\fIloglevel\fR is a string or a number containing one of the following values:
+.IP "\fBquiet, \-8\fR" 4
+.IX Item "quiet, -8"
+Show nothing at all; be silent.
+.IP "\fBpanic, 0\fR" 4
+.IX Item "panic, 0"
+Only show fatal errors which could lead the process to crash, such as
+an assertion failure. This is not currently used for anything.
+.IP "\fBfatal, 8\fR" 4
+.IX Item "fatal, 8"
+Only show fatal errors. These are errors after which the process absolutely
+cannot continue.
+.IP "\fBerror, 16\fR" 4
+.IX Item "error, 16"
+Show all errors, including ones which can be recovered from.
+.IP "\fBwarning, 24\fR" 4
+.IX Item "warning, 24"
+Show all warnings and errors. Any message related to possibly
+incorrect or unexpected events will be shown.
+.IP "\fBinfo, 32\fR" 4
+.IX Item "info, 32"
+Show informative messages during processing. This is in addition to
+warnings and errors. This is the default value.
+.IP "\fBverbose, 40\fR" 4
+.IX Item "verbose, 40"
+Same as \f(CW\*(C`info\*(C'\fR, except more verbose.
+.IP "\fBdebug, 48\fR" 4
+.IX Item "debug, 48"
+Show everything, including debugging information.
+.IP "\fBtrace, 56\fR" 4
+.IX Item "trace, 56"
+.RE
+.RS 4
+.Sp
+For example to enable repeated log output, add the \f(CW\*(C`level\*(C'\fR prefix, and set
+\&\fIloglevel\fR to \f(CW\*(C`verbose\*(C'\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-loglevel repeat+level+verbose \-i input output
+.Ve
+.Sp
+Another example that enables repeated log output without affecting current
+state of \f(CW\*(C`level\*(C'\fR prefix flag or \fIloglevel\fR:
+.Sp
+.Vb 1
+\& ffmpeg [...] \-loglevel +repeat
+.Ve
+.Sp
+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
+\&\fB\s-1AV_LOG_FORCE_NOCOLOR\s0\fR, or can be forced setting
+the environment variable \fB\s-1AV_LOG_FORCE_COLOR\s0\fR.
+.RE
+.IP "\fB\-report\fR" 4
+.IX Item "-report"
+Dump full command line and log output to a file named
+\&\f(CW\*(C`\f(CIprogram\f(CW\-\f(CIYYYYMMDD\f(CW\-\f(CIHHMMSS\f(CW.log\*(C'\fR in the current
+directory.
+This file can be useful for bug reports.
+It also implies \f(CW\*(C`\-loglevel debug\*(C'\fR.
+.Sp
+Setting the environment variable \fB\s-1FFREPORT\s0\fR 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).
+.Sp
+The following options are recognized:
+.RS 4
+.IP "\fBfile\fR" 4
+.IX Item "file"
+set the file name to use for the report; \f(CW%p\fR is expanded to the name
+of the program, \f(CW%t\fR is expanded to a timestamp, \f(CW\*(C`%%\*(C'\fR is expanded
+to a plain \f(CW\*(C`%\*(C'\fR
+.IP "\fBlevel\fR" 4
+.IX Item "level"
+set the log verbosity level using a numerical value (see \f(CW\*(C`\-loglevel\*(C'\fR).
+.RE
+.RS 4
+.Sp
+For example, to output a report to a file named \fIffreport.log\fR
+using a log level of \f(CW32\fR (alias for log level \f(CW\*(C`info\*(C'\fR):
+.Sp
+.Vb 1
+\& FFREPORT=file=ffreport.log:level=32 ffmpeg \-i input output
+.Ve
+.Sp
+Errors in parsing the environment variable are not fatal, and will not
+appear in the report.
+.RE
+.IP "\fB\-hide_banner\fR" 4
+.IX Item "-hide_banner"
+Suppress printing banner.
+.Sp
+All FFmpeg tools will normally show a copyright notice, build options
+and library versions. This option can be used to suppress printing
+this information.
+.IP "\fB\-cpuflags flags (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-cpuflags flags (global)"
+Allows setting and clearing cpu flags. This option is intended
+for testing. Do not use it unless you know what you're doing.
+.Sp
+.Vb 3
+\& ffmpeg \-cpuflags \-sse+mmx ...
+\& ffmpeg \-cpuflags mmx ...
+\& ffmpeg \-cpuflags 0 ...
+.Ve
+.Sp
+Possible flags for this option are:
+.RS 4
+.IP "\fBx86\fR" 4
+.IX Item "x86"
+.RS 4
+.PD 0
+.IP "\fBmmx\fR" 4
+.IX Item "mmx"
+.IP "\fBmmxext\fR" 4
+.IX Item "mmxext"
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+.IP "\fBsse2\fR" 4
+.IX Item "sse2"
+.IP "\fBsse2slow\fR" 4
+.IX Item "sse2slow"
+.IP "\fBsse3\fR" 4
+.IX Item "sse3"
+.IP "\fBsse3slow\fR" 4
+.IX Item "sse3slow"
+.IP "\fBssse3\fR" 4
+.IX Item "ssse3"
+.IP "\fBatom\fR" 4
+.IX Item "atom"
+.IP "\fBsse4.1\fR" 4
+.IX Item "sse4.1"
+.IP "\fBsse4.2\fR" 4
+.IX Item "sse4.2"
+.IP "\fBavx\fR" 4
+.IX Item "avx"
+.IP "\fBavx2\fR" 4
+.IX Item "avx2"
+.IP "\fBxop\fR" 4
+.IX Item "xop"
+.IP "\fBfma3\fR" 4
+.IX Item "fma3"
+.IP "\fBfma4\fR" 4
+.IX Item "fma4"
+.IP "\fB3dnow\fR" 4
+.IX Item "3dnow"
+.IP "\fB3dnowext\fR" 4
+.IX Item "3dnowext"
+.IP "\fBbmi1\fR" 4
+.IX Item "bmi1"
+.IP "\fBbmi2\fR" 4
+.IX Item "bmi2"
+.IP "\fBcmov\fR" 4
+.IX Item "cmov"
+.RE
+.RS 4
+.RE
+.IP "\fB\s-1ARM\s0\fR" 4
+.IX Item "ARM"
+.RS 4
+.IP "\fBarmv5te\fR" 4
+.IX Item "armv5te"
+.IP "\fBarmv6\fR" 4
+.IX Item "armv6"
+.IP "\fBarmv6t2\fR" 4
+.IX Item "armv6t2"
+.IP "\fBvfp\fR" 4
+.IX Item "vfp"
+.IP "\fBvfpv3\fR" 4
+.IX Item "vfpv3"
+.IP "\fBneon\fR" 4
+.IX Item "neon"
+.IP "\fBsetend\fR" 4
+.IX Item "setend"
+.RE
+.RS 4
+.RE
+.IP "\fBAArch64\fR" 4
+.IX Item "AArch64"
+.RS 4
+.IP "\fBarmv8\fR" 4
+.IX Item "armv8"
+.IP "\fBvfp\fR" 4
+.IX Item "vfp"
+.IP "\fBneon\fR" 4
+.IX Item "neon"
+.RE
+.RS 4
+.RE
+.IP "\fBPowerPC\fR" 4
+.IX Item "PowerPC"
+.RS 4
+.IP "\fBaltivec\fR" 4
+.IX Item "altivec"
+.RE
+.RS 4
+.RE
+.IP "\fBSpecific Processors\fR" 4
+.IX Item "Specific Processors"
+.RS 4
+.IP "\fBpentium2\fR" 4
+.IX Item "pentium2"
+.IP "\fBpentium3\fR" 4
+.IX Item "pentium3"
+.IP "\fBpentium4\fR" 4
+.IX Item "pentium4"
+.IP "\fBk6\fR" 4
+.IX Item "k6"
+.IP "\fBk62\fR" 4
+.IX Item "k62"
+.IP "\fBathlon\fR" 4
+.IX Item "athlon"
+.IP "\fBathlonxp\fR" 4
+.IX Item "athlonxp"
+.IP "\fBk8\fR" 4
+.IX Item "k8"
+.RE
+.RS 4
+.RE
+.RE
+.RS 4
+.RE
+.IP "\fB\-max_alloc\fR \fIbytes\fR" 4
+.IX Item "-max_alloc bytes"
+.PD
+Set the maximum size limit for allocating a block on the heap by ffmpeg's
+family of malloc functions. Exercise \fBextreme caution\fR when using
+this option. Don't use if you do not understand the full consequence of doing so.
+Default is \s-1INT_MAX.\s0
+.SS "AVOptions"
+.IX Subsection "AVOptions"
+These options are provided directly by the libavformat, libavdevice and
+libavcodec libraries. To see the list of available AVOptions, use the
+\&\fB\-help\fR option. They are separated into two categories:
+.IP "\fBgeneric\fR" 4
+.IX 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.
+.IP "\fBprivate\fR" 4
+.IX Item "private"
+These options are specific to the given container, device or codec. Private
+options are listed under their corresponding containers/devices/codecs.
+.PP
+For example to write an ID3v2.3 header instead of a default ID3v2.4 to
+an \s-1MP3\s0 file, use the \fBid3v2_version\fR private option of the \s-1MP3\s0
+muxer:
+.PP
+.Vb 1
+\& ffmpeg \-i input.flac \-id3v2_version 3 out.mp3
+.Ve
+.PP
+All codec AVOptions are per-stream, and thus a stream specifier
+should be attached to them:
+.PP
+.Vb 1
+\& ffmpeg \-i multichannel.mxf \-map 0:v:0 \-map 0:a:0 \-map 0:a:0 \-c:a:0 ac3 \-b:a:0 640k \-ac:a:1 2 \-c:a:1 aac \-b:2 128k out.mp4
+.Ve
+.PP
+In the above example, a multichannel audio stream is mapped twice for output.
+The first instance is encoded with codec ac3 and bitrate 640k.
+The second instance is downmixed to 2 channels and encoded with codec aac. A bitrate of 128k is specified for it using
+absolute index of the output stream.
+.PP
+Note: the \fB\-nooption\fR syntax cannot be used for boolean
+AVOptions, use \fB\-option 0\fR/\fB\-option 1\fR.
+.PP
+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.
+.SS "Main options"
+.IX Subsection "Main options"
+.IP "\fB\-f\fR \fIfmt\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-f fmt (input/output)"
+Force input or output file format. The format is normally auto detected for input
+files and guessed from the file extension for output files, so this option is not
+needed in most cases.
+.IP "\fB\-i\fR \fIurl\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-i url (input)"
+input file url
+.IP "\fB\-y (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-y (global)"
+Overwrite output files without asking.
+.IP "\fB\-n (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-n (global)"
+Do not overwrite output files, and exit immediately if a specified
+output file already exists.
+.IP "\fB\-stream_loop\fR \fInumber\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-stream_loop number (input)"
+Set number of times input stream shall be looped. Loop 0 means no loop,
+loop \-1 means infinite loop.
+.IP "\fB\-c[:\fR\fIstream_specifier\fR\fB]\fR \fIcodec\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-c[:stream_specifier] codec (input/output,per-stream)"
+.PD 0
+.IP "\fB\-codec[:\fR\fIstream_specifier\fR\fB]\fR \fIcodec\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-codec[:stream_specifier] codec (input/output,per-stream)"
+.PD
+Select an encoder (when used before an output file) or a decoder (when used
+before an input file) for one or more streams. \fIcodec\fR is the name of a
+decoder/encoder or a special value \f(CW\*(C`copy\*(C'\fR (output only) to indicate that
+the stream is not to be re-encoded.
+.Sp
+For example
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0 \-c:v libx264 \-c:a copy OUTPUT
+.Ve
+.Sp
+encodes all video streams with libx264 and copies all audio streams.
+.Sp
+For each stream, the last matching \f(CW\*(C`c\*(C'\fR option is applied, so
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0 \-c copy \-c:v:1 libx264 \-c:a:137 libvorbis OUTPUT
+.Ve
+.Sp
+will copy all the streams except the second video, which will be encoded with
+libx264, and the 138th audio, which will be encoded with libvorbis.
+.IP "\fB\-t\fR \fIduration\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-t duration (input/output)"
+When used as an input option (before \f(CW\*(C`\-i\*(C'\fR), limit the \fIduration\fR of
+data read from the input file.
+.Sp
+When used as an output option (before an output url), stop writing the
+output after its duration reaches \fIduration\fR.
+.Sp
+\&\fIduration\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.Sp
+\&\-to and \-t are mutually exclusive and \-t has priority.
+.IP "\fB\-to\fR \fIposition\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-to position (input/output)"
+Stop writing the output or reading the input at \fIposition\fR.
+\&\fIposition\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.Sp
+\&\-to and \-t are mutually exclusive and \-t has priority.
+.IP "\fB\-fs\fR \fIlimit_size\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-fs limit_size (output)"
+Set the file size limit, expressed in bytes. No further chunk of bytes is written
+after the limit is exceeded. The size of the output file is slightly more than the
+requested file size.
+.IP "\fB\-ss\fR \fIposition\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-ss position (input/output)"
+When used as an input option (before \f(CW\*(C`\-i\*(C'\fR), seeks in this input file to
+\&\fIposition\fR. Note that in most formats it is not possible to seek exactly,
+so \fBffmpeg\fR will seek to the closest seek point before \fIposition\fR.
+When transcoding and \fB\-accurate_seek\fR is enabled (the default), this
+extra segment between the seek point and \fIposition\fR will be decoded and
+discarded. When doing stream copy or when \fB\-noaccurate_seek\fR is used, it
+will be preserved.
+.Sp
+When used as an output option (before an output url), decodes but discards
+input until the timestamps reach \fIposition\fR.
+.Sp
+\&\fIposition\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.IP "\fB\-sseof\fR \fIposition\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-sseof position (input)"
+Like the \f(CW\*(C`\-ss\*(C'\fR option but relative to the \*(L"end of file\*(R". That is negative
+values are earlier in the file, 0 is at \s-1EOF.\s0
+.IP "\fB\-itsoffset\fR \fIoffset\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-itsoffset offset (input)"
+Set the input time offset.
+.Sp
+\&\fIoffset\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.Sp
+The offset is added to the timestamps of the input files. Specifying
+a positive offset means that the corresponding streams are delayed by
+the time duration specified in \fIoffset\fR.
+.IP "\fB\-itsscale\fR \fIscale\fR \fB(\fR\fIinput,per\-stream\fR\fB)\fR" 4
+.IX Item "-itsscale scale (input,per-stream)"
+Rescale input timestamps. \fIscale\fR should be a floating point number.
+.IP "\fB\-timestamp\fR \fIdate\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-timestamp date (output)"
+Set the recording timestamp in the container.
+.Sp
+\&\fIdate\fR must be a date specification,
+see \fBthe Date section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.IP "\fB\-metadata[:metadata_specifier]\fR \fIkey\fR\fB=\fR\fIvalue\fR \fB(\fR\fIoutput,per\-metadata\fR\fB)\fR" 4
+.IX Item "-metadata[:metadata_specifier] key=value (output,per-metadata)"
+Set a metadata key/value pair.
+.Sp
+An optional \fImetadata_specifier\fR may be given to set metadata
+on streams, chapters or programs. See \f(CW\*(C`\-map_metadata\*(C'\fR
+documentation for details.
+.Sp
+This option overrides metadata set with \f(CW\*(C`\-map_metadata\*(C'\fR. It is
+also possible to delete metadata by using an empty value.
+.Sp
+For example, for setting the title in the output file:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.avi \-metadata title="my title" out.flv
+.Ve
+.Sp
+To set the language of the first audio stream:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-metadata:s:a:0 language=eng OUTPUT
+.Ve
+.IP "\fB\-disposition[:stream_specifier]\fR \fIvalue\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-disposition[:stream_specifier] value (output,per-stream)"
+Sets the disposition for a stream.
+.Sp
+This option overrides the disposition copied from the input stream. It is also
+possible to delete the disposition by setting it to 0.
+.Sp
+The following dispositions are recognized:
+.RS 4
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+.PD 0
+.IP "\fBdub\fR" 4
+.IX Item "dub"
+.IP "\fBoriginal\fR" 4
+.IX Item "original"
+.IP "\fBcomment\fR" 4
+.IX Item "comment"
+.IP "\fBlyrics\fR" 4
+.IX Item "lyrics"
+.IP "\fBkaraoke\fR" 4
+.IX Item "karaoke"
+.IP "\fBforced\fR" 4
+.IX Item "forced"
+.IP "\fBhearing_impaired\fR" 4
+.IX Item "hearing_impaired"
+.IP "\fBvisual_impaired\fR" 4
+.IX Item "visual_impaired"
+.IP "\fBclean_effects\fR" 4
+.IX Item "clean_effects"
+.IP "\fBattached_pic\fR" 4
+.IX Item "attached_pic"
+.IP "\fBcaptions\fR" 4
+.IX Item "captions"
+.IP "\fBdescriptions\fR" 4
+.IX Item "descriptions"
+.IP "\fBdependent\fR" 4
+.IX Item "dependent"
+.IP "\fBmetadata\fR" 4
+.IX Item "metadata"
+.RE
+.RS 4
+.PD
+.Sp
+For example, to make the second audio stream the default stream:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-c copy \-disposition:a:1 default out.mkv
+.Ve
+.Sp
+To make the second subtitle stream the default stream and remove the default
+disposition from the first subtitle stream:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-c copy \-disposition:s:0 0 \-disposition:s:1 default out.mkv
+.Ve
+.Sp
+To add an embedded cover/thumbnail:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mp4 \-i IMAGE \-map 0 \-map 1 \-c copy \-c:v:1 png \-disposition:v:1 attached_pic out.mp4
+.Ve
+.Sp
+Not all muxers support embedded thumbnails, and those who do, only support a few formats, like \s-1JPEG\s0 or \s-1PNG.\s0
+.RE
+.IP "\fB\-program [title=\fR\fItitle\fR\fB:][program_num=\fR\fIprogram_num\fR\fB:]st=\fR\fIstream\fR\fB[:st=\fR\fIstream\fR\fB...] (\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)"
+Creates a program with the specified \fItitle\fR, \fIprogram_num\fR and adds the specified
+\&\fIstream\fR(s) to it.
+.IP "\fB\-target\fR \fItype\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-target type (output)"
+Specify target file type (\f(CW\*(C`vcd\*(C'\fR, \f(CW\*(C`svcd\*(C'\fR, \f(CW\*(C`dvd\*(C'\fR, \f(CW\*(C`dv\*(C'\fR,
+\&\f(CW\*(C`dv50\*(C'\fR). \fItype\fR may be prefixed with \f(CW\*(C`pal\-\*(C'\fR, \f(CW\*(C`ntsc\-\*(C'\fR or
+\&\f(CW\*(C`film\-\*(C'\fR to use the corresponding standard. All the format options
+(bitrate, codecs, buffer sizes) are then set automatically. You can just type:
+.Sp
+.Vb 1
+\& ffmpeg \-i myfile.avi \-target vcd /tmp/vcd.mpg
+.Ve
+.Sp
+Nevertheless you can specify additional options as long as you know
+they do not conflict with the standard, as in:
+.Sp
+.Vb 1
+\& ffmpeg \-i myfile.avi \-target vcd \-bf 2 /tmp/vcd.mpg
+.Ve
+.Sp
+The parameters set for each target are as follows.
+.Sp
+\&\fB\s-1VCD\s0\fR
+.Sp
+.Vb 6
+\& :
+\& \-f vcd \-muxrate 1411200 \-muxpreload 0.44 \-packetsize 2324
+\& \-s 352x288 \-r 25
+\& \-codec:v mpeg1video \-g 15 \-b:v 1150k \-maxrate:v 1150v \-minrate:v 1150k \-bufsize:v 327680
+\& \-ar 44100 \-ac 2
+\& \-codec:a mp2 \-b:a 224k
+\&
+\& :
+\& \-f vcd \-muxrate 1411200 \-muxpreload 0.44 \-packetsize 2324
+\& \-s 352x240 \-r 30000/1001
+\& \-codec:v mpeg1video \-g 18 \-b:v 1150k \-maxrate:v 1150v \-minrate:v 1150k \-bufsize:v 327680
+\& \-ar 44100 \-ac 2
+\& \-codec:a mp2 \-b:a 224k
+\&
+\& :
+\& \-f vcd \-muxrate 1411200 \-muxpreload 0.44 \-packetsize 2324
+\& \-s 352x240 \-r 24000/1001
+\& \-codec:v mpeg1video \-g 18 \-b:v 1150k \-maxrate:v 1150v \-minrate:v 1150k \-bufsize:v 327680
+\& \-ar 44100 \-ac 2
+\& \-codec:a mp2 \-b:a 224k
+.Ve
+.Sp
+\&\fB\s-1SVCD\s0\fR
+.Sp
+.Vb 6
+\& :
+\& \-f svcd \-packetsize 2324
+\& \-s 480x576 \-pix_fmt yuv420p \-r 25
+\& \-codec:v mpeg2video \-g 15 \-b:v 2040k \-maxrate:v 2516k \-minrate:v 0 \-bufsize:v 1835008 \-scan_offset 1
+\& \-ar 44100
+\& \-codec:a mp2 \-b:a 224k
+\&
+\& :
+\& \-f svcd \-packetsize 2324
+\& \-s 480x480 \-pix_fmt yuv420p \-r 30000/1001
+\& \-codec:v mpeg2video \-g 18 \-b:v 2040k \-maxrate:v 2516k \-minrate:v 0 \-bufsize:v 1835008 \-scan_offset 1
+\& \-ar 44100
+\& \-codec:a mp2 \-b:a 224k
+\&
+\& :
+\& \-f svcd \-packetsize 2324
+\& \-s 480x480 \-pix_fmt yuv420p \-r 24000/1001
+\& \-codec:v mpeg2video \-g 18 \-b:v 2040k \-maxrate:v 2516k \-minrate:v 0 \-bufsize:v 1835008 \-scan_offset 1
+\& \-ar 44100
+\& \-codec:a mp2 \-b:a 224k
+.Ve
+.Sp
+\&\fB\s-1DVD\s0\fR
+.Sp
+.Vb 6
+\& :
+\& \-f dvd \-muxrate 10080k \-packetsize 2048
+\& \-s 720x576 \-pix_fmt yuv420p \-r 25
+\& \-codec:v mpeg2video \-g 15 \-b:v 6000k \-maxrate:v 9000k \-minrate:v 0 \-bufsize:v 1835008
+\& \-ar 48000
+\& \-codec:a ac3 \-b:a 448k
+\&
+\& :
+\& \-f dvd \-muxrate 10080k \-packetsize 2048
+\& \-s 720x480 \-pix_fmt yuv420p \-r 30000/1001
+\& \-codec:v mpeg2video \-g 18 \-b:v 6000k \-maxrate:v 9000k \-minrate:v 0 \-bufsize:v 1835008
+\& \-ar 48000
+\& \-codec:a ac3 \-b:a 448k
+\&
+\& :
+\& \-f dvd \-muxrate 10080k \-packetsize 2048
+\& \-s 720x480 \-pix_fmt yuv420p \-r 24000/1001
+\& \-codec:v mpeg2video \-g 18 \-b:v 6000k \-maxrate:v 9000k \-minrate:v 0 \-bufsize:v 1835008
+\& \-ar 48000
+\& \-codec:a ac3 \-b:a 448k
+.Ve
+.Sp
+\&\fB\s-1DV\s0\fR
+.Sp
+.Vb 4
+\& :
+\& \-f dv
+\& \-s 720x576 \-pix_fmt yuv420p \-r 25
+\& \-ar 48000 \-ac 2
+\&
+\& :
+\& \-f dv
+\& \-s 720x480 \-pix_fmt yuv411p \-r 30000/1001
+\& \-ar 48000 \-ac 2
+\&
+\& :
+\& \-f dv
+\& \-s 720x480 \-pix_fmt yuv411p \-r 24000/1001
+\& \-ar 48000 \-ac 2
+.Ve
+.Sp
+The \f(CW\*(C`dv50\*(C'\fR target is identical to the \f(CW\*(C`dv\*(C'\fR target except that the pixel format set is \f(CW\*(C`yuv422p\*(C'\fR for all three standards.
+.Sp
+Any user-set value for a parameter above will override the target preset value. In that case, the output may
+not comply with the target standard.
+.IP "\fB\-dn (\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-dn (input/output)"
+As an input option, blocks all data streams of a file from being filtered or
+being automatically selected or mapped for any output. See \f(CW\*(C`\-discard\*(C'\fR
+option to disable streams individually.
+.Sp
+As an output option, disables data recording i.e. automatic selection or
+mapping of any data stream. For full manual control see the \f(CW\*(C`\-map\*(C'\fR
+option.
+.IP "\fB\-dframes\fR \fInumber\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-dframes number (output)"
+Set the number of data frames to output. This is an obsolete alias for
+\&\f(CW\*(C`\-frames:d\*(C'\fR, which you should use instead.
+.IP "\fB\-frames[:\fR\fIstream_specifier\fR\fB]\fR \fIframecount\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-frames[:stream_specifier] framecount (output,per-stream)"
+Stop writing to the stream after \fIframecount\fR frames.
+.IP "\fB\-q[:\fR\fIstream_specifier\fR\fB]\fR \fIq\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-q[:stream_specifier] q (output,per-stream)"
+.PD 0
+.IP "\fB\-qscale[:\fR\fIstream_specifier\fR\fB]\fR \fIq\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-qscale[:stream_specifier] q (output,per-stream)"
+.PD
+Use fixed quality scale (\s-1VBR\s0). The meaning of \fIq\fR/\fIqscale\fR is
+codec-dependent.
+If \fIqscale\fR is used without a \fIstream_specifier\fR then it applies only
+to the video stream, this is to maintain compatibility with previous behavior
+and as specifying the same codec specific value to 2 different codecs that is
+audio and video generally is not what is intended when no stream_specifier is
+used.
+.IP "\fB\-filter[:\fR\fIstream_specifier\fR\fB]\fR \fIfiltergraph\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-filter[:stream_specifier] filtergraph (output,per-stream)"
+Create the filtergraph specified by \fIfiltergraph\fR and use it to
+filter the stream.
+.Sp
+\&\fIfiltergraph\fR is a description of the filtergraph to apply to
+the stream, and must have a single input and a single output of the
+same type of the stream. In the filtergraph, the input is associated
+to the label \f(CW\*(C`in\*(C'\fR, and the output to the label \f(CW\*(C`out\*(C'\fR. See
+the ffmpeg-filters manual for more information about the filtergraph
+syntax.
+.Sp
+See the \fB\-filter_complex option\fR if you
+want to create filtergraphs with multiple inputs and/or outputs.
+.IP "\fB\-filter_script[:\fR\fIstream_specifier\fR\fB]\fR \fIfilename\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-filter_script[:stream_specifier] filename (output,per-stream)"
+This option is similar to \fB\-filter\fR, the only difference is that its
+argument is the name of the file from which a filtergraph description is to be
+read.
+.IP "\fB\-filter_threads\fR \fInb_threads\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-filter_threads nb_threads (global)"
+Defines how many threads are used to process a filter pipeline. Each pipeline
+will produce a thread pool with this many threads available for parallel processing.
+The default is the number of available CPUs.
+.IP "\fB\-pre[:\fR\fIstream_specifier\fR\fB]\fR \fIpreset_name\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-pre[:stream_specifier] preset_name (output,per-stream)"
+Specify the preset for matching stream(s).
+.IP "\fB\-stats (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-stats (global)"
+Print encoding progress/statistics. It is on by default, to explicitly
+disable it you need to specify \f(CW\*(C`\-nostats\*(C'\fR.
+.IP "\fB\-stats_period\fR \fItime\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-stats_period time (global)"
+Set period at which encoding progress/statistics are updated. Default is 0.5 seconds.
+.IP "\fB\-progress\fR \fIurl\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-progress url (global)"
+Send program-friendly progress information to \fIurl\fR.
+.Sp
+Progress information is written periodically and at the end of
+the encoding process. It is made of "\fIkey\fR=\fIvalue\fR" lines. \fIkey\fR
+consists of only alphanumeric characters. The last key of a sequence of
+progress information is always \*(L"progress\*(R".
+.Sp
+The update period is set using \f(CW\*(C`\-stats_period\*(C'\fR.
+.IP "\fB\-stdin\fR" 4
+.IX Item "-stdin"
+Enable interaction on standard input. On by default unless standard input is
+used as an input. To explicitly disable interaction you need to specify
+\&\f(CW\*(C`\-nostdin\*(C'\fR.
+.Sp
+Disabling interaction on standard input is useful, for example, if
+ffmpeg is in the background process group. Roughly the same result can
+be achieved with \f(CW\*(C`ffmpeg ... < /dev/null\*(C'\fR but it requires a
+shell.
+.IP "\fB\-debug_ts (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-debug_ts (global)"
+Print timestamp information. It is off by default. This option is
+mostly useful for testing and debugging purposes, and the output
+format may change from one version to another, so it should not be
+employed by portable scripts.
+.Sp
+See also the option \f(CW\*(C`\-fdebug ts\*(C'\fR.
+.IP "\fB\-attach\fR \fIfilename\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-attach filename (output)"
+Add an attachment to the output file. This is supported by a few formats
+like Matroska for e.g. fonts used in rendering subtitles. Attachments
+are implemented as a specific type of stream, so this option will add
+a new stream to the file. It is then possible to use per-stream options
+on this stream in the usual way. Attachment streams created with this
+option will be created after all the other streams (i.e. those created
+with \f(CW\*(C`\-map\*(C'\fR or automatic mappings).
+.Sp
+Note that for Matroska you also have to set the mimetype metadata tag:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-attach DejaVuSans.ttf \-metadata:s:2 mimetype=application/x\-truetype\-font out.mkv
+.Ve
+.Sp
+(assuming that the attachment stream will be third in the output file).
+.IP "\fB\-dump_attachment[:\fR\fIstream_specifier\fR\fB]\fR \fIfilename\fR \fB(\fR\fIinput,per\-stream\fR\fB)\fR" 4
+.IX Item "-dump_attachment[:stream_specifier] filename (input,per-stream)"
+Extract the matching attachment stream into a file named \fIfilename\fR. If
+\&\fIfilename\fR is empty, then the value of the \f(CW\*(C`filename\*(C'\fR metadata tag
+will be used.
+.Sp
+E.g. to extract the first attachment to a file named 'out.ttf':
+.Sp
+.Vb 1
+\& ffmpeg \-dump_attachment:t:0 out.ttf \-i INPUT
+.Ve
+.Sp
+To extract all attachments to files determined by the \f(CW\*(C`filename\*(C'\fR tag:
+.Sp
+.Vb 1
+\& ffmpeg \-dump_attachment:t "" \-i INPUT
+.Ve
+.Sp
+Technical note \*(-- attachments are implemented as codec extradata, so this
+option can actually be used to extract extradata from any stream, not just
+attachments.
+.SS "Video Options"
+.IX Subsection "Video Options"
+.IP "\fB\-vframes\fR \fInumber\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-vframes number (output)"
+Set the number of video frames to output. This is an obsolete alias for
+\&\f(CW\*(C`\-frames:v\*(C'\fR, which you should use instead.
+.IP "\fB\-r[:\fR\fIstream_specifier\fR\fB]\fR \fIfps\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-r[:stream_specifier] fps (input/output,per-stream)"
+Set frame rate (Hz value, fraction or abbreviation).
+.Sp
+As an input option, ignore any timestamps stored in the file and instead
+generate timestamps assuming constant frame rate \fIfps\fR.
+This is not the same as the \fB\-framerate\fR option used for some input formats
+like image2 or v4l2 (it used to be the same in older versions of FFmpeg).
+If in doubt use \fB\-framerate\fR instead of the input option \fB\-r\fR.
+.Sp
+As an output option, duplicate or drop input frames to achieve constant output
+frame rate \fIfps\fR.
+.IP "\fB\-fpsmax[:\fR\fIstream_specifier\fR\fB]\fR \fIfps\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-fpsmax[:stream_specifier] fps (output,per-stream)"
+Set maximum frame rate (Hz value, fraction or abbreviation).
+.Sp
+Clamps output frame rate when output framerate is auto-set and is higher than this value.
+Useful in batch processing or when input framerate is wrongly detected as very high.
+It cannot be set together with \f(CW\*(C`\-r\*(C'\fR. It is ignored during streamcopy.
+.IP "\fB\-s[:\fR\fIstream_specifier\fR\fB]\fR \fIsize\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-s[:stream_specifier] size (input/output,per-stream)"
+Set frame size.
+.Sp
+As an input option, this is a shortcut for the \fBvideo_size\fR private
+option, recognized by some demuxers for which the frame size is either not
+stored in the file or is configurable \*(-- e.g. raw video or video grabbers.
+.Sp
+As an output option, this inserts the \f(CW\*(C`scale\*(C'\fR video filter to the
+\&\fIend\fR of the corresponding filtergraph. Please use the \f(CW\*(C`scale\*(C'\fR filter
+directly to insert it at the beginning or some other place.
+.Sp
+The format is \fBwxh\fR (default \- same as source).
+.IP "\fB\-aspect[:\fR\fIstream_specifier\fR\fB]\fR \fIaspect\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-aspect[:stream_specifier] aspect (output,per-stream)"
+Set the video display aspect ratio specified by \fIaspect\fR.
+.Sp
+\&\fIaspect\fR can be a floating point number string, or a string of the
+form \fInum\fR:\fIden\fR, where \fInum\fR and \fIden\fR are the
+numerator and denominator of the aspect ratio. For example \*(L"4:3\*(R",
+\&\*(L"16:9\*(R", \*(L"1.3333\*(R", and \*(L"1.7777\*(R" are valid argument values.
+.Sp
+If used together with \fB\-vcodec copy\fR, it will affect the aspect ratio
+stored at container level, but not the aspect ratio stored in encoded
+frames, if it exists.
+.IP "\fB\-vn (\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-vn (input/output)"
+As an input option, blocks all video streams of a file from being filtered or
+being automatically selected or mapped for any output. See \f(CW\*(C`\-discard\*(C'\fR
+option to disable streams individually.
+.Sp
+As an output option, disables video recording i.e. automatic selection or
+mapping of any video stream. For full manual control see the \f(CW\*(C`\-map\*(C'\fR
+option.
+.IP "\fB\-vcodec\fR \fIcodec\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-vcodec codec (output)"
+Set the video codec. This is an alias for \f(CW\*(C`\-codec:v\*(C'\fR.
+.IP "\fB\-pass[:\fR\fIstream_specifier\fR\fB]\fR \fIn\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-pass[:stream_specifier] n (output,per-stream)"
+Select the pass number (1 or 2). It is used to do two-pass
+video encoding. The statistics of the video are recorded in the first
+pass into a log file (see also the option \-passlogfile),
+and in the second pass that log file is used to generate the video
+at the exact requested bitrate.
+On pass 1, you may just deactivate audio and set output to null,
+examples for Windows and Unix:
+.Sp
+.Vb 2
+\& ffmpeg \-i foo.mov \-c:v libxvid \-pass 1 \-an \-f rawvideo \-y NUL
+\& ffmpeg \-i foo.mov \-c:v libxvid \-pass 1 \-an \-f rawvideo \-y /dev/null
+.Ve
+.IP "\fB\-passlogfile[:\fR\fIstream_specifier\fR\fB]\fR \fIprefix\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-passlogfile[:stream_specifier] prefix (output,per-stream)"
+Set two-pass log file name prefix to \fIprefix\fR, the default file name
+prefix is ``ffmpeg2pass''. The complete file name will be
+\&\fI\s-1PREFIX\-N\s0.log\fR, where N is a number specific to the output
+stream
+.IP "\fB\-vf\fR \fIfiltergraph\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-vf filtergraph (output)"
+Create the filtergraph specified by \fIfiltergraph\fR and use it to
+filter the stream.
+.Sp
+This is an alias for \f(CW\*(C`\-filter:v\*(C'\fR, see the \fB\-filter option\fR.
+.IP "\fB\-autorotate\fR" 4
+.IX Item "-autorotate"
+Automatically rotate the video according to file metadata. Enabled by
+default, use \fB\-noautorotate\fR to disable it.
+.IP "\fB\-autoscale\fR" 4
+.IX Item "-autoscale"
+Automatically scale the video according to the resolution of first frame.
+Enabled by default, use \fB\-noautoscale\fR to disable it. When autoscale is
+disabled, all output frames of filter graph might not be in the same resolution
+and may be inadequate for some encoder/muxer. Therefore, it is not recommended
+to disable it unless you really know what you are doing.
+Disable autoscale at your own risk.
+.SS "Advanced Video options"
+.IX Subsection "Advanced Video options"
+.IP "\fB\-pix_fmt[:\fR\fIstream_specifier\fR\fB]\fR \fIformat\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-pix_fmt[:stream_specifier] format (input/output,per-stream)"
+Set pixel format. Use \f(CW\*(C`\-pix_fmts\*(C'\fR to show all the supported
+pixel formats.
+If the selected pixel format can not be selected, ffmpeg will print a
+warning and select the best pixel format supported by the encoder.
+If \fIpix_fmt\fR is prefixed by a \f(CW\*(C`+\*(C'\fR, ffmpeg will exit with an error
+if the requested pixel format can not be selected, and automatic conversions
+inside filtergraphs are disabled.
+If \fIpix_fmt\fR is a single \f(CW\*(C`+\*(C'\fR, ffmpeg selects the same pixel format
+as the input (or graph output) and automatic conversions are disabled.
+.IP "\fB\-sws_flags\fR \fIflags\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-sws_flags flags (input/output)"
+Set SwScaler flags.
+.IP "\fB\-rc_override[:\fR\fIstream_specifier\fR\fB]\fR \fIoverride\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-rc_override[:stream_specifier] override (output,per-stream)"
+Rate control override for specific intervals, formatted as \*(L"int,int,int\*(R"
+list separated with slashes. Two first values are the beginning and
+end frame numbers, last one is quantizer to use if positive, or quality
+factor if negative.
+.IP "\fB\-ilme\fR" 4
+.IX Item "-ilme"
+Force interlacing support in encoder (\s-1MPEG\-2\s0 and \s-1MPEG\-4\s0 only).
+Use this option if your input file is interlaced and you want
+to keep the interlaced format for minimum losses.
+The alternative is to deinterlace the input stream by use of a filter
+such as \f(CW\*(C`yadif\*(C'\fR or \f(CW\*(C`bwdif\*(C'\fR, but deinterlacing introduces losses.
+.IP "\fB\-psnr\fR" 4
+.IX Item "-psnr"
+Calculate \s-1PSNR\s0 of compressed frames.
+.IP "\fB\-vstats\fR" 4
+.IX Item "-vstats"
+Dump video coding statistics to \fIvstats_HHMMSS.log\fR.
+.IP "\fB\-vstats_file\fR \fIfile\fR" 4
+.IX Item "-vstats_file file"
+Dump video coding statistics to \fIfile\fR.
+.IP "\fB\-vstats_version\fR \fIfile\fR" 4
+.IX Item "-vstats_version file"
+Specifies which version of the vstats format to use. Default is 2.
+.Sp
+version = 1 :
+.Sp
+\&\f(CW\*(C`frame= %5d q= %2.1f PSNR= %6.2f f_size= %6d s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s\*(C'\fR
+.Sp
+version > 1:
+.Sp
+\&\f(CW\*(C`out= %2d st= %2d frame= %5d q= %2.1f PSNR= %6.2f f_size= %6d s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s\*(C'\fR
+.IP "\fB\-top[:\fR\fIstream_specifier\fR\fB]\fR \fIn\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-top[:stream_specifier] n (output,per-stream)"
+top=1/bottom=0/auto=\-1 field first
+.IP "\fB\-dc\fR \fIprecision\fR" 4
+.IX Item "-dc precision"
+Intra_dc_precision.
+.IP "\fB\-vtag\fR \fIfourcc/tag\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-vtag fourcc/tag (output)"
+Force video tag/fourcc. This is an alias for \f(CW\*(C`\-tag:v\*(C'\fR.
+.IP "\fB\-qphist (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-qphist (global)"
+Show \s-1QP\s0 histogram
+.IP "\fB\-vbsf\fR \fIbitstream_filter\fR" 4
+.IX Item "-vbsf bitstream_filter"
+Deprecated see \-bsf
+.IP "\fB\-force_key_frames[:\fR\fIstream_specifier\fR\fB]\fR \fItime\fR\fB[,\fR\fItime\fR\fB...] (\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-force_key_frames[:stream_specifier] time[,time...] (output,per-stream)"
+.PD 0
+.IP "\fB\-force_key_frames[:\fR\fIstream_specifier\fR\fB] expr:\fR\fIexpr\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-force_key_frames[:stream_specifier] expr:expr (output,per-stream)"
+.IP "\fB\-force_key_frames[:\fR\fIstream_specifier\fR\fB] source (\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-force_key_frames[:stream_specifier] source (output,per-stream)"
+.PD
+\&\fIforce_key_frames\fR can take arguments of the following form:
+.RS 4
+.IP "\fItime\fR\fB[,\fR\fItime\fR\fB...]\fR" 4
+.IX Item "time[,time...]"
+If the argument consists of timestamps, ffmpeg will round the specified times to the nearest
+output timestamp as per the encoder time base and force a keyframe at the first frame having
+timestamp equal or greater than the computed timestamp. Note that if the encoder time base is too
+coarse, then the keyframes may be forced on frames with timestamps lower than the specified time.
+The default encoder time base is the inverse of the output framerate but may be set otherwise
+via \f(CW\*(C`\-enc_time_base\*(C'\fR.
+.Sp
+If one of the times is "\f(CW\*(C`chapters\*(C'\fR[\fIdelta\fR]", it is expanded into
+the time of the beginning of all chapters in the file, shifted by
+\&\fIdelta\fR, expressed as a time in seconds.
+This option can be useful to ensure that a seek point is present at a
+chapter mark or any other designated place in the output file.
+.Sp
+For example, to insert a key frame at 5 minutes, plus key frames 0.1 second
+before the beginning of every chapter:
+.Sp
+.Vb 1
+\& \-force_key_frames 0:05:00,chapters\-0.1
+.Ve
+.IP "\fBexpr:\fR\fIexpr\fR" 4
+.IX Item "expr:expr"
+If the argument is prefixed with \f(CW\*(C`expr:\*(C'\fR, the string \fIexpr\fR
+is interpreted like an expression and is evaluated for each frame. A
+key frame is forced in case the evaluation is non-zero.
+.Sp
+The expression in \fIexpr\fR can contain the following constants:
+.RS 4
+.IP "\fBn\fR" 4
+.IX Item "n"
+the number of current processed frame, starting from 0
+.IP "\fBn_forced\fR" 4
+.IX Item "n_forced"
+the number of forced frames
+.IP "\fBprev_forced_n\fR" 4
+.IX Item "prev_forced_n"
+the number of the previous forced frame, it is \f(CW\*(C`NAN\*(C'\fR when no
+keyframe was forced yet
+.IP "\fBprev_forced_t\fR" 4
+.IX Item "prev_forced_t"
+the time of the previous forced frame, it is \f(CW\*(C`NAN\*(C'\fR when no
+keyframe was forced yet
+.IP "\fBt\fR" 4
+.IX Item "t"
+the time of the current processed frame
+.RE
+.RS 4
+.Sp
+For example to force a key frame every 5 seconds, you can specify:
+.Sp
+.Vb 1
+\& \-force_key_frames expr:gte(t,n_forced*5)
+.Ve
+.Sp
+To force a key frame 5 seconds after the time of the last forced one,
+starting from second 13:
+.Sp
+.Vb 1
+\& \-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
+.Ve
+.RE
+.IP "\fBsource\fR" 4
+.IX Item "source"
+If the argument is \f(CW\*(C`source\*(C'\fR, ffmpeg will force a key frame if
+the current frame being encoded is marked as a key frame in its source.
+.RE
+.RS 4
+.Sp
+Note that forcing too many keyframes is very harmful for the lookahead
+algorithms of certain encoders: using fixed-GOP options or similar
+would be more efficient.
+.RE
+.IP "\fB\-copyinkf[:\fR\fIstream_specifier\fR\fB] (\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-copyinkf[:stream_specifier] (output,per-stream)"
+When doing stream copy, copy also non-key frames found at the
+beginning.
+.IP "\fB\-init_hw_device\fR \fItype\fR\fB[=\fR\fIname\fR\fB][:\fR\fIdevice\fR\fB[,\fR\fIkey=value\fR\fB...]]\fR" 4
+.IX Item "-init_hw_device type[=name][:device[,key=value...]]"
+Initialise a new hardware device of type \fItype\fR called \fIname\fR, using the
+given device parameters.
+If no name is specified it will receive a default name of the form "\fItype\fR\f(CW%d\fR".
+.Sp
+The meaning of \fIdevice\fR and the following arguments depends on the
+device type:
+.RS 4
+.IP "\fBcuda\fR" 4
+.IX Item "cuda"
+\&\fIdevice\fR is the number of the \s-1CUDA\s0 device.
+.IP "\fBdxva2\fR" 4
+.IX Item "dxva2"
+\&\fIdevice\fR is the number of the Direct3D 9 display adapter.
+.IP "\fBvaapi\fR" 4
+.IX Item "vaapi"
+\&\fIdevice\fR is either an X11 display name or a \s-1DRM\s0 render node.
+If not specified, it will attempt to open the default X11 display (\fI\f(CI$DISPLAY\fI\fR)
+and then the first \s-1DRM\s0 render node (\fI/dev/dri/renderD128\fR).
+.IP "\fBvdpau\fR" 4
+.IX Item "vdpau"
+\&\fIdevice\fR is an X11 display name.
+If not specified, it will attempt to open the default X11 display (\fI\f(CI$DISPLAY\fI\fR).
+.IP "\fBqsv\fR" 4
+.IX Item "qsv"
+\&\fIdevice\fR selects a value in \fBMFX_IMPL_*\fR. Allowed values are:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+.PD 0
+.IP "\fBsw\fR" 4
+.IX Item "sw"
+.IP "\fBhw\fR" 4
+.IX Item "hw"
+.IP "\fBauto_any\fR" 4
+.IX Item "auto_any"
+.IP "\fBhw_any\fR" 4
+.IX Item "hw_any"
+.IP "\fBhw2\fR" 4
+.IX Item "hw2"
+.IP "\fBhw3\fR" 4
+.IX Item "hw3"
+.IP "\fBhw4\fR" 4
+.IX Item "hw4"
+.RE
+.RS 4
+.PD
+.Sp
+If not specified, \fBauto_any\fR is used.
+(Note that it may be easier to achieve the desired result for \s-1QSV\s0 by creating the
+platform-appropriate subdevice (\fBdxva2\fR or \fBvaapi\fR) and then deriving a
+\&\s-1QSV\s0 device from that.)
+.RE
+.IP "\fBopencl\fR" 4
+.IX Item "opencl"
+\&\fIdevice\fR selects the platform and device as \fIplatform_index.device_index\fR.
+.Sp
+The set of devices can also be filtered using the key-value pairs to find only
+devices matching particular platform or device strings.
+.Sp
+The strings usable as filters are:
+.RS 4
+.IP "\fBplatform_profile\fR" 4
+.IX Item "platform_profile"
+.PD 0
+.IP "\fBplatform_version\fR" 4
+.IX Item "platform_version"
+.IP "\fBplatform_name\fR" 4
+.IX Item "platform_name"
+.IP "\fBplatform_vendor\fR" 4
+.IX Item "platform_vendor"
+.IP "\fBplatform_extensions\fR" 4
+.IX Item "platform_extensions"
+.IP "\fBdevice_name\fR" 4
+.IX Item "device_name"
+.IP "\fBdevice_vendor\fR" 4
+.IX Item "device_vendor"
+.IP "\fBdriver_version\fR" 4
+.IX Item "driver_version"
+.IP "\fBdevice_version\fR" 4
+.IX Item "device_version"
+.IP "\fBdevice_profile\fR" 4
+.IX Item "device_profile"
+.IP "\fBdevice_extensions\fR" 4
+.IX Item "device_extensions"
+.IP "\fBdevice_type\fR" 4
+.IX Item "device_type"
+.RE
+.RS 4
+.PD
+.Sp
+The indices and filters must together uniquely select a device.
+.Sp
+Examples:
+.IP "\fI\-init_hw_device opencl:0.1\fR" 4
+.IX Item "-init_hw_device opencl:0.1"
+Choose the second device on the first platform.
+.IP "\fI\-init_hw_device opencl:,device_name=Foo9000\fR" 4
+.IX Item "-init_hw_device opencl:,device_name=Foo9000"
+Choose the device with a name containing the string \fIFoo9000\fR.
+.IP "\fI\-init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16\fR" 4
+.IX Item "-init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16"
+Choose the \s-1GPU\s0 device on the second platform supporting the \fIcl_khr_fp16\fR
+extension.
+.RE
+.RS 4
+.RE
+.IP "\fBvulkan\fR" 4
+.IX Item "vulkan"
+If \fIdevice\fR is an integer, it selects the device by its index in a
+system-dependent list of devices. If \fIdevice\fR is any other string, it
+selects the first device with a name containing that string as a substring.
+.Sp
+The following options are recognized:
+.RS 4
+.IP "\fBdebug\fR" 4
+.IX Item "debug"
+If set to 1, enables the validation layer, if installed.
+.IP "\fBlinear_images\fR" 4
+.IX Item "linear_images"
+If set to 1, images allocated by the hwcontext will be linear and locally mappable.
+.IP "\fBinstance_extensions\fR" 4
+.IX Item "instance_extensions"
+A plus separated list of additional instance extensions to enable.
+.IP "\fBdevice_extensions\fR" 4
+.IX Item "device_extensions"
+A plus separated list of additional device extensions to enable.
+.RE
+.RS 4
+.Sp
+Examples:
+.IP "\fI\-init_hw_device vulkan:1\fR" 4
+.IX Item "-init_hw_device vulkan:1"
+Choose the second device on the system.
+.IP "\fI\-init_hw_device vulkan:RADV\fR" 4
+.IX Item "-init_hw_device vulkan:RADV"
+Choose the first device with a name containing the string \fI\s-1RADV\s0\fR.
+.IP "\fI\-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface\fR" 4
+.IX Item "-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface"
+Choose the first device and enable the Wayland and \s-1XCB\s0 instance extensions.
+.RE
+.RS 4
+.RE
+.RE
+.RS 4
+.RE
+.IP "\fB\-init_hw_device\fR \fItype\fR\fB[=\fR\fIname\fR\fB]@\fR\fIsource\fR" 4
+.IX Item "-init_hw_device type[=name]@source"
+Initialise a new hardware device of type \fItype\fR called \fIname\fR,
+deriving it from the existing device with the name \fIsource\fR.
+.IP "\fB\-init_hw_device list\fR" 4
+.IX Item "-init_hw_device list"
+List all hardware device types supported in this build of ffmpeg.
+.IP "\fB\-filter_hw_device\fR \fIname\fR" 4
+.IX Item "-filter_hw_device name"
+Pass the hardware device called \fIname\fR to all filters in any filter graph.
+This can be used to set the device to upload to with the \f(CW\*(C`hwupload\*(C'\fR filter,
+or the device to map to with the \f(CW\*(C`hwmap\*(C'\fR filter. Other filters may also
+make use of this parameter when they require a hardware device. Note that this
+is typically only required when the input is not already in hardware frames \-
+when it is, filters will derive the device they require from the context of the
+frames they receive as input.
+.Sp
+This is a global setting, so all filters will receive the same device.
+.IP "\fB\-hwaccel[:\fR\fIstream_specifier\fR\fB]\fR \fIhwaccel\fR \fB(\fR\fIinput,per\-stream\fR\fB)\fR" 4
+.IX Item "-hwaccel[:stream_specifier] hwaccel (input,per-stream)"
+Use hardware acceleration to decode the matching stream(s). The allowed values
+of \fIhwaccel\fR are:
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+Do not use any hardware acceleration (the default).
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Automatically select the hardware acceleration method.
+.IP "\fBvdpau\fR" 4
+.IX Item "vdpau"
+Use \s-1VDPAU\s0 (Video Decode and Presentation \s-1API\s0 for Unix) hardware acceleration.
+.IP "\fBdxva2\fR" 4
+.IX Item "dxva2"
+Use \s-1DXVA2\s0 (DirectX Video Acceleration) hardware acceleration.
+.IP "\fBvaapi\fR" 4
+.IX Item "vaapi"
+Use \s-1VAAPI\s0 (Video Acceleration \s-1API\s0) hardware acceleration.
+.IP "\fBqsv\fR" 4
+.IX Item "qsv"
+Use the Intel QuickSync Video acceleration for video transcoding.
+.Sp
+Unlike most other values, this option does not enable accelerated decoding (that
+is used automatically whenever a qsv decoder is selected), but accelerated
+transcoding, without copying the frames into the system memory.
+.Sp
+For it to work, both the decoder and the encoder must support \s-1QSV\s0 acceleration
+and no filters must be used.
+.RE
+.RS 4
+.Sp
+This option has no effect if the selected hwaccel is not available or not
+supported by the chosen decoder.
+.Sp
+Note that most acceleration methods are intended for playback and will not be
+faster than software decoding on modern CPUs. Additionally, \fBffmpeg\fR
+will usually need to copy the decoded frames from the \s-1GPU\s0 memory into the system
+memory, resulting in further performance loss. This option is thus mainly
+useful for testing.
+.RE
+.IP "\fB\-hwaccel_device[:\fR\fIstream_specifier\fR\fB]\fR \fIhwaccel_device\fR \fB(\fR\fIinput,per\-stream\fR\fB)\fR" 4
+.IX Item "-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)"
+Select a device to use for hardware acceleration.
+.Sp
+This option only makes sense when the \fB\-hwaccel\fR option is also specified.
+It can either refer to an existing device created with \fB\-init_hw_device\fR
+by name, or it can create a new device as if
+\&\fB\-init_hw_device\fR \fItype\fR:\fIhwaccel_device\fR
+were called immediately before.
+.IP "\fB\-hwaccels\fR" 4
+.IX Item "-hwaccels"
+List all hardware acceleration methods supported in this build of ffmpeg.
+.SS "Audio Options"
+.IX Subsection "Audio Options"
+.IP "\fB\-aframes\fR \fInumber\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-aframes number (output)"
+Set the number of audio frames to output. This is an obsolete alias for
+\&\f(CW\*(C`\-frames:a\*(C'\fR, which you should use instead.
+.IP "\fB\-ar[:\fR\fIstream_specifier\fR\fB]\fR \fIfreq\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-ar[:stream_specifier] freq (input/output,per-stream)"
+Set the audio sampling frequency. For output streams it is set by
+default to the frequency of the corresponding input stream. For input
+streams this option only makes sense for audio grabbing devices and raw
+demuxers and is mapped to the corresponding demuxer options.
+.IP "\fB\-aq\fR \fIq\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-aq q (output)"
+Set the audio quality (codec-specific, \s-1VBR\s0). This is an alias for \-q:a.
+.IP "\fB\-ac[:\fR\fIstream_specifier\fR\fB]\fR \fIchannels\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-ac[:stream_specifier] channels (input/output,per-stream)"
+Set the number of audio channels. For output streams it is set by
+default to the number of input audio channels. For input streams
+this option only makes sense for audio grabbing devices and raw demuxers
+and is mapped to the corresponding demuxer options.
+.IP "\fB\-an (\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-an (input/output)"
+As an input option, blocks all audio streams of a file from being filtered or
+being automatically selected or mapped for any output. See \f(CW\*(C`\-discard\*(C'\fR
+option to disable streams individually.
+.Sp
+As an output option, disables audio recording i.e. automatic selection or
+mapping of any audio stream. For full manual control see the \f(CW\*(C`\-map\*(C'\fR
+option.
+.IP "\fB\-acodec\fR \fIcodec\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-acodec codec (input/output)"
+Set the audio codec. This is an alias for \f(CW\*(C`\-codec:a\*(C'\fR.
+.IP "\fB\-sample_fmt[:\fR\fIstream_specifier\fR\fB]\fR \fIsample_fmt\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)"
+Set the audio sample format. Use \f(CW\*(C`\-sample_fmts\*(C'\fR to get a list
+of supported sample formats.
+.IP "\fB\-af\fR \fIfiltergraph\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-af filtergraph (output)"
+Create the filtergraph specified by \fIfiltergraph\fR and use it to
+filter the stream.
+.Sp
+This is an alias for \f(CW\*(C`\-filter:a\*(C'\fR, see the \fB\-filter option\fR.
+.SS "Advanced Audio options"
+.IX Subsection "Advanced Audio options"
+.IP "\fB\-atag\fR \fIfourcc/tag\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-atag fourcc/tag (output)"
+Force audio tag/fourcc. This is an alias for \f(CW\*(C`\-tag:a\*(C'\fR.
+.IP "\fB\-absf\fR \fIbitstream_filter\fR" 4
+.IX Item "-absf bitstream_filter"
+Deprecated, see \-bsf
+.IP "\fB\-guess_layout_max\fR \fIchannels\fR \fB(\fR\fIinput,per\-stream\fR\fB)\fR" 4
+.IX Item "-guess_layout_max channels (input,per-stream)"
+If some input channel layout is not known, try to guess only if it
+corresponds to at most the specified number of channels. For example, 2
+tells to \fBffmpeg\fR to recognize 1 channel as mono and 2 channels as
+stereo but not 6 channels as 5.1. The default is to always try to guess. Use
+0 to disable all guessing.
+.SS "Subtitle options"
+.IX Subsection "Subtitle options"
+.IP "\fB\-scodec\fR \fIcodec\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-scodec codec (input/output)"
+Set the subtitle codec. This is an alias for \f(CW\*(C`\-codec:s\*(C'\fR.
+.IP "\fB\-sn (\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-sn (input/output)"
+As an input option, blocks all subtitle streams of a file from being filtered or
+being automatically selected or mapped for any output. See \f(CW\*(C`\-discard\*(C'\fR
+option to disable streams individually.
+.Sp
+As an output option, disables subtitle recording i.e. automatic selection or
+mapping of any subtitle stream. For full manual control see the \f(CW\*(C`\-map\*(C'\fR
+option.
+.IP "\fB\-sbsf\fR \fIbitstream_filter\fR" 4
+.IX Item "-sbsf bitstream_filter"
+Deprecated, see \-bsf
+.SS "Advanced Subtitle options"
+.IX Subsection "Advanced Subtitle options"
+.IP "\fB\-fix_sub_duration\fR" 4
+.IX Item "-fix_sub_duration"
+Fix subtitles durations. For each subtitle, wait for the next packet in the
+same stream and adjust the duration of the first to avoid overlap. This is
+necessary with some subtitles codecs, especially \s-1DVB\s0 subtitles, because the
+duration in the original packet is only a rough estimate and the end is
+actually marked by an empty subtitle frame. Failing to use this option when
+necessary can result in exaggerated durations or muxing failures due to
+non-monotonic timestamps.
+.Sp
+Note that this option will delay the output of all data until the next
+subtitle packet is decoded: it may increase memory consumption and latency a
+lot.
+.IP "\fB\-canvas_size\fR \fIsize\fR" 4
+.IX Item "-canvas_size size"
+Set the size of the canvas used to render subtitles.
+.SS "Advanced options"
+.IX Subsection "Advanced options"
+.IP "\fB\-map [\-]\fR\fIinput_file_id\fR\fB[:\fR\fIstream_specifier\fR\fB][?][,\fR\fIsync_file_id\fR\fB[:\fR\fIstream_specifier\fR\fB]] |\fR \fI[linklabel]\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-map [-]input_file_id[:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel] (output)"
+Designate one or more input streams as a source for the output file. Each input
+stream is identified by the input file index \fIinput_file_id\fR and
+the input stream index \fIinput_stream_id\fR within the input
+file. Both indices start at 0. If specified,
+\&\fIsync_file_id\fR:\fIstream_specifier\fR sets which input stream
+is used as a presentation sync reference.
+.Sp
+The first \f(CW\*(C`\-map\*(C'\fR option on the command line specifies the
+source for output stream 0, the second \f(CW\*(C`\-map\*(C'\fR option specifies
+the source for output stream 1, etc.
+.Sp
+A \f(CW\*(C`\-\*(C'\fR character before the stream identifier creates a \*(L"negative\*(R" mapping.
+It disables matching streams from already created mappings.
+.Sp
+A trailing \f(CW\*(C`?\*(C'\fR after the stream index will allow the map to be
+optional: if the map matches no streams the map will be ignored instead
+of failing. Note the map will still fail if an invalid input file index
+is used; such as if the map refers to a non-existent input.
+.Sp
+An alternative \fI[linklabel]\fR form will map outputs from complex filter
+graphs (see the \fB\-filter_complex\fR option) to the output file.
+\&\fIlinklabel\fR must correspond to a defined output link label in the graph.
+.Sp
+For example, to map \s-1ALL\s0 streams from the first input file to output
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0 output
+.Ve
+.Sp
+For example, if you have two audio streams in the first input file,
+these streams are identified by \*(L"0:0\*(R" and \*(L"0:1\*(R". You can use
+\&\f(CW\*(C`\-map\*(C'\fR to select which streams to place in an output file. For
+example:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0:1 out.wav
+.Ve
+.Sp
+will map the input stream in \fI\s-1INPUT\s0\fR identified by \*(L"0:1\*(R" to
+the (single) output stream in \fIout.wav\fR.
+.Sp
+For example, to select the stream with index 2 from input file
+\&\fIa.mov\fR (specified by the identifier \*(L"0:2\*(R"), and stream with
+index 6 from input \fIb.mov\fR (specified by the identifier \*(L"1:6\*(R"),
+and copy them to the output file \fIout.mov\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i a.mov \-i b.mov \-c copy \-map 0:2 \-map 1:6 out.mov
+.Ve
+.Sp
+To select all video and the third audio stream from an input file:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0:v \-map 0:a:2 OUTPUT
+.Ve
+.Sp
+To map all the streams except the second audio, use negative mappings
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0 \-map \-0:a:1 OUTPUT
+.Ve
+.Sp
+To map the video and audio streams from the first input, and using the
+trailing \f(CW\*(C`?\*(C'\fR, ignore the audio mapping if no audio streams exist in
+the first input:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0:v \-map 0:a? OUTPUT
+.Ve
+.Sp
+To pick the English audio stream:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0:m:language:eng OUTPUT
+.Ve
+.Sp
+Note that using this option disables the default mappings for this output file.
+.IP "\fB\-ignore_unknown\fR" 4
+.IX Item "-ignore_unknown"
+Ignore input streams with unknown type instead of failing if copying
+such streams is attempted.
+.IP "\fB\-copy_unknown\fR" 4
+.IX Item "-copy_unknown"
+Allow input streams with unknown type to be copied instead of failing if copying
+such streams is attempted.
+.IP "\fB\-map_channel [\fR\fIinput_file_id\fR\fB.\fR\fIstream_specifier\fR\fB.\fR\fIchannel_id\fR\fB|\-1][?][:\fR\fIoutput_file_id\fR\fB.\fR\fIstream_specifier\fR\fB]\fR" 4
+.IX Item "-map_channel [input_file_id.stream_specifier.channel_id|-1][?][:output_file_id.stream_specifier]"
+Map an audio channel from a given input to an output. If
+\&\fIoutput_file_id\fR.\fIstream_specifier\fR is not set, the audio channel will
+be mapped on all the audio streams.
+.Sp
+Using \*(L"\-1\*(R" instead of
+\&\fIinput_file_id\fR.\fIstream_specifier\fR.\fIchannel_id\fR will map a muted
+channel.
+.Sp
+A trailing \f(CW\*(C`?\*(C'\fR will allow the map_channel to be
+optional: if the map_channel matches no channel the map_channel will be ignored instead
+of failing.
+.Sp
+For example, assuming \fI\s-1INPUT\s0\fR is a stereo audio file, you can switch the
+two audio channels with the following command:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map_channel 0.0.1 \-map_channel 0.0.0 OUTPUT
+.Ve
+.Sp
+If you want to mute the first channel and keep the second:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map_channel \-1 \-map_channel 0.0.1 OUTPUT
+.Ve
+.Sp
+The order of the \*(L"\-map_channel\*(R" option specifies the order of the channels in
+the output stream. The output channel layout is guessed from the number of
+channels mapped (mono if one \*(L"\-map_channel\*(R", stereo if two, etc.). Using \*(L"\-ac\*(R"
+in combination of \*(L"\-map_channel\*(R" makes the channel gain levels to be updated if
+input and output channel layouts don't match (for instance two \*(L"\-map_channel\*(R"
+options and \*(L"\-ac 6\*(R").
+.Sp
+You can also extract each channel of an input to specific outputs; the following
+command extracts two channels of the \fI\s-1INPUT\s0\fR audio stream (file 0, stream 0)
+to the respective \fI\s-1OUTPUT_CH0\s0\fR and \fI\s-1OUTPUT_CH1\s0\fR outputs:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map_channel 0.0.0 OUTPUT_CH0 \-map_channel 0.0.1 OUTPUT_CH1
+.Ve
+.Sp
+The following example splits the channels of a stereo input into two separate
+streams, which are put into the same output file:
+.Sp
+.Vb 1
+\& ffmpeg \-i stereo.wav \-map 0:0 \-map 0:0 \-map_channel 0.0.0:0.0 \-map_channel 0.0.1:0.1 \-y out.ogg
+.Ve
+.Sp
+Note that currently each output stream can only contain channels from a single
+input stream; you can't for example use \*(L"\-map_channel\*(R" to pick multiple input
+audio channels contained in different streams (from the same or different files)
+and merge them into a single output stream. It is therefore not currently
+possible, for example, to turn two separate mono streams into a single stereo
+stream. However splitting a stereo stream into two single channel mono streams
+is possible.
+.Sp
+If you need this feature, a possible workaround is to use the \fIamerge\fR
+filter. For example, if you need to merge a media (here \fIinput.mkv\fR) with 2
+mono audio streams into one single stereo channel audio stream (and keep the
+video stream), you can use the following command:
+.Sp
+.Vb 1
+\& ffmpeg \-i input.mkv \-filter_complex "[0:1] [0:2] amerge" \-c:a pcm_s16le \-c:v copy output.mkv
+.Ve
+.Sp
+To map the first two audio channels from the first input, and using the
+trailing \f(CW\*(C`?\*(C'\fR, ignore the audio channel mapping if the first input is
+mono instead of stereo:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-map_channel 0.0.0 \-map_channel 0.0.1? OUTPUT
+.Ve
+.IP "\fB\-map_metadata[:\fR\fImetadata_spec_out\fR\fB]\fR \fIinfile\fR\fB[:\fR\fImetadata_spec_in\fR\fB] (\fR\fIoutput,per\-metadata\fR\fB)\fR" 4
+.IX Item "-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)"
+Set metadata information of the next output file from \fIinfile\fR. Note that
+those are file indices (zero-based), not filenames.
+Optional \fImetadata_spec_in/out\fR parameters specify, which metadata to copy.
+A metadata specifier can have the following forms:
+.RS 4
+.IP "\fIg\fR" 4
+.IX Item "g"
+global metadata, i.e. metadata that applies to the whole file
+.IP "\fIs\fR\fB[:\fR\fIstream_spec\fR\fB]\fR" 4
+.IX Item "s[:stream_spec]"
+per-stream metadata. \fIstream_spec\fR is a stream specifier as described
+in the \fBStream specifiers\fR chapter. In an input metadata specifier, the first
+matching stream is copied from. In an output metadata specifier, all matching
+streams are copied to.
+.IP "\fIc\fR\fB:\fR\fIchapter_index\fR" 4
+.IX Item "c:chapter_index"
+per-chapter metadata. \fIchapter_index\fR is the zero-based chapter index.
+.IP "\fIp\fR\fB:\fR\fIprogram_index\fR" 4
+.IX Item "p:program_index"
+per-program metadata. \fIprogram_index\fR is the zero-based program index.
+.RE
+.RS 4
+.Sp
+If metadata specifier is omitted, it defaults to global.
+.Sp
+By default, global metadata is copied from the first input file,
+per-stream and per-chapter metadata is copied along with streams/chapters. These
+default mappings are disabled by creating any mapping of the relevant type. A negative
+file index can be used to create a dummy mapping that just disables automatic copying.
+.Sp
+For example to copy metadata from the first stream of the input file to global metadata
+of the output file:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.ogg \-map_metadata 0:s:0 out.mp3
+.Ve
+.Sp
+To do the reverse, i.e. copy global metadata to all audio streams:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-map_metadata:s:a 0:g out.mkv
+.Ve
+.Sp
+Note that simple \f(CW0\fR would work as well in this example, since global
+metadata is assumed by default.
+.RE
+.IP "\fB\-map_chapters\fR \fIinput_file_index\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-map_chapters input_file_index (output)"
+Copy chapters from input file with index \fIinput_file_index\fR to the next
+output file. If no chapter mapping is specified, then chapters are copied from
+the first input file with at least one chapter. Use a negative file index to
+disable any chapter copying.
+.IP "\fB\-benchmark (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-benchmark (global)"
+Show benchmarking information at the end of an encode.
+Shows real, system and user time used and maximum memory consumption.
+Maximum memory consumption is not supported on all systems,
+it will usually display as 0 if not supported.
+.IP "\fB\-benchmark_all (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-benchmark_all (global)"
+Show benchmarking information during the encode.
+Shows real, system and user time used in various steps (audio/video encode/decode).
+.IP "\fB\-timelimit\fR \fIduration\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-timelimit duration (global)"
+Exit after ffmpeg has been running for \fIduration\fR seconds in \s-1CPU\s0 user time.
+.IP "\fB\-dump (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-dump (global)"
+Dump each input packet to stderr.
+.IP "\fB\-hex (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-hex (global)"
+When dumping packets, also dump the payload.
+.IP "\fB\-re (\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-re (input)"
+Read input at native frame rate. Mainly used to simulate a grab device,
+or live input stream (e.g. when reading from a file). Should not be used
+with actual grab devices or live input streams (where it can cause packet
+loss).
+By default \fBffmpeg\fR attempts to read the input(s) as fast as possible.
+This option will slow down the reading of the input(s) to the native frame rate
+of the input(s). It is useful for real-time output (e.g. live streaming).
+.IP "\fB\-vsync\fR \fIparameter\fR" 4
+.IX Item "-vsync parameter"
+Video sync method.
+For compatibility reasons old values can be specified as numbers.
+Newly added values will have to be specified as strings always.
+.RS 4
+.IP "\fB0, passthrough\fR" 4
+.IX Item "0, passthrough"
+Each frame is passed with its timestamp from the demuxer to the muxer.
+.IP "\fB1, cfr\fR" 4
+.IX Item "1, cfr"
+Frames will be duplicated and dropped to achieve exactly the requested
+constant frame rate.
+.IP "\fB2, vfr\fR" 4
+.IX Item "2, vfr"
+Frames are passed through with their timestamp or dropped so as to
+prevent 2 frames from having the same timestamp.
+.IP "\fBdrop\fR" 4
+.IX Item "drop"
+As passthrough but destroys all timestamps, making the muxer generate
+fresh timestamps based on frame-rate.
+.IP "\fB\-1, auto\fR" 4
+.IX Item "-1, auto"
+Chooses between 1 and 2 depending on muxer capabilities. This is the
+default method.
+.RE
+.RS 4
+.Sp
+Note that the timestamps may be further modified by the muxer, after this.
+For example, in the case that the format option \fBavoid_negative_ts\fR
+is enabled.
+.Sp
+With \-map you can select from which stream the timestamps should be
+taken. You can leave either video or audio unchanged and sync the
+remaining stream(s) to the unchanged one.
+.RE
+.IP "\fB\-frame_drop_threshold\fR \fIparameter\fR" 4
+.IX Item "-frame_drop_threshold parameter"
+Frame drop threshold, which specifies how much behind video frames can
+be before they are dropped. In frame rate units, so 1.0 is one frame.
+The default is \-1.1. One possible usecase is to avoid framedrops in case
+of noisy timestamps or to increase frame drop precision in case of exact
+timestamps.
+.IP "\fB\-async\fR \fIsamples_per_second\fR" 4
+.IX Item "-async samples_per_second"
+Audio sync method. \*(L"Stretches/squeezes\*(R" the audio stream to match the timestamps,
+the parameter is the maximum samples per second by which the audio is changed.
+\&\-async 1 is a special case where only the start of the audio stream is corrected
+without any later correction.
+.Sp
+Note that the timestamps may be further modified by the muxer, after this.
+For example, in the case that the format option \fBavoid_negative_ts\fR
+is enabled.
+.Sp
+This option has been deprecated. Use the \f(CW\*(C`aresample\*(C'\fR audio filter instead.
+.IP "\fB\-adrift_threshold\fR \fItime\fR" 4
+.IX Item "-adrift_threshold time"
+Set the minimum difference between timestamps and audio data (in seconds) to trigger
+adding/dropping samples to make it match the timestamps. This option effectively is
+a threshold to select between hard (add/drop) and soft (squeeze/stretch) compensation.
+\&\f(CW\*(C`\-async\*(C'\fR must be set to a positive value.
+.IP "\fB\-apad\fR \fIparameters\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-apad parameters (output,per-stream)"
+Pad the output audio stream(s). This is the same as applying \f(CW\*(C`\-af apad\*(C'\fR.
+Argument is a string of filter parameters composed the same as with the \f(CW\*(C`apad\*(C'\fR filter.
+\&\f(CW\*(C`\-shortest\*(C'\fR must be set for this output for the option to take effect.
+.IP "\fB\-copyts\fR" 4
+.IX Item "-copyts"
+Do not process input timestamps, but keep their values without trying
+to sanitize them. In particular, do not remove the initial start time
+offset value.
+.Sp
+Note that, depending on the \fBvsync\fR option or on specific muxer
+processing (e.g. in case the format option \fBavoid_negative_ts\fR
+is enabled) the output timestamps may mismatch with the input
+timestamps even when this option is selected.
+.IP "\fB\-start_at_zero\fR" 4
+.IX Item "-start_at_zero"
+When used with \fBcopyts\fR, shift input timestamps so they start at zero.
+.Sp
+This means that using e.g. \f(CW\*(C`\-ss 50\*(C'\fR will make output timestamps start at
+50 seconds, regardless of what timestamp the input file started at.
+.IP "\fB\-copytb\fR \fImode\fR" 4
+.IX Item "-copytb mode"
+Specify how to set the encoder timebase when stream copying. \fImode\fR is an
+integer numeric value, and can assume one of the following values:
+.RS 4
+.IP "\fB1\fR" 4
+.IX Item "1"
+Use the demuxer timebase.
+.Sp
+The time base is copied to the output encoder from the corresponding input
+demuxer. This is sometimes required to avoid non monotonically increasing
+timestamps when copying video streams with variable frame rate.
+.IP "\fB0\fR" 4
+.IX Item "0"
+Use the decoder timebase.
+.Sp
+The time base is copied to the output encoder from the corresponding input
+decoder.
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+Try to make the choice automatically, in order to generate a sane output.
+.RE
+.RS 4
+.Sp
+Default value is \-1.
+.RE
+.IP "\fB\-enc_time_base[:\fR\fIstream_specifier\fR\fB]\fR \fItimebase\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-enc_time_base[:stream_specifier] timebase (output,per-stream)"
+Set the encoder timebase. \fItimebase\fR is a floating point number,
+and can assume one of the following values:
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+Assign a default value according to the media type.
+.Sp
+For video \- use 1/framerate, for audio \- use 1/samplerate.
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+Use the input stream timebase when possible.
+.Sp
+If an input stream is not available, the default timebase will be used.
+.IP "\fB>0\fR" 4
+.IX Item ">0"
+Use the provided number as the timebase.
+.Sp
+This field can be provided as a ratio of two integers (e.g. 1:24, 1:48000)
+or as a floating point number (e.g. 0.04166, 2.0833e\-5)
+.RE
+.RS 4
+.Sp
+Default value is 0.
+.RE
+.IP "\fB\-bitexact (\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "-bitexact (input/output)"
+Enable bitexact mode for (de)muxer and (de/en)coder
+.IP "\fB\-shortest (\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-shortest (output)"
+Finish encoding when the shortest input stream ends.
+.IP "\fB\-dts_delta_threshold\fR" 4
+.IX Item "-dts_delta_threshold"
+Timestamp discontinuity delta threshold.
+.IP "\fB\-dts_error_threshold\fR \fIseconds\fR" 4
+.IX Item "-dts_error_threshold seconds"
+Timestamp error delta threshold. This threshold use to discard crazy/damaged
+timestamps and the default is 30 hours which is arbitrarily picked and quite
+conservative.
+.IP "\fB\-muxdelay\fR \fIseconds\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-muxdelay seconds (output)"
+Set the maximum demux-decode delay.
+.IP "\fB\-muxpreload\fR \fIseconds\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-muxpreload seconds (output)"
+Set the initial demux-decode delay.
+.IP "\fB\-streamid\fR \fIoutput-stream-index\fR\fB:\fR\fInew-value\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "-streamid output-stream-index:new-value (output)"
+Assign a new stream-id value to an output stream. This option should be
+specified prior to the output filename to which it applies.
+For the situation where multiple output files exist, a streamid
+may be reassigned to a different value.
+.Sp
+For example, to set the stream 0 \s-1PID\s0 to 33 and the stream 1 \s-1PID\s0 to 36 for
+an output mpegts file:
+.Sp
+.Vb 1
+\& ffmpeg \-i inurl \-streamid 0:33 \-streamid 1:36 out.ts
+.Ve
+.IP "\fB\-bsf[:\fR\fIstream_specifier\fR\fB]\fR \fIbitstream_filters\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-bsf[:stream_specifier] bitstream_filters (output,per-stream)"
+Set bitstream filters for matching streams. \fIbitstream_filters\fR is
+a comma-separated list of bitstream filters. Use the \f(CW\*(C`\-bsfs\*(C'\fR option
+to get the list of bitstream filters.
+.Sp
+.Vb 1
+\& ffmpeg \-i h264.mp4 \-c:v copy \-bsf:v h264_mp4toannexb \-an out.h264
+\&
+\&
+\& ffmpeg \-i file.mov \-an \-vn \-bsf:s mov2textsub \-c:s copy \-f rawvideo sub.txt
+.Ve
+.IP "\fB\-tag[:\fR\fIstream_specifier\fR\fB]\fR \fIcodec_tag\fR \fB(\fR\fIinput/output,per\-stream\fR\fB)\fR" 4
+.IX Item "-tag[:stream_specifier] codec_tag (input/output,per-stream)"
+Force a tag/fourcc for matching streams.
+.IP "\fB\-timecode\fR \fIhh\fR\fB:\fR\fImm\fR\fB:\fR\fIss\fR\fB\s-1SEP\s0\fR\fIff\fR" 4
+.IX Item "-timecode hh:mm:ssSEPff"
+Specify Timecode for writing. \fI\s-1SEP\s0\fR is ':' for non drop timecode and ';'
+(or '.') for drop.
+.Sp
+.Vb 1
+\& ffmpeg \-i input.mpg \-timecode 01:02:03.04 \-r 30000/1001 \-s ntsc output.mpg
+.Ve
+.IP "\fB\-filter_complex\fR \fIfiltergraph\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-filter_complex filtergraph (global)"
+Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or
+outputs. For simple graphs \*(-- those with one input and one output of the same
+type \*(-- see the \fB\-filter\fR options. \fIfiltergraph\fR is a description of
+the filtergraph, as described in the ``Filtergraph syntax'' section of the
+ffmpeg-filters manual.
+.Sp
+Input link labels must refer to input streams using the
+\&\f(CW\*(C`[file_index:stream_specifier]\*(C'\fR syntax (i.e. the same as \fB\-map\fR
+uses). If \fIstream_specifier\fR matches multiple streams, the first one will be
+used. An unlabeled input will be connected to the first unused input stream of
+the matching type.
+.Sp
+Output link labels are referred to with \fB\-map\fR. Unlabeled outputs are
+added to the first output file.
+.Sp
+Note that with this option it is possible to use only lavfi sources without
+normal input files.
+.Sp
+For example, to overlay an image over video
+.Sp
+.Vb 2
+\& ffmpeg \-i video.mkv \-i image.png \-filter_complex \*(Aq[0:v][1:v]overlay[out]\*(Aq \-map
+\& \*(Aq[out]\*(Aq out.mkv
+.Ve
+.Sp
+Here \f(CW\*(C`[0:v]\*(C'\fR refers to the first video stream in the first input file,
+which is linked to the first (main) input of the overlay filter. Similarly the
+first video stream in the second input is linked to the second (overlay) input
+of overlay.
+.Sp
+Assuming there is only one video stream in each input file, we can omit input
+labels, so the above is equivalent to
+.Sp
+.Vb 2
+\& ffmpeg \-i video.mkv \-i image.png \-filter_complex \*(Aqoverlay[out]\*(Aq \-map
+\& \*(Aq[out]\*(Aq out.mkv
+.Ve
+.Sp
+Furthermore we can omit the output label and the single output from the filter
+graph will be added to the output file automatically, so we can simply write
+.Sp
+.Vb 1
+\& ffmpeg \-i video.mkv \-i image.png \-filter_complex \*(Aqoverlay\*(Aq out.mkv
+.Ve
+.Sp
+As a special exception, you can use a bitmap subtitle stream as input: it
+will be converted into a video with the same size as the largest video in
+the file, or 720x576 if no video is present. Note that this is an
+experimental and temporary solution. It will be removed once libavfilter has
+proper support for subtitles.
+.Sp
+For example, to hardcode subtitles on top of a DVB-T recording stored in
+MPEG-TS format, delaying the subtitles by 1 second:
+.Sp
+.Vb 3
+\& ffmpeg \-i input.ts \-filter_complex \e
+\& \*(Aq[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay\*(Aq \e
+\& \-sn \-map \*(Aq#0x2dc\*(Aq output.mkv
+.Ve
+.Sp
+(0x2d0, 0x2dc and 0x2ef are the MPEG-TS PIDs of respectively the video,
+audio and subtitles streams; 0:0, 0:3 and 0:7 would have worked too)
+.Sp
+To generate 5 seconds of pure red video using lavfi \f(CW\*(C`color\*(C'\fR source:
+.Sp
+.Vb 1
+\& ffmpeg \-filter_complex \*(Aqcolor=c=red\*(Aq \-t 5 out.mkv
+.Ve
+.IP "\fB\-filter_complex_threads\fR \fInb_threads\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-filter_complex_threads nb_threads (global)"
+Defines how many threads are used to process a filter_complex graph.
+Similar to filter_threads but used for \f(CW\*(C`\-filter_complex\*(C'\fR graphs only.
+The default is the number of available CPUs.
+.IP "\fB\-lavfi\fR \fIfiltergraph\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-lavfi filtergraph (global)"
+Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or
+outputs. Equivalent to \fB\-filter_complex\fR.
+.IP "\fB\-filter_complex_script\fR \fIfilename\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-filter_complex_script filename (global)"
+This option is similar to \fB\-filter_complex\fR, the only difference is that
+its argument is the name of the file from which a complex filtergraph
+description is to be read.
+.IP "\fB\-accurate_seek (\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-accurate_seek (input)"
+This option enables or disables accurate seeking in input files with the
+\&\fB\-ss\fR option. It is enabled by default, so seeking is accurate when
+transcoding. Use \fB\-noaccurate_seek\fR to disable it, which may be useful
+e.g. when copying some streams and transcoding the others.
+.IP "\fB\-seek_timestamp (\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-seek_timestamp (input)"
+This option enables or disables seeking by timestamp in input files with the
+\&\fB\-ss\fR option. It is disabled by default. If enabled, the argument
+to the \fB\-ss\fR option is considered an actual timestamp, and is not
+offset by the start time of the file. This matters only for files which do
+not start from timestamp 0, such as transport streams.
+.IP "\fB\-thread_queue_size\fR \fIsize\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-thread_queue_size size (input)"
+This option sets the maximum number of queued packets when reading from the
+file or device. With low latency / high rate live streams, packets may be
+discarded if they are not read in a timely manner; setting this value can
+force ffmpeg to use a separate input thread and read packets as soon as they
+arrive. By default ffmpeg only do this if multiple inputs are specified.
+.IP "\fB\-sdp_file\fR \fIfile\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-sdp_file file (global)"
+Print sdp information for an output stream to \fIfile\fR.
+This allows dumping sdp information when at least one output isn't an
+rtp stream. (Requires at least one of the output formats to be rtp).
+.IP "\fB\-discard (\fR\fIinput\fR\fB)\fR" 4
+.IX Item "-discard (input)"
+Allows discarding specific streams or frames from streams.
+Any input stream can be fully discarded, using value \f(CW\*(C`all\*(C'\fR whereas
+selective discarding of frames from a stream occurs at the demuxer
+and is not supported by all demuxers.
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+Discard no frame.
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+Default, which discards no frames.
+.IP "\fBnoref\fR" 4
+.IX Item "noref"
+Discard all non-reference frames.
+.IP "\fBbidir\fR" 4
+.IX Item "bidir"
+Discard all bidirectional frames.
+.IP "\fBnokey\fR" 4
+.IX Item "nokey"
+Discard all frames excepts keyframes.
+.IP "\fBall\fR" 4
+.IX Item "all"
+Discard all frames.
+.RE
+.RS 4
+.RE
+.IP "\fB\-abort_on\fR \fIflags\fR \fB(\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-abort_on flags (global)"
+Stop and abort on various conditions. The following flags are available:
+.RS 4
+.IP "\fBempty_output\fR" 4
+.IX Item "empty_output"
+No packets were passed to the muxer, the output is empty.
+.IP "\fBempty_output_stream\fR" 4
+.IX Item "empty_output_stream"
+No packets were passed to the muxer in some of the output streams.
+.RE
+.RS 4
+.RE
+.IP "\fB\-max_error_rate (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-max_error_rate (global)"
+Set fraction of decoding frame failures across all inputs which when crossed
+ffmpeg will return exit code 69. Crossing this threshold does not terminate
+processing. Range is a floating-point number between 0 to 1. Default is 2/3.
+.IP "\fB\-xerror (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-xerror (global)"
+Stop and exit on error
+.IP "\fB\-max_muxing_queue_size\fR \fIpackets\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-max_muxing_queue_size packets (output,per-stream)"
+When transcoding audio and/or video streams, ffmpeg will not begin writing into
+the output until it has one packet for each such stream. While waiting for that
+to happen, packets for other streams are buffered. This option sets the size of
+this buffer, in packets, for the matching output stream.
+.Sp
+The default value of this option should be high enough for most uses, so only
+touch this option if you are sure that you need it.
+.IP "\fB\-muxing_queue_data_threshold\fR \fIbytes\fR \fB(\fR\fIoutput,per\-stream\fR\fB)\fR" 4
+.IX Item "-muxing_queue_data_threshold bytes (output,per-stream)"
+This is a minimum threshold until which the muxing queue size is not taken into
+account. Defaults to 50 megabytes per stream, and is based on the overall size
+of packets passed to the muxer.
+.IP "\fB\-auto_conversion_filters (\fR\fIglobal\fR\fB)\fR" 4
+.IX Item "-auto_conversion_filters (global)"
+Enable automatically inserting format conversion filters in all filter
+graphs, including those defined by \fB\-vf\fR, \fB\-af\fR,
+\&\fB\-filter_complex\fR and \fB\-lavfi\fR. If filter format negotiation
+requires a conversion, the initialization of the filters will fail.
+Conversions can still be performed by inserting the relevant conversion
+filter (scale, aresample) in the graph.
+On by default, to explicitly disable it you need to specify
+\&\f(CW\*(C`\-noauto_conversion_filters\*(C'\fR.
+.SS "Preset files"
+.IX Subsection "Preset files"
+A preset file contains a sequence of \fIoption\fR=\fIvalue\fR pairs,
+one for each line, specifying a sequence of options which would be
+awkward to specify on the command line. Lines starting with the hash
+('#') character are ignored and are used to provide comments. Check
+the \fIpresets\fR directory in the FFmpeg source tree for examples.
+.PP
+There are two types of preset files: ffpreset and avpreset files.
+.PP
+\fIffpreset files\fR
+.IX Subsection "ffpreset files"
+.PP
+ffpreset files are specified with the \f(CW\*(C`vpre\*(C'\fR, \f(CW\*(C`apre\*(C'\fR,
+\&\f(CW\*(C`spre\*(C'\fR, and \f(CW\*(C`fpre\*(C'\fR options. The \f(CW\*(C`fpre\*(C'\fR option takes the
+filename of the preset instead of a preset name as input and can be
+used for any kind of codec. For the \f(CW\*(C`vpre\*(C'\fR, \f(CW\*(C`apre\*(C'\fR, and
+\&\f(CW\*(C`spre\*(C'\fR options, the options specified in a preset file are
+applied to the currently selected codec of the same type as the preset
+option.
+.PP
+The argument passed to the \f(CW\*(C`vpre\*(C'\fR, \f(CW\*(C`apre\*(C'\fR, and \f(CW\*(C`spre\*(C'\fR
+preset options identifies the preset file to use according to the
+following rules:
+.PP
+First ffmpeg searches for a file named \fIarg\fR.ffpreset in the
+directories \fI\f(CI$FFMPEG_DATADIR\fI\fR (if set), and \fI\f(CI$HOME\fI/.ffmpeg\fR, and in
+the datadir defined at configuration time (usually \fIPREFIX/share/ffmpeg\fR)
+or in a \fIffpresets\fR folder along the executable on win32,
+in that order. For example, if the argument is \f(CW\*(C`libvpx\-1080p\*(C'\fR, it will
+search for the file \fIlibvpx\-1080p.ffpreset\fR.
+.PP
+If no such file is found, then ffmpeg will search for a file named
+\&\fIcodec_name\fR\-\fIarg\fR.ffpreset in the above-mentioned
+directories, where \fIcodec_name\fR is the name of the codec to which
+the preset file options will be applied. For example, if you select
+the video codec with \f(CW\*(C`\-vcodec libvpx\*(C'\fR and use \f(CW\*(C`\-vpre 1080p\*(C'\fR,
+then it will search for the file \fIlibvpx\-1080p.ffpreset\fR.
+.PP
+\fIavpreset files\fR
+.IX Subsection "avpreset files"
+.PP
+avpreset files are specified with the \f(CW\*(C`pre\*(C'\fR option. They work similar to
+ffpreset files, but they only allow encoder\- specific options. Therefore, an
+\&\fIoption\fR=\fIvalue\fR pair specifying an encoder cannot be used.
+.PP
+When the \f(CW\*(C`pre\*(C'\fR option is specified, ffmpeg will look for files with the
+suffix .avpreset in the directories \fI\f(CI$AVCONV_DATADIR\fI\fR (if set), and
+\&\fI\f(CI$HOME\fI/.avconv\fR, and in the datadir defined at configuration time (usually
+\&\fIPREFIX/share/ffmpeg\fR), in that order.
+.PP
+First ffmpeg searches for a file named \fIcodec_name\fR\-\fIarg\fR.avpreset in
+the above-mentioned directories, where \fIcodec_name\fR is the name of the codec
+to which the preset file options will be applied. For example, if you select the
+video codec with \f(CW\*(C`\-vcodec libvpx\*(C'\fR and use \f(CW\*(C`\-pre 1080p\*(C'\fR, then it will
+search for the file \fIlibvpx\-1080p.avpreset\fR.
+.PP
+If no such file is found, then ffmpeg will search for a file named
+\&\fIarg\fR.avpreset in the same directories.
+.SH "EXAMPLES"
+.IX Header "EXAMPLES"
+.SS "Video and Audio grabbing"
+.IX Subsection "Video and Audio grabbing"
+If you specify the input format and device then ffmpeg can grab video
+and audio directly.
+.PP
+.Vb 1
+\& ffmpeg \-f oss \-i /dev/dsp \-f video4linux2 \-i /dev/video0 /tmp/out.mpg
+.Ve
+.PP
+Or with an \s-1ALSA\s0 audio source (mono input, card id 1) instead of \s-1OSS:\s0
+.PP
+.Vb 1
+\& ffmpeg \-f alsa \-ac 1 \-i hw:1 \-f video4linux2 \-i /dev/video0 /tmp/out.mpg
+.Ve
+.PP
+Note that you must activate the right video source and channel before
+launching ffmpeg with any \s-1TV\s0 viewer such as
+<\fBhttp://linux.bytesex.org/xawtv/\fR> by Gerd Knorr. You also
+have to set the audio recording levels correctly with a
+standard mixer.
+.SS "X11 grabbing"
+.IX Subsection "X11 grabbing"
+Grab the X11 display with ffmpeg via
+.PP
+.Vb 1
+\& ffmpeg \-f x11grab \-video_size cif \-framerate 25 \-i :0.0 /tmp/out.mpg
+.Ve
+.PP
+0.0 is display.screen number of your X11 server, same as
+the \s-1DISPLAY\s0 environment variable.
+.PP
+.Vb 1
+\& ffmpeg \-f x11grab \-video_size cif \-framerate 25 \-i :0.0+10,20 /tmp/out.mpg
+.Ve
+.PP
+0.0 is display.screen number of your X11 server, same as the \s-1DISPLAY\s0 environment
+variable. 10 is the x\-offset and 20 the y\-offset for the grabbing.
+.SS "Video and Audio file format conversion"
+.IX Subsection "Video and Audio file format conversion"
+Any supported file format and protocol can serve as input to ffmpeg:
+.PP
+Examples:
+.IP "\(bu" 4
+You can use \s-1YUV\s0 files as input:
+.Sp
+.Vb 1
+\& ffmpeg \-i /tmp/test%d.Y /tmp/out.mpg
+.Ve
+.Sp
+It will use the files:
+.Sp
+.Vb 2
+\& /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
+\& /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
+.Ve
+.Sp
+The Y files use twice the resolution of the U and V files. They are
+raw files, without header. They can be generated by all decent video
+decoders. You must specify the size of the image with the \fB\-s\fR option
+if ffmpeg cannot guess it.
+.IP "\(bu" 4
+You can input from a raw \s-1YUV420P\s0 file:
+.Sp
+.Vb 1
+\& ffmpeg \-i /tmp/test.yuv /tmp/out.avi
+.Ve
+.Sp
+test.yuv is a file containing raw \s-1YUV\s0 planar data. Each frame is composed
+of the Y plane followed by the U and V planes at half vertical and
+horizontal resolution.
+.IP "\(bu" 4
+You can output to a raw \s-1YUV420P\s0 file:
+.Sp
+.Vb 1
+\& ffmpeg \-i mydivx.avi hugefile.yuv
+.Ve
+.IP "\(bu" 4
+You can set several input files and output files:
+.Sp
+.Vb 1
+\& ffmpeg \-i /tmp/a.wav \-s 640x480 \-i /tmp/a.yuv /tmp/a.mpg
+.Ve
+.Sp
+Converts the audio file a.wav and the raw \s-1YUV\s0 video file a.yuv
+to \s-1MPEG\s0 file a.mpg.
+.IP "\(bu" 4
+You can also do audio and video conversions at the same time:
+.Sp
+.Vb 1
+\& ffmpeg \-i /tmp/a.wav \-ar 22050 /tmp/a.mp2
+.Ve
+.Sp
+Converts a.wav to \s-1MPEG\s0 audio at 22050 Hz sample rate.
+.IP "\(bu" 4
+You can encode to several formats at the same time and define a
+mapping from input stream to output streams:
+.Sp
+.Vb 1
+\& ffmpeg \-i /tmp/a.wav \-map 0:a \-b:a 64k /tmp/a.mp2 \-map 0:a \-b:a 128k /tmp/b.mp2
+.Ve
+.Sp
+Converts a.wav to a.mp2 at 64 kbits and to b.mp2 at 128 kbits. '\-map
+file:index' specifies which input stream is used for each output
+stream, in the order of the definition of output streams.
+.IP "\(bu" 4
+You can transcode decrypted VOBs:
+.Sp
+.Vb 1
+\& ffmpeg \-i snatch_1.vob \-f avi \-c:v mpeg4 \-b:v 800k \-g 300 \-bf 2 \-c:a libmp3lame \-b:a 128k snatch.avi
+.Ve
+.Sp
+This is a typical \s-1DVD\s0 ripping example; the input is a \s-1VOB\s0 file, the
+output an \s-1AVI\s0 file with \s-1MPEG\-4\s0 video and \s-1MP3\s0 audio. Note that in this
+command we use B\-frames so the \s-1MPEG\-4\s0 stream is DivX5 compatible, and
+\&\s-1GOP\s0 size is 300 which means one intra frame every 10 seconds for 29.97fps
+input video. Furthermore, the audio stream is MP3\-encoded so you need
+to enable \s-1LAME\s0 support by passing \f(CW\*(C`\-\-enable\-libmp3lame\*(C'\fR to configure.
+The mapping is particularly useful for \s-1DVD\s0 transcoding
+to get the desired audio language.
+.Sp
+\&\s-1NOTE:\s0 To see the supported input formats, use \f(CW\*(C`ffmpeg \-demuxers\*(C'\fR.
+.IP "\(bu" 4
+You can extract images from a video, or create a video from many images:
+.Sp
+For extracting images from a video:
+.Sp
+.Vb 1
+\& ffmpeg \-i foo.avi \-r 1 \-s WxH \-f image2 foo\-%03d.jpeg
+.Ve
+.Sp
+This will extract one video frame per second from the video and will
+output them in files named \fIfoo\-001.jpeg\fR, \fIfoo\-002.jpeg\fR,
+etc. Images will be rescaled to fit the new WxH values.
+.Sp
+If you want to extract just a limited number of frames, you can use the
+above command in combination with the \f(CW\*(C`\-frames:v\*(C'\fR or \f(CW\*(C`\-t\*(C'\fR option,
+or in combination with \-ss to start extracting from a certain point in time.
+.Sp
+For creating a video from many images:
+.Sp
+.Vb 1
+\& ffmpeg \-f image2 \-framerate 12 \-i foo\-%03d.jpeg \-s WxH foo.avi
+.Ve
+.Sp
+The syntax \f(CW\*(C`foo\-%03d.jpeg\*(C'\fR specifies to use a decimal number
+composed of three digits padded with zeroes to express the sequence
+number. It is the same syntax supported by the C printf function, but
+only formats accepting a normal integer are suitable.
+.Sp
+When importing an image sequence, \-i also supports expanding
+shell-like wildcard patterns (globbing) internally, by selecting the
+image2\-specific \f(CW\*(C`\-pattern_type glob\*(C'\fR option.
+.Sp
+For example, for creating a video from filenames matching the glob pattern
+\&\f(CW\*(C`foo\-*.jpeg\*(C'\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-f image2 \-pattern_type glob \-framerate 12 \-i \*(Aqfoo\-*.jpeg\*(Aq \-s WxH foo.avi
+.Ve
+.IP "\(bu" 4
+You can put many streams of the same type in the output:
+.Sp
+.Vb 1
+\& ffmpeg \-i test1.avi \-i test2.avi \-map 1:1 \-map 1:0 \-map 0:1 \-map 0:0 \-c copy \-y test12.nut
+.Ve
+.Sp
+The resulting output file \fItest12.nut\fR will contain the first four streams
+from the input files in reverse order.
+.IP "\(bu" 4
+To force \s-1CBR\s0 video output:
+.Sp
+.Vb 1
+\& ffmpeg \-i myfile.avi \-b 4000k \-minrate 4000k \-maxrate 4000k \-bufsize 1835k out.m2v
+.Ve
+.IP "\(bu" 4
+The four options lmin, lmax, mblmin and mblmax use 'lambda' units,
+but you may use the \s-1QP2LAMBDA\s0 constant to easily convert from 'q' units:
+.Sp
+.Vb 1
+\& ffmpeg \-i src.ext \-lmax 21*QP2LAMBDA dst.ext
+.Ve
+.SH "SYNTAX"
+.IX Header "SYNTAX"
+This section documents the syntax and formats employed by the FFmpeg
+libraries and tools.
+.SS "Quoting and escaping"
+.IX Subsection "Quoting and escaping"
+FFmpeg adopts the following quoting and escaping mechanism, unless
+explicitly specified. The following rules are applied:
+.IP "\(bu" 4
+\&\fB'\fR and \fB\e\fR are special characters (respectively used for
+quoting and escaping). In addition to them, there might be other
+special characters depending on the specific syntax where the escaping
+and quoting are employed.
+.IP "\(bu" 4
+A special character is escaped by prefixing it with a \fB\e\fR.
+.IP "\(bu" 4
+All characters enclosed between \fB''\fR are included literally in the
+parsed string. The quote character \fB'\fR itself cannot be quoted,
+so you may need to close the quote and escape it.
+.IP "\(bu" 4
+Leading and trailing whitespaces, unless escaped or quoted, are
+removed from the parsed string.
+.PP
+Note that you may need to add a second level of escaping when using
+the command line or a script, which depends on the syntax of the
+adopted shell language.
+.PP
+The function \f(CW\*(C`av_get_token\*(C'\fR defined in
+\&\fIlibavutil/avstring.h\fR can be used to parse a token quoted or
+escaped according to the rules defined above.
+.PP
+The tool \fItools/ffescape\fR in the FFmpeg source tree can be used
+to automatically quote or escape a string in a script.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Escape the string \f(CW\*(C`Crime d\*(AqAmour\*(C'\fR containing the \f(CW\*(C`\*(Aq\*(C'\fR special
+character:
+.Sp
+.Vb 1
+\& Crime d\e\*(AqAmour
+.Ve
+.IP "\(bu" 4
+The string above contains a quote, so the \f(CW\*(C`\*(Aq\*(C'\fR needs to be escaped
+when quoting it:
+.Sp
+.Vb 1
+\& \*(AqCrime d\*(Aq\e\*(Aq\*(AqAmour\*(Aq
+.Ve
+.IP "\(bu" 4
+Include leading or trailing whitespaces using quoting:
+.Sp
+.Vb 1
+\& \*(Aq this string starts and ends with whitespaces \*(Aq
+.Ve
+.IP "\(bu" 4
+Escaping and quoting can be mixed together:
+.Sp
+.Vb 1
+\& \*(Aq The string \*(Aq\e\*(Aqstring\e\*(Aq\*(Aq is a string \*(Aq
+.Ve
+.IP "\(bu" 4
+To include a literal \fB\e\fR you can use either escaping or quoting:
+.Sp
+.Vb 1
+\& \*(Aqc:\efoo\*(Aq can be written as c:\e\efoo
+.Ve
+.SS "Date"
+.IX Subsection "Date"
+The accepted syntax is:
+.PP
+.Vb 2
+\& [(YYYY\-MM\-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z]
+\& now
+.Ve
+.PP
+If the value is \*(L"now\*(R" it takes the current time.
+.PP
+Time is local time unless Z is appended, in which case it is
+interpreted as \s-1UTC.\s0
+If the year-month-day part is not specified it takes the current
+year-month-day.
+.SS "Time duration"
+.IX Subsection "Time duration"
+There are two accepted syntaxes for expressing time duration.
+.PP
+.Vb 1
+\& [\-][:]:[....]
+.Ve
+.PP
+\&\fI\s-1HH\s0\fR expresses the number of hours, \fI\s-1MM\s0\fR the number of minutes
+for a maximum of 2 digits, and \fI\s-1SS\s0\fR the number of seconds for a
+maximum of 2 digits. The \fIm\fR at the end expresses decimal value for
+\&\fI\s-1SS\s0\fR.
+.PP
+\&\fIor\fR
+.PP
+.Vb 1
+\& [\-]+[....][s|ms|us]
+.Ve
+.PP
+\&\fIS\fR expresses the number of seconds, with the optional decimal part
+\&\fIm\fR. The optional literal suffixes \fBs\fR, \fBms\fR or \fBus\fR
+indicate to interpret the value as seconds, milliseconds or microseconds,
+respectively.
+.PP
+In both expressions, the optional \fB\-\fR indicates negative duration.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+The following examples are all valid time duration:
+.IP "\fB55\fR" 4
+.IX Item "55"
+55 seconds
+.IP "\fB0.2\fR" 4
+.IX Item "0.2"
+0.2 seconds
+.IP "\fB200ms\fR" 4
+.IX Item "200ms"
+200 milliseconds, that's 0.2s
+.IP "\fB200000us\fR" 4
+.IX Item "200000us"
+200000 microseconds, that's 0.2s
+.IP "\fB12:03:45\fR" 4
+.IX Item "12:03:45"
+12 hours, 03 minutes and 45 seconds
+.IP "\fB23.189\fR" 4
+.IX Item "23.189"
+23.189 seconds
+.SS "Video size"
+.IX Subsection "Video size"
+Specify the size of the sourced video, it may be a string of the form
+\&\fIwidth\fRx\fIheight\fR, or the name of a size abbreviation.
+.PP
+The following abbreviations are recognized:
+.IP "\fBntsc\fR" 4
+.IX Item "ntsc"
+720x480
+.IP "\fBpal\fR" 4
+.IX Item "pal"
+720x576
+.IP "\fBqntsc\fR" 4
+.IX Item "qntsc"
+352x240
+.IP "\fBqpal\fR" 4
+.IX Item "qpal"
+352x288
+.IP "\fBsntsc\fR" 4
+.IX Item "sntsc"
+640x480
+.IP "\fBspal\fR" 4
+.IX Item "spal"
+768x576
+.IP "\fBfilm\fR" 4
+.IX Item "film"
+352x240
+.IP "\fBntsc-film\fR" 4
+.IX Item "ntsc-film"
+352x240
+.IP "\fBsqcif\fR" 4
+.IX Item "sqcif"
+128x96
+.IP "\fBqcif\fR" 4
+.IX Item "qcif"
+176x144
+.IP "\fBcif\fR" 4
+.IX Item "cif"
+352x288
+.IP "\fB4cif\fR" 4
+.IX Item "4cif"
+704x576
+.IP "\fB16cif\fR" 4
+.IX Item "16cif"
+1408x1152
+.IP "\fBqqvga\fR" 4
+.IX Item "qqvga"
+160x120
+.IP "\fBqvga\fR" 4
+.IX Item "qvga"
+320x240
+.IP "\fBvga\fR" 4
+.IX Item "vga"
+640x480
+.IP "\fBsvga\fR" 4
+.IX Item "svga"
+800x600
+.IP "\fBxga\fR" 4
+.IX Item "xga"
+1024x768
+.IP "\fBuxga\fR" 4
+.IX Item "uxga"
+1600x1200
+.IP "\fBqxga\fR" 4
+.IX Item "qxga"
+2048x1536
+.IP "\fBsxga\fR" 4
+.IX Item "sxga"
+1280x1024
+.IP "\fBqsxga\fR" 4
+.IX Item "qsxga"
+2560x2048
+.IP "\fBhsxga\fR" 4
+.IX Item "hsxga"
+5120x4096
+.IP "\fBwvga\fR" 4
+.IX Item "wvga"
+852x480
+.IP "\fBwxga\fR" 4
+.IX Item "wxga"
+1366x768
+.IP "\fBwsxga\fR" 4
+.IX Item "wsxga"
+1600x1024
+.IP "\fBwuxga\fR" 4
+.IX Item "wuxga"
+1920x1200
+.IP "\fBwoxga\fR" 4
+.IX Item "woxga"
+2560x1600
+.IP "\fBwqsxga\fR" 4
+.IX Item "wqsxga"
+3200x2048
+.IP "\fBwquxga\fR" 4
+.IX Item "wquxga"
+3840x2400
+.IP "\fBwhsxga\fR" 4
+.IX Item "whsxga"
+6400x4096
+.IP "\fBwhuxga\fR" 4
+.IX Item "whuxga"
+7680x4800
+.IP "\fBcga\fR" 4
+.IX Item "cga"
+320x200
+.IP "\fBega\fR" 4
+.IX Item "ega"
+640x350
+.IP "\fBhd480\fR" 4
+.IX Item "hd480"
+852x480
+.IP "\fBhd720\fR" 4
+.IX Item "hd720"
+1280x720
+.IP "\fBhd1080\fR" 4
+.IX Item "hd1080"
+1920x1080
+.IP "\fB2k\fR" 4
+.IX Item "2k"
+2048x1080
+.IP "\fB2kflat\fR" 4
+.IX Item "2kflat"
+1998x1080
+.IP "\fB2kscope\fR" 4
+.IX Item "2kscope"
+2048x858
+.IP "\fB4k\fR" 4
+.IX Item "4k"
+4096x2160
+.IP "\fB4kflat\fR" 4
+.IX Item "4kflat"
+3996x2160
+.IP "\fB4kscope\fR" 4
+.IX Item "4kscope"
+4096x1716
+.IP "\fBnhd\fR" 4
+.IX Item "nhd"
+640x360
+.IP "\fBhqvga\fR" 4
+.IX Item "hqvga"
+240x160
+.IP "\fBwqvga\fR" 4
+.IX Item "wqvga"
+400x240
+.IP "\fBfwqvga\fR" 4
+.IX Item "fwqvga"
+432x240
+.IP "\fBhvga\fR" 4
+.IX Item "hvga"
+480x320
+.IP "\fBqhd\fR" 4
+.IX Item "qhd"
+960x540
+.IP "\fB2kdci\fR" 4
+.IX Item "2kdci"
+2048x1080
+.IP "\fB4kdci\fR" 4
+.IX Item "4kdci"
+4096x2160
+.IP "\fBuhd2160\fR" 4
+.IX Item "uhd2160"
+3840x2160
+.IP "\fBuhd4320\fR" 4
+.IX Item "uhd4320"
+7680x4320
+.SS "Video rate"
+.IX Subsection "Video rate"
+Specify the frame rate of a video, expressed as the number of frames
+generated per second. It has to be a string in the format
+\&\fIframe_rate_num\fR/\fIframe_rate_den\fR, an integer number, a float
+number or a valid video frame rate abbreviation.
+.PP
+The following abbreviations are recognized:
+.IP "\fBntsc\fR" 4
+.IX Item "ntsc"
+30000/1001
+.IP "\fBpal\fR" 4
+.IX Item "pal"
+25/1
+.IP "\fBqntsc\fR" 4
+.IX Item "qntsc"
+30000/1001
+.IP "\fBqpal\fR" 4
+.IX Item "qpal"
+25/1
+.IP "\fBsntsc\fR" 4
+.IX Item "sntsc"
+30000/1001
+.IP "\fBspal\fR" 4
+.IX Item "spal"
+25/1
+.IP "\fBfilm\fR" 4
+.IX Item "film"
+24/1
+.IP "\fBntsc-film\fR" 4
+.IX Item "ntsc-film"
+24000/1001
+.SS "Ratio"
+.IX Subsection "Ratio"
+A ratio can be expressed as an expression, or in the form
+\&\fInumerator\fR:\fIdenominator\fR.
+.PP
+Note that a ratio with infinite (1/0) or negative value is
+considered valid, so you should check on the returned value if you
+want to exclude those values.
+.PP
+The undefined value can be expressed using the \*(L"0:0\*(R" string.
+.SS "Color"
+.IX Subsection "Color"
+It can be the name of a color as defined below (case insensitive match) or a
+\&\f(CW\*(C`[0x|#]RRGGBB[AA]\*(C'\fR sequence, possibly followed by @ and a string
+representing the alpha component.
+.PP
+The alpha component may be a string composed by \*(L"0x\*(R" followed by an
+hexadecimal number or a decimal number between 0.0 and 1.0, which
+represents the opacity value (\fB0x00\fR or \fB0.0\fR means completely
+transparent, \fB0xff\fR or \fB1.0\fR completely opaque). If the alpha
+component is not specified then \fB0xff\fR is assumed.
+.PP
+The string \fBrandom\fR will result in a random color.
+.PP
+The following names of colors are recognized:
+.IP "\fBAliceBlue\fR" 4
+.IX Item "AliceBlue"
+0xF0F8FF
+.IP "\fBAntiqueWhite\fR" 4
+.IX Item "AntiqueWhite"
+0xFAEBD7
+.IP "\fBAqua\fR" 4
+.IX Item "Aqua"
+0x00FFFF
+.IP "\fBAquamarine\fR" 4
+.IX Item "Aquamarine"
+0x7FFFD4
+.IP "\fBAzure\fR" 4
+.IX Item "Azure"
+0xF0FFFF
+.IP "\fBBeige\fR" 4
+.IX Item "Beige"
+0xF5F5DC
+.IP "\fBBisque\fR" 4
+.IX Item "Bisque"
+0xFFE4C4
+.IP "\fBBlack\fR" 4
+.IX Item "Black"
+0x000000
+.IP "\fBBlanchedAlmond\fR" 4
+.IX Item "BlanchedAlmond"
+0xFFEBCD
+.IP "\fBBlue\fR" 4
+.IX Item "Blue"
+0x0000FF
+.IP "\fBBlueViolet\fR" 4
+.IX Item "BlueViolet"
+0x8A2BE2
+.IP "\fBBrown\fR" 4
+.IX Item "Brown"
+0xA52A2A
+.IP "\fBBurlyWood\fR" 4
+.IX Item "BurlyWood"
+0xDEB887
+.IP "\fBCadetBlue\fR" 4
+.IX Item "CadetBlue"
+0x5F9EA0
+.IP "\fBChartreuse\fR" 4
+.IX Item "Chartreuse"
+0x7FFF00
+.IP "\fBChocolate\fR" 4
+.IX Item "Chocolate"
+0xD2691E
+.IP "\fBCoral\fR" 4
+.IX Item "Coral"
+0xFF7F50
+.IP "\fBCornflowerBlue\fR" 4
+.IX Item "CornflowerBlue"
+0x6495ED
+.IP "\fBCornsilk\fR" 4
+.IX Item "Cornsilk"
+0xFFF8DC
+.IP "\fBCrimson\fR" 4
+.IX Item "Crimson"
+0xDC143C
+.IP "\fBCyan\fR" 4
+.IX Item "Cyan"
+0x00FFFF
+.IP "\fBDarkBlue\fR" 4
+.IX Item "DarkBlue"
+0x00008B
+.IP "\fBDarkCyan\fR" 4
+.IX Item "DarkCyan"
+0x008B8B
+.IP "\fBDarkGoldenRod\fR" 4
+.IX Item "DarkGoldenRod"
+0xB8860B
+.IP "\fBDarkGray\fR" 4
+.IX Item "DarkGray"
+0xA9A9A9
+.IP "\fBDarkGreen\fR" 4
+.IX Item "DarkGreen"
+0x006400
+.IP "\fBDarkKhaki\fR" 4
+.IX Item "DarkKhaki"
+0xBDB76B
+.IP "\fBDarkMagenta\fR" 4
+.IX Item "DarkMagenta"
+0x8B008B
+.IP "\fBDarkOliveGreen\fR" 4
+.IX Item "DarkOliveGreen"
+0x556B2F
+.IP "\fBDarkorange\fR" 4
+.IX Item "Darkorange"
+0xFF8C00
+.IP "\fBDarkOrchid\fR" 4
+.IX Item "DarkOrchid"
+0x9932CC
+.IP "\fBDarkRed\fR" 4
+.IX Item "DarkRed"
+0x8B0000
+.IP "\fBDarkSalmon\fR" 4
+.IX Item "DarkSalmon"
+0xE9967A
+.IP "\fBDarkSeaGreen\fR" 4
+.IX Item "DarkSeaGreen"
+0x8FBC8F
+.IP "\fBDarkSlateBlue\fR" 4
+.IX Item "DarkSlateBlue"
+0x483D8B
+.IP "\fBDarkSlateGray\fR" 4
+.IX Item "DarkSlateGray"
+0x2F4F4F
+.IP "\fBDarkTurquoise\fR" 4
+.IX Item "DarkTurquoise"
+0x00CED1
+.IP "\fBDarkViolet\fR" 4
+.IX Item "DarkViolet"
+0x9400D3
+.IP "\fBDeepPink\fR" 4
+.IX Item "DeepPink"
+0xFF1493
+.IP "\fBDeepSkyBlue\fR" 4
+.IX Item "DeepSkyBlue"
+0x00BFFF
+.IP "\fBDimGray\fR" 4
+.IX Item "DimGray"
+0x696969
+.IP "\fBDodgerBlue\fR" 4
+.IX Item "DodgerBlue"
+0x1E90FF
+.IP "\fBFireBrick\fR" 4
+.IX Item "FireBrick"
+0xB22222
+.IP "\fBFloralWhite\fR" 4
+.IX Item "FloralWhite"
+0xFFFAF0
+.IP "\fBForestGreen\fR" 4
+.IX Item "ForestGreen"
+0x228B22
+.IP "\fBFuchsia\fR" 4
+.IX Item "Fuchsia"
+0xFF00FF
+.IP "\fBGainsboro\fR" 4
+.IX Item "Gainsboro"
+0xDCDCDC
+.IP "\fBGhostWhite\fR" 4
+.IX Item "GhostWhite"
+0xF8F8FF
+.IP "\fBGold\fR" 4
+.IX Item "Gold"
+0xFFD700
+.IP "\fBGoldenRod\fR" 4
+.IX Item "GoldenRod"
+0xDAA520
+.IP "\fBGray\fR" 4
+.IX Item "Gray"
+0x808080
+.IP "\fBGreen\fR" 4
+.IX Item "Green"
+0x008000
+.IP "\fBGreenYellow\fR" 4
+.IX Item "GreenYellow"
+0xADFF2F
+.IP "\fBHoneyDew\fR" 4
+.IX Item "HoneyDew"
+0xF0FFF0
+.IP "\fBHotPink\fR" 4
+.IX Item "HotPink"
+0xFF69B4
+.IP "\fBIndianRed\fR" 4
+.IX Item "IndianRed"
+0xCD5C5C
+.IP "\fBIndigo\fR" 4
+.IX Item "Indigo"
+0x4B0082
+.IP "\fBIvory\fR" 4
+.IX Item "Ivory"
+0xFFFFF0
+.IP "\fBKhaki\fR" 4
+.IX Item "Khaki"
+0xF0E68C
+.IP "\fBLavender\fR" 4
+.IX Item "Lavender"
+0xE6E6FA
+.IP "\fBLavenderBlush\fR" 4
+.IX Item "LavenderBlush"
+0xFFF0F5
+.IP "\fBLawnGreen\fR" 4
+.IX Item "LawnGreen"
+0x7CFC00
+.IP "\fBLemonChiffon\fR" 4
+.IX Item "LemonChiffon"
+0xFFFACD
+.IP "\fBLightBlue\fR" 4
+.IX Item "LightBlue"
+0xADD8E6
+.IP "\fBLightCoral\fR" 4
+.IX Item "LightCoral"
+0xF08080
+.IP "\fBLightCyan\fR" 4
+.IX Item "LightCyan"
+0xE0FFFF
+.IP "\fBLightGoldenRodYellow\fR" 4
+.IX Item "LightGoldenRodYellow"
+0xFAFAD2
+.IP "\fBLightGreen\fR" 4
+.IX Item "LightGreen"
+0x90EE90
+.IP "\fBLightGrey\fR" 4
+.IX Item "LightGrey"
+0xD3D3D3
+.IP "\fBLightPink\fR" 4
+.IX Item "LightPink"
+0xFFB6C1
+.IP "\fBLightSalmon\fR" 4
+.IX Item "LightSalmon"
+0xFFA07A
+.IP "\fBLightSeaGreen\fR" 4
+.IX Item "LightSeaGreen"
+0x20B2AA
+.IP "\fBLightSkyBlue\fR" 4
+.IX Item "LightSkyBlue"
+0x87CEFA
+.IP "\fBLightSlateGray\fR" 4
+.IX Item "LightSlateGray"
+0x778899
+.IP "\fBLightSteelBlue\fR" 4
+.IX Item "LightSteelBlue"
+0xB0C4DE
+.IP "\fBLightYellow\fR" 4
+.IX Item "LightYellow"
+0xFFFFE0
+.IP "\fBLime\fR" 4
+.IX Item "Lime"
+0x00FF00
+.IP "\fBLimeGreen\fR" 4
+.IX Item "LimeGreen"
+0x32CD32
+.IP "\fBLinen\fR" 4
+.IX Item "Linen"
+0xFAF0E6
+.IP "\fBMagenta\fR" 4
+.IX Item "Magenta"
+0xFF00FF
+.IP "\fBMaroon\fR" 4
+.IX Item "Maroon"
+0x800000
+.IP "\fBMediumAquaMarine\fR" 4
+.IX Item "MediumAquaMarine"
+0x66CDAA
+.IP "\fBMediumBlue\fR" 4
+.IX Item "MediumBlue"
+0x0000CD
+.IP "\fBMediumOrchid\fR" 4
+.IX Item "MediumOrchid"
+0xBA55D3
+.IP "\fBMediumPurple\fR" 4
+.IX Item "MediumPurple"
+0x9370D8
+.IP "\fBMediumSeaGreen\fR" 4
+.IX Item "MediumSeaGreen"
+0x3CB371
+.IP "\fBMediumSlateBlue\fR" 4
+.IX Item "MediumSlateBlue"
+0x7B68EE
+.IP "\fBMediumSpringGreen\fR" 4
+.IX Item "MediumSpringGreen"
+0x00FA9A
+.IP "\fBMediumTurquoise\fR" 4
+.IX Item "MediumTurquoise"
+0x48D1CC
+.IP "\fBMediumVioletRed\fR" 4
+.IX Item "MediumVioletRed"
+0xC71585
+.IP "\fBMidnightBlue\fR" 4
+.IX Item "MidnightBlue"
+0x191970
+.IP "\fBMintCream\fR" 4
+.IX Item "MintCream"
+0xF5FFFA
+.IP "\fBMistyRose\fR" 4
+.IX Item "MistyRose"
+0xFFE4E1
+.IP "\fBMoccasin\fR" 4
+.IX Item "Moccasin"
+0xFFE4B5
+.IP "\fBNavajoWhite\fR" 4
+.IX Item "NavajoWhite"
+0xFFDEAD
+.IP "\fBNavy\fR" 4
+.IX Item "Navy"
+0x000080
+.IP "\fBOldLace\fR" 4
+.IX Item "OldLace"
+0xFDF5E6
+.IP "\fBOlive\fR" 4
+.IX Item "Olive"
+0x808000
+.IP "\fBOliveDrab\fR" 4
+.IX Item "OliveDrab"
+0x6B8E23
+.IP "\fBOrange\fR" 4
+.IX Item "Orange"
+0xFFA500
+.IP "\fBOrangeRed\fR" 4
+.IX Item "OrangeRed"
+0xFF4500
+.IP "\fBOrchid\fR" 4
+.IX Item "Orchid"
+0xDA70D6
+.IP "\fBPaleGoldenRod\fR" 4
+.IX Item "PaleGoldenRod"
+0xEEE8AA
+.IP "\fBPaleGreen\fR" 4
+.IX Item "PaleGreen"
+0x98FB98
+.IP "\fBPaleTurquoise\fR" 4
+.IX Item "PaleTurquoise"
+0xAFEEEE
+.IP "\fBPaleVioletRed\fR" 4
+.IX Item "PaleVioletRed"
+0xD87093
+.IP "\fBPapayaWhip\fR" 4
+.IX Item "PapayaWhip"
+0xFFEFD5
+.IP "\fBPeachPuff\fR" 4
+.IX Item "PeachPuff"
+0xFFDAB9
+.IP "\fBPeru\fR" 4
+.IX Item "Peru"
+0xCD853F
+.IP "\fBPink\fR" 4
+.IX Item "Pink"
+0xFFC0CB
+.IP "\fBPlum\fR" 4
+.IX Item "Plum"
+0xDDA0DD
+.IP "\fBPowderBlue\fR" 4
+.IX Item "PowderBlue"
+0xB0E0E6
+.IP "\fBPurple\fR" 4
+.IX Item "Purple"
+0x800080
+.IP "\fBRed\fR" 4
+.IX Item "Red"
+0xFF0000
+.IP "\fBRosyBrown\fR" 4
+.IX Item "RosyBrown"
+0xBC8F8F
+.IP "\fBRoyalBlue\fR" 4
+.IX Item "RoyalBlue"
+0x4169E1
+.IP "\fBSaddleBrown\fR" 4
+.IX Item "SaddleBrown"
+0x8B4513
+.IP "\fBSalmon\fR" 4
+.IX Item "Salmon"
+0xFA8072
+.IP "\fBSandyBrown\fR" 4
+.IX Item "SandyBrown"
+0xF4A460
+.IP "\fBSeaGreen\fR" 4
+.IX Item "SeaGreen"
+0x2E8B57
+.IP "\fBSeaShell\fR" 4
+.IX Item "SeaShell"
+0xFFF5EE
+.IP "\fBSienna\fR" 4
+.IX Item "Sienna"
+0xA0522D
+.IP "\fBSilver\fR" 4
+.IX Item "Silver"
+0xC0C0C0
+.IP "\fBSkyBlue\fR" 4
+.IX Item "SkyBlue"
+0x87CEEB
+.IP "\fBSlateBlue\fR" 4
+.IX Item "SlateBlue"
+0x6A5ACD
+.IP "\fBSlateGray\fR" 4
+.IX Item "SlateGray"
+0x708090
+.IP "\fBSnow\fR" 4
+.IX Item "Snow"
+0xFFFAFA
+.IP "\fBSpringGreen\fR" 4
+.IX Item "SpringGreen"
+0x00FF7F
+.IP "\fBSteelBlue\fR" 4
+.IX Item "SteelBlue"
+0x4682B4
+.IP "\fBTan\fR" 4
+.IX Item "Tan"
+0xD2B48C
+.IP "\fBTeal\fR" 4
+.IX Item "Teal"
+0x008080
+.IP "\fBThistle\fR" 4
+.IX Item "Thistle"
+0xD8BFD8
+.IP "\fBTomato\fR" 4
+.IX Item "Tomato"
+0xFF6347
+.IP "\fBTurquoise\fR" 4
+.IX Item "Turquoise"
+0x40E0D0
+.IP "\fBViolet\fR" 4
+.IX Item "Violet"
+0xEE82EE
+.IP "\fBWheat\fR" 4
+.IX Item "Wheat"
+0xF5DEB3
+.IP "\fBWhite\fR" 4
+.IX Item "White"
+0xFFFFFF
+.IP "\fBWhiteSmoke\fR" 4
+.IX Item "WhiteSmoke"
+0xF5F5F5
+.IP "\fBYellow\fR" 4
+.IX Item "Yellow"
+0xFFFF00
+.IP "\fBYellowGreen\fR" 4
+.IX Item "YellowGreen"
+0x9ACD32
+.SS "Channel Layout"
+.IX Subsection "Channel Layout"
+A channel layout specifies the spatial disposition of the channels in
+a multi-channel audio stream. To specify a channel layout, FFmpeg
+makes use of a special syntax.
+.PP
+Individual channels are identified by an id, as given by the table
+below:
+.IP "\fB\s-1FL\s0\fR" 4
+.IX Item "FL"
+front left
+.IP "\fB\s-1FR\s0\fR" 4
+.IX Item "FR"
+front right
+.IP "\fB\s-1FC\s0\fR" 4
+.IX Item "FC"
+front center
+.IP "\fB\s-1LFE\s0\fR" 4
+.IX Item "LFE"
+low frequency
+.IP "\fB\s-1BL\s0\fR" 4
+.IX Item "BL"
+back left
+.IP "\fB\s-1BR\s0\fR" 4
+.IX Item "BR"
+back right
+.IP "\fB\s-1FLC\s0\fR" 4
+.IX Item "FLC"
+front left-of-center
+.IP "\fB\s-1FRC\s0\fR" 4
+.IX Item "FRC"
+front right-of-center
+.IP "\fB\s-1BC\s0\fR" 4
+.IX Item "BC"
+back center
+.IP "\fB\s-1SL\s0\fR" 4
+.IX Item "SL"
+side left
+.IP "\fB\s-1SR\s0\fR" 4
+.IX Item "SR"
+side right
+.IP "\fB\s-1TC\s0\fR" 4
+.IX Item "TC"
+top center
+.IP "\fB\s-1TFL\s0\fR" 4
+.IX Item "TFL"
+top front left
+.IP "\fB\s-1TFC\s0\fR" 4
+.IX Item "TFC"
+top front center
+.IP "\fB\s-1TFR\s0\fR" 4
+.IX Item "TFR"
+top front right
+.IP "\fB\s-1TBL\s0\fR" 4
+.IX Item "TBL"
+top back left
+.IP "\fB\s-1TBC\s0\fR" 4
+.IX Item "TBC"
+top back center
+.IP "\fB\s-1TBR\s0\fR" 4
+.IX Item "TBR"
+top back right
+.IP "\fB\s-1DL\s0\fR" 4
+.IX Item "DL"
+downmix left
+.IP "\fB\s-1DR\s0\fR" 4
+.IX Item "DR"
+downmix right
+.IP "\fB\s-1WL\s0\fR" 4
+.IX Item "WL"
+wide left
+.IP "\fB\s-1WR\s0\fR" 4
+.IX Item "WR"
+wide right
+.IP "\fB\s-1SDL\s0\fR" 4
+.IX Item "SDL"
+surround direct left
+.IP "\fB\s-1SDR\s0\fR" 4
+.IX Item "SDR"
+surround direct right
+.IP "\fB\s-1LFE2\s0\fR" 4
+.IX Item "LFE2"
+low frequency 2
+.PP
+Standard channel layout compositions can be specified by using the
+following identifiers:
+.IP "\fBmono\fR" 4
+.IX Item "mono"
+\&\s-1FC\s0
+.IP "\fBstereo\fR" 4
+.IX Item "stereo"
+\&\s-1FL+FR\s0
+.IP "\fB2.1\fR" 4
+.IX Item "2.1"
+\&\s-1FL+FR+LFE\s0
+.IP "\fB3.0\fR" 4
+.IX Item "3.0"
+\&\s-1FL+FR+FC\s0
+.IP "\fB3.0(back)\fR" 4
+.IX Item "3.0(back)"
+\&\s-1FL+FR+BC\s0
+.IP "\fB4.0\fR" 4
+.IX Item "4.0"
+\&\s-1FL+FR+FC+BC\s0
+.IP "\fBquad\fR" 4
+.IX Item "quad"
+\&\s-1FL+FR+BL+BR\s0
+.IP "\fBquad(side)\fR" 4
+.IX Item "quad(side)"
+\&\s-1FL+FR+SL+SR\s0
+.IP "\fB3.1\fR" 4
+.IX Item "3.1"
+\&\s-1FL+FR+FC+LFE\s0
+.IP "\fB5.0\fR" 4
+.IX Item "5.0"
+\&\s-1FL+FR+FC+BL+BR\s0
+.IP "\fB5.0(side)\fR" 4
+.IX Item "5.0(side)"
+\&\s-1FL+FR+FC+SL+SR\s0
+.IP "\fB4.1\fR" 4
+.IX Item "4.1"
+\&\s-1FL+FR+FC+LFE+BC\s0
+.IP "\fB5.1\fR" 4
+.IX Item "5.1"
+\&\s-1FL+FR+FC+LFE+BL+BR\s0
+.IP "\fB5.1(side)\fR" 4
+.IX Item "5.1(side)"
+\&\s-1FL+FR+FC+LFE+SL+SR\s0
+.IP "\fB6.0\fR" 4
+.IX Item "6.0"
+\&\s-1FL+FR+FC+BC+SL+SR\s0
+.IP "\fB6.0(front)\fR" 4
+.IX Item "6.0(front)"
+\&\s-1FL+FR+FLC+FRC+SL+SR\s0
+.IP "\fBhexagonal\fR" 4
+.IX Item "hexagonal"
+\&\s-1FL+FR+FC+BL+BR+BC\s0
+.IP "\fB6.1\fR" 4
+.IX Item "6.1"
+\&\s-1FL+FR+FC+LFE+BC+SL+SR\s0
+.IP "\fB6.1\fR" 4
+.IX Item "6.1"
+\&\s-1FL+FR+FC+LFE+BL+BR+BC\s0
+.IP "\fB6.1(front)\fR" 4
+.IX Item "6.1(front)"
+\&\s-1FL+FR+LFE+FLC+FRC+SL+SR\s0
+.IP "\fB7.0\fR" 4
+.IX Item "7.0"
+\&\s-1FL+FR+FC+BL+BR+SL+SR\s0
+.IP "\fB7.0(front)\fR" 4
+.IX Item "7.0(front)"
+\&\s-1FL+FR+FC+FLC+FRC+SL+SR\s0
+.IP "\fB7.1\fR" 4
+.IX Item "7.1"
+\&\s-1FL+FR+FC+LFE+BL+BR+SL+SR\s0
+.IP "\fB7.1(wide)\fR" 4
+.IX Item "7.1(wide)"
+\&\s-1FL+FR+FC+LFE+BL+BR+FLC+FRC\s0
+.IP "\fB7.1(wide\-side)\fR" 4
+.IX Item "7.1(wide-side)"
+\&\s-1FL+FR+FC+LFE+FLC+FRC+SL+SR\s0
+.IP "\fBoctagonal\fR" 4
+.IX Item "octagonal"
+\&\s-1FL+FR+FC+BL+BR+BC+SL+SR\s0
+.IP "\fBhexadecagonal\fR" 4
+.IX Item "hexadecagonal"
+\&\s-1FL+FR+FC+BL+BR+BC+SL+SR+WL+WR+TBL+TBR+TBC+TFC+TFL+TFR\s0
+.IP "\fBdownmix\fR" 4
+.IX Item "downmix"
+\&\s-1DL+DR\s0
+.PP
+A custom channel layout can be specified as a sequence of terms, separated by
+\&'+' or '|'. Each term can be:
+.IP "\(bu" 4
+the name of a standard channel layout (e.g. \fBmono\fR,
+\&\fBstereo\fR, \fB4.0\fR, \fBquad\fR, \fB5.0\fR, etc.)
+.IP "\(bu" 4
+the name of a single channel (e.g. \fB\s-1FL\s0\fR, \fB\s-1FR\s0\fR, \fB\s-1FC\s0\fR, \fB\s-1LFE\s0\fR, etc.)
+.IP "\(bu" 4
+a number of channels, in decimal, followed by 'c', yielding the default channel
+layout for that number of channels (see the function
+\&\f(CW\*(C`av_get_default_channel_layout\*(C'\fR). Note that not all channel counts have a
+default layout.
+.IP "\(bu" 4
+a number of channels, in decimal, followed by 'C', yielding an unknown channel
+layout with the specified number of channels. Note that not all channel layout
+specification strings support unknown channel layouts.
+.IP "\(bu" 4
+a channel layout mask, in hexadecimal starting with \*(L"0x\*(R" (see the
+\&\f(CW\*(C`AV_CH_*\*(C'\fR macros in \fIlibavutil/channel_layout.h\fR.
+.PP
+Before libavutil version 53 the trailing character \*(L"c\*(R" to specify a number of
+channels was optional, but now it is required, while a channel layout mask can
+also be specified as a decimal number (if and only if not followed by \*(L"c\*(R" or \*(L"C\*(R").
+.PP
+See also the function \f(CW\*(C`av_get_channel_layout\*(C'\fR defined in
+\&\fIlibavutil/channel_layout.h\fR.
+.SH "EXPRESSION EVALUATION"
+.IX Header "EXPRESSION EVALUATION"
+When evaluating an arithmetic expression, FFmpeg uses an internal
+formula evaluator, implemented through the \fIlibavutil/eval.h\fR
+interface.
+.PP
+An expression may contain unary, binary operators, constants, and
+functions.
+.PP
+Two expressions \fIexpr1\fR and \fIexpr2\fR can be combined to form
+another expression "\fIexpr1\fR;\fIexpr2\fR".
+\&\fIexpr1\fR and \fIexpr2\fR are evaluated in turn, and the new
+expression evaluates to the value of \fIexpr2\fR.
+.PP
+The following binary operators are available: \f(CW\*(C`+\*(C'\fR, \f(CW\*(C`\-\*(C'\fR,
+\&\f(CW\*(C`*\*(C'\fR, \f(CW\*(C`/\*(C'\fR, \f(CW\*(C`^\*(C'\fR.
+.PP
+The following unary operators are available: \f(CW\*(C`+\*(C'\fR, \f(CW\*(C`\-\*(C'\fR.
+.PP
+The following functions are available:
+.IP "\fBabs(x)\fR" 4
+.IX Item "abs(x)"
+Compute absolute value of \fIx\fR.
+.IP "\fBacos(x)\fR" 4
+.IX Item "acos(x)"
+Compute arccosine of \fIx\fR.
+.IP "\fBasin(x)\fR" 4
+.IX Item "asin(x)"
+Compute arcsine of \fIx\fR.
+.IP "\fBatan(x)\fR" 4
+.IX Item "atan(x)"
+Compute arctangent of \fIx\fR.
+.IP "\fBatan2(x, y)\fR" 4
+.IX Item "atan2(x, y)"
+Compute principal value of the arc tangent of \fIy\fR/\fIx\fR.
+.IP "\fBbetween(x, min, max)\fR" 4
+.IX Item "between(x, min, max)"
+Return 1 if \fIx\fR is greater than or equal to \fImin\fR and lesser than or
+equal to \fImax\fR, 0 otherwise.
+.IP "\fBbitand(x, y)\fR" 4
+.IX Item "bitand(x, y)"
+.PD 0
+.IP "\fBbitor(x, y)\fR" 4
+.IX Item "bitor(x, y)"
+.PD
+Compute bitwise and/or operation on \fIx\fR and \fIy\fR.
+.Sp
+The results of the evaluation of \fIx\fR and \fIy\fR are converted to
+integers before executing the bitwise operation.
+.Sp
+Note that both the conversion to integer and the conversion back to
+floating point can lose precision. Beware of unexpected results for
+large numbers (usually 2^53 and larger).
+.IP "\fBceil(expr)\fR" 4
+.IX Item "ceil(expr)"
+Round the value of expression \fIexpr\fR upwards to the nearest
+integer. For example, \*(L"ceil(1.5)\*(R" is \*(L"2.0\*(R".
+.IP "\fBclip(x, min, max)\fR" 4
+.IX Item "clip(x, min, max)"
+Return the value of \fIx\fR clipped between \fImin\fR and \fImax\fR.
+.IP "\fBcos(x)\fR" 4
+.IX Item "cos(x)"
+Compute cosine of \fIx\fR.
+.IP "\fBcosh(x)\fR" 4
+.IX Item "cosh(x)"
+Compute hyperbolic cosine of \fIx\fR.
+.IP "\fBeq(x, y)\fR" 4
+.IX Item "eq(x, y)"
+Return 1 if \fIx\fR and \fIy\fR are equivalent, 0 otherwise.
+.IP "\fBexp(x)\fR" 4
+.IX Item "exp(x)"
+Compute exponential of \fIx\fR (with base \f(CW\*(C`e\*(C'\fR, the Euler's number).
+.IP "\fBfloor(expr)\fR" 4
+.IX Item "floor(expr)"
+Round the value of expression \fIexpr\fR downwards to the nearest
+integer. For example, \*(L"floor(\-1.5)\*(R" is \*(L"\-2.0\*(R".
+.IP "\fBgauss(x)\fR" 4
+.IX Item "gauss(x)"
+Compute Gauss function of \fIx\fR, corresponding to
+\&\f(CW\*(C`exp(\-x*x/2) / sqrt(2*PI)\*(C'\fR.
+.IP "\fBgcd(x, y)\fR" 4
+.IX Item "gcd(x, y)"
+Return the greatest common divisor of \fIx\fR and \fIy\fR. If both \fIx\fR and
+\&\fIy\fR are 0 or either or both are less than zero then behavior is undefined.
+.IP "\fBgt(x, y)\fR" 4
+.IX Item "gt(x, y)"
+Return 1 if \fIx\fR is greater than \fIy\fR, 0 otherwise.
+.IP "\fBgte(x, y)\fR" 4
+.IX Item "gte(x, y)"
+Return 1 if \fIx\fR is greater than or equal to \fIy\fR, 0 otherwise.
+.IP "\fBhypot(x, y)\fR" 4
+.IX Item "hypot(x, y)"
+This function is similar to the C function with the same name; it returns
+"sqrt(\fIx\fR*\fIx\fR + \fIy\fR*\fIy\fR)", the length of the hypotenuse of a
+right triangle with sides of length \fIx\fR and \fIy\fR, or the distance of the
+point (\fIx\fR, \fIy\fR) from the origin.
+.IP "\fBif(x, y)\fR" 4
+.IX Item "if(x, y)"
+Evaluate \fIx\fR, and if the result is non-zero return the result of
+the evaluation of \fIy\fR, return 0 otherwise.
+.IP "\fBif(x, y, z)\fR" 4
+.IX Item "if(x, y, z)"
+Evaluate \fIx\fR, and if the result is non-zero return the evaluation
+result of \fIy\fR, otherwise the evaluation result of \fIz\fR.
+.IP "\fBifnot(x, y)\fR" 4
+.IX Item "ifnot(x, y)"
+Evaluate \fIx\fR, and if the result is zero return the result of the
+evaluation of \fIy\fR, return 0 otherwise.
+.IP "\fBifnot(x, y, z)\fR" 4
+.IX Item "ifnot(x, y, z)"
+Evaluate \fIx\fR, and if the result is zero return the evaluation
+result of \fIy\fR, otherwise the evaluation result of \fIz\fR.
+.IP "\fBisinf(x)\fR" 4
+.IX Item "isinf(x)"
+Return 1.0 if \fIx\fR is +/\-INFINITY, 0.0 otherwise.
+.IP "\fBisnan(x)\fR" 4
+.IX Item "isnan(x)"
+Return 1.0 if \fIx\fR is \s-1NAN, 0.0\s0 otherwise.
+.IP "\fBld(var)\fR" 4
+.IX Item "ld(var)"
+Load the value of the internal variable with number
+\&\fIvar\fR, which was previously stored with st(\fIvar\fR, \fIexpr\fR).
+The function returns the loaded value.
+.IP "\fBlerp(x, y, z)\fR" 4
+.IX Item "lerp(x, y, z)"
+Return linear interpolation between \fIx\fR and \fIy\fR by amount of \fIz\fR.
+.IP "\fBlog(x)\fR" 4
+.IX Item "log(x)"
+Compute natural logarithm of \fIx\fR.
+.IP "\fBlt(x, y)\fR" 4
+.IX Item "lt(x, y)"
+Return 1 if \fIx\fR is lesser than \fIy\fR, 0 otherwise.
+.IP "\fBlte(x, y)\fR" 4
+.IX Item "lte(x, y)"
+Return 1 if \fIx\fR is lesser than or equal to \fIy\fR, 0 otherwise.
+.IP "\fBmax(x, y)\fR" 4
+.IX Item "max(x, y)"
+Return the maximum between \fIx\fR and \fIy\fR.
+.IP "\fBmin(x, y)\fR" 4
+.IX Item "min(x, y)"
+Return the minimum between \fIx\fR and \fIy\fR.
+.IP "\fBmod(x, y)\fR" 4
+.IX Item "mod(x, y)"
+Compute the remainder of division of \fIx\fR by \fIy\fR.
+.IP "\fBnot(expr)\fR" 4
+.IX Item "not(expr)"
+Return 1.0 if \fIexpr\fR is zero, 0.0 otherwise.
+.IP "\fBpow(x, y)\fR" 4
+.IX Item "pow(x, y)"
+Compute the power of \fIx\fR elevated \fIy\fR, it is equivalent to
+"(\fIx\fR)^(\fIy\fR)".
+.IP "\fBprint(t)\fR" 4
+.IX Item "print(t)"
+.PD 0
+.IP "\fBprint(t, l)\fR" 4
+.IX Item "print(t, l)"
+.PD
+Print the value of expression \fIt\fR with loglevel \fIl\fR. If
+\&\fIl\fR is not specified then a default log level is used.
+Returns the value of the expression printed.
+.Sp
+Prints t with loglevel l
+.IP "\fBrandom(x)\fR" 4
+.IX Item "random(x)"
+Return a pseudo random value between 0.0 and 1.0. \fIx\fR is the index of the
+internal variable which will be used to save the seed/state.
+.IP "\fBroot(expr, max)\fR" 4
+.IX Item "root(expr, max)"
+Find an input value for which the function represented by \fIexpr\fR
+with argument \fI\f(BIld\fI\|(0)\fR is 0 in the interval 0..\fImax\fR.
+.Sp
+The expression in \fIexpr\fR must denote a continuous function or the
+result is undefined.
+.Sp
+\&\fI\f(BIld\fI\|(0)\fR is used to represent the function input value, which means
+that the given expression will be evaluated multiple times with
+various input values that the expression can access through
+\&\f(CWld(0)\fR. When the expression evaluates to 0 then the
+corresponding input value will be returned.
+.IP "\fBround(expr)\fR" 4
+.IX Item "round(expr)"
+Round the value of expression \fIexpr\fR to the nearest integer. For example, \*(L"round(1.5)\*(R" is \*(L"2.0\*(R".
+.IP "\fBsgn(x)\fR" 4
+.IX Item "sgn(x)"
+Compute sign of \fIx\fR.
+.IP "\fBsin(x)\fR" 4
+.IX Item "sin(x)"
+Compute sine of \fIx\fR.
+.IP "\fBsinh(x)\fR" 4
+.IX Item "sinh(x)"
+Compute hyperbolic sine of \fIx\fR.
+.IP "\fBsqrt(expr)\fR" 4
+.IX Item "sqrt(expr)"
+Compute the square root of \fIexpr\fR. This is equivalent to
+"(\fIexpr\fR)^.5".
+.IP "\fBsquish(x)\fR" 4
+.IX Item "squish(x)"
+Compute expression \f(CW\*(C`1/(1 + exp(4*x))\*(C'\fR.
+.IP "\fBst(var, expr)\fR" 4
+.IX Item "st(var, expr)"
+Store the value of the expression \fIexpr\fR in an internal
+variable. \fIvar\fR specifies the number of the variable where to
+store the value, and it is a value ranging from 0 to 9. The function
+returns the value stored in the internal variable.
+Note, Variables are currently not shared between expressions.
+.IP "\fBtan(x)\fR" 4
+.IX Item "tan(x)"
+Compute tangent of \fIx\fR.
+.IP "\fBtanh(x)\fR" 4
+.IX Item "tanh(x)"
+Compute hyperbolic tangent of \fIx\fR.
+.IP "\fBtaylor(expr, x)\fR" 4
+.IX Item "taylor(expr, x)"
+.PD 0
+.IP "\fBtaylor(expr, x, id)\fR" 4
+.IX Item "taylor(expr, x, id)"
+.PD
+Evaluate a Taylor series at \fIx\fR, given an expression representing
+the \f(CW\*(C`ld(id)\*(C'\fR\-th derivative of a function at 0.
+.Sp
+When the series does not converge the result is undefined.
+.Sp
+\&\fIld(id)\fR is used to represent the derivative order in \fIexpr\fR,
+which means that the given expression will be evaluated multiple times
+with various input values that the expression can access through
+\&\f(CW\*(C`ld(id)\*(C'\fR. If \fIid\fR is not specified then 0 is assumed.
+.Sp
+Note, when you have the derivatives at y instead of 0,
+\&\f(CW\*(C`taylor(expr, x\-y)\*(C'\fR can be used.
+.IP "\fB\fBtime\fB\|(0)\fR" 4
+.IX Item "time"
+Return the current (wallclock) time in seconds.
+.IP "\fBtrunc(expr)\fR" 4
+.IX Item "trunc(expr)"
+Round the value of expression \fIexpr\fR towards zero to the nearest
+integer. For example, \*(L"trunc(\-1.5)\*(R" is \*(L"\-1.0\*(R".
+.IP "\fBwhile(cond, expr)\fR" 4
+.IX Item "while(cond, expr)"
+Evaluate expression \fIexpr\fR while the expression \fIcond\fR is
+non-zero, and returns the value of the last \fIexpr\fR evaluation, or
+\&\s-1NAN\s0 if \fIcond\fR was always false.
+.PP
+The following constants are available:
+.IP "\fB\s-1PI\s0\fR" 4
+.IX Item "PI"
+area of the unit disc, approximately 3.14
+.IP "\fBE\fR" 4
+.IX Item "E"
+\&\fBexp\fR\|(1) (Euler's number), approximately 2.718
+.IP "\fB\s-1PHI\s0\fR" 4
+.IX Item "PHI"
+golden ratio (1+\fBsqrt\fR\|(5))/2, approximately 1.618
+.PP
+Assuming that an expression is considered \*(L"true\*(R" if it has a non-zero
+value, note that:
+.PP
+\&\f(CW\*(C`*\*(C'\fR works like \s-1AND\s0
+.PP
+\&\f(CW\*(C`+\*(C'\fR works like \s-1OR\s0
+.PP
+For example the construct:
+.PP
+.Vb 1
+\& if (A AND B) then C
+.Ve
+.PP
+is equivalent to:
+.PP
+.Vb 1
+\& if(A*B, C)
+.Ve
+.PP
+In your C code, you can extend the list of unary and binary functions,
+and define recognized constants, so that they are available for your
+expressions.
+.PP
+The evaluator also recognizes the International System unit prefixes.
+If 'i' is appended after the prefix, binary prefixes are used, which
+are based on powers of 1024 instead of powers of 1000.
+The 'B' postfix multiplies the value by 8, and can be appended after a
+unit prefix or used alone. This allows using for example '\s-1KB\s0', 'MiB',
+\&'G' and 'B' as number postfix.
+.PP
+The list of available International System prefixes follows, with
+indication of the corresponding powers of 10 and of 2.
+.IP "\fBy\fR" 4
+.IX Item "y"
+10^\-24 / 2^\-80
+.IP "\fBz\fR" 4
+.IX Item "z"
+10^\-21 / 2^\-70
+.IP "\fBa\fR" 4
+.IX Item "a"
+10^\-18 / 2^\-60
+.IP "\fBf\fR" 4
+.IX Item "f"
+10^\-15 / 2^\-50
+.IP "\fBp\fR" 4
+.IX Item "p"
+10^\-12 / 2^\-40
+.IP "\fBn\fR" 4
+.IX Item "n"
+10^\-9 / 2^\-30
+.IP "\fBu\fR" 4
+.IX Item "u"
+10^\-6 / 2^\-20
+.IP "\fBm\fR" 4
+.IX Item "m"
+10^\-3 / 2^\-10
+.IP "\fBc\fR" 4
+.IX Item "c"
+10^\-2
+.IP "\fBd\fR" 4
+.IX Item "d"
+10^\-1
+.IP "\fBh\fR" 4
+.IX Item "h"
+10^2
+.IP "\fBk\fR" 4
+.IX Item "k"
+10^3 / 2^10
+.IP "\fBK\fR" 4
+.IX Item "K"
+10^3 / 2^10
+.IP "\fBM\fR" 4
+.IX Item "M"
+10^6 / 2^20
+.IP "\fBG\fR" 4
+.IX Item "G"
+10^9 / 2^30
+.IP "\fBT\fR" 4
+.IX Item "T"
+10^12 / 2^40
+.IP "\fBP\fR" 4
+.IX Item "P"
+10^15 / 2^40
+.IP "\fBE\fR" 4
+.IX Item "E"
+10^18 / 2^50
+.IP "\fBZ\fR" 4
+.IX Item "Z"
+10^21 / 2^60
+.IP "\fBY\fR" 4
+.IX Item "Y"
+10^24 / 2^70
+.SH "CODEC OPTIONS"
+.IX Header "CODEC OPTIONS"
+libavcodec provides some generic global options, which can be set on
+all the encoders and decoders. In addition each codec may support
+so-called private options, which are specific for a given codec.
+.PP
+Sometimes, a global option may only affect a specific kind of codec,
+and may be nonsensical or ignored by another, so you need to be aware
+of the meaning of the specified options. Also some options are
+meant only for decoding or encoding.
+.PP
+Options may be set by specifying \-\fIoption\fR \fIvalue\fR in the
+FFmpeg tools, or by setting the value explicitly in the
+\&\f(CW\*(C`AVCodecContext\*(C'\fR options or using the \fIlibavutil/opt.h\fR \s-1API\s0
+for programmatic use.
+.PP
+The list of supported options follow:
+.IP "\fBb\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "b integer (encoding,audio,video)"
+Set bitrate in bits/s. Default value is 200K.
+.IP "\fBab\fR \fIinteger\fR \fB(\fR\fIencoding,audio\fR\fB)\fR" 4
+.IX Item "ab integer (encoding,audio)"
+Set audio bitrate (in bits/s). Default value is 128K.
+.IP "\fBbt\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "bt integer (encoding,video)"
+Set video bitrate tolerance (in bits/s). In 1\-pass mode, bitrate
+tolerance specifies how far ratecontrol is willing to deviate from the
+target average bitrate value. This is not related to min/max
+bitrate. Lowering tolerance too much has an adverse effect on quality.
+.IP "\fBflags\fR \fIflags\fR \fB(\fR\fIdecoding/encoding,audio,video,subtitles\fR\fB)\fR" 4
+.IX Item "flags flags (decoding/encoding,audio,video,subtitles)"
+Set generic flags.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBmv4\fR" 4
+.IX Item "mv4"
+Use four motion vector by macroblock (mpeg4).
+.IP "\fBqpel\fR" 4
+.IX Item "qpel"
+Use 1/4 pel motion compensation.
+.IP "\fBloop\fR" 4
+.IX Item "loop"
+Use loop filter.
+.IP "\fBqscale\fR" 4
+.IX Item "qscale"
+Use fixed qscale.
+.IP "\fBpass1\fR" 4
+.IX Item "pass1"
+Use internal 2pass ratecontrol in first pass mode.
+.IP "\fBpass2\fR" 4
+.IX Item "pass2"
+Use internal 2pass ratecontrol in second pass mode.
+.IP "\fBgray\fR" 4
+.IX Item "gray"
+Only decode/encode grayscale.
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+Set error[?] variables during encoding.
+.IP "\fBtruncated\fR" 4
+.IX Item "truncated"
+Input bitstream might be randomly truncated.
+.IP "\fBdrop_changed\fR" 4
+.IX Item "drop_changed"
+Don't output frames whose parameters differ from first decoded frame in stream.
+Error \s-1AVERROR_INPUT_CHANGED\s0 is returned when a frame is dropped.
+.IP "\fBildct\fR" 4
+.IX Item "ildct"
+Use interlaced \s-1DCT.\s0
+.IP "\fBlow_delay\fR" 4
+.IX Item "low_delay"
+Force low delay.
+.IP "\fBglobal_header\fR" 4
+.IX Item "global_header"
+Place global headers in extradata instead of every keyframe.
+.IP "\fBbitexact\fR" 4
+.IX Item "bitexact"
+Only write platform\-, build\- and time-independent data. (except (I)DCT).
+This ensures that file and data checksums are reproducible and match between
+platforms. Its primary use is for regression testing.
+.IP "\fBaic\fR" 4
+.IX Item "aic"
+Apply H263 advanced intra coding / mpeg4 ac prediction.
+.IP "\fBilme\fR" 4
+.IX Item "ilme"
+Apply interlaced motion estimation.
+.IP "\fBcgop\fR" 4
+.IX Item "cgop"
+Use closed gop.
+.IP "\fBoutput_corrupt\fR" 4
+.IX Item "output_corrupt"
+Output even potentially corrupted frames.
+.RE
+.RS 4
+.RE
+.IP "\fBtime_base\fR \fIrational number\fR" 4
+.IX Item "time_base rational number"
+Set codec time base.
+.Sp
+It is the fundamental unit of time (in seconds) in terms of which
+frame timestamps are represented. For fixed-fps content, timebase
+should be \f(CW\*(C`1 / frame_rate\*(C'\fR and timestamp increments should be
+identically 1.
+.IP "\fBg\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "g integer (encoding,video)"
+Set the group of picture (\s-1GOP\s0) size. Default value is 12.
+.IP "\fBar\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,audio\fR\fB)\fR" 4
+.IX Item "ar integer (decoding/encoding,audio)"
+Set audio sampling rate (in Hz).
+.IP "\fBac\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,audio\fR\fB)\fR" 4
+.IX Item "ac integer (decoding/encoding,audio)"
+Set number of audio channels.
+.IP "\fBcutoff\fR \fIinteger\fR \fB(\fR\fIencoding,audio\fR\fB)\fR" 4
+.IX Item "cutoff integer (encoding,audio)"
+Set cutoff bandwidth. (Supported only by selected encoders, see
+their respective documentation sections.)
+.IP "\fBframe_size\fR \fIinteger\fR \fB(\fR\fIencoding,audio\fR\fB)\fR" 4
+.IX Item "frame_size integer (encoding,audio)"
+Set audio frame size.
+.Sp
+Each submitted frame except the last must contain exactly frame_size
+samples per channel. May be 0 when the codec has
+\&\s-1CODEC_CAP_VARIABLE_FRAME_SIZE\s0 set, in that case the frame size is not
+restricted. It is set by some decoders to indicate constant frame
+size.
+.IP "\fBframe_number\fR \fIinteger\fR" 4
+.IX Item "frame_number integer"
+Set the frame number.
+.IP "\fBdelay\fR \fIinteger\fR" 4
+.IX Item "delay integer"
+.PD 0
+.IP "\fBqcomp\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "qcomp float (encoding,video)"
+.PD
+Set video quantizer scale compression (\s-1VBR\s0). It is used as a constant
+in the ratecontrol equation. Recommended range for default rc_eq:
+0.0\-1.0.
+.IP "\fBqblur\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "qblur float (encoding,video)"
+Set video quantizer scale blur (\s-1VBR\s0).
+.IP "\fBqmin\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "qmin integer (encoding,video)"
+Set min video quantizer scale (\s-1VBR\s0). Must be included between \-1 and
+69, default value is 2.
+.IP "\fBqmax\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "qmax integer (encoding,video)"
+Set max video quantizer scale (\s-1VBR\s0). Must be included between \-1 and
+1024, default value is 31.
+.IP "\fBqdiff\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "qdiff integer (encoding,video)"
+Set max difference between the quantizer scale (\s-1VBR\s0).
+.IP "\fBbf\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "bf integer (encoding,video)"
+Set max number of B frames between non-B-frames.
+.Sp
+Must be an integer between \-1 and 16. 0 means that B\-frames are
+disabled. If a value of \-1 is used, it will choose an automatic value
+depending on the encoder.
+.Sp
+Default value is 0.
+.IP "\fBb_qfactor\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "b_qfactor float (encoding,video)"
+Set qp factor between P and B frames.
+.IP "\fBb_strategy\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "b_strategy integer (encoding,video)"
+Set strategy to choose between I/P/B\-frames.
+.IP "\fBps\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "ps integer (encoding,video)"
+Set \s-1RTP\s0 payload size in bytes.
+.IP "\fBmv_bits\fR \fIinteger\fR" 4
+.IX Item "mv_bits integer"
+.PD 0
+.IP "\fBheader_bits\fR \fIinteger\fR" 4
+.IX Item "header_bits integer"
+.IP "\fBi_tex_bits\fR \fIinteger\fR" 4
+.IX Item "i_tex_bits integer"
+.IP "\fBp_tex_bits\fR \fIinteger\fR" 4
+.IX Item "p_tex_bits integer"
+.IP "\fBi_count\fR \fIinteger\fR" 4
+.IX Item "i_count integer"
+.IP "\fBp_count\fR \fIinteger\fR" 4
+.IX Item "p_count integer"
+.IP "\fBskip_count\fR \fIinteger\fR" 4
+.IX Item "skip_count integer"
+.IP "\fBmisc_bits\fR \fIinteger\fR" 4
+.IX Item "misc_bits integer"
+.IP "\fBframe_bits\fR \fIinteger\fR" 4
+.IX Item "frame_bits integer"
+.IP "\fBcodec_tag\fR \fIinteger\fR" 4
+.IX Item "codec_tag integer"
+.IP "\fBbug\fR \fIflags\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "bug flags (decoding,video)"
+.PD
+Workaround not auto detected encoder bugs.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBautodetect\fR" 4
+.IX Item "autodetect"
+.PD 0
+.IP "\fBxvid_ilace\fR" 4
+.IX Item "xvid_ilace"
+.PD
+Xvid interlacing bug (autodetected if fourcc==XVIX)
+.IP "\fBump4\fR" 4
+.IX Item "ump4"
+(autodetected if fourcc==UMP4)
+.IP "\fBno_padding\fR" 4
+.IX Item "no_padding"
+padding bug (autodetected)
+.IP "\fBamv\fR" 4
+.IX Item "amv"
+.PD 0
+.IP "\fBqpel_chroma\fR" 4
+.IX Item "qpel_chroma"
+.IP "\fBstd_qpel\fR" 4
+.IX Item "std_qpel"
+.PD
+old standard qpel (autodetected per fourcc/version)
+.IP "\fBqpel_chroma2\fR" 4
+.IX Item "qpel_chroma2"
+.PD 0
+.IP "\fBdirect_blocksize\fR" 4
+.IX Item "direct_blocksize"
+.PD
+direct-qpel-blocksize bug (autodetected per fourcc/version)
+.IP "\fBedge\fR" 4
+.IX Item "edge"
+edge padding bug (autodetected per fourcc/version)
+.IP "\fBhpel_chroma\fR" 4
+.IX Item "hpel_chroma"
+.PD 0
+.IP "\fBdc_clip\fR" 4
+.IX Item "dc_clip"
+.IP "\fBms\fR" 4
+.IX Item "ms"
+.PD
+Workaround various bugs in microsoft broken decoders.
+.IP "\fBtrunc\fR" 4
+.IX Item "trunc"
+trancated frames
+.RE
+.RS 4
+.RE
+.IP "\fBstrict\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,audio,video\fR\fB)\fR" 4
+.IX Item "strict integer (decoding/encoding,audio,video)"
+Specify how strictly to follow the standards.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBvery\fR" 4
+.IX Item "very"
+strictly conform to an older more strict version of the spec or reference software
+.IP "\fBstrict\fR" 4
+.IX Item "strict"
+strictly conform to all the things in the spec no matter what consequences
+.IP "\fBnormal\fR" 4
+.IX Item "normal"
+.PD 0
+.IP "\fBunofficial\fR" 4
+.IX Item "unofficial"
+.PD
+allow unofficial extensions
+.IP "\fBexperimental\fR" 4
+.IX Item "experimental"
+allow non standardized experimental things, experimental
+(unfinished/work in progress/not well tested) decoders and encoders.
+Note: experimental decoders can pose a security risk, do not use this for
+decoding untrusted input.
+.RE
+.RS 4
+.RE
+.IP "\fBb_qoffset\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "b_qoffset float (encoding,video)"
+Set \s-1QP\s0 offset between P and B frames.
+.IP "\fBerr_detect\fR \fIflags\fR \fB(\fR\fIdecoding,audio,video\fR\fB)\fR" 4
+.IX Item "err_detect flags (decoding,audio,video)"
+Set error detection flags.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBcrccheck\fR" 4
+.IX Item "crccheck"
+verify embedded CRCs
+.IP "\fBbitstream\fR" 4
+.IX Item "bitstream"
+detect bitstream specification deviations
+.IP "\fBbuffer\fR" 4
+.IX Item "buffer"
+detect improper bitstream length
+.IP "\fBexplode\fR" 4
+.IX Item "explode"
+abort decoding on minor error detection
+.IP "\fBignore_err\fR" 4
+.IX Item "ignore_err"
+ignore decoding errors, and continue decoding.
+This is useful if you want to analyze the content of a video and thus want
+everything to be decoded no matter what. This option will not result in a video
+that is pleasing to watch in case of errors.
+.IP "\fBcareful\fR" 4
+.IX Item "careful"
+consider things that violate the spec and have not been seen in the wild as errors
+.IP "\fBcompliant\fR" 4
+.IX Item "compliant"
+consider all spec non compliancies as errors
+.IP "\fBaggressive\fR" 4
+.IX Item "aggressive"
+consider things that a sane encoder should not do as an error
+.RE
+.RS 4
+.RE
+.IP "\fBhas_b_frames\fR \fIinteger\fR" 4
+.IX Item "has_b_frames integer"
+.PD 0
+.IP "\fBblock_align\fR \fIinteger\fR" 4
+.IX Item "block_align integer"
+.IP "\fBmpeg_quant\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mpeg_quant integer (encoding,video)"
+.PD
+Use \s-1MPEG\s0 quantizers instead of H.263.
+.IP "\fBrc_override_count\fR \fIinteger\fR" 4
+.IX Item "rc_override_count integer"
+.PD 0
+.IP "\fBmaxrate\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "maxrate integer (encoding,audio,video)"
+.PD
+Set max bitrate tolerance (in bits/s). Requires bufsize to be set.
+.IP "\fBminrate\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "minrate integer (encoding,audio,video)"
+Set min bitrate tolerance (in bits/s). Most useful in setting up a \s-1CBR\s0
+encode. It is of little use elsewise.
+.IP "\fBbufsize\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "bufsize integer (encoding,audio,video)"
+Set ratecontrol buffer size (in bits).
+.IP "\fBi_qfactor\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "i_qfactor float (encoding,video)"
+Set \s-1QP\s0 factor between P and I frames.
+.IP "\fBi_qoffset\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "i_qoffset float (encoding,video)"
+Set \s-1QP\s0 offset between P and I frames.
+.IP "\fBdct\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "dct integer (encoding,video)"
+Set \s-1DCT\s0 algorithm.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+autoselect a good one (default)
+.IP "\fBfastint\fR" 4
+.IX Item "fastint"
+fast integer
+.IP "\fBint\fR" 4
+.IX Item "int"
+accurate integer
+.IP "\fBmmx\fR" 4
+.IX Item "mmx"
+.PD 0
+.IP "\fBaltivec\fR" 4
+.IX Item "altivec"
+.IP "\fBfaan\fR" 4
+.IX Item "faan"
+.PD
+floating point \s-1AAN DCT\s0
+.RE
+.RS 4
+.RE
+.IP "\fBlumi_mask\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "lumi_mask float (encoding,video)"
+Compress bright areas stronger than medium ones.
+.IP "\fBtcplx_mask\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "tcplx_mask float (encoding,video)"
+Set temporal complexity masking.
+.IP "\fBscplx_mask\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "scplx_mask float (encoding,video)"
+Set spatial complexity masking.
+.IP "\fBp_mask\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "p_mask float (encoding,video)"
+Set inter masking.
+.IP "\fBdark_mask\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "dark_mask float (encoding,video)"
+Compress dark areas stronger than medium ones.
+.IP "\fBidct\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "idct integer (decoding/encoding,video)"
+Select \s-1IDCT\s0 implementation.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+.PD 0
+.IP "\fBint\fR" 4
+.IX Item "int"
+.IP "\fBsimple\fR" 4
+.IX Item "simple"
+.IP "\fBsimplemmx\fR" 4
+.IX Item "simplemmx"
+.IP "\fBsimpleauto\fR" 4
+.IX Item "simpleauto"
+.PD
+Automatically pick a \s-1IDCT\s0 compatible with the simple one
+.IP "\fBarm\fR" 4
+.IX Item "arm"
+.PD 0
+.IP "\fBaltivec\fR" 4
+.IX Item "altivec"
+.IP "\fBsh4\fR" 4
+.IX Item "sh4"
+.IP "\fBsimplearm\fR" 4
+.IX Item "simplearm"
+.IP "\fBsimplearmv5te\fR" 4
+.IX Item "simplearmv5te"
+.IP "\fBsimplearmv6\fR" 4
+.IX Item "simplearmv6"
+.IP "\fBsimpleneon\fR" 4
+.IX Item "simpleneon"
+.IP "\fBxvid\fR" 4
+.IX Item "xvid"
+.IP "\fBfaani\fR" 4
+.IX Item "faani"
+.PD
+floating point \s-1AAN IDCT\s0
+.RE
+.RS 4
+.RE
+.IP "\fBslice_count\fR \fIinteger\fR" 4
+.IX Item "slice_count integer"
+.PD 0
+.IP "\fBec\fR \fIflags\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "ec flags (decoding,video)"
+.PD
+Set error concealment strategy.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBguess_mvs\fR" 4
+.IX Item "guess_mvs"
+iterative motion vector (\s-1MV\s0) search (slow)
+.IP "\fBdeblock\fR" 4
+.IX Item "deblock"
+use strong deblock filter for damaged MBs
+.IP "\fBfavor_inter\fR" 4
+.IX Item "favor_inter"
+favor predicting from the previous frame instead of the current
+.RE
+.RS 4
+.RE
+.IP "\fBbits_per_coded_sample\fR \fIinteger\fR" 4
+.IX Item "bits_per_coded_sample integer"
+.PD 0
+.IP "\fBpred\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "pred integer (encoding,video)"
+.PD
+Set prediction method.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBleft\fR" 4
+.IX Item "left"
+.PD 0
+.IP "\fBplane\fR" 4
+.IX Item "plane"
+.IP "\fBmedian\fR" 4
+.IX Item "median"
+.RE
+.RS 4
+.RE
+.IP "\fBaspect\fR \fIrational number\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "aspect rational number (encoding,video)"
+.PD
+Set sample aspect ratio.
+.IP "\fBsar\fR \fIrational number\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "sar rational number (encoding,video)"
+Set sample aspect ratio. Alias to \fIaspect\fR.
+.IP "\fBdebug\fR \fIflags\fR \fB(\fR\fIdecoding/encoding,audio,video,subtitles\fR\fB)\fR" 4
+.IX Item "debug flags (decoding/encoding,audio,video,subtitles)"
+Print specific debug info.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBpict\fR" 4
+.IX Item "pict"
+picture info
+.IP "\fBrc\fR" 4
+.IX Item "rc"
+rate control
+.IP "\fBbitstream\fR" 4
+.IX Item "bitstream"
+.PD 0
+.IP "\fBmb_type\fR" 4
+.IX Item "mb_type"
+.PD
+macroblock (\s-1MB\s0) type
+.IP "\fBqp\fR" 4
+.IX Item "qp"
+per-block quantization parameter (\s-1QP\s0)
+.IP "\fBdct_coeff\fR" 4
+.IX Item "dct_coeff"
+.PD 0
+.IP "\fBgreen_metadata\fR" 4
+.IX Item "green_metadata"
+.PD
+display complexity metadata for the upcoming frame, GoP or for a given duration.
+.IP "\fBskip\fR" 4
+.IX Item "skip"
+.PD 0
+.IP "\fBstartcode\fR" 4
+.IX Item "startcode"
+.IP "\fBer\fR" 4
+.IX Item "er"
+.PD
+error recognition
+.IP "\fBmmco\fR" 4
+.IX Item "mmco"
+memory management control operations (H.264)
+.IP "\fBbugs\fR" 4
+.IX Item "bugs"
+.PD 0
+.IP "\fBbuffers\fR" 4
+.IX Item "buffers"
+.PD
+picture buffer allocations
+.IP "\fBthread_ops\fR" 4
+.IX Item "thread_ops"
+threading operations
+.IP "\fBnomc\fR" 4
+.IX Item "nomc"
+skip motion compensation
+.RE
+.RS 4
+.RE
+.IP "\fBcmp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "cmp integer (encoding,video)"
+Set full pel me compare function.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+sum of absolute differences, fast (default)
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+sum of squared errors
+.IP "\fBsatd\fR" 4
+.IX Item "satd"
+sum of absolute Hadamard transformed differences
+.IP "\fBdct\fR" 4
+.IX Item "dct"
+sum of absolute \s-1DCT\s0 transformed differences
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+sum of squared quantization errors (avoid, low quality)
+.IP "\fBbit\fR" 4
+.IX Item "bit"
+number of bits needed for the block
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+rate distortion optimal, slow
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+0
+.IP "\fBvsad\fR" 4
+.IX Item "vsad"
+sum of absolute vertical differences
+.IP "\fBvsse\fR" 4
+.IX Item "vsse"
+sum of squared vertical differences
+.IP "\fBnsse\fR" 4
+.IX Item "nsse"
+noise preserving sum of squared differences
+.IP "\fBw53\fR" 4
+.IX Item "w53"
+5/3 wavelet, only used in snow
+.IP "\fBw97\fR" 4
+.IX Item "w97"
+9/7 wavelet, only used in snow
+.IP "\fBdctmax\fR" 4
+.IX Item "dctmax"
+.PD 0
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+.RE
+.RS 4
+.RE
+.IP "\fBsubcmp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "subcmp integer (encoding,video)"
+.PD
+Set sub pel me compare function.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+sum of absolute differences, fast (default)
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+sum of squared errors
+.IP "\fBsatd\fR" 4
+.IX Item "satd"
+sum of absolute Hadamard transformed differences
+.IP "\fBdct\fR" 4
+.IX Item "dct"
+sum of absolute \s-1DCT\s0 transformed differences
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+sum of squared quantization errors (avoid, low quality)
+.IP "\fBbit\fR" 4
+.IX Item "bit"
+number of bits needed for the block
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+rate distortion optimal, slow
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+0
+.IP "\fBvsad\fR" 4
+.IX Item "vsad"
+sum of absolute vertical differences
+.IP "\fBvsse\fR" 4
+.IX Item "vsse"
+sum of squared vertical differences
+.IP "\fBnsse\fR" 4
+.IX Item "nsse"
+noise preserving sum of squared differences
+.IP "\fBw53\fR" 4
+.IX Item "w53"
+5/3 wavelet, only used in snow
+.IP "\fBw97\fR" 4
+.IX Item "w97"
+9/7 wavelet, only used in snow
+.IP "\fBdctmax\fR" 4
+.IX Item "dctmax"
+.PD 0
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+.RE
+.RS 4
+.RE
+.IP "\fBmbcmp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mbcmp integer (encoding,video)"
+.PD
+Set macroblock compare function.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+sum of absolute differences, fast (default)
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+sum of squared errors
+.IP "\fBsatd\fR" 4
+.IX Item "satd"
+sum of absolute Hadamard transformed differences
+.IP "\fBdct\fR" 4
+.IX Item "dct"
+sum of absolute \s-1DCT\s0 transformed differences
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+sum of squared quantization errors (avoid, low quality)
+.IP "\fBbit\fR" 4
+.IX Item "bit"
+number of bits needed for the block
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+rate distortion optimal, slow
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+0
+.IP "\fBvsad\fR" 4
+.IX Item "vsad"
+sum of absolute vertical differences
+.IP "\fBvsse\fR" 4
+.IX Item "vsse"
+sum of squared vertical differences
+.IP "\fBnsse\fR" 4
+.IX Item "nsse"
+noise preserving sum of squared differences
+.IP "\fBw53\fR" 4
+.IX Item "w53"
+5/3 wavelet, only used in snow
+.IP "\fBw97\fR" 4
+.IX Item "w97"
+9/7 wavelet, only used in snow
+.IP "\fBdctmax\fR" 4
+.IX Item "dctmax"
+.PD 0
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+.RE
+.RS 4
+.RE
+.IP "\fBildctcmp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "ildctcmp integer (encoding,video)"
+.PD
+Set interlaced dct compare function.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+sum of absolute differences, fast (default)
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+sum of squared errors
+.IP "\fBsatd\fR" 4
+.IX Item "satd"
+sum of absolute Hadamard transformed differences
+.IP "\fBdct\fR" 4
+.IX Item "dct"
+sum of absolute \s-1DCT\s0 transformed differences
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+sum of squared quantization errors (avoid, low quality)
+.IP "\fBbit\fR" 4
+.IX Item "bit"
+number of bits needed for the block
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+rate distortion optimal, slow
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+0
+.IP "\fBvsad\fR" 4
+.IX Item "vsad"
+sum of absolute vertical differences
+.IP "\fBvsse\fR" 4
+.IX Item "vsse"
+sum of squared vertical differences
+.IP "\fBnsse\fR" 4
+.IX Item "nsse"
+noise preserving sum of squared differences
+.IP "\fBw53\fR" 4
+.IX Item "w53"
+5/3 wavelet, only used in snow
+.IP "\fBw97\fR" 4
+.IX Item "w97"
+9/7 wavelet, only used in snow
+.IP "\fBdctmax\fR" 4
+.IX Item "dctmax"
+.PD 0
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+.RE
+.RS 4
+.RE
+.IP "\fBdia_size\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "dia_size integer (encoding,video)"
+.PD
+Set diamond type & size for motion estimation.
+.RS 4
+.IP "\fB(1024, \s-1INT_MAX\s0)\fR" 4
+.IX Item "(1024, INT_MAX)"
+full motion estimation(slowest)
+.IP "\fB(768, 1024]\fR" 4
+.IX Item "(768, 1024]"
+umh motion estimation
+.IP "\fB(512, 768]\fR" 4
+.IX Item "(512, 768]"
+hex motion estimation
+.IP "\fB(256, 512]\fR" 4
+.IX Item "(256, 512]"
+l2s diamond motion estimation
+.IP "\fB[2,256]\fR" 4
+.IX Item "[2,256]"
+var diamond motion estimation
+.IP "\fB(\-1, 2)\fR" 4
+.IX Item "(-1, 2)"
+small diamond motion estimation
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+funny diamond motion estimation
+.IP "\fB(\s-1INT_MIN,\s0 \-1)\fR" 4
+.IX Item "(INT_MIN, -1)"
+sab diamond motion estimation
+.RE
+.RS 4
+.RE
+.IP "\fBlast_pred\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "last_pred integer (encoding,video)"
+Set amount of motion predictors from the previous frame.
+.IP "\fBpreme\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "preme integer (encoding,video)"
+Set pre motion estimation.
+.IP "\fBprecmp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "precmp integer (encoding,video)"
+Set pre motion estimation compare function.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+sum of absolute differences, fast (default)
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+sum of squared errors
+.IP "\fBsatd\fR" 4
+.IX Item "satd"
+sum of absolute Hadamard transformed differences
+.IP "\fBdct\fR" 4
+.IX Item "dct"
+sum of absolute \s-1DCT\s0 transformed differences
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+sum of squared quantization errors (avoid, low quality)
+.IP "\fBbit\fR" 4
+.IX Item "bit"
+number of bits needed for the block
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+rate distortion optimal, slow
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+0
+.IP "\fBvsad\fR" 4
+.IX Item "vsad"
+sum of absolute vertical differences
+.IP "\fBvsse\fR" 4
+.IX Item "vsse"
+sum of squared vertical differences
+.IP "\fBnsse\fR" 4
+.IX Item "nsse"
+noise preserving sum of squared differences
+.IP "\fBw53\fR" 4
+.IX Item "w53"
+5/3 wavelet, only used in snow
+.IP "\fBw97\fR" 4
+.IX Item "w97"
+9/7 wavelet, only used in snow
+.IP "\fBdctmax\fR" 4
+.IX Item "dctmax"
+.PD 0
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+.RE
+.RS 4
+.RE
+.IP "\fBpre_dia_size\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "pre_dia_size integer (encoding,video)"
+.PD
+Set diamond type & size for motion estimation pre-pass.
+.IP "\fBsubq\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "subq integer (encoding,video)"
+Set sub pel motion estimation quality.
+.IP "\fBme_range\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "me_range integer (encoding,video)"
+Set limit motion vectors range (1023 for DivX player).
+.IP "\fBglobal_quality\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "global_quality integer (encoding,audio,video)"
+.PD 0
+.IP "\fBcoder\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "coder integer (encoding,video)"
+.PD
+Possible values:
+.RS 4
+.IP "\fBvlc\fR" 4
+.IX Item "vlc"
+variable length coder / huffman coder
+.IP "\fBac\fR" 4
+.IX Item "ac"
+arithmetic coder
+.IP "\fBraw\fR" 4
+.IX Item "raw"
+raw (no encoding)
+.IP "\fBrle\fR" 4
+.IX Item "rle"
+run-length coder
+.RE
+.RS 4
+.RE
+.IP "\fBcontext\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "context integer (encoding,video)"
+Set context model.
+.IP "\fBslice_flags\fR \fIinteger\fR" 4
+.IX Item "slice_flags integer"
+.PD 0
+.IP "\fBmbd\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mbd integer (encoding,video)"
+.PD
+Set macroblock decision algorithm (high quality mode).
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsimple\fR" 4
+.IX Item "simple"
+use mbcmp (default)
+.IP "\fBbits\fR" 4
+.IX Item "bits"
+use fewest bits
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+use best rate distortion
+.RE
+.RS 4
+.RE
+.IP "\fBsc_threshold\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "sc_threshold integer (encoding,video)"
+Set scene change threshold.
+.IP "\fBnr\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "nr integer (encoding,video)"
+Set noise reduction.
+.IP "\fBrc_init_occupancy\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "rc_init_occupancy integer (encoding,video)"
+Set number of bits which should be loaded into the rc buffer before
+decoding starts.
+.IP "\fBflags2\fR \fIflags\fR \fB(\fR\fIdecoding/encoding,audio,video,subtitles\fR\fB)\fR" 4
+.IX Item "flags2 flags (decoding/encoding,audio,video,subtitles)"
+Possible values:
+.RS 4
+.IP "\fBfast\fR" 4
+.IX Item "fast"
+Allow non spec compliant speedup tricks.
+.IP "\fBnoout\fR" 4
+.IX Item "noout"
+Skip bitstream encoding.
+.IP "\fBignorecrop\fR" 4
+.IX Item "ignorecrop"
+Ignore cropping information from sps.
+.IP "\fBlocal_header\fR" 4
+.IX Item "local_header"
+Place global headers at every keyframe instead of in extradata.
+.IP "\fBchunks\fR" 4
+.IX Item "chunks"
+Frame data might be split into multiple chunks.
+.IP "\fBshowall\fR" 4
+.IX Item "showall"
+Show all frames before the first keyframe.
+.IP "\fBexport_mvs\fR" 4
+.IX Item "export_mvs"
+Export motion vectors into frame side-data (see \f(CW\*(C`AV_FRAME_DATA_MOTION_VECTORS\*(C'\fR)
+for codecs that support it. See also \fIdoc/examples/export_mvs.c\fR.
+.IP "\fBskip_manual\fR" 4
+.IX Item "skip_manual"
+Do not skip samples and export skip information as frame side data.
+.IP "\fBass_ro_flush_noop\fR" 4
+.IX Item "ass_ro_flush_noop"
+Do not reset \s-1ASS\s0 ReadOrder field on flush.
+.RE
+.RS 4
+.RE
+.IP "\fBexport_side_data\fR \fIflags\fR \fB(\fR\fIdecoding/encoding,audio,video,subtitles\fR\fB)\fR" 4
+.IX Item "export_side_data flags (decoding/encoding,audio,video,subtitles)"
+Possible values:
+.RS 4
+.IP "\fBmvs\fR" 4
+.IX Item "mvs"
+Export motion vectors into frame side-data (see \f(CW\*(C`AV_FRAME_DATA_MOTION_VECTORS\*(C'\fR)
+for codecs that support it. See also \fIdoc/examples/export_mvs.c\fR.
+.IP "\fBprft\fR" 4
+.IX Item "prft"
+Export encoder Producer Reference Time into packet side-data (see \f(CW\*(C`AV_PKT_DATA_PRFT\*(C'\fR)
+for codecs that support it.
+.IP "\fBvenc_params\fR" 4
+.IX Item "venc_params"
+Export video encoding parameters through frame side data (see \f(CW\*(C`AV_FRAME_DATA_VIDEO_ENC_PARAMS\*(C'\fR)
+for codecs that support it. At present, those are H.264 and \s-1VP9.\s0
+.IP "\fBfilm_grain\fR" 4
+.IX Item "film_grain"
+Export film grain parameters through frame side data (see \f(CW\*(C`AV_FRAME_DATA_FILM_GRAIN_PARAMS\*(C'\fR).
+Supported at present by \s-1AV1\s0 decoders.
+.RE
+.RS 4
+.RE
+.IP "\fBthreads\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "threads integer (decoding/encoding,video)"
+Set the number of threads to be used, in case the selected codec
+implementation supports multi-threading.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBauto, 0\fR" 4
+.IX Item "auto, 0"
+automatically select the number of threads to set
+.RE
+.RS 4
+.Sp
+Default value is \fBauto\fR.
+.RE
+.IP "\fBdc\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "dc integer (encoding,video)"
+Set intra_dc_precision.
+.IP "\fBnssew\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "nssew integer (encoding,video)"
+Set nsse weight.
+.IP "\fBskip_top\fR \fIinteger\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "skip_top integer (decoding,video)"
+Set number of macroblock rows at the top which are skipped.
+.IP "\fBskip_bottom\fR \fIinteger\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "skip_bottom integer (decoding,video)"
+Set number of macroblock rows at the bottom which are skipped.
+.IP "\fBprofile\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "profile integer (encoding,audio,video)"
+Set encoder codec profile. Default value is \fBunknown\fR. Encoder specific
+profiles are documented in the relevant encoder documentation.
+.IP "\fBlevel\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "level integer (encoding,audio,video)"
+Possible values:
+.RS 4
+.IP "\fBunknown\fR" 4
+.IX Item "unknown"
+.RE
+.RS 4
+.RE
+.PD 0
+.IP "\fBlowres\fR \fIinteger\fR \fB(\fR\fIdecoding,audio,video\fR\fB)\fR" 4
+.IX Item "lowres integer (decoding,audio,video)"
+.PD
+Decode at 1= 1/2, 2=1/4, 3=1/8 resolutions.
+.IP "\fBskip_threshold\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "skip_threshold integer (encoding,video)"
+Set frame skip threshold.
+.IP "\fBskip_factor\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "skip_factor integer (encoding,video)"
+Set frame skip factor.
+.IP "\fBskip_exp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "skip_exp integer (encoding,video)"
+Set frame skip exponent.
+Negative values behave identical to the corresponding positive ones, except
+that the score is normalized.
+Positive values exist primarily for compatibility reasons and are not so useful.
+.IP "\fBskipcmp\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "skipcmp integer (encoding,video)"
+Set frame skip compare function.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+sum of absolute differences, fast (default)
+.IP "\fBsse\fR" 4
+.IX Item "sse"
+sum of squared errors
+.IP "\fBsatd\fR" 4
+.IX Item "satd"
+sum of absolute Hadamard transformed differences
+.IP "\fBdct\fR" 4
+.IX Item "dct"
+sum of absolute \s-1DCT\s0 transformed differences
+.IP "\fBpsnr\fR" 4
+.IX Item "psnr"
+sum of squared quantization errors (avoid, low quality)
+.IP "\fBbit\fR" 4
+.IX Item "bit"
+number of bits needed for the block
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+rate distortion optimal, slow
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+0
+.IP "\fBvsad\fR" 4
+.IX Item "vsad"
+sum of absolute vertical differences
+.IP "\fBvsse\fR" 4
+.IX Item "vsse"
+sum of squared vertical differences
+.IP "\fBnsse\fR" 4
+.IX Item "nsse"
+noise preserving sum of squared differences
+.IP "\fBw53\fR" 4
+.IX Item "w53"
+5/3 wavelet, only used in snow
+.IP "\fBw97\fR" 4
+.IX Item "w97"
+9/7 wavelet, only used in snow
+.IP "\fBdctmax\fR" 4
+.IX Item "dctmax"
+.PD 0
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+.RE
+.RS 4
+.RE
+.IP "\fBmblmin\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mblmin integer (encoding,video)"
+.PD
+Set min macroblock lagrange factor (\s-1VBR\s0).
+.IP "\fBmblmax\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mblmax integer (encoding,video)"
+Set max macroblock lagrange factor (\s-1VBR\s0).
+.IP "\fBmepc\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mepc integer (encoding,video)"
+Set motion estimation bitrate penalty compensation (1.0 = 256).
+.IP "\fBskip_loop_filter\fR \fIinteger\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "skip_loop_filter integer (decoding,video)"
+.PD 0
+.IP "\fBskip_idct\fR \fIinteger\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "skip_idct integer (decoding,video)"
+.IP "\fBskip_frame\fR \fIinteger\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "skip_frame integer (decoding,video)"
+.PD
+Make decoder discard processing depending on the frame type selected
+by the option value.
+.Sp
+\&\fBskip_loop_filter\fR skips frame loop filtering, \fBskip_idct\fR
+skips frame IDCT/dequantization, \fBskip_frame\fR skips decoding.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+Discard no frame.
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+Discard useless frames like 0\-sized frames.
+.IP "\fBnoref\fR" 4
+.IX Item "noref"
+Discard all non-reference frames.
+.IP "\fBbidir\fR" 4
+.IX Item "bidir"
+Discard all bidirectional frames.
+.IP "\fBnokey\fR" 4
+.IX Item "nokey"
+Discard all frames excepts keyframes.
+.IP "\fBnointra\fR" 4
+.IX Item "nointra"
+Discard all frames except I frames.
+.IP "\fBall\fR" 4
+.IX Item "all"
+Discard all frames.
+.RE
+.RS 4
+.Sp
+Default value is \fBdefault\fR.
+.RE
+.IP "\fBbidir_refine\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "bidir_refine integer (encoding,video)"
+Refine the two motion vectors used in bidirectional macroblocks.
+.IP "\fBbrd_scale\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "brd_scale integer (encoding,video)"
+Downscale frames for dynamic B\-frame decision.
+.IP "\fBkeyint_min\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "keyint_min integer (encoding,video)"
+Set minimum interval between IDR-frames.
+.IP "\fBrefs\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "refs integer (encoding,video)"
+Set reference frames to consider for motion compensation.
+.IP "\fBchromaoffset\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "chromaoffset integer (encoding,video)"
+Set chroma qp offset from luma.
+.IP "\fBtrellis\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "trellis integer (encoding,audio,video)"
+Set rate-distortion optimal quantization.
+.IP "\fBmv0_threshold\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "mv0_threshold integer (encoding,video)"
+.PD 0
+.IP "\fBb_sensitivity\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "b_sensitivity integer (encoding,video)"
+.PD
+Adjust sensitivity of b_frame_strategy 1.
+.IP "\fBcompression_level\fR \fIinteger\fR \fB(\fR\fIencoding,audio,video\fR\fB)\fR" 4
+.IX Item "compression_level integer (encoding,audio,video)"
+.PD 0
+.IP "\fBmin_prediction_order\fR \fIinteger\fR \fB(\fR\fIencoding,audio\fR\fB)\fR" 4
+.IX Item "min_prediction_order integer (encoding,audio)"
+.IP "\fBmax_prediction_order\fR \fIinteger\fR \fB(\fR\fIencoding,audio\fR\fB)\fR" 4
+.IX Item "max_prediction_order integer (encoding,audio)"
+.IP "\fBtimecode_frame_start\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "timecode_frame_start integer (encoding,video)"
+.PD
+Set \s-1GOP\s0 timecode frame start number, in non drop frame format.
+.IP "\fBbits_per_raw_sample\fR \fIinteger\fR" 4
+.IX Item "bits_per_raw_sample integer"
+.PD 0
+.IP "\fBchannel_layout\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,audio\fR\fB)\fR" 4
+.IX Item "channel_layout integer (decoding/encoding,audio)"
+.PD
+Possible values:
+.IP "\fBrequest_channel_layout\fR \fIinteger\fR \fB(\fR\fIdecoding,audio\fR\fB)\fR" 4
+.IX Item "request_channel_layout integer (decoding,audio)"
+Possible values:
+.IP "\fBrc_max_vbv_use\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "rc_max_vbv_use float (encoding,video)"
+.PD 0
+.IP "\fBrc_min_vbv_use\fR \fIfloat\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "rc_min_vbv_use float (encoding,video)"
+.IP "\fBticks_per_frame\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,audio,video\fR\fB)\fR" 4
+.IX Item "ticks_per_frame integer (decoding/encoding,audio,video)"
+.IP "\fBcolor_primaries\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "color_primaries integer (decoding/encoding,video)"
+.PD
+Possible values:
+.RS 4
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+\&\s-1BT.709\s0
+.IP "\fBbt470m\fR" 4
+.IX Item "bt470m"
+\&\s-1BT.470 M\s0
+.IP "\fBbt470bg\fR" 4
+.IX Item "bt470bg"
+\&\s-1BT.470 BG\s0
+.IP "\fBsmpte170m\fR" 4
+.IX Item "smpte170m"
+\&\s-1SMPTE 170 M\s0
+.IP "\fBsmpte240m\fR" 4
+.IX Item "smpte240m"
+\&\s-1SMPTE 240 M\s0
+.IP "\fBfilm\fR" 4
+.IX Item "film"
+Film
+.IP "\fBbt2020\fR" 4
+.IX Item "bt2020"
+\&\s-1BT.2020\s0
+.IP "\fBsmpte428\fR" 4
+.IX Item "smpte428"
+.PD 0
+.IP "\fBsmpte428_1\fR" 4
+.IX Item "smpte428_1"
+.PD
+\&\s-1SMPTE ST 428\-1\s0
+.IP "\fBsmpte431\fR" 4
+.IX Item "smpte431"
+\&\s-1SMPTE 431\-2\s0
+.IP "\fBsmpte432\fR" 4
+.IX Item "smpte432"
+\&\s-1SMPTE 432\-1\s0
+.IP "\fBjedec\-p22\fR" 4
+.IX Item "jedec-p22"
+\&\s-1JEDEC P22\s0
+.RE
+.RS 4
+.RE
+.IP "\fBcolor_trc\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "color_trc integer (decoding/encoding,video)"
+Possible values:
+.RS 4
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+\&\s-1BT.709\s0
+.IP "\fBgamma22\fR" 4
+.IX Item "gamma22"
+\&\s-1BT.470 M\s0
+.IP "\fBgamma28\fR" 4
+.IX Item "gamma28"
+\&\s-1BT.470 BG\s0
+.IP "\fBsmpte170m\fR" 4
+.IX Item "smpte170m"
+\&\s-1SMPTE 170 M\s0
+.IP "\fBsmpte240m\fR" 4
+.IX Item "smpte240m"
+\&\s-1SMPTE 240 M\s0
+.IP "\fBlinear\fR" 4
+.IX Item "linear"
+Linear
+.IP "\fBlog\fR" 4
+.IX Item "log"
+.PD 0
+.IP "\fBlog100\fR" 4
+.IX Item "log100"
+.PD
+Log
+.IP "\fBlog_sqrt\fR" 4
+.IX Item "log_sqrt"
+.PD 0
+.IP "\fBlog316\fR" 4
+.IX Item "log316"
+.PD
+Log square root
+.IP "\fBiec61966_2_4\fR" 4
+.IX Item "iec61966_2_4"
+.PD 0
+.IP "\fBiec61966\-2\-4\fR" 4
+.IX Item "iec61966-2-4"
+.PD
+\&\s-1IEC 61966\-2\-4\s0
+.IP "\fBbt1361\fR" 4
+.IX Item "bt1361"
+.PD 0
+.IP "\fBbt1361e\fR" 4
+.IX Item "bt1361e"
+.PD
+\&\s-1BT.1361\s0
+.IP "\fBiec61966_2_1\fR" 4
+.IX Item "iec61966_2_1"
+.PD 0
+.IP "\fBiec61966\-2\-1\fR" 4
+.IX Item "iec61966-2-1"
+.PD
+\&\s-1IEC 61966\-2\-1\s0
+.IP "\fBbt2020_10\fR" 4
+.IX Item "bt2020_10"
+.PD 0
+.IP "\fBbt2020_10bit\fR" 4
+.IX Item "bt2020_10bit"
+.PD
+\&\s-1BT.2020\s0 \- 10 bit
+.IP "\fBbt2020_12\fR" 4
+.IX Item "bt2020_12"
+.PD 0
+.IP "\fBbt2020_12bit\fR" 4
+.IX Item "bt2020_12bit"
+.PD
+\&\s-1BT.2020\s0 \- 12 bit
+.IP "\fBsmpte2084\fR" 4
+.IX Item "smpte2084"
+\&\s-1SMPTE ST 2084\s0
+.IP "\fBsmpte428\fR" 4
+.IX Item "smpte428"
+.PD 0
+.IP "\fBsmpte428_1\fR" 4
+.IX Item "smpte428_1"
+.PD
+\&\s-1SMPTE ST 428\-1\s0
+.IP "\fBarib\-std\-b67\fR" 4
+.IX Item "arib-std-b67"
+\&\s-1ARIB STD\-B67\s0
+.RE
+.RS 4
+.RE
+.IP "\fBcolorspace\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "colorspace integer (decoding/encoding,video)"
+Possible values:
+.RS 4
+.IP "\fBrgb\fR" 4
+.IX Item "rgb"
+\&\s-1RGB\s0
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+\&\s-1BT.709\s0
+.IP "\fBfcc\fR" 4
+.IX Item "fcc"
+\&\s-1FCC\s0
+.IP "\fBbt470bg\fR" 4
+.IX Item "bt470bg"
+\&\s-1BT.470 BG\s0
+.IP "\fBsmpte170m\fR" 4
+.IX Item "smpte170m"
+\&\s-1SMPTE 170 M\s0
+.IP "\fBsmpte240m\fR" 4
+.IX Item "smpte240m"
+\&\s-1SMPTE 240 M\s0
+.IP "\fBycocg\fR" 4
+.IX Item "ycocg"
+\&\s-1YCOCG\s0
+.IP "\fBbt2020nc\fR" 4
+.IX Item "bt2020nc"
+.PD 0
+.IP "\fBbt2020_ncl\fR" 4
+.IX Item "bt2020_ncl"
+.PD
+\&\s-1BT.2020 NCL\s0
+.IP "\fBbt2020c\fR" 4
+.IX Item "bt2020c"
+.PD 0
+.IP "\fBbt2020_cl\fR" 4
+.IX Item "bt2020_cl"
+.PD
+\&\s-1BT.2020 CL\s0
+.IP "\fBsmpte2085\fR" 4
+.IX Item "smpte2085"
+\&\s-1SMPTE 2085\s0
+.IP "\fBchroma-derived-nc\fR" 4
+.IX Item "chroma-derived-nc"
+Chroma-derived \s-1NCL\s0
+.IP "\fBchroma-derived-c\fR" 4
+.IX Item "chroma-derived-c"
+Chroma-derived \s-1CL\s0
+.IP "\fBictcp\fR" 4
+.IX Item "ictcp"
+ICtCp
+.RE
+.RS 4
+.RE
+.IP "\fBcolor_range\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "color_range integer (decoding/encoding,video)"
+If used as input parameter, it serves as a hint to the decoder, which
+color_range the input has.
+Possible values:
+.RS 4
+.IP "\fBtv\fR" 4
+.IX Item "tv"
+.PD 0
+.IP "\fBmpeg\fR" 4
+.IX Item "mpeg"
+.PD
+\&\s-1MPEG\s0 (219*2^(n\-8))
+.IP "\fBpc\fR" 4
+.IX Item "pc"
+.PD 0
+.IP "\fBjpeg\fR" 4
+.IX Item "jpeg"
+.PD
+\&\s-1JPEG\s0 (2^n\-1)
+.RE
+.RS 4
+.RE
+.IP "\fBchroma_sample_location\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "chroma_sample_location integer (decoding/encoding,video)"
+Possible values:
+.RS 4
+.IP "\fBleft\fR" 4
+.IX Item "left"
+.PD 0
+.IP "\fBcenter\fR" 4
+.IX Item "center"
+.IP "\fBtopleft\fR" 4
+.IX Item "topleft"
+.IP "\fBtop\fR" 4
+.IX Item "top"
+.IP "\fBbottomleft\fR" 4
+.IX Item "bottomleft"
+.IP "\fBbottom\fR" 4
+.IX Item "bottom"
+.RE
+.RS 4
+.RE
+.IP "\fBlog_level_offset\fR \fIinteger\fR" 4
+.IX Item "log_level_offset integer"
+.PD
+Set the log level offset.
+.IP "\fBslices\fR \fIinteger\fR \fB(\fR\fIencoding,video\fR\fB)\fR" 4
+.IX Item "slices integer (encoding,video)"
+Number of slices, used in parallelized encoding.
+.IP "\fBthread_type\fR \fIflags\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "thread_type flags (decoding/encoding,video)"
+Select which multithreading methods to use.
+.Sp
+Use of \fBframe\fR will increase decoding delay by one frame per
+thread, so clients which cannot provide future frames should not use
+it.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBslice\fR" 4
+.IX Item "slice"
+Decode more than one part of a single frame at once.
+.Sp
+Multithreading using slices works only when the video was encoded with
+slices.
+.IP "\fBframe\fR" 4
+.IX Item "frame"
+Decode more than one frame at once.
+.RE
+.RS 4
+.Sp
+Default value is \fBslice+frame\fR.
+.RE
+.IP "\fBaudio_service_type\fR \fIinteger\fR \fB(\fR\fIencoding,audio\fR\fB)\fR" 4
+.IX Item "audio_service_type integer (encoding,audio)"
+Set audio service type.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBma\fR" 4
+.IX Item "ma"
+Main Audio Service
+.IP "\fBef\fR" 4
+.IX Item "ef"
+Effects
+.IP "\fBvi\fR" 4
+.IX Item "vi"
+Visually Impaired
+.IP "\fBhi\fR" 4
+.IX Item "hi"
+Hearing Impaired
+.IP "\fBdi\fR" 4
+.IX Item "di"
+Dialogue
+.IP "\fBco\fR" 4
+.IX Item "co"
+Commentary
+.IP "\fBem\fR" 4
+.IX Item "em"
+Emergency
+.IP "\fBvo\fR" 4
+.IX Item "vo"
+Voice Over
+.IP "\fBka\fR" 4
+.IX Item "ka"
+Karaoke
+.RE
+.RS 4
+.RE
+.IP "\fBrequest_sample_fmt\fR \fIsample_fmt\fR \fB(\fR\fIdecoding,audio\fR\fB)\fR" 4
+.IX Item "request_sample_fmt sample_fmt (decoding,audio)"
+Set sample format audio decoders should prefer. Default value is
+\&\f(CW\*(C`none\*(C'\fR.
+.IP "\fBpkt_timebase\fR \fIrational number\fR" 4
+.IX Item "pkt_timebase rational number"
+.PD 0
+.IP "\fBsub_charenc\fR \fIencoding\fR \fB(\fR\fIdecoding,subtitles\fR\fB)\fR" 4
+.IX Item "sub_charenc encoding (decoding,subtitles)"
+.PD
+Set the input subtitles character encoding.
+.IP "\fBfield_order\fR \fIfield_order\fR \fB(\fR\fIvideo\fR\fB)\fR" 4
+.IX Item "field_order field_order (video)"
+Set/override the field order of the video.
+Possible values:
+.RS 4
+.IP "\fBprogressive\fR" 4
+.IX Item "progressive"
+Progressive video
+.IP "\fBtt\fR" 4
+.IX Item "tt"
+Interlaced video, top field coded and displayed first
+.IP "\fBbb\fR" 4
+.IX Item "bb"
+Interlaced video, bottom field coded and displayed first
+.IP "\fBtb\fR" 4
+.IX Item "tb"
+Interlaced video, top coded first, bottom displayed first
+.IP "\fBbt\fR" 4
+.IX Item "bt"
+Interlaced video, bottom coded first, top displayed first
+.RE
+.RS 4
+.RE
+.IP "\fBskip_alpha\fR \fIbool\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "skip_alpha bool (decoding,video)"
+Set to 1 to disable processing alpha (transparency). This works like the
+\&\fBgray\fR flag in the \fBflags\fR option which skips chroma information
+instead of alpha. Default is 0.
+.IP "\fBcodec_whitelist\fR \fIlist\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "codec_whitelist list (input)"
+\&\*(L",\*(R" separated list of allowed decoders. By default all are allowed.
+.IP "\fBdump_separator\fR \fIstring\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "dump_separator string (input)"
+Separator used to separate the fields printed on the command line about the
+Stream parameters.
+For example, to separate the fields with newlines and indentation:
+.Sp
+.Vb 2
+\& ffprobe \-dump_separator "
+\& " \-i ~/videos/matrixbench_mpeg2.mpg
+.Ve
+.IP "\fBmax_pixels\fR \fIinteger\fR \fB(\fR\fIdecoding/encoding,video\fR\fB)\fR" 4
+.IX Item "max_pixels integer (decoding/encoding,video)"
+Maximum number of pixels per image. This value can be used to avoid out of
+memory failures due to large images.
+.IP "\fBapply_cropping\fR \fIbool\fR \fB(\fR\fIdecoding,video\fR\fB)\fR" 4
+.IX Item "apply_cropping bool (decoding,video)"
+Enable cropping if cropping parameters are multiples of the required
+alignment for the left and top parameters. If the alignment is not met the
+cropping will be partially applied to maintain alignment.
+Default is 1 (enabled).
+Note: The required alignment depends on if \f(CW\*(C`AV_CODEC_FLAG_UNALIGNED\*(C'\fR is set and the
+\&\s-1CPU.\s0 \f(CW\*(C`AV_CODEC_FLAG_UNALIGNED\*(C'\fR cannot be changed from the command line. Also hardware
+decoders will not apply left/top Cropping.
+.SH "DECODERS"
+.IX Header "DECODERS"
+Decoders are configured elements in FFmpeg which allow the decoding of
+multimedia streams.
+.PP
+When you configure your FFmpeg build, all the supported native decoders
+are enabled by default. Decoders requiring an external library must be enabled
+manually via the corresponding \f(CW\*(C`\-\-enable\-lib\*(C'\fR option. You can list all
+available decoders using the configure option \f(CW\*(C`\-\-list\-decoders\*(C'\fR.
+.PP
+You can disable all the decoders with the configure option
+\&\f(CW\*(C`\-\-disable\-decoders\*(C'\fR and selectively enable / disable single decoders
+with the options \f(CW\*(C`\-\-enable\-decoder=\f(CIDECODER\f(CW\*(C'\fR /
+\&\f(CW\*(C`\-\-disable\-decoder=\f(CIDECODER\f(CW\*(C'\fR.
+.PP
+The option \f(CW\*(C`\-decoders\*(C'\fR of the ff* tools will display the list of
+enabled decoders.
+.SH "VIDEO DECODERS"
+.IX Header "VIDEO DECODERS"
+A description of some of the currently available video decoders
+follows.
+.SS "av1"
+.IX Subsection "av1"
+AOMedia Video 1 (\s-1AV1\s0) decoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBoperating_point\fR" 4
+.IX Item "operating_point"
+Select an operating point of a scalable \s-1AV1\s0 bitstream (0 \- 31). Default is 0.
+.SS "rawvideo"
+.IX Subsection "rawvideo"
+Raw video decoder.
+.PP
+This decoder decodes rawvideo streams.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBtop\fR \fItop_field_first\fR" 4
+.IX Item "top top_field_first"
+Specify the assumed field type of the input video.
+.RS 4
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+the video is assumed to be progressive (default)
+.IP "\fB0\fR" 4
+.IX Item "0"
+bottom-field-first is assumed
+.IP "\fB1\fR" 4
+.IX Item "1"
+top-field-first is assumed
+.RE
+.RS 4
+.RE
+.SS "libdav1d"
+.IX Subsection "libdav1d"
+dav1d \s-1AV1\s0 decoder.
+.PP
+libdav1d allows libavcodec to decode the AOMedia Video 1 (\s-1AV1\s0) codec.
+Requires the presence of the libdav1d headers and library during configuration.
+You need to explicitly configure the build with \f(CW\*(C`\-\-enable\-libdav1d\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libdav1d wrapper.
+.IP "\fBframethreads\fR" 4
+.IX Item "framethreads"
+Set amount of frame threads to use during decoding. The default value is 0 (autodetect).
+.IP "\fBtilethreads\fR" 4
+.IX Item "tilethreads"
+Set amount of tile threads to use during decoding. The default value is 0 (autodetect).
+.IP "\fBfilmgrain\fR" 4
+.IX Item "filmgrain"
+Apply film grain to the decoded video if present in the bitstream. Defaults to the
+internal default of the library.
+.IP "\fBoppoint\fR" 4
+.IX Item "oppoint"
+Select an operating point of a scalable \s-1AV1\s0 bitstream (0 \- 31). Defaults to the
+internal default of the library.
+.IP "\fBalllayers\fR" 4
+.IX Item "alllayers"
+Output all spatial layers of a scalable \s-1AV1\s0 bitstream. The default value is false.
+.SS "libdavs2"
+.IX Subsection "libdavs2"
+\&\s-1AVS2\-P2/IEEE1857.4\s0 video decoder wrapper.
+.PP
+This decoder allows libavcodec to decode \s-1AVS2\s0 streams with davs2 library.
+.SS "libuavs3d"
+.IX Subsection "libuavs3d"
+\&\s-1AVS3\-P2/IEEE1857.10\s0 video decoder.
+.PP
+libuavs3d allows libavcodec to decode \s-1AVS3\s0 streams.
+Requires the presence of the libuavs3d headers and library during configuration.
+You need to explicitly configure the build with \f(CW\*(C`\-\-enable\-libuavs3d\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following option is supported by the libuavs3d wrapper.
+.IP "\fBframe_threads\fR" 4
+.IX Item "frame_threads"
+Set amount of frame threads to use during decoding. The default value is 0 (autodetect).
+.SH "AUDIO DECODERS"
+.IX Header "AUDIO DECODERS"
+A description of some of the currently available audio decoders
+follows.
+.SS "ac3"
+.IX Subsection "ac3"
+\&\s-1AC\-3\s0 audio decoder.
+.PP
+This decoder implements part of \s-1ATSC A/52:2010\s0 and \s-1ETSI TS 102 366,\s0 as well as
+the undocumented RealAudio 3 (a.k.a. dnet).
+.PP
+\fI\s-1AC\-3\s0 Decoder Options\fR
+.IX Subsection "AC-3 Decoder Options"
+.IP "\fB\-drc_scale\fR \fIvalue\fR" 4
+.IX Item "-drc_scale value"
+Dynamic Range Scale Factor. The factor to apply to dynamic range values
+from the \s-1AC\-3\s0 stream. This factor is applied exponentially. The default value is 1.
+There are 3 notable scale factor ranges:
+.RS 4
+.IP "\fBdrc_scale == 0\fR" 4
+.IX Item "drc_scale == 0"
+\&\s-1DRC\s0 disabled. Produces full range audio.
+.IP "\fB0 < drc_scale <= 1\fR" 4
+.IX Item "0 < drc_scale <= 1"
+\&\s-1DRC\s0 enabled. Applies a fraction of the stream \s-1DRC\s0 value.
+Audio reproduction is between full range and full compression.
+.IP "\fBdrc_scale > 1\fR" 4
+.IX Item "drc_scale > 1"
+\&\s-1DRC\s0 enabled. Applies drc_scale asymmetrically.
+Loud sounds are fully compressed. Soft sounds are enhanced.
+.RE
+.RS 4
+.RE
+.SS "flac"
+.IX Subsection "flac"
+\&\s-1FLAC\s0 audio decoder.
+.PP
+This decoder aims to implement the complete \s-1FLAC\s0 specification from Xiph.
+.PP
+\fI\s-1FLAC\s0 Decoder options\fR
+.IX Subsection "FLAC Decoder options"
+.IP "\fB\-use_buggy_lpc\fR" 4
+.IX Item "-use_buggy_lpc"
+The lavc \s-1FLAC\s0 encoder used to produce buggy streams with high lpc values
+(like the default value). This option makes it possible to decode such streams
+correctly by using lavc's old buggy lpc logic for decoding.
+.SS "ffwavesynth"
+.IX Subsection "ffwavesynth"
+Internal wave synthesizer.
+.PP
+This decoder generates wave patterns according to predefined sequences. Its
+use is purely internal and the format of the data it accepts is not publicly
+documented.
+.SS "libcelt"
+.IX Subsection "libcelt"
+libcelt decoder wrapper.
+.PP
+libcelt allows libavcodec to decode the Xiph \s-1CELT\s0 ultra-low delay audio codec.
+Requires the presence of the libcelt headers and library during configuration.
+You need to explicitly configure the build with \f(CW\*(C`\-\-enable\-libcelt\*(C'\fR.
+.SS "libgsm"
+.IX Subsection "libgsm"
+libgsm decoder wrapper.
+.PP
+libgsm allows libavcodec to decode the \s-1GSM\s0 full rate audio codec. Requires
+the presence of the libgsm headers and library during configuration. You need
+to explicitly configure the build with \f(CW\*(C`\-\-enable\-libgsm\*(C'\fR.
+.PP
+This decoder supports both the ordinary \s-1GSM\s0 and the Microsoft variant.
+.SS "libilbc"
+.IX Subsection "libilbc"
+libilbc decoder wrapper.
+.PP
+libilbc allows libavcodec to decode the Internet Low Bitrate Codec (iLBC)
+audio codec. Requires the presence of the libilbc headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libilbc\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following option is supported by the libilbc wrapper.
+.IP "\fBenhance\fR" 4
+.IX Item "enhance"
+Enable the enhancement of the decoded audio when set to 1. The default
+value is 0 (disabled).
+.SS "libopencore-amrnb"
+.IX Subsection "libopencore-amrnb"
+libopencore-amrnb decoder wrapper.
+.PP
+libopencore-amrnb allows libavcodec to decode the Adaptive Multi-Rate
+Narrowband audio codec. Using it requires the presence of the
+libopencore-amrnb headers and library during configuration. You need to
+explicitly configure the build with \f(CW\*(C`\-\-enable\-libopencore\-amrnb\*(C'\fR.
+.PP
+An FFmpeg native decoder for AMR-NB exists, so users can decode AMR-NB
+without this library.
+.SS "libopencore-amrwb"
+.IX Subsection "libopencore-amrwb"
+libopencore-amrwb decoder wrapper.
+.PP
+libopencore-amrwb allows libavcodec to decode the Adaptive Multi-Rate
+Wideband audio codec. Using it requires the presence of the
+libopencore-amrwb headers and library during configuration. You need to
+explicitly configure the build with \f(CW\*(C`\-\-enable\-libopencore\-amrwb\*(C'\fR.
+.PP
+An FFmpeg native decoder for AMR-WB exists, so users can decode AMR-WB
+without this library.
+.SS "libopus"
+.IX Subsection "libopus"
+libopus decoder wrapper.
+.PP
+libopus allows libavcodec to decode the Opus Interactive Audio Codec.
+Requires the presence of the libopus headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libopus\*(C'\fR.
+.PP
+An FFmpeg native decoder for Opus exists, so users can decode Opus
+without this library.
+.SH "SUBTITLES DECODERS"
+.IX Header "SUBTITLES DECODERS"
+.SS "libaribb24"
+.IX Subsection "libaribb24"
+\&\s-1ARIB STD\-B24\s0 caption decoder.
+.PP
+Implements profiles A and C of the \s-1ARIB STD\-B24\s0 standard.
+.PP
+\fIlibaribb24 Decoder Options\fR
+.IX Subsection "libaribb24 Decoder Options"
+.IP "\fB\-aribb24\-base\-path\fR \fIpath\fR" 4
+.IX Item "-aribb24-base-path path"
+Sets the base path for the libaribb24 library. This is utilized for reading of
+configuration files (for custom unicode conversions), and for dumping of
+non-text symbols as images under that location.
+.Sp
+Unset by default.
+.IP "\fB\-aribb24\-skip\-ruby\-text\fR \fIboolean\fR" 4
+.IX Item "-aribb24-skip-ruby-text boolean"
+Tells the decoder wrapper to skip text blocks that contain half-height ruby
+text.
+.Sp
+Enabled by default.
+.SS "dvbsub"
+.IX Subsection "dvbsub"
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBcompute_clut\fR" 4
+.IX Item "compute_clut"
+.RS 4
+.PD 0
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+.PD
+Compute clut if no matching \s-1CLUT\s0 is in the stream.
+.IP "\fB0\fR" 4
+.IX Item "0"
+Never compute \s-1CLUT\s0
+.IP "\fB1\fR" 4
+.IX Item "1"
+Always compute \s-1CLUT\s0 and override the one provided in the stream.
+.RE
+.RS 4
+.RE
+.IP "\fBdvb_substream\fR" 4
+.IX Item "dvb_substream"
+Selects the dvb substream, or all substreams if \-1 which is default.
+.SS "dvdsub"
+.IX Subsection "dvdsub"
+This codec decodes the bitmap subtitles used in DVDs; the same subtitles can
+also be found in VobSub file pairs and in some Matroska files.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBpalette\fR" 4
+.IX Item "palette"
+Specify the global palette used by the bitmaps. When stored in VobSub, the
+palette is normally specified in the index file; in Matroska, the palette is
+stored in the codec extra-data in the same format as in VobSub. In DVDs, the
+palette is stored in the \s-1IFO\s0 file, and therefore not available when reading
+from dumped \s-1VOB\s0 files.
+.Sp
+The format for this option is a string containing 16 24\-bits hexadecimal
+numbers (without 0x prefix) separated by commas, for example \f(CW\*(C`0d00ee,
+ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
+7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b\*(C'\fR.
+.IP "\fBifo_palette\fR" 4
+.IX Item "ifo_palette"
+Specify the \s-1IFO\s0 file from which the global palette is obtained.
+(experimental)
+.IP "\fBforced_subs_only\fR" 4
+.IX Item "forced_subs_only"
+Only decode subtitle entries marked as forced. Some titles have forced
+and non-forced subtitles in the same track. Setting this flag to \f(CW1\fR
+will only keep the forced subtitles. Default value is \f(CW0\fR.
+.SS "libzvbi-teletext"
+.IX Subsection "libzvbi-teletext"
+Libzvbi allows libavcodec to decode \s-1DVB\s0 teletext pages and \s-1DVB\s0 teletext
+subtitles. Requires the presence of the libzvbi headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libzvbi\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBtxt_page\fR" 4
+.IX Item "txt_page"
+List of teletext page numbers to decode. Pages that do not match the specified
+list are dropped. You may use the special \f(CW\*(C`*\*(C'\fR string to match all pages,
+or \f(CW\*(C`subtitle\*(C'\fR to match all subtitle pages.
+Default value is *.
+.IP "\fBtxt_default_region\fR" 4
+.IX Item "txt_default_region"
+Set default character set used for decoding, a value between 0 and 87 (see
+\&\s-1ETS 300 706,\s0 Section 15, Table 32). Default value is \-1, which does not
+override the libzvbi default. This option is needed for some legacy level 1.0
+transmissions which cannot signal the proper charset.
+.IP "\fBtxt_chop_top\fR" 4
+.IX Item "txt_chop_top"
+Discards the top teletext line. Default value is 1.
+.IP "\fBtxt_format\fR" 4
+.IX Item "txt_format"
+Specifies the format of the decoded subtitles.
+.RS 4
+.IP "\fBbitmap\fR" 4
+.IX Item "bitmap"
+The default format, you should use this for teletext pages, because certain
+graphics and colors cannot be expressed in simple text or even \s-1ASS.\s0
+.IP "\fBtext\fR" 4
+.IX Item "text"
+Simple text based output without formatting.
+.IP "\fBass\fR" 4
+.IX Item "ass"
+Formatted \s-1ASS\s0 output, subtitle pages and teletext pages are returned in
+different styles, subtitle pages are stripped down to text, but an effort is
+made to keep the text alignment and the formatting.
+.RE
+.RS 4
+.RE
+.IP "\fBtxt_left\fR" 4
+.IX Item "txt_left"
+X offset of generated bitmaps, default is 0.
+.IP "\fBtxt_top\fR" 4
+.IX Item "txt_top"
+Y offset of generated bitmaps, default is 0.
+.IP "\fBtxt_chop_spaces\fR" 4
+.IX Item "txt_chop_spaces"
+Chops leading and trailing spaces and removes empty lines from the generated
+text. This option is useful for teletext based subtitles where empty spaces may
+be present at the start or at the end of the lines or empty lines may be
+present between the subtitle lines because of double-sized teletext characters.
+Default value is 1.
+.IP "\fBtxt_duration\fR" 4
+.IX Item "txt_duration"
+Sets the display duration of the decoded teletext pages or subtitles in
+milliseconds. Default value is \-1 which means infinity or until the next
+subtitle event comes.
+.IP "\fBtxt_transparent\fR" 4
+.IX Item "txt_transparent"
+Force transparent background of the generated teletext bitmaps. Default value
+is 0 which means an opaque background.
+.IP "\fBtxt_opacity\fR" 4
+.IX Item "txt_opacity"
+Sets the opacity (0\-255) of the teletext background. If
+\&\fBtxt_transparent\fR is not set, it only affects characters between a start
+box and an end box, typically subtitles. Default value is 0 if
+\&\fBtxt_transparent\fR is set, 255 otherwise.
+.SH "ENCODERS"
+.IX Header "ENCODERS"
+Encoders are configured elements in FFmpeg which allow the encoding of
+multimedia streams.
+.PP
+When you configure your FFmpeg build, all the supported native encoders
+are enabled by default. Encoders requiring an external library must be enabled
+manually via the corresponding \f(CW\*(C`\-\-enable\-lib\*(C'\fR option. You can list all
+available encoders using the configure option \f(CW\*(C`\-\-list\-encoders\*(C'\fR.
+.PP
+You can disable all the encoders with the configure option
+\&\f(CW\*(C`\-\-disable\-encoders\*(C'\fR and selectively enable / disable single encoders
+with the options \f(CW\*(C`\-\-enable\-encoder=\f(CIENCODER\f(CW\*(C'\fR /
+\&\f(CW\*(C`\-\-disable\-encoder=\f(CIENCODER\f(CW\*(C'\fR.
+.PP
+The option \f(CW\*(C`\-encoders\*(C'\fR of the ff* tools will display the list of
+enabled encoders.
+.SH "AUDIO ENCODERS"
+.IX Header "AUDIO ENCODERS"
+A description of some of the currently available audio encoders
+follows.
+.SS "aac"
+.IX Subsection "aac"
+Advanced Audio Coding (\s-1AAC\s0) encoder.
+.PP
+This encoder is the default \s-1AAC\s0 encoder, natively implemented into FFmpeg.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set bit rate in bits/s. Setting this automatically activates constant bit rate
+(\s-1CBR\s0) mode. If this option is unspecified it is set to 128kbps.
+.IP "\fBq\fR" 4
+.IX Item "q"
+Set quality for variable bit rate (\s-1VBR\s0) mode. This option is valid only using
+the \fBffmpeg\fR command-line tool. For library interface users, use
+\&\fBglobal_quality\fR.
+.IP "\fBcutoff\fR" 4
+.IX Item "cutoff"
+Set cutoff frequency. If unspecified will allow the encoder to dynamically
+adjust the cutoff to improve clarity on low bitrates.
+.IP "\fBaac_coder\fR" 4
+.IX Item "aac_coder"
+Set \s-1AAC\s0 encoder coding method. Possible values:
+.RS 4
+.IP "\fBtwoloop\fR" 4
+.IX Item "twoloop"
+Two loop searching (\s-1TLS\s0) method.
+.Sp
+This method first sets quantizers depending on band thresholds and then tries
+to find an optimal combination by adding or subtracting a specific value from
+all quantizers and adjusting some individual quantizer a little. Will tune
+itself based on whether \fBaac_is\fR, \fBaac_ms\fR and \fBaac_pns\fR
+are enabled.
+.IP "\fBanmr\fR" 4
+.IX Item "anmr"
+Average noise to mask ratio (\s-1ANMR\s0) trellis-based solution.
+.Sp
+This is an experimental coder which currently produces a lower quality, is more
+unstable and is slower than the default twoloop coder but has potential.
+Currently has no support for the \fBaac_is\fR or \fBaac_pns\fR options.
+Not currently recommended.
+.IP "\fBfast\fR" 4
+.IX Item "fast"
+Constant quantizer method.
+.Sp
+Uses a cheaper version of twoloop algorithm that doesn't try to do as many
+clever adjustments. Worse with low bitrates (less than 64kbps), but is better
+and much faster at higher bitrates.
+This is the default choice for a coder
+.RE
+.RS 4
+.RE
+.IP "\fBaac_ms\fR" 4
+.IX Item "aac_ms"
+Sets mid/side coding mode. The default value of \*(L"auto\*(R" will automatically use
+M/S with bands which will benefit from such coding. Can be forced for all bands
+using the value \*(L"enable\*(R", which is mainly useful for debugging or disabled using
+\&\*(L"disable\*(R".
+.IP "\fBaac_is\fR" 4
+.IX Item "aac_is"
+Sets intensity stereo coding tool usage. By default, it's enabled and will
+automatically toggle \s-1IS\s0 for similar pairs of stereo bands if it's beneficial.
+Can be disabled for debugging by setting the value to \*(L"disable\*(R".
+.IP "\fBaac_pns\fR" 4
+.IX Item "aac_pns"
+Uses perceptual noise substitution to replace low entropy high frequency bands
+with imperceptible white noise during the decoding process. By default, it's
+enabled, but can be disabled for debugging purposes by using \*(L"disable\*(R".
+.IP "\fBaac_tns\fR" 4
+.IX Item "aac_tns"
+Enables the use of a multitap \s-1FIR\s0 filter which spans through the high frequency
+bands to hide quantization noise during the encoding process and is reverted
+by the decoder. As well as decreasing unpleasant artifacts in the high range
+this also reduces the entropy in the high bands and allows for more bits to
+be used by the mid-low bands. By default it's enabled but can be disabled for
+debugging by setting the option to \*(L"disable\*(R".
+.IP "\fBaac_ltp\fR" 4
+.IX Item "aac_ltp"
+Enables the use of the long term prediction extension which increases coding
+efficiency in very low bandwidth situations such as encoding of voice or
+solo piano music by extending constant harmonic peaks in bands throughout
+frames. This option is implied by profile:a aac_low and is incompatible with
+aac_pred. Use in conjunction with \fB\-ar\fR to decrease the samplerate.
+.IP "\fBaac_pred\fR" 4
+.IX Item "aac_pred"
+Enables the use of a more traditional style of prediction where the spectral
+coefficients transmitted are replaced by the difference of the current
+coefficients minus the previous \*(L"predicted\*(R" coefficients. In theory and sometimes
+in practice this can improve quality for low to mid bitrate audio.
+This option implies the aac_main profile and is incompatible with aac_ltp.
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Sets the encoding profile, possible values:
+.RS 4
+.IP "\fBaac_low\fR" 4
+.IX Item "aac_low"
+The default, \s-1AAC\s0 \*(L"Low-complexity\*(R" profile. Is the most compatible and produces
+decent quality.
+.IP "\fBmpeg2_aac_low\fR" 4
+.IX Item "mpeg2_aac_low"
+Equivalent to \f(CW\*(C`\-profile:a aac_low \-aac_pns 0\*(C'\fR. \s-1PNS\s0 was introduced with the
+\&\s-1MPEG4\s0 specifications.
+.IP "\fBaac_ltp\fR" 4
+.IX Item "aac_ltp"
+Long term prediction profile, is enabled by and will enable the \fBaac_ltp\fR
+option. Introduced in \s-1MPEG4.\s0
+.IP "\fBaac_main\fR" 4
+.IX Item "aac_main"
+Main-type prediction profile, is enabled by and will enable the \fBaac_pred\fR
+option. Introduced in \s-1MPEG2.\s0
+.RE
+.RS 4
+.Sp
+If this option is unspecified it is set to \fBaac_low\fR.
+.RE
+.SS "ac3 and ac3_fixed"
+.IX Subsection "ac3 and ac3_fixed"
+\&\s-1AC\-3\s0 audio encoders.
+.PP
+These encoders implement part of \s-1ATSC A/52:2010\s0 and \s-1ETSI TS 102 366,\s0 as well as
+the undocumented RealAudio 3 (a.k.a. dnet).
+.PP
+The \fIac3\fR encoder uses floating-point math, while the \fIac3_fixed\fR
+encoder only uses fixed-point integer math. This does not mean that one is
+always faster, just that one or the other may be better suited to a
+particular system. The \fIac3_fixed\fR encoder is not the default codec for
+any of the output formats, so it must be specified explicitly using the option
+\&\f(CW\*(C`\-acodec ac3_fixed\*(C'\fR in order to use it.
+.PP
+\fI\s-1AC\-3\s0 Metadata\fR
+.IX Subsection "AC-3 Metadata"
+.PP
+The \s-1AC\-3\s0 metadata options are used to set parameters that describe the audio,
+but in most cases do not affect the audio encoding itself. Some of the options
+do directly affect or influence the decoding and playback of the resulting
+bitstream, while others are just for informational purposes. A few of the
+options will add bits to the output stream that could otherwise be used for
+audio data, and will thus affect the quality of the output. Those will be
+indicated accordingly with a note in the option list below.
+.PP
+These parameters are described in detail in several publicly-available
+documents.
+.IP "*<<\fBhttp://www.atsc.org/cms/standards/a_52\-2010.pdf\fR>>" 4
+.IX Item "*<>"
+.PD 0
+.IP "*<<\fBhttp://www.atsc.org/cms/standards/a_54a_with_corr_1.pdf\fR>>" 4
+.IX Item "*<>"
+.IP "*<<\fBhttp://www.dolby.com/uploadedFiles/zz\-_Shared_Assets/English_PDFs/Professional/18_Metadata.Guide.pdf\fR>>" 4
+.IX Item "*<>"
+.IP "*<<\fBhttp://www.dolby.com/uploadedFiles/zz\-_Shared_Assets/English_PDFs/Professional/46_DDEncodingGuidelines.pdf\fR>>" 4
+.IX Item "*<>"
+.PD
+.PP
+Metadata Control Options
+.IX Subsection "Metadata Control Options"
+.IP "\fB\-per_frame_metadata\fR \fIboolean\fR" 4
+.IX Item "-per_frame_metadata boolean"
+Allow Per-Frame Metadata. Specifies if the encoder should check for changing
+metadata for each frame.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+The metadata values set at initialization will be used for every frame in the
+stream. (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+Metadata values can be changed before encoding each frame.
+.RE
+.RS 4
+.RE
+.PP
+Downmix Levels
+.IX Subsection "Downmix Levels"
+.IP "\fB\-center_mixlev\fR \fIlevel\fR" 4
+.IX Item "-center_mixlev level"
+Center Mix Level. The amount of gain the decoder should apply to the center
+channel when downmixing to stereo. This field will only be written to the
+bitstream if a center channel is present. The value is specified as a scale
+factor. There are 3 valid values:
+.RS 4
+.IP "\fB0.707\fR" 4
+.IX Item "0.707"
+Apply \-3dB gain
+.IP "\fB0.595\fR" 4
+.IX Item "0.595"
+Apply \-4.5dB gain (default)
+.IP "\fB0.500\fR" 4
+.IX Item "0.500"
+Apply \-6dB gain
+.RE
+.RS 4
+.RE
+.IP "\fB\-surround_mixlev\fR \fIlevel\fR" 4
+.IX Item "-surround_mixlev level"
+Surround Mix Level. The amount of gain the decoder should apply to the surround
+channel(s) when downmixing to stereo. This field will only be written to the
+bitstream if one or more surround channels are present. The value is specified
+as a scale factor. There are 3 valid values:
+.RS 4
+.IP "\fB0.707\fR" 4
+.IX Item "0.707"
+Apply \-3dB gain
+.IP "\fB0.500\fR" 4
+.IX Item "0.500"
+Apply \-6dB gain (default)
+.IP "\fB0.000\fR" 4
+.IX Item "0.000"
+Silence Surround Channel(s)
+.RE
+.RS 4
+.RE
+.PP
+Audio Production Information
+.IX Subsection "Audio Production Information"
+.PP
+Audio Production Information is optional information describing the mixing
+environment. Either none or both of the fields are written to the bitstream.
+.IP "\fB\-mixing_level\fR \fInumber\fR" 4
+.IX Item "-mixing_level number"
+Mixing Level. Specifies peak sound pressure level (\s-1SPL\s0) in the production
+environment when the mix was mastered. Valid values are 80 to 111, or \-1 for
+unknown or not indicated. The default value is \-1, but that value cannot be
+used if the Audio Production Information is written to the bitstream. Therefore,
+if the \f(CW\*(C`room_type\*(C'\fR option is not the default value, the \f(CW\*(C`mixing_level\*(C'\fR
+option must not be \-1.
+.IP "\fB\-room_type\fR \fItype\fR" 4
+.IX Item "-room_type type"
+Room Type. Describes the equalization used during the final mixing session at
+the studio or on the dubbing stage. A large room is a dubbing stage with the
+industry standard X\-curve equalization; a small room has flat equalization.
+This field will not be written to the bitstream if both the \f(CW\*(C`mixing_level\*(C'\fR
+option and the \f(CW\*(C`room_type\*(C'\fR option have the default values.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBnotindicated\fR" 4
+.IX Item "notindicated"
+.PD
+Not Indicated (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBlarge\fR" 4
+.IX Item "large"
+.PD
+Large Room
+.IP "\fB2\fR" 4
+.IX Item "2"
+.PD 0
+.IP "\fBsmall\fR" 4
+.IX Item "small"
+.PD
+Small Room
+.RE
+.RS 4
+.RE
+.PP
+Other Metadata Options
+.IX Subsection "Other Metadata Options"
+.IP "\fB\-copyright\fR \fIboolean\fR" 4
+.IX Item "-copyright boolean"
+Copyright Indicator. Specifies whether a copyright exists for this audio.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBoff\fR" 4
+.IX Item "off"
+.PD
+No Copyright Exists (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBon\fR" 4
+.IX Item "on"
+.PD
+Copyright Exists
+.RE
+.RS 4
+.RE
+.IP "\fB\-dialnorm\fR \fIvalue\fR" 4
+.IX Item "-dialnorm value"
+Dialogue Normalization. Indicates how far the average dialogue level of the
+program is below digital 100% full scale (0 dBFS). This parameter determines a
+level shift during audio reproduction that sets the average volume of the
+dialogue to a preset level. The goal is to match volume level between program
+sources. A value of \-31dB will result in no volume level change, relative to
+the source volume, during audio reproduction. Valid values are whole numbers in
+the range \-31 to \-1, with \-31 being the default.
+.IP "\fB\-dsur_mode\fR \fImode\fR" 4
+.IX Item "-dsur_mode mode"
+Dolby Surround Mode. Specifies whether the stereo signal uses Dolby Surround
+(Pro Logic). This field will only be written to the bitstream if the audio
+stream is stereo. Using this option does \fB\s-1NOT\s0\fR mean the encoder will actually
+apply Dolby Surround processing.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBnotindicated\fR" 4
+.IX Item "notindicated"
+.PD
+Not Indicated (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBoff\fR" 4
+.IX Item "off"
+.PD
+Not Dolby Surround Encoded
+.IP "\fB2\fR" 4
+.IX Item "2"
+.PD 0
+.IP "\fBon\fR" 4
+.IX Item "on"
+.PD
+Dolby Surround Encoded
+.RE
+.RS 4
+.RE
+.IP "\fB\-original\fR \fIboolean\fR" 4
+.IX Item "-original boolean"
+Original Bit Stream Indicator. Specifies whether this audio is from the
+original source and not a copy.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBoff\fR" 4
+.IX Item "off"
+.PD
+Not Original Source
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBon\fR" 4
+.IX Item "on"
+.PD
+Original Source (default)
+.RE
+.RS 4
+.RE
+.PP
+\fIExtended Bitstream Information\fR
+.IX Subsection "Extended Bitstream Information"
+.PP
+The extended bitstream options are part of the Alternate Bit Stream Syntax as
+specified in Annex D of the A/52:2010 standard. It is grouped into 2 parts.
+If any one parameter in a group is specified, all values in that group will be
+written to the bitstream. Default values are used for those that are written
+but have not been specified. If the mixing levels are written, the decoder
+will use these values instead of the ones specified in the \f(CW\*(C`center_mixlev\*(C'\fR
+and \f(CW\*(C`surround_mixlev\*(C'\fR options if it supports the Alternate Bit Stream
+Syntax.
+.PP
+Extended Bitstream Information \- Part 1
+.IX Subsection "Extended Bitstream Information - Part 1"
+.IP "\fB\-dmix_mode\fR \fImode\fR" 4
+.IX Item "-dmix_mode mode"
+Preferred Stereo Downmix Mode. Allows the user to select either Lt/Rt
+(Dolby Surround) or Lo/Ro (normal stereo) as the preferred stereo downmix mode.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBnotindicated\fR" 4
+.IX Item "notindicated"
+.PD
+Not Indicated (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBltrt\fR" 4
+.IX Item "ltrt"
+.PD
+Lt/Rt Downmix Preferred
+.IP "\fB2\fR" 4
+.IX Item "2"
+.PD 0
+.IP "\fBloro\fR" 4
+.IX Item "loro"
+.PD
+Lo/Ro Downmix Preferred
+.RE
+.RS 4
+.RE
+.IP "\fB\-ltrt_cmixlev\fR \fIlevel\fR" 4
+.IX Item "-ltrt_cmixlev level"
+Lt/Rt Center Mix Level. The amount of gain the decoder should apply to the
+center channel when downmixing to stereo in Lt/Rt mode.
+.RS 4
+.IP "\fB1.414\fR" 4
+.IX Item "1.414"
+Apply +3dB gain
+.IP "\fB1.189\fR" 4
+.IX Item "1.189"
+Apply +1.5dB gain
+.IP "\fB1.000\fR" 4
+.IX Item "1.000"
+Apply 0dB gain
+.IP "\fB0.841\fR" 4
+.IX Item "0.841"
+Apply \-1.5dB gain
+.IP "\fB0.707\fR" 4
+.IX Item "0.707"
+Apply \-3.0dB gain
+.IP "\fB0.595\fR" 4
+.IX Item "0.595"
+Apply \-4.5dB gain (default)
+.IP "\fB0.500\fR" 4
+.IX Item "0.500"
+Apply \-6.0dB gain
+.IP "\fB0.000\fR" 4
+.IX Item "0.000"
+Silence Center Channel
+.RE
+.RS 4
+.RE
+.IP "\fB\-ltrt_surmixlev\fR \fIlevel\fR" 4
+.IX Item "-ltrt_surmixlev level"
+Lt/Rt Surround Mix Level. The amount of gain the decoder should apply to the
+surround channel(s) when downmixing to stereo in Lt/Rt mode.
+.RS 4
+.IP "\fB0.841\fR" 4
+.IX Item "0.841"
+Apply \-1.5dB gain
+.IP "\fB0.707\fR" 4
+.IX Item "0.707"
+Apply \-3.0dB gain
+.IP "\fB0.595\fR" 4
+.IX Item "0.595"
+Apply \-4.5dB gain
+.IP "\fB0.500\fR" 4
+.IX Item "0.500"
+Apply \-6.0dB gain (default)
+.IP "\fB0.000\fR" 4
+.IX Item "0.000"
+Silence Surround Channel(s)
+.RE
+.RS 4
+.RE
+.IP "\fB\-loro_cmixlev\fR \fIlevel\fR" 4
+.IX Item "-loro_cmixlev level"
+Lo/Ro Center Mix Level. The amount of gain the decoder should apply to the
+center channel when downmixing to stereo in Lo/Ro mode.
+.RS 4
+.IP "\fB1.414\fR" 4
+.IX Item "1.414"
+Apply +3dB gain
+.IP "\fB1.189\fR" 4
+.IX Item "1.189"
+Apply +1.5dB gain
+.IP "\fB1.000\fR" 4
+.IX Item "1.000"
+Apply 0dB gain
+.IP "\fB0.841\fR" 4
+.IX Item "0.841"
+Apply \-1.5dB gain
+.IP "\fB0.707\fR" 4
+.IX Item "0.707"
+Apply \-3.0dB gain
+.IP "\fB0.595\fR" 4
+.IX Item "0.595"
+Apply \-4.5dB gain (default)
+.IP "\fB0.500\fR" 4
+.IX Item "0.500"
+Apply \-6.0dB gain
+.IP "\fB0.000\fR" 4
+.IX Item "0.000"
+Silence Center Channel
+.RE
+.RS 4
+.RE
+.IP "\fB\-loro_surmixlev\fR \fIlevel\fR" 4
+.IX Item "-loro_surmixlev level"
+Lo/Ro Surround Mix Level. The amount of gain the decoder should apply to the
+surround channel(s) when downmixing to stereo in Lo/Ro mode.
+.RS 4
+.IP "\fB0.841\fR" 4
+.IX Item "0.841"
+Apply \-1.5dB gain
+.IP "\fB0.707\fR" 4
+.IX Item "0.707"
+Apply \-3.0dB gain
+.IP "\fB0.595\fR" 4
+.IX Item "0.595"
+Apply \-4.5dB gain
+.IP "\fB0.500\fR" 4
+.IX Item "0.500"
+Apply \-6.0dB gain (default)
+.IP "\fB0.000\fR" 4
+.IX Item "0.000"
+Silence Surround Channel(s)
+.RE
+.RS 4
+.RE
+.PP
+Extended Bitstream Information \- Part 2
+.IX Subsection "Extended Bitstream Information - Part 2"
+.IP "\fB\-dsurex_mode\fR \fImode\fR" 4
+.IX Item "-dsurex_mode mode"
+Dolby Surround \s-1EX\s0 Mode. Indicates whether the stream uses Dolby Surround \s-1EX\s0
+(7.1 matrixed to 5.1). Using this option does \fB\s-1NOT\s0\fR mean the encoder will actually
+apply Dolby Surround \s-1EX\s0 processing.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBnotindicated\fR" 4
+.IX Item "notindicated"
+.PD
+Not Indicated (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBon\fR" 4
+.IX Item "on"
+.PD
+Dolby Surround \s-1EX\s0 Off
+.IP "\fB2\fR" 4
+.IX Item "2"
+.PD 0
+.IP "\fBoff\fR" 4
+.IX Item "off"
+.PD
+Dolby Surround \s-1EX\s0 On
+.RE
+.RS 4
+.RE
+.IP "\fB\-dheadphone_mode\fR \fImode\fR" 4
+.IX Item "-dheadphone_mode mode"
+Dolby Headphone Mode. Indicates whether the stream uses Dolby Headphone
+encoding (multi-channel matrixed to 2.0 for use with headphones). Using this
+option does \fB\s-1NOT\s0\fR mean the encoder will actually apply Dolby Headphone
+processing.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBnotindicated\fR" 4
+.IX Item "notindicated"
+.PD
+Not Indicated (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBon\fR" 4
+.IX Item "on"
+.PD
+Dolby Headphone Off
+.IP "\fB2\fR" 4
+.IX Item "2"
+.PD 0
+.IP "\fBoff\fR" 4
+.IX Item "off"
+.PD
+Dolby Headphone On
+.RE
+.RS 4
+.RE
+.IP "\fB\-ad_conv_type\fR \fItype\fR" 4
+.IX Item "-ad_conv_type type"
+A/D Converter Type. Indicates whether the audio has passed through \s-1HDCD A/D\s0
+conversion.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBstandard\fR" 4
+.IX Item "standard"
+.PD
+Standard A/D Converter (default)
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBhdcd\fR" 4
+.IX Item "hdcd"
+.PD
+\&\s-1HDCD A/D\s0 Converter
+.RE
+.RS 4
+.RE
+.PP
+\fIOther \s-1AC\-3\s0 Encoding Options\fR
+.IX Subsection "Other AC-3 Encoding Options"
+.IP "\fB\-stereo_rematrixing\fR \fIboolean\fR" 4
+.IX Item "-stereo_rematrixing boolean"
+Stereo Rematrixing. Enables/Disables use of rematrixing for stereo input. This
+is an optional \s-1AC\-3\s0 feature that increases quality by selectively encoding
+the left/right channels as mid/side. This option is enabled by default, and it
+is highly recommended that it be left as enabled except for testing purposes.
+.IP "\fBcutoff\fR \fIfrequency\fR" 4
+.IX Item "cutoff frequency"
+Set lowpass cutoff frequency. If unspecified, the encoder selects a default
+determined by various other encoding parameters.
+.PP
+\fIFloating-Point-Only \s-1AC\-3\s0 Encoding Options\fR
+.IX Subsection "Floating-Point-Only AC-3 Encoding Options"
+.PP
+These options are only valid for the floating-point encoder and do not exist
+for the fixed-point encoder due to the corresponding features not being
+implemented in fixed-point.
+.IP "\fB\-channel_coupling\fR \fIboolean\fR" 4
+.IX Item "-channel_coupling boolean"
+Enables/Disables use of channel coupling, which is an optional \s-1AC\-3\s0 feature
+that increases quality by combining high frequency information from multiple
+channels into a single channel. The per-channel high frequency information is
+sent with less accuracy in both the frequency and time domains. This allows
+more bits to be used for lower frequencies while preserving enough information
+to reconstruct the high frequencies. This option is enabled by default for the
+floating-point encoder and should generally be left as enabled except for
+testing purposes or to increase encoding speed.
+.RS 4
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+.PD 0
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+.PD
+Selected by Encoder (default)
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBoff\fR" 4
+.IX Item "off"
+.PD
+Disable Channel Coupling
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBon\fR" 4
+.IX Item "on"
+.PD
+Enable Channel Coupling
+.RE
+.RS 4
+.RE
+.IP "\fB\-cpl_start_band\fR \fInumber\fR" 4
+.IX Item "-cpl_start_band number"
+Coupling Start Band. Sets the channel coupling start band, from 1 to 15. If a
+value higher than the bandwidth is used, it will be reduced to 1 less than the
+coupling end band. If \fIauto\fR is used, the start band will be determined by
+the encoder based on the bit rate, sample rate, and channel layout. This option
+has no effect if channel coupling is disabled.
+.RS 4
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+.PD 0
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+.PD
+Selected by Encoder (default)
+.RE
+.RS 4
+.RE
+.SS "flac"
+.IX Subsection "flac"
+\&\s-1FLAC\s0 (Free Lossless Audio Codec) Encoder
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by FFmpeg's flac encoder.
+.IP "\fBcompression_level\fR" 4
+.IX Item "compression_level"
+Sets the compression level, which chooses defaults for many other options
+if they are not set explicitly. Valid values are from 0 to 12, 5 is the
+default.
+.IP "\fBframe_size\fR" 4
+.IX Item "frame_size"
+Sets the size of the frames in samples per channel.
+.IP "\fBlpc_coeff_precision\fR" 4
+.IX Item "lpc_coeff_precision"
+Sets the \s-1LPC\s0 coefficient precision, valid values are from 1 to 15, 15 is the
+default.
+.IP "\fBlpc_type\fR" 4
+.IX Item "lpc_type"
+Sets the first stage \s-1LPC\s0 algorithm
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+\&\s-1LPC\s0 is not used
+.IP "\fBfixed\fR" 4
+.IX Item "fixed"
+fixed \s-1LPC\s0 coefficients
+.IP "\fBlevinson\fR" 4
+.IX Item "levinson"
+.PD 0
+.IP "\fBcholesky\fR" 4
+.IX Item "cholesky"
+.RE
+.RS 4
+.RE
+.IP "\fBlpc_passes\fR" 4
+.IX Item "lpc_passes"
+.PD
+Number of passes to use for Cholesky factorization during \s-1LPC\s0 analysis
+.IP "\fBmin_partition_order\fR" 4
+.IX Item "min_partition_order"
+The minimum partition order
+.IP "\fBmax_partition_order\fR" 4
+.IX Item "max_partition_order"
+The maximum partition order
+.IP "\fBprediction_order_method\fR" 4
+.IX Item "prediction_order_method"
+.RS 4
+.PD 0
+.IP "\fBestimation\fR" 4
+.IX Item "estimation"
+.IP "\fB2level\fR" 4
+.IX Item "2level"
+.IP "\fB4level\fR" 4
+.IX Item "4level"
+.IP "\fB8level\fR" 4
+.IX Item "8level"
+.IP "\fBsearch\fR" 4
+.IX Item "search"
+.PD
+Bruteforce search
+.IP "\fBlog\fR" 4
+.IX Item "log"
+.RE
+.RS 4
+.RE
+.PD 0
+.IP "\fBch_mode\fR" 4
+.IX Item "ch_mode"
+.PD
+Channel mode
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+The mode is chosen automatically for each frame
+.IP "\fBindep\fR" 4
+.IX Item "indep"
+Channels are independently coded
+.IP "\fBleft_side\fR" 4
+.IX Item "left_side"
+.PD 0
+.IP "\fBright_side\fR" 4
+.IX Item "right_side"
+.IP "\fBmid_side\fR" 4
+.IX Item "mid_side"
+.RE
+.RS 4
+.RE
+.IP "\fBexact_rice_parameters\fR" 4
+.IX Item "exact_rice_parameters"
+.PD
+Chooses if rice parameters are calculated exactly or approximately.
+if set to 1 then they are chosen exactly, which slows the code down slightly and
+improves compression slightly.
+.IP "\fBmulti_dim_quant\fR" 4
+.IX Item "multi_dim_quant"
+Multi Dimensional Quantization. If set to 1 then a 2nd stage \s-1LPC\s0 algorithm is
+applied after the first stage to finetune the coefficients. This is quite slow
+and slightly improves compression.
+.SS "opus"
+.IX Subsection "opus"
+Opus encoder.
+.PP
+This is a native FFmpeg encoder for the Opus format. Currently its in development and
+only implements the \s-1CELT\s0 part of the codec. Its quality is usually worse and at best
+is equal to the libopus encoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set bit rate in bits/s. If unspecified it uses the number of channels and the layout
+to make a good guess.
+.IP "\fBopus_delay\fR" 4
+.IX Item "opus_delay"
+Sets the maximum delay in milliseconds. Lower delays than 20ms will very quickly
+decrease quality.
+.SS "libfdk_aac"
+.IX Subsection "libfdk_aac"
+libfdk-aac \s-1AAC\s0 (Advanced Audio Coding) encoder wrapper.
+.PP
+The libfdk-aac library is based on the Fraunhofer \s-1FDK AAC\s0 code from
+the Android project.
+.PP
+Requires the presence of the libfdk-aac headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libfdk\-aac\*(C'\fR. The library is also incompatible with \s-1GPL,\s0
+so if you allow the use of \s-1GPL,\s0 you should configure with
+\&\f(CW\*(C`\-\-enable\-gpl \-\-enable\-nonfree \-\-enable\-libfdk\-aac\*(C'\fR.
+.PP
+This encoder has support for the AAC-HE profiles.
+.PP
+\&\s-1VBR\s0 encoding, enabled through the \fBvbr\fR or \fBflags
++qscale\fR options, is experimental and only works with some
+combinations of parameters.
+.PP
+Support for encoding 7.1 audio is only available with libfdk-aac 0.1.3 or
+higher.
+.PP
+For more information see the fdk-aac project at
+<\fBhttp://sourceforge.net/p/opencore\-amr/fdk\-aac/\fR>.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are mapped on the shared FFmpeg codec options.
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set bit rate in bits/s. If the bitrate is not explicitly specified, it
+is automatically set to a suitable value depending on the selected
+profile.
+.Sp
+In case \s-1VBR\s0 mode is enabled the option is ignored.
+.IP "\fBar\fR" 4
+.IX Item "ar"
+Set audio sampling rate (in Hz).
+.IP "\fBchannels\fR" 4
+.IX Item "channels"
+Set the number of audio channels.
+.IP "\fBflags +qscale\fR" 4
+.IX Item "flags +qscale"
+Enable fixed quality, \s-1VBR\s0 (Variable Bit Rate) mode.
+Note that \s-1VBR\s0 is implicitly enabled when the \fBvbr\fR value is
+positive.
+.IP "\fBcutoff\fR" 4
+.IX Item "cutoff"
+Set cutoff frequency. If not specified (or explicitly set to 0) it
+will use a value automatically computed by the library. Default value
+is 0.
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Set audio profile.
+.Sp
+The following profiles are recognized:
+.RS 4
+.IP "\fBaac_low\fR" 4
+.IX Item "aac_low"
+Low Complexity \s-1AAC\s0 (\s-1LC\s0)
+.IP "\fBaac_he\fR" 4
+.IX Item "aac_he"
+High Efficiency \s-1AAC\s0 (HE-AAC)
+.IP "\fBaac_he_v2\fR" 4
+.IX Item "aac_he_v2"
+High Efficiency \s-1AAC\s0 version 2 (HE\-AACv2)
+.IP "\fBaac_ld\fR" 4
+.IX Item "aac_ld"
+Low Delay \s-1AAC\s0 (\s-1LD\s0)
+.IP "\fBaac_eld\fR" 4
+.IX Item "aac_eld"
+Enhanced Low Delay \s-1AAC\s0 (\s-1ELD\s0)
+.RE
+.RS 4
+.Sp
+If not specified it is set to \fBaac_low\fR.
+.RE
+.PP
+The following are private options of the libfdk_aac encoder.
+.IP "\fBafterburner\fR" 4
+.IX Item "afterburner"
+Enable afterburner feature if set to 1, disabled if set to 0. This
+improves the quality but also the required processing power.
+.Sp
+Default value is 1.
+.IP "\fBeld_sbr\fR" 4
+.IX Item "eld_sbr"
+Enable \s-1SBR\s0 (Spectral Band Replication) for \s-1ELD\s0 if set to 1, disabled
+if set to 0.
+.Sp
+Default value is 0.
+.IP "\fBeld_v2\fR" 4
+.IX Item "eld_v2"
+Enable ELDv2 (LD-MPS extension for \s-1ELD\s0 stereo signals) for ELDv2 if set to 1,
+disabled if set to 0.
+.Sp
+Note that option is available when fdk-aac version (\s-1AACENCODER_LIB_VL0.AACENCODER_LIB_VL1.AACENCODER_LIB_VL2\s0) > (4.0.0).
+.Sp
+Default value is 0.
+.IP "\fBsignaling\fR" 4
+.IX Item "signaling"
+Set \s-1SBR/PS\s0 signaling style.
+.Sp
+It can assume one of the following values:
+.RS 4
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+choose signaling implicitly (explicit hierarchical by default,
+implicit if global header is disabled)
+.IP "\fBimplicit\fR" 4
+.IX Item "implicit"
+implicit backwards compatible signaling
+.IP "\fBexplicit_sbr\fR" 4
+.IX Item "explicit_sbr"
+explicit \s-1SBR,\s0 implicit \s-1PS\s0 signaling
+.IP "\fBexplicit_hierarchical\fR" 4
+.IX Item "explicit_hierarchical"
+explicit hierarchical signaling
+.RE
+.RS 4
+.Sp
+Default value is \fBdefault\fR.
+.RE
+.IP "\fBlatm\fR" 4
+.IX Item "latm"
+Output \s-1LATM/LOAS\s0 encapsulated data if set to 1, disabled if set to 0.
+.Sp
+Default value is 0.
+.IP "\fBheader_period\fR" 4
+.IX Item "header_period"
+Set StreamMuxConfig and \s-1PCE\s0 repetition period (in frames) for sending
+in-band configuration buffers within \s-1LATM/LOAS\s0 transport layer.
+.Sp
+Must be a 16\-bits non-negative integer.
+.Sp
+Default value is 0.
+.IP "\fBvbr\fR" 4
+.IX Item "vbr"
+Set \s-1VBR\s0 mode, from 1 to 5. 1 is lowest quality (though still pretty
+good) and 5 is highest quality. A value of 0 will disable \s-1VBR,\s0 and \s-1CBR\s0
+(Constant Bit Rate) is enabled.
+.Sp
+Currently only the \fBaac_low\fR profile supports \s-1VBR\s0 encoding.
+.Sp
+\&\s-1VBR\s0 modes 1\-5 correspond to roughly the following average bit rates:
+.RS 4
+.IP "\fB1\fR" 4
+.IX Item "1"
+32 kbps/channel
+.IP "\fB2\fR" 4
+.IX Item "2"
+40 kbps/channel
+.IP "\fB3\fR" 4
+.IX Item "3"
+48\-56 kbps/channel
+.IP "\fB4\fR" 4
+.IX Item "4"
+64 kbps/channel
+.IP "\fB5\fR" 4
+.IX Item "5"
+about 80\-96 kbps/channel
+.RE
+.RS 4
+.Sp
+Default value is 0.
+.RE
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Use \fBffmpeg\fR to convert an audio file to \s-1VBR AAC\s0 in an M4A (\s-1MP4\s0)
+container:
+.Sp
+.Vb 1
+\& ffmpeg \-i input.wav \-codec:a libfdk_aac \-vbr 3 output.m4a
+.Ve
+.IP "\(bu" 4
+Use \fBffmpeg\fR to convert an audio file to \s-1CBR\s0 64k kbps \s-1AAC,\s0 using the
+High-Efficiency \s-1AAC\s0 profile:
+.Sp
+.Vb 1
+\& ffmpeg \-i input.wav \-c:a libfdk_aac \-profile:a aac_he \-b:a 64k output.m4a
+.Ve
+.SS "libmp3lame"
+.IX Subsection "libmp3lame"
+\&\s-1LAME\s0 (Lame Ain't an \s-1MP3\s0 Encoder) \s-1MP3\s0 encoder wrapper.
+.PP
+Requires the presence of the libmp3lame headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libmp3lame\*(C'\fR.
+.PP
+See \fBlibshine\fR for a fixed-point \s-1MP3\s0 encoder, although with a
+lower quality.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libmp3lame wrapper. The
+\&\fBlame\fR\-equivalent of the options are listed in parentheses.
+.IP "\fBb (\fR\fI\-b\fR\fB)\fR" 4
+.IX Item "b (-b)"
+Set bitrate expressed in bits/s for \s-1CBR\s0 or \s-1ABR. LAME\s0 \f(CW\*(C`bitrate\*(C'\fR is
+expressed in kilobits/s.
+.IP "\fBq (\fR\fI\-V\fR\fB)\fR" 4
+.IX Item "q (-V)"
+Set constant quality setting for \s-1VBR.\s0 This option is valid only
+using the \fBffmpeg\fR command-line tool. For library interface
+users, use \fBglobal_quality\fR.
+.IP "\fBcompression_level (\fR\fI\-q\fR\fB)\fR" 4
+.IX Item "compression_level (-q)"
+Set algorithm quality. Valid arguments are integers in the 0\-9 range,
+with 0 meaning highest quality but slowest, and 9 meaning fastest
+while producing the worst quality.
+.IP "\fBcutoff (\fR\fI\-\-lowpass\fR\fB)\fR" 4
+.IX Item "cutoff (--lowpass)"
+Set lowpass cutoff frequency. If unspecified, the encoder dynamically
+adjusts the cutoff.
+.IP "\fBreservoir\fR" 4
+.IX Item "reservoir"
+Enable use of bit reservoir when set to 1. Default value is 1. \s-1LAME\s0
+has this enabled by default, but can be overridden by use
+\&\fB\-\-nores\fR option.
+.IP "\fBjoint_stereo (\fR\fI\-m j\fR\fB)\fR" 4
+.IX Item "joint_stereo (-m j)"
+Enable the encoder to use (on a frame by frame basis) either L/R
+stereo or mid/side stereo. Default value is 1.
+.IP "\fBabr (\fR\fI\-\-abr\fR\fB)\fR" 4
+.IX Item "abr (--abr)"
+Enable the encoder to use \s-1ABR\s0 when set to 1. The \fBlame\fR
+\&\fB\-\-abr\fR sets the target bitrate, while this options only
+tells FFmpeg to use \s-1ABR\s0 still relies on \fBb\fR to set bitrate.
+.SS "libopencore-amrnb"
+.IX Subsection "libopencore-amrnb"
+OpenCORE Adaptive Multi-Rate Narrowband encoder.
+.PP
+Requires the presence of the libopencore-amrnb headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libopencore\-amrnb \-\-enable\-version3\*(C'\fR.
+.PP
+This is a mono-only encoder. Officially it only supports 8000Hz sample rate,
+but you can override it by setting \fBstrict\fR to \fBunofficial\fR or
+lower.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set bitrate in bits per second. Only the following bitrates are supported,
+otherwise libavcodec will round to the nearest valid bitrate.
+.RS 4
+.IP "\fB4750\fR" 4
+.IX Item "4750"
+.PD 0
+.IP "\fB5150\fR" 4
+.IX Item "5150"
+.IP "\fB5900\fR" 4
+.IX Item "5900"
+.IP "\fB6700\fR" 4
+.IX Item "6700"
+.IP "\fB7400\fR" 4
+.IX Item "7400"
+.IP "\fB7950\fR" 4
+.IX Item "7950"
+.IP "\fB10200\fR" 4
+.IX Item "10200"
+.IP "\fB12200\fR" 4
+.IX Item "12200"
+.RE
+.RS 4
+.RE
+.IP "\fBdtx\fR" 4
+.IX Item "dtx"
+.PD
+Allow discontinuous transmission (generate comfort noise) when set to 1. The
+default value is 0 (disabled).
+.SS "libopus"
+.IX Subsection "libopus"
+libopus Opus Interactive Audio Codec encoder wrapper.
+.PP
+Requires the presence of the libopus headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libopus\*(C'\fR.
+.PP
+\fIOption Mapping\fR
+.IX Subsection "Option Mapping"
+.PP
+Most libopus options are modelled after the \fBopusenc\fR utility from
+opus-tools. The following is an option mapping chart describing options
+supported by the libopus wrapper, and their \fBopusenc\fR\-equivalent
+in parentheses.
+.IP "\fBb (\fR\fIbitrate\fR\fB)\fR" 4
+.IX Item "b (bitrate)"
+Set the bit rate in bits/s. FFmpeg's \fBb\fR option is
+expressed in bits/s, while \fBopusenc\fR's \fBbitrate\fR in
+kilobits/s.
+.IP "\fBvbr (\fR\fIvbr\fR\fB,\fR \fIhard-cbr\fR\fB, and\fR \fIcvbr\fR\fB)\fR" 4
+.IX Item "vbr (vbr, hard-cbr, and cvbr)"
+Set \s-1VBR\s0 mode. The FFmpeg \fBvbr\fR option has the following
+valid arguments, with the \fBopusenc\fR equivalent options
+in parentheses:
+.RS 4
+.IP "\fBoff (\fR\fIhard-cbr\fR\fB)\fR" 4
+.IX Item "off (hard-cbr)"
+Use constant bit rate encoding.
+.IP "\fBon (\fR\fIvbr\fR\fB)\fR" 4
+.IX Item "on (vbr)"
+Use variable bit rate encoding (the default).
+.IP "\fBconstrained (\fR\fIcvbr\fR\fB)\fR" 4
+.IX Item "constrained (cvbr)"
+Use constrained variable bit rate encoding.
+.RE
+.RS 4
+.RE
+.IP "\fBcompression_level (\fR\fIcomp\fR\fB)\fR" 4
+.IX Item "compression_level (comp)"
+Set encoding algorithm complexity. Valid options are integers in
+the 0\-10 range. 0 gives the fastest encodes but lower quality, while 10
+gives the highest quality but slowest encoding. The default is 10.
+.IP "\fBframe_duration (\fR\fIframesize\fR\fB)\fR" 4
+.IX Item "frame_duration (framesize)"
+Set maximum frame size, or duration of a frame in milliseconds. The
+argument must be exactly the following: 2.5, 5, 10, 20, 40, 60. Smaller
+frame sizes achieve lower latency but less quality at a given bitrate.
+Sizes greater than 20ms are only interesting at fairly low bitrates.
+The default is 20ms.
+.IP "\fBpacket_loss (\fR\fIexpect-loss\fR\fB)\fR" 4
+.IX Item "packet_loss (expect-loss)"
+Set expected packet loss percentage. The default is 0.
+.IP "\fBfec (\fR\fIn/a\fR\fB)\fR" 4
+.IX Item "fec (n/a)"
+Enable inband forward error correction. \fBpacket_loss\fR must be non-zero
+to take advantage \- frequency of \s-1FEC\s0 'side\-data' is proportional to expected packet loss.
+Default is disabled.
+.IP "\fBapplication (N.A.)\fR" 4
+.IX Item "application (N.A.)"
+Set intended application type. Valid options are listed below:
+.RS 4
+.IP "\fBvoip\fR" 4
+.IX Item "voip"
+Favor improved speech intelligibility.
+.IP "\fBaudio\fR" 4
+.IX Item "audio"
+Favor faithfulness to the input (the default).
+.IP "\fBlowdelay\fR" 4
+.IX Item "lowdelay"
+Restrict to only the lowest delay modes.
+.RE
+.RS 4
+.RE
+.IP "\fBcutoff (N.A.)\fR" 4
+.IX Item "cutoff (N.A.)"
+Set cutoff bandwidth in Hz. The argument must be exactly one of the
+following: 4000, 6000, 8000, 12000, or 20000, corresponding to
+narrowband, mediumband, wideband, super wideband, and fullband
+respectively. The default is 0 (cutoff disabled).
+.IP "\fBmapping_family (\fR\fImapping_family\fR\fB)\fR" 4
+.IX Item "mapping_family (mapping_family)"
+Set channel mapping family to be used by the encoder. The default value of \-1
+uses mapping family 0 for mono and stereo inputs, and mapping family 1
+otherwise. The default also disables the surround masking and \s-1LFE\s0 bandwidth
+optimzations in libopus, and requires that the input contains 8 channels or
+fewer.
+.Sp
+Other values include 0 for mono and stereo, 1 for surround sound with masking
+and \s-1LFE\s0 bandwidth optimizations, and 255 for independent streams with an
+unspecified channel layout.
+.IP "\fBapply_phase_inv (N.A.) (requires libopus >= 1.2)\fR" 4
+.IX Item "apply_phase_inv (N.A.) (requires libopus >= 1.2)"
+If set to 0, disables the use of phase inversion for intensity stereo,
+improving the quality of mono downmixes, but slightly reducing normal stereo
+quality. The default is 1 (phase inversion enabled).
+.SS "libshine"
+.IX Subsection "libshine"
+Shine Fixed-Point \s-1MP3\s0 encoder wrapper.
+.PP
+Shine is a fixed-point \s-1MP3\s0 encoder. It has a far better performance on
+platforms without an \s-1FPU,\s0 e.g. armel CPUs, and some phones and tablets.
+However, as it is more targeted on performance than quality, it is not on par
+with \s-1LAME\s0 and other production-grade encoders quality-wise. Also, according to
+the project's homepage, this encoder may not be free of bugs as the code was
+written a long time ago and the project was dead for at least 5 years.
+.PP
+This encoder only supports stereo and mono input. This is also CBR-only.
+.PP
+The original project (last updated in early 2007) is at
+<\fBhttp://sourceforge.net/projects/libshine\-fxp/\fR>. We only support the
+updated fork by the Savonet/Liquidsoap project at <\fBhttps://github.com/savonet/shine\fR>.
+.PP
+Requires the presence of the libshine headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libshine\*(C'\fR.
+.PP
+See also \fBlibmp3lame\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libshine wrapper. The
+\&\fBshineenc\fR\-equivalent of the options are listed in parentheses.
+.IP "\fBb (\fR\fI\-b\fR\fB)\fR" 4
+.IX Item "b (-b)"
+Set bitrate expressed in bits/s for \s-1CBR.\s0 \fBshineenc\fR \fB\-b\fR option
+is expressed in kilobits/s.
+.SS "libtwolame"
+.IX Subsection "libtwolame"
+TwoLAME \s-1MP2\s0 encoder wrapper.
+.PP
+Requires the presence of the libtwolame headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libtwolame\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libtwolame wrapper. The
+\&\fBtwolame\fR\-equivalent options follow the FFmpeg ones and are in
+parentheses.
+.IP "\fBb (\fR\fI\-b\fR\fB)\fR" 4
+.IX Item "b (-b)"
+Set bitrate expressed in bits/s for \s-1CBR.\s0 \fBtwolame\fR \fBb\fR
+option is expressed in kilobits/s. Default value is 128k.
+.IP "\fBq (\fR\fI\-V\fR\fB)\fR" 4
+.IX Item "q (-V)"
+Set quality for experimental \s-1VBR\s0 support. Maximum value range is
+from \-50 to 50, useful range is from \-10 to 10. The higher the
+value, the better the quality. This option is valid only using the
+\&\fBffmpeg\fR command-line tool. For library interface users,
+use \fBglobal_quality\fR.
+.IP "\fBmode (\fR\fI\-\-mode\fR\fB)\fR" 4
+.IX Item "mode (--mode)"
+Set the mode of the resulting audio. Possible values:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Choose mode automatically based on the input. This is the default.
+.IP "\fBstereo\fR" 4
+.IX Item "stereo"
+Stereo
+.IP "\fBjoint_stereo\fR" 4
+.IX Item "joint_stereo"
+Joint stereo
+.IP "\fBdual_channel\fR" 4
+.IX Item "dual_channel"
+Dual channel
+.IP "\fBmono\fR" 4
+.IX Item "mono"
+Mono
+.RE
+.RS 4
+.RE
+.IP "\fBpsymodel (\fR\fI\-\-psyc\-mode\fR\fB)\fR" 4
+.IX Item "psymodel (--psyc-mode)"
+Set psychoacoustic model to use in encoding. The argument must be
+an integer between \-1 and 4, inclusive. The higher the value, the
+better the quality. The default value is 3.
+.IP "\fBenergy_levels (\fR\fI\-\-energy\fR\fB)\fR" 4
+.IX Item "energy_levels (--energy)"
+Enable energy levels extensions when set to 1. The default value is
+0 (disabled).
+.IP "\fBerror_protection (\fR\fI\-\-protect\fR\fB)\fR" 4
+.IX Item "error_protection (--protect)"
+Enable \s-1CRC\s0 error protection when set to 1. The default value is 0
+(disabled).
+.IP "\fBcopyright (\fR\fI\-\-copyright\fR\fB)\fR" 4
+.IX Item "copyright (--copyright)"
+Set \s-1MPEG\s0 audio copyright flag when set to 1. The default value is 0
+(disabled).
+.IP "\fBoriginal (\fR\fI\-\-original\fR\fB)\fR" 4
+.IX Item "original (--original)"
+Set \s-1MPEG\s0 audio original flag when set to 1. The default value is 0
+(disabled).
+.SS "libvo-amrwbenc"
+.IX Subsection "libvo-amrwbenc"
+VisualOn Adaptive Multi-Rate Wideband encoder.
+.PP
+Requires the presence of the libvo-amrwbenc headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libvo\-amrwbenc \-\-enable\-version3\*(C'\fR.
+.PP
+This is a mono-only encoder. Officially it only supports 16000Hz sample
+rate, but you can override it by setting \fBstrict\fR to
+\&\fBunofficial\fR or lower.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set bitrate in bits/s. Only the following bitrates are supported, otherwise
+libavcodec will round to the nearest valid bitrate.
+.RS 4
+.IP "\fB6600\fR" 4
+.IX Item "6600"
+.PD 0
+.IP "\fB8850\fR" 4
+.IX Item "8850"
+.IP "\fB12650\fR" 4
+.IX Item "12650"
+.IP "\fB14250\fR" 4
+.IX Item "14250"
+.IP "\fB15850\fR" 4
+.IX Item "15850"
+.IP "\fB18250\fR" 4
+.IX Item "18250"
+.IP "\fB19850\fR" 4
+.IX Item "19850"
+.IP "\fB23050\fR" 4
+.IX Item "23050"
+.IP "\fB23850\fR" 4
+.IX Item "23850"
+.RE
+.RS 4
+.RE
+.IP "\fBdtx\fR" 4
+.IX Item "dtx"
+.PD
+Allow discontinuous transmission (generate comfort noise) when set to 1. The
+default value is 0 (disabled).
+.SS "libvorbis"
+.IX Subsection "libvorbis"
+libvorbis encoder wrapper.
+.PP
+Requires the presence of the libvorbisenc headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libvorbis\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libvorbis wrapper. The
+\&\fBoggenc\fR\-equivalent of the options are listed in parentheses.
+.PP
+To get a more accurate and extensive documentation of the libvorbis
+options, consult the libvorbisenc's and \fBoggenc\fR's documentations.
+See <\fBhttp://xiph.org/vorbis/\fR>,
+<\fBhttp://wiki.xiph.org/Vorbis\-tools\fR>, and \fBoggenc\fR\|(1).
+.IP "\fBb (\fR\fI\-b\fR\fB)\fR" 4
+.IX Item "b (-b)"
+Set bitrate expressed in bits/s for \s-1ABR.\s0 \fBoggenc\fR \fB\-b\fR is
+expressed in kilobits/s.
+.IP "\fBq (\fR\fI\-q\fR\fB)\fR" 4
+.IX Item "q (-q)"
+Set constant quality setting for \s-1VBR.\s0 The value should be a float
+number in the range of \-1.0 to 10.0. The higher the value, the better
+the quality. The default value is \fB3.0\fR.
+.Sp
+This option is valid only using the \fBffmpeg\fR command-line tool.
+For library interface users, use \fBglobal_quality\fR.
+.IP "\fBcutoff (\fR\fI\-\-advanced\-encode\-option lowpass_frequency=N\fR\fB)\fR" 4
+.IX Item "cutoff (--advanced-encode-option lowpass_frequency=N)"
+Set cutoff bandwidth in Hz, a value of 0 disables cutoff. \fBoggenc\fR's
+related option is expressed in kHz. The default value is \fB0\fR (cutoff
+disabled).
+.IP "\fBminrate (\fR\fI\-m\fR\fB)\fR" 4
+.IX Item "minrate (-m)"
+Set minimum bitrate expressed in bits/s. \fBoggenc\fR \fB\-m\fR is
+expressed in kilobits/s.
+.IP "\fBmaxrate (\fR\fI\-M\fR\fB)\fR" 4
+.IX Item "maxrate (-M)"
+Set maximum bitrate expressed in bits/s. \fBoggenc\fR \fB\-M\fR is
+expressed in kilobits/s. This only has effect on \s-1ABR\s0 mode.
+.IP "\fBiblock (\fR\fI\-\-advanced\-encode\-option impulse_noisetune=N\fR\fB)\fR" 4
+.IX Item "iblock (--advanced-encode-option impulse_noisetune=N)"
+Set noise floor bias for impulse blocks. The value is a float number from
+\&\-15.0 to 0.0. A negative bias instructs the encoder to pay special attention
+to the crispness of transients in the encoded audio. The tradeoff for better
+transient response is a higher bitrate.
+.SS "mjpeg"
+.IX Subsection "mjpeg"
+Motion \s-1JPEG\s0 encoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBhuffman\fR" 4
+.IX Item "huffman"
+Set the huffman encoding strategy. Possible values:
+.RS 4
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+Use the default huffman tables. This is the default strategy.
+.IP "\fBoptimal\fR" 4
+.IX Item "optimal"
+Compute and use optimal huffman tables.
+.RE
+.RS 4
+.RE
+.SS "wavpack"
+.IX Subsection "wavpack"
+WavPack lossless audio encoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The equivalent options for \fBwavpack\fR command line utility are listed in
+parentheses.
+.PP
+Shared options
+.IX Subsection "Shared options"
+.PP
+The following shared options are effective for this encoder. Only special notes
+about this particular encoder will be documented here. For the general meaning
+of the options, see \fBthe Codec Options chapter\fR.
+.IP "\fBframe_size (\fR\fI\-\-blocksize\fR\fB)\fR" 4
+.IX Item "frame_size (--blocksize)"
+For this encoder, the range for this option is between 128 and 131072. Default
+is automatically decided based on sample rate and number of channel.
+.Sp
+For the complete formula of calculating default, see
+\&\fIlibavcodec/wavpackenc.c\fR.
+.IP "\fBcompression_level (\fR\fI\-f\fR\fB,\fR \fI\-h\fR\fB,\fR \fI\-hh\fR\fB, and\fR \fI\-x\fR\fB)\fR" 4
+.IX Item "compression_level (-f, -h, -hh, and -x)"
+.PP
+Private options
+.IX Subsection "Private options"
+.IP "\fBjoint_stereo (\fR\fI\-j\fR\fB)\fR" 4
+.IX Item "joint_stereo (-j)"
+Set whether to enable joint stereo. Valid values are:
+.RS 4
+.IP "\fBon (\fR\fI1\fR\fB)\fR" 4
+.IX Item "on (1)"
+Force mid/side audio encoding.
+.IP "\fBoff (\fR\fI0\fR\fB)\fR" 4
+.IX Item "off (0)"
+Force left/right audio encoding.
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Let the encoder decide automatically.
+.RE
+.RS 4
+.RE
+.IP "\fBoptimize_mono\fR" 4
+.IX Item "optimize_mono"
+Set whether to enable optimization for mono. This option is only effective for
+non-mono streams. Available values:
+.RS 4
+.IP "\fBon\fR" 4
+.IX Item "on"
+enabled
+.IP "\fBoff\fR" 4
+.IX Item "off"
+disabled
+.RE
+.RS 4
+.RE
+.SH "VIDEO ENCODERS"
+.IX Header "VIDEO ENCODERS"
+A description of some of the currently available video encoders
+follows.
+.SS "\s-1GIF\s0"
+.IX Subsection "GIF"
+\&\s-1GIF\s0 image/animation encoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBgifflags\fR \fIinteger\fR" 4
+.IX Item "gifflags integer"
+Sets the flags used for \s-1GIF\s0 encoding.
+.RS 4
+.IP "\fBoffsetting\fR" 4
+.IX Item "offsetting"
+Enables picture offsetting.
+.Sp
+Default is enabled.
+.IP "\fBtransdiff\fR" 4
+.IX Item "transdiff"
+Enables transparency detection between frames.
+.Sp
+Default is enabled.
+.RE
+.RS 4
+.RE
+.IP "\fBgifimage\fR \fIinteger\fR" 4
+.IX Item "gifimage integer"
+Enables encoding one full \s-1GIF\s0 image per frame, rather than an animated \s-1GIF.\s0
+.Sp
+Default value is \fB0\fR.
+.IP "\fBglobal_palette\fR \fIinteger\fR" 4
+.IX Item "global_palette integer"
+Writes a palette to the global \s-1GIF\s0 header where feasible.
+.Sp
+If disabled, every frame will always have a palette written, even if there
+is a global palette supplied.
+.Sp
+Default value is \fB1\fR.
+.SS "Hap"
+.IX Subsection "Hap"
+Vidvox Hap video encoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBformat\fR \fIinteger\fR" 4
+.IX Item "format integer"
+Specifies the Hap format to encode.
+.RS 4
+.IP "\fBhap\fR" 4
+.IX Item "hap"
+.PD 0
+.IP "\fBhap_alpha\fR" 4
+.IX Item "hap_alpha"
+.IP "\fBhap_q\fR" 4
+.IX Item "hap_q"
+.RE
+.RS 4
+.PD
+.Sp
+Default value is \fBhap\fR.
+.RE
+.IP "\fBchunks\fR \fIinteger\fR" 4
+.IX Item "chunks integer"
+Specifies the number of chunks to split frames into, between 1 and 64. This
+permits multithreaded decoding of large frames, potentially at the cost of
+data-rate. The encoder may modify this value to divide frames evenly.
+.Sp
+Default value is \fI1\fR.
+.IP "\fBcompressor\fR \fIinteger\fR" 4
+.IX Item "compressor integer"
+Specifies the second-stage compressor to use. If set to \fBnone\fR,
+\&\fBchunks\fR will be limited to 1, as chunked uncompressed frames offer no
+benefit.
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+.PD 0
+.IP "\fBsnappy\fR" 4
+.IX Item "snappy"
+.RE
+.RS 4
+.PD
+.Sp
+Default value is \fBsnappy\fR.
+.RE
+.SS "jpeg2000"
+.IX Subsection "jpeg2000"
+The native jpeg 2000 encoder is lossy by default, the \f(CW\*(C`\-q:v\*(C'\fR
+option can be used to set the encoding quality. Lossless encoding
+can be selected with \f(CW\*(C`\-pred 1\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBformat\fR \fIinteger\fR" 4
+.IX Item "format integer"
+Can be set to either \f(CW\*(C`j2k\*(C'\fR or \f(CW\*(C`jp2\*(C'\fR (the default) that
+makes it possible to store non-rgb pix_fmts.
+.IP "\fBtile_width\fR \fIinteger\fR" 4
+.IX Item "tile_width integer"
+Sets tile width. Range is 1 to 1073741824. Default is 256.
+.IP "\fBtile_height\fR \fIinteger\fR" 4
+.IX Item "tile_height integer"
+Sets tile height. Range is 1 to 1073741824. Default is 256.
+.IP "\fBpred\fR \fIinteger\fR" 4
+.IX Item "pred integer"
+Allows setting the discrete wavelet transform (\s-1DWT\s0) type
+.RS 4
+.IP "\fBdwt97int (Lossy)\fR" 4
+.IX Item "dwt97int (Lossy)"
+.PD 0
+.IP "\fBdwt53 (Lossless)\fR" 4
+.IX Item "dwt53 (Lossless)"
+.RE
+.RS 4
+.PD
+.Sp
+Default is \f(CW\*(C`dwt97int\*(C'\fR
+.RE
+.IP "\fBsop\fR \fIboolean\fR" 4
+.IX Item "sop boolean"
+Enable this to add \s-1SOP\s0 marker at the start of each packet. Disabled by default.
+.IP "\fBeph\fR \fIboolean\fR" 4
+.IX Item "eph boolean"
+Enable this to add \s-1EPH\s0 marker at the end of each packet header. Disabled by default.
+.IP "\fBprog\fR \fIinteger\fR" 4
+.IX Item "prog integer"
+Sets the progression order to be used by the encoder.
+Possible values are:
+.RS 4
+.IP "\fBlrcp\fR" 4
+.IX Item "lrcp"
+.PD 0
+.IP "\fBrlcp\fR" 4
+.IX Item "rlcp"
+.IP "\fBrpcl\fR" 4
+.IX Item "rpcl"
+.IP "\fBpcrl\fR" 4
+.IX Item "pcrl"
+.IP "\fBcprl\fR" 4
+.IX Item "cprl"
+.RE
+.RS 4
+.PD
+.Sp
+Set to \f(CW\*(C`lrcp\*(C'\fR by default.
+.RE
+.IP "\fBlayer_rates\fR \fIstring\fR" 4
+.IX Item "layer_rates string"
+By default, when this option is not used, compression is done using the quality metric.
+This option allows for compression using compression ratio. The compression ratio for each
+level could be specified. The compression ratio of a layer \f(CW\*(C`l\*(C'\fR species the what ratio of
+total file size is contained in the first \f(CW\*(C`l\*(C'\fR layers.
+.Sp
+Example usage:
+.Sp
+.Vb 1
+\& ffmpeg \-i input.bmp \-c:v jpeg2000 \-layer_rates "100,10,1" output.j2k
+.Ve
+.Sp
+This would compress the image to contain 3 layers, where the data contained in the
+first layer would be compressed by 1000 times, compressed by 100 in the first two layers,
+and shall contain all data while using all 3 layers.
+.SS "librav1e"
+.IX Subsection "librav1e"
+rav1e \s-1AV1\s0 encoder wrapper.
+.PP
+Requires the presence of the rav1e headers and library during configuration.
+You need to explicitly configure the build with \f(CW\*(C`\-\-enable\-librav1e\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBqmax\fR" 4
+.IX Item "qmax"
+Sets the maximum quantizer to use when using bitrate mode.
+.IP "\fBqmin\fR" 4
+.IX Item "qmin"
+Sets the minimum quantizer to use when using bitrate mode.
+.IP "\fBqp\fR" 4
+.IX Item "qp"
+Uses quantizer mode to encode at the given quantizer (0\-255).
+.IP "\fBspeed\fR" 4
+.IX Item "speed"
+Selects the speed preset (0\-10) to encode with.
+.IP "\fBtiles\fR" 4
+.IX Item "tiles"
+Selects how many tiles to encode with.
+.IP "\fBtile-rows\fR" 4
+.IX Item "tile-rows"
+Selects how many rows of tiles to encode with.
+.IP "\fBtile-columns\fR" 4
+.IX Item "tile-columns"
+Selects how many columns of tiles to encode with.
+.IP "\fBrav1e\-params\fR" 4
+.IX Item "rav1e-params"
+Set rav1e options using a list of \fIkey\fR=\fIvalue\fR pairs separated
+by \*(L":\*(R". See \fBrav1e \-\-help\fR for a list of options.
+.Sp
+For example to specify librav1e encoding options with \fB\-rav1e\-params\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i input \-c:v librav1e \-b:v 500K \-rav1e\-params speed=5:low_latency=true output.mp4
+.Ve
+.SS "libaom\-av1"
+.IX Subsection "libaom-av1"
+libaom \s-1AV1\s0 encoder wrapper.
+.PP
+Requires the presence of the libaom headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libaom\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The wrapper supports the following standard libavcodec options:
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set bitrate target in bits/second. By default this will use
+variable-bitrate mode. If \fBmaxrate\fR and \fBminrate\fR are
+also set to the same value then it will use constant-bitrate mode,
+otherwise if \fBcrf\fR is set as well then it will use
+constrained-quality mode.
+.IP "\fBg keyint_min\fR" 4
+.IX Item "g keyint_min"
+Set key frame placement. The \s-1GOP\s0 size sets the maximum distance between
+key frames; if zero the output stream will be intra-only. The minimum
+distance is ignored unless it is the same as the \s-1GOP\s0 size, in which case
+key frames will always appear at a fixed interval. Not set by default,
+so without this option the library has completely free choice about
+where to place key frames.
+.IP "\fBqmin qmax\fR" 4
+.IX Item "qmin qmax"
+Set minimum/maximum quantisation values. Valid range is from 0 to 63
+(warning: this does not match the quantiser values actually used by \s-1AV1\s0
+\&\- divide by four to map real quantiser values to this range). Defaults
+to min/max (no constraint).
+.IP "\fBminrate maxrate bufsize rc_init_occupancy\fR" 4
+.IX Item "minrate maxrate bufsize rc_init_occupancy"
+Set rate control buffering parameters. Not used if not set \- defaults
+to unconstrained variable bitrate.
+.IP "\fBthreads\fR" 4
+.IX Item "threads"
+Set the number of threads to use while encoding. This may require the
+\&\fBtiles\fR or \fBrow-mt\fR options to also be set to actually
+use the specified number of threads fully. Defaults to the number of
+hardware threads supported by the host machine.
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Set the encoding profile. Defaults to using the profile which matches
+the bit depth and chroma subsampling of the input.
+.PP
+The wrapper also has some specific options:
+.IP "\fBcpu-used\fR" 4
+.IX Item "cpu-used"
+Set the quality/encoding speed tradeoff. Valid range is from 0 to 8,
+higher numbers indicating greater speed and lower quality. The default
+value is 1, which will be slow and high quality.
+.IP "\fBauto-alt-ref\fR" 4
+.IX Item "auto-alt-ref"
+Enable use of alternate reference frames. Defaults to the internal
+default of the library.
+.IP "\fBarnr-max-frames (\fR\fIframes\fR\fB)\fR" 4
+.IX Item "arnr-max-frames (frames)"
+Set altref noise reduction max frame count. Default is \-1.
+.IP "\fBarnr-strength (\fR\fIstrength\fR\fB)\fR" 4
+.IX Item "arnr-strength (strength)"
+Set altref noise reduction filter strength. Range is \-1 to 6. Default is \-1.
+.IP "\fBaq-mode (\fR\fIaq-mode\fR\fB)\fR" 4
+.IX Item "aq-mode (aq-mode)"
+Set adaptive quantization mode. Possible values:
+.RS 4
+.IP "\fBnone (\fR\fI0\fR\fB)\fR" 4
+.IX Item "none (0)"
+Disabled.
+.IP "\fBvariance (\fR\fI1\fR\fB)\fR" 4
+.IX Item "variance (1)"
+Variance-based.
+.IP "\fBcomplexity (\fR\fI2\fR\fB)\fR" 4
+.IX Item "complexity (2)"
+Complexity-based.
+.IP "\fBcyclic (\fR\fI3\fR\fB)\fR" 4
+.IX Item "cyclic (3)"
+Cyclic refresh.
+.RE
+.RS 4
+.RE
+.IP "\fBtune (\fR\fItune\fR\fB)\fR" 4
+.IX Item "tune (tune)"
+Set the distortion metric the encoder is tuned with. Default is \f(CW\*(C`psnr\*(C'\fR.
+.RS 4
+.IP "\fBpsnr (\fR\fI0\fR\fB)\fR" 4
+.IX Item "psnr (0)"
+.PD 0
+.IP "\fBssim (\fR\fI1\fR\fB)\fR" 4
+.IX Item "ssim (1)"
+.RE
+.RS 4
+.RE
+.IP "\fBlag-in-frames\fR" 4
+.IX Item "lag-in-frames"
+.PD
+Set the maximum number of frames which the encoder may keep in flight
+at any one time for lookahead purposes. Defaults to the internal
+default of the library.
+.IP "\fBerror-resilience\fR" 4
+.IX Item "error-resilience"
+Enable error resilience features:
+.RS 4
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+Improve resilience against losses of whole frames.
+.RE
+.RS 4
+.Sp
+Not enabled by default.
+.RE
+.IP "\fBcrf\fR" 4
+.IX Item "crf"
+Set the quality/size tradeoff for constant-quality (no bitrate target)
+and constrained-quality (with maximum bitrate target) modes. Valid
+range is 0 to 63, higher numbers indicating lower quality and smaller
+output size. Only used if set; by default only the bitrate target is
+used.
+.IP "\fBstatic-thresh\fR" 4
+.IX Item "static-thresh"
+Set a change threshold on blocks below which they will be skipped by
+the encoder. Defined in arbitrary units as a nonnegative integer,
+defaulting to zero (no blocks are skipped).
+.IP "\fBdrop-threshold\fR" 4
+.IX Item "drop-threshold"
+Set a threshold for dropping frames when close to rate control bounds.
+Defined as a percentage of the target buffer \- when the rate control
+buffer falls below this percentage, frames will be dropped until it
+has refilled above the threshold. Defaults to zero (no frames are
+dropped).
+.IP "\fBdenoise-noise-level (\fR\fIlevel\fR\fB)\fR" 4
+.IX Item "denoise-noise-level (level)"
+Amount of noise to be removed for grain synthesis. Grain synthesis is disabled if
+this option is not set or set to 0.
+.IP "\fBdenoise-block-size (\fR\fIpixels\fR\fB)\fR" 4
+.IX Item "denoise-block-size (pixels)"
+Block size used for denoising for grain synthesis. If not set, \s-1AV1\s0 codec
+uses the default value of 32.
+.IP "\fBundershoot-pct (\fR\fIpct\fR\fB)\fR" 4
+.IX Item "undershoot-pct (pct)"
+Set datarate undershoot (min) percentage of the target bitrate. Range is \-1 to 100.
+Default is \-1.
+.IP "\fBovershoot-pct (\fR\fIpct\fR\fB)\fR" 4
+.IX Item "overshoot-pct (pct)"
+Set datarate overshoot (max) percentage of the target bitrate. Range is \-1 to 1000.
+Default is \-1.
+.IP "\fBminsection-pct (\fR\fIpct\fR\fB)\fR" 4
+.IX Item "minsection-pct (pct)"
+Minimum percentage variation of the \s-1GOP\s0 bitrate from the target bitrate. If minsection-pct
+is not set, the libaomenc wrapper computes it as follows: \f(CW\*(C`(minrate * 100 / bitrate)\*(C'\fR.
+Range is \-1 to 100. Default is \-1 (unset).
+.IP "\fBmaxsection-pct (\fR\fIpct\fR\fB)\fR" 4
+.IX Item "maxsection-pct (pct)"
+Maximum percentage variation of the \s-1GOP\s0 bitrate from the target bitrate. If maxsection-pct
+is not set, the libaomenc wrapper computes it as follows: \f(CW\*(C`(maxrate * 100 / bitrate)\*(C'\fR.
+Range is \-1 to 5000. Default is \-1 (unset).
+.IP "\fBframe-parallel (\fR\fIboolean\fR\fB)\fR" 4
+.IX Item "frame-parallel (boolean)"
+Enable frame parallel decodability features. Default is true.
+.IP "\fBtiles\fR" 4
+.IX Item "tiles"
+Set the number of tiles to encode the input video with, as columns x
+rows. Larger numbers allow greater parallelism in both encoding and
+decoding, but may decrease coding efficiency. Defaults to the minimum
+number of tiles required by the size of the input video (this is 1x1
+(that is, a single tile) for sizes up to and including 4K).
+.IP "\fBtile-columns tile-rows\fR" 4
+.IX Item "tile-columns tile-rows"
+Set the number of tiles as log2 of the number of tile rows and columns.
+Provided for compatibility with libvpx/VP9.
+.IP "\fBrow-mt (Requires libaom >= 1.0.0\-759\-g90a15f4f2)\fR" 4
+.IX Item "row-mt (Requires libaom >= 1.0.0-759-g90a15f4f2)"
+Enable row based multi-threading. Disabled by default.
+.IP "\fBenable-cdef (\fR\fIboolean\fR\fB)\fR" 4
+.IX Item "enable-cdef (boolean)"
+Enable Constrained Directional Enhancement Filter. The libaom\-av1
+encoder enables \s-1CDEF\s0 by default.
+.IP "\fBenable-restoration (\fR\fIboolean\fR\fB)\fR" 4
+.IX Item "enable-restoration (boolean)"
+Enable Loop Restoration Filter. Default is true for libaom\-av1.
+.IP "\fBenable-global-motion (\fR\fIboolean\fR\fB)\fR" 4
+.IX Item "enable-global-motion (boolean)"
+Enable the use of global motion for block prediction. Default is true.
+.IP "\fBenable-intrabc (\fR\fIboolean\fR\fB)\fR" 4
+.IX Item "enable-intrabc (boolean)"
+Enable block copy mode for intra block prediction. This mode is
+useful for screen content. Default is true.
+.IP "\fBenable-rect-partitions (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-rect-partitions (boolean) (Requires libaom >= v2.0.0)"
+Enable rectangular partitions. Default is true.
+.IP "\fBenable\-1to4\-partitions (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-1to4-partitions (boolean) (Requires libaom >= v2.0.0)"
+Enable 1:4/4:1 partitions. Default is true.
+.IP "\fBenable-ab-partitions (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-ab-partitions (boolean) (Requires libaom >= v2.0.0)"
+Enable \s-1AB\s0 shape partitions. Default is true.
+.IP "\fBenable-angle-delta (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-angle-delta (boolean) (Requires libaom >= v2.0.0)"
+Enable angle delta intra prediction. Default is true.
+.IP "\fBenable-cfl-intra (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-cfl-intra (boolean) (Requires libaom >= v2.0.0)"
+Enable chroma predicted from luma intra prediction. Default is true.
+.IP "\fBenable-filter-intra (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-filter-intra (boolean) (Requires libaom >= v2.0.0)"
+Enable filter intra predictor. Default is true.
+.IP "\fBenable-intra-edge-filter (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-intra-edge-filter (boolean) (Requires libaom >= v2.0.0)"
+Enable intra edge filter. Default is true.
+.IP "\fBenable-smooth-intra (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-smooth-intra (boolean) (Requires libaom >= v2.0.0)"
+Enable smooth intra prediction mode. Default is true.
+.IP "\fBenable-paeth-intra (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-paeth-intra (boolean) (Requires libaom >= v2.0.0)"
+Enable paeth predictor in intra prediction. Default is true.
+.IP "\fBenable-palette (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-palette (boolean) (Requires libaom >= v2.0.0)"
+Enable palette prediction mode. Default is true.
+.IP "\fBenable-flip-idtx (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-flip-idtx (boolean) (Requires libaom >= v2.0.0)"
+Enable extended transform type, including \s-1FLIPADST_DCT, DCT_FLIPADST,
+FLIPADST_FLIPADST, ADST_FLIPADST, FLIPADST_ADST, IDTX, V_DCT, H_DCT,
+V_ADST, H_ADST, V_FLIPADST, H_FLIPADST.\s0 Default is true.
+.IP "\fBenable\-tx64 (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-tx64 (boolean) (Requires libaom >= v2.0.0)"
+Enable 64\-pt transform. Default is true.
+.IP "\fBreduced-tx-type-set (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "reduced-tx-type-set (boolean) (Requires libaom >= v2.0.0)"
+Use reduced set of transform types. Default is false.
+.IP "\fBuse-intra-dct-only (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "use-intra-dct-only (boolean) (Requires libaom >= v2.0.0)"
+Use \s-1DCT\s0 only for \s-1INTRA\s0 modes. Default is false.
+.IP "\fBuse-inter-dct-only (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "use-inter-dct-only (boolean) (Requires libaom >= v2.0.0)"
+Use \s-1DCT\s0 only for \s-1INTER\s0 modes. Default is false.
+.IP "\fBuse-intra-default-tx-only (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "use-intra-default-tx-only (boolean) (Requires libaom >= v2.0.0)"
+Use Default-transform only for \s-1INTRA\s0 modes. Default is false.
+.IP "\fBenable-ref-frame-mvs (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-ref-frame-mvs (boolean) (Requires libaom >= v2.0.0)"
+Enable temporal mv prediction. Default is true.
+.IP "\fBenable-reduced-reference-set (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-reduced-reference-set (boolean) (Requires libaom >= v2.0.0)"
+Use reduced set of single and compound references. Default is false.
+.IP "\fBenable-obmc (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-obmc (boolean) (Requires libaom >= v2.0.0)"
+Enable obmc. Default is true.
+.IP "\fBenable-dual-filter (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-dual-filter (boolean) (Requires libaom >= v2.0.0)"
+Enable dual filter. Default is true.
+.IP "\fBenable-diff-wtd-comp (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-diff-wtd-comp (boolean) (Requires libaom >= v2.0.0)"
+Enable difference-weighted compound. Default is true.
+.IP "\fBenable-dist-wtd-comp (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-dist-wtd-comp (boolean) (Requires libaom >= v2.0.0)"
+Enable distance-weighted compound. Default is true.
+.IP "\fBenable-onesided-comp (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-onesided-comp (boolean) (Requires libaom >= v2.0.0)"
+Enable one sided compound. Default is true.
+.IP "\fBenable-interinter-wedge (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-interinter-wedge (boolean) (Requires libaom >= v2.0.0)"
+Enable interinter wedge compound. Default is true.
+.IP "\fBenable-interintra-wedge (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-interintra-wedge (boolean) (Requires libaom >= v2.0.0)"
+Enable interintra wedge compound. Default is true.
+.IP "\fBenable-masked-comp (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-masked-comp (boolean) (Requires libaom >= v2.0.0)"
+Enable masked compound. Default is true.
+.IP "\fBenable-interintra-comp (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-interintra-comp (boolean) (Requires libaom >= v2.0.0)"
+Enable interintra compound. Default is true.
+.IP "\fBenable-smooth-interintra (\fR\fIboolean\fR\fB) (Requires libaom >= v2.0.0)\fR" 4
+.IX Item "enable-smooth-interintra (boolean) (Requires libaom >= v2.0.0)"
+Enable smooth interintra mode. Default is true.
+.IP "\fBaom-params\fR" 4
+.IX Item "aom-params"
+Set libaom options using a list of \fIkey\fR=\fIvalue\fR pairs separated
+by \*(L":\*(R". For a list of supported options, see \fBaomenc \-\-help\fR under the
+section \*(L"\s-1AV1\s0 Specific Options\*(R".
+.Sp
+For example to specify libaom encoding options with \fB\-aom\-params\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i input \-c:v libaom\-av1 \-b:v 500K \-aom\-params tune=psnr:enable\-tpl\-model=1 output.mp4
+.Ve
+.SS "libsvtav1"
+.IX Subsection "libsvtav1"
+\&\s-1SVT\-AV1\s0 encoder wrapper.
+.PP
+Requires the presence of the \s-1SVT\-AV1\s0 headers and library during configuration.
+You need to explicitly configure the build with \f(CW\*(C`\-\-enable\-libsvtav1\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Set the encoding profile.
+.IP "\fBlevel\fR" 4
+.IX Item "level"
+Set the operating point level.
+.IP "\fBtier\fR" 4
+.IX Item "tier"
+Set the operating point tier.
+.IP "\fBrc\fR" 4
+.IX Item "rc"
+Set the rate control mode to use.
+.Sp
+Possible modes:
+.RS 4
+.IP "\fBcqp\fR" 4
+.IX Item "cqp"
+Constant quantizer: use fixed values of qindex (dependent on the frame type)
+throughout the stream. This mode is the default.
+.IP "\fBvbr\fR" 4
+.IX Item "vbr"
+Variable bitrate: use a target bitrate for the whole stream.
+.IP "\fBcvbr\fR" 4
+.IX Item "cvbr"
+Constrained variable bitrate: use a target bitrate for each \s-1GOP.\s0
+.RE
+.RS 4
+.RE
+.IP "\fBqmax\fR" 4
+.IX Item "qmax"
+Set the maximum quantizer to use when using a bitrate mode.
+.IP "\fBqmin\fR" 4
+.IX Item "qmin"
+Set the minimum quantizer to use when using a bitrate mode.
+.IP "\fBqp\fR" 4
+.IX Item "qp"
+Set the quantizer used in cqp rate control mode (0\-63).
+.IP "\fBsc_detection\fR" 4
+.IX Item "sc_detection"
+Enable scene change detection.
+.IP "\fBla_depth\fR" 4
+.IX Item "la_depth"
+Set number of frames to look ahead (0\-120).
+.IP "\fBpreset\fR" 4
+.IX Item "preset"
+Set the quality-speed tradeoff, in the range 0 to 8. Higher values are
+faster but lower quality. Defaults to 8 (highest speed).
+.IP "\fBtile_rows\fR" 4
+.IX Item "tile_rows"
+Set log2 of the number of rows of tiles to use (0\-6).
+.IP "\fBtile_columns\fR" 4
+.IX Item "tile_columns"
+Set log2 of the number of columns of tiles to use (0\-4).
+.SS "libkvazaar"
+.IX Subsection "libkvazaar"
+Kvazaar H.265/HEVC encoder.
+.PP
+Requires the presence of the libkvazaar headers and library during
+configuration. You need to explicitly configure the build with
+\&\fB\-\-enable\-libkvazaar\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set target video bitrate in bit/s and enable rate control.
+.IP "\fBkvazaar-params\fR" 4
+.IX Item "kvazaar-params"
+Set kvazaar parameters as a list of \fIname\fR=\fIvalue\fR pairs separated
+by commas (,). See kvazaar documentation for a list of options.
+.SS "libopenh264"
+.IX Subsection "libopenh264"
+Cisco libopenh264 H.264/MPEG\-4 \s-1AVC\s0 encoder wrapper.
+.PP
+This encoder requires the presence of the libopenh264 headers and
+library during configuration. You need to explicitly configure the
+build with \f(CW\*(C`\-\-enable\-libopenh264\*(C'\fR. The library is detected using
+\&\fBpkg-config\fR.
+.PP
+For more information about the library see
+<\fBhttp://www.openh264.org\fR>.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following FFmpeg global options affect the configurations of the
+libopenh264 encoder.
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set the bitrate (as a number of bits per second).
+.IP "\fBg\fR" 4
+.IX Item "g"
+Set the \s-1GOP\s0 size.
+.IP "\fBmaxrate\fR" 4
+.IX Item "maxrate"
+Set the max bitrate (as a number of bits per second).
+.IP "\fBflags +global_header\fR" 4
+.IX Item "flags +global_header"
+Set global header in the bitstream.
+.IP "\fBslices\fR" 4
+.IX Item "slices"
+Set the number of slices, used in parallelized encoding. Default value
+is 0. This is only used when \fBslice_mode\fR is set to
+\&\fBfixed\fR.
+.IP "\fBslice_mode\fR" 4
+.IX Item "slice_mode"
+Set slice mode. Can assume one of the following possible values:
+.RS 4
+.IP "\fBfixed\fR" 4
+.IX Item "fixed"
+a fixed number of slices
+.IP "\fBrowmb\fR" 4
+.IX Item "rowmb"
+one slice per row of macroblocks
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+automatic number of slices according to number of threads
+.IP "\fBdyn\fR" 4
+.IX Item "dyn"
+dynamic slicing
+.RE
+.RS 4
+.Sp
+Default value is \fBauto\fR.
+.RE
+.IP "\fBloopfilter\fR" 4
+.IX Item "loopfilter"
+Enable loop filter, if set to 1 (automatically enabled). To disable
+set a value of 0.
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Set profile restrictions. If set to the value of \fBmain\fR enable
+\&\s-1CABAC\s0 (set the \f(CW\*(C`SEncParamExt.iEntropyCodingModeFlag\*(C'\fR flag to 1).
+.IP "\fBmax_nal_size\fR" 4
+.IX Item "max_nal_size"
+Set maximum \s-1NAL\s0 size in bytes.
+.IP "\fBallow_skip_frames\fR" 4
+.IX Item "allow_skip_frames"
+Allow skipping frames to hit the target bitrate if set to 1.
+.SS "libtheora"
+.IX Subsection "libtheora"
+libtheora Theora encoder wrapper.
+.PP
+Requires the presence of the libtheora headers and library during
+configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libtheora\*(C'\fR.
+.PP
+For more information about the libtheora project see
+<\fBhttp://www.theora.org/\fR>.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following global options are mapped to internal libtheora options
+which affect the quality and the bitrate of the encoded stream.
+.IP "\fBb\fR" 4
+.IX Item "b"
+Set the video bitrate in bit/s for \s-1CBR\s0 (Constant Bit Rate) mode. In
+case \s-1VBR\s0 (Variable Bit Rate) mode is enabled this option is ignored.
+.IP "\fBflags\fR" 4
+.IX Item "flags"
+Used to enable constant quality mode (\s-1VBR\s0) encoding through the
+\&\fBqscale\fR flag, and to enable the \f(CW\*(C`pass1\*(C'\fR and \f(CW\*(C`pass2\*(C'\fR
+modes.
+.IP "\fBg\fR" 4
+.IX Item "g"
+Set the \s-1GOP\s0 size.
+.IP "\fBglobal_quality\fR" 4
+.IX Item "global_quality"
+Set the global quality as an integer in lambda units.
+.Sp
+Only relevant when \s-1VBR\s0 mode is enabled with \f(CW\*(C`flags +qscale\*(C'\fR. The
+value is converted to \s-1QP\s0 units by dividing it by \f(CW\*(C`FF_QP2LAMBDA\*(C'\fR,
+clipped in the [0 \- 10] range, and then multiplied by 6.3 to get a
+value in the native libtheora range [0\-63]. A higher value corresponds
+to a higher quality.
+.IP "\fBq\fR" 4
+.IX Item "q"
+Enable \s-1VBR\s0 mode when set to a non-negative value, and set constant
+quality value as a double floating point value in \s-1QP\s0 units.
+.Sp
+The value is clipped in the [0\-10] range, and then multiplied by 6.3
+to get a value in the native libtheora range [0\-63].
+.Sp
+This option is valid only using the \fBffmpeg\fR command-line
+tool. For library interface users, use \fBglobal_quality\fR.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Set maximum constant quality (\s-1VBR\s0) encoding with \fBffmpeg\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-codec:v libtheora \-q:v 10 OUTPUT.ogg
+.Ve
+.IP "\(bu" 4
+Use \fBffmpeg\fR to convert a \s-1CBR 1000\s0 kbps Theora video stream:
+.Sp
+.Vb 1
+\& ffmpeg \-i INPUT \-codec:v libtheora \-b:v 1000k OUTPUT.ogg
+.Ve
+.SS "libvpx"
+.IX Subsection "libvpx"
+\&\s-1VP8/VP9\s0 format supported through libvpx.
+.PP
+Requires the presence of the libvpx headers and library during configuration.
+You need to explicitly configure the build with \f(CW\*(C`\-\-enable\-libvpx\*(C'\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libvpx wrapper. The
+\&\fBvpxenc\fR\-equivalent options or values are listed in parentheses
+for easy migration.
+.PP
+To reduce the duplication of documentation, only the private options
+and some others requiring special attention are documented here. For
+the documentation of the undocumented generic options, see
+\&\fBthe Codec Options chapter\fR.
+.PP
+To get more documentation of the libvpx options, invoke the command
+\&\fBffmpeg \-h encoder=libvpx\fR, \fBffmpeg \-h encoder=libvpx\-vp9\fR or
+\&\fBvpxenc \-\-help\fR. Further information is available in the libvpx \s-1API\s0
+documentation.
+.IP "\fBb (\fR\fItarget-bitrate\fR\fB)\fR" 4
+.IX Item "b (target-bitrate)"
+Set bitrate in bits/s. Note that FFmpeg's \fBb\fR option is
+expressed in bits/s, while \fBvpxenc\fR's \fBtarget-bitrate\fR is in
+kilobits/s.
+.IP "\fBg (\fR\fIkf-max-dist\fR\fB)\fR" 4
+.IX Item "g (kf-max-dist)"
+.PD 0
+.IP "\fBkeyint_min (\fR\fIkf-min-dist\fR\fB)\fR" 4
+.IX Item "keyint_min (kf-min-dist)"
+.IP "\fBqmin (\fR\fImin-q\fR\fB)\fR" 4
+.IX Item "qmin (min-q)"
+.IP "\fBqmax (\fR\fImax-q\fR\fB)\fR" 4
+.IX Item "qmax (max-q)"
+.IP "\fBbufsize (\fR\fIbuf-sz\fR\fB,\fR \fIbuf-optimal-sz\fR\fB)\fR" 4
+.IX Item "bufsize (buf-sz, buf-optimal-sz)"
+.PD
+Set ratecontrol buffer size (in bits). Note \fBvpxenc\fR's options are
+specified in milliseconds, the libvpx wrapper converts this value as follows:
+\&\f(CW\*(C`buf\-sz = bufsize * 1000 / bitrate\*(C'\fR,
+\&\f(CW\*(C`buf\-optimal\-sz = bufsize * 1000 / bitrate * 5 / 6\*(C'\fR.
+.IP "\fBrc_init_occupancy (\fR\fIbuf-initial-sz\fR\fB)\fR" 4
+.IX Item "rc_init_occupancy (buf-initial-sz)"
+Set number of bits which should be loaded into the rc buffer before decoding
+starts. Note \fBvpxenc\fR's option is specified in milliseconds, the libvpx
+wrapper converts this value as follows:
+\&\f(CW\*(C`rc_init_occupancy * 1000 / bitrate\*(C'\fR.
+.IP "\fBundershoot-pct\fR" 4
+.IX Item "undershoot-pct"
+Set datarate undershoot (min) percentage of the target bitrate.
+.IP "\fBovershoot-pct\fR" 4
+.IX Item "overshoot-pct"
+Set datarate overshoot (max) percentage of the target bitrate.
+.IP "\fBskip_threshold (\fR\fIdrop-frame\fR\fB)\fR" 4
+.IX Item "skip_threshold (drop-frame)"
+.PD 0
+.IP "\fBqcomp (\fR\fIbias-pct\fR\fB)\fR" 4
+.IX Item "qcomp (bias-pct)"
+.IP "\fBmaxrate (\fR\fImaxsection-pct\fR\fB)\fR" 4
+.IX Item "maxrate (maxsection-pct)"
+.PD
+Set \s-1GOP\s0 max bitrate in bits/s. Note \fBvpxenc\fR's option is specified as a
+percentage of the target bitrate, the libvpx wrapper converts this value as
+follows: \f(CW\*(C`(maxrate * 100 / bitrate)\*(C'\fR.
+.IP "\fBminrate (\fR\fIminsection-pct\fR\fB)\fR" 4
+.IX Item "minrate (minsection-pct)"
+Set \s-1GOP\s0 min bitrate in bits/s. Note \fBvpxenc\fR's option is specified as a
+percentage of the target bitrate, the libvpx wrapper converts this value as
+follows: \f(CW\*(C`(minrate * 100 / bitrate)\*(C'\fR.
+.IP "\fBminrate, maxrate, b\fR \fIend\-usage=cbr\fR" 4
+.IX Item "minrate, maxrate, b end-usage=cbr"
+\&\f(CW\*(C`(minrate == maxrate == bitrate)\*(C'\fR.
+.IP "\fBcrf (\fR\fIend\-usage=cq\fR\fB,\fR \fIcq-level\fR\fB)\fR" 4
+.IX Item "crf (end-usage=cq, cq-level)"
+.PD 0
+.IP "\fBtune (\fR\fItune\fR\fB)\fR" 4
+.IX Item "tune (tune)"
+.RS 4
+.IP "\fBpsnr (\fR\fIpsnr\fR\fB)\fR" 4
+.IX Item "psnr (psnr)"
+.IP "\fBssim (\fR\fIssim\fR\fB)\fR" 4
+.IX Item "ssim (ssim)"
+.RE
+.RS 4
+.RE
+.IP "\fBquality, deadline (\fR\fIdeadline\fR\fB)\fR" 4
+.IX Item "quality, deadline (deadline)"
+.RS 4
+.IP "\fBbest\fR" 4
+.IX Item "best"
+.PD
+Use best quality deadline. Poorly named and quite slow, this option should be
+avoided as it may give worse quality output than good.
+.IP "\fBgood\fR" 4
+.IX Item "good"
+Use good quality deadline. This is a good trade-off between speed and quality
+when used with the \fBcpu-used\fR option.
+.IP "\fBrealtime\fR" 4
+.IX Item "realtime"
+Use realtime quality deadline.
+.RE
+.RS 4
+.RE
+.IP "\fBspeed, cpu-used (\fR\fIcpu-used\fR\fB)\fR" 4
+.IX Item "speed, cpu-used (cpu-used)"
+Set quality/speed ratio modifier. Higher values speed up the encode at the cost
+of quality.
+.IP "\fBnr (\fR\fInoise-sensitivity\fR\fB)\fR" 4
+.IX Item "nr (noise-sensitivity)"
+.PD 0
+.IP "\fBstatic-thresh\fR" 4
+.IX Item "static-thresh"
+.PD
+Set a change threshold on blocks below which they will be skipped by the
+encoder.
+.IP "\fBslices (\fR\fItoken-parts\fR\fB)\fR" 4
+.IX Item "slices (token-parts)"
+Note that FFmpeg's \fBslices\fR option gives the total number of partitions,
+while \fBvpxenc\fR's \fBtoken-parts\fR is given as
+\&\f(CW\*(C`log2(partitions)\*(C'\fR.
+.IP "\fBmax-intra-rate\fR" 4
+.IX Item "max-intra-rate"
+Set maximum I\-frame bitrate as a percentage of the target bitrate. A value of 0
+means unlimited.
+.IP "\fBforce_key_frames\fR" 4
+.IX Item "force_key_frames"
+\&\f(CW\*(C`VPX_EFLAG_FORCE_KF\*(C'\fR
+.IP "\fBAlternate reference frame related\fR" 4
+.IX Item "Alternate reference frame related"
+.RS 4
+.PD 0
+.IP "\fBauto-alt-ref\fR" 4
+.IX Item "auto-alt-ref"
+.PD
+Enable use of alternate reference frames (2\-pass only).
+Values greater than 1 enable multi-layer alternate reference frames (\s-1VP9\s0 only).
+.IP "\fBarnr-maxframes\fR" 4
+.IX Item "arnr-maxframes"
+Set altref noise reduction max frame count.
+.IP "\fBarnr-type\fR" 4
+.IX Item "arnr-type"
+Set altref noise reduction filter type: backward, forward, centered.
+.IP "\fBarnr-strength\fR" 4
+.IX Item "arnr-strength"
+Set altref noise reduction filter strength.
+.IP "\fBrc-lookahead, lag-in-frames (\fR\fIlag-in-frames\fR\fB)\fR" 4
+.IX Item "rc-lookahead, lag-in-frames (lag-in-frames)"
+Set number of frames to look ahead for frametype and ratecontrol.
+.RE
+.RS 4
+.RE
+.IP "\fBerror-resilient\fR" 4
+.IX Item "error-resilient"
+Enable error resiliency features.
+.IP "\fBsharpness\fR \fIinteger\fR" 4
+.IX Item "sharpness integer"
+Increase sharpness at the expense of lower \s-1PSNR.\s0
+The valid range is [0, 7].
+.IP "\fBts-parameters\fR" 4
+.IX Item "ts-parameters"
+Sets the temporal scalability configuration using a :\-separated list of
+key=value pairs. For example, to specify temporal scalability parameters
+with \f(CW\*(C`ffmpeg\*(C'\fR:
+.Sp
+.Vb 3
+\& ffmpeg \-i INPUT \-c:v libvpx \-ts\-parameters ts_number_layers=3:\e
+\& ts_target_bitrate=250,500,1000:ts_rate_decimator=4,2,1:\e
+\& ts_periodicity=4:ts_layer_id=0,2,1,2:ts_layering_mode=3 OUTPUT
+.Ve
+.Sp
+Below is a brief explanation of each of the parameters, please
+refer to \f(CW\*(C`struct vpx_codec_enc_cfg\*(C'\fR in \f(CW\*(C`vpx/vpx_encoder.h\*(C'\fR for more
+details.
+.RS 4
+.IP "\fBts_number_layers\fR" 4
+.IX Item "ts_number_layers"
+Number of temporal coding layers.
+.IP "\fBts_target_bitrate\fR" 4
+.IX Item "ts_target_bitrate"
+Target bitrate for each temporal layer (in kbps).
+(bitrate should be inclusive of the lower temporal layer).
+.IP "\fBts_rate_decimator\fR" 4
+.IX Item "ts_rate_decimator"
+Frame rate decimation factor for each temporal layer.
+.IP "\fBts_periodicity\fR" 4
+.IX Item "ts_periodicity"
+Length of the sequence defining frame temporal layer membership.
+.IP "\fBts_layer_id\fR" 4
+.IX Item "ts_layer_id"
+Template defining the membership of frames to temporal layers.
+.IP "\fBts_layering_mode\fR" 4
+.IX Item "ts_layering_mode"
+(optional) Selecting the temporal structure from a set of pre-defined temporal layering modes.
+Currently supports the following options.
+.RS 4
+.IP "\fB0\fR" 4
+.IX Item "0"
+No temporal layering flags are provided internally,
+relies on flags being passed in using \f(CW\*(C`metadata\*(C'\fR field in \f(CW\*(C`AVFrame\*(C'\fR
+with following keys.
+.RS 4
+.IP "\fBvp8\-flags\fR" 4
+.IX Item "vp8-flags"
+Sets the flags passed into the encoder to indicate the referencing scheme for
+the current frame.
+Refer to function \f(CW\*(C`vpx_codec_encode\*(C'\fR in \f(CW\*(C`vpx/vpx_encoder.h\*(C'\fR for more
+details.
+.IP "\fBtemporal_id\fR" 4
+.IX Item "temporal_id"
+Explicitly sets the temporal id of the current frame to encode.
+.RE
+.RS 4
+.RE
+.IP "\fB2\fR" 4
+.IX Item "2"
+Two temporal layers. 0\-1...
+.IP "\fB3\fR" 4
+.IX Item "3"
+Three temporal layers. 0\-2\-1\-2...; with single reference frame.
+.IP "\fB4\fR" 4
+.IX Item "4"
+Same as option \*(L"3\*(R", except there is a dependency between
+the two temporal layer 2 frames within the temporal period.
+.RE
+.RS 4
+.RE
+.RE
+.RS 4
+.RE
+.IP "\fBVP9\-specific options\fR" 4
+.IX Item "VP9-specific options"
+.RS 4
+.PD 0
+.IP "\fBlossless\fR" 4
+.IX Item "lossless"
+.PD
+Enable lossless mode.
+.IP "\fBtile-columns\fR" 4
+.IX Item "tile-columns"
+Set number of tile columns to use. Note this is given as
+\&\f(CW\*(C`log2(tile_columns)\*(C'\fR. For example, 8 tile columns would be requested by
+setting the \fBtile-columns\fR option to 3.
+.IP "\fBtile-rows\fR" 4
+.IX Item "tile-rows"
+Set number of tile rows to use. Note this is given as \f(CW\*(C`log2(tile_rows)\*(C'\fR.
+For example, 4 tile rows would be requested by setting the \fBtile-rows\fR
+option to 2.
+.IP "\fBframe-parallel\fR" 4
+.IX Item "frame-parallel"
+Enable frame parallel decodability features.
+.IP "\fBaq-mode\fR" 4
+.IX Item "aq-mode"
+Set adaptive quantization mode (0: off (default), 1: variance 2: complexity, 3:
+cyclic refresh, 4: equator360).
+.IP "\fBcolorspace\fR \fIcolor-space\fR" 4
+.IX Item "colorspace color-space"
+Set input color space. The \s-1VP9\s0 bitstream supports signaling the following
+colorspaces:
+.RS 4
+.IP "\fB\fBrgb\fB \f(BIsRGB\fB\fR" 4
+.IX Item "rgb sRGB"
+.PD 0
+.IP "\fB\fBbt709\fB \f(BIbt709\fB\fR" 4
+.IX Item "bt709 bt709"
+.IP "\fB\fBunspecified\fB \f(BIunknown\fB\fR" 4
+.IX Item "unspecified unknown"
+.IP "\fB\fBbt470bg\fB \f(BIbt601\fB\fR" 4
+.IX Item "bt470bg bt601"
+.IP "\fB\fBsmpte170m\fB \f(BIsmpte170\fB\fR" 4
+.IX Item "smpte170m smpte170"
+.IP "\fB\fBsmpte240m\fB \f(BIsmpte240\fB\fR" 4
+.IX Item "smpte240m smpte240"
+.IP "\fB\fBbt2020_ncl\fB \f(BIbt2020\fB\fR" 4
+.IX Item "bt2020_ncl bt2020"
+.RE
+.RS 4
+.RE
+.IP "\fBrow-mt\fR \fIboolean\fR" 4
+.IX Item "row-mt boolean"
+.PD
+Enable row based multi-threading.
+.IP "\fBtune-content\fR" 4
+.IX Item "tune-content"
+Set content type: default (0), screen (1), film (2).
+.IP "\fBcorpus-complexity\fR" 4
+.IX Item "corpus-complexity"
+Corpus \s-1VBR\s0 mode is a variant of standard \s-1VBR\s0 where the complexity distribution
+midpoint is passed in rather than calculated for a specific clip or chunk.
+.Sp
+The valid range is [0, 10000]. 0 (default) uses standard \s-1VBR.\s0
+.IP "\fBenable-tpl\fR \fIboolean\fR" 4
+.IX Item "enable-tpl boolean"
+Enable temporal dependency model.
+.IP "\fBref-frame-config\fR" 4
+.IX Item "ref-frame-config"
+Using per-frame metadata, set members of the structure \f(CW\*(C`vpx_svc_ref_frame_config_t\*(C'\fR in \f(CW\*(C`vpx/vp8cx.h\*(C'\fR to fine-control referencing schemes and frame buffer management.
+Use a :\-separated list of key=value pairs.
+For example,
+.Sp
+.Vb 2
+\& av_dict_set(&av_frame\->metadata, "ref\-frame\-config", \e
+\& "rfc_update_buffer_slot=7:rfc_lst_fb_idx=0:rfc_gld_fb_idx=1:rfc_alt_fb_idx=2:rfc_reference_last=0:rfc_reference_golden=0:rfc_reference_alt_ref=0");
+.Ve
+.RS 4
+.IP "\fBrfc_update_buffer_slot\fR" 4
+.IX Item "rfc_update_buffer_slot"
+Indicates the buffer slot number to update
+.IP "\fBrfc_update_last\fR" 4
+.IX Item "rfc_update_last"
+Indicates whether to update the \s-1LAST\s0 frame
+.IP "\fBrfc_update_golden\fR" 4
+.IX Item "rfc_update_golden"
+Indicates whether to update \s-1GOLDEN\s0 frame
+.IP "\fBrfc_update_alt_ref\fR" 4
+.IX Item "rfc_update_alt_ref"
+Indicates whether to update \s-1ALT_REF\s0 frame
+.IP "\fBrfc_lst_fb_idx\fR" 4
+.IX Item "rfc_lst_fb_idx"
+\&\s-1LAST\s0 frame buffer index
+.IP "\fBrfc_gld_fb_idx\fR" 4
+.IX Item "rfc_gld_fb_idx"
+\&\s-1GOLDEN\s0 frame buffer index
+.IP "\fBrfc_alt_fb_idx\fR" 4
+.IX Item "rfc_alt_fb_idx"
+\&\s-1ALT_REF\s0 frame buffer index
+.IP "\fBrfc_reference_last\fR" 4
+.IX Item "rfc_reference_last"
+Indicates whether to reference \s-1LAST\s0 frame
+.IP "\fBrfc_reference_golden\fR" 4
+.IX Item "rfc_reference_golden"
+Indicates whether to reference \s-1GOLDEN\s0 frame
+.IP "\fBrfc_reference_alt_ref\fR" 4
+.IX Item "rfc_reference_alt_ref"
+Indicates whether to reference \s-1ALT_REF\s0 frame
+.IP "\fBrfc_reference_duration\fR" 4
+.IX Item "rfc_reference_duration"
+Indicates frame duration
+.RE
+.RS 4
+.RE
+.RE
+.RS 4
+.RE
+.PP
+For more information about libvpx see:
+<\fBhttp://www.webmproject.org/\fR>
+.SS "libwebp"
+.IX Subsection "libwebp"
+libwebp WebP Image encoder wrapper
+.PP
+libwebp is Google's official encoder for WebP images. It can encode in either
+lossy or lossless mode. Lossy images are essentially a wrapper around a \s-1VP8\s0
+frame. Lossless images are a separate codec developed by Google.
+.PP
+\fIPixel Format\fR
+.IX Subsection "Pixel Format"
+.PP
+Currently, libwebp only supports \s-1YUV420\s0 for lossy and \s-1RGB\s0 for lossless due
+to limitations of the format and libwebp. Alpha is supported for either mode.
+Because of \s-1API\s0 limitations, if \s-1RGB\s0 is passed in when encoding lossy or \s-1YUV\s0 is
+passed in for encoding lossless, the pixel format will automatically be
+converted using functions from libwebp. This is not ideal and is done only for
+convenience.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fB\-lossless\fR \fIboolean\fR" 4
+.IX Item "-lossless boolean"
+Enables/Disables use of lossless mode. Default is 0.
+.IP "\fB\-compression_level\fR \fIinteger\fR" 4
+.IX Item "-compression_level integer"
+For lossy, this is a quality/speed tradeoff. Higher values give better quality
+for a given size at the cost of increased encoding time. For lossless, this is
+a size/speed tradeoff. Higher values give smaller size at the cost of increased
+encoding time. More specifically, it controls the number of extra algorithms
+and compression tools used, and varies the combination of these tools. This
+maps to the \fImethod\fR option in libwebp. The valid range is 0 to 6.
+Default is 4.
+.IP "\fB\-qscale\fR \fIfloat\fR" 4
+.IX Item "-qscale float"
+For lossy encoding, this controls image quality, 0 to 100. For lossless
+encoding, this controls the effort and time spent at compressing more. The
+default value is 75. Note that for usage via libavcodec, this option is called
+\&\fIglobal_quality\fR and must be multiplied by \fI\s-1FF_QP2LAMBDA\s0\fR.
+.IP "\fB\-preset\fR \fItype\fR" 4
+.IX Item "-preset type"
+Configuration preset. This does some automatic settings based on the general
+type of the image.
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+Do not use a preset.
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+Use the encoder default.
+.IP "\fBpicture\fR" 4
+.IX Item "picture"
+Digital picture, like portrait, inner shot
+.IP "\fBphoto\fR" 4
+.IX Item "photo"
+Outdoor photograph, with natural lighting
+.IP "\fBdrawing\fR" 4
+.IX Item "drawing"
+Hand or line drawing, with high-contrast details
+.IP "\fBicon\fR" 4
+.IX Item "icon"
+Small-sized colorful images
+.IP "\fBtext\fR" 4
+.IX Item "text"
+Text-like
+.RE
+.RS 4
+.RE
+.SS "libx264, libx264rgb"
+.IX Subsection "libx264, libx264rgb"
+x264 H.264/MPEG\-4 \s-1AVC\s0 encoder wrapper.
+.PP
+This encoder requires the presence of the libx264 headers and library
+during configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libx264\*(C'\fR.
+.PP
+libx264 supports an impressive number of features, including 8x8 and
+4x4 adaptive spatial transform, adaptive B\-frame placement, \s-1CAVLC/CABAC\s0
+entropy coding, interlacing (\s-1MBAFF\s0), lossless mode, psy optimizations
+for detail retention (adaptive quantization, psy-RD, psy-trellis).
+.PP
+Many libx264 encoder options are mapped to FFmpeg global codec
+options, while unique encoder options are provided through private
+options. Additionally the \fBx264opts\fR and \fBx264\-params\fR
+private options allows one to pass a list of key=value tuples as accepted
+by the libx264 \f(CW\*(C`x264_param_parse\*(C'\fR function.
+.PP
+The x264 project website is at
+<\fBhttp://www.videolan.org/developers/x264.html\fR>.
+.PP
+The libx264rgb encoder is the same as libx264, except it accepts packed \s-1RGB\s0
+pixel formats as input instead of \s-1YUV.\s0
+.PP
+\fISupported Pixel Formats\fR
+.IX Subsection "Supported Pixel Formats"
+.PP
+x264 supports 8\- to 10\-bit color spaces. The exact bit depth is controlled at
+x264's configure time.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libx264 wrapper. The
+\&\fBx264\fR\-equivalent options or values are listed in parentheses
+for easy migration.
+.PP
+To reduce the duplication of documentation, only the private options
+and some others requiring special attention are documented here. For
+the documentation of the undocumented generic options, see
+\&\fBthe Codec Options chapter\fR.
+.PP
+To get a more accurate and extensive documentation of the libx264
+options, invoke the command \fBx264 \-\-fullhelp\fR or consult
+the libx264 documentation.
+.IP "\fBb (\fR\fIbitrate\fR\fB)\fR" 4
+.IX Item "b (bitrate)"
+Set bitrate in bits/s. Note that FFmpeg's \fBb\fR option is
+expressed in bits/s, while \fBx264\fR's \fBbitrate\fR is in
+kilobits/s.
+.IP "\fBbf (\fR\fIbframes\fR\fB)\fR" 4
+.IX Item "bf (bframes)"
+.PD 0
+.IP "\fBg (\fR\fIkeyint\fR\fB)\fR" 4
+.IX Item "g (keyint)"
+.IP "\fBqmin (\fR\fIqpmin\fR\fB)\fR" 4
+.IX Item "qmin (qpmin)"
+.PD
+Minimum quantizer scale.
+.IP "\fBqmax (\fR\fIqpmax\fR\fB)\fR" 4
+.IX Item "qmax (qpmax)"
+Maximum quantizer scale.
+.IP "\fBqdiff (\fR\fIqpstep\fR\fB)\fR" 4
+.IX Item "qdiff (qpstep)"
+Maximum difference between quantizer scales.
+.IP "\fBqblur (\fR\fIqblur\fR\fB)\fR" 4
+.IX Item "qblur (qblur)"
+Quantizer curve blur
+.IP "\fBqcomp (\fR\fIqcomp\fR\fB)\fR" 4
+.IX Item "qcomp (qcomp)"
+Quantizer curve compression factor
+.IP "\fBrefs (\fR\fIref\fR\fB)\fR" 4
+.IX Item "refs (ref)"
+Number of reference frames each P\-frame can use. The range is from \fI0\-16\fR.
+.IP "\fBsc_threshold (\fR\fIscenecut\fR\fB)\fR" 4
+.IX Item "sc_threshold (scenecut)"
+Sets the threshold for the scene change detection.
+.IP "\fBtrellis (\fR\fItrellis\fR\fB)\fR" 4
+.IX Item "trellis (trellis)"
+Performs Trellis quantization to increase efficiency. Enabled by default.
+.IP "\fBnr (\fR\fInr\fR\fB)\fR" 4
+.IX Item "nr (nr)"
+.PD 0
+.IP "\fBme_range (\fR\fImerange\fR\fB)\fR" 4
+.IX Item "me_range (merange)"
+.PD
+Maximum range of the motion search in pixels.
+.IP "\fBme_method (\fR\fIme\fR\fB)\fR" 4
+.IX Item "me_method (me)"
+Set motion estimation method. Possible values in the decreasing order
+of speed:
+.RS 4
+.IP "\fBdia (\fR\fIdia\fR\fB)\fR" 4
+.IX Item "dia (dia)"
+.PD 0
+.IP "\fBepzs (\fR\fIdia\fR\fB)\fR" 4
+.IX Item "epzs (dia)"
+.PD
+Diamond search with radius 1 (fastest). \fBepzs\fR is an alias for
+\&\fBdia\fR.
+.IP "\fBhex (\fR\fIhex\fR\fB)\fR" 4
+.IX Item "hex (hex)"
+Hexagonal search with radius 2.
+.IP "\fBumh (\fR\fIumh\fR\fB)\fR" 4
+.IX Item "umh (umh)"
+Uneven multi-hexagon search.
+.IP "\fBesa (\fR\fIesa\fR\fB)\fR" 4
+.IX Item "esa (esa)"
+Exhaustive search.
+.IP "\fBtesa (\fR\fItesa\fR\fB)\fR" 4
+.IX Item "tesa (tesa)"
+Hadamard exhaustive search (slowest).
+.RE
+.RS 4
+.RE
+.IP "\fBforced-idr\fR" 4
+.IX Item "forced-idr"
+Normally, when forcing a I\-frame type, the encoder can select any type
+of I\-frame. This option forces it to choose an IDR-frame.
+.IP "\fBsubq (\fR\fIsubme\fR\fB)\fR" 4
+.IX Item "subq (subme)"
+Sub-pixel motion estimation method.
+.IP "\fBb_strategy (\fR\fIb\-adapt\fR\fB)\fR" 4
+.IX Item "b_strategy (b-adapt)"
+Adaptive B\-frame placement decision algorithm. Use only on first-pass.
+.IP "\fBkeyint_min (\fR\fImin-keyint\fR\fB)\fR" 4
+.IX Item "keyint_min (min-keyint)"
+Minimum \s-1GOP\s0 size.
+.IP "\fBcoder\fR" 4
+.IX Item "coder"
+Set entropy encoder. Possible values:
+.RS 4
+.IP "\fBac\fR" 4
+.IX Item "ac"
+Enable \s-1CABAC.\s0
+.IP "\fBvlc\fR" 4
+.IX Item "vlc"
+Enable \s-1CAVLC\s0 and disable \s-1CABAC.\s0 It generates the same effect as
+\&\fBx264\fR's \fB\-\-no\-cabac\fR option.
+.RE
+.RS 4
+.RE
+.IP "\fBcmp\fR" 4
+.IX Item "cmp"
+Set full pixel motion estimation comparison algorithm. Possible values:
+.RS 4
+.IP "\fBchroma\fR" 4
+.IX Item "chroma"
+Enable chroma in motion estimation.
+.IP "\fBsad\fR" 4
+.IX Item "sad"
+Ignore chroma in motion estimation. It generates the same effect as
+\&\fBx264\fR's \fB\-\-no\-chroma\-me\fR option.
+.RE
+.RS 4
+.RE
+.IP "\fBthreads (\fR\fIthreads\fR\fB)\fR" 4
+.IX Item "threads (threads)"
+Number of encoding threads.
+.IP "\fBthread_type\fR" 4
+.IX Item "thread_type"
+Set multithreading technique. Possible values:
+.RS 4
+.IP "\fBslice\fR" 4
+.IX Item "slice"
+Slice-based multithreading. It generates the same effect as
+\&\fBx264\fR's \fB\-\-sliced\-threads\fR option.
+.IP "\fBframe\fR" 4
+.IX Item "frame"
+Frame-based multithreading.
+.RE
+.RS 4
+.RE
+.IP "\fBflags\fR" 4
+.IX Item "flags"
+Set encoding flags. It can be used to disable closed \s-1GOP\s0 and enable
+open \s-1GOP\s0 by setting it to \f(CW\*(C`\-cgop\*(C'\fR. The result is similar to
+the behavior of \fBx264\fR's \fB\-\-open\-gop\fR option.
+.IP "\fBrc_init_occupancy (\fR\fIvbv-init\fR\fB)\fR" 4
+.IX Item "rc_init_occupancy (vbv-init)"
+.PD 0
+.IP "\fBpreset (\fR\fIpreset\fR\fB)\fR" 4
+.IX Item "preset (preset)"
+.PD
+Set the encoding preset.
+.IP "\fBtune (\fR\fItune\fR\fB)\fR" 4
+.IX Item "tune (tune)"
+Set tuning of the encoding params.
+.IP "\fBprofile (\fR\fIprofile\fR\fB)\fR" 4
+.IX Item "profile (profile)"
+Set profile restrictions.
+.IP "\fBfastfirstpass\fR" 4
+.IX Item "fastfirstpass"
+Enable fast settings when encoding first pass, when set to 1. When set
+to 0, it has the same effect of \fBx264\fR's
+\&\fB\-\-slow\-firstpass\fR option.
+.IP "\fBcrf (\fR\fIcrf\fR\fB)\fR" 4
+.IX Item "crf (crf)"
+Set the quality for constant quality mode.
+.IP "\fBcrf_max (\fR\fIcrf-max\fR\fB)\fR" 4
+.IX Item "crf_max (crf-max)"
+In \s-1CRF\s0 mode, prevents \s-1VBV\s0 from lowering quality beyond this point.
+.IP "\fBqp (\fR\fIqp\fR\fB)\fR" 4
+.IX Item "qp (qp)"
+Set constant quantization rate control method parameter.
+.IP "\fBaq-mode (\fR\fIaq-mode\fR\fB)\fR" 4
+.IX Item "aq-mode (aq-mode)"
+Set \s-1AQ\s0 method. Possible values:
+.RS 4
+.IP "\fBnone (\fR\fI0\fR\fB)\fR" 4
+.IX Item "none (0)"
+Disabled.
+.IP "\fBvariance (\fR\fI1\fR\fB)\fR" 4
+.IX Item "variance (1)"
+Variance \s-1AQ\s0 (complexity mask).
+.IP "\fBautovariance (\fR\fI2\fR\fB)\fR" 4
+.IX Item "autovariance (2)"
+Auto-variance \s-1AQ\s0 (experimental).
+.RE
+.RS 4
+.RE
+.IP "\fBaq-strength (\fR\fIaq-strength\fR\fB)\fR" 4
+.IX Item "aq-strength (aq-strength)"
+Set \s-1AQ\s0 strength, reduce blocking and blurring in flat and textured areas.
+.IP "\fBpsy\fR" 4
+.IX Item "psy"
+Use psychovisual optimizations when set to 1. When set to 0, it has the
+same effect as \fBx264\fR's \fB\-\-no\-psy\fR option.
+.IP "\fBpsy-rd (\fR\fIpsy-rd\fR\fB)\fR" 4
+.IX Item "psy-rd (psy-rd)"
+Set strength of psychovisual optimization, in
+\&\fIpsy-rd\fR:\fIpsy-trellis\fR format.
+.IP "\fBrc-lookahead (\fR\fIrc-lookahead\fR\fB)\fR" 4
+.IX Item "rc-lookahead (rc-lookahead)"
+Set number of frames to look ahead for frametype and ratecontrol.
+.IP "\fBweightb\fR" 4
+.IX Item "weightb"
+Enable weighted prediction for B\-frames when set to 1. When set to 0,
+it has the same effect as \fBx264\fR's \fB\-\-no\-weightb\fR option.
+.IP "\fBweightp (\fR\fIweightp\fR\fB)\fR" 4
+.IX Item "weightp (weightp)"
+Set weighted prediction method for P\-frames. Possible values:
+.RS 4
+.IP "\fBnone (\fR\fI0\fR\fB)\fR" 4
+.IX Item "none (0)"
+Disabled
+.IP "\fBsimple (\fR\fI1\fR\fB)\fR" 4
+.IX Item "simple (1)"
+Enable only weighted refs
+.IP "\fBsmart (\fR\fI2\fR\fB)\fR" 4
+.IX Item "smart (2)"
+Enable both weighted refs and duplicates
+.RE
+.RS 4
+.RE
+.IP "\fBssim (\fR\fIssim\fR\fB)\fR" 4
+.IX Item "ssim (ssim)"
+Enable calculation and printing \s-1SSIM\s0 stats after the encoding.
+.IP "\fBintra-refresh (\fR\fIintra-refresh\fR\fB)\fR" 4
+.IX Item "intra-refresh (intra-refresh)"
+Enable the use of Periodic Intra Refresh instead of \s-1IDR\s0 frames when set
+to 1.
+.IP "\fBavcintra-class (\fR\fIclass\fR\fB)\fR" 4
+.IX Item "avcintra-class (class)"
+Configure the encoder to generate AVC-Intra.
+Valid values are 50,100 and 200
+.IP "\fBbluray-compat (\fR\fIbluray-compat\fR\fB)\fR" 4
+.IX Item "bluray-compat (bluray-compat)"
+Configure the encoder to be compatible with the bluray standard.
+It is a shorthand for setting \*(L"bluray\-compat=1 force\-cfr=1\*(R".
+.IP "\fBb\-bias (\fR\fIb\-bias\fR\fB)\fR" 4
+.IX Item "b-bias (b-bias)"
+Set the influence on how often B\-frames are used.
+.IP "\fBb\-pyramid (\fR\fIb\-pyramid\fR\fB)\fR" 4
+.IX Item "b-pyramid (b-pyramid)"
+Set method for keeping of some B\-frames as references. Possible values:
+.RS 4
+.IP "\fBnone (\fR\fInone\fR\fB)\fR" 4
+.IX Item "none (none)"
+Disabled.
+.IP "\fBstrict (\fR\fIstrict\fR\fB)\fR" 4
+.IX Item "strict (strict)"
+Strictly hierarchical pyramid.
+.IP "\fBnormal (\fR\fInormal\fR\fB)\fR" 4
+.IX Item "normal (normal)"
+Non-strict (not Blu-ray compatible).
+.RE
+.RS 4
+.RE
+.IP "\fBmixed-refs\fR" 4
+.IX Item "mixed-refs"
+Enable the use of one reference per partition, as opposed to one
+reference per macroblock when set to 1. When set to 0, it has the
+same effect as \fBx264\fR's \fB\-\-no\-mixed\-refs\fR option.
+.IP "\fB8x8dct\fR" 4
+.IX Item "8x8dct"
+Enable adaptive spatial transform (high profile 8x8 transform)
+when set to 1. When set to 0, it has the same effect as
+\&\fBx264\fR's \fB\-\-no\-8x8dct\fR option.
+.IP "\fBfast-pskip\fR" 4
+.IX Item "fast-pskip"
+Enable early \s-1SKIP\s0 detection on P\-frames when set to 1. When set
+to 0, it has the same effect as \fBx264\fR's
+\&\fB\-\-no\-fast\-pskip\fR option.
+.IP "\fBaud (\fR\fIaud\fR\fB)\fR" 4
+.IX Item "aud (aud)"
+Enable use of access unit delimiters when set to 1.
+.IP "\fBmbtree\fR" 4
+.IX Item "mbtree"
+Enable use macroblock tree ratecontrol when set to 1. When set
+to 0, it has the same effect as \fBx264\fR's
+\&\fB\-\-no\-mbtree\fR option.
+.IP "\fBdeblock (\fR\fIdeblock\fR\fB)\fR" 4
+.IX Item "deblock (deblock)"
+Set loop filter parameters, in \fIalpha\fR:\fIbeta\fR form.
+.IP "\fBcplxblur (\fR\fIcplxblur\fR\fB)\fR" 4
+.IX Item "cplxblur (cplxblur)"
+Set fluctuations reduction in \s-1QP\s0 (before curve compression).
+.IP "\fBpartitions (\fR\fIpartitions\fR\fB)\fR" 4
+.IX Item "partitions (partitions)"
+Set partitions to consider as a comma-separated list of. Possible
+values in the list:
+.RS 4
+.IP "\fBp8x8\fR" 4
+.IX Item "p8x8"
+8x8 P\-frame partition.
+.IP "\fBp4x4\fR" 4
+.IX Item "p4x4"
+4x4 P\-frame partition.
+.IP "\fBb8x8\fR" 4
+.IX Item "b8x8"
+4x4 B\-frame partition.
+.IP "\fBi8x8\fR" 4
+.IX Item "i8x8"
+8x8 I\-frame partition.
+.IP "\fBi4x4\fR" 4
+.IX Item "i4x4"
+4x4 I\-frame partition.
+(Enabling \fBp4x4\fR requires \fBp8x8\fR to be enabled. Enabling
+\&\fBi8x8\fR requires adaptive spatial transform (\fB8x8dct\fR
+option) to be enabled.)
+.IP "\fBnone (\fR\fInone\fR\fB)\fR" 4
+.IX Item "none (none)"
+Do not consider any partitions.
+.IP "\fBall (\fR\fIall\fR\fB)\fR" 4
+.IX Item "all (all)"
+Consider every partition.
+.RE
+.RS 4
+.RE
+.IP "\fBdirect-pred (\fR\fIdirect\fR\fB)\fR" 4
+.IX Item "direct-pred (direct)"
+Set direct \s-1MV\s0 prediction mode. Possible values:
+.RS 4
+.IP "\fBnone (\fR\fInone\fR\fB)\fR" 4
+.IX Item "none (none)"
+Disable \s-1MV\s0 prediction.
+.IP "\fBspatial (\fR\fIspatial\fR\fB)\fR" 4
+.IX Item "spatial (spatial)"
+Enable spatial predicting.
+.IP "\fBtemporal (\fR\fItemporal\fR\fB)\fR" 4
+.IX Item "temporal (temporal)"
+Enable temporal predicting.
+.IP "\fBauto (\fR\fIauto\fR\fB)\fR" 4
+.IX Item "auto (auto)"
+Automatically decided.
+.RE
+.RS 4
+.RE
+.IP "\fBslice-max-size (\fR\fIslice-max-size\fR\fB)\fR" 4
+.IX Item "slice-max-size (slice-max-size)"
+Set the limit of the size of each slice in bytes. If not specified
+but \s-1RTP\s0 payload size (\fBps\fR) is specified, that is used.
+.IP "\fBstats (\fR\fIstats\fR\fB)\fR" 4
+.IX Item "stats (stats)"
+Set the file name for multi-pass stats.
+.IP "\fBnal-hrd (\fR\fInal-hrd\fR\fB)\fR" 4
+.IX Item "nal-hrd (nal-hrd)"
+Set signal \s-1HRD\s0 information (requires \fBvbv-bufsize\fR to be set).
+Possible values:
+.RS 4
+.IP "\fBnone (\fR\fInone\fR\fB)\fR" 4
+.IX Item "none (none)"
+Disable \s-1HRD\s0 information signaling.
+.IP "\fBvbr (\fR\fIvbr\fR\fB)\fR" 4
+.IX Item "vbr (vbr)"
+Variable bit rate.
+.IP "\fBcbr (\fR\fIcbr\fR\fB)\fR" 4
+.IX Item "cbr (cbr)"
+Constant bit rate (not allowed in \s-1MP4\s0 container).
+.RE
+.RS 4
+.RE
+.IP "\fBx264opts (N.A.)\fR" 4
+.IX Item "x264opts (N.A.)"
+Set any x264 option, see \fBx264 \-\-fullhelp\fR for a list.
+.Sp
+Argument is a list of \fIkey\fR=\fIvalue\fR couples separated by
+\&\*(L":\*(R". In \fIfilter\fR and \fIpsy-rd\fR options that use \*(L":\*(R" as a separator
+themselves, use \*(L",\*(R" instead. They accept it as well since long ago but this
+is kept undocumented for some reason.
+.Sp
+For example to specify libx264 encoding options with \fBffmpeg\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i foo.mpg \-c:v libx264 \-x264opts keyint=123:min\-keyint=20 \-an out.mkv
+.Ve
+.IP "\fBa53cc\fR \fIboolean\fR" 4
+.IX Item "a53cc boolean"
+Import closed captions (which must be \s-1ATSC\s0 compatible format) into output.
+Only the mpeg2 and h264 decoders provide these. Default is 1 (on).
+.IP "\fBx264\-params (N.A.)\fR" 4
+.IX Item "x264-params (N.A.)"
+Override the x264 configuration using a :\-separated list of key=value
+parameters.
+.Sp
+This option is functionally the same as the \fBx264opts\fR, but is
+duplicated for compatibility with the Libav fork.
+.Sp
+For example to specify libx264 encoding options with \fBffmpeg\fR:
+.Sp
+.Vb 3
+\& ffmpeg \-i INPUT \-c:v libx264 \-x264\-params level=30:bframes=0:weightp=0:\e
+\& cabac=0:ref=1:vbv\-maxrate=768:vbv\-bufsize=2000:analyse=all:me=umh:\e
+\& no\-fast\-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT
+.Ve
+.PP
+Encoding ffpresets for common usages are provided so they can be used with the
+general presets system (e.g. passing the \fBpre\fR option).
+.SS "libx265"
+.IX Subsection "libx265"
+x265 H.265/HEVC encoder wrapper.
+.PP
+This encoder requires the presence of the libx265 headers and library
+during configuration. You need to explicitly configure the build with
+\&\fB\-\-enable\-libx265\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Sets target video bitrate.
+.IP "\fBbf\fR" 4
+.IX Item "bf"
+.PD 0
+.IP "\fBg\fR" 4
+.IX Item "g"
+.PD
+Set the \s-1GOP\s0 size.
+.IP "\fBkeyint_min\fR" 4
+.IX Item "keyint_min"
+Minimum \s-1GOP\s0 size.
+.IP "\fBrefs\fR" 4
+.IX Item "refs"
+Number of reference frames each P\-frame can use. The range is from \fI1\-16\fR.
+.IP "\fBpreset\fR" 4
+.IX Item "preset"
+Set the x265 preset.
+.IP "\fBtune\fR" 4
+.IX Item "tune"
+Set the x265 tune parameter.
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Set profile restrictions.
+.IP "\fBcrf\fR" 4
+.IX Item "crf"
+Set the quality for constant quality mode.
+.IP "\fBqp\fR" 4
+.IX Item "qp"
+Set constant quantization rate control method parameter.
+.IP "\fBqmin\fR" 4
+.IX Item "qmin"
+Minimum quantizer scale.
+.IP "\fBqmax\fR" 4
+.IX Item "qmax"
+Maximum quantizer scale.
+.IP "\fBqdiff\fR" 4
+.IX Item "qdiff"
+Maximum difference between quantizer scales.
+.IP "\fBqblur\fR" 4
+.IX Item "qblur"
+Quantizer curve blur
+.IP "\fBqcomp\fR" 4
+.IX Item "qcomp"
+Quantizer curve compression factor
+.IP "\fBi_qfactor\fR" 4
+.IX Item "i_qfactor"
+.PD 0
+.IP "\fBb_qfactor\fR" 4
+.IX Item "b_qfactor"
+.IP "\fBforced-idr\fR" 4
+.IX Item "forced-idr"
+.PD
+Normally, when forcing a I\-frame type, the encoder can select any type
+of I\-frame. This option forces it to choose an IDR-frame.
+.IP "\fBx265\-params\fR" 4
+.IX Item "x265-params"
+Set x265 options using a list of \fIkey\fR=\fIvalue\fR couples separated
+by \*(L":\*(R". See \fBx265 \-\-help\fR for a list of options.
+.Sp
+For example to specify libx265 encoding options with \fB\-x265\-params\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i input \-c:v libx265 \-x265\-params crf=26:psy\-rd=1 output.mp4
+.Ve
+.SS "libxavs2"
+.IX Subsection "libxavs2"
+xavs2 \s-1AVS2\-P2/IEEE1857.4\s0 encoder wrapper.
+.PP
+This encoder requires the presence of the libxavs2 headers and library
+during configuration. You need to explicitly configure the build with
+\&\fB\-\-enable\-libxavs2\fR.
+.PP
+The following standard libavcodec options are used:
+.IP "\(bu" 4
+\&\fBb\fR / \fBbit_rate\fR
+.IP "\(bu" 4
+\&\fBg\fR / \fBgop_size\fR
+.IP "\(bu" 4
+\&\fBbf\fR / \fBmax_b_frames\fR
+.PP
+The encoder also has its own specific options:
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBlcu_row_threads\fR" 4
+.IX Item "lcu_row_threads"
+Set the number of parallel threads for rows from 1 to 8 (default 5).
+.IP "\fBinitial_qp\fR" 4
+.IX Item "initial_qp"
+Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
+used to set the initial qp for the first frame.
+.IP "\fBqp\fR" 4
+.IX Item "qp"
+Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
+used to set the qp value under constant-QP mode.
+.IP "\fBmax_qp\fR" 4
+.IX Item "max_qp"
+Set the max qp for rate control from 1 to 63 (default 55).
+.IP "\fBmin_qp\fR" 4
+.IX Item "min_qp"
+Set the min qp for rate control from 1 to 63 (default 20).
+.IP "\fBspeed_level\fR" 4
+.IX Item "speed_level"
+Set the Speed level from 0 to 9 (default 0). Higher is better but slower.
+.IP "\fBlog_level\fR" 4
+.IX Item "log_level"
+Set the log level from \-1 to 3 (default 0). \-1: none, 0: error,
+1: warning, 2: info, 3: debug.
+.IP "\fBxavs2\-params\fR" 4
+.IX Item "xavs2-params"
+Set xavs2 options using a list of \fIkey\fR=\fIvalue\fR couples separated
+by \*(L":\*(R".
+.Sp
+For example to specify libxavs2 encoding options with \fB\-xavs2\-params\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i input \-c:v libxavs2 \-xavs2\-params RdoqLevel=0 output.avs2
+.Ve
+.SS "libxvid"
+.IX Subsection "libxvid"
+Xvid \s-1MPEG\-4\s0 Part 2 encoder wrapper.
+.PP
+This encoder requires the presence of the libxvidcore headers and library
+during configuration. You need to explicitly configure the build with
+\&\f(CW\*(C`\-\-enable\-libxvid \-\-enable\-gpl\*(C'\fR.
+.PP
+The native \f(CW\*(C`mpeg4\*(C'\fR encoder supports the \s-1MPEG\-4\s0 Part 2 format, so
+users can encode to this format without this library.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The following options are supported by the libxvid wrapper. Some of
+the following options are listed but are not documented, and
+correspond to shared codec options. See \fBthe Codec
+Options chapter\fR for their documentation. The other shared options
+which are not listed have no effect for the libxvid encoder.
+.IP "\fBb\fR" 4
+.IX Item "b"
+.PD 0
+.IP "\fBg\fR" 4
+.IX Item "g"
+.IP "\fBqmin\fR" 4
+.IX Item "qmin"
+.IP "\fBqmax\fR" 4
+.IX Item "qmax"
+.IP "\fBmpeg_quant\fR" 4
+.IX Item "mpeg_quant"
+.IP "\fBthreads\fR" 4
+.IX Item "threads"
+.IP "\fBbf\fR" 4
+.IX Item "bf"
+.IP "\fBb_qfactor\fR" 4
+.IX Item "b_qfactor"
+.IP "\fBb_qoffset\fR" 4
+.IX Item "b_qoffset"
+.IP "\fBflags\fR" 4
+.IX Item "flags"
+.PD
+Set specific encoding flags. Possible values:
+.RS 4
+.IP "\fBmv4\fR" 4
+.IX Item "mv4"
+Use four motion vector by macroblock.
+.IP "\fBaic\fR" 4
+.IX Item "aic"
+Enable high quality \s-1AC\s0 prediction.
+.IP "\fBgray\fR" 4
+.IX Item "gray"
+Only encode grayscale.
+.IP "\fBgmc\fR" 4
+.IX Item "gmc"
+Enable the use of global motion compensation (\s-1GMC\s0).
+.IP "\fBqpel\fR" 4
+.IX Item "qpel"
+Enable quarter-pixel motion compensation.
+.IP "\fBcgop\fR" 4
+.IX Item "cgop"
+Enable closed \s-1GOP.\s0
+.IP "\fBglobal_header\fR" 4
+.IX Item "global_header"
+Place global headers in extradata instead of every keyframe.
+.RE
+.RS 4
+.RE
+.IP "\fBtrellis\fR" 4
+.IX Item "trellis"
+.PD 0
+.IP "\fBme_method\fR" 4
+.IX Item "me_method"
+.PD
+Set motion estimation method. Possible values in decreasing order of
+speed and increasing order of quality:
+.RS 4
+.IP "\fBzero\fR" 4
+.IX Item "zero"
+Use no motion estimation (default).
+.IP "\fBphods\fR" 4
+.IX Item "phods"
+.PD 0
+.IP "\fBx1\fR" 4
+.IX Item "x1"
+.IP "\fBlog\fR" 4
+.IX Item "log"
+.PD
+Enable advanced diamond zonal search for 16x16 blocks and half-pixel
+refinement for 16x16 blocks. \fBx1\fR and \fBlog\fR are aliases for
+\&\fBphods\fR.
+.IP "\fBepzs\fR" 4
+.IX Item "epzs"
+Enable all of the things described above, plus advanced diamond zonal
+search for 8x8 blocks, half-pixel refinement for 8x8 blocks, and motion
+estimation on chroma planes.
+.IP "\fBfull\fR" 4
+.IX Item "full"
+Enable all of the things described above, plus extended 16x16 and 8x8
+blocks search.
+.RE
+.RS 4
+.RE
+.IP "\fBmbd\fR" 4
+.IX Item "mbd"
+Set macroblock decision algorithm. Possible values in the increasing
+order of quality:
+.RS 4
+.IP "\fBsimple\fR" 4
+.IX Item "simple"
+Use macroblock comparing function algorithm (default).
+.IP "\fBbits\fR" 4
+.IX Item "bits"
+Enable rate distortion-based half pixel and quarter pixel refinement for
+16x16 blocks.
+.IP "\fBrd\fR" 4
+.IX Item "rd"
+Enable all of the things described above, plus rate distortion-based
+half pixel and quarter pixel refinement for 8x8 blocks, and rate
+distortion-based search using square pattern.
+.RE
+.RS 4
+.RE
+.IP "\fBlumi_aq\fR" 4
+.IX Item "lumi_aq"
+Enable lumi masking adaptive quantization when set to 1. Default is 0
+(disabled).
+.IP "\fBvariance_aq\fR" 4
+.IX Item "variance_aq"
+Enable variance adaptive quantization when set to 1. Default is 0
+(disabled).
+.Sp
+When combined with \fBlumi_aq\fR, the resulting quality will not
+be better than any of the two specified individually. In other
+words, the resulting quality will be the worse one of the two
+effects.
+.IP "\fBssim\fR" 4
+.IX Item "ssim"
+Set structural similarity (\s-1SSIM\s0) displaying method. Possible values:
+.RS 4
+.IP "\fBoff\fR" 4
+.IX Item "off"
+Disable displaying of \s-1SSIM\s0 information.
+.IP "\fBavg\fR" 4
+.IX Item "avg"
+Output average \s-1SSIM\s0 at the end of encoding to stdout. The format of
+showing the average \s-1SSIM\s0 is:
+.Sp
+.Vb 1
+\& Average SSIM: %f
+.Ve
+.Sp
+For users who are not familiar with C, \f(CW%f\fR means a float number, or
+a decimal (e.g. 0.939232).
+.IP "\fBframe\fR" 4
+.IX Item "frame"
+Output both per-frame \s-1SSIM\s0 data during encoding and average \s-1SSIM\s0 at
+the end of encoding to stdout. The format of per-frame information
+is:
+.Sp
+.Vb 1
+\& SSIM: avg: %1.3f min: %1.3f max: %1.3f
+.Ve
+.Sp
+For users who are not familiar with C, \f(CW%1\fR.3f means a float number
+rounded to 3 digits after the dot (e.g. 0.932).
+.RE
+.RS 4
+.RE
+.IP "\fBssim_acc\fR" 4
+.IX Item "ssim_acc"
+Set \s-1SSIM\s0 accuracy. Valid options are integers within the range of
+0\-4, while 0 gives the most accurate result and 4 computes the
+fastest.
+.SS "MediaFoundation"
+.IX Subsection "MediaFoundation"
+This provides wrappers to encoders (both audio and video) in the
+MediaFoundation framework. It can access both \s-1SW\s0 and \s-1HW\s0 encoders.
+Video encoders can take input in either of nv12 or yuv420p form
+(some encoders support both, some support only either \- in practice,
+nv12 is the safer choice, especially among \s-1HW\s0 encoders).
+.SS "mpeg2"
+.IX Subsection "mpeg2"
+\&\s-1MPEG\-2\s0 video encoder.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBprofile\fR" 4
+.IX Item "profile"
+Select the mpeg2 profile to encode:
+.RS 4
+.IP "\fB422\fR" 4
+.IX Item "422"
+.PD 0
+.IP "\fBhigh\fR" 4
+.IX Item "high"
+.IP "\fBss\fR" 4
+.IX Item "ss"
+.PD
+Spatially Scalable
+.IP "\fBsnr\fR" 4
+.IX Item "snr"
+\&\s-1SNR\s0 Scalable
+.IP "\fBmain\fR" 4
+.IX Item "main"
+.PD 0
+.IP "\fBsimple\fR" 4
+.IX Item "simple"
+.RE
+.RS 4
+.RE
+.IP "\fBlevel\fR" 4
+.IX Item "level"
+.PD
+Select the mpeg2 level to encode:
+.RS 4
+.IP "\fBhigh\fR" 4
+.IX Item "high"
+.PD 0
+.IP "\fBhigh1440\fR" 4
+.IX Item "high1440"
+.IP "\fBmain\fR" 4
+.IX Item "main"
+.IP "\fBlow\fR" 4
+.IX Item "low"
+.RE
+.RS 4
+.RE
+.IP "\fBseq_disp_ext\fR \fIinteger\fR" 4
+.IX Item "seq_disp_ext integer"
+.PD
+Specifies if the encoder should write a sequence_display_extension to the
+output.
+.RS 4
+.IP "\fB\-1\fR" 4
+.IX Item "-1"
+.PD 0
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+.PD
+Decide automatically to write it or not (this is the default) by checking if
+the data to be written is different from the default or unspecified values.
+.IP "\fB0\fR" 4
+.IX Item "0"
+.PD 0
+.IP "\fBnever\fR" 4
+.IX Item "never"
+.PD
+Never write it.
+.IP "\fB1\fR" 4
+.IX Item "1"
+.PD 0
+.IP "\fBalways\fR" 4
+.IX Item "always"
+.PD
+Always write it.
+.RE
+.RS 4
+.RE
+.IP "\fBvideo_format\fR \fIinteger\fR" 4
+.IX Item "video_format integer"
+Specifies the video_format written into the sequence display extension
+indicating the source of the video pictures. The default is \fBunspecified\fR,
+can be \fBcomponent\fR, \fBpal\fR, \fBntsc\fR, \fBsecam\fR or \fBmac\fR.
+For maximum compatibility, use \fBcomponent\fR.
+.IP "\fBa53cc\fR \fIboolean\fR" 4
+.IX Item "a53cc boolean"
+Import closed captions (which must be \s-1ATSC\s0 compatible format) into output.
+Default is 1 (on).
+.SS "png"
+.IX Subsection "png"
+\&\s-1PNG\s0 image encoder.
+.PP
+\fIPrivate options\fR
+.IX Subsection "Private options"
+.IP "\fBdpi\fR \fIinteger\fR" 4
+.IX Item "dpi integer"
+Set physical density of pixels, in dots per inch, unset by default
+.IP "\fBdpm\fR \fIinteger\fR" 4
+.IX Item "dpm integer"
+Set physical density of pixels, in dots per meter, unset by default
+.SS "ProRes"
+.IX Subsection "ProRes"
+Apple ProRes encoder.
+.PP
+FFmpeg contains 2 ProRes encoders, the prores-aw and prores-ks encoder.
+The used encoder can be chosen with the \f(CW\*(C`\-vcodec\*(C'\fR option.
+.PP
+\fIPrivate Options for prores-ks\fR
+.IX Subsection "Private Options for prores-ks"
+.IP "\fBprofile\fR \fIinteger\fR" 4
+.IX Item "profile integer"
+Select the ProRes profile to encode
+.RS 4
+.IP "\fBproxy\fR" 4
+.IX Item "proxy"
+.PD 0
+.IP "\fBlt\fR" 4
+.IX Item "lt"
+.IP "\fBstandard\fR" 4
+.IX Item "standard"
+.IP "\fBhq\fR" 4
+.IX Item "hq"
+.IP "\fB4444\fR" 4
+.IX Item "4444"
+.IP "\fB4444xq\fR" 4
+.IX Item "4444xq"
+.RE
+.RS 4
+.RE
+.IP "\fBquant_mat\fR \fIinteger\fR" 4
+.IX Item "quant_mat integer"
+.PD
+Select quantization matrix.
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+.PD 0
+.IP "\fBdefault\fR" 4
+.IX Item "default"
+.IP "\fBproxy\fR" 4
+.IX Item "proxy"
+.IP "\fBlt\fR" 4
+.IX Item "lt"
+.IP "\fBstandard\fR" 4
+.IX Item "standard"
+.IP "\fBhq\fR" 4
+.IX Item "hq"
+.RE
+.RS 4
+.PD
+.Sp
+If set to \fIauto\fR, the matrix matching the profile will be picked.
+If not set, the matrix providing the highest quality, \fIdefault\fR, will be
+picked.
+.RE
+.IP "\fBbits_per_mb\fR \fIinteger\fR" 4
+.IX Item "bits_per_mb integer"
+How many bits to allot for coding one macroblock. Different profiles use
+between 200 and 2400 bits per macroblock, the maximum is 8000.
+.IP "\fBmbs_per_slice\fR \fIinteger\fR" 4
+.IX Item "mbs_per_slice integer"
+Number of macroblocks in each slice (1\-8); the default value (8)
+should be good in almost all situations.
+.IP "\fBvendor\fR \fIstring\fR" 4
+.IX Item "vendor string"
+Override the 4\-byte vendor \s-1ID.
+A\s0 custom vendor \s-1ID\s0 like \fIapl0\fR would claim the stream was produced by
+the Apple encoder.
+.IP "\fBalpha_bits\fR \fIinteger\fR" 4
+.IX Item "alpha_bits integer"
+Specify number of bits for alpha component.
+Possible values are \fI0\fR, \fI8\fR and \fI16\fR.
+Use \fI0\fR to disable alpha plane coding.
+.PP
+\fISpeed considerations\fR
+.IX Subsection "Speed considerations"
+.PP
+In the default mode of operation the encoder has to honor frame constraints
+(i.e. not produce frames with size bigger than requested) while still making
+output picture as good as possible.
+A frame containing a lot of small details is harder to compress and the encoder
+would spend more time searching for appropriate quantizers for each slice.
+.PP
+Setting a higher \fBbits_per_mb\fR limit will improve the speed.
+.PP
+For the fastest encoding speed set the \fBqscale\fR parameter (4 is the
+recommended value) and do not set a size constraint.
+.SS "\s-1QSV\s0 encoders"
+.IX Subsection "QSV encoders"
+The family of Intel QuickSync Video encoders (\s-1MPEG\-2, H.264, HEVC, JPEG/MJPEG\s0 and \s-1VP9\s0)
+.PP
+The ratecontrol method is selected as follows:
+.IP "\(bu" 4
+When \fBglobal_quality\fR is specified, a quality-based mode is used.
+Specifically this means either
+.RS 4
+.IP "\-" 4
+\&\fI\s-1CQP\s0\fR \- constant quantizer scale, when the \fBqscale\fR codec flag is
+also set (the \fB\-qscale\fR ffmpeg option).
+.IP "\-" 4
+\&\fI\s-1LA_ICQ\s0\fR \- intelligent constant quality with lookahead, when the
+\&\fBlook_ahead\fR option is also set.
+.IP "\-" 4
+\&\fI\s-1ICQ\s0\fR \*(-- intelligent constant quality otherwise.
+.RE
+.RS 4
+.RE
+.IP "\(bu" 4
+Otherwise, a bitrate-based mode is used. For all of those, you should specify at
+least the desired average bitrate with the \fBb\fR option.
+.RS 4
+.IP "\-" 4
+\&\fI\s-1LA\s0\fR \- \s-1VBR\s0 with lookahead, when the \fBlook_ahead\fR option is specified.
+.IP "\-" 4
+\&\fI\s-1VCM\s0\fR \- video conferencing mode, when the \fBvcm\fR option is set.
+.IP "\-" 4
+\&\fI\s-1CBR\s0\fR \- constant bitrate, when \fBmaxrate\fR is specified and equal to
+the average bitrate.
+.IP "\-" 4
+\&\fI\s-1VBR\s0\fR \- variable bitrate, when \fBmaxrate\fR is specified, but is higher
+than the average bitrate.
+.IP "\-" 4
+\&\fI\s-1AVBR\s0\fR \- average \s-1VBR\s0 mode, when \fBmaxrate\fR is not specified. This mode
+is further configured by the \fBavbr_accuracy\fR and
+\&\fBavbr_convergence\fR options.
+.RE
+.RS 4
+.RE
+.PP
+Note that depending on your system, a different mode than the one you specified
+may be selected by the encoder. Set the verbosity level to \fIverbose\fR or
+higher to see the actual settings used by the \s-1QSV\s0 runtime.
+.PP
+Additional libavcodec global options are mapped to \s-1MSDK\s0 options as follows:
+.IP "\(bu" 4
+\&\fBg/gop_size\fR \-> \fBGopPicSize\fR
+.IP "\(bu" 4
+\&\fBbf/max_b_frames\fR+1 \-> \fBGopRefDist\fR
+.IP "\(bu" 4
+\&\fBrc_init_occupancy/rc_initial_buffer_occupancy\fR \->
+\&\fBInitialDelayInKB\fR
+.IP "\(bu" 4
+\&\fBslices\fR \-> \fBNumSlice\fR
+.IP "\(bu" 4
+\&\fBrefs\fR \-> \fBNumRefFrame\fR
+.IP "\(bu" 4
+\&\fBb_strategy/b_frame_strategy\fR \-> \fBBRefType\fR
+.IP "\(bu" 4
+\&\fBcgop/CLOSED_GOP\fR codec flag \-> \fBGopOptFlag\fR
+.IP "\(bu" 4
+For the \fI\s-1CQP\s0\fR mode, the \fBi_qfactor/i_qoffset\fR and
+\&\fBb_qfactor/b_qoffset\fR set the difference between \fI\s-1QPP\s0\fR and \fI\s-1QPI\s0\fR,
+and \fI\s-1QPP\s0\fR and \fI\s-1QPB\s0\fR respectively.
+.IP "\(bu" 4
+Setting the \fBcoder\fR option to the value \fIvlc\fR will make the H.264
+encoder use \s-1CAVLC\s0 instead of \s-1CABAC.\s0
+.SS "snow"
+.IX Subsection "snow"
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBiterative_dia_size\fR" 4
+.IX Item "iterative_dia_size"
+dia size for the iterative motion estimation
+.SS "\s-1VAAPI\s0 encoders"
+.IX Subsection "VAAPI encoders"
+Wrappers for hardware encoders accessible via \s-1VAAPI.\s0
+.PP
+These encoders only accept input in \s-1VAAPI\s0 hardware surfaces. If you have input
+in software frames, use the \fBhwupload\fR filter to upload them to the \s-1GPU.\s0
+.PP
+The following standard libavcodec options are used:
+.IP "\(bu" 4
+\&\fBg\fR / \fBgop_size\fR
+.IP "\(bu" 4
+\&\fBbf\fR / \fBmax_b_frames\fR
+.IP "\(bu" 4
+\&\fBprofile\fR
+.Sp
+If not set, this will be determined automatically from the format of the input
+frames and the profiles supported by the driver.
+.IP "\(bu" 4
+\&\fBlevel\fR
+.IP "\(bu" 4
+\&\fBb\fR / \fBbit_rate\fR
+.IP "\(bu" 4
+\&\fBmaxrate\fR / \fBrc_max_rate\fR
+.IP "\(bu" 4
+\&\fBbufsize\fR / \fBrc_buffer_size\fR
+.IP "\(bu" 4
+\&\fBrc_init_occupancy\fR / \fBrc_initial_buffer_occupancy\fR
+.IP "\(bu" 4
+\&\fBcompression_level\fR
+.Sp
+Speed / quality tradeoff: higher values are faster / worse quality.
+.IP "\(bu" 4
+\&\fBq\fR / \fBglobal_quality\fR
+.Sp
+Size / quality tradeoff: higher values are smaller / worse quality.
+.IP "\(bu" 4
+\&\fBqmin\fR
+.IP "\(bu" 4
+\&\fBqmax\fR
+.IP "\(bu" 4
+\&\fBi_qfactor\fR / \fBi_quant_factor\fR
+.IP "\(bu" 4
+\&\fBi_qoffset\fR / \fBi_quant_offset\fR
+.IP "\(bu" 4
+\&\fBb_qfactor\fR / \fBb_quant_factor\fR
+.IP "\(bu" 4
+\&\fBb_qoffset\fR / \fBb_quant_offset\fR
+.IP "\(bu" 4
+\&\fBslices\fR
+.PP
+All encoders support the following options:
+.IP "\fBlow_power\fR" 4
+.IX Item "low_power"
+Some drivers/platforms offer a second encoder for some codecs intended to use
+less power than the default encoder; setting this option will attempt to use
+that encoder. Note that it may support a reduced feature set, so some other
+options may not be available in this mode.
+.IP "\fBidr_interval\fR" 4
+.IX Item "idr_interval"
+Set the number of normal intra frames between full-refresh (\s-1IDR\s0) frames in
+open-GOP mode. The intra frames are still IRAPs, but will not include global
+headers and may have non-decodable leading pictures.
+.IP "\fBb_depth\fR" 4
+.IX Item "b_depth"
+Set the B\-frame reference depth. When set to one (the default), all B\-frames
+will refer only to P\- or I\-frames. When set to greater values multiple layers
+of B\-frames will be present, frames in each layer only referring to frames in
+higher layers.
+.IP "\fBrc_mode\fR" 4
+.IX Item "rc_mode"
+Set the rate control mode to use. A given driver may only support a subset of
+modes.
+.Sp
+Possible modes:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Choose the mode automatically based on driver support and the other options.
+This is the default.
+.IP "\fB\s-1CQP\s0\fR" 4
+.IX Item "CQP"
+Constant-quality.
+.IP "\fB\s-1CBR\s0\fR" 4
+.IX Item "CBR"
+Constant-bitrate.
+.IP "\fB\s-1VBR\s0\fR" 4
+.IX Item "VBR"
+Variable-bitrate.
+.IP "\fB\s-1ICQ\s0\fR" 4
+.IX Item "ICQ"
+Intelligent constant-quality.
+.IP "\fB\s-1QVBR\s0\fR" 4
+.IX Item "QVBR"
+Quality-defined variable-bitrate.
+.IP "\fB\s-1AVBR\s0\fR" 4
+.IX Item "AVBR"
+Average variable bitrate.
+.RE
+.RS 4
+.RE
+.PP
+Each encoder also has its own specific options:
+.IP "\fBh264_vaapi\fR" 4
+.IX Item "h264_vaapi"
+\&\fBprofile\fR sets the value of \fIprofile_idc\fR and the \fIconstraint_set*_flag\fRs.
+\&\fBlevel\fR sets the value of \fIlevel_idc\fR.
+.RS 4
+.IP "\fBcoder\fR" 4
+.IX Item "coder"
+Set entropy encoder (default is \fIcabac\fR). Possible values:
+.RS 4
+.IP "\fBac\fR" 4
+.IX Item "ac"
+.PD 0
+.IP "\fBcabac\fR" 4
+.IX Item "cabac"
+.PD
+Use \s-1CABAC.\s0
+.IP "\fBvlc\fR" 4
+.IX Item "vlc"
+.PD 0
+.IP "\fBcavlc\fR" 4
+.IX Item "cavlc"
+.PD
+Use \s-1CAVLC.\s0
+.RE
+.RS 4
+.RE
+.IP "\fBaud\fR" 4
+.IX Item "aud"
+Include access unit delimiters in the stream (not included by default).
+.IP "\fBsei\fR" 4
+.IX Item "sei"
+Set \s-1SEI\s0 message types to include.
+Some combination of the following values:
+.RS 4
+.IP "\fBidentifier\fR" 4
+.IX Item "identifier"
+Include a \fIuser_data_unregistered\fR message containing information about
+the encoder.
+.IP "\fBtiming\fR" 4
+.IX Item "timing"
+Include picture timing parameters (\fIbuffering_period\fR and
+\&\fIpic_timing\fR messages).
+.IP "\fBrecovery_point\fR" 4
+.IX Item "recovery_point"
+Include recovery points where appropriate (\fIrecovery_point\fR messages).
+.RE
+.RS 4
+.RE
+.RE
+.RS 4
+.RE
+.IP "\fBhevc_vaapi\fR" 4
+.IX Item "hevc_vaapi"
+\&\fBprofile\fR and \fBlevel\fR set the values of
+\&\fIgeneral_profile_idc\fR and \fIgeneral_level_idc\fR respectively.
+.RS 4
+.IP "\fBaud\fR" 4
+.IX Item "aud"
+Include access unit delimiters in the stream (not included by default).
+.IP "\fBtier\fR" 4
+.IX Item "tier"
+Set \fIgeneral_tier_flag\fR. This may affect the level chosen for the stream
+if it is not explicitly specified.
+.IP "\fBsei\fR" 4
+.IX Item "sei"
+Set \s-1SEI\s0 message types to include.
+Some combination of the following values:
+.RS 4
+.IP "\fBhdr\fR" 4
+.IX Item "hdr"
+Include \s-1HDR\s0 metadata if the input frames have it
+(\fImastering_display_colour_volume\fR and \fIcontent_light_level\fR
+messages).
+.RE
+.RS 4
+.RE
+.IP "\fBtiles\fR" 4
+.IX Item "tiles"
+Set the number of tiles to encode the input video with, as columns x rows.
+Larger numbers allow greater parallelism in both encoding and decoding, but
+may decrease coding efficiency.
+.RE
+.RS 4
+.RE
+.IP "\fBmjpeg_vaapi\fR" 4
+.IX Item "mjpeg_vaapi"
+Only baseline \s-1DCT\s0 encoding is supported. The encoder always uses the standard
+quantisation and huffman tables \- \fBglobal_quality\fR scales the standard
+quantisation table (range 1\-100).
+.Sp
+For \s-1YUV, 4:2:0, 4:2:2\s0 and 4:4:4 subsampling modes are supported. \s-1RGB\s0 is also
+supported, and will create an \s-1RGB JPEG.\s0
+.RS 4
+.IP "\fBjfif\fR" 4
+.IX Item "jfif"
+Include \s-1JFIF\s0 header in each frame (not included by default).
+.IP "\fBhuffman\fR" 4
+.IX Item "huffman"
+Include standard huffman tables (on by default). Turning this off will save
+a few hundred bytes in each output frame, but may lose compatibility with some
+\&\s-1JPEG\s0 decoders which don't fully handle \s-1MJPEG.\s0
+.RE
+.RS 4
+.RE
+.IP "\fBmpeg2_vaapi\fR" 4
+.IX Item "mpeg2_vaapi"
+\&\fBprofile\fR and \fBlevel\fR set the value of \fIprofile_and_level_indication\fR.
+.IP "\fBvp8_vaapi\fR" 4
+.IX Item "vp8_vaapi"
+B\-frames are not supported.
+.Sp
+\&\fBglobal_quality\fR sets the \fIq_idx\fR used for non-key frames (range 0\-127).
+.RS 4
+.IP "\fBloop_filter_level\fR" 4
+.IX Item "loop_filter_level"
+.PD 0
+.IP "\fBloop_filter_sharpness\fR" 4
+.IX Item "loop_filter_sharpness"
+.PD
+Manually set the loop filter parameters.
+.RE
+.RS 4
+.RE
+.IP "\fBvp9_vaapi\fR" 4
+.IX Item "vp9_vaapi"
+\&\fBglobal_quality\fR sets the \fIq_idx\fR used for P\-frames (range 0\-255).
+.RS 4
+.IP "\fBloop_filter_level\fR" 4
+.IX Item "loop_filter_level"
+.PD 0
+.IP "\fBloop_filter_sharpness\fR" 4
+.IX Item "loop_filter_sharpness"
+.PD
+Manually set the loop filter parameters.
+.RE
+.RS 4
+.Sp
+B\-frames are supported, but the output stream is always in encode order rather than display
+order. If B\-frames are enabled, it may be necessary to use the \fBvp9_raw_reorder\fR
+bitstream filter to modify the output stream to display frames in the correct order.
+.Sp
+Only normal frames are produced \- the \fBvp9_superframe\fR bitstream filter may be
+required to produce a stream usable with all decoders.
+.RE
+.SS "vc2"
+.IX Subsection "vc2"
+\&\s-1SMPTE VC\-2\s0 (previously \s-1BBC\s0 Dirac Pro). This codec was primarily aimed at
+professional broadcasting but since it supports yuv420, yuv422 and yuv444 at
+8 (limited range or full range), 10 or 12 bits, this makes it suitable for
+other tasks which require low overhead and low compression (like screen
+recording).
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBb\fR" 4
+.IX Item "b"
+Sets target video bitrate. Usually that's around 1:6 of the uncompressed
+video bitrate (e.g. for 1920x1080 50fps yuv422p10 that's around 400Mbps). Higher
+values (close to the uncompressed bitrate) turn on lossless compression mode.
+.IP "\fBfield_order\fR" 4
+.IX Item "field_order"
+Enables field coding when set (e.g. to tt \- top field first) for interlaced
+inputs. Should increase compression with interlaced content as it splits the
+fields and encodes each separately.
+.IP "\fBwavelet_depth\fR" 4
+.IX Item "wavelet_depth"
+Sets the total amount of wavelet transforms to apply, between 1 and 5 (default).
+Lower values reduce compression and quality. Less capable decoders may not be
+able to handle values of \fBwavelet_depth\fR over 3.
+.IP "\fBwavelet_type\fR" 4
+.IX Item "wavelet_type"
+Sets the transform type. Currently only \fI5_3\fR (LeGall) and \fI9_7\fR
+(Deslauriers-Dubuc)
+are implemented, with 9_7 being the one with better compression and thus
+is the default.
+.IP "\fBslice_width\fR" 4
+.IX Item "slice_width"
+.PD 0
+.IP "\fBslice_height\fR" 4
+.IX Item "slice_height"
+.PD
+Sets the slice size for each slice. Larger values result in better compression.
+For compatibility with other more limited decoders use \fBslice_width\fR of
+32 and \fBslice_height\fR of 8.
+.IP "\fBtolerance\fR" 4
+.IX Item "tolerance"
+Sets the undershoot tolerance of the rate control system in percent. This is
+to prevent an expensive search from being run.
+.IP "\fBqm\fR" 4
+.IX Item "qm"
+Sets the quantization matrix preset to use by default or when \fBwavelet_depth\fR
+is set to 5
+.RS 4
+.IP "\-" 4
+\&\fIdefault\fR
+Uses the default quantization matrix from the specifications, extended with
+values for the fifth level. This provides a good balance between keeping detail
+and omitting artifacts.
+.IP "\-" 4
+\&\fIflat\fR
+Use a completely zeroed out quantization matrix. This increases \s-1PSNR\s0 but might
+reduce perception. Use in bogus benchmarks.
+.IP "\-" 4
+\&\fIcolor\fR
+Reduces detail but attempts to preserve color at extremely low bitrates.
+.RE
+.RS 4
+.RE
+.SH "SUBTITLES ENCODERS"
+.IX Header "SUBTITLES ENCODERS"
+.SS "dvdsub"
+.IX Subsection "dvdsub"
+This codec encodes the bitmap subtitle format that is used in DVDs.
+Typically they are stored in \s-1VOBSUB\s0 file pairs (*.idx + *.sub),
+and they can also be used in Matroska files.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBpalette\fR" 4
+.IX Item "palette"
+Specify the global palette used by the bitmaps.
+.Sp
+The format for this option is a string containing 16 24\-bits hexadecimal
+numbers (without 0x prefix) separated by commas, for example \f(CW\*(C`0d00ee,
+ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
+7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b\*(C'\fR.
+.IP "\fBeven_rows_fix\fR" 4
+.IX Item "even_rows_fix"
+When set to 1, enable a work-around that makes the number of pixel rows
+even in all subtitles. This fixes a problem with some players that
+cut off the bottom row if the number is odd. The work-around just adds
+a fully transparent row if needed. The overhead is low, typically
+one byte per subtitle on average.
+.Sp
+By default, this work-around is disabled.
+.SH "BITSTREAM FILTERS"
+.IX Header "BITSTREAM FILTERS"
+When you configure your FFmpeg build, all the supported bitstream
+filters are enabled by default. You can list all available ones using
+the configure option \f(CW\*(C`\-\-list\-bsfs\*(C'\fR.
+.PP
+You can disable all the bitstream filters using the configure option
+\&\f(CW\*(C`\-\-disable\-bsfs\*(C'\fR, and selectively enable any bitstream filter using
+the option \f(CW\*(C`\-\-enable\-bsf=BSF\*(C'\fR, or you can disable a particular
+bitstream filter using the option \f(CW\*(C`\-\-disable\-bsf=BSF\*(C'\fR.
+.PP
+The option \f(CW\*(C`\-bsfs\*(C'\fR of the ff* tools will display the list of
+all the supported bitstream filters included in your build.
+.PP
+The ff* tools have a \-bsf option applied per stream, taking a
+comma-separated list of filters, whose parameters follow the filter
+name after a '='.
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c:v copy \-bsf:v filter1[=opt1=str1:opt2=str2][,filter2] OUTPUT
+.Ve
+.PP
+Below is a description of the currently available bitstream filters,
+with their parameters, if any.
+.SS "aac_adtstoasc"
+.IX Subsection "aac_adtstoasc"
+Convert \s-1MPEG\-2/4 AAC ADTS\s0 to an \s-1MPEG\-4\s0 Audio Specific Configuration
+bitstream.
+.PP
+This filter creates an \s-1MPEG\-4\s0 AudioSpecificConfig from an \s-1MPEG\-2/4
+ADTS\s0 header and removes the \s-1ADTS\s0 header.
+.PP
+This filter is required for example when copying an \s-1AAC\s0 stream from a
+raw \s-1ADTS AAC\s0 or an MPEG-TS container to \s-1MP4A\-LATM,\s0 to an \s-1FLV\s0 file, or
+to \s-1MOV/MP4\s0 files and related formats such as 3GP or M4A. Please note
+that it is auto-inserted for \s-1MP4A\-LATM\s0 and \s-1MOV/MP4\s0 and related formats.
+.SS "av1_metadata"
+.IX Subsection "av1_metadata"
+Modify metadata embedded in an \s-1AV1\s0 stream.
+.IP "\fBtd\fR" 4
+.IX Item "td"
+Insert or remove temporal delimiter OBUs in all temporal units of the
+stream.
+.RS 4
+.IP "\fBinsert\fR" 4
+.IX Item "insert"
+Insert a \s-1TD\s0 at the beginning of every \s-1TU\s0 which does not already have one.
+.IP "\fBremove\fR" 4
+.IX Item "remove"
+Remove the \s-1TD\s0 from the beginning of every \s-1TU\s0 which has one.
+.RE
+.RS 4
+.RE
+.IP "\fBcolor_primaries\fR" 4
+.IX Item "color_primaries"
+.PD 0
+.IP "\fBtransfer_characteristics\fR" 4
+.IX Item "transfer_characteristics"
+.IP "\fBmatrix_coefficients\fR" 4
+.IX Item "matrix_coefficients"
+.PD
+Set the color description fields in the stream (see \s-1AV1\s0 section 6.4.2).
+.IP "\fBcolor_range\fR" 4
+.IX Item "color_range"
+Set the color range in the stream (see \s-1AV1\s0 section 6.4.2; note that
+this cannot be set for streams using \s-1BT.709\s0 primaries, sRGB transfer
+characteristic and identity (\s-1RGB\s0) matrix coefficients).
+.RS 4
+.IP "\fBtv\fR" 4
+.IX Item "tv"
+Limited range.
+.IP "\fBpc\fR" 4
+.IX Item "pc"
+Full range.
+.RE
+.RS 4
+.RE
+.IP "\fBchroma_sample_position\fR" 4
+.IX Item "chroma_sample_position"
+Set the chroma sample location in the stream (see \s-1AV1\s0 section 6.4.2).
+This can only be set for 4:2:0 streams.
+.RS 4
+.IP "\fBvertical\fR" 4
+.IX Item "vertical"
+Left position (matching the default in \s-1MPEG\-2\s0 and H.264).
+.IP "\fBcolocated\fR" 4
+.IX Item "colocated"
+Top-left position.
+.RE
+.RS 4
+.RE
+.IP "\fBtick_rate\fR" 4
+.IX Item "tick_rate"
+Set the tick rate (\fInum_units_in_display_tick / time_scale\fR) in
+the timing info in the sequence header.
+.IP "\fBnum_ticks_per_picture\fR" 4
+.IX Item "num_ticks_per_picture"
+Set the number of ticks in each picture, to indicate that the stream
+has a fixed framerate. Ignored if \fBtick_rate\fR is not also set.
+.IP "\fBdelete_padding\fR" 4
+.IX Item "delete_padding"
+Deletes Padding OBUs.
+.SS "chomp"
+.IX Subsection "chomp"
+Remove zero padding at the end of a packet.
+.SS "dca_core"
+.IX Subsection "dca_core"
+Extract the core from a \s-1DCA/DTS\s0 stream, dropping extensions such as
+DTS-HD.
+.SS "dump_extra"
+.IX Subsection "dump_extra"
+Add extradata to the beginning of the filtered packets except when
+said packets already exactly begin with the extradata that is intended
+to be added.
+.IP "\fBfreq\fR" 4
+.IX Item "freq"
+The additional argument specifies which packets should be filtered.
+It accepts the values:
+.RS 4
+.IP "\fBk\fR" 4
+.IX Item "k"
+.PD 0
+.IP "\fBkeyframe\fR" 4
+.IX Item "keyframe"
+.PD
+add extradata to all key packets
+.IP "\fBe\fR" 4
+.IX Item "e"
+.PD 0
+.IP "\fBall\fR" 4
+.IX Item "all"
+.PD
+add extradata to all packets
+.RE
+.RS 4
+.RE
+.PP
+If not specified it is assumed \fBk\fR.
+.PP
+For example the following \fBffmpeg\fR command forces a global
+header (thus disabling individual packet headers) in the H.264 packets
+generated by the \f(CW\*(C`libx264\*(C'\fR encoder, but corrects them by adding
+the header stored in extradata to the key packets:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-map 0 \-flags:v +global_header \-c:v libx264 \-bsf:v dump_extra out.ts
+.Ve
+.SS "eac3_core"
+.IX Subsection "eac3_core"
+Extract the core from a E\-AC\-3 stream, dropping extra channels.
+.SS "extract_extradata"
+.IX Subsection "extract_extradata"
+Extract the in-band extradata.
+.PP
+Certain codecs allow the long-term headers (e.g. \s-1MPEG\-2\s0 sequence headers,
+or H.264/HEVC (\s-1VPS/\s0)SPS/PPS) to be transmitted either \*(L"in-band\*(R" (i.e. as a part
+of the bitstream containing the coded frames) or \*(L"out of band\*(R" (e.g. on the
+container level). This latter form is called \*(L"extradata\*(R" in FFmpeg terminology.
+.PP
+This bitstream filter detects the in-band headers and makes them available as
+extradata.
+.IP "\fBremove\fR" 4
+.IX Item "remove"
+When this option is enabled, the long-term headers are removed from the
+bitstream after extraction.
+.SS "filter_units"
+.IX Subsection "filter_units"
+Remove units with types in or not in a given set from the stream.
+.IP "\fBpass_types\fR" 4
+.IX Item "pass_types"
+List of unit types or ranges of unit types to pass through while removing
+all others. This is specified as a '|'\-separated list of unit type values
+or ranges of values with '\-'.
+.IP "\fBremove_types\fR" 4
+.IX Item "remove_types"
+Identical to \fBpass_types\fR, except the units in the given set
+removed and all others passed through.
+.PP
+Extradata is unchanged by this transformation, but note that if the stream
+contains inline parameter sets then the output may be unusable if they are
+removed.
+.PP
+For example, to remove all non-VCL \s-1NAL\s0 units from an H.264 stream:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c:v copy \-bsf:v \*(Aqfilter_units=pass_types=1\-5\*(Aq OUTPUT
+.Ve
+.PP
+To remove all AUDs, \s-1SEI\s0 and filler from an H.265 stream:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c:v copy \-bsf:v \*(Aqfilter_units=remove_types=35|38\-40\*(Aq OUTPUT
+.Ve
+.SS "hapqa_extract"
+.IX Subsection "hapqa_extract"
+Extract Rgb or Alpha part of an \s-1HAPQA\s0 file, without recompression, in order to create an \s-1HAPQ\s0 or an HAPAlphaOnly file.
+.IP "\fBtexture\fR" 4
+.IX Item "texture"
+Specifies the texture to keep.
+.RS 4
+.IP "\fBcolor\fR" 4
+.IX Item "color"
+.PD 0
+.IP "\fBalpha\fR" 4
+.IX Item "alpha"
+.RE
+.RS 4
+.RE
+.PD
+.PP
+Convert \s-1HAPQA\s0 to \s-1HAPQ\s0
+.PP
+.Vb 1
+\& ffmpeg \-i hapqa_inputfile.mov \-c copy \-bsf:v hapqa_extract=texture=color \-tag:v HapY \-metadata:s:v:0 encoder="HAPQ" hapq_file.mov
+.Ve
+.PP
+Convert \s-1HAPQA\s0 to HAPAlphaOnly
+.PP
+.Vb 1
+\& ffmpeg \-i hapqa_inputfile.mov \-c copy \-bsf:v hapqa_extract=texture=alpha \-tag:v HapA \-metadata:s:v:0 encoder="HAPAlpha Only" hapalphaonly_file.mov
+.Ve
+.SS "h264_metadata"
+.IX Subsection "h264_metadata"
+Modify metadata embedded in an H.264 stream.
+.IP "\fBaud\fR" 4
+.IX Item "aud"
+Insert or remove \s-1AUD NAL\s0 units in all access units of the stream.
+.RS 4
+.IP "\fBinsert\fR" 4
+.IX Item "insert"
+.PD 0
+.IP "\fBremove\fR" 4
+.IX Item "remove"
+.RE
+.RS 4
+.RE
+.IP "\fBsample_aspect_ratio\fR" 4
+.IX Item "sample_aspect_ratio"
+.PD
+Set the sample aspect ratio of the stream in the \s-1VUI\s0 parameters.
+.IP "\fBoverscan_appropriate_flag\fR" 4
+.IX Item "overscan_appropriate_flag"
+Set whether the stream is suitable for display using overscan
+or not (see H.264 section E.2.1).
+.IP "\fBvideo_format\fR" 4
+.IX Item "video_format"
+.PD 0
+.IP "\fBvideo_full_range_flag\fR" 4
+.IX Item "video_full_range_flag"
+.PD
+Set the video format in the stream (see H.264 section E.2.1 and
+table E\-2).
+.IP "\fBcolour_primaries\fR" 4
+.IX Item "colour_primaries"
+.PD 0
+.IP "\fBtransfer_characteristics\fR" 4
+.IX Item "transfer_characteristics"
+.IP "\fBmatrix_coefficients\fR" 4
+.IX Item "matrix_coefficients"
+.PD
+Set the colour description in the stream (see H.264 section E.2.1
+and tables E\-3, E\-4 and E\-5).
+.IP "\fBchroma_sample_loc_type\fR" 4
+.IX Item "chroma_sample_loc_type"
+Set the chroma sample location in the stream (see H.264 section
+E.2.1 and figure E\-1).
+.IP "\fBtick_rate\fR" 4
+.IX Item "tick_rate"
+Set the tick rate (num_units_in_tick / time_scale) in the \s-1VUI\s0
+parameters. This is the smallest time unit representable in the
+stream, and in many cases represents the field rate of the stream
+(double the frame rate).
+.IP "\fBfixed_frame_rate_flag\fR" 4
+.IX Item "fixed_frame_rate_flag"
+Set whether the stream has fixed framerate \- typically this indicates
+that the framerate is exactly half the tick rate, but the exact
+meaning is dependent on interlacing and the picture structure (see
+H.264 section E.2.1 and table E\-6).
+.IP "\fBcrop_left\fR" 4
+.IX Item "crop_left"
+.PD 0
+.IP "\fBcrop_right\fR" 4
+.IX Item "crop_right"
+.IP "\fBcrop_top\fR" 4
+.IX Item "crop_top"
+.IP "\fBcrop_bottom\fR" 4
+.IX Item "crop_bottom"
+.PD
+Set the frame cropping offsets in the \s-1SPS.\s0 These values will replace
+the current ones if the stream is already cropped.
+.Sp
+These fields are set in pixels. Note that some sizes may not be
+representable if the chroma is subsampled or the stream is interlaced
+(see H.264 section 7.4.2.1.1).
+.IP "\fBsei_user_data\fR" 4
+.IX Item "sei_user_data"
+Insert a string as \s-1SEI\s0 unregistered user data. The argument must
+be of the form \fIUUID+string\fR, where the \s-1UUID\s0 is as hex digits
+possibly separated by hyphens, and the string can be anything.
+.Sp
+For example, \fB086f3693\-b7b3\-4f2c\-9653\-21492feee5b8+hello\fR will
+insert the string ``hello'' associated with the given \s-1UUID.\s0
+.IP "\fBdelete_filler\fR" 4
+.IX Item "delete_filler"
+Deletes both filler \s-1NAL\s0 units and filler \s-1SEI\s0 messages.
+.IP "\fBlevel\fR" 4
+.IX Item "level"
+Set the level in the \s-1SPS.\s0 Refer to H.264 section A.3 and tables A\-1
+to A\-5.
+.Sp
+The argument must be the name of a level (for example, \fB4.2\fR), a
+level_idc value (for example, \fB42\fR), or the special name \fBauto\fR
+indicating that the filter should attempt to guess the level from the
+input stream properties.
+.SS "h264_mp4toannexb"
+.IX Subsection "h264_mp4toannexb"
+Convert an H.264 bitstream from length prefixed mode to start code
+prefixed mode (as defined in the Annex B of the ITU-T H.264
+specification).
+.PP
+This is required by some streaming formats, typically the \s-1MPEG\-2\s0
+transport stream format (muxer \f(CW\*(C`mpegts\*(C'\fR).
+.PP
+For example to remux an \s-1MP4\s0 file containing an H.264 stream to mpegts
+format with \fBffmpeg\fR, you can use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT.mp4 \-codec copy \-bsf:v h264_mp4toannexb OUTPUT.ts
+.Ve
+.PP
+Please note that this filter is auto-inserted for MPEG-TS (muxer
+\&\f(CW\*(C`mpegts\*(C'\fR) and raw H.264 (muxer \f(CW\*(C`h264\*(C'\fR) output formats.
+.SS "h264_redundant_pps"
+.IX Subsection "h264_redundant_pps"
+This applies a specific fixup to some Blu-ray streams which contain
+redundant PPSs modifying irrelevant parameters of the stream which
+confuse other transformations which require correct extradata.
+.PP
+A new single global \s-1PPS\s0 is created, and all of the redundant PPSs
+within the stream are removed.
+.SS "hevc_metadata"
+.IX Subsection "hevc_metadata"
+Modify metadata embedded in an \s-1HEVC\s0 stream.
+.IP "\fBaud\fR" 4
+.IX Item "aud"
+Insert or remove \s-1AUD NAL\s0 units in all access units of the stream.
+.RS 4
+.IP "\fBinsert\fR" 4
+.IX Item "insert"
+.PD 0
+.IP "\fBremove\fR" 4
+.IX Item "remove"
+.RE
+.RS 4
+.RE
+.IP "\fBsample_aspect_ratio\fR" 4
+.IX Item "sample_aspect_ratio"
+.PD
+Set the sample aspect ratio in the stream in the \s-1VUI\s0 parameters.
+.IP "\fBvideo_format\fR" 4
+.IX Item "video_format"
+.PD 0
+.IP "\fBvideo_full_range_flag\fR" 4
+.IX Item "video_full_range_flag"
+.PD
+Set the video format in the stream (see H.265 section E.3.1 and
+table E.2).
+.IP "\fBcolour_primaries\fR" 4
+.IX Item "colour_primaries"
+.PD 0
+.IP "\fBtransfer_characteristics\fR" 4
+.IX Item "transfer_characteristics"
+.IP "\fBmatrix_coefficients\fR" 4
+.IX Item "matrix_coefficients"
+.PD
+Set the colour description in the stream (see H.265 section E.3.1
+and tables E.3, E.4 and E.5).
+.IP "\fBchroma_sample_loc_type\fR" 4
+.IX Item "chroma_sample_loc_type"
+Set the chroma sample location in the stream (see H.265 section
+E.3.1 and figure E.1).
+.IP "\fBtick_rate\fR" 4
+.IX Item "tick_rate"
+Set the tick rate in the \s-1VPS\s0 and \s-1VUI\s0 parameters (num_units_in_tick /
+time_scale). Combined with \fBnum_ticks_poc_diff_one\fR, this can
+set a constant framerate in the stream. Note that it is likely to be
+overridden by container parameters when the stream is in a container.
+.IP "\fBnum_ticks_poc_diff_one\fR" 4
+.IX Item "num_ticks_poc_diff_one"
+Set poc_proportional_to_timing_flag in \s-1VPS\s0 and \s-1VUI\s0 and use this value
+to set num_ticks_poc_diff_one_minus1 (see H.265 sections 7.4.3.1 and
+E.3.1). Ignored if \fBtick_rate\fR is not also set.
+.IP "\fBcrop_left\fR" 4
+.IX Item "crop_left"
+.PD 0
+.IP "\fBcrop_right\fR" 4
+.IX Item "crop_right"
+.IP "\fBcrop_top\fR" 4
+.IX Item "crop_top"
+.IP "\fBcrop_bottom\fR" 4
+.IX Item "crop_bottom"
+.PD
+Set the conformance window cropping offsets in the \s-1SPS.\s0 These values
+will replace the current ones if the stream is already cropped.
+.Sp
+These fields are set in pixels. Note that some sizes may not be
+representable if the chroma is subsampled (H.265 section 7.4.3.2.1).
+.IP "\fBlevel\fR" 4
+.IX Item "level"
+Set the level in the \s-1VPS\s0 and \s-1SPS.\s0 See H.265 section A.4 and tables
+A.6 and A.7.
+.Sp
+The argument must be the name of a level (for example, \fB5.1\fR), a
+\&\fIgeneral_level_idc\fR value (for example, \fB153\fR for level 5.1),
+or the special name \fBauto\fR indicating that the filter should
+attempt to guess the level from the input stream properties.
+.SS "hevc_mp4toannexb"
+.IX Subsection "hevc_mp4toannexb"
+Convert an \s-1HEVC/H.265\s0 bitstream from length prefixed mode to start code
+prefixed mode (as defined in the Annex B of the ITU-T H.265
+specification).
+.PP
+This is required by some streaming formats, typically the \s-1MPEG\-2\s0
+transport stream format (muxer \f(CW\*(C`mpegts\*(C'\fR).
+.PP
+For example to remux an \s-1MP4\s0 file containing an \s-1HEVC\s0 stream to mpegts
+format with \fBffmpeg\fR, you can use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT.mp4 \-codec copy \-bsf:v hevc_mp4toannexb OUTPUT.ts
+.Ve
+.PP
+Please note that this filter is auto-inserted for MPEG-TS (muxer
+\&\f(CW\*(C`mpegts\*(C'\fR) and raw \s-1HEVC/H.265\s0 (muxer \f(CW\*(C`h265\*(C'\fR or
+\&\f(CW\*(C`hevc\*(C'\fR) output formats.
+.SS "imxdump"
+.IX Subsection "imxdump"
+Modifies the bitstream to fit in \s-1MOV\s0 and to be usable by the Final Cut
+Pro decoder. This filter only applies to the mpeg2video codec, and is
+likely not needed for Final Cut Pro 7 and newer with the appropriate
+\&\fB\-tag:v\fR.
+.PP
+For example, to remux 30 MB/sec \s-1NTSC IMX\s0 to \s-1MOV:\s0
+.PP
+.Vb 1
+\& ffmpeg \-i input.mxf \-c copy \-bsf:v imxdump \-tag:v mx3n output.mov
+.Ve
+.SS "mjpeg2jpeg"
+.IX Subsection "mjpeg2jpeg"
+Convert \s-1MJPEG/AVI1\s0 packets to full \s-1JPEG/JFIF\s0 packets.
+.PP
+\&\s-1MJPEG\s0 is a video codec wherein each video frame is essentially a
+\&\s-1JPEG\s0 image. The individual frames can be extracted without loss,
+e.g. by
+.PP
+.Vb 1
+\& ffmpeg \-i ../some_mjpeg.avi \-c:v copy frames_%d.jpg
+.Ve
+.PP
+Unfortunately, these chunks are incomplete \s-1JPEG\s0 images, because
+they lack the \s-1DHT\s0 segment required for decoding. Quoting from
+<\fBhttp://www.digitalpreservation.gov/formats/fdd/fdd000063.shtml\fR>:
+.PP
+Avery Lee, writing in the rec.video.desktop newsgroup in 2001,
+commented that \*(L"\s-1MJPEG,\s0 or at least the \s-1MJPEG\s0 in AVIs having the
+\&\s-1MJPG\s0 fourcc, is restricted \s-1JPEG\s0 with a fixed \*(-- and *omitted* \*(--
+Huffman table. The \s-1JPEG\s0 must be YCbCr colorspace, it must be 4:2:2,
+and it must use basic Huffman encoding, not arithmetic or
+progressive. . . . You can indeed extract the \s-1MJPEG\s0 frames and
+decode them with a regular \s-1JPEG\s0 decoder, but you have to prepend
+the \s-1DHT\s0 segment to them, or else the decoder won't have any idea
+how to decompress the data. The exact table necessary is given in
+the OpenDML spec.\*(R"
+.PP
+This bitstream filter patches the header of frames extracted from an \s-1MJPEG\s0
+stream (carrying the \s-1AVI1\s0 header \s-1ID\s0 and lacking a \s-1DHT\s0 segment) to
+produce fully qualified \s-1JPEG\s0 images.
+.PP
+.Vb 3
+\& ffmpeg \-i mjpeg\-movie.avi \-c:v copy \-bsf:v mjpeg2jpeg frame_%d.jpg
+\& exiftran \-i \-9 frame*.jpg
+\& ffmpeg \-i frame_%d.jpg \-c:v copy rotated.avi
+.Ve
+.SS "mjpegadump"
+.IX Subsection "mjpegadump"
+Add an \s-1MJPEG A\s0 header to the bitstream, to enable decoding by
+Quicktime.
+.SS "mov2textsub"
+.IX Subsection "mov2textsub"
+Extract a representable text file from \s-1MOV\s0 subtitles, stripping the
+metadata header from each subtitle packet.
+.PP
+See also the \fBtext2movsub\fR filter.
+.SS "mp3decomp"
+.IX Subsection "mp3decomp"
+Decompress non-standard compressed \s-1MP3\s0 audio headers.
+.SS "mpeg2_metadata"
+.IX Subsection "mpeg2_metadata"
+Modify metadata embedded in an \s-1MPEG\-2\s0 stream.
+.IP "\fBdisplay_aspect_ratio\fR" 4
+.IX Item "display_aspect_ratio"
+Set the display aspect ratio in the stream.
+.Sp
+The following fixed values are supported:
+.RS 4
+.IP "\fB4/3\fR" 4
+.IX Item "4/3"
+.PD 0
+.IP "\fB16/9\fR" 4
+.IX Item "16/9"
+.IP "\fB221/100\fR" 4
+.IX Item "221/100"
+.RE
+.RS 4
+.PD
+.Sp
+Any other value will result in square pixels being signalled instead
+(see H.262 section 6.3.3 and table 6\-3).
+.RE
+.IP "\fBframe_rate\fR" 4
+.IX Item "frame_rate"
+Set the frame rate in the stream. This is constructed from a table
+of known values combined with a small multiplier and divisor \- if
+the supplied value is not exactly representable, the nearest
+representable value will be used instead (see H.262 section 6.3.3
+and table 6\-4).
+.IP "\fBvideo_format\fR" 4
+.IX Item "video_format"
+Set the video format in the stream (see H.262 section 6.3.6 and
+table 6\-6).
+.IP "\fBcolour_primaries\fR" 4
+.IX Item "colour_primaries"
+.PD 0
+.IP "\fBtransfer_characteristics\fR" 4
+.IX Item "transfer_characteristics"
+.IP "\fBmatrix_coefficients\fR" 4
+.IX Item "matrix_coefficients"
+.PD
+Set the colour description in the stream (see H.262 section 6.3.6
+and tables 6\-7, 6\-8 and 6\-9).
+.SS "mpeg4_unpack_bframes"
+.IX Subsection "mpeg4_unpack_bframes"
+Unpack DivX-style packed B\-frames.
+.PP
+DivX-style packed B\-frames are not valid \s-1MPEG\-4\s0 and were only a
+workaround for the broken Video for Windows subsystem.
+They use more space, can cause minor \s-1AV\s0 sync issues, require more
+\&\s-1CPU\s0 power to decode (unless the player has some decoded picture queue
+to compensate the 2,0,2,0 frame per packet style) and cause
+trouble if copied into a standard container like mp4 or mpeg\-ps/ts,
+because \s-1MPEG\-4\s0 decoders may not be able to decode them, since they are
+not valid \s-1MPEG\-4.\s0
+.PP
+For example to fix an \s-1AVI\s0 file containing an \s-1MPEG\-4\s0 stream with
+DivX-style packed B\-frames using \fBffmpeg\fR, you can use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT.avi \-codec copy \-bsf:v mpeg4_unpack_bframes OUTPUT.avi
+.Ve
+.SS "noise"
+.IX Subsection "noise"
+Damages the contents of packets or simply drops them without damaging the
+container. Can be used for fuzzing or testing error resilience/concealment.
+.PP
+Parameters:
+.IP "\fBamount\fR" 4
+.IX Item "amount"
+A numeral string, whose value is related to how often output bytes will
+be modified. Therefore, values below or equal to 0 are forbidden, and
+the lower the more frequent bytes will be modified, with 1 meaning
+every byte is modified.
+.IP "\fBdropamount\fR" 4
+.IX Item "dropamount"
+A numeral string, whose value is related to how often packets will be dropped.
+Therefore, values below or equal to 0 are forbidden, and the lower the more
+frequent packets will be dropped, with 1 meaning every packet is dropped.
+.PP
+The following example applies the modification to every byte but does not drop
+any packets.
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c copy \-bsf noise[=1] output.mkv
+.Ve
+.SS "null"
+.IX Subsection "null"
+This bitstream filter passes the packets through unchanged.
+.SS "pcm_rechunk"
+.IX Subsection "pcm_rechunk"
+Repacketize \s-1PCM\s0 audio to a fixed number of samples per packet or a fixed packet
+rate per second. This is similar to the \fBasetnsamples audio
+filter\fR but works on audio packets instead of audio frames.
+.IP "\fBnb_out_samples, n\fR" 4
+.IX Item "nb_out_samples, n"
+Set the number of samples per each output audio packet. The number is intended
+as the number of samples \fIper each channel\fR. Default value is 1024.
+.IP "\fBpad, p\fR" 4
+.IX Item "pad, p"
+If set to 1, the filter will pad the last audio packet with silence, so that it
+will contain the same number of samples (or roughly the same number of samples,
+see \fBframe_rate\fR) as the previous ones. Default value is 1.
+.IP "\fBframe_rate, r\fR" 4
+.IX Item "frame_rate, r"
+This option makes the filter output a fixed number of packets per second instead
+of a fixed number of samples per packet. If the audio sample rate is not
+divisible by the frame rate then the number of samples will not be constant but
+will vary slightly so that each packet will start as close to the frame
+boundary as possible. Using this option has precedence over \fBnb_out_samples\fR.
+.PP
+You can generate the well known 1602\-1601\-1602\-1601\-1602 pattern of 48kHz audio
+for \s-1NTSC\s0 frame rate using the \fBframe_rate\fR option.
+.PP
+.Vb 1
+\& ffmpeg \-f lavfi \-i sine=r=48000:d=1 \-c pcm_s16le \-bsf pcm_rechunk=r=30000/1001 \-f framecrc \-
+.Ve
+.SS "prores_metadata"
+.IX Subsection "prores_metadata"
+Modify color property metadata embedded in prores stream.
+.IP "\fBcolor_primaries\fR" 4
+.IX Item "color_primaries"
+Set the color primaries.
+Available values are:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Keep the same color primaries property (default).
+.IP "\fBunknown\fR" 4
+.IX Item "unknown"
+.PD 0
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+.IP "\fBbt470bg\fR" 4
+.IX Item "bt470bg"
+.PD
+\&\s-1BT601 625\s0
+.IP "\fBsmpte170m\fR" 4
+.IX Item "smpte170m"
+\&\s-1BT601 525\s0
+.IP "\fBbt2020\fR" 4
+.IX Item "bt2020"
+.PD 0
+.IP "\fBsmpte431\fR" 4
+.IX Item "smpte431"
+.PD
+\&\s-1DCI P3\s0
+.IP "\fBsmpte432\fR" 4
+.IX Item "smpte432"
+P3 D65
+.RE
+.RS 4
+.RE
+.IP "\fBtransfer_characteristics\fR" 4
+.IX Item "transfer_characteristics"
+Set the color transfer.
+Available values are:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Keep the same transfer characteristics property (default).
+.IP "\fBunknown\fR" 4
+.IX Item "unknown"
+.PD 0
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+.PD
+\&\s-1BT 601, BT 709, BT 2020\s0
+.IP "\fBsmpte2084\fR" 4
+.IX Item "smpte2084"
+\&\s-1SMPTE ST 2084\s0
+.IP "\fBarib\-std\-b67\fR" 4
+.IX Item "arib-std-b67"
+\&\s-1ARIB STD\-B67\s0
+.RE
+.RS 4
+.RE
+.IP "\fBmatrix_coefficients\fR" 4
+.IX Item "matrix_coefficients"
+Set the matrix coefficient.
+Available values are:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Keep the same colorspace property (default).
+.IP "\fBunknown\fR" 4
+.IX Item "unknown"
+.PD 0
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+.IP "\fBsmpte170m\fR" 4
+.IX Item "smpte170m"
+.PD
+\&\s-1BT 601\s0
+.IP "\fBbt2020nc\fR" 4
+.IX Item "bt2020nc"
+.RE
+.RS 4
+.RE
+.PP
+Set Rec709 colorspace for each frame of the file
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c copy \-bsf:v prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709 output.mov
+.Ve
+.PP
+Set Hybrid Log-Gamma parameters for each frame of the file
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c copy \-bsf:v prores_metadata=color_primaries=bt2020:color_trc=arib\-std\-b67:colorspace=bt2020nc output.mov
+.Ve
+.SS "remove_extra"
+.IX Subsection "remove_extra"
+Remove extradata from packets.
+.PP
+It accepts the following parameter:
+.IP "\fBfreq\fR" 4
+.IX Item "freq"
+Set which frame types to remove extradata from.
+.RS 4
+.IP "\fBk\fR" 4
+.IX Item "k"
+Remove extradata from non-keyframes only.
+.IP "\fBkeyframe\fR" 4
+.IX Item "keyframe"
+Remove extradata from keyframes only.
+.IP "\fBe, all\fR" 4
+.IX Item "e, all"
+Remove extradata from all frames.
+.RE
+.RS 4
+.RE
+.SS "setts"
+.IX Subsection "setts"
+Set \s-1PTS\s0 and \s-1DTS\s0 in packets.
+.PP
+It accepts the following parameters:
+.IP "\fBts\fR" 4
+.IX Item "ts"
+.PD 0
+.IP "\fBpts\fR" 4
+.IX Item "pts"
+.IP "\fBdts\fR" 4
+.IX Item "dts"
+.PD
+Set expressions for \s-1PTS, DTS\s0 or both.
+.PP
+The expressions are evaluated through the eval \s-1API\s0 and can contain the following
+constants:
+.IP "\fBN\fR" 4
+.IX Item "N"
+The count of the input packet. Starting from 0.
+.IP "\fB\s-1TS\s0\fR" 4
+.IX Item "TS"
+The demux timestamp in input in case of \f(CW\*(C`ts\*(C'\fR or \f(CW\*(C`dts\*(C'\fR option or presentation
+timestamp in case of \f(CW\*(C`pts\*(C'\fR option.
+.IP "\fB\s-1POS\s0\fR" 4
+.IX Item "POS"
+The original position in the file of the packet, or undefined if undefined
+for the current packet
+.IP "\fB\s-1DTS\s0\fR" 4
+.IX Item "DTS"
+The demux timestamp in input.
+.IP "\fB\s-1PTS\s0\fR" 4
+.IX Item "PTS"
+The presentation timestamp in input.
+.IP "\fB\s-1STARTDTS\s0\fR" 4
+.IX Item "STARTDTS"
+The \s-1DTS\s0 of the first packet.
+.IP "\fB\s-1STARTPTS\s0\fR" 4
+.IX Item "STARTPTS"
+The \s-1PTS\s0 of the first packet.
+.IP "\fB\s-1PREV_INDTS\s0\fR" 4
+.IX Item "PREV_INDTS"
+The previous input \s-1DTS.\s0
+.IP "\fB\s-1PREV_INPTS\s0\fR" 4
+.IX Item "PREV_INPTS"
+The previous input \s-1PTS.\s0
+.IP "\fB\s-1PREV_OUTDTS\s0\fR" 4
+.IX Item "PREV_OUTDTS"
+The previous output \s-1DTS.\s0
+.IP "\fB\s-1PREV_OUTPTS\s0\fR" 4
+.IX Item "PREV_OUTPTS"
+The previous output \s-1PTS.\s0
+.IP "\fB\s-1TB\s0\fR" 4
+.IX Item "TB"
+The timebase of stream packet belongs.
+.IP "\fB\s-1SR\s0\fR" 4
+.IX Item "SR"
+The sample rate of stream packet belongs.
+.SS "text2movsub"
+.IX Subsection "text2movsub"
+Convert text subtitles to \s-1MOV\s0 subtitles (as used by the \f(CW\*(C`mov_text\*(C'\fR
+codec) with metadata headers.
+.PP
+See also the \fBmov2textsub\fR filter.
+.SS "trace_headers"
+.IX Subsection "trace_headers"
+Log trace output containing all syntax elements in the coded stream
+headers (everything above the level of individual coded blocks).
+This can be useful for debugging low-level stream issues.
+.PP
+Supports \s-1AV1, H.264, H.265,\s0 (M)JPEG, \s-1MPEG\-2\s0 and \s-1VP9,\s0 but depending
+on the build only a subset of these may be available.
+.SS "truehd_core"
+.IX Subsection "truehd_core"
+Extract the core from a TrueHD stream, dropping \s-1ATMOS\s0 data.
+.SS "vp9_metadata"
+.IX Subsection "vp9_metadata"
+Modify metadata embedded in a \s-1VP9\s0 stream.
+.IP "\fBcolor_space\fR" 4
+.IX Item "color_space"
+Set the color space value in the frame header. Note that any frame
+set to \s-1RGB\s0 will be implicitly set to \s-1PC\s0 range and that \s-1RGB\s0 is
+incompatible with profiles 0 and 2.
+.RS 4
+.IP "\fBunknown\fR" 4
+.IX Item "unknown"
+.PD 0
+.IP "\fBbt601\fR" 4
+.IX Item "bt601"
+.IP "\fBbt709\fR" 4
+.IX Item "bt709"
+.IP "\fBsmpte170\fR" 4
+.IX Item "smpte170"
+.IP "\fBsmpte240\fR" 4
+.IX Item "smpte240"
+.IP "\fBbt2020\fR" 4
+.IX Item "bt2020"
+.IP "\fBrgb\fR" 4
+.IX Item "rgb"
+.RE
+.RS 4
+.RE
+.IP "\fBcolor_range\fR" 4
+.IX Item "color_range"
+.PD
+Set the color range value in the frame header. Note that any value
+imposed by the color space will take precedence over this value.
+.RS 4
+.IP "\fBtv\fR" 4
+.IX Item "tv"
+.PD 0
+.IP "\fBpc\fR" 4
+.IX Item "pc"
+.RE
+.RS 4
+.RE
+.PD
+.SS "vp9_superframe"
+.IX Subsection "vp9_superframe"
+Merge \s-1VP9\s0 invisible (alt-ref) frames back into \s-1VP9\s0 superframes. This
+fixes merging of split/segmented \s-1VP9\s0 streams where the alt-ref frame
+was split from its visible counterpart.
+.SS "vp9_superframe_split"
+.IX Subsection "vp9_superframe_split"
+Split \s-1VP9\s0 superframes into single frames.
+.SS "vp9_raw_reorder"
+.IX Subsection "vp9_raw_reorder"
+Given a \s-1VP9\s0 stream with correct timestamps but possibly out of order,
+insert additional show-existing-frame packets to correct the ordering.
+.SH "FORMAT OPTIONS"
+.IX Header "FORMAT OPTIONS"
+The libavformat library provides some generic global options, which
+can be set on all the muxers and demuxers. In addition each muxer or
+demuxer may support so-called private options, which are specific for
+that component.
+.PP
+Options may be set by specifying \-\fIoption\fR \fIvalue\fR in the
+FFmpeg tools, or by setting the value explicitly in the
+\&\f(CW\*(C`AVFormatContext\*(C'\fR options or using the \fIlibavutil/opt.h\fR \s-1API\s0
+for programmatic use.
+.PP
+The list of supported options follows:
+.IP "\fBavioflags\fR \fIflags\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "avioflags flags (input/output)"
+Possible values:
+.RS 4
+.IP "\fBdirect\fR" 4
+.IX Item "direct"
+Reduce buffering.
+.RE
+.RS 4
+.RE
+.IP "\fBprobesize\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "probesize integer (input)"
+Set probing size in bytes, i.e. the size of the data to analyze to get
+stream information. A higher value will enable detecting more
+information in case it is dispersed into the stream, but will increase
+latency. Must be an integer not lesser than 32. It is 5000000 by default.
+.IP "\fBmax_probe_packets\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "max_probe_packets integer (input)"
+Set the maximum number of buffered packets when probing a codec.
+Default is 2500 packets.
+.IP "\fBpacketsize\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "packetsize integer (output)"
+Set packet size.
+.IP "\fBfflags\fR \fIflags\fR" 4
+.IX Item "fflags flags"
+Set format flags. Some are implemented for a limited number of formats.
+.Sp
+Possible values for input files:
+.RS 4
+.IP "\fBdiscardcorrupt\fR" 4
+.IX Item "discardcorrupt"
+Discard corrupted packets.
+.IP "\fBfastseek\fR" 4
+.IX Item "fastseek"
+Enable fast, but inaccurate seeks for some formats.
+.IP "\fBgenpts\fR" 4
+.IX Item "genpts"
+Generate missing \s-1PTS\s0 if \s-1DTS\s0 is present.
+.IP "\fBigndts\fR" 4
+.IX Item "igndts"
+Ignore \s-1DTS\s0 if \s-1PTS\s0 is set. Inert when nofillin is set.
+.IP "\fBignidx\fR" 4
+.IX Item "ignidx"
+Ignore index.
+.IP "\fBkeepside (\fR\fIdeprecated\fR\fB,\fR\fIinert\fR\fB)\fR" 4
+.IX Item "keepside (deprecated,inert)"
+.PD 0
+.IP "\fBnobuffer\fR" 4
+.IX Item "nobuffer"
+.PD
+Reduce the latency introduced by buffering during initial input streams analysis.
+.IP "\fBnofillin\fR" 4
+.IX Item "nofillin"
+Do not fill in missing values in packet fields that can be exactly calculated.
+.IP "\fBnoparse\fR" 4
+.IX Item "noparse"
+Disable AVParsers, this needs \f(CW\*(C`+nofillin\*(C'\fR too.
+.IP "\fBsortdts\fR" 4
+.IX Item "sortdts"
+Try to interleave output packets by \s-1DTS.\s0 At present, available only for AVIs with an index.
+.RE
+.RS 4
+.Sp
+Possible values for output files:
+.IP "\fBautobsf\fR" 4
+.IX Item "autobsf"
+Automatically apply bitstream filters as required by the output format. Enabled by default.
+.IP "\fBbitexact\fR" 4
+.IX Item "bitexact"
+Only write platform\-, build\- and time-independent data.
+This ensures that file and data checksums are reproducible and match between
+platforms. Its primary use is for regression testing.
+.IP "\fBflush_packets\fR" 4
+.IX Item "flush_packets"
+Write out packets immediately.
+.IP "\fBlatm (\fR\fIdeprecated\fR\fB,\fR\fIinert\fR\fB)\fR" 4
+.IX Item "latm (deprecated,inert)"
+.PD 0
+.IP "\fBshortest\fR" 4
+.IX Item "shortest"
+.PD
+Stop muxing at the end of the shortest stream.
+It may be needed to increase max_interleave_delta to avoid flushing the longer
+streams before \s-1EOF.\s0
+.RE
+.RS 4
+.RE
+.IP "\fBseek2any\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "seek2any integer (input)"
+Allow seeking to non-keyframes on demuxer level when supported if set to 1.
+Default is 0.
+.IP "\fBanalyzeduration\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "analyzeduration integer (input)"
+Specify how many microseconds are analyzed to probe the input. A
+higher value will enable detecting more accurate information, but will
+increase latency. It defaults to 5,000,000 microseconds = 5 seconds.
+.IP "\fBcryptokey\fR \fIhexadecimal string\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "cryptokey hexadecimal string (input)"
+Set decryption key.
+.IP "\fBindexmem\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "indexmem integer (input)"
+Set max memory used for timestamp index (per stream).
+.IP "\fBrtbufsize\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "rtbufsize integer (input)"
+Set max memory used for buffering real-time frames.
+.IP "\fBfdebug\fR \fIflags\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "fdebug flags (input/output)"
+Print specific debug info.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBts\fR" 4
+.IX Item "ts"
+.RE
+.RS 4
+.RE
+.PD 0
+.IP "\fBmax_delay\fR \fIinteger\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "max_delay integer (input/output)"
+.PD
+Set maximum muxing or demuxing delay in microseconds.
+.IP "\fBfpsprobesize\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "fpsprobesize integer (input)"
+Set number of frames used to probe fps.
+.IP "\fBaudio_preload\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "audio_preload integer (output)"
+Set microseconds by which audio packets should be interleaved earlier.
+.IP "\fBchunk_duration\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "chunk_duration integer (output)"
+Set microseconds for each chunk.
+.IP "\fBchunk_size\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "chunk_size integer (output)"
+Set size in bytes for each chunk.
+.IP "\fBerr_detect, f_err_detect\fR \fIflags\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "err_detect, f_err_detect flags (input)"
+Set error detection flags. \f(CW\*(C`f_err_detect\*(C'\fR is deprecated and
+should be used only via the \fBffmpeg\fR tool.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBcrccheck\fR" 4
+.IX Item "crccheck"
+Verify embedded CRCs.
+.IP "\fBbitstream\fR" 4
+.IX Item "bitstream"
+Detect bitstream specification deviations.
+.IP "\fBbuffer\fR" 4
+.IX Item "buffer"
+Detect improper bitstream length.
+.IP "\fBexplode\fR" 4
+.IX Item "explode"
+Abort decoding on minor error detection.
+.IP "\fBcareful\fR" 4
+.IX Item "careful"
+Consider things that violate the spec and have not been seen in the
+wild as errors.
+.IP "\fBcompliant\fR" 4
+.IX Item "compliant"
+Consider all spec non compliancies as errors.
+.IP "\fBaggressive\fR" 4
+.IX Item "aggressive"
+Consider things that a sane encoder should not do as an error.
+.RE
+.RS 4
+.RE
+.IP "\fBmax_interleave_delta\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "max_interleave_delta integer (output)"
+Set maximum buffering duration for interleaving. The duration is
+expressed in microseconds, and defaults to 10000000 (10 seconds).
+.Sp
+To ensure all the streams are interleaved correctly, libavformat will
+wait until it has at least one packet for each stream before actually
+writing any packets to the output file. When some streams are
+\&\*(L"sparse\*(R" (i.e. there are large gaps between successive packets), this
+can result in excessive buffering.
+.Sp
+This field specifies the maximum difference between the timestamps of the
+first and the last packet in the muxing queue, above which libavformat
+will output a packet regardless of whether it has queued a packet for all
+the streams.
+.Sp
+If set to 0, libavformat will continue buffering packets until it has
+a packet for each stream, regardless of the maximum timestamp
+difference between the buffered packets.
+.IP "\fBuse_wallclock_as_timestamps\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "use_wallclock_as_timestamps integer (input)"
+Use wallclock as timestamps if set to 1. Default is 0.
+.IP "\fBavoid_negative_ts\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "avoid_negative_ts integer (output)"
+Possible values:
+.RS 4
+.IP "\fBmake_non_negative\fR" 4
+.IX Item "make_non_negative"
+Shift timestamps to make them non-negative.
+Also note that this affects only leading negative timestamps, and not
+non-monotonic negative timestamps.
+.IP "\fBmake_zero\fR" 4
+.IX Item "make_zero"
+Shift timestamps so that the first timestamp is 0.
+.IP "\fBauto (default)\fR" 4
+.IX Item "auto (default)"
+Enables shifting when required by the target format.
+.IP "\fBdisabled\fR" 4
+.IX Item "disabled"
+Disables shifting of timestamp.
+.RE
+.RS 4
+.Sp
+When shifting is enabled, all output timestamps are shifted by the
+same amount. Audio, video, and subtitles desynching and relative
+timestamp differences are preserved compared to how they would have
+been without shifting.
+.RE
+.IP "\fBskip_initial_bytes\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "skip_initial_bytes integer (input)"
+Set number of bytes to skip before reading header and frames if set to 1.
+Default is 0.
+.IP "\fBcorrect_ts_overflow\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "correct_ts_overflow integer (input)"
+Correct single timestamp overflows if set to 1. Default is 1.
+.IP "\fBflush_packets\fR \fIinteger\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "flush_packets integer (output)"
+Flush the underlying I/O stream after each packet. Default is \-1 (auto), which
+means that the underlying protocol will decide, 1 enables it, and has the
+effect of reducing the latency, 0 disables it and may increase \s-1IO\s0 throughput in
+some cases.
+.IP "\fBoutput_ts_offset\fR \fIoffset\fR \fB(\fR\fIoutput\fR\fB)\fR" 4
+.IX Item "output_ts_offset offset (output)"
+Set the output time offset.
+.Sp
+\&\fIoffset\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.Sp
+The offset is added by the muxer to the output timestamps.
+.Sp
+Specifying a positive offset means that the corresponding streams are
+delayed bt the time duration specified in \fIoffset\fR. Default value
+is \f(CW0\fR (meaning that no offset is applied).
+.IP "\fBformat_whitelist\fR \fIlist\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "format_whitelist list (input)"
+\&\*(L",\*(R" separated list of allowed demuxers. By default all are allowed.
+.IP "\fBdump_separator\fR \fIstring\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "dump_separator string (input)"
+Separator used to separate the fields printed on the command line about the
+Stream parameters.
+For example, to separate the fields with newlines and indentation:
+.Sp
+.Vb 2
+\& ffprobe \-dump_separator "
+\& " \-i ~/videos/matrixbench_mpeg2.mpg
+.Ve
+.IP "\fBmax_streams\fR \fIinteger\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "max_streams integer (input)"
+Specifies the maximum number of streams. This can be used to reject files that
+would require too many resources due to a large number of streams.
+.IP "\fBskip_estimate_duration_from_pts\fR \fIbool\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "skip_estimate_duration_from_pts bool (input)"
+Skip estimation of input duration when calculated using \s-1PTS.\s0
+At present, applicable for MPEG-PS and MPEG-TS.
+.IP "\fBstrict, f_strict\fR \fIinteger\fR \fB(\fR\fIinput/output\fR\fB)\fR" 4
+.IX Item "strict, f_strict integer (input/output)"
+Specify how strictly to follow the standards. \f(CW\*(C`f_strict\*(C'\fR is deprecated and
+should be used only via the \fBffmpeg\fR tool.
+.Sp
+Possible values:
+.RS 4
+.IP "\fBvery\fR" 4
+.IX Item "very"
+strictly conform to an older more strict version of the spec or reference software
+.IP "\fBstrict\fR" 4
+.IX Item "strict"
+strictly conform to all the things in the spec no matter what consequences
+.IP "\fBnormal\fR" 4
+.IX Item "normal"
+.PD 0
+.IP "\fBunofficial\fR" 4
+.IX Item "unofficial"
+.PD
+allow unofficial extensions
+.IP "\fBexperimental\fR" 4
+.IX Item "experimental"
+allow non standardized experimental things, experimental
+(unfinished/work in progress/not well tested) decoders and encoders.
+Note: experimental decoders can pose a security risk, do not use this for
+decoding untrusted input.
+.RE
+.RS 4
+.RE
+.SS "Format stream specifiers"
+.IX Subsection "Format stream specifiers"
+Format stream specifiers allow selection of one or more streams that
+match specific properties.
+.PP
+The exact semantics of stream specifiers is defined by the
+\&\f(CW\*(C`avformat_match_stream_specifier()\*(C'\fR function declared in the
+\&\fIlibavformat/avformat.h\fR header and documented in the
+\&\fBStream specifiers section in the \fBffmpeg\fB\|(1) manual\fR.
+.SH "DEMUXERS"
+.IX Header "DEMUXERS"
+Demuxers are configured elements in FFmpeg that can read the
+multimedia streams from a particular type of file.
+.PP
+When you configure your FFmpeg build, all the supported demuxers
+are enabled by default. You can list all available ones using the
+configure option \f(CW\*(C`\-\-list\-demuxers\*(C'\fR.
+.PP
+You can disable all the demuxers using the configure option
+\&\f(CW\*(C`\-\-disable\-demuxers\*(C'\fR, and selectively enable a single demuxer with
+the option \f(CW\*(C`\-\-enable\-demuxer=\f(CIDEMUXER\f(CW\*(C'\fR, or disable it
+with the option \f(CW\*(C`\-\-disable\-demuxer=\f(CIDEMUXER\f(CW\*(C'\fR.
+.PP
+The option \f(CW\*(C`\-demuxers\*(C'\fR of the ff* tools will display the list of
+enabled demuxers. Use \f(CW\*(C`\-formats\*(C'\fR to view a combined list of
+enabled demuxers and muxers.
+.PP
+The description of some of the currently available demuxers follows.
+.SS "aa"
+.IX Subsection "aa"
+Audible Format 2, 3, and 4 demuxer.
+.PP
+This demuxer is used to demux Audible Format 2, 3, and 4 (.aa) files.
+.SS "apng"
+.IX Subsection "apng"
+Animated Portable Network Graphics demuxer.
+.PP
+This demuxer is used to demux \s-1APNG\s0 files.
+All headers, but the \s-1PNG\s0 signature, up to (but not including) the first
+fcTL chunk are transmitted as extradata.
+Frames are then split as being all the chunks between two fcTL ones, or
+between the last fcTL and \s-1IEND\s0 chunks.
+.IP "\fB\-ignore_loop\fR \fIbool\fR" 4
+.IX Item "-ignore_loop bool"
+Ignore the loop variable in the file if set.
+.IP "\fB\-max_fps\fR \fIint\fR" 4
+.IX Item "-max_fps int"
+Maximum framerate in frames per second (0 for no limit).
+.IP "\fB\-default_fps\fR \fIint\fR" 4
+.IX Item "-default_fps int"
+Default framerate in frames per second when none is specified in the file
+(0 meaning as fast as possible).
+.SS "asf"
+.IX Subsection "asf"
+Advanced Systems Format demuxer.
+.PP
+This demuxer is used to demux \s-1ASF\s0 files and \s-1MMS\s0 network streams.
+.IP "\fB\-no_resync_search\fR \fIbool\fR" 4
+.IX Item "-no_resync_search bool"
+Do not try to resynchronize by looking for a certain optional start code.
+.SS "concat"
+.IX Subsection "concat"
+Virtual concatenation script demuxer.
+.PP
+This demuxer reads a list of files and other directives from a text file and
+demuxes them one after the other, as if all their packets had been muxed
+together.
+.PP
+The timestamps in the files are adjusted so that the first file starts at 0
+and each next file starts where the previous one finishes. Note that it is
+done globally and may cause gaps if all streams do not have exactly the same
+length.
+.PP
+All files must have the same streams (same codecs, same time base, etc.).
+.PP
+The duration of each file is used to adjust the timestamps of the next file:
+if the duration is incorrect (because it was computed using the bit-rate or
+because the file is truncated, for example), it can cause artifacts. The
+\&\f(CW\*(C`duration\*(C'\fR directive can be used to override the duration stored in
+each file.
+.PP
+\fISyntax\fR
+.IX Subsection "Syntax"
+.PP
+The script is a text file in extended-ASCII, with one directive per line.
+Empty lines, leading spaces and lines starting with '#' are ignored. The
+following directive is recognized:
+.ie n .IP "\fB\f(CB""file \f(CBpath\f(CB""\fB\fR" 4
+.el .IP "\fB\f(CBfile \f(CBpath\f(CB\fB\fR" 4
+.IX Item "file path"
+Path to a file to read; special characters and spaces must be escaped with
+backslash or single quotes.
+.Sp
+All subsequent file-related directives apply to that file.
+.ie n .IP "\fB\f(CB""ffconcat version 1.0""\fB\fR" 4
+.el .IP "\fB\f(CBffconcat version 1.0\fB\fR" 4
+.IX Item "ffconcat version 1.0"
+Identify the script type and version. It also sets the \fBsafe\fR option
+to 1 if it was \-1.
+.Sp
+To make FFmpeg recognize the format automatically, this directive must
+appear exactly as is (no extra space or byte-order-mark) on the very first
+line of the script.
+.ie n .IP "\fB\f(CB""duration \f(CBdur\f(CB""\fB\fR" 4
+.el .IP "\fB\f(CBduration \f(CBdur\f(CB\fB\fR" 4
+.IX Item "duration dur"
+Duration of the file. This information can be specified from the file;
+specifying it here may be more efficient or help if the information from the
+file is not available or accurate.
+.Sp
+If the duration is set for all files, then it is possible to seek in the
+whole concatenated video.
+.ie n .IP "\fB\f(CB""inpoint \f(CBtimestamp\f(CB""\fB\fR" 4
+.el .IP "\fB\f(CBinpoint \f(CBtimestamp\f(CB\fB\fR" 4
+.IX Item "inpoint timestamp"
+In point of the file. When the demuxer opens the file it instantly seeks to the
+specified timestamp. Seeking is done so that all streams can be presented
+successfully at In point.
+.Sp
+This directive works best with intra frame codecs, because for non-intra frame
+ones you will usually get extra packets before the actual In point and the
+decoded content will most likely contain frames before In point too.
+.Sp
+For each file, packets before the file In point will have timestamps less than
+the calculated start timestamp of the file (negative in case of the first
+file), and the duration of the files (if not specified by the \f(CW\*(C`duration\*(C'\fR
+directive) will be reduced based on their specified In point.
+.Sp
+Because of potential packets before the specified In point, packet timestamps
+may overlap between two concatenated files.
+.ie n .IP "\fB\f(CB""outpoint \f(CBtimestamp\f(CB""\fB\fR" 4
+.el .IP "\fB\f(CBoutpoint \f(CBtimestamp\f(CB\fB\fR" 4
+.IX Item "outpoint timestamp"
+Out point of the file. When the demuxer reaches the specified decoding
+timestamp in any of the streams, it handles it as an end of file condition and
+skips the current and all the remaining packets from all streams.
+.Sp
+Out point is exclusive, which means that the demuxer will not output packets
+with a decoding timestamp greater or equal to Out point.
+.Sp
+This directive works best with intra frame codecs and formats where all streams
+are tightly interleaved. For non-intra frame codecs you will usually get
+additional packets with presentation timestamp after Out point therefore the
+decoded content will most likely contain frames after Out point too. If your
+streams are not tightly interleaved you may not get all the packets from all
+streams before Out point and you may only will be able to decode the earliest
+stream until Out point.
+.Sp
+The duration of the files (if not specified by the \f(CW\*(C`duration\*(C'\fR
+directive) will be reduced based on their specified Out point.
+.ie n .IP "\fB\f(CB""file_packet_metadata \f(CBkey=value\f(CB""\fB\fR" 4
+.el .IP "\fB\f(CBfile_packet_metadata \f(CBkey=value\f(CB\fB\fR" 4
+.IX Item "file_packet_metadata key=value"
+Metadata of the packets of the file. The specified metadata will be set for
+each file packet. You can specify this directive multiple times to add multiple
+metadata entries.
+.ie n .IP "\fB\f(CB""stream""\fB\fR" 4
+.el .IP "\fB\f(CBstream\fB\fR" 4
+.IX Item "stream"
+Introduce a stream in the virtual file.
+All subsequent stream-related directives apply to the last introduced
+stream.
+Some streams properties must be set in order to allow identifying the
+matching streams in the subfiles.
+If no streams are defined in the script, the streams from the first file are
+copied.
+.ie n .IP "\fB\f(CB""exact_stream_id \f(CBid\f(CB""\fB\fR" 4
+.el .IP "\fB\f(CBexact_stream_id \f(CBid\f(CB\fB\fR" 4
+.IX Item "exact_stream_id id"
+Set the id of the stream.
+If this directive is given, the string with the corresponding id in the
+subfiles will be used.
+This is especially useful for MPEG-PS (\s-1VOB\s0) files, where the order of the
+streams is not reliable.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+This demuxer accepts the following option:
+.IP "\fBsafe\fR" 4
+.IX Item "safe"
+If set to 1, reject unsafe file paths. A file path is considered safe if it
+does not contain a protocol specification and is relative and all components
+only contain characters from the portable character set (letters, digits,
+period, underscore and hyphen) and have no period at the beginning of a
+component.
+.Sp
+If set to 0, any file name is accepted.
+.Sp
+The default is 1.
+.Sp
+\&\-1 is equivalent to 1 if the format was automatically
+probed and 0 otherwise.
+.IP "\fBauto_convert\fR" 4
+.IX Item "auto_convert"
+If set to 1, try to perform automatic conversions on packet data to make the
+streams concatenable.
+The default is 1.
+.Sp
+Currently, the only conversion is adding the h264_mp4toannexb bitstream
+filter to H.264 streams in \s-1MP4\s0 format. This is necessary in particular if
+there are resolution changes.
+.IP "\fBsegment_time_metadata\fR" 4
+.IX Item "segment_time_metadata"
+If set to 1, every packet will contain the \fIlavf.concat.start_time\fR and the
+\&\fIlavf.concat.duration\fR packet metadata values which are the start_time and
+the duration of the respective file segments in the concatenated output
+expressed in microseconds. The duration metadata is only set if it is known
+based on the concat file.
+The default is 0.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Use absolute filenames and include some comments:
+.Sp
+.Vb 6
+\& # my first filename
+\& file /mnt/share/file\-1.wav
+\& # my second filename including whitespace
+\& file \*(Aq/mnt/share/file 2.wav\*(Aq
+\& # my third filename including whitespace plus single quote
+\& file \*(Aq/mnt/share/file 3\*(Aq\e\*(Aq\*(Aq.wav\*(Aq
+.Ve
+.IP "\(bu" 4
+Allow for input format auto-probing, use safe filenames and set the duration of
+the first file:
+.Sp
+.Vb 1
+\& ffconcat version 1.0
+\&
+\& file file\-1.wav
+\& duration 20.0
+\&
+\& file subdir/file\-2.wav
+.Ve
+.SS "dash"
+.IX Subsection "dash"
+Dynamic Adaptive Streaming over \s-1HTTP\s0 demuxer.
+.PP
+This demuxer presents all AVStreams found in the manifest.
+By setting the discard flags on AVStreams the caller can decide
+which streams to actually receive.
+Each stream mirrors the \f(CW\*(C`id\*(C'\fR and \f(CW\*(C`bandwidth\*(C'\fR properties from the
+\&\f(CW\*(C`\*(C'\fR as metadata keys named \*(L"id\*(R" and \*(L"variant_bitrate\*(R" respectively.
+.SS "flv, live_flv"
+.IX Subsection "flv, live_flv"
+Adobe Flash Video Format demuxer.
+.PP
+This demuxer is used to demux \s-1FLV\s0 files and \s-1RTMP\s0 network streams. In case of live network streams, if you force format, you may use live_flv option instead of flv to survive timestamp discontinuities.
+.PP
+.Vb 2
+\& ffmpeg \-f flv \-i myfile.flv ...
+\& ffmpeg \-f live_flv \-i rtmp:///anything/key ....
+.Ve
+.IP "\fB\-flv_metadata\fR \fIbool\fR" 4
+.IX Item "-flv_metadata bool"
+Allocate the streams according to the onMetaData array content.
+.IP "\fB\-flv_ignore_prevtag\fR \fIbool\fR" 4
+.IX Item "-flv_ignore_prevtag bool"
+Ignore the size of previous tag value.
+.IP "\fB\-flv_full_metadata\fR \fIbool\fR" 4
+.IX Item "-flv_full_metadata bool"
+Output all context of the onMetadata.
+.SS "gif"
+.IX Subsection "gif"
+Animated \s-1GIF\s0 demuxer.
+.PP
+It accepts the following options:
+.IP "\fBmin_delay\fR" 4
+.IX Item "min_delay"
+Set the minimum valid delay between frames in hundredths of seconds.
+Range is 0 to 6000. Default value is 2.
+.IP "\fBmax_gif_delay\fR" 4
+.IX Item "max_gif_delay"
+Set the maximum valid delay between frames in hundredth of seconds.
+Range is 0 to 65535. Default value is 65535 (nearly eleven minutes),
+the maximum value allowed by the specification.
+.IP "\fBdefault_delay\fR" 4
+.IX Item "default_delay"
+Set the default delay between frames in hundredths of seconds.
+Range is 0 to 6000. Default value is 10.
+.IP "\fBignore_loop\fR" 4
+.IX Item "ignore_loop"
+\&\s-1GIF\s0 files can contain information to loop a certain number of times (or
+infinitely). If \fBignore_loop\fR is set to 1, then the loop setting
+from the input will be ignored and looping will not occur. If set to 0,
+then looping will occur and will cycle the number of times according to
+the \s-1GIF.\s0 Default value is 1.
+.PP
+For example, with the overlay filter, place an infinitely looping \s-1GIF\s0
+over another video:
+.PP
+.Vb 1
+\& ffmpeg \-i input.mp4 \-ignore_loop 0 \-i input.gif \-filter_complex overlay=shortest=1 out.mkv
+.Ve
+.PP
+Note that in the above example the shortest option for overlay filter is
+used to end the output video at the length of the shortest input file,
+which in this case is \fIinput.mp4\fR as the \s-1GIF\s0 in this example loops
+infinitely.
+.SS "hls"
+.IX Subsection "hls"
+\&\s-1HLS\s0 demuxer
+.PP
+Apple \s-1HTTP\s0 Live Streaming demuxer.
+.PP
+This demuxer presents all AVStreams from all variant streams.
+The id field is set to the bitrate variant index number. By setting
+the discard flags on AVStreams (by pressing 'a' or 'v' in ffplay),
+the caller can decide which variant streams to actually receive.
+The total bitrate of the variant that the stream belongs to is
+available in a metadata key named \*(L"variant_bitrate\*(R".
+.PP
+It accepts the following options:
+.IP "\fBlive_start_index\fR" 4
+.IX Item "live_start_index"
+segment index to start live streams at (negative values are from the end).
+.IP "\fBallowed_extensions\fR" 4
+.IX Item "allowed_extensions"
+\&',' separated list of file extensions that hls is allowed to access.
+.IP "\fBmax_reload\fR" 4
+.IX Item "max_reload"
+Maximum number of times a insufficient list is attempted to be reloaded.
+Default value is 1000.
+.IP "\fBm3u8_hold_counters\fR" 4
+.IX Item "m3u8_hold_counters"
+The maximum number of times to load m3u8 when it refreshes without new segments.
+Default value is 1000.
+.IP "\fBhttp_persistent\fR" 4
+.IX Item "http_persistent"
+Use persistent \s-1HTTP\s0 connections. Applicable only for \s-1HTTP\s0 streams.
+Enabled by default.
+.IP "\fBhttp_multiple\fR" 4
+.IX Item "http_multiple"
+Use multiple \s-1HTTP\s0 connections for downloading \s-1HTTP\s0 segments.
+Enabled by default for \s-1HTTP/1.1\s0 servers.
+.IP "\fBhttp_seekable\fR" 4
+.IX Item "http_seekable"
+Use \s-1HTTP\s0 partial requests for downloading \s-1HTTP\s0 segments.
+0 = disable, 1 = enable, \-1 = auto, Default is auto.
+.SS "image2"
+.IX Subsection "image2"
+Image file demuxer.
+.PP
+This demuxer reads from a list of image files specified by a pattern.
+The syntax and meaning of the pattern is specified by the
+option \fIpattern_type\fR.
+.PP
+The pattern may contain a suffix which is used to automatically
+determine the format of the images contained in the files.
+.PP
+The size, the pixel format, and the format of each image must be the
+same for all the files in the sequence.
+.PP
+This demuxer accepts the following options:
+.IP "\fBframerate\fR" 4
+.IX Item "framerate"
+Set the frame rate for the video stream. It defaults to 25.
+.IP "\fBloop\fR" 4
+.IX Item "loop"
+If set to 1, loop over the input. Default value is 0.
+.IP "\fBpattern_type\fR" 4
+.IX Item "pattern_type"
+Select the pattern type used to interpret the provided filename.
+.Sp
+\&\fIpattern_type\fR accepts one of the following values.
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+Disable pattern matching, therefore the video will only contain the specified
+image. You should use this option if you do not want to create sequences from
+multiple images and your filenames may contain special pattern characters.
+.IP "\fBsequence\fR" 4
+.IX Item "sequence"
+Select a sequence pattern type, used to specify a sequence of files
+indexed by sequential numbers.
+.Sp
+A sequence pattern may contain the string \*(L"%d\*(R" or "%0\fIN\fRd\*(L", which
+specifies the position of the characters representing a sequential
+number in each filename matched by the pattern. If the form
+\&\*(R"%d0\fIN\fRd" is used, the string representing the number in each
+filename is 0\-padded and \fIN\fR is the total number of 0\-padded
+digits representing the number. The literal character '%' can be
+specified in the pattern with the string \*(L"%%\*(R".
+.Sp
+If the sequence pattern contains \*(L"%d\*(R" or "%0\fIN\fRd", the first filename of
+the file list specified by the pattern must contain a number
+inclusively contained between \fIstart_number\fR and
+\&\fIstart_number\fR+\fIstart_number_range\fR\-1, and all the following
+numbers must be sequential.
+.Sp
+For example the pattern \*(L"img\-%03d.bmp\*(R" will match a sequence of
+filenames of the form \fIimg\-001.bmp\fR, \fIimg\-002.bmp\fR, ...,
+\&\fIimg\-010.bmp\fR, etc.; the pattern \*(L"i%%m%%g\-%d.jpg\*(R" will match a
+sequence of filenames of the form \fIi%m%g\-1.jpg\fR,
+\&\fIi%m%g\-2.jpg\fR, ..., \fIi%m%g\-10.jpg\fR, etc.
+.Sp
+Note that the pattern must not necessarily contain \*(L"%d\*(R" or
+"%0\fIN\fRd", for example to convert a single image file
+\&\fIimg.jpeg\fR you can employ the command:
+.Sp
+.Vb 1
+\& ffmpeg \-i img.jpeg img.png
+.Ve
+.IP "\fBglob\fR" 4
+.IX Item "glob"
+Select a glob wildcard pattern type.
+.Sp
+The pattern is interpreted like a \f(CW\*(C`glob()\*(C'\fR pattern. This is only
+selectable if libavformat was compiled with globbing support.
+.IP "\fBglob_sequence\fR \fI(deprecated, will be removed)\fR" 4
+.IX Item "glob_sequence (deprecated, will be removed)"
+Select a mixed glob wildcard/sequence pattern.
+.Sp
+If your version of libavformat was compiled with globbing support, and
+the provided pattern contains at least one glob meta character among
+\&\f(CW\*(C`%*?[]{}\*(C'\fR that is preceded by an unescaped \*(L"%\*(R", the pattern is
+interpreted like a \f(CW\*(C`glob()\*(C'\fR pattern, otherwise it is interpreted
+like a sequence pattern.
+.Sp
+All glob special characters \f(CW\*(C`%*?[]{}\*(C'\fR must be prefixed
+with \*(L"%\*(R". To escape a literal \*(L"%\*(R" you shall use \*(L"%%\*(R".
+.Sp
+For example the pattern \f(CW\*(C`foo\-%*.jpeg\*(C'\fR will match all the
+filenames prefixed by \*(L"foo\-\*(R" and terminating with \*(L".jpeg\*(R", and
+\&\f(CW\*(C`foo\-%?%?%?.jpeg\*(C'\fR will match all the filenames prefixed with
+\&\*(L"foo\-\*(R", followed by a sequence of three characters, and terminating
+with \*(L".jpeg\*(R".
+.Sp
+This pattern type is deprecated in favor of \fIglob\fR and
+\&\fIsequence\fR.
+.RE
+.RS 4
+.Sp
+Default value is \fIglob_sequence\fR.
+.RE
+.IP "\fBpixel_format\fR" 4
+.IX Item "pixel_format"
+Set the pixel format of the images to read. If not specified the pixel
+format is guessed from the first image file in the sequence.
+.IP "\fBstart_number\fR" 4
+.IX Item "start_number"
+Set the index of the file matched by the image file pattern to start
+to read from. Default value is 0.
+.IP "\fBstart_number_range\fR" 4
+.IX Item "start_number_range"
+Set the index interval range to check when looking for the first image
+file in the sequence, starting from \fIstart_number\fR. Default value
+is 5.
+.IP "\fBts_from_file\fR" 4
+.IX Item "ts_from_file"
+If set to 1, will set frame timestamp to modification time of image file. Note
+that monotonity of timestamps is not provided: images go in the same order as
+without this option. Default value is 0.
+If set to 2, will set frame timestamp to the modification time of the image file in
+nanosecond precision.
+.IP "\fBvideo_size\fR" 4
+.IX Item "video_size"
+Set the video size of the images to read. If not specified the video
+size is guessed from the first image file in the sequence.
+.IP "\fBexport_path_metadata\fR" 4
+.IX Item "export_path_metadata"
+If set to 1, will add two extra fields to the metadata found in input, making them
+also available for other filters (see \fIdrawtext\fR filter for examples). Default
+value is 0. The extra fields are described below:
+.RS 4
+.IP "\fBlavf.image2dec.source_path\fR" 4
+.IX Item "lavf.image2dec.source_path"
+Corresponds to the full path to the input file being read.
+.IP "\fBlavf.image2dec.source_basename\fR" 4
+.IX Item "lavf.image2dec.source_basename"
+Corresponds to the name of the file being read.
+.RE
+.RS 4
+.RE
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Use \fBffmpeg\fR for creating a video from the images in the file
+sequence \fIimg\-001.jpeg\fR, \fIimg\-002.jpeg\fR, ..., assuming an
+input frame rate of 10 frames per second:
+.Sp
+.Vb 1
+\& ffmpeg \-framerate 10 \-i \*(Aqimg\-%03d.jpeg\*(Aq out.mkv
+.Ve
+.IP "\(bu" 4
+As above, but start by reading from a file with index 100 in the sequence:
+.Sp
+.Vb 1
+\& ffmpeg \-framerate 10 \-start_number 100 \-i \*(Aqimg\-%03d.jpeg\*(Aq out.mkv
+.Ve
+.IP "\(bu" 4
+Read images matching the \*(L"*.png\*(R" glob pattern , that is all the files
+terminating with the \*(L".png\*(R" suffix:
+.Sp
+.Vb 1
+\& ffmpeg \-framerate 10 \-pattern_type glob \-i "*.png" out.mkv
+.Ve
+.SS "libgme"
+.IX Subsection "libgme"
+The Game Music Emu library is a collection of video game music file emulators.
+.PP
+See <\fBhttps://bitbucket.org/mpyne/game\-music\-emu/overview\fR> for more information.
+.PP
+It accepts the following options:
+.IP "\fBtrack_index\fR" 4
+.IX Item "track_index"
+Set the index of which track to demux. The demuxer can only export one track.
+Track indexes start at 0. Default is to pick the first track. Number of tracks
+is exported as \fItracks\fR metadata entry.
+.IP "\fBsample_rate\fR" 4
+.IX Item "sample_rate"
+Set the sampling rate of the exported track. Range is 1000 to 999999. Default is 44100.
+.IP "\fBmax_size\fR \fI(bytes)\fR" 4
+.IX Item "max_size (bytes)"
+The demuxer buffers the entire file into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of files that can be read.
+Default is 50 MiB.
+.SS "libmodplug"
+.IX Subsection "libmodplug"
+ModPlug based module demuxer
+.PP
+See <\fBhttps://github.com/Konstanty/libmodplug\fR>
+.PP
+It will export one 2\-channel 16\-bit 44.1 kHz audio stream.
+Optionally, a \f(CW\*(C`pal8\*(C'\fR 16\-color video stream can be exported with or without printed metadata.
+.PP
+It accepts the following options:
+.IP "\fBnoise_reduction\fR" 4
+.IX Item "noise_reduction"
+Apply a simple low-pass filter. Can be 1 (on) or 0 (off). Default is 0.
+.IP "\fBreverb_depth\fR" 4
+.IX Item "reverb_depth"
+Set amount of reverb. Range 0\-100. Default is 0.
+.IP "\fBreverb_delay\fR" 4
+.IX Item "reverb_delay"
+Set delay in ms, clamped to 40\-250 ms. Default is 0.
+.IP "\fBbass_amount\fR" 4
+.IX Item "bass_amount"
+Apply bass expansion a.k.a. XBass or megabass. Range is 0 (quiet) to 100 (loud). Default is 0.
+.IP "\fBbass_range\fR" 4
+.IX Item "bass_range"
+Set cutoff i.e. upper-bound for bass frequencies. Range is 10\-100 Hz. Default is 0.
+.IP "\fBsurround_depth\fR" 4
+.IX Item "surround_depth"
+Apply a Dolby Pro-Logic surround effect. Range is 0 (quiet) to 100 (heavy). Default is 0.
+.IP "\fBsurround_delay\fR" 4
+.IX Item "surround_delay"
+Set surround delay in ms, clamped to 5\-40 ms. Default is 0.
+.IP "\fBmax_size\fR" 4
+.IX Item "max_size"
+The demuxer buffers the entire file into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of files that can be read. Range is 0 to 100 MiB.
+0 removes buffer size limit (not recommended). Default is 5 MiB.
+.IP "\fBvideo_stream_expr\fR" 4
+.IX Item "video_stream_expr"
+String which is evaluated using the eval \s-1API\s0 to assign colors to the generated video stream.
+Variables which can be used are \f(CW\*(C`x\*(C'\fR, \f(CW\*(C`y\*(C'\fR, \f(CW\*(C`w\*(C'\fR, \f(CW\*(C`h\*(C'\fR, \f(CW\*(C`t\*(C'\fR, \f(CW\*(C`speed\*(C'\fR,
+\&\f(CW\*(C`tempo\*(C'\fR, \f(CW\*(C`order\*(C'\fR, \f(CW\*(C`pattern\*(C'\fR and \f(CW\*(C`row\*(C'\fR.
+.IP "\fBvideo_stream\fR" 4
+.IX Item "video_stream"
+Generate video stream. Can be 1 (on) or 0 (off). Default is 0.
+.IP "\fBvideo_stream_w\fR" 4
+.IX Item "video_stream_w"
+Set video frame width in 'chars' where one char indicates 8 pixels. Range is 20\-512. Default is 30.
+.IP "\fBvideo_stream_h\fR" 4
+.IX Item "video_stream_h"
+Set video frame height in 'chars' where one char indicates 8 pixels. Range is 20\-512. Default is 30.
+.IP "\fBvideo_stream_ptxt\fR" 4
+.IX Item "video_stream_ptxt"
+Print metadata on video stream. Includes \f(CW\*(C`speed\*(C'\fR, \f(CW\*(C`tempo\*(C'\fR, \f(CW\*(C`order\*(C'\fR, \f(CW\*(C`pattern\*(C'\fR,
+\&\f(CW\*(C`row\*(C'\fR and \f(CW\*(C`ts\*(C'\fR (time in ms). Can be 1 (on) or 0 (off). Default is 1.
+.SS "libopenmpt"
+.IX Subsection "libopenmpt"
+libopenmpt based module demuxer
+.PP
+See <\fBhttps://lib.openmpt.org/libopenmpt/\fR> for more information.
+.PP
+Some files have multiple subsongs (tracks) this can be set with the \fBsubsong\fR
+option.
+.PP
+It accepts the following options:
+.IP "\fBsubsong\fR" 4
+.IX Item "subsong"
+Set the subsong index. This can be either 'all', 'auto', or the index of the
+subsong. Subsong indexes start at 0. The default is 'auto'.
+.Sp
+The default value is to let libopenmpt choose.
+.IP "\fBlayout\fR" 4
+.IX Item "layout"
+Set the channel layout. Valid values are 1, 2, and 4 channel layouts.
+The default value is \s-1STEREO.\s0
+.IP "\fBsample_rate\fR" 4
+.IX Item "sample_rate"
+Set the sample rate for libopenmpt to output.
+Range is from 1000 to \s-1INT_MAX.\s0 The value default is 48000.
+.SS "mov/mp4/3gp"
+.IX Subsection "mov/mp4/3gp"
+Demuxer for Quicktime File Format & \s-1ISO/IEC\s0 Base Media File Format (\s-1ISO/IEC 14496\-12\s0 or \s-1MPEG\-4\s0 Part 12, \s-1ISO/IEC 15444\-12\s0 or \s-1JPEG 2000\s0 Part 12).
+.PP
+Registered extensions: mov, mp4, m4a, 3gp, 3g2, mj2, psp, m4b, ism, ismv, isma, f4v
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+This demuxer accepts the following options:
+.IP "\fBenable_drefs\fR" 4
+.IX Item "enable_drefs"
+Enable loading of external tracks, disabled by default.
+Enabling this can theoretically leak information in some use cases.
+.IP "\fBuse_absolute_path\fR" 4
+.IX Item "use_absolute_path"
+Allows loading of external tracks via absolute paths, disabled by default.
+Enabling this poses a security risk. It should only be enabled if the source
+is known to be non-malicious.
+.IP "\fBseek_streams_individually\fR" 4
+.IX Item "seek_streams_individually"
+When seeking, identify the closest point in each stream individually and demux packets in
+that stream from identified point. This can lead to a different sequence of packets compared
+to demuxing linearly from the beginning. Default is true.
+.IP "\fBignore_editlist\fR" 4
+.IX Item "ignore_editlist"
+Ignore any edit list atoms. The demuxer, by default, modifies the stream index to reflect the
+timeline described by the edit list. Default is false.
+.IP "\fBadvanced_editlist\fR" 4
+.IX Item "advanced_editlist"
+Modify the stream index to reflect the timeline described by the edit list. \f(CW\*(C`ignore_editlist\*(C'\fR
+must be set to false for this option to be effective.
+If both \f(CW\*(C`ignore_editlist\*(C'\fR and this option are set to false, then only the
+start of the stream index is modified to reflect initial dwell time or starting timestamp
+described by the edit list. Default is true.
+.IP "\fBignore_chapters\fR" 4
+.IX Item "ignore_chapters"
+Don't parse chapters. This includes GoPro 'HiLight' tags/moments. Note that chapters are
+only parsed when input is seekable. Default is false.
+.IP "\fBuse_mfra_for\fR" 4
+.IX Item "use_mfra_for"
+For seekable fragmented input, set fragment's starting timestamp from media fragment random access box, if present.
+.Sp
+Following options are available:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+Auto-detect whether to set mfra timestamps as \s-1PTS\s0 or \s-1DTS\s0 \fI(default)\fR
+.IP "\fBdts\fR" 4
+.IX Item "dts"
+Set mfra timestamps as \s-1DTS\s0
+.IP "\fBpts\fR" 4
+.IX Item "pts"
+Set mfra timestamps as \s-1PTS\s0
+.IP "\fB0\fR" 4
+.IX Item "0"
+Don't use mfra box to set timestamps
+.RE
+.RS 4
+.RE
+.IP "\fBexport_all\fR" 4
+.IX Item "export_all"
+Export unrecognized boxes within the \fIudta\fR box as metadata entries. The first four
+characters of the box type are set as the key. Default is false.
+.IP "\fBexport_xmp\fR" 4
+.IX Item "export_xmp"
+Export entire contents of \fI\s-1XMP_\s0\fR box and \fIuuid\fR box as a string with key \f(CW\*(C`xmp\*(C'\fR. Note that
+if \f(CW\*(C`export_all\*(C'\fR is set and this option isn't, the contents of \fI\s-1XMP_\s0\fR box are still exported
+but with key \f(CW\*(C`XMP_\*(C'\fR. Default is false.
+.IP "\fBactivation_bytes\fR" 4
+.IX Item "activation_bytes"
+4\-byte key required to decrypt Audible \s-1AAX\s0 and \s-1AAX+\s0 files. See Audible \s-1AAX\s0 subsection below.
+.IP "\fBaudible_fixed_key\fR" 4
+.IX Item "audible_fixed_key"
+Fixed key used for handling Audible \s-1AAX/AAX+\s0 files. It has been pre-set so should not be necessary to
+specify.
+.IP "\fBdecryption_key\fR" 4
+.IX Item "decryption_key"
+16\-byte key, in hex, to decrypt files encrypted using \s-1ISO\s0 Common Encryption (\s-1CENC/AES\-128 CTR\s0; \s-1ISO/IEC 23001\-7\s0).
+.PP
+\fIAudible \s-1AAX\s0\fR
+.IX Subsection "Audible AAX"
+.PP
+Audible \s-1AAX\s0 files are encrypted M4B files, and they can be decrypted by specifying a 4 byte activation secret.
+.PP
+.Vb 1
+\& ffmpeg \-activation_bytes 1CEB00DA \-i test.aax \-vn \-c:a copy output.mp4
+.Ve
+.SS "mpegts"
+.IX Subsection "mpegts"
+\&\s-1MPEG\-2\s0 transport stream demuxer.
+.PP
+This demuxer accepts the following options:
+.IP "\fBresync_size\fR" 4
+.IX Item "resync_size"
+Set size limit for looking up a new synchronization. Default value is
+65536.
+.IP "\fBskip_unknown_pmt\fR" 4
+.IX Item "skip_unknown_pmt"
+Skip PMTs for programs not defined in the \s-1PAT.\s0 Default value is 0.
+.IP "\fBfix_teletext_pts\fR" 4
+.IX Item "fix_teletext_pts"
+Override teletext packet \s-1PTS\s0 and \s-1DTS\s0 values with the timestamps calculated
+from the \s-1PCR\s0 of the first program which the teletext stream is part of and is
+not discarded. Default value is 1, set this option to 0 if you want your
+teletext packet \s-1PTS\s0 and \s-1DTS\s0 values untouched.
+.IP "\fBts_packetsize\fR" 4
+.IX Item "ts_packetsize"
+Output option carrying the raw packet size in bytes.
+Show the detected raw packet size, cannot be set by the user.
+.IP "\fBscan_all_pmts\fR" 4
+.IX Item "scan_all_pmts"
+Scan and combine all PMTs. The value is an integer with value from \-1
+to 1 (\-1 means automatic setting, 1 means enabled, 0 means
+disabled). Default value is \-1.
+.IP "\fBmerge_pmt_versions\fR" 4
+.IX Item "merge_pmt_versions"
+Re-use existing streams when a \s-1PMT\s0's version is updated and elementary
+streams move to different PIDs. Default value is 0.
+.SS "mpjpeg"
+.IX Subsection "mpjpeg"
+\&\s-1MJPEG\s0 encapsulated in multi-part \s-1MIME\s0 demuxer.
+.PP
+This demuxer allows reading of \s-1MJPEG,\s0 where each frame is represented as a part of
+multipart/x\-mixed\-replace stream.
+.IP "\fBstrict_mime_boundary\fR" 4
+.IX Item "strict_mime_boundary"
+Default implementation applies a relaxed standard to multi-part \s-1MIME\s0 boundary detection,
+to prevent regression with numerous existing endpoints not generating a proper \s-1MIME
+MJPEG\s0 stream. Turning this option on by setting it to 1 will result in a stricter check
+of the boundary value.
+.SS "rawvideo"
+.IX Subsection "rawvideo"
+Raw video demuxer.
+.PP
+This demuxer allows one to read raw video data. Since there is no header
+specifying the assumed video parameters, the user must specify them
+in order to be able to decode the data correctly.
+.PP
+This demuxer accepts the following options:
+.IP "\fBframerate\fR" 4
+.IX Item "framerate"
+Set input video frame rate. Default value is 25.
+.IP "\fBpixel_format\fR" 4
+.IX Item "pixel_format"
+Set the input video pixel format. Default value is \f(CW\*(C`yuv420p\*(C'\fR.
+.IP "\fBvideo_size\fR" 4
+.IX Item "video_size"
+Set the input video size. This value must be specified explicitly.
+.PP
+For example to read a rawvideo file \fIinput.raw\fR with
+\&\fBffplay\fR, assuming a pixel format of \f(CW\*(C`rgb24\*(C'\fR, a video
+size of \f(CW\*(C`320x240\*(C'\fR, and a frame rate of 10 images per second, use
+the command:
+.PP
+.Vb 1
+\& ffplay \-f rawvideo \-pixel_format rgb24 \-video_size 320x240 \-framerate 10 input.raw
+.Ve
+.SS "sbg"
+.IX Subsection "sbg"
+SBaGen script demuxer.
+.PP
+This demuxer reads the script language used by SBaGen
+<\fBhttp://uazu.net/sbagen/\fR> to generate binaural beats sessions. A \s-1SBG\s0
+script looks like that:
+.PP
+.Vb 9
+\& \-SE
+\& a: 300\-2.5/3 440+4.5/0
+\& b: 300\-2.5/0 440+4.5/3
+\& off: \-
+\& NOW == a
+\& +0:07:00 == b
+\& +0:14:00 == a
+\& +0:21:00 == b
+\& +0:30:00 off
+.Ve
+.PP
+A \s-1SBG\s0 script can mix absolute and relative timestamps. If the script uses
+either only absolute timestamps (including the script start time) or only
+relative ones, then its layout is fixed, and the conversion is
+straightforward. On the other hand, if the script mixes both kind of
+timestamps, then the \fI\s-1NOW\s0\fR reference for relative timestamps will be
+taken from the current time of day at the time the script is read, and the
+script layout will be frozen according to that reference. That means that if
+the script is directly played, the actual times will match the absolute
+timestamps up to the sound controller's clock accuracy, but if the user
+somehow pauses the playback or seeks, all times will be shifted accordingly.
+.SS "tedcaptions"
+.IX Subsection "tedcaptions"
+\&\s-1JSON\s0 captions used for <\fBhttp://www.ted.com/\fR>.
+.PP
+\&\s-1TED\s0 does not provide links to the captions, but they can be guessed from the
+page. The file \fItools/bookmarklets.html\fR from the FFmpeg source tree
+contains a bookmarklet to expose them.
+.PP
+This demuxer accepts the following option:
+.IP "\fBstart_time\fR" 4
+.IX Item "start_time"
+Set the start time of the \s-1TED\s0 talk, in milliseconds. The default is 15000
+(15s). It is used to sync the captions with the downloadable videos, because
+they include a 15s intro.
+.PP
+Example: convert the captions to a format most players understand:
+.PP
+.Vb 1
+\& ffmpeg \-i http://www.ted.com/talks/subtitles/id/1/lang/en talk1\-en.srt
+.Ve
+.SS "vapoursynth"
+.IX Subsection "vapoursynth"
+Vapoursynth wrapper.
+.PP
+Due to security concerns, Vapoursynth scripts will not
+be autodetected so the input format has to be forced. For ff* \s-1CLI\s0 tools,
+add \f(CW\*(C`\-f vapoursynth\*(C'\fR before the input \f(CW\*(C`\-i yourscript.vpy\*(C'\fR.
+.PP
+This demuxer accepts the following option:
+.IP "\fBmax_script_size\fR" 4
+.IX Item "max_script_size"
+The demuxer buffers the entire script into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of scripts that can be read.
+Default is 1 MiB.
+.SH "MUXERS"
+.IX Header "MUXERS"
+Muxers are configured elements in FFmpeg which allow writing
+multimedia streams to a particular type of file.
+.PP
+When you configure your FFmpeg build, all the supported muxers
+are enabled by default. You can list all available muxers using the
+configure option \f(CW\*(C`\-\-list\-muxers\*(C'\fR.
+.PP
+You can disable all the muxers with the configure option
+\&\f(CW\*(C`\-\-disable\-muxers\*(C'\fR and selectively enable / disable single muxers
+with the options \f(CW\*(C`\-\-enable\-muxer=\f(CIMUXER\f(CW\*(C'\fR /
+\&\f(CW\*(C`\-\-disable\-muxer=\f(CIMUXER\f(CW\*(C'\fR.
+.PP
+The option \f(CW\*(C`\-muxers\*(C'\fR of the ff* tools will display the list of
+enabled muxers. Use \f(CW\*(C`\-formats\*(C'\fR to view a combined list of
+enabled demuxers and muxers.
+.PP
+A description of some of the currently available muxers follows.
+.SS "aiff"
+.IX Subsection "aiff"
+Audio Interchange File Format muxer.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+It accepts the following options:
+.IP "\fBwrite_id3v2\fR" 4
+.IX Item "write_id3v2"
+Enable ID3v2 tags writing when set to 1. Default is 0 (disabled).
+.IP "\fBid3v2_version\fR" 4
+.IX Item "id3v2_version"
+Select ID3v2 version to write. Currently only version 3 and 4 (aka.
+ID3v2.3 and ID3v2.4) are supported. The default is version 4.
+.SS "asf"
+.IX Subsection "asf"
+Advanced Systems Format muxer.
+.PP
+Note that Windows Media Audio (wma) and Windows Media Video (wmv) use this
+muxer too.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+It accepts the following options:
+.IP "\fBpacket_size\fR" 4
+.IX Item "packet_size"
+Set the muxer packet size. By tuning this setting you may reduce data
+fragmentation or muxer overhead depending on your source. Default value is
+3200, minimum is 100, maximum is 64k.
+.SS "avi"
+.IX Subsection "avi"
+Audio Video Interleaved muxer.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+It accepts the following options:
+.IP "\fBreserve_index_space\fR" 4
+.IX Item "reserve_index_space"
+Reserve the specified amount of bytes for the OpenDML master index of each
+stream within the file header. By default additional master indexes are
+embedded within the data packets if there is no space left in the first master
+index and are linked together as a chain of indexes. This index structure can
+cause problems for some use cases, e.g. third-party software strictly relying
+on the OpenDML index specification or when file seeking is slow. Reserving
+enough index space in the file header avoids these problems.
+.Sp
+The required index space depends on the output file size and should be about 16
+bytes per gigabyte. When this option is omitted or set to zero the necessary
+index space is guessed.
+.IP "\fBwrite_channel_mask\fR" 4
+.IX Item "write_channel_mask"
+Write the channel layout mask into the audio stream header.
+.Sp
+This option is enabled by default. Disabling the channel mask can be useful in
+specific scenarios, e.g. when merging multiple audio streams into one for
+compatibility with software that only supports a single audio stream in \s-1AVI\s0
+(see \fBthe \*(L"amerge\*(R" section in the ffmpeg-filters manual\fR).
+.IP "\fBflipped_raw_rgb\fR" 4
+.IX Item "flipped_raw_rgb"
+If set to true, store positive height for raw \s-1RGB\s0 bitmaps, which indicates
+bitmap is stored bottom-up. Note that this option does not flip the bitmap
+which has to be done manually beforehand, e.g. by using the vflip filter.
+Default is \fIfalse\fR and indicates bitmap is stored top down.
+.SS "chromaprint"
+.IX Subsection "chromaprint"
+Chromaprint fingerprinter.
+.PP
+This muxer feeds audio data to the Chromaprint library,
+which generates a fingerprint for the provided audio data. See <\fBhttps://acoustid.org/chromaprint\fR>
+.PP
+It takes a single signed native-endian 16\-bit raw audio stream of at most 2 channels.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBsilence_threshold\fR" 4
+.IX Item "silence_threshold"
+Threshold for detecting silence. Range is from \-1 to 32767, where \-1 disables
+silence detection. Silence detection can only be used with version 3 of the
+algorithm.
+Silence detection must be disabled for use with the AcoustID service. Default is \-1.
+.IP "\fBalgorithm\fR" 4
+.IX Item "algorithm"
+Version of algorithm to fingerprint with. Range is 0 to 4.
+Version 3 enables silence detection. Default is 1.
+.IP "\fBfp_format\fR" 4
+.IX Item "fp_format"
+Format to output the fingerprint as. Accepts the following options:
+.RS 4
+.IP "\fBraw\fR" 4
+.IX Item "raw"
+Binary raw fingerprint
+.IP "\fBcompressed\fR" 4
+.IX Item "compressed"
+Binary compressed fingerprint
+.IP "\fBbase64\fR" 4
+.IX Item "base64"
+Base64 compressed fingerprint \fI(default)\fR
+.RE
+.RS 4
+.RE
+.SS "crc"
+.IX Subsection "crc"
+\&\s-1CRC\s0 (Cyclic Redundancy Check) testing format.
+.PP
+This muxer computes and prints the Adler\-32 \s-1CRC\s0 of all the input audio
+and video frames. By default audio frames are converted to signed
+16\-bit raw audio and video frames to raw video before computing the
+\&\s-1CRC.\s0
+.PP
+The output of the muxer consists of a single line of the form:
+CRC=0x\fI\s-1CRC\s0\fR, where \fI\s-1CRC\s0\fR is a hexadecimal number 0\-padded to
+8 digits containing the \s-1CRC\s0 for all the decoded input frames.
+.PP
+See also the \fBframecrc\fR muxer.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+For example to compute the \s-1CRC\s0 of the input, and store it in the file
+\&\fIout.crc\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f crc out.crc
+.Ve
+.PP
+You can print the \s-1CRC\s0 to stdout with the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f crc \-
+.Ve
+.PP
+You can select the output format of each frame with \fBffmpeg\fR by
+specifying the audio and video codec and format. For example to
+compute the \s-1CRC\s0 of the input audio converted to \s-1PCM\s0 unsigned 8\-bit
+and the input video converted to \s-1MPEG\-2\s0 video, use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c:a pcm_u8 \-c:v mpeg2video \-f crc \-
+.Ve
+.SS "flv"
+.IX Subsection "flv"
+Adobe Flash Video Format muxer.
+.PP
+This muxer accepts the following options:
+.IP "\fBflvflags\fR \fIflags\fR" 4
+.IX Item "flvflags flags"
+Possible values:
+.RS 4
+.IP "\fBaac_seq_header_detect\fR" 4
+.IX Item "aac_seq_header_detect"
+Place \s-1AAC\s0 sequence header based on audio stream data.
+.IP "\fBno_sequence_end\fR" 4
+.IX Item "no_sequence_end"
+Disable sequence end tag.
+.IP "\fBno_metadata\fR" 4
+.IX Item "no_metadata"
+Disable metadata tag.
+.IP "\fBno_duration_filesize\fR" 4
+.IX Item "no_duration_filesize"
+Disable duration and filesize in metadata when they are equal to zero
+at the end of stream. (Be used to non-seekable living stream).
+.IP "\fBadd_keyframe_index\fR" 4
+.IX Item "add_keyframe_index"
+Used to facilitate seeking; particularly for \s-1HTTP\s0 pseudo streaming.
+.RE
+.RS 4
+.RE
+.SS "dash"
+.IX Subsection "dash"
+Dynamic Adaptive Streaming over \s-1HTTP\s0 (\s-1DASH\s0) muxer that creates segments
+and manifest files according to the MPEG-DASH standard \s-1ISO/IEC 23009\-1:2014.\s0
+.PP
+For more information see:
+.IP "\(bu" 4
+\&\s-1ISO DASH\s0 Specification: <\fBhttp://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009\-1_2014.zip\fR>
+.IP "\(bu" 4
+WebM \s-1DASH\s0 Specification: <\fBhttps://sites.google.com/a/webmproject.org/wiki/adaptive\-streaming/webm\-dash\-specification\fR>
+.PP
+It creates a \s-1MPD\s0 manifest file and segment files for each stream.
+.PP
+The segment filename might contain pre-defined identifiers used with SegmentTemplate
+as defined in section 5.3.9.4.4 of the standard. Available identifiers are \*(L"$RepresentationID$\*(R",
+\&\*(L"$Number$\*(R", \*(L"$Bandwidth$\*(R" and \*(L"$Time$\*(R".
+In addition to the standard identifiers, an ffmpeg-specific \*(L"$ext$\*(R" identifier is also supported.
+When specified ffmpeg will replace \f(CW$ext\fR$ in the file name with muxing format's extensions such as mp4, webm etc.,
+.PP
+.Vb 6
+\& ffmpeg \-re \-i \-map 0 \-map 0 \-c:a libfdk_aac \-c:v libx264 \e
+\& \-b:v:0 800k \-b:v:1 300k \-s:v:1 320x170 \-profile:v:1 baseline \e
+\& \-profile:v:0 main \-bf 1 \-keyint_min 120 \-g 120 \-sc_threshold 0 \e
+\& \-b_strategy 0 \-ar:a:1 22050 \-use_timeline 1 \-use_template 1 \e
+\& \-window_size 5 \-adaptation_sets "id=0,streams=v id=1,streams=a" \e
+\& \-f dash /path/to/out.mpd
+.Ve
+.IP "\fBmin_seg_duration\fR \fImicroseconds\fR" 4
+.IX Item "min_seg_duration microseconds"
+This is a deprecated option to set the segment length in microseconds, use \fIseg_duration\fR instead.
+.IP "\fBseg_duration\fR \fIduration\fR" 4
+.IX Item "seg_duration duration"
+Set the segment length in seconds (fractional value can be set). The value is
+treated as average segment duration when \fIuse_template\fR is enabled and
+\&\fIuse_timeline\fR is disabled and as minimum segment duration for all the other
+use cases.
+.IP "\fBfrag_duration\fR \fIduration\fR" 4
+.IX Item "frag_duration duration"
+Set the length in seconds of fragments within segments (fractional value can be set).
+.IP "\fBfrag_type\fR \fItype\fR" 4
+.IX Item "frag_type type"
+Set the type of interval for fragmentation.
+.IP "\fBwindow_size\fR \fIsize\fR" 4
+.IX Item "window_size size"
+Set the maximum number of segments kept in the manifest.
+.IP "\fBextra_window_size\fR \fIsize\fR" 4
+.IX Item "extra_window_size size"
+Set the maximum number of segments kept outside of the manifest before removing from disk.
+.IP "\fBremove_at_exit\fR \fIremove\fR" 4
+.IX Item "remove_at_exit remove"
+Enable (1) or disable (0) removal of all segments when finished.
+.IP "\fBuse_template\fR \fItemplate\fR" 4
+.IX Item "use_template template"
+Enable (1) or disable (0) use of SegmentTemplate instead of SegmentList.
+.IP "\fBuse_timeline\fR \fItimeline\fR" 4
+.IX Item "use_timeline timeline"
+Enable (1) or disable (0) use of SegmentTimeline in SegmentTemplate.
+.IP "\fBsingle_file\fR \fIsingle_file\fR" 4
+.IX Item "single_file single_file"
+Enable (1) or disable (0) storing all segments in one file, accessed using byte ranges.
+.IP "\fBsingle_file_name\fR \fIfile_name\fR" 4
+.IX Item "single_file_name file_name"
+DASH-templated name to be used for baseURL. Implies \fIsingle_file\fR set to \*(L"1\*(R". In the template, \*(L"$ext$\*(R" is replaced with the file name extension specific for the segment format.
+.IP "\fBinit_seg_name\fR \fIinit_name\fR" 4
+.IX Item "init_seg_name init_name"
+DASH-templated name to used for the initialization segment. Default is \*(L"init\-stream$RepresentationID$.$ext$\*(R". \*(L"$ext$\*(R" is replaced with the file name extension specific for the segment format.
+.IP "\fBmedia_seg_name\fR \fIsegment_name\fR" 4
+.IX Item "media_seg_name segment_name"
+DASH-templated name to used for the media segments. Default is \*(L"chunk\-stream$RepresentationID$\-$Number%05d$.$ext$\*(R". \*(L"$ext$\*(R" is replaced with the file name extension specific for the segment format.
+.IP "\fButc_timing_url\fR \fIutc_url\fR" 4
+.IX Item "utc_timing_url utc_url"
+\&\s-1URL\s0 of the page that will return the \s-1UTC\s0 timestamp in \s-1ISO\s0 format. Example: \*(L"https://time.akamai.com/?iso\*(R"
+.IP "\fBmethod\fR \fImethod\fR" 4
+.IX Item "method method"
+Use the given \s-1HTTP\s0 method to create output files. Generally set to \s-1PUT\s0 or \s-1POST.\s0
+.IP "\fBhttp_user_agent\fR \fIuser_agent\fR" 4
+.IX Item "http_user_agent user_agent"
+Override User-Agent field in \s-1HTTP\s0 header. Applicable only for \s-1HTTP\s0 output.
+.IP "\fBhttp_persistent\fR \fIhttp_persistent\fR" 4
+.IX Item "http_persistent http_persistent"
+Use persistent \s-1HTTP\s0 connections. Applicable only for \s-1HTTP\s0 output.
+.IP "\fBhls_playlist\fR \fIhls_playlist\fR" 4
+.IX Item "hls_playlist hls_playlist"
+Generate \s-1HLS\s0 playlist files as well. The master playlist is generated with the filename \fIhls_master_name\fR.
+One media playlist file is generated for each stream with filenames media_0.m3u8, media_1.m3u8, etc.
+.IP "\fBhls_master_name\fR \fIfile_name\fR" 4
+.IX Item "hls_master_name file_name"
+\&\s-1HLS\s0 master playlist name. Default is \*(L"master.m3u8\*(R".
+.IP "\fBstreaming\fR \fIstreaming\fR" 4
+.IX Item "streaming streaming"
+Enable (1) or disable (0) chunk streaming mode of output. In chunk streaming
+mode, each frame will be a moof fragment which forms a chunk.
+.IP "\fBadaptation_sets\fR \fIadaptation_sets\fR" 4
+.IX Item "adaptation_sets adaptation_sets"
+Assign streams to AdaptationSets. Syntax is \*(L"id=x,streams=a,b,c id=y,streams=d,e\*(R" with x and y being the IDs
+of the adaptation sets and a,b,c,d and e are the indices of the mapped streams.
+.Sp
+To map all video (or audio) streams to an AdaptationSet, \*(L"v\*(R" (or \*(L"a\*(R") can be used as stream identifier instead of IDs.
+.Sp
+When no assignment is defined, this defaults to an AdaptationSet for each stream.
+.Sp
+Optional syntax is \*(L"id=x,seg_duration=x,frag_duration=x,frag_type=type,descriptor=descriptor_string,streams=a,b,c id=y,seg_duration=y,frag_type=type,streams=d,e\*(R" and so on,
+descriptor is useful to the scheme defined by \s-1ISO/IEC\s0 23009\-1:2014/Amd.2:2015.
+For example, \-adaptation_sets \*(L"id=0,descriptor=,streams=v\*(R".
+Please note that descriptor string should be a self-closing xml tag.
+seg_duration, frag_duration and frag_type override the global option values for each adaptation set.
+For example, \-adaptation_sets \*(L"id=0,seg_duration=2,frag_duration=1,frag_type=duration,streams=v id=1,seg_duration=2,frag_type=none,streams=a\*(R"
+type_id marks an adaptation set as containing streams meant to be used for Trick Mode for the referenced adaptation set.
+For example, \-adaptation_sets \*(L"id=0,seg_duration=2,frag_type=none,streams=0 id=1,seg_duration=10,frag_type=none,trick_id=0,streams=1\*(R"
+.IP "\fBtimeout\fR \fItimeout\fR" 4
+.IX Item "timeout timeout"
+Set timeout for socket I/O operations. Applicable only for \s-1HTTP\s0 output.
+.IP "\fBindex_correction\fR \fIindex_correction\fR" 4
+.IX Item "index_correction index_correction"
+Enable (1) or Disable (0) segment index correction logic. Applicable only when
+\&\fIuse_template\fR is enabled and \fIuse_timeline\fR is disabled.
+.Sp
+When enabled, the logic monitors the flow of segment indexes. If a streams's
+segment index value is not at the expected real time position, then the logic
+corrects that index value.
+.Sp
+Typically this logic is needed in live streaming use cases. The network bandwidth
+fluctuations are common during long run streaming. Each fluctuation can cause
+the segment indexes fall behind the expected real time position.
+.IP "\fBformat_options\fR \fIoptions_list\fR" 4
+.IX Item "format_options options_list"
+Set container format (mp4/webm) options using a \f(CW\*(C`:\*(C'\fR separated list of
+key=value parameters. Values containing \f(CW\*(C`:\*(C'\fR special characters must be
+escaped.
+.IP "\fBglobal_sidx\fR \fIglobal_sidx\fR" 4
+.IX Item "global_sidx global_sidx"
+Write global \s-1SIDX\s0 atom. Applicable only for single file, mp4 output, non-streaming mode.
+.IP "\fBdash_segment_type\fR \fIdash_segment_type\fR" 4
+.IX Item "dash_segment_type dash_segment_type"
+Possible values:
+.RS 4
+.IP "\fBauto\fR" 4
+.IX Item "auto"
+If this flag is set, the dash segment files format will be selected based on the stream codec. This is the default mode.
+.IP "\fBmp4\fR" 4
+.IX Item "mp4"
+If this flag is set, the dash segment files will be in in \s-1ISOBMFF\s0 format.
+.IP "\fBwebm\fR" 4
+.IX Item "webm"
+If this flag is set, the dash segment files will be in in WebM format.
+.RE
+.RS 4
+.RE
+.IP "\fBignore_io_errors\fR \fIignore_io_errors\fR" 4
+.IX Item "ignore_io_errors ignore_io_errors"
+Ignore \s-1IO\s0 errors during open and write. Useful for long-duration runs with network output.
+.IP "\fBlhls\fR \fIlhls\fR" 4
+.IX Item "lhls lhls"
+Enable Low-latency \s-1HLS\s0(\s-1LHLS\s0). Adds #EXT\-X\-PREFETCH tag with current segment's \s-1URI.\s0
+Apple doesn't have an official spec for \s-1LHLS.\s0 Meanwhile hls.js player folks are
+trying to standardize a open \s-1LHLS\s0 spec. The draft spec is available in https://github.com/video\-dev/hlsjs\-rfcs/blob/lhls\-spec/proposals/0001\-lhls.md
+This option will also try to comply with the above open spec, till Apple's spec officially supports it.
+Applicable only when \fIstreaming\fR and \fIhls_playlist\fR options are enabled.
+This is an experimental feature.
+.IP "\fBldash\fR \fIldash\fR" 4
+.IX Item "ldash ldash"
+Enable Low-latency Dash by constraining the presence and values of some elements.
+.IP "\fBmaster_m3u8_publish_rate\fR \fImaster_m3u8_publish_rate\fR" 4
+.IX Item "master_m3u8_publish_rate master_m3u8_publish_rate"
+Publish master playlist repeatedly every after specified number of segment intervals.
+.IP "\fBwrite_prft\fR \fIwrite_prft\fR" 4
+.IX Item "write_prft write_prft"
+Write Producer Reference Time elements on supported streams. This also enables writing
+prft boxes in the underlying muxer. Applicable only when the \fIutc_url\fR option is enabled.
+It's set to auto by default, in which case the muxer will attempt to enable it only in modes
+that require it.
+.IP "\fBmpd_profile\fR \fImpd_profile\fR" 4
+.IX Item "mpd_profile mpd_profile"
+Set one or more manifest profiles.
+.IP "\fBhttp_opts\fR \fIhttp_opts\fR" 4
+.IX Item "http_opts http_opts"
+A :\-separated list of key=value options to pass to the underlying \s-1HTTP\s0
+protocol. Applicable only for \s-1HTTP\s0 output.
+.IP "\fBtarget_latency\fR \fItarget_latency\fR" 4
+.IX Item "target_latency target_latency"
+Set an intended target latency in seconds (fractional value can be set) for serving. Applicable only when \fIstreaming\fR and \fIwrite_prft\fR options are enabled.
+This is an informative fields clients can use to measure the latency of the service.
+.IP "\fBmin_playback_rate\fR \fImin_playback_rate\fR" 4
+.IX Item "min_playback_rate min_playback_rate"
+Set the minimum playback rate indicated as appropriate for the purposes of automatically
+adjusting playback latency and buffer occupancy during normal playback by clients.
+.IP "\fBmax_playback_rate\fR \fImax_playback_rate\fR" 4
+.IX Item "max_playback_rate max_playback_rate"
+Set the maximum playback rate indicated as appropriate for the purposes of automatically
+adjusting playback latency and buffer occupancy during normal playback by clients.
+.IP "\fBupdate_period\fR \fIupdate_period\fR" 4
+.IX Item "update_period update_period"
+.Vb 2
+\& Set the mpd update period ,for dynamic content.
+\& The unit is second.
+.Ve
+.SS "framecrc"
+.IX Subsection "framecrc"
+Per-packet \s-1CRC\s0 (Cyclic Redundancy Check) testing format.
+.PP
+This muxer computes and prints the Adler\-32 \s-1CRC\s0 for each audio
+and video packet. By default audio frames are converted to signed
+16\-bit raw audio and video frames to raw video before computing the
+\&\s-1CRC.\s0
+.PP
+The output of the muxer consists of a line for each audio and video
+packet of the form:
+.PP
+.Vb 1
+\& , , , , , 0x
+.Ve
+.PP
+\&\fI\s-1CRC\s0\fR is a hexadecimal number 0\-padded to 8 digits containing the
+\&\s-1CRC\s0 of the packet.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+For example to compute the \s-1CRC\s0 of the audio and video frames in
+\&\fI\s-1INPUT\s0\fR, converted to raw audio and video packets, and store it
+in the file \fIout.crc\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f framecrc out.crc
+.Ve
+.PP
+To print the information to stdout, use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f framecrc \-
+.Ve
+.PP
+With \fBffmpeg\fR, you can select the output format to which the
+audio and video frames are encoded before computing the \s-1CRC\s0 for each
+packet by specifying the audio and video codec. For example, to
+compute the \s-1CRC\s0 of each decoded input audio frame converted to \s-1PCM\s0
+unsigned 8\-bit and of each decoded input video frame converted to
+\&\s-1MPEG\-2\s0 video, use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c:a pcm_u8 \-c:v mpeg2video \-f framecrc \-
+.Ve
+.PP
+See also the \fBcrc\fR muxer.
+.SS "framehash"
+.IX Subsection "framehash"
+Per-packet hash testing format.
+.PP
+This muxer computes and prints a cryptographic hash for each audio
+and video packet. This can be used for packet-by-packet equality
+checks without having to individually do a binary comparison on each.
+.PP
+By default audio frames are converted to signed 16\-bit raw audio and
+video frames to raw video before computing the hash, but the output
+of explicit conversions to other codecs can also be used. It uses the
+\&\s-1SHA\-256\s0 cryptographic hash function by default, but supports several
+other algorithms.
+.PP
+The output of the muxer consists of a line for each audio and video
+packet of the form:
+.PP
+.Vb 1
+\& , , , , ,
+.Ve
+.PP
+\&\fIhash\fR is a hexadecimal number representing the computed hash
+for the packet.
+.IP "\fBhash\fR \fIalgorithm\fR" 4
+.IX Item "hash algorithm"
+Use the cryptographic hash function specified by the string \fIalgorithm\fR.
+Supported values include \f(CW\*(C`MD5\*(C'\fR, \f(CW\*(C`murmur3\*(C'\fR, \f(CW\*(C`RIPEMD128\*(C'\fR,
+\&\f(CW\*(C`RIPEMD160\*(C'\fR, \f(CW\*(C`RIPEMD256\*(C'\fR, \f(CW\*(C`RIPEMD320\*(C'\fR, \f(CW\*(C`SHA160\*(C'\fR,
+\&\f(CW\*(C`SHA224\*(C'\fR, \f(CW\*(C`SHA256\*(C'\fR (default), \f(CW\*(C`SHA512/224\*(C'\fR, \f(CW\*(C`SHA512/256\*(C'\fR,
+\&\f(CW\*(C`SHA384\*(C'\fR, \f(CW\*(C`SHA512\*(C'\fR, \f(CW\*(C`CRC32\*(C'\fR and \f(CW\*(C`adler32\*(C'\fR.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+To compute the \s-1SHA\-256\s0 hash of the audio and video frames in \fI\s-1INPUT\s0\fR,
+converted to raw audio and video packets, and store it in the file
+\&\fIout.sha256\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f framehash out.sha256
+.Ve
+.PP
+To print the information to stdout, using the \s-1MD5\s0 hash function, use
+the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f framehash \-hash md5 \-
+.Ve
+.PP
+See also the \fBhash\fR muxer.
+.SS "framemd5"
+.IX Subsection "framemd5"
+Per-packet \s-1MD5\s0 testing format.
+.PP
+This is a variant of the \fBframehash\fR muxer. Unlike that muxer,
+it defaults to using the \s-1MD5\s0 hash function.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+To compute the \s-1MD5\s0 hash of the audio and video frames in \fI\s-1INPUT\s0\fR,
+converted to raw audio and video packets, and store it in the file
+\&\fIout.md5\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f framemd5 out.md5
+.Ve
+.PP
+To print the information to stdout, use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f framemd5 \-
+.Ve
+.PP
+See also the \fBframehash\fR and \fBmd5\fR muxers.
+.SS "gif"
+.IX Subsection "gif"
+Animated \s-1GIF\s0 muxer.
+.PP
+It accepts the following options:
+.IP "\fBloop\fR" 4
+.IX Item "loop"
+Set the number of times to loop the output. Use \f(CW\*(C`\-1\*(C'\fR for no loop, \f(CW0\fR
+for looping indefinitely (default).
+.IP "\fBfinal_delay\fR" 4
+.IX Item "final_delay"
+Force the delay (expressed in centiseconds) after the last frame. Each frame
+ends with a delay until the next frame. The default is \f(CW\*(C`\-1\*(C'\fR, which is a
+special value to tell the muxer to re-use the previous delay. In case of a
+loop, you might want to customize this value to mark a pause for instance.
+.PP
+For example, to encode a gif looping 10 times, with a 5 seconds delay between
+the loops:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-loop 10 \-final_delay 500 out.gif
+.Ve
+.PP
+Note 1: if you wish to extract the frames into separate \s-1GIF\s0 files, you need to
+force the \fBimage2\fR muxer:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-c:v gif \-f image2 "out%d.gif"
+.Ve
+.PP
+Note 2: the \s-1GIF\s0 format has a very large time base: the delay between two frames
+can therefore not be smaller than one centi second.
+.SS "hash"
+.IX Subsection "hash"
+Hash testing format.
+.PP
+This muxer computes and prints a cryptographic hash of all the input
+audio and video frames. This can be used for equality checks without
+having to do a complete binary comparison.
+.PP
+By default audio frames are converted to signed 16\-bit raw audio and
+video frames to raw video before computing the hash, but the output
+of explicit conversions to other codecs can also be used. Timestamps
+are ignored. It uses the \s-1SHA\-256\s0 cryptographic hash function by default,
+but supports several other algorithms.
+.PP
+The output of the muxer consists of a single line of the form:
+\&\fIalgo\fR=\fIhash\fR, where \fIalgo\fR is a short string representing
+the hash function used, and \fIhash\fR is a hexadecimal number
+representing the computed hash.
+.IP "\fBhash\fR \fIalgorithm\fR" 4
+.IX Item "hash algorithm"
+Use the cryptographic hash function specified by the string \fIalgorithm\fR.
+Supported values include \f(CW\*(C`MD5\*(C'\fR, \f(CW\*(C`murmur3\*(C'\fR, \f(CW\*(C`RIPEMD128\*(C'\fR,
+\&\f(CW\*(C`RIPEMD160\*(C'\fR, \f(CW\*(C`RIPEMD256\*(C'\fR, \f(CW\*(C`RIPEMD320\*(C'\fR, \f(CW\*(C`SHA160\*(C'\fR,
+\&\f(CW\*(C`SHA224\*(C'\fR, \f(CW\*(C`SHA256\*(C'\fR (default), \f(CW\*(C`SHA512/224\*(C'\fR, \f(CW\*(C`SHA512/256\*(C'\fR,
+\&\f(CW\*(C`SHA384\*(C'\fR, \f(CW\*(C`SHA512\*(C'\fR, \f(CW\*(C`CRC32\*(C'\fR and \f(CW\*(C`adler32\*(C'\fR.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+To compute the \s-1SHA\-256\s0 hash of the input converted to raw audio and
+video, and store it in the file \fIout.sha256\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f hash out.sha256
+.Ve
+.PP
+To print an \s-1MD5\s0 hash to stdout use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f hash \-hash md5 \-
+.Ve
+.PP
+See also the \fBframehash\fR muxer.
+.SS "hls"
+.IX Subsection "hls"
+Apple \s-1HTTP\s0 Live Streaming muxer that segments MPEG-TS according to
+the \s-1HTTP\s0 Live Streaming (\s-1HLS\s0) specification.
+.PP
+It creates a playlist file, and one or more segment files. The output filename
+specifies the playlist filename.
+.PP
+By default, the muxer creates a file for each segment produced. These files
+have the same name as the playlist, followed by a sequential number and a
+\&.ts extension.
+.PP
+Make sure to require a closed \s-1GOP\s0 when encoding and to set the \s-1GOP\s0
+size to fit your segment time constraint.
+.PP
+For example, to convert an input file with \fBffmpeg\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i in.mkv \-c:v h264 \-flags +cgop \-g 30 \-hls_time 1 out.m3u8
+.Ve
+.PP
+This example will produce the playlist, \fIout.m3u8\fR, and segment files:
+\&\fIout0.ts\fR, \fIout1.ts\fR, \fIout2.ts\fR, etc.
+.PP
+See also the \fBsegment\fR muxer, which provides a more generic and
+flexible implementation of a segmenter, and can be used to perform \s-1HLS\s0
+segmentation.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+This muxer supports the following options:
+.IP "\fBhls_init_time\fR \fIduration\fR" 4
+.IX Item "hls_init_time duration"
+Set the initial target segment length. Default value is \fI0\fR.
+.Sp
+\&\fIduration\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+.Sp
+Segment will be cut on the next key frame after this time has passed on the first m3u8 list.
+After the initial playlist is filled \fBffmpeg\fR will cut segments
+at duration equal to \f(CW\*(C`hls_time\*(C'\fR
+.IP "\fBhls_time\fR \fIduration\fR" 4
+.IX Item "hls_time duration"
+Set the target segment length. Default value is 2.
+.Sp
+\&\fIduration\fR must be a time duration specification,
+see \fBthe Time duration section in the \fBffmpeg\-utils\fB\|(1) manual\fR.
+Segment will be cut on the next key frame after this time has passed.
+.IP "\fBhls_list_size\fR \fIsize\fR" 4
+.IX Item "hls_list_size size"
+Set the maximum number of playlist entries. If set to 0 the list file
+will contain all the segments. Default value is 5.
+.IP "\fBhls_delete_threshold\fR \fIsize\fR" 4
+.IX Item "hls_delete_threshold size"
+Set the number of unreferenced segments to keep on disk before \f(CW\*(C`hls_flags delete_segments\*(C'\fR
+deletes them. Increase this to allow continue clients to download segments which
+were recently referenced in the playlist. Default value is 1, meaning segments older than
+\&\f(CW\*(C`hls_list_size+1\*(C'\fR will be deleted.
+.IP "\fBhls_ts_options\fR \fIoptions_list\fR" 4
+.IX Item "hls_ts_options options_list"
+Set output format options using a :\-separated list of key=value
+parameters. Values containing \f(CW\*(C`:\*(C'\fR special characters must be
+escaped.
+.IP "\fBhls_wrap\fR \fIwrap\fR" 4
+.IX Item "hls_wrap wrap"
+This is a deprecated option, you can use \f(CW\*(C`hls_list_size\*(C'\fR
+and \f(CW\*(C`hls_flags delete_segments\*(C'\fR instead it
+.Sp
+This option is useful to avoid to fill the disk with many segment
+files, and limits the maximum number of segment files written to disk
+to \fIwrap\fR.
+.IP "\fBhls_start_number_source\fR" 4
+.IX Item "hls_start_number_source"
+Start the playlist sequence number (\f(CW\*(C`#EXT\-X\-MEDIA\-SEQUENCE\*(C'\fR) according to the specified source.
+Unless \f(CW\*(C`hls_flags single_file\*(C'\fR is set, it also specifies source of starting sequence numbers of
+segment and subtitle filenames. In any case, if \f(CW\*(C`hls_flags append_list\*(C'\fR
+is set and read playlist sequence number is greater than the specified start sequence number,
+then that value will be used as start value.
+.Sp
+It accepts the following values:
+.RS 4
+.IP "\fBgeneric (default)\fR" 4
+.IX Item "generic (default)"
+Set the starting sequence numbers according to \fIstart_number\fR option value.
+.IP "\fBepoch\fR" 4
+.IX Item "epoch"
+The start number will be the seconds since epoch (1970\-01\-01 00:00:00)
+.IP "\fBepoch_us\fR" 4
+.IX Item "epoch_us"
+The start number will be the microseconds since epoch (1970\-01\-01 00:00:00)
+.IP "\fBdatetime\fR" 4
+.IX Item "datetime"
+The start number will be based on the current date/time as YYYYmmddHHMMSS. e.g. 20161231235759.
+.RE
+.RS 4
+.RE
+.IP "\fBstart_number\fR \fInumber\fR" 4
+.IX Item "start_number number"
+Start the playlist sequence number (\f(CW\*(C`#EXT\-X\-MEDIA\-SEQUENCE\*(C'\fR) from the specified \fInumber\fR
+when \fIhls_start_number_source\fR value is \fIgeneric\fR. (This is the default case.)
+Unless \f(CW\*(C`hls_flags single_file\*(C'\fR is set, it also specifies starting sequence numbers of segment and subtitle filenames.
+Default value is 0.
+.IP "\fBhls_allow_cache\fR \fIallowcache\fR" 4
+.IX Item "hls_allow_cache allowcache"
+Explicitly set whether the client \s-1MAY\s0 (1) or \s-1MUST NOT\s0 (0) cache media segments.
+.IP "\fBhls_base_url\fR \fIbaseurl\fR" 4
+.IX Item "hls_base_url baseurl"
+Append \fIbaseurl\fR to every entry in the playlist.
+Useful to generate playlists with absolute paths.
+.Sp
+Note that the playlist sequence number must be unique for each segment
+and it is not to be confused with the segment filename sequence number
+which can be cyclic, for example if the \fBwrap\fR option is
+specified.
+.IP "\fBhls_segment_filename\fR \fIfilename\fR" 4
+.IX Item "hls_segment_filename filename"
+Set the segment filename. Unless \f(CW\*(C`hls_flags single_file\*(C'\fR is set,
+\&\fIfilename\fR is used as a string format with the segment number:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-hls_segment_filename \*(Aqfile%03d.ts\*(Aq out.m3u8
+.Ve
+.Sp
+This example will produce the playlist, \fIout.m3u8\fR, and segment files:
+\&\fIfile000.ts\fR, \fIfile001.ts\fR, \fIfile002.ts\fR, etc.
+.Sp
+\&\fIfilename\fR may contain full path or relative path specification,
+but only the file name part without any path info will be contained in the m3u8 segment list.
+Should a relative path be specified, the path of the created segment
+files will be relative to the current working directory.
+When strftime_mkdir is set, the whole expanded value of \fIfilename\fR will be written into the m3u8 segment list.
+.Sp
+When \f(CW\*(C`var_stream_map\*(C'\fR is set with two or more variant streams, the
+\&\fIfilename\fR pattern must contain the string \*(L"%v\*(R", this string specifies
+the position of variant stream index in the generated segment file names.
+.Sp
+.Vb 3
+\& ffmpeg \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \-b:a:1 32k \e
+\& \-map 0:v \-map 0:a \-map 0:v \-map 0:a \-f hls \-var_stream_map "v:0,a:0 v:1,a:1" \e
+\& \-hls_segment_filename \*(Aqfile_%v_%03d.ts\*(Aq out_%v.m3u8
+.Ve
+.Sp
+This example will produce the playlists segment file sets:
+\&\fIfile_0_000.ts\fR, \fIfile_0_001.ts\fR, \fIfile_0_002.ts\fR, etc. and
+\&\fIfile_1_000.ts\fR, \fIfile_1_001.ts\fR, \fIfile_1_002.ts\fR, etc.
+.Sp
+The string \*(L"%v\*(R" may be present in the filename or in the last directory name
+containing the file, but only in one of them. (Additionally, \f(CW%v\fR may appear multiple times in the last
+sub-directory or filename.) If the string \f(CW%v\fR is present in the directory name, then
+sub-directories are created after expanding the directory name pattern. This
+enables creation of segments corresponding to different variant streams in
+subdirectories.
+.Sp
+.Vb 3
+\& ffmpeg \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \-b:a:1 32k \e
+\& \-map 0:v \-map 0:a \-map 0:v \-map 0:a \-f hls \-var_stream_map "v:0,a:0 v:1,a:1" \e
+\& \-hls_segment_filename \*(Aqvs%v/file_%03d.ts\*(Aq vs%v/out.m3u8
+.Ve
+.Sp
+This example will produce the playlists segment file sets:
+\&\fIvs0/file_000.ts\fR, \fIvs0/file_001.ts\fR, \fIvs0/file_002.ts\fR, etc. and
+\&\fIvs1/file_000.ts\fR, \fIvs1/file_001.ts\fR, \fIvs1/file_002.ts\fR, etc.
+.IP "\fBuse_localtime\fR" 4
+.IX Item "use_localtime"
+Same as strftime option, will be deprecated.
+.IP "\fBstrftime\fR" 4
+.IX Item "strftime"
+Use \fBstrftime()\fR on \fIfilename\fR to expand the segment filename with localtime.
+The segment number is also available in this mode, but to use it, you need to specify second_level_segment_index
+hls_flag and %%d will be the specifier.
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-strftime 1 \-hls_segment_filename \*(Aqfile\-%Y%m%d\-%s.ts\*(Aq out.m3u8
+.Ve
+.Sp
+This example will produce the playlist, \fIout.m3u8\fR, and segment files:
+\&\fIfile\-20160215\-1455569023.ts\fR, \fIfile\-20160215\-1455569024.ts\fR, etc.
+Note: On some systems/environments, the \f(CW%s\fR specifier is not available. See
+ \f(CW\*(C`strftime()\*(C'\fR documentation.
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-strftime 1 \-hls_flags second_level_segment_index \-hls_segment_filename \*(Aqfile\-%Y%m%d\-%%04d.ts\*(Aq out.m3u8
+.Ve
+.Sp
+This example will produce the playlist, \fIout.m3u8\fR, and segment files:
+\&\fIfile\-20160215\-0001.ts\fR, \fIfile\-20160215\-0002.ts\fR, etc.
+.IP "\fBuse_localtime_mkdir\fR" 4
+.IX Item "use_localtime_mkdir"
+Same as strftime_mkdir option, will be deprecated .
+.IP "\fBstrftime_mkdir\fR" 4
+.IX Item "strftime_mkdir"
+Used together with \-strftime_mkdir, it will create all subdirectories which
+is expanded in \fIfilename\fR.
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-strftime 1 \-strftime_mkdir 1 \-hls_segment_filename \*(Aq%Y%m%d/file\-%Y%m%d\-%s.ts\*(Aq out.m3u8
+.Ve
+.Sp
+This example will create a directory 201560215 (if it does not exist), and then
+produce the playlist, \fIout.m3u8\fR, and segment files:
+\&\fI20160215/file\-20160215\-1455569023.ts\fR, \fI20160215/file\-20160215\-1455569024.ts\fR, etc.
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-strftime 1 \-strftime_mkdir 1 \-hls_segment_filename \*(Aq%Y/%m/%d/file\-%Y%m%d\-%s.ts\*(Aq out.m3u8
+.Ve
+.Sp
+This example will create a directory hierarchy 2016/02/15 (if any of them do not exist), and then
+produce the playlist, \fIout.m3u8\fR, and segment files:
+\&\fI2016/02/15/file\-20160215\-1455569023.ts\fR, \fI2016/02/15/file\-20160215\-1455569024.ts\fR, etc.
+.IP "\fBhls_key_info_file\fR \fIkey_info_file\fR" 4
+.IX Item "hls_key_info_file key_info_file"
+Use the information in \fIkey_info_file\fR for segment encryption. The first
+line of \fIkey_info_file\fR specifies the key \s-1URI\s0 written to the playlist. The
+key \s-1URL\s0 is used to access the encryption key during playback. The second line
+specifies the path to the key file used to obtain the key during the encryption
+process. The key file is read as a single packed array of 16 octets in binary
+format. The optional third line specifies the initialization vector (\s-1IV\s0) as a
+hexadecimal string to be used instead of the segment sequence number (default)
+for encryption. Changes to \fIkey_info_file\fR will result in segment
+encryption with the new key/IV and an entry in the playlist for the new key
+\&\s-1URI/IV\s0 if \f(CW\*(C`hls_flags periodic_rekey\*(C'\fR is enabled.
+.Sp
+Key info file format:
+.Sp
+.Vb 3
+\&
+\&
+\& (optional)
+.Ve
+.Sp
+Example key URIs:
+.Sp
+.Vb 3
+\& http://server/file.key
+\& /path/to/file.key
+\& file.key
+.Ve
+.Sp
+Example key file paths:
+.Sp
+.Vb 2
+\& file.key
+\& /path/to/file.key
+.Ve
+.Sp
+Example \s-1IV:\s0
+.Sp
+.Vb 1
+\& 0123456789ABCDEF0123456789ABCDEF
+.Ve
+.Sp
+Key info file example:
+.Sp
+.Vb 3
+\& http://server/file.key
+\& /path/to/file.key
+\& 0123456789ABCDEF0123456789ABCDEF
+.Ve
+.Sp
+Example shell script:
+.Sp
+.Vb 8
+\& #!/bin/sh
+\& BASE_URL=${1:\-\*(Aq.\*(Aq}
+\& openssl rand 16 > file.key
+\& echo $BASE_URL/file.key > file.keyinfo
+\& echo file.key >> file.keyinfo
+\& echo $(openssl rand \-hex 16) >> file.keyinfo
+\& ffmpeg \-f lavfi \-re \-i testsrc \-c:v h264 \-hls_flags delete_segments \e
+\& \-hls_key_info_file file.keyinfo out.m3u8
+.Ve
+.IP "\fB\-hls_enc\fR \fIenc\fR" 4
+.IX Item "-hls_enc enc"
+Enable (1) or disable (0) the \s-1AES128\s0 encryption.
+When enabled every segment generated is encrypted and the encryption key
+is saved as \fIplaylist name\fR.key.
+.IP "\fB\-hls_enc_key\fR \fIkey\fR" 4
+.IX Item "-hls_enc_key key"
+16\-octet key to encrypt the segments, by default it
+is randomly generated.
+.IP "\fB\-hls_enc_key_url\fR \fIkeyurl\fR" 4
+.IX Item "-hls_enc_key_url keyurl"
+If set, \fIkeyurl\fR is prepended instead of \fIbaseurl\fR to the key filename
+in the playlist.
+.IP "\fB\-hls_enc_iv\fR \fIiv\fR" 4
+.IX Item "-hls_enc_iv iv"
+16\-octet initialization vector for every segment instead
+of the autogenerated ones.
+.IP "\fBhls_segment_type\fR \fIflags\fR" 4
+.IX Item "hls_segment_type flags"
+Possible values:
+.RS 4
+.IP "\fBmpegts\fR" 4
+.IX Item "mpegts"
+Output segment files in \s-1MPEG\-2\s0 Transport Stream format. This is
+compatible with all \s-1HLS\s0 versions.
+.IP "\fBfmp4\fR" 4
+.IX Item "fmp4"
+Output segment files in fragmented \s-1MP4\s0 format, similar to MPEG-DASH.
+fmp4 files may be used in \s-1HLS\s0 version 7 and above.
+.RE
+.RS 4
+.RE
+.IP "\fBhls_fmp4_init_filename\fR \fIfilename\fR" 4
+.IX Item "hls_fmp4_init_filename filename"
+Set filename to the fragment files header file, default filename is \fIinit.mp4\fR.
+.Sp
+Use \f(CW\*(C`\-strftime 1\*(C'\fR on \fIfilename\fR to expand the segment filename with localtime.
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-hls_segment_type fmp4 \-strftime 1 \-hls_fmp4_init_filename "%s_init.mp4" out.m3u8
+.Ve
+.Sp
+This will produce init like this
+\&\fI1602678741_init.mp4\fR
+.IP "\fBhls_fmp4_init_resend\fR" 4
+.IX Item "hls_fmp4_init_resend"
+Resend init file after m3u8 file refresh every time, default is \fI0\fR.
+.Sp
+When \f(CW\*(C`var_stream_map\*(C'\fR is set with two or more variant streams, the
+\&\fIfilename\fR pattern must contain the string \*(L"%v\*(R", this string specifies
+the position of variant stream index in the generated init file names.
+The string \*(L"%v\*(R" may be present in the filename or in the last directory name
+containing the file. If the string is present in the directory name, then
+sub-directories are created after expanding the directory name pattern. This
+enables creation of init files corresponding to different variant streams in
+subdirectories.
+.IP "\fBhls_flags\fR \fIflags\fR" 4
+.IX Item "hls_flags flags"
+Possible values:
+.RS 4
+.IP "\fBsingle_file\fR" 4
+.IX Item "single_file"
+If this flag is set, the muxer will store all segments in a single MPEG-TS
+file, and will use byte ranges in the playlist. \s-1HLS\s0 playlists generated with
+this way will have the version number 4.
+For example:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.nut \-hls_flags single_file out.m3u8
+.Ve
+.Sp
+Will produce the playlist, \fIout.m3u8\fR, and a single segment file,
+\&\fIout.ts\fR.
+.IP "\fBdelete_segments\fR" 4
+.IX Item "delete_segments"
+Segment files removed from the playlist are deleted after a period of time
+equal to the duration of the segment plus the duration of the playlist.
+.IP "\fBappend_list\fR" 4
+.IX Item "append_list"
+Append new segments into the end of old segment list,
+and remove the \f(CW\*(C`#EXT\-X\-ENDLIST\*(C'\fR from the old segment list.
+.IP "\fBround_durations\fR" 4
+.IX Item "round_durations"
+Round the duration info in the playlist file segment info to integer
+values, instead of using floating point.
+.IP "\fBdiscont_start\fR" 4
+.IX Item "discont_start"
+Add the \f(CW\*(C`#EXT\-X\-DISCONTINUITY\*(C'\fR tag to the playlist, before the
+first segment's information.
+.IP "\fBomit_endlist\fR" 4
+.IX Item "omit_endlist"
+Do not append the \f(CW\*(C`EXT\-X\-ENDLIST\*(C'\fR tag at the end of the playlist.
+.IP "\fBperiodic_rekey\fR" 4
+.IX Item "periodic_rekey"
+The file specified by \f(CW\*(C`hls_key_info_file\*(C'\fR will be checked periodically and
+detect updates to the encryption info. Be sure to replace this file atomically,
+including the file containing the \s-1AES\s0 encryption key.
+.IP "\fBindependent_segments\fR" 4
+.IX Item "independent_segments"
+Add the \f(CW\*(C`#EXT\-X\-INDEPENDENT\-SEGMENTS\*(C'\fR to playlists that has video segments
+and when all the segments of that playlist are guaranteed to start with a Key frame.
+.IP "\fBiframes_only\fR" 4
+.IX Item "iframes_only"
+Add the \f(CW\*(C`#EXT\-X\-I\-FRAMES\-ONLY\*(C'\fR to playlists that has video segments
+and can play only I\-frames in the \f(CW\*(C`#EXT\-X\-BYTERANGE\*(C'\fR mode.
+.IP "\fBsplit_by_time\fR" 4
+.IX Item "split_by_time"
+Allow segments to start on frames other than keyframes. This improves
+behavior on some players when the time between keyframes is inconsistent,
+but may make things worse on others, and can cause some oddities during
+seeking. This flag should be used with the \f(CW\*(C`hls_time\*(C'\fR option.
+.IP "\fBprogram_date_time\fR" 4
+.IX Item "program_date_time"
+Generate \f(CW\*(C`EXT\-X\-PROGRAM\-DATE\-TIME\*(C'\fR tags.
+.IP "\fBsecond_level_segment_index\fR" 4
+.IX Item "second_level_segment_index"
+Makes it possible to use segment indexes as %%d in hls_segment_filename expression
+besides date/time values when strftime is on.
+To get fixed width numbers with trailing zeroes, %%0xd format is available where x is the required width.
+.IP "\fBsecond_level_segment_size\fR" 4
+.IX Item "second_level_segment_size"
+Makes it possible to use segment sizes (counted in bytes) as %%s in hls_segment_filename
+expression besides date/time values when strftime is on.
+To get fixed width numbers with trailing zeroes, %%0xs format is available where x is the required width.
+.IP "\fBsecond_level_segment_duration\fR" 4
+.IX Item "second_level_segment_duration"
+Makes it possible to use segment duration (calculated in microseconds) as %%t in hls_segment_filename
+expression besides date/time values when strftime is on.
+To get fixed width numbers with trailing zeroes, %%0xt format is available where x is the required width.
+.Sp
+.Vb 4
+\& ffmpeg \-i sample.mpeg \e
+\& \-f hls \-hls_time 3 \-hls_list_size 5 \e
+\& \-hls_flags second_level_segment_index+second_level_segment_size+second_level_segment_duration \e
+\& \-strftime 1 \-strftime_mkdir 1 \-hls_segment_filename "segment_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts" stream.m3u8
+.Ve
+.Sp
+This will produce segments like this:
+\&\fIsegment_20170102194334_0003_00122200_0000003000000.ts\fR, \fIsegment_20170102194334_0004_00120072_0000003000000.ts\fR etc.
+.IP "\fBtemp_file\fR" 4
+.IX Item "temp_file"
+Write segment data to filename.tmp and rename to filename only once the segment is complete. A webserver
+serving up segments can be configured to reject requests to *.tmp to prevent access to in-progress segments
+before they have been added to the m3u8 playlist. This flag also affects how m3u8 playlist files are created.
+If this flag is set, all playlist files will written into temporary file and renamed after they are complete, similarly as segments are handled.
+But playlists with \f(CW\*(C`file\*(C'\fR protocol and with type (\f(CW\*(C`hls_playlist_type\*(C'\fR) other than \f(CW\*(C`vod\*(C'\fR
+are always written into temporary file regardless of this flag. Master playlist files (\f(CW\*(C`master_pl_name\*(C'\fR), if any, with \f(CW\*(C`file\*(C'\fR protocol,
+are always written into temporary file regardless of this flag if \f(CW\*(C`master_pl_publish_rate\*(C'\fR value is other than zero.
+.RE
+.RS 4
+.RE
+.IP "\fBhls_playlist_type event\fR" 4
+.IX Item "hls_playlist_type event"
+Emit \f(CW\*(C`#EXT\-X\-PLAYLIST\-TYPE:EVENT\*(C'\fR in the m3u8 header. Forces
+\&\fBhls_list_size\fR to 0; the playlist can only be appended to.
+.IP "\fBhls_playlist_type vod\fR" 4
+.IX Item "hls_playlist_type vod"
+Emit \f(CW\*(C`#EXT\-X\-PLAYLIST\-TYPE:VOD\*(C'\fR in the m3u8 header. Forces
+\&\fBhls_list_size\fR to 0; the playlist must not change.
+.IP "\fBmethod\fR" 4
+.IX Item "method"
+Use the given \s-1HTTP\s0 method to create the hls files.
+.Sp
+.Vb 1
+\& ffmpeg \-re \-i in.ts \-f hls \-method PUT http://example.com/live/out.m3u8
+.Ve
+.Sp
+This example will upload all the mpegts segment files to the \s-1HTTP\s0
+server using the \s-1HTTP PUT\s0 method, and update the m3u8 files every
+\&\f(CW\*(C`refresh\*(C'\fR times using the same method.
+Note that the \s-1HTTP\s0 server must support the given method for uploading
+files.
+.IP "\fBhttp_user_agent\fR" 4
+.IX Item "http_user_agent"
+Override User-Agent field in \s-1HTTP\s0 header. Applicable only for \s-1HTTP\s0 output.
+.IP "\fBvar_stream_map\fR" 4
+.IX Item "var_stream_map"
+Map string which specifies how to group the audio, video and subtitle streams
+into different variant streams. The variant stream groups are separated
+by space.
+Expected string format is like this \*(L"a:0,v:0 a:1,v:1 ....\*(R". Here a:, v:, s: are
+the keys to specify audio, video and subtitle streams respectively.
+Allowed values are 0 to 9 (limited just based on practical usage).
+.Sp
+When there are two or more variant streams, the output filename pattern must
+contain the string \*(L"%v\*(R", this string specifies the position of variant stream
+index in the output media playlist filenames. The string \*(L"%v\*(R" may be present in
+the filename or in the last directory name containing the file. If the string is
+present in the directory name, then sub-directories are created after expanding
+the directory name pattern. This enables creation of variant streams in
+subdirectories.
+.Sp
+.Vb 3
+\& ffmpeg \-re \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \-b:a:1 32k \e
+\& \-map 0:v \-map 0:a \-map 0:v \-map 0:a \-f hls \-var_stream_map "v:0,a:0 v:1,a:1" \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example creates two hls variant streams. The first variant stream will
+contain video stream of bitrate 1000k and audio stream of bitrate 64k and the
+second variant stream will contain video stream of bitrate 256k and audio
+stream of bitrate 32k. Here, two media playlist with file names out_0.m3u8 and
+out_1.m3u8 will be created. If you want something meaningful text instead of indexes
+in result names, you may specify names for each or some of the variants
+as in the following example.
+.Sp
+.Vb 3
+\& ffmpeg \-re \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \-b:a:1 32k \e
+\& \-map 0:v \-map 0:a \-map 0:v \-map 0:a \-f hls \-var_stream_map "v:0,a:0,name:my_hd v:1,a:1,name:my_sd" \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example creates two hls variant streams as in the previous one.
+But here, the two media playlist with file names out_my_hd.m3u8 and
+out_my_sd.m3u8 will be created.
+.Sp
+.Vb 3
+\& ffmpeg \-re \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \e
+\& \-map 0:v \-map 0:a \-map 0:v \-f hls \-var_stream_map "v:0 a:0 v:1" \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example creates three hls variant streams. The first variant stream will
+be a video only stream with video bitrate 1000k, the second variant stream will
+be an audio only stream with bitrate 64k and the third variant stream will be a
+video only stream with bitrate 256k. Here, three media playlist with file names
+out_0.m3u8, out_1.m3u8 and out_2.m3u8 will be created.
+.Sp
+.Vb 3
+\& ffmpeg \-re \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \-b:a:1 32k \e
+\& \-map 0:v \-map 0:a \-map 0:v \-map 0:a \-f hls \-var_stream_map "v:0,a:0 v:1,a:1" \e
+\& http://example.com/live/vs_%v/out.m3u8
+.Ve
+.Sp
+This example creates the variant streams in subdirectories. Here, the first
+media playlist is created at \fIhttp://example.com/live/vs_0/out.m3u8\fR and
+the second one at \fIhttp://example.com/live/vs_1/out.m3u8\fR.
+.Sp
+.Vb 5
+\& ffmpeg \-re \-i in.ts \-b:a:0 32k \-b:a:1 64k \-b:v:0 1000k \-b:v:1 3000k \e
+\& \-map 0:a \-map 0:a \-map 0:v \-map 0:v \-f hls \e
+\& \-var_stream_map "a:0,agroup:aud_low a:1,agroup:aud_high v:0,agroup:aud_low v:1,agroup:aud_high" \e
+\& \-master_pl_name master.m3u8 \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example creates two audio only and two video only variant streams. In
+addition to the #EXT\-X\-STREAM\-INF tag for each variant stream in the master
+playlist, #EXT\-X\-MEDIA tag is also added for the two audio only variant streams
+and they are mapped to the two video only variant streams with audio group names
+\&'aud_low' and 'aud_high'.
+.Sp
+By default, a single hls variant containing all the encoded streams is created.
+.Sp
+.Vb 5
+\& ffmpeg \-re \-i in.ts \-b:a:0 32k \-b:a:1 64k \-b:v:0 1000k \e
+\& \-map 0:a \-map 0:a \-map 0:v \-f hls \e
+\& \-var_stream_map "a:0,agroup:aud_low,default:yes a:1,agroup:aud_low v:0,agroup:aud_low" \e
+\& \-master_pl_name master.m3u8 \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example creates two audio only and one video only variant streams. In
+addition to the #EXT\-X\-STREAM\-INF tag for each variant stream in the master
+playlist, #EXT\-X\-MEDIA tag is also added for the two audio only variant streams
+and they are mapped to the one video only variant streams with audio group name
+\&'aud_low', and the audio group have default stat is \s-1NO\s0 or \s-1YES.\s0
+.Sp
+By default, a single hls variant containing all the encoded streams is created.
+.Sp
+.Vb 5
+\& ffmpeg \-re \-i in.ts \-b:a:0 32k \-b:a:1 64k \-b:v:0 1000k \e
+\& \-map 0:a \-map 0:a \-map 0:v \-f hls \e
+\& \-var_stream_map "a:0,agroup:aud_low,default:yes,language:ENG a:1,agroup:aud_low,language:CHN v:0,agroup:aud_low" \e
+\& \-master_pl_name master.m3u8 \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example creates two audio only and one video only variant streams. In
+addition to the #EXT\-X\-STREAM\-INF tag for each variant stream in the master
+playlist, #EXT\-X\-MEDIA tag is also added for the two audio only variant streams
+and they are mapped to the one video only variant streams with audio group name
+\&'aud_low', and the audio group have default stat is \s-1NO\s0 or \s-1YES,\s0 and one audio
+have and language is named \s-1ENG,\s0 the other audio language is named \s-1CHN.\s0
+.Sp
+By default, a single hls variant containing all the encoded streams is created.
+.Sp
+.Vb 8
+\& ffmpeg \-y \-i input_with_subtitle.mkv \e
+\& \-b:v:0 5250k \-c:v h264 \-pix_fmt yuv420p \-profile:v main \-level 4.1 \e
+\& \-b:a:0 256k \e
+\& \-c:s webvtt \-c:a mp2 \-ar 48000 \-ac 2 \-map 0:v \-map 0:a:0 \-map 0:s:0 \e
+\& \-f hls \-var_stream_map "v:0,a:0,s:0,sgroup:subtitle" \e
+\& \-master_pl_name master.m3u8 \-t 300 \-hls_time 10 \-hls_init_time 4 \-hls_list_size \e
+\& 10 \-master_pl_publish_rate 10 \-hls_flags \e
+\& delete_segments+discont_start+split_by_time ./tmp/video.m3u8
+.Ve
+.Sp
+This example adds \f(CW\*(C`#EXT\-X\-MEDIA\*(C'\fR tag with \f(CW\*(C`TYPE=SUBTITLES\*(C'\fR in
+the master playlist with webvtt subtitle group name 'subtitle'. Please make sure
+the input file has one text subtitle stream at least.
+.IP "\fBcc_stream_map\fR" 4
+.IX Item "cc_stream_map"
+Map string which specifies different closed captions groups and their
+attributes. The closed captions stream groups are separated by space.
+Expected string format is like this
+\&\*(L"ccgroup:,instreamid:<\s-1INSTREAM\-ID\s0>,language: ....\*(R".
+\&'ccgroup' and 'instreamid' are mandatory attributes. 'language' is an optional
+attribute.
+The closed captions groups configured using this option are mapped to different
+variant streams by providing the same 'ccgroup' name in the
+\&\f(CW\*(C`var_stream_map\*(C'\fR string. If \f(CW\*(C`var_stream_map\*(C'\fR is not set, then the
+first available ccgroup in \f(CW\*(C`cc_stream_map\*(C'\fR is mapped to the output variant
+stream. The examples for these two use cases are given below.
+.Sp
+.Vb 4
+\& ffmpeg \-re \-i in.ts \-b:v 1000k \-b:a 64k \-a53cc 1 \-f hls \e
+\& \-cc_stream_map "ccgroup:cc,instreamid:CC1,language:en" \e
+\& \-master_pl_name master.m3u8 \e
+\& http://example.com/live/out.m3u8
+.Ve
+.Sp
+This example adds \f(CW\*(C`#EXT\-X\-MEDIA\*(C'\fR tag with \f(CW\*(C`TYPE=CLOSED\-CAPTIONS\*(C'\fR in
+the master playlist with group name 'cc', language 'en' (english) and
+INSTREAM-ID '\s-1CC1\s0'. Also, it adds \f(CW\*(C`CLOSED\-CAPTIONS\*(C'\fR attribute with group
+name 'cc' for the output variant stream.
+.Sp
+.Vb 7
+\& ffmpeg \-re \-i in.ts \-b:v:0 1000k \-b:v:1 256k \-b:a:0 64k \-b:a:1 32k \e
+\& \-a53cc:0 1 \-a53cc:1 1\e
+\& \-map 0:v \-map 0:a \-map 0:v \-map 0:a \-f hls \e
+\& \-cc_stream_map "ccgroup:cc,instreamid:CC1,language:en ccgroup:cc,instreamid:CC2,language:sp" \e
+\& \-var_stream_map "v:0,a:0,ccgroup:cc v:1,a:1,ccgroup:cc" \e
+\& \-master_pl_name master.m3u8 \e
+\& http://example.com/live/out_%v.m3u8
+.Ve
+.Sp
+This example adds two \f(CW\*(C`#EXT\-X\-MEDIA\*(C'\fR tags with \f(CW\*(C`TYPE=CLOSED\-CAPTIONS\*(C'\fR in
+the master playlist for the INSTREAM-IDs '\s-1CC1\s0' and '\s-1CC2\s0'. Also, it adds
+\&\f(CW\*(C`CLOSED\-CAPTIONS\*(C'\fR attribute with group name 'cc' for the two output variant
+streams.
+.IP "\fBmaster_pl_name\fR" 4
+.IX Item "master_pl_name"
+Create \s-1HLS\s0 master playlist with the given name.
+.Sp
+.Vb 1
+\& ffmpeg \-re \-i in.ts \-f hls \-master_pl_name master.m3u8 http://example.com/live/out.m3u8
+.Ve
+.Sp
+This example creates \s-1HLS\s0 master playlist with name master.m3u8 and it is
+published at http://example.com/live/
+.IP "\fBmaster_pl_publish_rate\fR" 4
+.IX Item "master_pl_publish_rate"
+Publish master play list repeatedly every after specified number of segment intervals.
+.Sp
+.Vb 2
+\& ffmpeg \-re \-i in.ts \-f hls \-master_pl_name master.m3u8 \e
+\& \-hls_time 2 \-master_pl_publish_rate 30 http://example.com/live/out.m3u8
+.Ve
+.Sp
+This example creates \s-1HLS\s0 master playlist with name master.m3u8 and keep
+publishing it repeatedly every after 30 segments i.e. every after 60s.
+.IP "\fBhttp_persistent\fR" 4
+.IX Item "http_persistent"
+Use persistent \s-1HTTP\s0 connections. Applicable only for \s-1HTTP\s0 output.
+.IP "\fBtimeout\fR" 4
+.IX Item "timeout"
+Set timeout for socket I/O operations. Applicable only for \s-1HTTP\s0 output.
+.IP "\fB\-ignore_io_errors\fR" 4
+.IX Item "-ignore_io_errors"
+Ignore \s-1IO\s0 errors during open, write and delete. Useful for long-duration runs with network output.
+.IP "\fBheaders\fR" 4
+.IX Item "headers"
+Set custom \s-1HTTP\s0 headers, can override built in default headers. Applicable only for \s-1HTTP\s0 output.
+.SS "ico"
+.IX Subsection "ico"
+\&\s-1ICO\s0 file muxer.
+.PP
+Microsoft's icon file format (\s-1ICO\s0) has some strict limitations that should be noted:
+.IP "\(bu" 4
+Size cannot exceed 256 pixels in any dimension
+.IP "\(bu" 4
+Only \s-1BMP\s0 and \s-1PNG\s0 images can be stored
+.IP "\(bu" 4
+If a \s-1BMP\s0 image is used, it must be one of the following pixel formats:
+.Sp
+.Vb 7
+\& BMP Bit Depth FFmpeg Pixel Format
+\& 1bit pal8
+\& 4bit pal8
+\& 8bit pal8
+\& 16bit rgb555le
+\& 24bit bgr24
+\& 32bit bgra
+.Ve
+.IP "\(bu" 4
+If a \s-1BMP\s0 image is used, it must use the \s-1BITMAPINFOHEADER DIB\s0 header
+.IP "\(bu" 4
+If a \s-1PNG\s0 image is used, it must use the rgba pixel format
+.SS "image2"
+.IX Subsection "image2"
+Image file muxer.
+.PP
+The image file muxer writes video frames to image files.
+.PP
+The output filenames are specified by a pattern, which can be used to
+produce sequentially numbered series of files.
+The pattern may contain the string \*(L"%d\*(R" or "%0\fIN\fRd\*(L", this string
+specifies the position of the characters representing a numbering in
+the filenames. If the form \*(R"%0\fIN\fRd" is used, the string
+representing the number in each filename is 0\-padded to \fIN\fR
+digits. The literal character '%' can be specified in the pattern with
+the string \*(L"%%\*(R".
+.PP
+If the pattern contains \*(L"%d\*(R" or "%0\fIN\fRd", the first filename of
+the file list specified will contain the number 1, all the following
+numbers will be sequential.
+.PP
+The pattern may contain a suffix which is used to automatically
+determine the format of the image files to write.
+.PP
+For example the pattern \*(L"img\-%03d.bmp\*(R" will specify a sequence of
+filenames of the form \fIimg\-001.bmp\fR, \fIimg\-002.bmp\fR, ...,
+\&\fIimg\-010.bmp\fR, etc.
+The pattern \*(L"img%%\-%d.jpg\*(R" will specify a sequence of filenames of the
+form \fIimg%\-1.jpg\fR, \fIimg%\-2.jpg\fR, ..., \fIimg%\-10.jpg\fR,
+etc.
+.PP
+The image muxer supports the .Y.U.V image file format. This format is
+special in that that each image frame consists of three files, for
+each of the \s-1YUV420P\s0 components. To read or write this image file format,
+specify the name of the '.Y' file. The muxer will automatically open the
+\&'.U' and '.V' files as required.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBframe_pts\fR" 4
+.IX Item "frame_pts"
+If set to 1, expand the filename with pts from pkt\->pts.
+Default value is 0.
+.IP "\fBstart_number\fR" 4
+.IX Item "start_number"
+Start the sequence from the specified number. Default value is 1.
+.IP "\fBupdate\fR" 4
+.IX Item "update"
+If set to 1, the filename will always be interpreted as just a
+filename, not a pattern, and the corresponding file will be continuously
+overwritten with new images. Default value is 0.
+.IP "\fBstrftime\fR" 4
+.IX Item "strftime"
+If set to 1, expand the filename with date and time information from
+\&\f(CW\*(C`strftime()\*(C'\fR. Default value is 0.
+.IP "\fBprotocol_opts\fR \fIoptions_list\fR" 4
+.IX Item "protocol_opts options_list"
+Set protocol options as a :\-separated list of key=value parameters. Values
+containing the \f(CW\*(C`:\*(C'\fR special character must be escaped.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+The following example shows how to use \fBffmpeg\fR for creating a
+sequence of files \fIimg\-001.jpeg\fR, \fIimg\-002.jpeg\fR, ...,
+taking one image every second from the input video:
+.PP
+.Vb 1
+\& ffmpeg \-i in.avi \-vsync cfr \-r 1 \-f image2 \*(Aqimg\-%03d.jpeg\*(Aq
+.Ve
+.PP
+Note that with \fBffmpeg\fR, if the format is not specified with the
+\&\f(CW\*(C`\-f\*(C'\fR option and the output filename specifies an image file
+format, the image2 muxer is automatically selected, so the previous
+command can be written as:
+.PP
+.Vb 1
+\& ffmpeg \-i in.avi \-vsync cfr \-r 1 \*(Aqimg\-%03d.jpeg\*(Aq
+.Ve
+.PP
+Note also that the pattern must not necessarily contain \*(L"%d\*(R" or
+"%0\fIN\fRd", for example to create a single image file
+\&\fIimg.jpeg\fR from the start of the input video you can employ the command:
+.PP
+.Vb 1
+\& ffmpeg \-i in.avi \-f image2 \-frames:v 1 img.jpeg
+.Ve
+.PP
+The \fBstrftime\fR option allows you to expand the filename with
+date and time information. Check the documentation of
+the \f(CW\*(C`strftime()\*(C'\fR function for the syntax.
+.PP
+For example to generate image files from the \f(CW\*(C`strftime()\*(C'\fR
+\&\*(L"%Y\-%m\-%d_%H\-%M\-%S\*(R" pattern, the following \fBffmpeg\fR command
+can be used:
+.PP
+.Vb 1
+\& ffmpeg \-f v4l2 \-r 1 \-i /dev/video0 \-f image2 \-strftime 1 "%Y\-%m\-%d_%H\-%M\-%S.jpg"
+.Ve
+.PP
+You can set the file name with current frame's \s-1PTS:\s0
+.PP
+.Vb 1
+\& ffmpeg \-f v4l2 \-r 1 \-i /dev/video0 \-copyts \-f image2 \-frame_pts true %d.jpg"
+.Ve
+.PP
+A more complex example is to publish contents of your desktop directly to a
+WebDAV server every second:
+.PP
+.Vb 1
+\& ffmpeg \-f x11grab \-framerate 1 \-i :0.0 \-q:v 6 \-update 1 \-protocol_opts method=PUT http://example.com/desktop.jpg
+.Ve
+.SS "matroska"
+.IX Subsection "matroska"
+Matroska container muxer.
+.PP
+This muxer implements the matroska and webm container specs.
+.PP
+\fIMetadata\fR
+.IX Subsection "Metadata"
+.PP
+The recognized metadata settings in this muxer are:
+.IP "\fBtitle\fR" 4
+.IX Item "title"
+Set title name provided to a single track. This gets mapped to
+the FileDescription element for a stream written as attachment.
+.IP "\fBlanguage\fR" 4
+.IX Item "language"
+Specify the language of the track in the Matroska languages form.
+.Sp
+The language can be either the 3 letters bibliographic \s-1ISO\-639\-2\s0 (\s-1ISO
+639\-2/B\s0) form (like \*(L"fre\*(R" for French), or a language code mixed with a
+country code for specialities in languages (like \*(L"fre-ca\*(R" for Canadian
+French).
+.IP "\fBstereo_mode\fR" 4
+.IX Item "stereo_mode"
+Set stereo 3D video layout of two views in a single video track.
+.Sp
+The following values are recognized:
+.RS 4
+.IP "\fBmono\fR" 4
+.IX Item "mono"
+video is not stereo
+.IP "\fBleft_right\fR" 4
+.IX Item "left_right"
+Both views are arranged side by side, Left-eye view is on the left
+.IP "\fBbottom_top\fR" 4
+.IX Item "bottom_top"
+Both views are arranged in top-bottom orientation, Left-eye view is at bottom
+.IP "\fBtop_bottom\fR" 4
+.IX Item "top_bottom"
+Both views are arranged in top-bottom orientation, Left-eye view is on top
+.IP "\fBcheckerboard_rl\fR" 4
+.IX Item "checkerboard_rl"
+Each view is arranged in a checkerboard interleaved pattern, Left-eye view being first
+.IP "\fBcheckerboard_lr\fR" 4
+.IX Item "checkerboard_lr"
+Each view is arranged in a checkerboard interleaved pattern, Right-eye view being first
+.IP "\fBrow_interleaved_rl\fR" 4
+.IX Item "row_interleaved_rl"
+Each view is constituted by a row based interleaving, Right-eye view is first row
+.IP "\fBrow_interleaved_lr\fR" 4
+.IX Item "row_interleaved_lr"
+Each view is constituted by a row based interleaving, Left-eye view is first row
+.IP "\fBcol_interleaved_rl\fR" 4
+.IX Item "col_interleaved_rl"
+Both views are arranged in a column based interleaving manner, Right-eye view is first column
+.IP "\fBcol_interleaved_lr\fR" 4
+.IX Item "col_interleaved_lr"
+Both views are arranged in a column based interleaving manner, Left-eye view is first column
+.IP "\fBanaglyph_cyan_red\fR" 4
+.IX Item "anaglyph_cyan_red"
+All frames are in anaglyph format viewable through red-cyan filters
+.IP "\fBright_left\fR" 4
+.IX Item "right_left"
+Both views are arranged side by side, Right-eye view is on the left
+.IP "\fBanaglyph_green_magenta\fR" 4
+.IX Item "anaglyph_green_magenta"
+All frames are in anaglyph format viewable through green-magenta filters
+.IP "\fBblock_lr\fR" 4
+.IX Item "block_lr"
+Both eyes laced in one Block, Left-eye view is first
+.IP "\fBblock_rl\fR" 4
+.IX Item "block_rl"
+Both eyes laced in one Block, Right-eye view is first
+.RE
+.RS 4
+.RE
+.PP
+For example a 3D WebM clip can be created using the following command line:
+.PP
+.Vb 1
+\& ffmpeg \-i sample_left_right_clip.mpg \-an \-c:v libvpx \-metadata stereo_mode=left_right \-y stereo_clip.webm
+.Ve
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+This muxer supports the following options:
+.IP "\fBreserve_index_space\fR" 4
+.IX Item "reserve_index_space"
+By default, this muxer writes the index for seeking (called cues in Matroska
+terms) at the end of the file, because it cannot know in advance how much space
+to leave for the index at the beginning of the file. However for some use cases
+\&\*(-- e.g. streaming where seeking is possible but slow \*(-- it is useful to put the
+index at the beginning of the file.
+.Sp
+If this option is set to a non-zero value, the muxer will reserve a given amount
+of space in the file header and then try to write the cues there when the muxing
+finishes. If the reserved space does not suffice, no Cues will be written, the
+file will be finalized and writing the trailer will return an error.
+A safe size for most use cases should be about 50kB per hour of video.
+.Sp
+Note that cues are only written if the output is seekable and this option will
+have no effect if it is not.
+.IP "\fBdefault_mode\fR" 4
+.IX Item "default_mode"
+This option controls how the FlagDefault of the output tracks will be set.
+It influences which tracks players should play by default. The default mode
+is \fBinfer\fR.
+.RS 4
+.IP "\fBinfer\fR" 4
+.IX Item "infer"
+In this mode, for each type of track (audio, video or subtitle), if there is
+a track with disposition default of this type, then the first such track
+(i.e. the one with the lowest index) will be marked as default; if no such
+track exists, the first track of this type will be marked as default instead
+(if existing). This ensures that the default flag is set in a sensible way even
+if the input originated from containers that lack the concept of default tracks.
+.IP "\fBinfer_no_subs\fR" 4
+.IX Item "infer_no_subs"
+This mode is the same as infer except that if no subtitle track with
+disposition default exists, no subtitle track will be marked as default.
+.IP "\fBpassthrough\fR" 4
+.IX Item "passthrough"
+In this mode the FlagDefault is set if and only if the \s-1AV_DISPOSITION_DEFAULT\s0
+flag is set in the disposition of the corresponding stream.
+.RE
+.RS 4
+.RE
+.IP "\fBflipped_raw_rgb\fR" 4
+.IX Item "flipped_raw_rgb"
+If set to true, store positive height for raw \s-1RGB\s0 bitmaps, which indicates
+bitmap is stored bottom-up. Note that this option does not flip the bitmap
+which has to be done manually beforehand, e.g. by using the vflip filter.
+Default is \fIfalse\fR and indicates bitmap is stored top down.
+.SS "md5"
+.IX Subsection "md5"
+\&\s-1MD5\s0 testing format.
+.PP
+This is a variant of the \fBhash\fR muxer. Unlike that muxer, it
+defaults to using the \s-1MD5\s0 hash function.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+To compute the \s-1MD5\s0 hash of the input converted to raw
+audio and video, and store it in the file \fIout.md5\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f md5 out.md5
+.Ve
+.PP
+You can print the \s-1MD5\s0 to stdout with the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f md5 \-
+.Ve
+.PP
+See also the \fBhash\fR and \fBframemd5\fR muxers.
+.SS "mov, mp4, ismv"
+.IX Subsection "mov, mp4, ismv"
+\&\s-1MOV/MP4/ISMV\s0 (Smooth Streaming) muxer.
+.PP
+The mov/mp4/ismv muxer supports fragmentation. Normally, a \s-1MOV/MP4\s0
+file has all the metadata about all packets stored in one location
+(written at the end of the file, it can be moved to the start for
+better playback by adding \fIfaststart\fR to the \fImovflags\fR, or
+using the \fBqt-faststart\fR tool). A fragmented
+file consists of a number of fragments, where packets and metadata
+about these packets are stored together. Writing a fragmented
+file has the advantage that the file is decodable even if the
+writing is interrupted (while a normal \s-1MOV/MP4\s0 is undecodable if
+it is not properly finished), and it requires less memory when writing
+very long files (since writing normal \s-1MOV/MP4\s0 files stores info about
+every single packet in memory until the file is closed). The downside
+is that it is less compatible with other applications.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+Fragmentation is enabled by setting one of the AVOptions that define
+how to cut the file into fragments:
+.IP "\fB\-moov_size\fR \fIbytes\fR" 4
+.IX Item "-moov_size bytes"
+Reserves space for the moov atom at the beginning of the file instead of placing the
+moov atom at the end. If the space reserved is insufficient, muxing will fail.
+.IP "\fB\-movflags frag_keyframe\fR" 4
+.IX Item "-movflags frag_keyframe"
+Start a new fragment at each video keyframe.
+.IP "\fB\-frag_duration\fR \fIduration\fR" 4
+.IX Item "-frag_duration duration"
+Create fragments that are \fIduration\fR microseconds long.
+.IP "\fB\-frag_size\fR \fIsize\fR" 4
+.IX Item "-frag_size size"
+Create fragments that contain up to \fIsize\fR bytes of payload data.
+.IP "\fB\-movflags frag_custom\fR" 4
+.IX Item "-movflags frag_custom"
+Allow the caller to manually choose when to cut fragments, by
+calling \f(CW\*(C`av_write_frame(ctx, NULL)\*(C'\fR to write a fragment with
+the packets written so far. (This is only useful with other
+applications integrating libavformat, not from \fBffmpeg\fR.)
+.IP "\fB\-min_frag_duration\fR \fIduration\fR" 4
+.IX Item "-min_frag_duration duration"
+Don't create fragments that are shorter than \fIduration\fR microseconds long.
+.PP
+If more than one condition is specified, fragments are cut when
+one of the specified conditions is fulfilled. The exception to this is
+\&\f(CW\*(C`\-min_frag_duration\*(C'\fR, which has to be fulfilled for any of the other
+conditions to apply.
+.PP
+Additionally, the way the output file is written can be adjusted
+through a few other options:
+.IP "\fB\-movflags empty_moov\fR" 4
+.IX Item "-movflags empty_moov"
+Write an initial moov atom directly at the start of the file, without
+describing any samples in it. Generally, an mdat/moov pair is written
+at the start of the file, as a normal \s-1MOV/MP4\s0 file, containing only
+a short portion of the file. With this option set, there is no initial
+mdat atom, and the moov atom only describes the tracks but has
+a zero duration.
+.Sp
+This option is implicitly set when writing ismv (Smooth Streaming) files.
+.IP "\fB\-movflags separate_moof\fR" 4
+.IX Item "-movflags separate_moof"
+Write a separate moof (movie fragment) atom for each track. Normally,
+packets for all tracks are written in a moof atom (which is slightly
+more efficient), but with this option set, the muxer writes one moof/mdat
+pair for each track, making it easier to separate tracks.
+.Sp
+This option is implicitly set when writing ismv (Smooth Streaming) files.
+.IP "\fB\-movflags skip_sidx\fR" 4
+.IX Item "-movflags skip_sidx"
+Skip writing of sidx atom. When bitrate overhead due to sidx atom is high,
+this option could be used for cases where sidx atom is not mandatory.
+When global_sidx flag is enabled, this option will be ignored.
+.IP "\fB\-movflags faststart\fR" 4
+.IX Item "-movflags faststart"
+Run a second pass moving the index (moov atom) to the beginning of the file.
+This operation can take a while, and will not work in various situations such
+as fragmented output, thus it is not enabled by default.
+.IP "\fB\-movflags rtphint\fR" 4
+.IX Item "-movflags rtphint"
+Add \s-1RTP\s0 hinting tracks to the output file.
+.IP "\fB\-movflags disable_chpl\fR" 4
+.IX Item "-movflags disable_chpl"
+Disable Nero chapter markers (chpl atom). Normally, both Nero chapters
+and a QuickTime chapter track are written to the file. With this option
+set, only the QuickTime chapter track will be written. Nero chapters can
+cause failures when the file is reprocessed with certain tagging programs, like
+mp3Tag 2.61a and iTunes 11.3, most likely other versions are affected as well.
+.IP "\fB\-movflags omit_tfhd_offset\fR" 4
+.IX Item "-movflags omit_tfhd_offset"
+Do not write any absolute base_data_offset in tfhd atoms. This avoids
+tying fragments to absolute byte positions in the file/streams.
+.IP "\fB\-movflags default_base_moof\fR" 4
+.IX Item "-movflags default_base_moof"
+Similarly to the omit_tfhd_offset, this flag avoids writing the
+absolute base_data_offset field in tfhd atoms, but does so by using
+the new default-base-is-moof flag instead. This flag is new from
+14496\-12:2012. This may make the fragments easier to parse in certain
+circumstances (avoiding basing track fragment location calculations
+on the implicit end of the previous track fragment).
+.IP "\fB\-write_tmcd\fR" 4
+.IX Item "-write_tmcd"
+Specify \f(CW\*(C`on\*(C'\fR to force writing a timecode track, \f(CW\*(C`off\*(C'\fR to disable it
+and \f(CW\*(C`auto\*(C'\fR to write a timecode track only for mov and mp4 output (default).
+.IP "\fB\-movflags negative_cts_offsets\fR" 4
+.IX Item "-movflags negative_cts_offsets"
+Enables utilization of version 1 of the \s-1CTTS\s0 box, in which the \s-1CTS\s0 offsets can
+be negative. This enables the initial sample to have \s-1DTS/CTS\s0 of zero, and
+reduces the need for edit lists for some cases such as video tracks with
+B\-frames. Additionally, eases conformance with the DASH-IF interoperability
+guidelines.
+.Sp
+This option is implicitly set when writing ismv (Smooth Streaming) files.
+.IP "\fB\-write_prft\fR" 4
+.IX Item "-write_prft"
+Write producer time reference box (\s-1PRFT\s0) with a specified time source for the
+\&\s-1NTP\s0 field in the \s-1PRFT\s0 box. Set value as \fBwallclock\fR to specify timesource
+as wallclock time and \fBpts\fR to specify timesource as input packets' \s-1PTS\s0
+values.
+.Sp
+Setting value to \fBpts\fR is applicable only for a live encoding use case,
+where \s-1PTS\s0 values are set as as wallclock time at the source. For example, an
+encoding use case with decklink capture source where \fBvideo_pts\fR and
+\&\fBaudio_pts\fR are set to \fBabs_wallclock\fR.
+.PP
+\fIExample\fR
+.IX Subsection "Example"
+.PP
+Smooth Streaming content can be pushed in real time to a publishing
+point on \s-1IIS\s0 with this muxer. Example:
+.PP
+.Vb 1
+\& ffmpeg \-re <> \-movflags isml+frag_keyframe \-f ismv http://server/publishingpoint.isml/Streams(Encoder1)
+.Ve
+.SS "mp3"
+.IX Subsection "mp3"
+The \s-1MP3\s0 muxer writes a raw \s-1MP3\s0 stream with the following optional features:
+.IP "\(bu" 4
+An ID3v2 metadata header at the beginning (enabled by default). Versions 2.3 and
+2.4 are supported, the \f(CW\*(C`id3v2_version\*(C'\fR private option controls which one is
+used (3 or 4). Setting \f(CW\*(C`id3v2_version\*(C'\fR to 0 disables the ID3v2 header
+completely.
+.Sp
+The muxer supports writing attached pictures (\s-1APIC\s0 frames) to the ID3v2 header.
+The pictures are supplied to the muxer in form of a video stream with a single
+packet. There can be any number of those streams, each will correspond to a
+single \s-1APIC\s0 frame. The stream metadata tags \fItitle\fR and \fIcomment\fR map
+to \s-1APIC\s0 \fIdescription\fR and \fIpicture type\fR respectively. See
+<\fBhttp://id3.org/id3v2.4.0\-frames\fR> for allowed picture types.
+.Sp
+Note that the \s-1APIC\s0 frames must be written at the beginning, so the muxer will
+buffer the audio frames until it gets all the pictures. It is therefore advised
+to provide the pictures as soon as possible to avoid excessive buffering.
+.IP "\(bu" 4
+A Xing/LAME frame right after the ID3v2 header (if present). It is enabled by
+default, but will be written only if the output is seekable. The
+\&\f(CW\*(C`write_xing\*(C'\fR private option can be used to disable it. The frame contains
+various information that may be useful to the decoder, like the audio duration
+or encoder delay.
+.IP "\(bu" 4
+A legacy ID3v1 tag at the end of the file (disabled by default). It may be
+enabled with the \f(CW\*(C`write_id3v1\*(C'\fR private option, but as its capabilities are
+very limited, its usage is not recommended.
+.PP
+Examples:
+.PP
+Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-id3v2_version 3 \-write_id3v1 1 out.mp3
+.Ve
+.PP
+To attach a picture to an mp3 file select both the audio and the picture stream
+with \f(CW\*(C`map\*(C'\fR:
+.PP
+.Vb 2
+\& ffmpeg \-i input.mp3 \-i cover.png \-c copy \-map 0 \-map 1
+\& \-metadata:s:v title="Album cover" \-metadata:s:v comment="Cover (Front)" out.mp3
+.Ve
+.PP
+Write a \*(L"clean\*(R" \s-1MP3\s0 without any extra features:
+.PP
+.Vb 1
+\& ffmpeg \-i input.wav \-write_xing 0 \-id3v2_version 0 out.mp3
+.Ve
+.SS "mpegts"
+.IX Subsection "mpegts"
+\&\s-1MPEG\s0 transport stream muxer.
+.PP
+This muxer implements \s-1ISO 13818\-1\s0 and part of \s-1ETSI EN 300 468.\s0
+.PP
+The recognized metadata settings in mpegts muxer are \f(CW\*(C`service_provider\*(C'\fR
+and \f(CW\*(C`service_name\*(C'\fR. If they are not set the default for
+\&\f(CW\*(C`service_provider\*(C'\fR is \fBFFmpeg\fR and the default for
+\&\f(CW\*(C`service_name\*(C'\fR is \fBService01\fR.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The muxer options are:
+.IP "\fBmpegts_transport_stream_id\fR \fIinteger\fR" 4
+.IX Item "mpegts_transport_stream_id integer"
+Set the \fBtransport_stream_id\fR. This identifies a transponder in \s-1DVB.\s0
+Default is \f(CW0x0001\fR.
+.IP "\fBmpegts_original_network_id\fR \fIinteger\fR" 4
+.IX Item "mpegts_original_network_id integer"
+Set the \fBoriginal_network_id\fR. This is unique identifier of a
+network in \s-1DVB.\s0 Its main use is in the unique identification of a service
+through the path \fBOriginal_Network_ID, Transport_Stream_ID\fR. Default
+is \f(CW0x0001\fR.
+.IP "\fBmpegts_service_id\fR \fIinteger\fR" 4
+.IX Item "mpegts_service_id integer"
+Set the \fBservice_id\fR, also known as program in \s-1DVB.\s0 Default is
+\&\f(CW0x0001\fR.
+.IP "\fBmpegts_service_type\fR \fIinteger\fR" 4
+.IX Item "mpegts_service_type integer"
+Set the program \fBservice_type\fR. Default is \f(CW\*(C`digital_tv\*(C'\fR.
+Accepts the following options:
+.RS 4
+.IP "\fBhex_value\fR" 4
+.IX Item "hex_value"
+Any hexadecimal value between \f(CW0x01\fR and \f(CW0xff\fR as defined in
+\&\s-1ETSI 300 468.\s0
+.IP "\fBdigital_tv\fR" 4
+.IX Item "digital_tv"
+Digital \s-1TV\s0 service.
+.IP "\fBdigital_radio\fR" 4
+.IX Item "digital_radio"
+Digital Radio service.
+.IP "\fBteletext\fR" 4
+.IX Item "teletext"
+Teletext service.
+.IP "\fBadvanced_codec_digital_radio\fR" 4
+.IX Item "advanced_codec_digital_radio"
+Advanced Codec Digital Radio service.
+.IP "\fBmpeg2_digital_hdtv\fR" 4
+.IX Item "mpeg2_digital_hdtv"
+\&\s-1MPEG2\s0 Digital \s-1HDTV\s0 service.
+.IP "\fBadvanced_codec_digital_sdtv\fR" 4
+.IX Item "advanced_codec_digital_sdtv"
+Advanced Codec Digital \s-1SDTV\s0 service.
+.IP "\fBadvanced_codec_digital_hdtv\fR" 4
+.IX Item "advanced_codec_digital_hdtv"
+Advanced Codec Digital \s-1HDTV\s0 service.
+.RE
+.RS 4
+.RE
+.IP "\fBmpegts_pmt_start_pid\fR \fIinteger\fR" 4
+.IX Item "mpegts_pmt_start_pid integer"
+Set the first \s-1PID\s0 for PMTs. Default is \f(CW0x1000\fR, minimum is \f(CW0x0020\fR,
+maximum is \f(CW0x1ffa\fR. This option has no effect in m2ts mode where the \s-1PMT
+PID\s0 is fixed \f(CW0x0100\fR.
+.IP "\fBmpegts_start_pid\fR \fIinteger\fR" 4
+.IX Item "mpegts_start_pid integer"
+Set the first \s-1PID\s0 for elementary streams. Default is \f(CW0x0100\fR, minimum is
+\&\f(CW0x0020\fR, maximum is \f(CW0x1ffa\fR. This option has no effect in m2ts mode
+where the elementary stream PIDs are fixed.
+.IP "\fBmpegts_m2ts_mode\fR \fIboolean\fR" 4
+.IX Item "mpegts_m2ts_mode boolean"
+Enable m2ts mode if set to \f(CW1\fR. Default value is \f(CW\*(C`\-1\*(C'\fR which
+disables m2ts mode.
+.IP "\fBmuxrate\fR \fIinteger\fR" 4
+.IX Item "muxrate integer"
+Set a constant muxrate. Default is \s-1VBR.\s0
+.IP "\fBpes_payload_size\fR \fIinteger\fR" 4
+.IX Item "pes_payload_size integer"
+Set minimum \s-1PES\s0 packet payload in bytes. Default is \f(CW2930\fR.
+.IP "\fBmpegts_flags\fR \fIflags\fR" 4
+.IX Item "mpegts_flags flags"
+Set mpegts flags. Accepts the following options:
+.RS 4
+.IP "\fBresend_headers\fR" 4
+.IX Item "resend_headers"
+Reemit \s-1PAT/PMT\s0 before writing the next packet.
+.IP "\fBlatm\fR" 4
+.IX Item "latm"
+Use \s-1LATM\s0 packetization for \s-1AAC.\s0
+.IP "\fBpat_pmt_at_frames\fR" 4
+.IX Item "pat_pmt_at_frames"
+Reemit \s-1PAT\s0 and \s-1PMT\s0 at each video frame.
+.IP "\fBsystem_b\fR" 4
+.IX Item "system_b"
+Conform to System B (\s-1DVB\s0) instead of System A (\s-1ATSC\s0).
+.IP "\fBinitial_discontinuity\fR" 4
+.IX Item "initial_discontinuity"
+Mark the initial packet of each stream as discontinuity.
+.RE
+.RS 4
+.RE
+.IP "\fBmpegts_copyts\fR \fIboolean\fR" 4
+.IX Item "mpegts_copyts boolean"
+Preserve original timestamps, if value is set to \f(CW1\fR. Default value
+is \f(CW\*(C`\-1\*(C'\fR, which results in shifting timestamps so that they start from 0.
+.IP "\fBomit_video_pes_length\fR \fIboolean\fR" 4
+.IX Item "omit_video_pes_length boolean"
+Omit the \s-1PES\s0 packet length for video packets. Default is \f(CW1\fR (true).
+.IP "\fBpcr_period\fR \fIinteger\fR" 4
+.IX Item "pcr_period integer"
+Override the default \s-1PCR\s0 retransmission time in milliseconds. Default is
+\&\f(CW\*(C`\-1\*(C'\fR which means that the \s-1PCR\s0 interval will be determined automatically:
+20 ms is used for \s-1CBR\s0 streams, the highest multiple of the frame duration which
+is less than 100 ms is used for \s-1VBR\s0 streams.
+.IP "\fBpat_period\fR \fIduration\fR" 4
+.IX Item "pat_period duration"
+Maximum time in seconds between \s-1PAT/PMT\s0 tables. Default is \f(CW0.1\fR.
+.IP "\fBsdt_period\fR \fIduration\fR" 4
+.IX Item "sdt_period duration"
+Maximum time in seconds between \s-1SDT\s0 tables. Default is \f(CW0.5\fR.
+.IP "\fBtables_version\fR \fIinteger\fR" 4
+.IX Item "tables_version integer"
+Set \s-1PAT, PMT\s0 and \s-1SDT\s0 version (default \f(CW0\fR, valid values are from 0 to 31, inclusively).
+This option allows updating stream structure so that standard consumer may
+detect the change. To do so, reopen output \f(CW\*(C`AVFormatContext\*(C'\fR (in case of \s-1API\s0
+usage) or restart \fBffmpeg\fR instance, cyclically changing
+\&\fBtables_version\fR value:
+.Sp
+.Vb 7
+\& ffmpeg \-i source1.ts \-codec copy \-f mpegts \-tables_version 0 udp://1.1.1.1:1111
+\& ffmpeg \-i source2.ts \-codec copy \-f mpegts \-tables_version 1 udp://1.1.1.1:1111
+\& ...
+\& ffmpeg \-i source3.ts \-codec copy \-f mpegts \-tables_version 31 udp://1.1.1.1:1111
+\& ffmpeg \-i source1.ts \-codec copy \-f mpegts \-tables_version 0 udp://1.1.1.1:1111
+\& ffmpeg \-i source2.ts \-codec copy \-f mpegts \-tables_version 1 udp://1.1.1.1:1111
+\& ...
+.Ve
+.PP
+\fIExample\fR
+.IX Subsection "Example"
+.PP
+.Vb 9
+\& ffmpeg \-i file.mpg \-c copy \e
+\& \-mpegts_original_network_id 0x1122 \e
+\& \-mpegts_transport_stream_id 0x3344 \e
+\& \-mpegts_service_id 0x5566 \e
+\& \-mpegts_pmt_start_pid 0x1500 \e
+\& \-mpegts_start_pid 0x150 \e
+\& \-metadata service_provider="Some provider" \e
+\& \-metadata service_name="Some Channel" \e
+\& out.ts
+.Ve
+.SS "mxf, mxf_d10, mxf_opatom"
+.IX Subsection "mxf, mxf_d10, mxf_opatom"
+\&\s-1MXF\s0 muxer.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The muxer options are:
+.IP "\fBstore_user_comments\fR \fIbool\fR" 4
+.IX Item "store_user_comments bool"
+Set if user comments should be stored if available or never.
+\&\s-1IRT D\-10\s0 does not allow user comments. The default is thus to write them for
+mxf and mxf_opatom but not for mxf_d10
+.SS "null"
+.IX Subsection "null"
+Null muxer.
+.PP
+This muxer does not generate any output file, it is mainly useful for
+testing or benchmarking purposes.
+.PP
+For example to benchmark decoding with \fBffmpeg\fR you can use the
+command:
+.PP
+.Vb 1
+\& ffmpeg \-benchmark \-i INPUT \-f null out.null
+.Ve
+.PP
+Note that the above command does not read or write the \fIout.null\fR
+file, but specifying the output file is required by the \fBffmpeg\fR
+syntax.
+.PP
+Alternatively you can write the command as:
+.PP
+.Vb 1
+\& ffmpeg \-benchmark \-i INPUT \-f null \-
+.Ve
+.SS "nut"
+.IX Subsection "nut"
+.IP "\fB\-syncpoints\fR \fIflags\fR" 4
+.IX Item "-syncpoints flags"
+Change the syncpoint usage in nut:
+.RS 4
+.IP "\fIdefault\fR \fBuse the normal low-overhead seeking aids.\fR" 4
+.IX Item "default use the normal low-overhead seeking aids."
+.PD 0
+.IP "\fInone\fR \fBdo not use the syncpoints at all, reducing the overhead but making the stream non-seekable;\fR" 4
+.IX Item "none do not use the syncpoints at all, reducing the overhead but making the stream non-seekable;"
+.PD
+.Vb 5
+\& Use of this option is not recommended, as the resulting files are very damage
+\& sensitive and seeking is not possible. Also in general the overhead from
+\& syncpoints is negligible. Note, \-C 0 can be used to disable
+\& all growing data tables, allowing to mux endless streams with limited memory
+\& and without these disadvantages.
+.Ve
+.IP "\fItimestamped\fR \fBextend the syncpoint with a wallclock field.\fR" 4
+.IX Item "timestamped extend the syncpoint with a wallclock field."
+.RE
+.RS 4
+.Sp
+The \fInone\fR and \fItimestamped\fR flags are experimental.
+.RE
+.IP "\fB\-write_index\fR \fIbool\fR" 4
+.IX Item "-write_index bool"
+Write index at the end, the default is to write an index.
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f_strict experimental \-syncpoints none \- | processor
+.Ve
+.SS "ogg"
+.IX Subsection "ogg"
+Ogg container muxer.
+.IP "\fB\-page_duration\fR \fIduration\fR" 4
+.IX Item "-page_duration duration"
+Preferred page duration, in microseconds. The muxer will attempt to create
+pages that are approximately \fIduration\fR microseconds long. This allows the
+user to compromise between seek granularity and container overhead. The default
+is 1 second. A value of 0 will fill all segments, making pages as large as
+possible. A value of 1 will effectively use 1 packet-per-page in most
+situations, giving a small seek granularity at the cost of additional container
+overhead.
+.IP "\fB\-serial_offset\fR \fIvalue\fR" 4
+.IX Item "-serial_offset value"
+Serial value from which to set the streams serial number.
+Setting it to different and sufficiently large values ensures that the produced
+ogg files can be safely chained.
+.SS "segment, stream_segment, ssegment"
+.IX Subsection "segment, stream_segment, ssegment"
+Basic stream segmenter.
+.PP
+This muxer outputs streams to a number of separate files of nearly
+fixed duration. Output filename pattern can be set in a fashion
+similar to \fBimage2\fR, or by using a \f(CW\*(C`strftime\*(C'\fR template if
+the \fBstrftime\fR option is enabled.
+.PP
+\&\f(CW\*(C`stream_segment\*(C'\fR is a variant of the muxer used to write to
+streaming output formats, i.e. which do not require global headers,
+and is recommended for outputting e.g. to \s-1MPEG\s0 transport stream segments.
+\&\f(CW\*(C`ssegment\*(C'\fR is a shorter alias for \f(CW\*(C`stream_segment\*(C'\fR.
+.PP
+Every segment starts with a keyframe of the selected reference stream,
+which is set through the \fBreference_stream\fR option.
+.PP
+Note that if you want accurate splitting for a video file, you need to
+make the input key frames correspond to the exact splitting times
+expected by the segmenter, or the segment muxer will start the new
+segment with the key frame found next after the specified start
+time.
+.PP
+The segment muxer works best with a single constant frame rate video.
+.PP
+Optionally it can generate a list of the created segments, by setting
+the option \fIsegment_list\fR. The list type is specified by the
+\&\fIsegment_list_type\fR option. The entry filenames in the segment
+list are set by default to the basename of the corresponding segment
+files.
+.PP
+See also the \fBhls\fR muxer, which provides a more specific
+implementation for \s-1HLS\s0 segmentation.
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+The segment muxer supports the following options:
+.IP "\fBincrement_tc\fR \fI1|0\fR" 4
+.IX Item "increment_tc 1|0"
+if set to \f(CW1\fR, increment timecode between each segment
+If this is selected, the input need to have
+a timecode in the first video stream. Default value is
+\&\f(CW0\fR.
+.IP "\fBreference_stream\fR \fIspecifier\fR" 4
+.IX Item "reference_stream specifier"
+Set the reference stream, as specified by the string \fIspecifier\fR.
+If \fIspecifier\fR is set to \f(CW\*(C`auto\*(C'\fR, the reference is chosen
+automatically. Otherwise it must be a stream specifier (see the ``Stream
+specifiers'' chapter in the ffmpeg manual) which specifies the
+reference stream. The default value is \f(CW\*(C`auto\*(C'\fR.
+.IP "\fBsegment_format\fR \fIformat\fR" 4
+.IX Item "segment_format format"
+Override the inner container format, by default it is guessed by the filename
+extension.
+.IP "\fBsegment_format_options\fR \fIoptions_list\fR" 4
+.IX Item "segment_format_options options_list"
+Set output format options using a :\-separated list of key=value
+parameters. Values containing the \f(CW\*(C`:\*(C'\fR special character must be
+escaped.
+.IP "\fBsegment_list\fR \fIname\fR" 4
+.IX Item "segment_list name"
+Generate also a listfile named \fIname\fR. If not specified no
+listfile is generated.
+.IP "\fBsegment_list_flags\fR \fIflags\fR" 4
+.IX Item "segment_list_flags flags"
+Set flags affecting the segment list generation.
+.Sp
+It currently supports the following flags:
+.RS 4
+.IP "\fBcache\fR" 4
+.IX Item "cache"
+Allow caching (only affects M3U8 list files).
+.IP "\fBlive\fR" 4
+.IX Item "live"
+Allow live-friendly file generation.
+.RE
+.RS 4
+.RE
+.IP "\fBsegment_list_size\fR \fIsize\fR" 4
+.IX Item "segment_list_size size"
+Update the list file so that it contains at most \fIsize\fR
+segments. If 0 the list file will contain all the segments. Default
+value is 0.
+.IP "\fBsegment_list_entry_prefix\fR \fIprefix\fR" 4
+.IX Item "segment_list_entry_prefix prefix"
+Prepend \fIprefix\fR to each entry. Useful to generate absolute paths.
+By default no prefix is applied.
+.IP "\fBsegment_list_type\fR \fItype\fR" 4
+.IX Item "segment_list_type type"
+Select the listing format.
+.Sp
+The following values are recognized:
+.RS 4
+.IP "\fBflat\fR" 4
+.IX Item "flat"
+Generate a flat list for the created segments, one segment per line.
+.IP "\fBcsv, ext\fR" 4
+.IX Item "csv, ext"
+Generate a list for the created segments, one segment per line,
+each line matching the format (comma-separated values):
+.Sp
+.Vb 1
+\& ,,
+.Ve
+.Sp
+\&\fIsegment_filename\fR is the name of the output file generated by the
+muxer according to the provided pattern. \s-1CSV\s0 escaping (according to
+\&\s-1RFC4180\s0) is applied if required.
+.Sp
+\&\fIsegment_start_time\fR and \fIsegment_end_time\fR specify
+the segment start and end time expressed in seconds.
+.Sp
+A list file with the suffix \f(CW".csv"\fR or \f(CW".ext"\fR will
+auto-select this format.
+.Sp
+\&\fBext\fR is deprecated in favor or \fBcsv\fR.
+.IP "\fBffconcat\fR" 4
+.IX Item "ffconcat"
+Generate an ffconcat file for the created segments. The resulting file
+can be read using the FFmpeg \fBconcat\fR demuxer.
+.Sp
+A list file with the suffix \f(CW".ffcat"\fR or \f(CW".ffconcat"\fR will
+auto-select this format.
+.IP "\fBm3u8\fR" 4
+.IX Item "m3u8"
+Generate an extended M3U8 file, version 3, compliant with
+<\fBhttp://tools.ietf.org/id/draft\-pantos\-http\-live\-streaming\fR>.
+.Sp
+A list file with the suffix \f(CW".m3u8"\fR will auto-select this format.
+.RE
+.RS 4
+.Sp
+If not specified the type is guessed from the list file name suffix.
+.RE
+.IP "\fBsegment_time\fR \fItime\fR" 4
+.IX Item "segment_time time"
+Set segment duration to \fItime\fR, the value must be a duration
+specification. Default value is \*(L"2\*(R". See also the
+\&\fBsegment_times\fR option.
+.Sp
+Note that splitting may not be accurate, unless you force the
+reference stream key-frames at the given time. See the introductory
+notice and the examples below.
+.IP "\fBsegment_atclocktime\fR \fI1|0\fR" 4
+.IX Item "segment_atclocktime 1|0"
+If set to \*(L"1\*(R" split at regular clock time intervals starting from 00:00
+o'clock. The \fItime\fR value specified in \fBsegment_time\fR is
+used for setting the length of the splitting interval.
+.Sp
+For example with \fBsegment_time\fR set to \*(L"900\*(R" this makes it possible
+to create files at 12:00 o'clock, 12:15, 12:30, etc.
+.Sp
+Default value is \*(L"0\*(R".
+.IP "\fBsegment_clocktime_offset\fR \fIduration\fR" 4
+.IX Item "segment_clocktime_offset duration"
+Delay the segment splitting times with the specified duration when using
+\&\fBsegment_atclocktime\fR.
+.Sp
+For example with \fBsegment_time\fR set to \*(L"900\*(R" and
+\&\fBsegment_clocktime_offset\fR set to \*(L"300\*(R" this makes it possible to
+create files at 12:05, 12:20, 12:35, etc.
+.Sp
+Default value is \*(L"0\*(R".
+.IP "\fBsegment_clocktime_wrap_duration\fR \fIduration\fR" 4
+.IX Item "segment_clocktime_wrap_duration duration"
+Force the segmenter to only start a new segment if a packet reaches the muxer
+within the specified duration after the segmenting clock time. This way you
+can make the segmenter more resilient to backward local time jumps, such as
+leap seconds or transition to standard time from daylight savings time.
+.Sp
+Default is the maximum possible duration which means starting a new segment
+regardless of the elapsed time since the last clock time.
+.IP "\fBsegment_time_delta\fR \fIdelta\fR" 4
+.IX Item "segment_time_delta delta"
+Specify the accuracy time when selecting the start time for a
+segment, expressed as a duration specification. Default value is \*(L"0\*(R".
+.Sp
+When delta is specified a key-frame will start a new segment if its
+\&\s-1PTS\s0 satisfies the relation:
+.Sp
+.Vb 1
+\& PTS >= start_time \- time_delta
+.Ve
+.Sp
+This option is useful when splitting video content, which is always
+split at \s-1GOP\s0 boundaries, in case a key frame is found just before the
+specified split time.
+.Sp
+In particular may be used in combination with the \fIffmpeg\fR option
+\&\fIforce_key_frames\fR. The key frame times specified by
+\&\fIforce_key_frames\fR may not be set accurately because of rounding
+issues, with the consequence that a key frame time may result set just
+before the specified time. For constant frame rate videos a value of
+1/(2*\fIframe_rate\fR) should address the worst case mismatch between
+the specified time and the time set by \fIforce_key_frames\fR.
+.IP "\fBsegment_times\fR \fItimes\fR" 4
+.IX Item "segment_times times"
+Specify a list of split points. \fItimes\fR contains a list of comma
+separated duration specifications, in increasing order. See also
+the \fBsegment_time\fR option.
+.IP "\fBsegment_frames\fR \fIframes\fR" 4
+.IX Item "segment_frames frames"
+Specify a list of split video frame numbers. \fIframes\fR contains a
+list of comma separated integer numbers, in increasing order.
+.Sp
+This option specifies to start a new segment whenever a reference
+stream key frame is found and the sequential number (starting from 0)
+of the frame is greater or equal to the next value in the list.
+.IP "\fBsegment_wrap\fR \fIlimit\fR" 4
+.IX Item "segment_wrap limit"
+Wrap around segment index once it reaches \fIlimit\fR.
+.IP "\fBsegment_start_number\fR \fInumber\fR" 4
+.IX Item "segment_start_number number"
+Set the sequence number of the first segment. Defaults to \f(CW0\fR.
+.IP "\fBstrftime\fR \fI1|0\fR" 4
+.IX Item "strftime 1|0"
+Use the \f(CW\*(C`strftime\*(C'\fR function to define the name of the new
+segments to write. If this is selected, the output segment name must
+contain a \f(CW\*(C`strftime\*(C'\fR function template. Default value is
+\&\f(CW0\fR.
+.IP "\fBbreak_non_keyframes\fR \fI1|0\fR" 4
+.IX Item "break_non_keyframes 1|0"
+If enabled, allow segments to start on frames other than keyframes. This
+improves behavior on some players when the time between keyframes is
+inconsistent, but may make things worse on others, and can cause some oddities
+during seeking. Defaults to \f(CW0\fR.
+.IP "\fBreset_timestamps\fR \fI1|0\fR" 4
+.IX Item "reset_timestamps 1|0"
+Reset timestamps at the beginning of each segment, so that each segment
+will start with near-zero timestamps. It is meant to ease the playback
+of the generated segments. May not work with some combinations of
+muxers/codecs. It is set to \f(CW0\fR by default.
+.IP "\fBinitial_offset\fR \fIoffset\fR" 4
+.IX Item "initial_offset offset"
+Specify timestamp offset to apply to the output packet timestamps. The
+argument must be a time duration specification, and defaults to 0.
+.IP "\fBwrite_empty_segments\fR \fI1|0\fR" 4
+.IX Item "write_empty_segments 1|0"
+If enabled, write an empty segment if there are no packets during the period a
+segment would usually span. Otherwise, the segment will be filled with the next
+packet written. Defaults to \f(CW0\fR.
+.PP
+Make sure to require a closed \s-1GOP\s0 when encoding and to set the \s-1GOP\s0
+size to fit your segment time constraint.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Remux the content of file \fIin.mkv\fR to a list of segments
+\&\fIout\-000.nut\fR, \fIout\-001.nut\fR, etc., and write the list of
+generated segments to \fIout.list\fR:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-codec hevc \-flags +cgop \-g 60 \-map 0 \-f segment \-segment_list out.list out%03d.nut
+.Ve
+.IP "\(bu" 4
+Segment input and set output format options for the output segments:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-f segment \-segment_time 10 \-segment_format_options movflags=+faststart out%03d.mp4
+.Ve
+.IP "\(bu" 4
+Segment the input file according to the split points specified by the
+\&\fIsegment_times\fR option:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-codec copy \-map 0 \-f segment \-segment_list out.csv \-segment_times 1,2,3,5,8,13,21 out%03d.nut
+.Ve
+.IP "\(bu" 4
+Use the \fBffmpeg\fR \fBforce_key_frames\fR
+option to force key frames in the input at the specified location, together
+with the segment option \fBsegment_time_delta\fR to account for
+possible roundings operated when setting key frame times.
+.Sp
+.Vb 2
+\& ffmpeg \-i in.mkv \-force_key_frames 1,2,3,5,8,13,21 \-codec:v mpeg4 \-codec:a pcm_s16le \-map 0 \e
+\& \-f segment \-segment_list out.csv \-segment_times 1,2,3,5,8,13,21 \-segment_time_delta 0.05 out%03d.nut
+.Ve
+.Sp
+In order to force key frames on the input file, transcoding is
+required.
+.IP "\(bu" 4
+Segment the input file by splitting the input file according to the
+frame numbers sequence specified with the \fBsegment_frames\fR option:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-codec copy \-map 0 \-f segment \-segment_list out.csv \-segment_frames 100,200,300,500,800 out%03d.nut
+.Ve
+.IP "\(bu" 4
+Convert the \fIin.mkv\fR to \s-1TS\s0 segments using the \f(CW\*(C`libx264\*(C'\fR
+and \f(CW\*(C`aac\*(C'\fR encoders:
+.Sp
+.Vb 1
+\& ffmpeg \-i in.mkv \-map 0 \-codec:v libx264 \-codec:a aac \-f ssegment \-segment_list out.list out%03d.ts
+.Ve
+.IP "\(bu" 4
+Segment the input file, and create an M3U8 live playlist (can be used
+as live \s-1HLS\s0 source):
+.Sp
+.Vb 2
+\& ffmpeg \-re \-i in.mkv \-codec copy \-map 0 \-f segment \-segment_list playlist.m3u8 \e
+\& \-segment_list_flags +live \-segment_time 10 out%03d.mkv
+.Ve
+.SS "smoothstreaming"
+.IX Subsection "smoothstreaming"
+Smooth Streaming muxer generates a set of files (Manifest, chunks) suitable for serving with conventional web server.
+.IP "\fBwindow_size\fR" 4
+.IX Item "window_size"
+Specify the number of fragments kept in the manifest. Default 0 (keep all).
+.IP "\fBextra_window_size\fR" 4
+.IX Item "extra_window_size"
+Specify the number of fragments kept outside of the manifest before removing from disk. Default 5.
+.IP "\fBlookahead_count\fR" 4
+.IX Item "lookahead_count"
+Specify the number of lookahead fragments. Default 2.
+.IP "\fBmin_frag_duration\fR" 4
+.IX Item "min_frag_duration"
+Specify the minimum fragment duration (in microseconds). Default 5000000.
+.IP "\fBremove_at_exit\fR" 4
+.IX Item "remove_at_exit"
+Specify whether to remove all fragments when finished. Default 0 (do not remove).
+.SS "streamhash"
+.IX Subsection "streamhash"
+Per stream hash testing format.
+.PP
+This muxer computes and prints a cryptographic hash of all the input frames,
+on a per-stream basis. This can be used for equality checks without having
+to do a complete binary comparison.
+.PP
+By default audio frames are converted to signed 16\-bit raw audio and
+video frames to raw video before computing the hash, but the output
+of explicit conversions to other codecs can also be used. Timestamps
+are ignored. It uses the \s-1SHA\-256\s0 cryptographic hash function by default,
+but supports several other algorithms.
+.PP
+The output of the muxer consists of one line per stream of the form:
+\&\fIstreamindex\fR,\fIstreamtype\fR,\fIalgo\fR=\fIhash\fR, where
+\&\fIstreamindex\fR is the index of the mapped stream, \fIstreamtype\fR is a
+single character indicating the type of stream, \fIalgo\fR is a short string
+representing the hash function used, and \fIhash\fR is a hexadecimal number
+representing the computed hash.
+.IP "\fBhash\fR \fIalgorithm\fR" 4
+.IX Item "hash algorithm"
+Use the cryptographic hash function specified by the string \fIalgorithm\fR.
+Supported values include \f(CW\*(C`MD5\*(C'\fR, \f(CW\*(C`murmur3\*(C'\fR, \f(CW\*(C`RIPEMD128\*(C'\fR,
+\&\f(CW\*(C`RIPEMD160\*(C'\fR, \f(CW\*(C`RIPEMD256\*(C'\fR, \f(CW\*(C`RIPEMD320\*(C'\fR, \f(CW\*(C`SHA160\*(C'\fR,
+\&\f(CW\*(C`SHA224\*(C'\fR, \f(CW\*(C`SHA256\*(C'\fR (default), \f(CW\*(C`SHA512/224\*(C'\fR, \f(CW\*(C`SHA512/256\*(C'\fR,
+\&\f(CW\*(C`SHA384\*(C'\fR, \f(CW\*(C`SHA512\*(C'\fR, \f(CW\*(C`CRC32\*(C'\fR and \f(CW\*(C`adler32\*(C'\fR.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+To compute the \s-1SHA\-256\s0 hash of the input converted to raw audio and
+video, and store it in the file \fIout.sha256\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f streamhash out.sha256
+.Ve
+.PP
+To print an \s-1MD5\s0 hash to stdout use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f streamhash \-hash md5 \-
+.Ve
+.PP
+See also the \fBhash\fR and \fBframehash\fR muxers.
+.SS "fifo"
+.IX Subsection "fifo"
+The fifo pseudo-muxer allows the separation of encoding and muxing by using
+first-in-first-out queue and running the actual muxer in a separate thread. This
+is especially useful in combination with the \fBtee\fR muxer and can be used to
+send data to several destinations with different reliability/writing speed/latency.
+.PP
+\&\s-1API\s0 users should be aware that callback functions (interrupt_callback,
+io_open and io_close) used within its AVFormatContext must be thread-safe.
+.PP
+The behavior of the fifo muxer if the queue fills up or if the output fails is
+selectable,
+.IP "\(bu" 4
+output can be transparently restarted with configurable delay between retries
+based on real time or time of the processed stream.
+.IP "\(bu" 4
+encoding can be blocked during temporary failure, or continue transparently
+dropping packets in case fifo queue fills up.
+.IP "\fBfifo_format\fR" 4
+.IX Item "fifo_format"
+Specify the format name. Useful if it cannot be guessed from the
+output name suffix.
+.IP "\fBqueue_size\fR" 4
+.IX Item "queue_size"
+Specify size of the queue (number of packets). Default value is 60.
+.IP "\fBformat_opts\fR" 4
+.IX Item "format_opts"
+Specify format options for the underlying muxer. Muxer options can be specified
+as a list of \fIkey\fR=\fIvalue\fR pairs separated by ':'.
+.IP "\fBdrop_pkts_on_overflow\fR \fIbool\fR" 4
+.IX Item "drop_pkts_on_overflow bool"
+If set to 1 (true), in case the fifo queue fills up, packets will be dropped
+rather than blocking the encoder. This makes it possible to continue streaming without
+delaying the input, at the cost of omitting part of the stream. By default
+this option is set to 0 (false), so in such cases the encoder will be blocked
+until the muxer processes some of the packets and none of them is lost.
+.IP "\fBattempt_recovery\fR \fIbool\fR" 4
+.IX Item "attempt_recovery bool"
+If failure occurs, attempt to recover the output. This is especially useful
+when used with network output, since it makes it possible to restart streaming transparently.
+By default this option is set to 0 (false).
+.IP "\fBmax_recovery_attempts\fR" 4
+.IX Item "max_recovery_attempts"
+Sets maximum number of successive unsuccessful recovery attempts after which
+the output fails permanently. By default this option is set to 0 (unlimited).
+.IP "\fBrecovery_wait_time\fR \fIduration\fR" 4
+.IX Item "recovery_wait_time duration"
+Waiting time before the next recovery attempt after previous unsuccessful
+recovery attempt. Default value is 5 seconds.
+.IP "\fBrecovery_wait_streamtime\fR \fIbool\fR" 4
+.IX Item "recovery_wait_streamtime bool"
+If set to 0 (false), the real time is used when waiting for the recovery
+attempt (i.e. the recovery will be attempted after at least
+recovery_wait_time seconds).
+If set to 1 (true), the time of the processed stream is taken into account
+instead (i.e. the recovery will be attempted after at least \fIrecovery_wait_time\fR
+seconds of the stream is omitted).
+By default, this option is set to 0 (false).
+.IP "\fBrecover_any_error\fR \fIbool\fR" 4
+.IX Item "recover_any_error bool"
+If set to 1 (true), recovery will be attempted regardless of type of the error
+causing the failure. By default this option is set to 0 (false) and in case of
+certain (usually permanent) errors the recovery is not attempted even when
+\&\fIattempt_recovery\fR is set to 1.
+.IP "\fBrestart_with_keyframe\fR \fIbool\fR" 4
+.IX Item "restart_with_keyframe bool"
+Specify whether to wait for the keyframe after recovering from
+queue overflow or failure. This option is set to 0 (false) by default.
+.IP "\fBtimeshift\fR \fIduration\fR" 4
+.IX Item "timeshift duration"
+Buffer the specified amount of packets and delay writing the output. Note that
+\&\fIqueue_size\fR must be big enough to store the packets for timeshift. At the
+end of the input the fifo buffer is flushed at realtime speed.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Stream something to rtmp server, continue processing the stream at real-time
+rate even in case of temporary failure (network outage) and attempt to recover
+streaming every second indefinitely.
+.Sp
+.Vb 2
+\& ffmpeg \-re \-i ... \-c:v libx264 \-c:a aac \-f fifo \-fifo_format flv \-map 0:v \-map 0:a
+\& \-drop_pkts_on_overflow 1 \-attempt_recovery 1 \-recovery_wait_time 1 rtmp://example.com/live/stream_name
+.Ve
+.SS "tee"
+.IX Subsection "tee"
+The tee muxer can be used to write the same data to several outputs, such as files or streams.
+It can be used, for example, to stream a video over a network and save it to disk at the same time.
+.PP
+It is different from specifying several outputs to the \fBffmpeg\fR
+command-line tool. With the tee muxer, the audio and video data will be encoded only once.
+With conventional multiple outputs, multiple encoding operations in parallel are initiated,
+which can be a very expensive process. The tee muxer is not useful when using the libavformat \s-1API\s0
+directly because it is then possible to feed the same packets to several muxers directly.
+.PP
+Since the tee muxer does not represent any particular output format, ffmpeg cannot auto-select
+output streams. So all streams intended for output must be specified using \f(CW\*(C`\-map\*(C'\fR. See
+the examples below.
+.PP
+Some encoders may need different options depending on the output format;
+the auto-detection of this can not work with the tee muxer, so they need to be explicitly specified.
+The main example is the \fBglobal_header\fR flag.
+.PP
+The slave outputs are specified in the file name given to the muxer,
+separated by '|'. If any of the slave name contains the '|' separator,
+leading or trailing spaces or any special character, those must be
+escaped (see \fBthe \*(L"Quoting and escaping\*(R"
+section in the \fBffmpeg\-utils\fB\|(1) manual\fR).
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.IP "\fBuse_fifo\fR \fIbool\fR" 4
+.IX Item "use_fifo bool"
+If set to 1, slave outputs will be processed in separate threads using the \fBfifo\fR
+muxer. This allows to compensate for different speed/latency/reliability of
+outputs and setup transparent recovery. By default this feature is turned off.
+.IP "\fBfifo_options\fR" 4
+.IX Item "fifo_options"
+Options to pass to fifo pseudo-muxer instances. See \fBfifo\fR.
+.PP
+Muxer options can be specified for each slave by prepending them as a list of
+\&\fIkey\fR=\fIvalue\fR pairs separated by ':', between square brackets. If
+the options values contain a special character or the ':' separator, they
+must be escaped; note that this is a second level escaping.
+.PP
+The following special options are also recognized:
+.IP "\fBf\fR" 4
+.IX Item "f"
+Specify the format name. Required if it cannot be guessed from the
+output \s-1URL.\s0
+.IP "\fBbsfs[/\fR\fIspec\fR\fB]\fR" 4
+.IX Item "bsfs[/spec]"
+Specify a list of bitstream filters to apply to the specified
+output.
+.Sp
+It is possible to specify to which streams a given bitstream filter
+applies, by appending a stream specifier to the option separated by
+\&\f(CW\*(C`/\*(C'\fR. \fIspec\fR must be a stream specifier (see \fBFormat
+stream specifiers\fR).
+.Sp
+If the stream specifier is not specified, the bitstream filters will be
+applied to all streams in the output. This will cause that output operation
+to fail if the output contains streams to which the bitstream filter cannot
+be applied e.g. \f(CW\*(C`h264_mp4toannexb\*(C'\fR being applied to an output containing an audio stream.
+.Sp
+Options for a bitstream filter must be specified in the form of \f(CW\*(C`opt=value\*(C'\fR.
+.Sp
+Several bitstream filters can be specified, separated by \*(L",\*(R".
+.IP "\fBuse_fifo\fR \fIbool\fR" 4
+.IX Item "use_fifo bool"
+This allows to override tee muxer use_fifo option for individual slave muxer.
+.IP "\fBfifo_options\fR" 4
+.IX Item "fifo_options"
+This allows to override tee muxer fifo_options for individual slave muxer.
+See \fBfifo\fR.
+.IP "\fBselect\fR" 4
+.IX Item "select"
+Select the streams that should be mapped to the slave output,
+specified by a stream specifier. If not specified, this defaults to
+all the mapped streams. This will cause that output operation to fail
+if the output format does not accept all mapped streams.
+.Sp
+You may use multiple stream specifiers separated by commas (\f(CW\*(C`,\*(C'\fR) e.g.: \f(CW\*(C`a:0,v\*(C'\fR
+.IP "\fBonfail\fR" 4
+.IX Item "onfail"
+Specify behaviour on output failure. This can be set to either \f(CW\*(C`abort\*(C'\fR (which is
+default) or \f(CW\*(C`ignore\*(C'\fR. \f(CW\*(C`abort\*(C'\fR will cause whole process to fail in case of failure
+on this slave output. \f(CW\*(C`ignore\*(C'\fR will ignore failure on this output, so other outputs
+will continue without being affected.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.IP "\(bu" 4
+Encode something and both archive it in a WebM file and stream it
+as MPEG-TS over \s-1UDP:\s0
+.Sp
+.Vb 2
+\& ffmpeg \-i ... \-c:v libx264 \-c:a mp2 \-f tee \-map 0:v \-map 0:a
+\& "archive\-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
+.Ve
+.IP "\(bu" 4
+As above, but continue streaming even if output to local file fails
+(for example local drive fills up):
+.Sp
+.Vb 2
+\& ffmpeg \-i ... \-c:v libx264 \-c:a mp2 \-f tee \-map 0:v \-map 0:a
+\& "[onfail=ignore]archive\-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
+.Ve
+.IP "\(bu" 4
+Use \fBffmpeg\fR to encode the input, and send the output
+to three different destinations. The \f(CW\*(C`dump_extra\*(C'\fR bitstream
+filter is used to add extradata information to all the output video
+keyframes packets, as requested by the MPEG-TS format. The select
+option is applied to \fIout.aac\fR in order to make it contain only
+audio packets.
+.Sp
+.Vb 2
+\& ffmpeg \-i ... \-map 0 \-flags +global_header \-c:v libx264 \-c:a aac
+\& \-f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=a]out.aac"
+.Ve
+.IP "\(bu" 4
+As above, but select only stream \f(CW\*(C`a:1\*(C'\fR for the audio output. Note
+that a second level escaping must be performed, as \*(L":\*(R" is a special
+character used to separate options.
+.Sp
+.Vb 2
+\& ffmpeg \-i ... \-map 0 \-flags +global_header \-c:v libx264 \-c:a aac
+\& \-f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=\e\*(Aqa:1\e\*(Aq]out.aac"
+.Ve
+.SS "webm_dash_manifest"
+.IX Subsection "webm_dash_manifest"
+WebM \s-1DASH\s0 Manifest muxer.
+.PP
+This muxer implements the WebM \s-1DASH\s0 Manifest specification to generate the \s-1DASH\s0
+manifest \s-1XML.\s0 It also supports manifest generation for \s-1DASH\s0 live streams.
+.PP
+For more information see:
+.IP "\(bu" 4
+WebM \s-1DASH\s0 Specification: <\fBhttps://sites.google.com/a/webmproject.org/wiki/adaptive\-streaming/webm\-dash\-specification\fR>
+.IP "\(bu" 4
+\&\s-1ISO DASH\s0 Specification: <\fBhttp://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009\-1_2014.zip\fR>
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+This muxer supports the following options:
+.IP "\fBadaptation_sets\fR" 4
+.IX Item "adaptation_sets"
+This option has the following syntax: \*(L"id=x,streams=a,b,c id=y,streams=d,e\*(R" where x and y are the
+unique identifiers of the adaptation sets and a,b,c,d and e are the indices of the corresponding
+audio and video streams. Any number of adaptation sets can be added using this option.
+.IP "\fBlive\fR" 4
+.IX Item "live"
+Set this to 1 to create a live stream \s-1DASH\s0 Manifest. Default: 0.
+.IP "\fBchunk_start_index\fR" 4
+.IX Item "chunk_start_index"
+Start index of the first chunk. This will go in the \fBstartNumber\fR attribute
+of the \fBSegmentTemplate\fR element in the manifest. Default: 0.
+.IP "\fBchunk_duration_ms\fR" 4
+.IX Item "chunk_duration_ms"
+Duration of each chunk in milliseconds. This will go in the \fBduration\fR
+attribute of the \fBSegmentTemplate\fR element in the manifest. Default: 1000.
+.IP "\fButc_timing_url\fR" 4
+.IX Item "utc_timing_url"
+\&\s-1URL\s0 of the page that will return the \s-1UTC\s0 timestamp in \s-1ISO\s0 format. This will go
+in the \fBvalue\fR attribute of the \fBUTCTiming\fR element in the manifest.
+Default: None.
+.IP "\fBtime_shift_buffer_depth\fR" 4
+.IX Item "time_shift_buffer_depth"
+Smallest time (in seconds) shifting buffer for which any Representation is
+guaranteed to be available. This will go in the \fBtimeShiftBufferDepth\fR
+attribute of the \fB\s-1MPD\s0\fR element. Default: 60.
+.IP "\fBminimum_update_period\fR" 4
+.IX Item "minimum_update_period"
+Minimum update period (in seconds) of the manifest. This will go in the
+\&\fBminimumUpdatePeriod\fR attribute of the \fB\s-1MPD\s0\fR element. Default: 0.
+.PP
+\fIExample\fR
+.IX Subsection "Example"
+.PP
+.Vb 9
+\& ffmpeg \-f webm_dash_manifest \-i video1.webm \e
+\& \-f webm_dash_manifest \-i video2.webm \e
+\& \-f webm_dash_manifest \-i audio1.webm \e
+\& \-f webm_dash_manifest \-i audio2.webm \e
+\& \-map 0 \-map 1 \-map 2 \-map 3 \e
+\& \-c copy \e
+\& \-f webm_dash_manifest \e
+\& \-adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \e
+\& manifest.xml
+.Ve
+.SS "webm_chunk"
+.IX Subsection "webm_chunk"
+WebM Live Chunk Muxer.
+.PP
+This muxer writes out WebM headers and chunks as separate files which can be
+consumed by clients that support WebM Live streams via \s-1DASH.\s0
+.PP
+\fIOptions\fR
+.IX Subsection "Options"
+.PP
+This muxer supports the following options:
+.IP "\fBchunk_start_index\fR" 4
+.IX Item "chunk_start_index"
+Index of the first chunk (defaults to 0).
+.IP "\fBheader\fR" 4
+.IX Item "header"
+Filename of the header where the initialization data will be written.
+.IP "\fBaudio_chunk_duration\fR" 4
+.IX Item "audio_chunk_duration"
+Duration of each audio chunk in milliseconds (defaults to 5000).
+.PP
+\fIExample\fR
+.IX Subsection "Example"
+.PP
+.Vb 10
+\& ffmpeg \-f v4l2 \-i /dev/video0 \e
+\& \-f alsa \-i hw:0 \e
+\& \-map 0:0 \e
+\& \-c:v libvpx\-vp9 \e
+\& \-s 640x360 \-keyint_min 30 \-g 30 \e
+\& \-f webm_chunk \e
+\& \-header webm_live_video_360.hdr \e
+\& \-chunk_start_index 1 \e
+\& webm_live_video_360_%d.chk \e
+\& \-map 1:0 \e
+\& \-c:a libvorbis \e
+\& \-b:a 128k \e
+\& \-f webm_chunk \e
+\& \-header webm_live_audio_128.hdr \e
+\& \-chunk_start_index 1 \e
+\& \-audio_chunk_duration 1000 \e
+\& webm_live_audio_128_%d.chk
+.Ve
+.SH "METADATA"
+.IX Header "METADATA"
+FFmpeg is able to dump metadata from media files into a simple UTF\-8\-encoded
+INI-like text file and then load it back using the metadata muxer/demuxer.
+.PP
+The file format is as follows:
+.IP "1." 4
+A file consists of a header and a number of metadata tags divided into sections,
+each on its own line.
+.IP "2." 4
+The header is a \fB;FFMETADATA\fR string, followed by a version number (now 1).
+.IP "3." 4
+Metadata tags are of the form \fBkey=value\fR
+.IP "4." 4
+Immediately after header follows global metadata
+.IP "5." 4
+After global metadata there may be sections with per\-stream/per\-chapter
+metadata.
+.IP "6." 4
+A section starts with the section name in uppercase (i.e. \s-1STREAM\s0 or \s-1CHAPTER\s0) in
+brackets (\fB[\fR, \fB]\fR) and ends with next section or end of file.
+.IP "7." 4
+At the beginning of a chapter section there may be an optional timebase to be
+used for start/end values. It must be in form
+\&\fBTIMEBASE=\fR\fInum\fR\fB/\fR\fIden\fR, where \fInum\fR and \fIden\fR are
+integers. If the timebase is missing then start/end times are assumed to
+be in nanoseconds.
+.Sp
+Next a chapter section must contain chapter start and end times in form
+\&\fBSTART=\fR\fInum\fR, \fBEND=\fR\fInum\fR, where \fInum\fR is a positive
+integer.
+.IP "8." 4
+Empty lines and lines starting with \fB;\fR or \fB#\fR are ignored.
+.IP "9." 4
+Metadata keys or values containing special characters (\fB=\fR, \fB;\fR,
+\&\fB#\fR, \fB\e\fR and a newline) must be escaped with a backslash \fB\e\fR.
+.IP "10." 4
+Note that whitespace in metadata (e.g. \fBfoo = bar\fR) is considered to be
+a part of the tag (in the example above key is \fBfoo\fR , value is
+ \fBbar\fR).
+.PP
+A ffmetadata file might look like this:
+.PP
+.Vb 4
+\& ;FFMETADATA1
+\& title=bike\e\eshed
+\& ;this is a comment
+\& artist=FFmpeg troll team
+\&
+\& [CHAPTER]
+\& TIMEBASE=1/1000
+\& START=0
+\& #chapter ends at 0:01:00
+\& END=60000
+\& title=chapter \e#1
+\& [STREAM]
+\& title=multi\e
+\& line
+.Ve
+.PP
+By using the ffmetadata muxer and demuxer it is possible to extract
+metadata from an input file to an ffmetadata file, and then transcode
+the file into an output file with the edited ffmetadata file.
+.PP
+Extracting an ffmetadata file with \fIffmpeg\fR goes as follows:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-f ffmetadata FFMETADATAFILE
+.Ve
+.PP
+Reinserting edited metadata information from the \s-1FFMETADATAFILE\s0 file can
+be done as:
+.PP
+.Vb 1
+\& ffmpeg \-i INPUT \-i FFMETADATAFILE \-map_metadata 1 \-codec copy OUTPUT
+.Ve
+.SH "PROTOCOL OPTIONS"
+.IX Header "PROTOCOL OPTIONS"
+The libavformat library provides some generic global options, which
+can be set on all the protocols. In addition each protocol may support
+so-called private options, which are specific for that component.
+.PP
+Options may be set by specifying \-\fIoption\fR \fIvalue\fR in the
+FFmpeg tools, or by setting the value explicitly in the
+\&\f(CW\*(C`AVFormatContext\*(C'\fR options or using the \fIlibavutil/opt.h\fR \s-1API\s0
+for programmatic use.
+.PP
+The list of supported options follows:
+.IP "\fBprotocol_whitelist\fR \fIlist\fR \fB(\fR\fIinput\fR\fB)\fR" 4
+.IX Item "protocol_whitelist list (input)"
+Set a \*(L",\*(R"\-separated list of allowed protocols. \*(L"\s-1ALL\*(R"\s0 matches all protocols. Protocols
+prefixed by \*(L"\-\*(R" are disabled.
+All protocols are allowed by default but protocols used by an another
+protocol (nested protocols) are restricted to a per protocol subset.
+.SH "PROTOCOLS"
+.IX Header "PROTOCOLS"
+Protocols are configured elements in FFmpeg that enable access to
+resources that require specific protocols.
+.PP
+When you configure your FFmpeg build, all the supported protocols are
+enabled by default. You can list all available ones using the
+configure option \*(L"\-\-list\-protocols\*(R".
+.PP
+You can disable all the protocols using the configure option
+\&\*(L"\-\-disable\-protocols\*(R", and selectively enable a protocol using the
+option "\-\-enable\-protocol=\fI\s-1PROTOCOL\s0\fR\*(L", or you can disable a
+particular protocol using the option
+\&\*(R"\-\-disable\-protocol=\fI\s-1PROTOCOL\s0\fR".
+.PP
+The option \*(L"\-protocols\*(R" of the ff* tools will display the list of
+supported protocols.
+.PP
+All protocols accept the following options:
+.IP "\fBrw_timeout\fR" 4
+.IX Item "rw_timeout"
+Maximum time to wait for (network) read/write operations to complete,
+in microseconds.
+.PP
+A description of the currently available protocols follows.
+.SS "amqp"
+.IX Subsection "amqp"
+Advanced Message Queueing Protocol (\s-1AMQP\s0) version 0\-9\-1 is a broker based
+publish-subscribe communication protocol.
+.PP
+FFmpeg must be compiled with \-\-enable\-librabbitmq to support \s-1AMQP. A\s0 separate
+\&\s-1AMQP\s0 broker must also be run. An example open-source \s-1AMQP\s0 broker is RabbitMQ.
+.PP
+After starting the broker, an FFmpeg client may stream data to the broker using
+the command:
+.PP
+.Vb 1
+\& ffmpeg \-re \-i input \-f mpegts amqp://[[user]:[password]@]hostname[:port][/vhost]
+.Ve
+.PP
+Where hostname and port (default is 5672) is the address of the broker. The
+client may also set a user/password for authentication. The default for both
+fields is \*(L"guest\*(R". Name of virtual host on broker can be set with vhost. The
+default value is \*(L"/\*(R".
+.PP
+Muliple subscribers may stream from the broker using the command:
+.PP
+.Vb 1
+\& ffplay amqp://[[user]:[password]@]hostname[:port][/vhost]
+.Ve
+.PP
+In RabbitMQ all data published to the broker flows through a specific exchange,
+and each subscribing client has an assigned queue/buffer. When a packet arrives
+at an exchange, it may be copied to a client's queue depending on the exchange
+and routing_key fields.
+.PP
+The following options are supported:
+.IP "\fBexchange\fR" 4
+.IX Item "exchange"
+Sets the exchange to use on the broker. RabbitMQ has several predefined
+exchanges: \*(L"amq.direct\*(R" is the default exchange, where the publisher and
+subscriber must have a matching routing_key; \*(L"amq.fanout\*(R" is the same as a
+broadcast operation (i.e. the data is forwarded to all queues on the fanout
+exchange independent of the routing_key); and \*(L"amq.topic\*(R" is similar to
+\&\*(L"amq.direct\*(R", but allows for more complex pattern matching (refer to the RabbitMQ
+documentation).
+.IP "\fBrouting_key\fR" 4
+.IX Item "routing_key"
+Sets the routing key. The default value is \*(L"amqp\*(R". The routing key is used on
+the \*(L"amq.direct\*(R" and \*(L"amq.topic\*(R" exchanges to decide whether packets are written
+to the queue of a subscriber.
+.IP "\fBpkt_size\fR" 4
+.IX Item "pkt_size"
+Maximum size of each packet sent/received to the broker. Default is 131072.
+Minimum is 4096 and max is any large value (representable by an int). When
+receiving packets, this sets an internal buffer size in FFmpeg. It should be
+equal to or greater than the size of the published packets to the broker. Otherwise
+the received message may be truncated causing decoding errors.
+.IP "\fBconnection_timeout\fR" 4
+.IX Item "connection_timeout"
+The timeout in seconds during the initial connection to the broker. The
+default value is rw_timeout, or 5 seconds if rw_timeout is not set.
+.IP "\fBdelivery_mode\fR \fImode\fR" 4
+.IX Item "delivery_mode mode"
+Sets the delivery mode of each message sent to broker.
+The following values are accepted:
+.RS 4
+.IP "\fBpersistent\fR" 4
+.IX Item "persistent"
+Delivery mode set to \*(L"persistent\*(R" (2). This is the default value.
+Messages may be written to the broker's disk depending on its setup.
+.IP "\fBnon-persistent\fR" 4
+.IX Item "non-persistent"
+Delivery mode set to \*(L"non-persistent\*(R" (1).
+Messages will stay in broker's memory unless the broker is under memory
+pressure.
+.RE
+.RS 4
+.RE
+.SS "async"
+.IX Subsection "async"
+Asynchronous data filling wrapper for input stream.
+.PP
+Fill data in a background thread, to decouple I/O operation from demux thread.
+.PP
+.Vb 3
+\& async:
+\& async:http://host/resource
+\& async:cache:http://host/resource
+.Ve
+.SS "bluray"
+.IX Subsection "bluray"
+Read BluRay playlist.
+.PP
+The accepted options are:
+.IP "\fBangle\fR" 4
+.IX Item "angle"
+BluRay angle
+.IP "\fBchapter\fR" 4
+.IX Item "chapter"
+Start chapter (1...N)
+.IP "\fBplaylist\fR" 4
+.IX Item "playlist"
+Playlist to read (\s-1BDMV/PLAYLIST/\s0?????.mpls)
+.PP
+Examples:
+.PP
+Read longest playlist from BluRay mounted to /mnt/bluray:
+.PP
+.Vb 1
+\& bluray:/mnt/bluray
+.Ve
+.PP
+Read angle 2 of playlist 4 from BluRay mounted to /mnt/bluray, start from chapter 2:
+.PP
+.Vb 1
+\& \-playlist 4 \-angle 2 \-chapter 2 bluray:/mnt/bluray
+.Ve
+.SS "cache"
+.IX Subsection "cache"
+Caching wrapper for input stream.
+.PP
+Cache the input stream to temporary file. It brings seeking capability to live streams.
+.PP
+The accepted options are:
+.IP "\fBread_ahead_limit\fR" 4
+.IX Item "read_ahead_limit"
+Amount in bytes that may be read ahead when seeking isn't supported. Range is \-1 to \s-1INT_MAX.\s0
+\&\-1 for unlimited. Default is 65536.
+.PP
+\&\s-1URL\s0 Syntax is
+.PP
+.Vb 1
+\& cache:
+.Ve
+.SS "concat"
+.IX Subsection "concat"
+Physical concatenation protocol.
+.PP
+Read and seek from many resources in sequence as if they were
+a unique resource.
+.PP
+A \s-1URL\s0 accepted by this protocol has the syntax:
+.PP
+.Vb 1
+\& concat:||...|
+.Ve
+.PP
+where \fI\s-1URL1\s0\fR, \fI\s-1URL2\s0\fR, ..., \fI\s-1URLN\s0\fR are the urls of the
+resource to be concatenated, each one possibly specifying a distinct
+protocol.
+.PP
+For example to read a sequence of files \fIsplit1.mpeg\fR,
+\&\fIsplit2.mpeg\fR, \fIsplit3.mpeg\fR with \fBffplay\fR use the
+command:
+.PP
+.Vb 1
+\& ffplay concat:split1.mpeg\e|split2.mpeg\e|split3.mpeg
+.Ve
+.PP
+Note that you may need to escape the character \*(L"|\*(R" which is special for
+many shells.
+.SS "crypto"
+.IX Subsection "crypto"
+AES-encrypted stream reading protocol.
+.PP
+The accepted options are:
+.IP "\fBkey\fR" 4
+.IX Item "key"
+Set the \s-1AES\s0 decryption key binary block from given hexadecimal representation.
+.IP "\fBiv\fR" 4
+.IX Item "iv"
+Set the \s-1AES\s0 decryption initialization vector binary block from given hexadecimal representation.
+.PP
+Accepted \s-1URL\s0 formats:
+.PP
+.Vb 2
+\& crypto:
+\& crypto+
+.Ve
+.SS "data"
+.IX Subsection "data"
+Data in-line in the \s-1URI.\s0 See <\fBhttp://en.wikipedia.org/wiki/Data_URI_scheme\fR>.
+.PP
+For example, to convert a \s-1GIF\s0 file given inline with \fBffmpeg\fR:
+.PP
+.Vb 1
+\& ffmpeg \-i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP///////////////ywAAAAACAAIAAADF0gEDLojDgdGiJdJqUX02iB4E8Q9jUMkADs=" smiley.png
+.Ve
+.SS "file"
+.IX Subsection "file"
+File access protocol.
+.PP
+Read from or write to a file.
+.PP
+A file \s-1URL\s0 can have the form:
+.PP
+.Vb 1
+\& file:
+.Ve
+.PP
+where \fIfilename\fR is the path of the file to read.
+.PP
+An \s-1URL\s0 that does not have a protocol prefix will be assumed to be a
+file \s-1URL.\s0 Depending on the build, an \s-1URL\s0 that looks like a Windows
+path with the drive letter at the beginning will also be assumed to be
+a file \s-1URL\s0 (usually not the case in builds for unix-like systems).
+.PP
+For example to read from a file \fIinput.mpeg\fR with \fBffmpeg\fR
+use the command:
+.PP
+.Vb 1
+\& ffmpeg \-i file:input.mpeg output.mpeg
+.Ve
+.PP
+This protocol accepts the following options:
+.IP "\fBtruncate\fR" 4
+.IX Item "truncate"
+Truncate existing files on write, if set to 1. A value of 0 prevents
+truncating. Default value is 1.
+.IP "\fBblocksize\fR" 4
+.IX Item "blocksize"
+Set I/O operation maximum block size, in bytes. Default value is
+\&\f(CW\*(C`INT_MAX\*(C'\fR, which results in not limiting the requested block size.
+Setting this value reasonably low improves user termination request reaction
+time, which is valuable for files on slow medium.
+.IP "\fBfollow\fR" 4
+.IX Item "follow"
+If set to 1, the protocol will retry reading at the end of the file, allowing
+reading files that still are being written. In order for this to terminate,
+you either need to use the rw_timeout option, or use the interrupt callback
+(for \s-1API\s0 users).
+.IP "\fBseekable\fR" 4
+.IX Item "seekable"
+Controls if seekability is advertised on the file. 0 means non-seekable, \-1
+means auto (seekable for normal files, non-seekable for named pipes).
+.Sp
+Many demuxers handle seekable and non-seekable resources differently,
+overriding this might speed up opening certain files at the cost of losing some
+features (e.g. accurate seeking).
+.SS "ftp"
+.IX Subsection "ftp"
+\&\s-1FTP\s0 (File Transfer Protocol).
+.PP
+Read from or write to remote resources using \s-1FTP\s0 protocol.
+.PP
+Following syntax is required.
+.PP
+.Vb 1
+\& ftp://[user[:password]@]server[:port]/path/to/remote/resource.mpeg
+.Ve
+.PP
+This protocol accepts the following options.
+.IP "\fBtimeout\fR" 4
+.IX Item "timeout"
+Set timeout in microseconds of socket I/O operations used by the underlying low level
+operation. By default it is set to \-1, which means that the timeout is
+not specified.
+.IP "\fBftp-user\fR" 4
+.IX Item "ftp-user"
+Set a user to be used for authenticating to the \s-1FTP\s0 server. This is overridden by the
+user in the \s-1FTP URL.\s0
+.IP "\fBftp-password\fR" 4
+.IX Item "ftp-password"
+Set a password to be used for authenticating to the \s-1FTP\s0 server. This is overridden by
+the password in the \s-1FTP URL,\s0 or by \fBftp-anonymous-password\fR if no user is set.
+.IP "\fBftp-anonymous-password\fR" 4
+.IX Item "ftp-anonymous-password"
+Password used when login as anonymous user. Typically an e\-mail address
+should be used.
+.IP "\fBftp-write-seekable\fR" 4
+.IX Item "ftp-write-seekable"
+Control seekability of connection during encoding. If set to 1 the
+resource is supposed to be seekable, if set to 0 it is assumed not
+to be seekable. Default value is 0.
+.PP
+\&\s-1NOTE:\s0 Protocol can be used as output, but it is recommended to not do
+it, unless special care is taken (tests, customized server configuration
+etc.). Different \s-1FTP\s0 servers behave in different way during seek
+operation. ff* tools may produce incomplete content due to server limitations.
+.SS "gopher"
+.IX Subsection "gopher"
+Gopher protocol.
+.SS "gophers"
+.IX Subsection "gophers"
+Gophers protocol.
+.PP
+The Gopher protocol with \s-1TLS\s0 encapsulation.
+.SS "hls"
+.IX Subsection "hls"
+Read Apple \s-1HTTP\s0 Live Streaming compliant segmented stream as
+a uniform one. The M3U8 playlists describing the segments can be
+remote \s-1HTTP\s0 resources or local files, accessed using the standard
+file protocol.
+The nested protocol is declared by specifying
+"+\fIproto\fR" after the hls \s-1URI\s0 scheme name, where \fIproto\fR
+is either \*(L"file\*(R" or \*(L"http\*(R".
+.PP
+.Vb 2
+\& hls+http://host/path/to/remote/resource.m3u8
+\& hls+file://path/to/local/resource.m3u8
+.Ve
+.PP
+Using this protocol is discouraged \- the hls demuxer should work
+just as well (if not, please report the issues) and is more complete.
+To use the hls demuxer instead, simply use the direct URLs to the
+m3u8 files.
+.SS "http"
+.IX Subsection "http"
+\&\s-1HTTP\s0 (Hyper Text Transfer Protocol).
+.PP
+This protocol accepts the following options:
+.IP "\fBseekable\fR" 4
+.IX Item "seekable"
+Control seekability of connection. If set to 1 the resource is
+supposed to be seekable, if set to 0 it is assumed not to be seekable,
+if set to \-1 it will try to autodetect if it is seekable. Default
+value is \-1.
+.IP "\fBchunked_post\fR" 4
+.IX Item "chunked_post"
+If set to 1 use chunked Transfer-Encoding for posts, default is 1.
+.IP "\fBcontent_type\fR" 4
+.IX Item "content_type"
+Set a specific content type for the \s-1POST\s0 messages or for listen mode.
+.IP "\fBhttp_proxy\fR" 4
+.IX Item "http_proxy"
+set \s-1HTTP\s0 proxy to tunnel through e.g. http://example.com:1234
+.IP "\fBheaders\fR" 4
+.IX Item "headers"
+Set custom \s-1HTTP\s0 headers, can override built in default headers. The
+value must be a string encoding the headers.
+.IP "\fBmultiple_requests\fR" 4
+.IX Item "multiple_requests"
+Use persistent connections if set to 1, default is 0.
+.IP "\fBpost_data\fR" 4
+.IX Item "post_data"
+Set custom \s-1HTTP\s0 post data.
+.IP "\fBreferer\fR" 4
+.IX Item "referer"
+Set the Referer header. Include 'Referer: \s-1URL\s0' header in \s-1HTTP\s0 request.
+.IP "\fBuser_agent\fR" 4
+.IX Item "user_agent"
+Override the User-Agent header. If not specified the protocol will use a
+string describing the libavformat build. (\*(L"Lavf/\*(R")
+.IP "\fBuser-agent\fR" 4
+.IX Item "user-agent"
+This is a deprecated option, you can use user_agent instead it.
+.IP "\fBreconnect_at_eof\fR" 4
+.IX Item "reconnect_at_eof"
+If set then eof is treated like an error and causes reconnection, this is useful
+for live / endless streams.
+.IP "\fBreconnect_streamed\fR" 4
+.IX Item "reconnect_streamed"
+If set then even streamed/non seekable streams will be reconnected on errors.
+.IP "\fBreconnect_on_network_error\fR" 4
+.IX Item "reconnect_on_network_error"
+Reconnect automatically in case of \s-1TCP/TLS\s0 errors during connect.
+.IP "\fBreconnect_on_http_error\fR" 4
+.IX Item "reconnect_on_http_error"
+A comma separated list of \s-1HTTP\s0 status codes to reconnect on. The list can
+include specific status codes (e.g. '503') or the strings '4xx' / '5xx'.
+.IP "\fBreconnect_delay_max\fR" 4
+.IX Item "reconnect_delay_max"
+Sets the maximum delay in seconds after which to give up reconnecting
+.IP "\fBmime_type\fR" 4
+.IX Item "mime_type"
+Export the \s-1MIME\s0 type.
+.IP "\fBhttp_version\fR" 4
+.IX Item "http_version"
+Exports the \s-1HTTP\s0 response version number. Usually \*(L"1.0\*(R" or \*(L"1.1\*(R".
+.IP "\fBicy\fR" 4
+.IX Item "icy"
+If set to 1 request \s-1ICY\s0 (SHOUTcast) metadata from the server. If the server
+supports this, the metadata has to be retrieved by the application by reading
+the \fBicy_metadata_headers\fR and \fBicy_metadata_packet\fR options.
+The default is 1.
+.IP "\fBicy_metadata_headers\fR" 4
+.IX Item "icy_metadata_headers"
+If the server supports \s-1ICY\s0 metadata, this contains the ICY-specific \s-1HTTP\s0 reply
+headers, separated by newline characters.
+.IP "\fBicy_metadata_packet\fR" 4
+.IX Item "icy_metadata_packet"
+If the server supports \s-1ICY\s0 metadata, and \fBicy\fR was set to 1, this
+contains the last non-empty metadata packet sent by the server. It should be
+polled in regular intervals by applications interested in mid-stream metadata
+updates.
+.IP "\fBcookies\fR" 4
+.IX Item "cookies"
+Set the cookies to be sent in future requests. The format of each cookie is the
+same as the value of a Set-Cookie \s-1HTTP\s0 response field. Multiple cookies can be
+delimited by a newline character.
+.IP "\fBoffset\fR" 4
+.IX Item "offset"
+Set initial byte offset.
+.IP "\fBend_offset\fR" 4
+.IX Item "end_offset"
+Try to limit the request to bytes preceding this offset.
+.IP "\fBmethod\fR" 4
+.IX Item "method"
+When used as a client option it sets the \s-1HTTP\s0 method for the request.
+.Sp
+When used as a server option it sets the \s-1HTTP\s0 method that is going to be
+expected from the client(s).
+If the expected and the received \s-1HTTP\s0 method do not match the client will
+be given a Bad Request response.
+When unset the \s-1HTTP\s0 method is not checked for now. This will be replaced by
+autodetection in the future.
+.IP "\fBlisten\fR" 4
+.IX Item "listen"
+If set to 1 enables experimental \s-1HTTP\s0 server. This can be used to send data when
+used as an output option, or read data from a client with \s-1HTTP POST\s0 when used as
+an input option.
+If set to 2 enables experimental multi-client \s-1HTTP\s0 server. This is not yet implemented
+in ffmpeg.c and thus must not be used as a command line option.
+.Sp
+.Vb 2
+\& # Server side (sending):
+\& ffmpeg \-i somefile.ogg \-c copy \-listen 1 \-f ogg http://:
+\&
+\& # Client side (receiving):
+\& ffmpeg \-i http://: \-c copy somefile.ogg
+\&
+\& # Client can also be done with wget:
+\& wget http://: \-O somefile.ogg
+\&
+\& # Server side (receiving):
+\& ffmpeg \-listen 1 \-i http://: \-c copy somefile.ogg
+\&
+\& # Client side (sending):
+\& ffmpeg \-i somefile.ogg \-chunked_post 0 \-c copy \-f ogg http://:
+\&
+\& # Client can also be done with wget:
+\& wget \-\-post\-file=somefile.ogg http://:
+.Ve
+.IP "\fBsend_expect_100\fR" 4
+.IX Item "send_expect_100"
+Send an Expect: 100\-continue header for \s-1POST.\s0 If set to 1 it will send, if set
+to 0 it won't, if set to \-1 it will try to send if it is applicable. Default
+value is \-1.
+.IP "\fBauth_type\fR" 4
+.IX Item "auth_type"
+Set \s-1HTTP\s0 authentication type. No option for Digest, since this method requires
+getting nonce parameters from the server first and can't be used straight away like
+Basic.
+.RS 4
+.IP "\fBnone\fR" 4
+.IX Item "none"
+Choose the \s-1HTTP\s0 authentication type automatically. This is the default.
+.IP "\fBbasic\fR" 4
+.IX Item "basic"
+Choose the \s-1HTTP\s0 basic authentication.
+.Sp
+Basic authentication sends a Base64\-encoded string that contains a user name and password
+for the client. Base64 is not a form of encryption and should be considered the same as
+sending the user name and password in clear text (Base64 is a reversible encoding).
+If a resource needs to be protected, strongly consider using an authentication scheme
+other than basic authentication. \s-1HTTPS/TLS\s0 should be used with basic authentication.
+Without these additional security enhancements, basic authentication should not be used
+to protect sensitive or valuable information.
+.RE
+.RS 4
+.RE
+.PP
+\fI\s-1HTTP\s0 Cookies\fR
+.IX Subsection "HTTP Cookies"
+.PP
+Some \s-1HTTP\s0 requests will be denied unless cookie values are passed in with the
+request. The \fBcookies\fR option allows these cookies to be specified. At
+the very least, each cookie must specify a value along with a path and domain.
+\&\s-1HTTP\s0 requests that match both the domain and path will automatically include the
+cookie value in the \s-1HTTP\s0 Cookie header field. Multiple cookies can be delimited
+by a newline.
+.PP
+The required syntax to play a stream specifying a cookie is:
+.PP
+.Vb 1
+\& ffplay \-cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
+.Ve
+.SS "Icecast"
+.IX Subsection "Icecast"
+Icecast protocol (stream to Icecast servers)
+.PP
+This protocol accepts the following options:
+.IP "\fBice_genre\fR" 4
+.IX Item "ice_genre"
+Set the stream genre.
+.IP "\fBice_name\fR" 4
+.IX Item "ice_name"
+Set the stream name.
+.IP "\fBice_description\fR" 4
+.IX Item "ice_description"
+Set the stream description.
+.IP "\fBice_url\fR" 4
+.IX Item "ice_url"
+Set the stream website \s-1URL.\s0
+.IP "\fBice_public\fR" 4
+.IX Item "ice_public"
+Set if the stream should be public.
+The default is 0 (not public).
+.IP "\fBuser_agent\fR" 4
+.IX Item "user_agent"
+Override the User-Agent header. If not specified a string of the form
+\&\*(L"Lavf/\*(R" will be used.
+.IP "\fBpassword\fR" 4
+.IX Item "password"
+Set the Icecast mountpoint password.
+.IP "\fBcontent_type\fR" 4
+.IX Item "content_type"
+Set the stream content type. This must be set if it is different from
+audio/mpeg.
+.IP "\fBlegacy_icecast\fR" 4
+.IX Item "legacy_icecast"
+This enables support for Icecast versions < 2.4.0, that do not support the
+\&\s-1HTTP PUT\s0 method but the \s-1SOURCE\s0 method.
+.IP "\fBtls\fR" 4
+.IX Item "tls"
+Establish a \s-1TLS\s0 (\s-1HTTPS\s0) connection to Icecast.
+.PP
+.Vb 1
+\& icecast://[[:]@]:/
+.Ve
+.SS "mmst"
+.IX Subsection "mmst"
+\&\s-1MMS\s0 (Microsoft Media Server) protocol over \s-1TCP.\s0
+.SS "mmsh"
+.IX Subsection "mmsh"
+\&\s-1MMS\s0 (Microsoft Media Server) protocol over \s-1HTTP.\s0
+.PP
+The required syntax is:
+.PP
+.Vb 1
+\& mmsh://[:][/][/]
+.Ve
+.SS "md5"
+.IX Subsection "md5"
+\&\s-1MD5\s0 output protocol.
+.PP
+Computes the \s-1MD5\s0 hash of the data to be written, and on close writes
+this to the designated output or stdout if none is specified. It can
+be used to test muxers without writing an actual file.
+.PP
+Some examples follow.
+.PP
+.Vb 2
+\& # Write the MD5 hash of the encoded AVI file to the file output.avi.md5.
+\& ffmpeg \-i input.flv \-f avi \-y md5:output.avi.md5
+\&
+\& # Write the MD5 hash of the encoded AVI file to stdout.
+\& ffmpeg \-i input.flv \-f avi \-y md5:
+.Ve
+.PP
+Note that some formats (typically \s-1MOV\s0) require the output protocol to
+be seekable, so they will fail with the \s-1MD5\s0 output protocol.
+.SS "pipe"
+.IX Subsection "pipe"
+\&\s-1UNIX\s0 pipe access protocol.
+.PP
+Read and write from \s-1UNIX\s0 pipes.
+.PP
+The accepted syntax is:
+.PP
+.Vb 1
+\& pipe:[]
+.Ve
+.PP
+\&\fInumber\fR is the number corresponding to the file descriptor of the
+pipe (e.g. 0 for stdin, 1 for stdout, 2 for stderr). If \fInumber\fR
+is not specified, by default the stdout file descriptor will be used
+for writing, stdin for reading.
+.PP
+For example to read from stdin with \fBffmpeg\fR:
+.PP
+.Vb 3
+\& cat test.wav | ffmpeg \-i pipe:0
+\& # ...this is the same as...
+\& cat test.wav | ffmpeg \-i pipe:
+.Ve
+.PP
+For writing to stdout with \fBffmpeg\fR:
+.PP
+.Vb 3
+\& ffmpeg \-i test.wav \-f avi pipe:1 | cat > test.avi
+\& # ...this is the same as...
+\& ffmpeg \-i test.wav \-f avi pipe: | cat > test.avi
+.Ve
+.PP
+This protocol accepts the following options:
+.IP "\fBblocksize\fR" 4
+.IX Item "blocksize"
+Set I/O operation maximum block size, in bytes. Default value is
+\&\f(CW\*(C`INT_MAX\*(C'\fR, which results in not limiting the requested block size.
+Setting this value reasonably low improves user termination request reaction
+time, which is valuable if data transmission is slow.
+.PP
+Note that some formats (typically \s-1MOV\s0), require the output protocol to
+be seekable, so they will fail with the pipe output protocol.
+.SS "prompeg"
+.IX Subsection "prompeg"
+Pro-MPEG Code of Practice #3 Release 2 \s-1FEC\s0 protocol.
+.PP
+The Pro-MPEG CoP#3 \s-1FEC\s0 is a 2D parity-check forward error correction mechanism
+for \s-1MPEG\-2\s0 Transport Streams sent over \s-1RTP.\s0
+.PP
+This protocol must be used in conjunction with the \f(CW\*(C`rtp_mpegts\*(C'\fR muxer and
+the \f(CW\*(C`rtp\*(C'\fR protocol.
+.PP
+The required syntax is:
+.PP
+.Vb 1
+\& \-f rtp_mpegts \-fec prompeg==... rtp://:
+.Ve
+.PP
+The destination \s-1UDP\s0 ports are \f(CW\*(C`port + 2\*(C'\fR for the column \s-1FEC\s0 stream
+and \f(CW\*(C`port + 4\*(C'\fR for the row \s-1FEC\s0 stream.
+.PP
+This protocol accepts the following options:
+.IP "\fBl=\fR\fIn\fR" 4
+.IX Item "l=n"
+The number of columns (4\-20, LxD <= 100)
+.IP "\fBd=\fR\fIn\fR" 4
+.IX Item "d=n"
+The number of rows (4\-20, LxD <= 100)
+.PP
+Example usage:
+.PP
+.Vb 1
+\& \-f rtp_mpegts \-fec prompeg=l=8:d=4 rtp://:
+.Ve
+.SS "rist"
+.IX Subsection "rist"
+Reliable Internet Streaming Transport protocol
+.PP
+The accepted options are:
+.IP "\fBrist_profile\fR" 4
+.IX Item "rist_profile"
+Supported values:
+.RS 4
+.IP "\fBsimple\fR" 4
+.IX Item "simple"
+.PD 0
+.IP "\fBmain\fR" 4
+.IX Item "main"
+.PD
+This one is default.
+.IP "\fBadvanced\fR" 4
+.IX Item "advanced"
+.RE
+.RS 4
+.RE
+.PD 0
+.IP "\fBbuffer_size\fR" 4
+.IX Item "buffer_size"
+.PD
+Set internal \s-1RIST\s0 buffer size in milliseconds for retransmission of data.
+Default value is 0 which means the librist default (1 sec). Maximum value is 30
+seconds.
+.IP "\fBpkt_size\fR" 4
+.IX Item "pkt_size"
+Set maximum packet size for sending data. 1316 by default.
+.IP "\fBlog_level\fR" 4
+.IX Item "log_level"
+Set loglevel for \s-1RIST\s0 logging messages. You only need to set this if you
+explicitly want to enable debug level messages or packet loss simulation,
+otherwise the regular loglevel is respected.
+.IP "\fBsecret\fR" 4
+.IX Item "secret"
+Set override of encryption secret, by default is unset.
+.IP "\fBencryption\fR" 4
+.IX Item "encryption"
+Set encryption type, by default is disabled.
+Acceptable values are 128 and 256.
+.SS "rtmp"
+.IX Subsection "rtmp"
+Real-Time Messaging Protocol.
+.PP
+The Real-Time Messaging Protocol (\s-1RTMP\s0) is used for streaming multimedia
+content across a \s-1TCP/IP\s0 network.
+.PP
+The required syntax is:
+.PP
+.Vb 1
+\& rtmp://[:@][:][/][/][/]
+.Ve
+.PP
+The accepted parameters are:
+.IP "\fBusername\fR" 4
+.IX Item "username"
+An optional username (mostly for publishing).
+.IP "\fBpassword\fR" 4
+.IX Item "password"
+An optional password (mostly for publishing).
+.IP "\fBserver\fR" 4
+.IX Item "server"
+The address of the \s-1RTMP\s0 server.
+.IP "\fBport\fR" 4
+.IX Item "port"
+The number of the \s-1TCP\s0 port to use (by default is 1935).
+.IP "\fBapp\fR" 4
+.IX Item "app"
+It is the name of the application to access. It usually corresponds to
+the path where the application is installed on the \s-1RTMP\s0 server
+(e.g. \fI/ondemand/\fR, \fI/flash/live/\fR, etc.). You can override
+the value parsed from the \s-1URI\s0 through the \f(CW\*(C`rtmp_app\*(C'\fR option, too.
+.IP "\fBplaypath\fR" 4
+.IX Item "playpath"
+It is the path or name of the resource to play with reference to the
+application specified in \fIapp\fR, may be prefixed by \*(L"mp4:\*(R". You
+can override the value parsed from the \s-1URI\s0 through the \f(CW\*(C`rtmp_playpath\*(C'\fR
+option, too.
+.IP "\fBlisten\fR" 4
+.IX Item "listen"
+Act as a server, listening for an incoming connection.
+.IP "\fBtimeout\fR" 4
+.IX Item "timeout"
+Maximum time to wait for the incoming connection. Implies listen.
+.PP
+Additionally, the following parameters can be set via command line options
+(or in code via \f(CW\*(C`AVOption\*(C'\fRs):
+.IP "\fBrtmp_app\fR" 4
+.IX Item "rtmp_app"
+Name of application to connect on the \s-1RTMP\s0 server. This option
+overrides the parameter specified in the \s-1URI.\s0
+.IP "\fBrtmp_buffer\fR" 4
+.IX Item "rtmp_buffer"
+Set the client buffer time in milliseconds. The default is 3000.
+.IP "\fBrtmp_conn\fR" 4
+.IX Item "rtmp_conn"
+Extra arbitrary \s-1AMF\s0 connection parameters, parsed from a string,
+e.g. like \f(CW\*(C`B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0\*(C'\fR.
+Each value is prefixed by a single character denoting the type,
+B for Boolean, N for number, S for string, O for object, or Z for null,
+followed by a colon. For Booleans the data must be either 0 or 1 for
+\&\s-1FALSE\s0 or \s-1TRUE,\s0 respectively. Likewise for Objects the data must be 0 or
+1 to end or begin an object, respectively. Data items in subobjects may
+be named, by prefixing the type with 'N' and specifying the name before
+the value (i.e. \f(CW\*(C`NB:myFlag:1\*(C'\fR). This option may be used multiple
+times to construct arbitrary \s-1AMF\s0 sequences.
+.IP "\fBrtmp_flashver\fR" 4
+.IX Item "rtmp_flashver"
+Version of the Flash plugin used to run the \s-1SWF\s0 player. The default
+is \s-1LNX 9,0,124,2.\s0 (When publishing, the default is \s-1FMLE/3.0\s0 (compatible;
+).)
+.IP "\fBrtmp_flush_interval\fR" 4
+.IX Item "rtmp_flush_interval"
+Number of packets flushed in the same request (\s-1RTMPT\s0 only). The default
+is 10.
+.IP "\fBrtmp_live\fR" 4
+.IX Item "rtmp_live"
+Specify that the media is a live stream. No resuming or seeking in
+live streams is possible. The default value is \f(CW\*(C`any\*(C'\fR, which means the
+subscriber first tries to play the live stream specified in the
+playpath. If a live stream of that name is not found, it plays the
+recorded stream. The other possible values are \f(CW\*(C`live\*(C'\fR and
+\&\f(CW\*(C`recorded\*(C'\fR.
+.IP "\fBrtmp_pageurl\fR" 4
+.IX Item "rtmp_pageurl"
+\&\s-1URL\s0 of the web page in which the media was embedded. By default no
+value will be sent.
+.IP "\fBrtmp_playpath\fR" 4
+.IX Item "rtmp_playpath"
+Stream identifier to play or to publish. This option overrides the
+parameter specified in the \s-1URI.\s0
+.IP "\fBrtmp_subscribe\fR" 4
+.IX Item "rtmp_subscribe"
+Name of live stream to subscribe to. By default no value will be sent.
+It is only sent if the option is specified or if rtmp_live
+is set to live.
+.IP "\fBrtmp_swfhash\fR" 4
+.IX Item "rtmp_swfhash"
+\&\s-1SHA256\s0 hash of the decompressed \s-1SWF\s0 file (32 bytes).
+.IP "\fBrtmp_swfsize\fR" 4
+.IX Item "rtmp_swfsize"
+Size of the decompressed \s-1SWF\s0 file, required for SWFVerification.
+.IP "\fBrtmp_swfurl\fR" 4
+.IX Item "rtmp_swfurl"
+\&\s-1URL\s0 of the \s-1SWF\s0 player for the media. By default no value will be sent.
+.IP "\fBrtmp_swfverify\fR" 4
+.IX Item "rtmp_swfverify"
+\&\s-1URL\s0 to player swf file, compute hash/size automatically.
+.IP "\fBrtmp_tcurl\fR" 4
+.IX Item "rtmp_tcurl"
+\&\s-1URL\s0 of the target stream. Defaults to proto://host[:port]/app.
+.PP
+For example to read with \fBffplay\fR a multimedia resource named
+\&\*(L"sample\*(R" from the application \*(L"vod\*(R" from an \s-1RTMP\s0 server \*(L"myserver\*(R":
+.PP
+.Vb 1
+\& ffplay rtmp://myserver/vod/sample
+.Ve
+.PP
+To publish to a password protected server, passing the playpath and
+app names separately:
+.PP
+.Vb 1
+\& ffmpeg \-re \-i \-f flv \-rtmp_playpath some/long/path \-rtmp_app long/app/name rtmp://username:password@myserver/
+.Ve
+.SS "rtmpe"
+.IX Subsection "rtmpe"
+Encrypted Real-Time Messaging Protocol.
+.PP
+The Encrypted Real-Time Messaging Protocol (\s-1RTMPE\s0) is used for
+streaming multimedia content within standard cryptographic primitives,
+consisting of Diffie-Hellman key exchange and \s-1HMACSHA256,\s0 generating
+a pair of \s-1RC4\s0 keys.
+.SS "rtmps"
+.IX Subsection "rtmps"
+Real-Time Messaging Protocol over a secure \s-1SSL\s0 connection.
+.PP
+The Real-Time Messaging Protocol (\s-1RTMPS\s0) is used for streaming
+multimedia content across an encrypted connection.
+.SS "rtmpt"
+.IX Subsection "rtmpt"
+Real-Time Messaging Protocol tunneled through \s-1HTTP.\s0
+.PP
+The Real-Time Messaging Protocol tunneled through \s-1HTTP\s0 (\s-1RTMPT\s0) is used
+for streaming multimedia content within \s-1HTTP\s0 requests to traverse
+firewalls.
+.SS "rtmpte"
+.IX Subsection "rtmpte"
+Encrypted Real-Time Messaging Protocol tunneled through \s-1HTTP.\s0
+.PP
+The Encrypted Real-Time Messaging Protocol tunneled through \s-1HTTP\s0 (\s-1RTMPTE\s0)
+is used for streaming multimedia content within \s-1HTTP\s0 requests to traverse
+firewalls.
+.SS "rtmpts"
+.IX Subsection "rtmpts"
+Real-Time Messaging Protocol tunneled through \s-1HTTPS.\s0
+.PP
+The Real-Time Messaging Protocol tunneled through \s-1HTTPS\s0 (\s-1RTMPTS\s0) is used
+for streaming multimedia content within \s-1HTTPS\s0 requests to traverse
+firewalls.
+.SS "libsmbclient"
+.IX Subsection "libsmbclient"
+libsmbclient permits one to manipulate \s-1CIFS/SMB\s0 network resources.
+.PP
+Following syntax is required.
+.PP
+.Vb 1
+\& smb://[[domain:]user[:password@]]server[/share[/path[/file]]]
+.Ve
+.PP
+This protocol accepts the following options.
+.IP "\fBtimeout\fR" 4
+.IX Item "timeout"
+Set timeout in milliseconds of socket I/O operations used by the underlying
+low level operation. By default it is set to \-1, which means that the timeout
+is not specified.
+.IP "\fBtruncate\fR" 4
+.IX Item "truncate"
+Truncate existing files on write, if set to 1. A value of 0 prevents
+truncating. Default value is 1.
+.IP "\fBworkgroup\fR" 4
+.IX Item "workgroup"
+Set the workgroup used for making connections. By default workgroup is not specified.
+.PP
+For more information see: <\fBhttp://www.samba.org/\fR>.
+.SS "libssh"
+.IX Subsection "libssh"
+Secure File Transfer Protocol via libssh
+.PP
+Read from or write to remote resources using \s-1SFTP\s0 protocol.
+.PP
+Following syntax is required.
+.PP
+.Vb 1
+\& sftp://[user[:password]@]server[:port]/path/to/remote/resource.mpeg
+.Ve
+.PP
+This protocol accepts the following options.
+.IP "\fBtimeout\fR" 4
+.IX Item "timeout"
+Set timeout of socket I/O operations used by the underlying low level
+operation. By default it is set to \-1, which means that the timeout
+is not specified.
+.IP "\fBtruncate\fR" 4
+.IX Item "truncate"
+Truncate existing files on write, if set to 1. A value of 0 prevents
+truncating. Default value is 1.
+.IP "\fBprivate_key\fR" 4
+.IX Item "private_key"
+Specify the path of the file containing private key to use during authorization.
+By default libssh searches for keys in the \fI~/.ssh/\fR directory.
+.PP
+Example: Play a file stored on remote server.
+.PP
+.Vb 1
+\& ffplay sftp://user:password@server_address:22/home/user/resource.mpeg
+.Ve
+.SS "librtmp rtmp, rtmpe, rtmps, rtmpt, rtmpte"
+.IX Subsection "librtmp rtmp, rtmpe, rtmps, rtmpt, rtmpte"
+Real-Time Messaging Protocol and its variants supported through
+librtmp.
+.PP
+Requires the presence of the librtmp headers and library during
+configuration. You need to explicitly configure the build with
+\&\*(L"\-\-enable\-librtmp\*(R". If enabled this will replace the native \s-1RTMP\s0
+protocol.
+.PP
+This protocol provides most client functions and a few server
+functions needed to support \s-1RTMP, RTMP\s0 tunneled in \s-1HTTP\s0 (\s-1RTMPT\s0),
+encrypted \s-1RTMP\s0 (\s-1RTMPE\s0), \s-1RTMP\s0 over \s-1SSL/TLS\s0 (\s-1RTMPS\s0) and tunneled
+variants of these encrypted types (\s-1RTMPTE, RTMPTS\s0).
+.PP
+The required syntax is:
+.PP
+.Vb 1
+\& ://[:][/][/]
+.Ve
+.PP
+where \fIrtmp_proto\fR is one of the strings \*(L"rtmp\*(R", \*(L"rtmpt\*(R", \*(L"rtmpe\*(R",
+\&\*(L"rtmps\*(R", \*(L"rtmpte\*(R", \*(L"rtmpts\*(R" corresponding to each \s-1RTMP\s0 variant, and
+\&\fIserver\fR, \fIport\fR, \fIapp\fR and \fIplaypath\fR have the same
+meaning as specified for the \s-1RTMP\s0 native protocol.
+\&\fIoptions\fR contains a list of space-separated options of the form
+\&\fIkey\fR=\fIval\fR.
+.PP
+See the librtmp manual page (man 3 librtmp) for more information.
+.PP
+For example, to stream a file in real-time to an \s-1RTMP\s0 server using
+\&\fBffmpeg\fR:
+.PP
+.Vb 1
+\& ffmpeg \-re \-i myfile \-f flv rtmp://myserver/live/mystream
+.Ve
+.PP
+To play the same stream using \fBffplay\fR:
+.PP
+.Vb 1
+\& ffplay "rtmp://myserver/live/mystream live=1"
+.Ve
+.SS "rtp"
+.IX Subsection "rtp"
+Real-time Transport Protocol.
+.PP
+The required syntax for an \s-1RTP URL\s0 is:
+rtp://\fIhostname\fR[:\fIport\fR][?\fIoption\fR=\fIval\fR...]
+.PP
+\&\fIport\fR specifies the \s-1RTP\s0 port to use.
+.PP
+The following \s-1URL\s0 options are supported:
+.IP "\fBttl=\fR\fIn\fR" 4
+.IX Item "ttl=n"
+Set the \s-1TTL\s0 (Time-To-Live) value (for multicast only).
+.IP "\fBrtcpport=\fR\fIn\fR" 4
+.IX Item "rtcpport=n"
+Set the remote \s-1RTCP\s0 port to \fIn\fR.
+.IP "\fBlocalrtpport=\fR\fIn\fR" 4
+.IX Item "localrtpport=n"
+Set the local \s-1RTP\s0 port to \fIn\fR.
+.IP "\fBlocalrtcpport=\fR\fIn\fR\fB'\fR" 4
+.IX Item "localrtcpport=n'"
+Set the local \s-1RTCP\s0 port to \fIn\fR.
+.IP "\fBpkt_size=\fR\fIn\fR" 4
+.IX Item "pkt_size=n"
+Set max packet size (in bytes) to \fIn\fR.
+.IP "\fBbuffer_size=\fR\fIsize\fR" 4
+.IX Item "buffer_size=size"
+Set the maximum \s-1UDP\s0 socket buffer size in bytes.
+.IP "\fBconnect=0|1\fR" 4
+.IX Item "connect=0|1"
+Do a \f(CW\*(C`connect()\*(C'\fR on the \s-1UDP\s0 socket (if set to 1) or not (if set
+to 0).
+.IP "\fBsources=\fR\fIip\fR\fB[,\fR\fIip\fR\fB]\fR" 4
+.IX Item "sources=ip[,ip]"
+List allowed source \s-1IP\s0 addresses.
+.IP "\fBblock=\fR\fIip\fR\fB[,\fR\fIip\fR\fB]\fR" 4
+.IX Item "block=ip[,ip]"
+List disallowed (blocked) source \s-1IP\s0 addresses.
+.IP "\fBwrite_to_source=0|1\fR" 4
+.IX Item "write_to_source=0|1"
+Send packets to the source address of the latest received packet (if
+set to 1) or to a default remote address (if set to 0).
+.IP "\fBlocalport=\fR\fIn\fR" 4
+.IX Item "localport=n"
+Set the local \s-1RTP\s0 port to \fIn\fR.
+.IP "\fBtimeout=\fR\fIn\fR" 4
+.IX Item "timeout=n"
+Set timeout (in microseconds) of socket I/O operations to \fIn\fR.
+.Sp
+This is a deprecated option. Instead, \fBlocalrtpport\fR should be
+used.
+.PP
+Important notes:
+.IP "1." 4
+If \fBrtcpport\fR is not set the \s-1RTCP\s0 port will be set to the \s-1RTP\s0
+port value plus 1.
+.IP "2." 4
+If \fBlocalrtpport\fR (the local \s-1RTP\s0 port) is not set any available
+port will be used for the local \s-1RTP\s0 and \s-1RTCP\s0 ports.
+.IP "3." 4
+If \fBlocalrtcpport\fR (the local \s-1RTCP\s0 port) is not set it will be
+set to the local \s-1RTP\s0 port value plus 1.
+.SS "rtsp"
+.IX Subsection "rtsp"
+Real-Time Streaming Protocol.
+.PP
+\&\s-1RTSP\s0 is not technically a protocol handler in libavformat, it is a demuxer
+and muxer. The demuxer supports both normal \s-1RTSP\s0 (with data transferred
+over \s-1RTP\s0; this is used by e.g. Apple and Microsoft) and Real-RTSP (with
+data transferred over \s-1RDT\s0).
+.PP
+The muxer can be used to send a stream using \s-1RTSP ANNOUNCE\s0 to a server
+supporting it (currently Darwin Streaming Server and Mischa Spiegelmock's
+<\fBhttps://github.com/revmischa/rtsp\-server\fR>).
+.PP
+The required syntax for a \s-1RTSP\s0 url is:
+.PP
+.Vb 1
+\& rtsp://[:]/
+.Ve
+.PP
+Options can be set on the \fBffmpeg\fR/\fBffplay\fR command
+line, or set in code via \f(CW\*(C`AVOption\*(C'\fRs or in
+\&\f(CW\*(C`avformat_open_input\*(C'\fR.
+.PP
+The following options are supported.
+.IP "\fBinitial_pause\fR" 4
+.IX Item "initial_pause"
+Do not start playing the stream immediately if set to 1. Default value
+is 0.
+.IP "\fBrtsp_transport\fR" 4
+.IX Item "rtsp_transport"
+Set \s-1RTSP\s0 transport protocols.
+.Sp
+It accepts the following values:
+.RS 4
+.IP "\fBudp\fR" 4
+.IX Item "udp"
+Use \s-1UDP\s0 as lower transport protocol.
+.IP "\fBtcp\fR" 4
+.IX Item "tcp"
+Use \s-1TCP\s0 (interleaving within the \s-1RTSP\s0 control channel) as lower
+transport protocol.
+.IP "\fBudp_multicast\fR" 4
+.IX Item "udp_multicast"
+Use \s-1UDP\s0 multicast as lower transport protocol.
+.IP "\fBhttp\fR" 4
+.IX Item "http"
+Use \s-1HTTP\s0 tunneling as lower transport protocol, which is useful for
+passing proxies.
+.RE
+.RS 4
+.Sp
+Multiple lower transport protocols may be specified, in that case they are
+tried one at a time (if the setup of one fails, the next one is tried).
+For the muxer, only the \fBtcp\fR and \fBudp\fR options are supported.
+.RE
+.IP "\fBrtsp_flags\fR" 4
+.IX Item "rtsp_flags"
+Set \s-1RTSP\s0 flags.
+.Sp
+The following values are accepted:
+.RS 4
+.IP "\fBfilter_src\fR" 4
+.IX Item "filter_src"
+Accept packets only from negotiated peer address and port.
+.IP "\fBlisten\fR" 4
+.IX Item "listen"
+Act as a server, listening for an incoming connection.
+.IP "\fBprefer_tcp\fR" 4
+.IX Item "prefer_tcp"
+Try \s-1TCP\s0 for \s-1RTP\s0 transport first, if \s-1TCP\s0 is available as \s-1RTSP RTP\s0 transport.
+.RE
+.RS 4
+.Sp
+Default value is \fBnone\fR.
+.RE
+.IP "\fBallowed_media_types\fR" 4
+.IX Item "allowed_media_types"
+Set media types to accept from the server.
+.Sp
+The following flags are accepted:
+.RS 4
+.IP "\fBvideo\fR" 4
+.IX Item "video"
+.PD 0
+.IP "\fBaudio\fR" 4
+.IX Item "audio"
+.IP "\fBdata\fR" 4
+.IX Item "data"
+.RE
+.RS 4
+.PD
+.Sp
+By default it accepts all media types.
+.RE
+.IP "\fBmin_port\fR" 4
+.IX Item "min_port"
+Set minimum local \s-1UDP\s0 port. Default value is 5000.
+.IP "\fBmax_port\fR" 4
+.IX Item "max_port"
+Set maximum local \s-1UDP\s0 port. Default value is 65000.
+.IP "\fBtimeout\fR" 4
+.IX Item "timeout"
+Set maximum timeout (in seconds) to wait for incoming connections.
+.Sp
+A value of \-1 means infinite (default). This option implies the
+\&\fBrtsp_flags\fR set to \fBlisten\fR.
+.IP "\fBreorder_queue_size\fR" 4
+.IX Item "reorder_queue_size"
+Set number of packets to buffer for handling of reordered packets.
+.IP "\fBstimeout\fR" 4
+.IX Item "stimeout"
+Set socket \s-1TCP I/O\s0 timeout in microseconds.
+.IP "\fBuser-agent\fR" 4
+.IX Item "user-agent"
+Override User-Agent header. If not specified, it defaults to the
+libavformat identifier string.
+.PP
+When receiving data over \s-1UDP,\s0 the demuxer tries to reorder received packets
+(since they may arrive out of order, or packets may get lost totally). This
+can be disabled by setting the maximum demuxing delay to zero (via
+the \f(CW\*(C`max_delay\*(C'\fR field of AVFormatContext).
+.PP
+When watching multi-bitrate Real-RTSP streams with \fBffplay\fR, the
+streams to display can be chosen with \f(CW\*(C`\-vst\*(C'\fR \fIn\fR and
+\&\f(CW\*(C`\-ast\*(C'\fR \fIn\fR for video and audio respectively, and can be switched
+on the fly by pressing \f(CW\*(C`v\*(C'\fR and \f(CW\*(C`a\*(C'\fR.
+.PP
+\fIExamples\fR
+.IX Subsection "Examples"
+.PP
+The following examples all make use of the \fBffplay\fR and
+\&\fBffmpeg\fR tools.
+.IP "\(bu" 4
+Watch a stream over \s-1UDP,\s0 with a max reordering delay of 0.5 seconds:
+.Sp
+.Vb 1
+\& ffplay \-max_delay 500000 \-rtsp_transport udp rtsp://server/video.mp4
+.Ve
+.IP "\(bu" 4
+Watch a stream tunneled over \s-1HTTP:\s0
+.Sp
+.Vb 1
+\& ffplay \-rtsp_transport http rtsp://server/video.mp4
+.Ve
+.IP "\(bu" 4
+Send a stream in realtime to a \s-1RTSP\s0 server, for others to watch:
+.Sp
+.Vb 1
+\& ffmpeg \-re \-i \-f rtsp \-muxdelay 0.1 rtsp://server/live.sdp
+.Ve
+.IP "\(bu" 4
+Receive a stream in realtime:
+.Sp
+.Vb 1
+\& ffmpeg \-rtsp_flags listen \-i rtsp://ownaddress/live.sdp
+.Ve
+.SS "sap"
+.IX Subsection "sap"
+Session Announcement Protocol (\s-1RFC 2974\s0). This is not technically a
+protocol handler in libavformat, it is a muxer and demuxer.
+It is used for signalling of \s-1RTP\s0 streams, by announcing the \s-1SDP\s0 for the
+streams regularly on a separate port.
+.PP
+\fIMuxer\fR
+.IX Subsection "Muxer"
+.PP
+The syntax for a \s-1SAP\s0 url given to the muxer is:
+.PP
+.Vb 1
+\& sap://[: