Project import
diff --git a/jaspertv_gpl_out/Nest.app/Assets.car b/jaspertv_gpl_out/Nest.app/Assets.car new file mode 100644 index 0000000..0eea610 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Assets.car Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/DCAPIServiceResources.bundle/Dropcam.momd/Dropcam.mom b/jaspertv_gpl_out/Nest.app/DCAPIServiceResources.bundle/Dropcam.momd/Dropcam.mom new file mode 100644 index 0000000..59e3734 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/DCAPIServiceResources.bundle/Dropcam.momd/Dropcam.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/DCAPIServiceResources.bundle/Dropcam.momd/VersionInfo.plist b/jaspertv_gpl_out/Nest.app/DCAPIServiceResources.bundle/Dropcam.momd/VersionInfo.plist new file mode 100644 index 0000000..19a1c07 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/DCAPIServiceResources.bundle/Dropcam.momd/VersionInfo.plist Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/Info.plist b/jaspertv_gpl_out/Nest.app/Info.plist new file mode 100644 index 0000000..7a72274 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Info.plist Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/Jasper-warnings.xcconfig b/jaspertv_gpl_out/Nest.app/Jasper-warnings.xcconfig new file mode 100644 index 0000000..023d40d --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Jasper-warnings.xcconfig
@@ -0,0 +1,92 @@ +WARNING_CFLAGS0 = -Weverything +WARNING_CFLAGS1 = -Wno-objc-interface-ivars +WARNING_CFLAGS2 = -Wno-gnu +WARNING_CFLAGS3 = -Wno-direct-ivar-access +WARNING_CFLAGS4 = -Wno-objc-missing-property-synthesis +WARNING_CFLAGS5 = -Wno-covered-switch-default +WARNING_CFLAGS6 = -Wno-float-equal +WARNING_CFLAGS7 = -Wno-language-extension-token +WARNING_CFLAGS8 = -Wno-assign-enum +WARNING_CFLAGS9 = -Wno-implicit-retain-self +WARNING_CFLAGS10 = -Wno-used-but-marked-unused +WARNING_CFLAGS11 = -Wno-format-nonliteral +WARNING_CFLAGS12 = -Wno-documentation +WARNING_CFLAGS13 = -Wno-sign-compare +WARNING_CFLAGS14 = -Wno-vla +WARNING_CFLAGS15 = -Wno-nullability-completeness +WARNING_CFLAGS16 = -Wno-nullable-to-nonnull-conversion +WARNING_CFLAGS17 = -Wno-unknown-warning-option +WARNING_CFLAGS18 = -Wno-reserved-id-macro +WARNING_CFLAGS19 = -Wno-objc-designated-initializers +WARNING_CFLAGS20 = -Wno-double-promotion +WARNING_CFLAGS21 = -Wno-auto-import +WARNING_CFLAGS22 = -Wno-documentation-unknown-command +WARNING_CFLAGS23 = -Wno-undef + +// Please append new flags in the format above WARNING_CGFLAGS### = -W****** +// And add it to the end with an increasing count so all branches can easily +// consume and adapt to merging conflicts going foward. +WARNING_CFLAGS = $(WARNING_CFLAGS0) $(WARNING_CFLAGS1) $(WARNING_CFLAGS2) $(WARNING_CFLAGS3) $(WARNING_CFLAGS4) $(WARNING_CFLAGS5) $(WARNING_CFLAGS6) $(WARNING_CFLAGS7) $(WARNING_CFLAGS8) $(WARNING_CFLAGS9) $(WARNING_CFLAGS10) $(WARNING_CFLAGS11) $(WARNING_CFLAGS12) $(WARNING_CFLAGS13) $(WARNING_CFLAGS14) $(WARNING_CFLAGS15) $(WARNING_CFLAGS16) $(WARNING_CFLAGS17) $(WARNING_CFLAGS18) $(WARNING_CFLAGS19) $(WARNING_CFLAGS20) $(WARNING_CFLAGS21) $(WARNING_CFLAGS22) $(WARNING_CFLAGS23) + +GCC_WARN_64_TO_32_BIT_CONVERSION = YES + +GCC_WARN_INHIBIT_ALL_WARNINGS = NO +GCC_WARN_PEDANTIC = NO +GCC_TREAT_WARNINGS_AS_ERRORS = YES +GCC_WARN_CHECK_SWITCH_STATEMENTS = YES +GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO + +// This will check your comments to make sure the @param matches the actual interface +CLANG_WARN_DOCUMENTATION_COMMENTS = NO + +CLANG_WARN_EMPTY_BODY = YES +GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES +GCC_WARN_SHADOW = NO +CLANG_WARN_BOOL_CONVERSION = YES +CLANG_WARN_CONSTANT_CONVERSION = YES +CLANG_WARN_ENUM_CONVERSION = YES +CLANG_WARN_INT_CONVERSION = YES +CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO +GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_MISSING_PARENTHESES = YES +GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES +GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO +GCC_WARN_ABOUT_MISSING_NEWLINE = NO +CLANG_WARN_ASSIGN_ENUM = NO +GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES +GCC_WARN_SIGN_COMPARE = YES + +// might be a no +CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO +GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES +GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES +GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE +GCC_WARN_UNKNOWN_PRAGMAS = YES +CLANG_WARN_UNREACHABLE_CODE = YES +GCC_WARN_UNUSED_FUNCTION = YES +GCC_WARN_UNUSED_LABEL = YES +GCC_WARN_UNUSED_PARAMETER = NO +GCC_WARN_UNUSED_VALUE = YES +GCC_WARN_UNUSED_VARIABLE = YES +CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES +GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES +GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES +GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES +CLANG_WARN_CXX0X_EXTENSIONS = YES +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES +CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES +GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES +GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO +CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES +GCC_WARN_STRICT_SELECTOR_MATCH = NO +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_WARN_OBJC_ROOT_CLASS = YES +CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO +CLANG_WARN_OBJC_RECEIVER_WEAK = NO +CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES
diff --git a/jaspertv_gpl_out/Nest.app/Localizable_en_GB.strings b/jaspertv_gpl_out/Nest.app/Localizable_en_GB.strings new file mode 100644 index 0000000..72e075e --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Localizable_en_GB.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/Localizable_fr_CA.strings b/jaspertv_gpl_out/Nest.app/Localizable_fr_CA.strings new file mode 100644 index 0000000..0bfe4b9 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Localizable_fr_CA.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest.mom new file mode 100644 index 0000000..0440fdc --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest.omo b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest.omo new file mode 100644 index 0000000..a928aae --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest.omo Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest2.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest2.mom new file mode 100644 index 0000000..747d6f4 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/Nest2.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/VersionInfo.plist b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/VersionInfo.plist new file mode 100644 index 0000000..1456e17 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/50model.momd/VersionInfo.plist Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest.mom new file mode 100644 index 0000000..170c235 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest.omo b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest.omo new file mode 100644 index 0000000..bccd900 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest.omo Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest2.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest2.mom new file mode 100644 index 0000000..747d6f4 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/Nest2.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/VersionInfo.plist b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/VersionInfo.plist new file mode 100644 index 0000000..5dc4777 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/VersionInfo.plist Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.1.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.1.0-Nest.mom new file mode 100644 index 0000000..e217338 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.1.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.2.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.2.0-Nest.mom new file mode 100644 index 0000000..672b114 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.2.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.3.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.3.0-Nest.mom new file mode 100644 index 0000000..d9a164d --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.3.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.4.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.4.0-Nest.mom new file mode 100644 index 0000000..346c90b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.4.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.5.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.5.0-Nest.mom new file mode 100644 index 0000000..23e3249 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.5.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.6.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.6.0-Nest.mom new file mode 100644 index 0000000..5f75531 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.6.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.7.0-Nest.mom b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.7.0-Nest.mom new file mode 100644 index 0000000..2d5edf7 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLModelCoreResources.bundle/Nest.momd/product_5.7.0-Nest.mom Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratFiguresPi-Medium.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratFiguresPi-Medium.otf new file mode 100644 index 0000000..63ac87a --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratFiguresPi-Medium.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratNestBeta-Bold.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratNestBeta-Bold.otf new file mode 100644 index 0000000..05f6a65 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratNestBeta-Bold.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratNestBeta-Regular.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratNestBeta-Regular.otf new file mode 100644 index 0000000..3afb005 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratNestBeta-Regular.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-BoldItalic.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-BoldItalic.otf new file mode 100755 index 0000000..c4b2130 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-BoldItalic.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-Italic.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-Italic.otf new file mode 100755 index 0000000..f561eea --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-Italic.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-LightItalic.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-LightItalic.otf new file mode 100755 index 0000000..c45662d --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratPro-LightItalic.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratProLight.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratProLight.otf new file mode 100755 index 0000000..8ec9d68 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/AkkuratProLight.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/Localizable.strings b/jaspertv_gpl_out/Nest.app/NLUI.bundle/Localizable.strings new file mode 100644 index 0000000..3d19255 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/Localizable.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo.png b/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo.png new file mode 100644 index 0000000..4698f20 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo@2x.png b/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo@2x.png new file mode 100644 index 0000000..ca0ef5a --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo@2x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo@3x.png b/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo@3x.png new file mode 100644 index 0000000..506063b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/coreui_navigation_logo@3x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratFiguresPi-Medium.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratFiguresPi-Medium.otf new file mode 100644 index 0000000..63ac87a --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratFiguresPi-Medium.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratNestBeta-Bold.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratNestBeta-Bold.otf new file mode 100644 index 0000000..05f6a65 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratNestBeta-Bold.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratNestBeta-Regular.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratNestBeta-Regular.otf new file mode 100644 index 0000000..3afb005 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratNestBeta-Regular.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-BoldItalic.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-BoldItalic.otf new file mode 100755 index 0000000..c4b2130 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-BoldItalic.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-Italic.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-Italic.otf new file mode 100755 index 0000000..f561eea --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-Italic.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-LightItalic.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-LightItalic.otf new file mode 100755 index 0000000..c45662d --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratPro-LightItalic.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratProLight.otf b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratProLight.otf new file mode 100755 index 0000000..8ec9d68 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/fonts/AkkuratProLight.otf Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo.png b/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo.png new file mode 100644 index 0000000..8d3cb35 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo@2x.png b/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo@2x.png new file mode 100644 index 0000000..86ae359 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo@2x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo@3x.png b/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo@3x.png new file mode 100644 index 0000000..10813f3 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLUI.bundle/images/coreui_navigation_logo@3x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/WxProceduralDescription.json b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/WxProceduralDescription.json new file mode 100644 index 0000000..ac609f1 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/WxProceduralDescription.json
@@ -0,0 +1,1762 @@ +{ + "WX_TYPES": { + "WX_DESC_RAIN_DAY": [ + { + "weatherType": 3, + "birthRate": 85, + "imageName": "raindrop_small", + "particleLifetime": 15, + "scale": 0.6, + "scaleRange": 0.2, + "alpha": 0.8, + "alphaRange": 0.2, + "speed": -750, + "speedRange": 100, + "emissionAngle": 0.01, + "emissionAngleRange": 0.03, + "yAcceleration": 0, + "xAcceleration": 0 + }, + { + "weatherType": 3, + "birthRate": 11, + "imageName": "raindrop_large", + "particleLifetime": 15, + "scale": 0.20, + "scaleRange": 0.1, + "alpha": 0.51, + "alphaRange": 0.13, + "speed": -950, + "speedRange": 70, + "emissionAngle": 0.02, + "emissionAngleRange": 0.0, + "yAcceleration": 0, + "xAcceleration": 0 + }, + { + "weatherType": 2, + "birthRate": 0.02, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.02, + "imageName": "cloudbase6", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudpuff10", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudbase5", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 120 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudpuff11", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 120 + }, + { + "weatherType": 2, + "birthRate": 0.01, + "imageName": "cloudbg3", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 130, + "height": 120 + }, + { + "weatherType": 2, + "birthRate": 0.01, + "imageName": "cloudbase4", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 130, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.01, + "imageName": "cloudpuff12", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 130, + "height": 110 + } + ], + "WX_DESC_RAIN_NIGHT": [ + { + "weatherType": 3, + "birthRate": 85, + "imageName": "raindrop_small", + "particleLifetime": 15, + "scale": 0.5, + "scaleRange": 0.05, + "alpha": 0.3, + "alphaRange": 0.15, + "speed": -750, + "speedRange": 100, + "emissionAngle": -0.01, + "emissionAngleRange": 0.01, + "yAcceleration": 0, + "xAcceleration": 0 + }, + { + "weatherType": 3, + "birthRate": 11, + "imageName": "raindrop_large", + "particleLifetime": 15, + "scale": 0.15, + "scaleRange": 0.05, + "alpha": 0.21, + "alphaRange": 0.21, + "speed": -950, + "speedRange": 70, + "emissionAngle": 0.02, + "emissionAngleRange": 0.0, + "yAcceleration": 0, + "xAcceleration": 0 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudbase6", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudpuff10", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.04, + "imageName": "cloudbase5", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.04, + "imageName": "cloudpuff11", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudbg3", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 130, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudbase4", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 130, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.035, + "imageName": "cloudpuff12", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.018, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 130, + "height": 110 + } + ], + "WX_DESC_SNOW_DAY": [ + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbase6", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbg4", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 4, + "birthRate": 0.4, + "imageName": "snowflake_round", + "particleLifetime": 200, + "scale": 0.10, + "scaleRange": 0.2, + "alpha": 0.05, + "alphaRange": 0.02, + "speed": -25, + "speedRange": 5, + "emissionAngle": -0.1, + "emissionAngleRange": 0.11, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": 0.5, + "spinRange": 0.2 + }, + { + "weatherType": 4, + "birthRate": 0.45, + "imageName": "snowflake_large", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.4, + "alpha": 0.07, + "alphaRange": 0.02, + "speed": -85, + "speedRange": 40, + "emissionAngle": 0.1, + "emissionAngleRange": 0.1, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": -0.3, + "spinRange": 0.2 + }, + { + "weatherType": 4, + "birthRate": 1.7, + "imageName": "snowflake_small", + "particleLifetime": 200, + "scale": 0.85, + "scaleRange": 0.5, + "alpha": 0.08, + "alphaRange": 0.05, + "speed": -40, + "speedRange": 25, + "emissionAngle": -0.1, + "emissionAngleRange": 0.11, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": 0.5, + "spinRange": 0.2 + } + ], + "WX_DESC_SNOW_NIGHT": [ + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbase6", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbg3", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 4, + "birthRate": 0.4, + "imageName": "snowflake_round", + "particleLifetime": 200, + "scale": 0.10, + "scaleRange": 0.2, + "alpha": 0.05, + "alphaRange": 0.02, + "speed": -25, + "speedRange": 5, + "emissionAngle": -0.1, + "emissionAngleRange": 0.11, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": 0.5, + "spinRange": 0.2 + }, + { + "weatherType": 4, + "birthRate": 0.45, + "imageName": "snowflake_large", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.01, + "speed": -85, + "speedRange": 40, + "emissionAngle": 0.1, + "emissionAngleRange": 0.1, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": -0.3, + "spinRange": 0.2 + }, + { + "weatherType": 4, + "birthRate": 1.7, + "imageName": "snowflake_small", + "particleLifetime": 200, + "scale": 0.85, + "scaleRange": 0.5, + "alpha": 0.07, + "alphaRange": 0.04, + "speed": -40, + "speedRange": 25, + "emissionAngle": -0.1, + "emissionAngleRange": 0.11, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": 0.5, + "spinRange" : 0.2 + } + ], + "WX_DESC_CLOUDY_DAY":[ + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbase7", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.5, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 4, + "speedRange": 4, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 180, + "height": 90 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudpuff10", + "particleLifetime": 200, + "scale": 0.9, + "scaleRange": 0.5, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 4, + "speedRange": 4, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 180, + "height": 90 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.5, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 180, + "height": 90 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbg3", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.3, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 180, + "height": 90 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudbase8", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 30, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudbase9", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 30, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudpuff9", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 30, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudbase1", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.3, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 7, + "speedRange": 7, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.06, + "alphaRange": 0.06, + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudpuff1", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.4, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 7, + "speedRange": 7, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudpuff2", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.3, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudbase3", + "particleLifetime": 200, + "scale": 0.3, + "scaleRange": 0.2, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.06, + "imageName": "cloudpuff3", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.3, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.06, + "imageName": "cloudpuff4", + "particleLifetime": 200, + "scale": 0.25, + "scaleRange": 0.2, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 11, + "speedRange": 11, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.06, + "imageName": "cloudbase9", + "particleLifetime": 200, + "scale": 0.2, + "scaleRange": 0.2, + "alpha": 0.1, + "alphaRange": 0.1 , + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudpuff5", + "particleLifetime": 200, + "scale": 0.5, + "scaleRange": 0.3, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudpuff6", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.3, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.09, + "imageName": "cloudpuff11", + "particleLifetime": 200, + "scale": 0.9, + "scaleRange": 0.4, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 11, + "speedRange": 11, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + } + ], + "WX_DESC_CLOUDY_NIGHT":[ + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbase7", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 8, + "speedRange": 8, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 150, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudpuff10", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.03, + "speed": 8, + "speedRange": 8, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 150, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.06, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 0.9, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.05, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 150, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.06, + "imageName": "cloudbg3", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.2, + "alpha": 0.03, + "alphaRange": 0.05, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 150, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudbase8", + "particleLifetime": 200, + "scale": 0.5, + "scaleRange": 0.3, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 30, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudbase9", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.3, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 30, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudpuff9", + "particleLifetime": 200, + "scale": 0.7, + "scaleRange": 0.3, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 30, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudbase1", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.2, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 7, + "speedRange": 7, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.3, + "alpha": 0.03, + "alphaRange": 0.03, + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 50 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudpuff1", + "particleLifetime": 200, + "scale": 0.3, + "scaleRange": 0.4, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 7, + "speedRange": 7, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudpuff2", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.2, + "alpha": 0.10, + "alphaRange": 0.10, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbase3", + "particleLifetime": 200, + "scale": 0.3, + "scaleRange": 0.2, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudpuff3", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.3, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudpuff4", + "particleLifetime": 200, + "scale": 0.25, + "scaleRange": 0.2, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 11, + "speedRange": 11, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 80, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.05, + "imageName": "cloudbase9", + "particleLifetime": 200, + "scale": 0.2, + "scaleRange": 0.2, + "alpha": 0.05, + "alphaRange": 0.08 , + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudpuff5", + "particleLifetime": 200, + "scale": 0.5, + "scaleRange": 0.3, + "alpha": 0.05, + "alphaRange": 0.08, + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudpuff6", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.3, + "alpha": 0.05, + "alphaRange": 0.08, + "speed": 9, + "speedRange": 9, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 70, + "height": 40 + }, + { + "weatherType": 2, + "birthRate": 0.08, + "imageName": "cloudpuff11", + "particleLifetime": 200, + "scale": 0.9, + "scaleRange": 0.4, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 11, + "speedRange": 11, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 60, + "height": 40 + } + ], + "WX_DESC_PARTLY_CLOUDY_DAY":[ + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudbase7", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 8, + "speedRange": 8, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 160, + "height": 140 + }, + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudpuff10", + "particleLifetime": 200, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.03, + "speed": 8, + "speedRange": 8, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 170, + "height": 130 + }, + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 0.9, + "scaleRange": 0.4, + "alpha": 0.03, + "alphaRange": 0.05, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 180, + "height": 120 + }, + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 0.4, + "scaleRange": 0.2, + "alpha": 0.03, + "alphaRange": 0.05, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 190, + "height": 110 + }, + { + "weatherType": 1, + "birthRate": 0.025, + "imageName": "cloudpuff7", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.25, + "alphaRange": 0.2, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 40, + "height": 100 + }, + { + "weatherType": 1, + "birthRate": 0.025, + "imageName": "cloudbg3", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 4, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 50 + }, + { + "weatherType": 1, + "birthRate": 0.01, + "imageName": "cloudpuff5", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.25, + "alphaRange": 0.2, + "speed": 2, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 160 + }, + { + "weatherType": 1, + "birthRate": 0.01, + "imageName": "cloudpuff9", + "particleLifetime": 500, + "scale": 0.7, + "scaleRange": 0.5, + "alpha": 0.25, + "alphaRange": 0.2, + "speed": 5, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 160 + }, + { + "weatherType": 1, + "birthRate": 0.01, + "imageName": "cloudpuff1", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.5, + "alpha": 0.25, + "alphaRange": 0.2, + "speed": 7, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 160 + } + ], + "WX_DESC_PARTLY_CLOUDY_NIGHT":[ + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudbase7", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.007, + "alphaRange": 0.003, + "speed": 8, + "speedRange": 8, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 160, + "height": 140 + }, + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudpuff10", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.007, + "alphaRange": 0.003, + "speed": 8, + "speedRange": 8, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 170, + "height": 130 + }, + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.007, + "alphaRange": 0.003, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 180, + "height": 120 + }, + { + "weatherType": 1, + "birthRate": 0.08, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 0.3, + "scaleRange": 0.2, + "alpha": 0.007, + "alphaRange": 0.003, + "speed": 6, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 190, + "height": 110 + }, + { + "weatherType": 1, + "birthRate": 0.025, + "imageName": "cloudpuff7", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 5, + "speedRange": 5, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 40, + "height": 100 + }, + { + "weatherType": 1, + "birthRate": 0.025, + "imageName": "cloudbg3", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.02, + "alphaRange": 0.02, + "speed": 4, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 50 + }, + { + "weatherType": 1, + "birthRate": 0.01, + "imageName": "cloudpuff5", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.4, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 2, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 160 + }, + { + "weatherType": 1, + "birthRate": 0.01, + "imageName": "cloudpuff9", + "particleLifetime": 500, + "scale": 0.7, + "scaleRange": 0.5, + "alpha": 0.1, + "alphaRange": 0.1, + "speed": 5, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 160 + }, + { + "weatherType": 1, + "birthRate": 0.01, + "imageName": "cloudpuff1", + "particleLifetime": 500, + "scale": 0.6, + "scaleRange": 0.5, + "alpha": 0.05, + "alphaRange": 0.05, + "speed": 7, + "speedRange": 6, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 160 + } + ], + "WX_DESC_CLEAR_DAY": [ + { + "weatherType": 4, + "birthRate": 0.4, + "imageName": "snowflake_small", + "particleLifetime": 200, + "scale": 0.08, + "scaleRange": 0.3, + "alpha": 0.15, + "alphaRange": 0.05, + "speed": -21, + "speedRange": 10, + "emissionAngle": -0.1, + "emissionAngleRange": 0.11, + "yAcceleration": 0, + "xAcceleration": 0, + "spin": 0.5, + "spinRange": 0.2 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudbg2", + "particleLifetime": 300, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.025, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudbase6", + "particleLifetime": 300, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.025, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudbg4", + "particleLifetime": 300, + "scale": 1, + "scaleRange": 0.4, + "alpha": 0.025, + "alphaRange": 0.01, + "speed": 5, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 100, + "height": 110 + } + ], + "WX_DESC_CLEAR_NIGHT":[ + { + "weatherType": 0, + "birthRate": 5, + "imageName": "star_large", + "particleLifetime": 20, + "scale": 0, + "scaleRange": 0.03, + "scaleSpeedFactor": 0.06, + "alpha": 0.5, + "alphaRange": 0, + "alphaSpeedFactor": 0.5, + "speed": 0, + "speedRange": 0, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0 + }, + { + "weatherType": 0, + "birthRate": 8, + "imageName": "star_small", + "particleLifetime": 20, + "scale": 0, + "scaleRange": 0.1, + "scaleSpeedFactor": 0.15, + "alpha": 0.5, + "alphaRange": 0, + "alphaSpeedFactor": 0.5, + "speed": 0, + "speedRange": 0, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0 + }, + { + "weatherType": 2, + "birthRate": 0.02, + "imageName": "cloudbg1", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.02, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition":120, + "height": 90 + }, + { + "weatherType": 2, + "birthRate": 0.03, + "imageName": "cloudbg2", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.02, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 90 + }, + { + "weatherType": 2, + "birthRate": 0.01, + "imageName": "cloudbg3", + "particleLifetime": 200, + "scale": 0.8, + "scaleRange": 0.4, + "alpha": 0.02, + "alphaRange": 0.01, + "speed": 3, + "speedRange": 3, + "emissionAngle": 0, + "emissionAngleRange": 0, + "yAcceleration": 0, + "xAcceleration": 0, + "yPosition": 120, + "height": 90 + } + ] + } +} \ No newline at end of file
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase1.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase1.png new file mode 100644 index 0000000..b06404b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase1.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase10.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase10.png new file mode 100644 index 0000000..a8978c6 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase10.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase11.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase11.png new file mode 100644 index 0000000..684bbfc --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase11.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase2.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase2.png new file mode 100644 index 0000000..fd07783 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase2.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase3.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase3.png new file mode 100644 index 0000000..ebe2bb5 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase3.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase4.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase4.png new file mode 100644 index 0000000..41d2e52 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase4.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase5.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase5.png new file mode 100644 index 0000000..3fd15f8 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase5.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase6.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase6.png new file mode 100644 index 0000000..76f5fc0 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase6.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase7.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase7.png new file mode 100644 index 0000000..657e835 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase7.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase8.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase8.png new file mode 100644 index 0000000..0a7ef90 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase8.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase9.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase9.png new file mode 100644 index 0000000..fd0dae6 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbase9.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg1.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg1.png new file mode 100644 index 0000000..4d3a545 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg1.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg2.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg2.png new file mode 100644 index 0000000..07c6fc6 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg2.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg3.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg3.png new file mode 100644 index 0000000..7ddcb6d --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg3.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg4.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg4.png new file mode 100644 index 0000000..fa2840b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg4.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg5.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg5.png new file mode 100644 index 0000000..2503e3e --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg5.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg6.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg6.png new file mode 100644 index 0000000..51daa6b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudbg6.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff1.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff1.png new file mode 100644 index 0000000..96d260d --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff1.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff10.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff10.png new file mode 100644 index 0000000..0fe76bb --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff10.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff11.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff11.png new file mode 100644 index 0000000..14e7a73 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff11.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff12.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff12.png new file mode 100644 index 0000000..c77a02b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff12.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff2.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff2.png new file mode 100644 index 0000000..3dca339 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff2.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff3.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff3.png new file mode 100644 index 0000000..031f521 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff3.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff4.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff4.png new file mode 100644 index 0000000..ec1ee91 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff4.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff5.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff5.png new file mode 100644 index 0000000..4236a8b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff5.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff6.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff6.png new file mode 100644 index 0000000..2ac4c1c --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff6.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff7.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff7.png new file mode 100644 index 0000000..06bf277 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff7.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff8.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff8.png new file mode 100644 index 0000000..c75346f --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff8.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff9.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff9.png new file mode 100644 index 0000000..b856336 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/cloudpuff9.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/raindrop_large.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/raindrop_large.png new file mode 100644 index 0000000..87bb584 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/raindrop_large.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/raindrop_small.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/raindrop_small.png new file mode 100644 index 0000000..2a7f1ba --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/raindrop_small.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_large.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_large.png new file mode 100644 index 0000000..1744a24 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_large.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_round.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_round.png new file mode 100644 index 0000000..8db83cb --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_round.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_small.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_small.png new file mode 100644 index 0000000..3c989f7 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/snowflake_small.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/star_large.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/star_large.png new file mode 100644 index 0000000..7c3c252 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/star_large.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/star_small.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/star_small.png new file mode 100644 index 0000000..20b6404 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/star_small.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/sunbeam.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/sunbeam.png new file mode 100644 index 0000000..15c224e --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/sunbeam.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/thin_ray.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/thin_ray.png new file mode 100644 index 0000000..6e30c98 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/thin_ray.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wide_ray.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wide_ray.png new file mode 100644 index 0000000..315f5f9 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wide_ray.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_cloud_particle.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_cloud_particle.png new file mode 100644 index 0000000..7b6179c --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_cloud_particle.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_cloud_particle@2x.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_cloud_particle@2x.png new file mode 100644 index 0000000..449fda3 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_cloud_particle@2x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_rain_particle.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_rain_particle.png new file mode 100644 index 0000000..ed15b15 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_rain_particle.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_rain_particle@2x.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_rain_particle@2x.png new file mode 100644 index 0000000..2e5836c --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_rain_particle@2x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_snow_particle.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_snow_particle.png new file mode 100644 index 0000000..0f90886 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_snow_particle.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_snow_particle@2x.png b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_snow_particle@2x.png new file mode 100644 index 0000000..00612b7 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/NLWeather.bundle/wx_procedural_snow_particle@2x.png Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/Nest.lto.opt.bc b/jaspertv_gpl_out/Nest.app/Nest.lto.opt.bc new file mode 100644 index 0000000..df1bce1 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Nest.lto.opt.bc Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/PkgInfo b/jaspertv_gpl_out/Nest.app/PkgInfo new file mode 100644 index 0000000..bd04210 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/PkgInfo
@@ -0,0 +1 @@ +APPL???? \ No newline at end of file
diff --git a/jaspertv_gpl_out/Nest.app/Shader.vsh b/jaspertv_gpl_out/Nest.app/Shader.vsh new file mode 100644 index 0000000..1f275ab --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Shader.vsh
@@ -0,0 +1,57 @@ +/* + File: Shader.vsh + Abstract: Vertex shader that passes attributes through to fragment shader. + Version: 1.0 + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple + Inc. ("Apple") in consideration of your agreement to the following + terms, and your use, installation, modification or redistribution of + this Apple software constitutes acceptance of these terms. If you do + not agree with these terms, please do not use, install, modify or + redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and + subject to these terms, Apple grants you a personal, non-exclusive + license, under Apple's copyrights in this original Apple software (the + "Apple Software"), to use, reproduce, modify and redistribute the Apple + Software, with or without modifications, in source and/or binary forms; + provided that if you redistribute the Apple Software in its entirety and + without modifications, you must retain this notice and the following + text and disclaimers in all such redistributions of the Apple Software. + Neither the name, trademarks, service marks or logos of Apple Inc. may + be used to endorse or promote products derived from the Apple Software + without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or + implied, are granted by Apple herein, including but not limited to any + patent rights that may be infringed by your derivative works or by other + works in which the Apple Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE + MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION + THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND + OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, + MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED + AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), + STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + Copyright (C) 2012 Apple Inc. All Rights Reserved. + + */ + +attribute vec4 position; +attribute vec2 texCoord; + +varying vec2 texCoordVarying; + +void main() +{ + gl_Position = position; + texCoordVarying = texCoord; +}
diff --git a/jaspertv_gpl_out/Nest.app/Shader_NV12.fsh b/jaspertv_gpl_out/Nest.app/Shader_NV12.fsh new file mode 100644 index 0000000..a63f189 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Shader_NV12.fsh
@@ -0,0 +1,30 @@ +/* + Copyright (C) 2014 Apple Inc. All Rights Reserved. + See LICENSE.txt for this sample’s licensing information + + Abstract: + + Passthrough shader for displaying CVPixelbuffers + + */ + +varying highp vec2 texCoordVarying; +precision mediump float; + +uniform sampler2D SamplerY; +uniform sampler2D SamplerUV; +uniform mat3 colorConversionMatrix; + +void main() +{ + mediump vec3 yuv; + lowp vec3 rgb; + + // Subtract constants to map the video range start at 0 + yuv.x = (texture2D(SamplerY, texCoordVarying).r - (16.0/255.0)); + yuv.yz = (texture2D(SamplerUV, texCoordVarying).rg - vec2(0.5, 0.5)); + + rgb = colorConversionMatrix * yuv; + + gl_FragColor = vec4(rgb,1); +} \ No newline at end of file
diff --git a/jaspertv_gpl_out/Nest.app/Shader_YUV420.fsh b/jaspertv_gpl_out/Nest.app/Shader_YUV420.fsh new file mode 100644 index 0000000..8acdce5 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/Shader_YUV420.fsh
@@ -0,0 +1,77 @@ +/* + File: Shader.fsh + Abstract: Fragment shader for converting Y/UV textures to RGB. + Version: 1.0 + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple + Inc. ("Apple") in consideration of your agreement to the following + terms, and your use, installation, modification or redistribution of + this Apple software constitutes acceptance of these terms. If you do + not agree with these terms, please do not use, install, modify or + redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and + subject to these terms, Apple grants you a personal, non-exclusive + license, under Apple's copyrights in this original Apple software (the + "Apple Software"), to use, reproduce, modify and redistribute the Apple + Software, with or without modifications, in source and/or binary forms; + provided that if you redistribute the Apple Software in its entirety and + without modifications, you must retain this notice and the following + text and disclaimers in all such redistributions of the Apple Software. + Neither the name, trademarks, service marks or logos of Apple Inc. may + be used to endorse or promote products derived from the Apple Software + without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or + implied, are granted by Apple herein, including but not limited to any + patent rights that may be infringed by your derivative works or by other + works in which the Apple Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE + MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION + THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND + OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, + MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED + AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), + STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + Copyright (C) 2012 Apple Inc. All Rights Reserved. + + */ + +uniform sampler2D SamplerY; +uniform sampler2D SamplerU; +uniform sampler2D SamplerV; + +varying highp vec2 texCoordVarying; + +void main() +{ + mediump vec3 yuv; + lowp vec3 rgb; + + yuv.x = texture2D(SamplerY, texCoordVarying).r; + yuv.y = texture2D(SamplerU, texCoordVarying).r - 0.5; + yuv.z = texture2D(SamplerV, texCoordVarying).r - 0.5; + + // BT.601, which is the standard for SDTV is provided as a reference + + /*rgb = mat3( 1, 1, 1, + 0, -.34413, 1.772, + 1.402, -.71414, 0) * yuv;*/ + + + // Using BT.709 which is the standard for HDTV + rgb = mat3( 1, 1, 1, + 0, -.18732, 1.8556, + 1.57481, -.46813, 0) * yuv; + + gl_FragColor = vec4(rgb, 1); +} +
diff --git a/jaspertv_gpl_out/Nest.app/de.lproj/Localizable.strings b/jaspertv_gpl_out/Nest.app/de.lproj/Localizable.strings new file mode 100644 index 0000000..bf2573a --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/de.lproj/Localizable.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/embedded.mobileprovision b/jaspertv_gpl_out/Nest.app/embedded.mobileprovision new file mode 100644 index 0000000..5d7392c --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/embedded.mobileprovision Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/en.lproj/Localizable.strings b/jaspertv_gpl_out/Nest.app/en.lproj/Localizable.strings new file mode 100644 index 0000000..4dbc0e9 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/en.lproj/Localizable.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/es.lproj/Localizable.strings b/jaspertv_gpl_out/Nest.app/es.lproj/Localizable.strings new file mode 100644 index 0000000..cc2f24c --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/es.lproj/Localizable.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/fr.lproj/Localizable.strings b/jaspertv_gpl_out/Nest.app/fr.lproj/Localizable.strings new file mode 100644 index 0000000..ed855f5 --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/fr.lproj/Localizable.strings Binary files differ
diff --git a/jaspertv_gpl_out/Nest.app/nl.lproj/Localizable.strings b/jaspertv_gpl_out/Nest.app/nl.lproj/Localizable.strings new file mode 100644 index 0000000..9c73c8b --- /dev/null +++ b/jaspertv_gpl_out/Nest.app/nl.lproj/Localizable.strings Binary files differ
diff --git a/jaspertv_gpl_out/README b/jaspertv_gpl_out/README new file mode 100644 index 0000000..df7ef1c --- /dev/null +++ b/jaspertv_gpl_out/README
@@ -0,0 +1,5 @@ +To re-link the Nest TV app (tvOS SDK required): + +1. Build FFmpeg (lib/ffmpeg/build_ffmpeg_tv.sh) +2. Re-link the app binary (relink-x86_64.sh for simulator, relink-arm64.sh for device) +3. Install app to simulator or device
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Crashlytics b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Crashlytics new file mode 100755 index 0000000..02d62ee --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Crashlytics Binary files differ
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/ANSCompatibility.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/ANSCompatibility.h new file mode 100644 index 0000000..6ec011d --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/ANSCompatibility.h
@@ -0,0 +1,31 @@ +// +// ANSCompatibility.h +// AnswersKit +// +// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. +// + +#pragma once + +#if !__has_feature(nullability) +#define nonnull +#define nullable +#define _Nullable +#define _Nonnull +#endif + +#ifndef NS_ASSUME_NONNULL_BEGIN +#define NS_ASSUME_NONNULL_BEGIN +#endif + +#ifndef NS_ASSUME_NONNULL_END +#define NS_ASSUME_NONNULL_END +#endif + +#if __has_feature(objc_generics) +#define ANS_GENERIC_NSARRAY(type) NSArray<type> +#define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary<key_type, object_key> +#else +#define ANS_GENERIC_NSARRAY(type) NSArray +#define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary +#endif
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/Answers.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/Answers.h new file mode 100644 index 0000000..710eb50 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/Answers.h
@@ -0,0 +1,210 @@ +// +// Answers.h +// Crashlytics +// +// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. +// + +#import <Foundation/Foundation.h> +#import "ANSCompatibility.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class exposes the Answers Events API, allowing you to track key + * user user actions and metrics in your app. + */ +@interface Answers : NSObject + +/** + * Log a Sign Up event to see users signing up for your app in real-time, understand how + * many users are signing up with different methods and their success rate signing up. + * + * @param signUpMethodOrNil The method by which a user logged in, e.g. Twitter or Digits. + * @param signUpSucceededOrNil The ultimate success or failure of the login + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logSignUpWithMethod:(nullable NSString *)signUpMethodOrNil + success:(nullable NSNumber *)signUpSucceededOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log an Log In event to see users logging into your app in real-time, understand how many + * users are logging in with different methods and their success rate logging into your app. + * + * @param loginMethodOrNil The method by which a user logged in, e.g. email, Twitter or Digits. + * @param loginSucceededOrNil The ultimate success or failure of the login + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logLoginWithMethod:(nullable NSString *)loginMethodOrNil + success:(nullable NSNumber *)loginSucceededOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Share event to see users sharing from your app in real-time, letting you + * understand what content they're sharing from the type or genre down to the specific id. + * + * @param shareMethodOrNil The method by which a user shared, e.g. email, Twitter, SMS. + * @param contentNameOrNil The human readable name for this piece of content. + * @param contentTypeOrNil The type of content shared. + * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logShareWithMethod:(nullable NSString *)shareMethodOrNil + contentName:(nullable NSString *)contentNameOrNil + contentType:(nullable NSString *)contentTypeOrNil + contentId:(nullable NSString *)contentIdOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log an Invite Event to track how users are inviting other users into + * your application. + * + * @param inviteMethodOrNil The method of invitation, e.g. GameCenter, Twitter, email. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logInviteWithMethod:(nullable NSString *)inviteMethodOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Purchase event to see your revenue in real-time, understand how many users are making purchases, see which + * items are most popular, and track plenty of other important purchase-related metrics. + * + * @param itemPriceOrNil The purchased item's price. + * @param currencyOrNil The ISO4217 currency code. Example: USD + * @param purchaseSucceededOrNil Was the purchase succesful or unsuccesful + * @param itemNameOrNil The human-readable form of the item's name. Example: + * @param itemTypeOrNil The type, or genre of the item. Example: Song + * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU + * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase. + */ ++ (void)logPurchaseWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil + currency:(nullable NSString *)currencyOrNil + success:(nullable NSNumber *)purchaseSucceededOrNil + itemName:(nullable NSString *)itemNameOrNil + itemType:(nullable NSString *)itemTypeOrNil + itemId:(nullable NSString *)itemIdOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Level Start Event to track where users are in your game. + * + * @param levelNameOrNil The level name + * @param customAttributesOrNil A dictionary of custom attributes to associate with this level start event. + */ ++ (void)logLevelStart:(nullable NSString *)levelNameOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Level End event to track how users are completing levels in your game. + * + * @param levelNameOrNil The name of the level completed, E.G. "1" or "Training" + * @param scoreOrNil The score the user completed the level with. + * @param levelCompletedSuccesfullyOrNil A boolean representing whether or not the level was completed succesfully. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logLevelEnd:(nullable NSString *)levelNameOrNil + score:(nullable NSNumber *)scoreOrNil + success:(nullable NSNumber *)levelCompletedSuccesfullyOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log an Add to Cart event to see users adding items to a shopping cart in real-time, understand how + * many users start the purchase flow, see which items are most popular, and track plenty of other important + * purchase-related metrics. + * + * @param itemPriceOrNil The purchased item's price. + * @param currencyOrNil The ISO4217 currency code. Example: USD + * @param itemNameOrNil The human-readable form of the item's name. Example: + * @param itemTypeOrNil The type, or genre of the item. Example: Song + * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logAddToCartWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil + currency:(nullable NSString *)currencyOrNil + itemName:(nullable NSString *)itemNameOrNil + itemType:(nullable NSString *)itemTypeOrNil + itemId:(nullable NSString *)itemIdOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Start Checkout event to see users moving through the purchase funnel in real-time, understand how many + * users are doing this and how much they're spending per checkout, and see how it related to other important + * purchase-related metrics. + * + * @param totalPriceOrNil The total price of the cart. + * @param currencyOrNil The ISO4217 currency code. Example: USD + * @param itemCountOrNil The number of items in the cart. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logStartCheckoutWithPrice:(nullable NSDecimalNumber *)totalPriceOrNil + currency:(nullable NSString *)currencyOrNil + itemCount:(nullable NSNumber *)itemCountOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Rating event to see users rating content within your app in real-time and understand what + * content is most engaging, from the type or genre down to the specific id. + * + * @param ratingOrNil The integer rating given by the user. + * @param contentNameOrNil The human readable name for this piece of content. + * @param contentTypeOrNil The type of content shared. + * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logRating:(nullable NSNumber *)ratingOrNil + contentName:(nullable NSString *)contentNameOrNil + contentType:(nullable NSString *)contentTypeOrNil + contentId:(nullable NSString *)contentIdOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Content View event to see users viewing content within your app in real-time and + * understand what content is most engaging, from the type or genre down to the specific id. + * + * @param contentNameOrNil The human readable name for this piece of content. + * @param contentTypeOrNil The type of content shared. + * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logContentViewWithName:(nullable NSString *)contentNameOrNil + contentType:(nullable NSString *)contentTypeOrNil + contentId:(nullable NSString *)contentIdOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Search event allows you to see users searching within your app in real-time and understand + * exactly what they're searching for. + * + * @param queryOrNil The user's query. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. + */ ++ (void)logSearchWithQuery:(nullable NSString *)queryOrNil + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +/** + * Log a Custom Event to see user actions that are uniquely important for your app in real-time, to see how often + * they're performing these actions with breakdowns by different categories you add. Use a human-readable name for + * the name of the event, since this is how the event will appear in Answers. + * + * @param eventName The human-readable name for the event. + * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. Attribute keys + * must be <code>NSString</code> and and values must be <code>NSNumber</code> or <code>NSString</code>. + * @discussion How we treat <code>NSNumbers</code>: + * We will provide information about the distribution of values over time. + * + * How we treat <code>NSStrings</code>: + * NSStrings are used as categorical data, allowing comparison across different category values. + * Strings are limited to a maximum length of 100 characters, attributes over this length will be + * truncated. + * + * When tracking the Tweet views to better understand user engagement, sending the tweet's length + * and the type of media present in the tweet allows you to track how tweet length and the type of media influence + * engagement. + */ ++ (void)logCustomEventWithName:(NSString *)eventName + customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; + +@end + +NS_ASSUME_NONNULL_END
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSAttributes.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSAttributes.h new file mode 100644 index 0000000..1526b0d --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSAttributes.h
@@ -0,0 +1,33 @@ +// +// CLSAttributes.h +// Crashlytics +// +// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. +// + +#pragma once + +#define CLS_DEPRECATED(x) __attribute__ ((deprecated(x))) + +#if !__has_feature(nullability) + #define nonnull + #define nullable + #define _Nullable + #define _Nonnull +#endif + +#ifndef NS_ASSUME_NONNULL_BEGIN + #define NS_ASSUME_NONNULL_BEGIN +#endif + +#ifndef NS_ASSUME_NONNULL_END + #define NS_ASSUME_NONNULL_END +#endif + +#if __has_feature(objc_generics) + #define CLS_GENERIC_NSARRAY(type) NSArray<type> + #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary<key_type, object_key> +#else + #define CLS_GENERIC_NSARRAY(type) NSArray + #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary +#endif
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSLogging.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSLogging.h new file mode 100644 index 0000000..59590d5 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSLogging.h
@@ -0,0 +1,64 @@ +// +// CLSLogging.h +// Crashlytics +// +// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. +// +#ifdef __OBJC__ +#import "CLSAttributes.h" +#import <Foundation/Foundation.h> + +NS_ASSUME_NONNULL_BEGIN +#endif + + + +/** + * + * The CLS_LOG macro provides as easy way to gather more information in your log messages that are + * sent with your crash data. CLS_LOG prepends your custom log message with the function name and + * line number where the macro was used. If your app was built with the DEBUG preprocessor macro + * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog. + * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only. + * + * Example output: + * -[AppDelegate login:] line 134 $ login start + * + * If you would like to change this macro, create a new header file, unset our define and then define + * your own version. Make sure this new header file is imported after the Crashlytics header file. + * + * #undef CLS_LOG + * #define CLS_LOG(__FORMAT__, ...) CLSNSLog... + * + **/ +#ifdef __OBJC__ +#ifdef DEBUG +#define CLS_LOG(__FORMAT__, ...) CLSNSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) +#else +#define CLS_LOG(__FORMAT__, ...) CLSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) +#endif +#endif + +/** + * + * Add logging that will be sent with your crash data. This logging will not show up in the system.log + * and will only be visible in your Crashlytics dashboard. + * + **/ + +#ifdef __OBJC__ +OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); +OBJC_EXTERN void CLSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); + +/** + * + * Add logging that will be sent with your crash data. This logging will show up in the system.log + * and your Crashlytics dashboard. It is not recommended for Release builds. + * + **/ +OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); +OBJC_EXTERN void CLSNSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); + + +NS_ASSUME_NONNULL_END +#endif
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSReport.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSReport.h new file mode 100644 index 0000000..6e3a515 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSReport.h
@@ -0,0 +1,103 @@ +// +// CLSReport.h +// Crashlytics +// +// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. +// + +#import <Foundation/Foundation.h> +#import "CLSAttributes.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * The CLSCrashReport protocol is deprecated. See the CLSReport class and the CrashyticsDelegate changes for details. + **/ +@protocol CLSCrashReport <NSObject> + +@property (nonatomic, copy, readonly) NSString *identifier; +@property (nonatomic, copy, readonly) NSDictionary *customKeys; +@property (nonatomic, copy, readonly) NSString *bundleVersion; +@property (nonatomic, copy, readonly) NSString *bundleShortVersionString; +@property (nonatomic, copy, readonly) NSDate *crashedOnDate; +@property (nonatomic, copy, readonly) NSString *OSVersion; +@property (nonatomic, copy, readonly) NSString *OSBuildVersion; + +@end + +/** + * The CLSReport exposes an interface to the phsyical report that Crashlytics has created. You can + * use this class to get information about the event, and can also set some values after the + * event has occured. + **/ +@interface CLSReport : NSObject <CLSCrashReport> + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/** + * Returns the session identifier for the report. + **/ +@property (nonatomic, copy, readonly) NSString *identifier; + +/** + * Returns the custom key value data for the report. + **/ +@property (nonatomic, copy, readonly) NSDictionary *customKeys; + +/** + * Returns the CFBundleVersion of the application that generated the report. + **/ +@property (nonatomic, copy, readonly) NSString *bundleVersion; + +/** + * Returns the CFBundleShortVersionString of the application that generated the report. + **/ +@property (nonatomic, copy, readonly) NSString *bundleShortVersionString; + +/** + * Returns the date that the report was created. + **/ +@property (nonatomic, copy, readonly) NSDate *dateCreated; + +/** + * Returns the os version that the application crashed on. + **/ +@property (nonatomic, copy, readonly) NSString *OSVersion; + +/** + * Returns the os build version that the application crashed on. + **/ +@property (nonatomic, copy, readonly) NSString *OSBuildVersion; + +/** + * Returns YES if the report contains any crash information, otherwise returns NO. + **/ +@property (nonatomic, assign, readonly) BOOL isCrash; + +/** + * You can use this method to set, after the event, additional custom keys. The rules + * and semantics for this method are the same as those documented in Crashlytics.h. Be aware + * that the maximum size and count of custom keys is still enforced, and you can overwrite keys + * and/or cause excess keys to be deleted by using this method. + **/ +- (void)setObjectValue:(nullable id)value forKey:(NSString *)key; + +/** + * Record an application-specific user identifier. See Crashlytics.h for details. + **/ +@property (nonatomic, copy, nullable) NSString * userIdentifier; + +/** + * Record a user name. See Crashlytics.h for details. + **/ +@property (nonatomic, copy, nullable) NSString * userName; + +/** + * Record a user email. See Crashlytics.h for details. + **/ +@property (nonatomic, copy, nullable) NSString * userEmail; + +@end + +NS_ASSUME_NONNULL_END
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSStackFrame.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSStackFrame.h new file mode 100644 index 0000000..cdb5596 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/CLSStackFrame.h
@@ -0,0 +1,38 @@ +// +// CLSStackFrame.h +// Crashlytics +// +// Copyright 2015 Crashlytics, Inc. All rights reserved. +// + +#import <Foundation/Foundation.h> +#import "CLSAttributes.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * + * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to + * record information about non-ObjC/C++ exceptions. All information included here will be displayed + * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the + * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities + * in the process. + * + **/ +@interface CLSStackFrame : NSObject + ++ (instancetype)stackFrame; ++ (instancetype)stackFrameWithAddress:(NSUInteger)address; ++ (instancetype)stackFrameWithSymbol:(NSString *)symbol; + +@property (nonatomic, copy, nullable) NSString *symbol; +@property (nonatomic, copy, nullable) NSString *rawSymbol; +@property (nonatomic, copy, nullable) NSString *library; +@property (nonatomic, copy, nullable) NSString *fileName; +@property (nonatomic, assign) uint32_t lineNumber; +@property (nonatomic, assign) uint64_t offset; +@property (nonatomic, assign) uint64_t address; + +@end + +NS_ASSUME_NONNULL_END
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/Crashlytics.h b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/Crashlytics.h new file mode 100644 index 0000000..34288f1 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Headers/Crashlytics.h
@@ -0,0 +1,266 @@ +// +// Crashlytics.h +// Crashlytics +// +// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. +// + +#import <Foundation/Foundation.h> + +#import "CLSAttributes.h" +#import "CLSLogging.h" +#import "CLSReport.h" +#import "CLSStackFrame.h" +#import "Answers.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol CrashlyticsDelegate; + +/** + * Crashlytics. Handles configuration and initialization of Crashlytics. + * + * Note: The Crashlytics class cannot be subclassed. If this is causing you pain for + * testing, we suggest using either a wrapper class or a protocol extension. + */ +@interface Crashlytics : NSObject + +@property (nonatomic, readonly, copy) NSString *APIKey; +@property (nonatomic, readonly, copy) NSString *version; +@property (nonatomic, assign) BOOL debugMode; + +/** + * + * The delegate can be used to influence decisions on reporting and behavior, as well as reacting + * to previous crashes. + * + * Make certain that the delegate is setup before starting Crashlytics with startWithAPIKey:... or + * via +[Fabric with:...]. Failure to do will result in missing any delegate callbacks that occur + * synchronously during start. + * + **/ +@property (nonatomic, assign, nullable) id <CrashlyticsDelegate> delegate; + +/** + * The recommended way to install Crashlytics into your application is to place a call to +startWithAPIKey: + * in your -application:didFinishLaunchingWithOptions: or -applicationDidFinishLaunching: + * method. + * + * Note: Starting with 3.0, the submission process has been significantly improved. The delay parameter + * is no longer required to throttle submissions on launch, performance will be great without it. + * + * @param apiKey The Crashlytics API Key for this app + * + * @return The singleton Crashlytics instance + */ ++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey; ++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey: instead."); + +/** + * If you need the functionality provided by the CrashlyticsDelegate protocol, you can use + * these convenience methods to activate the framework and set the delegate in one call. + * + * @param apiKey The Crashlytics API Key for this app + * @param delegate A delegate object which conforms to CrashlyticsDelegate. + * + * @return The singleton Crashlytics instance + */ ++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id<CrashlyticsDelegate>)delegate; ++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id<CrashlyticsDelegate>)delegate afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey:delegate: instead."); + +/** + * Access the singleton Crashlytics instance. + * + * @return The singleton Crashlytics instance + */ ++ (Crashlytics *)sharedInstance; + +/** + * The easiest way to cause a crash - great for testing! + */ +- (void)crash; + +/** + * The easiest way to cause a crash with an exception - great for testing. + */ +- (void)throwException; + +/** + * Specify a user identifier which will be visible in the Crashlytics UI. + * + * Many of our customers have requested the ability to tie crashes to specific end-users of their + * application in order to facilitate responses to support requests or permit the ability to reach + * out for more information. We allow you to specify up to three separate values for display within + * the Crashlytics UI - but please be mindful of your end-user's privacy. + * + * We recommend specifying a user identifier - an arbitrary string that ties an end-user to a record + * in your system. This could be a database id, hash, or other value that is meaningless to a + * third-party observer but can be indexed and queried by you. + * + * Optionally, you may also specify the end-user's name or username, as well as email address if you + * do not have a system that works well with obscured identifiers. + * + * Pursuant to our EULA, this data is transferred securely throughout our system and we will not + * disseminate end-user data unless required to by law. That said, if you choose to provide end-user + * contact information, we strongly recommend that you disclose this in your application's privacy + * policy. Data privacy is of our utmost concern. + * + * @param identifier An arbitrary user identifier string which ties an end-user to a record in your system. + */ +- (void)setUserIdentifier:(nullable NSString *)identifier; + +/** + * Specify a user name which will be visible in the Crashlytics UI. + * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs. + * @see setUserIdentifier: + * + * @param name An end user's name. + */ +- (void)setUserName:(nullable NSString *)name; + +/** + * Specify a user email which will be visible in the Crashlytics UI. + * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs. + * + * @see setUserIdentifier: + * + * @param email An end user's email address. + */ +- (void)setUserEmail:(nullable NSString *)email; + ++ (void)setUserIdentifier:(nullable NSString *)identifier CLS_DEPRECATED("Please access this method via +sharedInstance"); ++ (void)setUserName:(nullable NSString *)name CLS_DEPRECATED("Please access this method via +sharedInstance"); ++ (void)setUserEmail:(nullable NSString *)email CLS_DEPRECATED("Please access this method via +sharedInstance"); + +/** + * Set a value for a for a key to be associated with your crash data which will be visible in the Crashlytics UI. + * When setting an object value, the object is converted to a string. This is typically done by calling + * -[NSObject description]. + * + * @param value The object to be associated with the key + * @param key The key with which to associate the value + */ +- (void)setObjectValue:(nullable id)value forKey:(NSString *)key; + +/** + * Set an int value for a key to be associated with your crash data which will be visible in the Crashlytics UI. + * + * @param value The integer value to be set + * @param key The key with which to associate the value + */ +- (void)setIntValue:(int)value forKey:(NSString *)key; + +/** + * Set an BOOL value for a key to be associated with your crash data which will be visible in the Crashlytics UI. + * + * @param value The BOOL value to be set + * @param key The key with which to associate the value + */ +- (void)setBoolValue:(BOOL)value forKey:(NSString *)key; + +/** + * Set an float value for a key to be associated with your crash data which will be visible in the Crashlytics UI. + * + * @param value The float value to be set + * @param key The key with which to associate the value + */ +- (void)setFloatValue:(float)value forKey:(NSString *)key; + ++ (void)setObjectValue:(nullable id)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); ++ (void)setIntValue:(int)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); ++ (void)setBoolValue:(BOOL)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); ++ (void)setFloatValue:(float)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); + +/** + * This method can be used to record a single exception structure in a report. This is particularly useful + * when your code interacts with non-native languages like Lua, C#, or Javascript. This call can be + * expensive and should only be used shortly before process termination. This API is not intended be to used + * to log NSException objects. All safely-reportable NSExceptions are automatically captured by + * Crashlytics. + * + * @param name The name of the custom exception + * @param reason The reason this exception occured + * @param frameArray An array of CLSStackFrame objects + */ +- (void)recordCustomExceptionName:(NSString *)name reason:(nullable NSString *)reason frameArray:(CLS_GENERIC_NSARRAY(CLSStackFrame *) *)frameArray; + +/** + * + * This allows you to record a non-fatal event, described by an NSError object. These events will be grouped and + * displayed similarly to crashes. Keep in mind that this method can be expensive. Also, the total number of + * NSErrors that can be recorded during your app's life-cycle is limited by a fixed-size circular buffer. If the + * buffer is overrun, the oldest data is dropped. Errors are relayed to Crashlytics on a subsequent launch + * of your application. + * + * You can also use the -recordError:withAdditionalUserInfo: to include additional context not represented + * by the NSError instance itself. + * + **/ +- (void)recordError:(NSError *)error; +- (void)recordError:(NSError *)error withAdditionalUserInfo:(nullable CLS_GENERIC_NSDICTIONARY(NSString *, id) *)userInfo; + +- (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); +- (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); ++ (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); ++ (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); + +@end + +/** + * + * The CrashlyticsDelegate protocol provides a mechanism for your application to take + * action on events that occur in the Crashlytics crash reporting system. You can make + * use of these calls by assigning an object to the Crashlytics' delegate property directly, + * or through the convenience +startWithAPIKey:delegate: method. + * + */ +@protocol CrashlyticsDelegate <NSObject> +@optional + + +- (void)crashlyticsDidDetectCrashDuringPreviousExecution:(Crashlytics *)crashlytics CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:"); +- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id <CLSCrashReport>)crash CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:"); + +/** + * + * Called when a Crashlytics instance has determined that the last execution of the + * application ended in a crash. This is called synchronously on Crashlytics + * initialization. Your delegate must invoke the completionHandler, but does not need to do so + * synchronously, or even on the main thread. Invoking completionHandler with NO will cause the + * detected report to be deleted and not submitted to Crashlytics. This is useful for + * implementing permission prompts, or other more-complex forms of logic around submitting crashes. + * + * @warning Failure to invoke the completionHandler will prevent submissions from being reported. Watch out. + * + * @warning Just implementing this delegate method will disable all forms of synchronous report submission. This can + * impact the reliability of reporting crashes very early in application launch. + * + * @param report The CLSReport object representing the last detected crash + * @param completionHandler The completion handler to call when your logic has completed. + * + */ +- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler; + +/** + * If your app is running on an OS that supports it (OS X 10.9+, iOS 7.0+), Crashlytics will submit + * most reports using out-of-process background networking operations. This results in a significant + * improvement in reliability of reporting, as well as power and performance wins for your users. + * If you don't want this functionality, you can disable by returning NO from this method. + * + * @warning Background submission is not supported for extensions on iOS or OS X. + * + * @param crashlytics The Crashlytics singleton instance + * + * @return Return NO if you don't want out-of-process background network operations. + * + */ +- (BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics; + +@end + +/** + * `CrashlyticsKit` can be used as a parameter to `[Fabric with:@[CrashlyticsKit]];` in Objective-C. In Swift, use Crashlytics.sharedInstance() + */ +#define CrashlyticsKit [Crashlytics sharedInstance] + +NS_ASSUME_NONNULL_END
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Info.plist b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Info.plist new file mode 100644 index 0000000..9796565 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Info.plist Binary files differ
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Modules/module.modulemap b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Modules/module.modulemap new file mode 100644 index 0000000..da0845e --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/Modules/module.modulemap
@@ -0,0 +1,14 @@ +framework module Crashlytics { + header "Crashlytics.h" + header "Answers.h" + header "ANSCompatibility.h" + header "CLSLogging.h" + header "CLSReport.h" + header "CLSStackFrame.h" + header "CLSAttributes.h" + + export * + + link "z" + link "c++" +}
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/run b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/run new file mode 100755 index 0000000..9058ea6 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/run
@@ -0,0 +1,28 @@ +#!/bin/sh + +# run +# +# Copyright (c) 2015 Crashlytics. All rights reserved. + +# Figure out where we're being called from +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# Quote path in case of spaces or special chars +DIR="\"${DIR}" + +PATH_SEP="/" +VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" +UPLOAD_COMMAND="uploadDSYM\" $@ run-script" + +# Ensure params are as expected, run in sync mode to validate +eval $DIR$PATH_SEP$VALIDATE_COMMAND +return_code=$? + +if [[ $return_code != 0 ]]; then + exit $return_code +fi + +# Verification passed, upload dSYM in background to prevent Xcode from waiting +# Note: Validation is performed again before upload. +# Output can still be found in Console.app +eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 &
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/submit b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/submit new file mode 100755 index 0000000..c05b8e9 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/submit Binary files differ
diff --git a/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/uploadDSYM b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/uploadDSYM new file mode 100755 index 0000000..6edd046 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Crashlytics.framework/uploadDSYM Binary files differ
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Fabric b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Fabric new file mode 100755 index 0000000..1392e3a --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Fabric Binary files differ
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Headers/FABAttributes.h b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Headers/FABAttributes.h new file mode 100644 index 0000000..3a9355a --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Headers/FABAttributes.h
@@ -0,0 +1,51 @@ +// +// FABAttributes.h +// Fabric +// +// Copyright (C) 2015 Twitter, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#pragma once + +#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) + +#if !__has_feature(nullability) + #define nonnull + #define nullable + #define _Nullable + #define _Nonnull +#endif + +#ifndef NS_ASSUME_NONNULL_BEGIN + #define NS_ASSUME_NONNULL_BEGIN +#endif + +#ifndef NS_ASSUME_NONNULL_END + #define NS_ASSUME_NONNULL_END +#endif + + +/** + * The following macros are defined here to provide + * backwards compatability. If you are still using + * them you should migrate to the native nullability + * macros. + */ +#define fab_nullable nullable +#define fab_nonnull nonnull +#define FAB_NONNULL __fab_nonnull +#define FAB_NULLABLE __fab_nullable +#define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN +#define FAB_END_NONNULL NS_ASSUME_NONNULL_END
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Headers/Fabric.h b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Headers/Fabric.h new file mode 100644 index 0000000..ecbdb53 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Headers/Fabric.h
@@ -0,0 +1,82 @@ +// +// Fabric.h +// Fabric +// +// Copyright (C) 2015 Twitter, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import <Foundation/Foundation.h> +#import "FABAttributes.h" + +NS_ASSUME_NONNULL_BEGIN + +#if TARGET_OS_IPHONE +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 + #error "Fabric's minimum iOS version is 6.0" +#endif +#else +#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + #error "Fabric's minimum OS X version is 10.7" +#endif +#endif + +/** + * Fabric Base. Coordinates configuration and starts all provided kits. + */ +@interface Fabric : NSObject + +/** + * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. + * + * For example, in Objective-C: + * + * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];` + * + * Swift: + * + * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])` + * + * Only the first call to this method is honored. Subsequent calls are no-ops. + * + * @param kitClasses An array of kit Class objects + * + * @return Returns the shared Fabric instance. In most cases this can be ignored. + */ ++ (instancetype)with:(NSArray *)kitClasses; + +/** + * Returns the Fabric singleton object. + */ ++ (instancetype)sharedSDK; + +/** + * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. + */ +@property (nonatomic, assign) BOOL debug; + +/** + * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. + */ +- (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); + +/** + * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. + */ ++ (instancetype)new FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); + +@end + +NS_ASSUME_NONNULL_END +
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Info.plist b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Info.plist new file mode 100644 index 0000000..1dc94ea --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Info.plist Binary files differ
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Modules/module.modulemap b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Modules/module.modulemap new file mode 100644 index 0000000..2a31223 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/Modules/module.modulemap
@@ -0,0 +1,6 @@ +framework module Fabric { + umbrella header "Fabric.h" + + export * + module * { export * } +} \ No newline at end of file
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/run b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/run new file mode 100755 index 0000000..9058ea6 --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/run
@@ -0,0 +1,28 @@ +#!/bin/sh + +# run +# +# Copyright (c) 2015 Crashlytics. All rights reserved. + +# Figure out where we're being called from +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# Quote path in case of spaces or special chars +DIR="\"${DIR}" + +PATH_SEP="/" +VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" +UPLOAD_COMMAND="uploadDSYM\" $@ run-script" + +# Ensure params are as expected, run in sync mode to validate +eval $DIR$PATH_SEP$VALIDATE_COMMAND +return_code=$? + +if [[ $return_code != 0 ]]; then + exit $return_code +fi + +# Verification passed, upload dSYM in background to prevent Xcode from waiting +# Note: Validation is performed again before upload. +# Output can still be found in Console.app +eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 &
diff --git a/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/uploadDSYM b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/uploadDSYM new file mode 100755 index 0000000..cc73a7e --- /dev/null +++ b/jaspertv_gpl_out/framework/crashlytics/Fabric.framework/uploadDSYM Binary files differ
diff --git a/jaspertv_gpl_out/lib/ffmpeg/build_ffmpeg_tv.sh b/jaspertv_gpl_out/lib/ffmpeg/build_ffmpeg_tv.sh new file mode 100755 index 0000000..8947f11 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/build_ffmpeg_tv.sh
@@ -0,0 +1,77 @@ +#!/bin/bash + +ROOT_PATH=`pwd`/`dirname "$0"` +LIB_PATH=ffmpeg_build +SDKROOT_TVOS_DEVICE=/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk +SDKROOT_TVOS_SIMULATOR=/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk + +mkdir -p $ROOT_PATH/$LIB_PATH/{arm64-tvos,x86_64-tvos} + +PATH=$PATH:$ROOT_PATH + +COMMON_PARAMS="--disable-doc --disable-ffplay --disable-ffserver \ +--disable-encoders --disable-decoders --disable-hwaccels --disable-iconv \ +--disable-muxers --disable-demuxers --disable-parsers --disable-bsfs \ +--disable-protocols --disable-indevs --disable-outdevs --disable-devices \ +--disable-filters --disable-network --disable-zlib --disable-bzlib \ +--enable-small --disable-swscale-alpha --disable-runtime-cpudetect \ +--enable-decoder=h264 \ +--enable-demuxer=h264 \ +--enable-parser=h264 \ +--enable-protocol=file \ +--enable-pic" + + +# build arm64/tvos device +cd $ROOT_PATH/$LIB_PATH/arm64-tvos + +../../ffmpeg/configure --enable-cross-compile --arch=arm64 --target-os=darwin \ +--cc=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang \ +--sysroot=$SDKROOT_TVOS_DEVICE \ +--extra-cflags='-arch arm64 -mtvos-version-min=9.0 -fembed-bitcode' \ +--extra-ldflags="-arch arm64 -isysroot $SDKROOT_TVOS_DEVICE -mtvos-version-min=9.0" \ +$COMMON_PARAMS + +make V=1 + + +# build x86/simulator +# (note: not with assembly) +cd $ROOT_PATH/$LIB_PATH/x86_64-tvos + +../../ffmpeg/configure --enable-cross-compile --arch=x86_64 --target-os=darwin \ +--cc=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang \ +--sysroot=$SDKROOT_TVOS_SIMULATOR \ +--extra-cflags='-arch x86_64 -mtvos-simulator-version-min=9.0' \ +--extra-ldflags="-arch x86_64 -isysroot $SDKROOT_TVOS_SIMULATOR -mtvos-simulator-version-min=9.0" \ +--disable-asm \ +$COMMON_PARAMS + +make V=1 + + +# make fat library for each CPU +cd $ROOT_PATH/$LIB_PATH + +for l in `echo -ne "libavcodec\nlibavdevice\nlibavformat\nlibavutil\nlibswscale"`; do + lipo -create "arm64-tvos/$l/$l.a" "x86_64-tvos/$l/$l.a" -output "$l-tvos.a"; +done + + +# copy header files to build directory +for l in `echo -ne "libavcodec\nlibavdevice\nlibavformat\nlibavutil\nlibswscale"`; do + mkdir -p $ROOT_PATH/$LIB_PATH/include/$l + cp $ROOT_PATH/ffmpeg/$l/*.h $ROOT_PATH/$LIB_PATH/include/$l +done + + +# make universal avconfig.h file +AVCONFIG_H=$ROOT_PATH/$LIB_PATH/include/libavutil/avconfig.h + +echo "#if defined __arm64__" > $AVCONFIG_H +cat arm64-tvos/libavutil/avconfig.h >> $AVCONFIG_H +echo "#elif defined __x86_64__" >> $AVCONFIG_H +cat x86_64-tvos/libavutil/avconfig.h >> $AVCONFIG_H +echo "#else" >> $AVCONFIG_H +echo "#error ffmpeg not compiled for target architecture" >> $AVCONFIG_H +echo "#endif" >> $AVCONFIG_H
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/.gitattributes b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/.gitattributes new file mode 100644 index 0000000..a900528 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/.gitattributes
@@ -0,0 +1 @@ +*.pnm -diff -text
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/.travis.yml b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/.travis.yml new file mode 100644 index 0000000..e541ee1 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/.travis.yml
@@ -0,0 +1,26 @@ +language: c +sudo: false +os: + - linux + - osx +addons: + apt: + packages: + - yasm + - diffutils +compiler: + - clang + - gcc +cache: + directories: + - ffmpeg-samples +before_install: + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update --all; fi +install: + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install yasm; fi +script: + - mkdir -p ffmpeg-samples + - ./configure --samples=ffmpeg-samples --cc=$CC + - make -j 8 + - make fate-rsync + - make check -j 8
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.GPLv2 b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.GPLv2 new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.GPLv2
@@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.GPLv3 b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.GPLv3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.GPLv3
@@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.LGPLv2.1 b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.LGPLv2.1 new file mode 100644 index 0000000..58af0d3 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.LGPLv2.1
@@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library 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. + + This library 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 this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it!
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.LGPLv3 b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.LGPLv3 new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/COPYING.LGPLv3
@@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/CREDITS b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/CREDITS new file mode 100644 index 0000000..e29f0b8 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/CREDITS
@@ -0,0 +1,6 @@ +See the Git history of the project (git://source.ffmpeg.org/ffmpeg) to +get the names of people who have contributed to FFmpeg. + +To check the log, you can type the command "git log" in the FFmpeg +source directory, or browse the online repository at +http://source.ffmpeg.org.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/Changelog b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/Changelog new file mode 100644 index 0000000..2e1cd36 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/Changelog
@@ -0,0 +1,1476 @@ +Entries are sorted chronologically from oldest to youngest within each release, +releases are sorted from youngest to oldest. + +version 3.0: +- Common Encryption (CENC) MP4 encoding and decoding support +- DXV decoding +- extrastereo filter +- ocr filter +- alimiter filter +- stereowiden filter +- stereotools filter +- rubberband filter +- tremolo filter +- agate filter +- chromakey filter +- maskedmerge filter +- Screenpresso SPV1 decoding +- chromaprint fingerprinting muxer +- ffplay dynamic volume control +- displace filter +- selectivecolor filter +- extensive native AAC encoder improvements and removal of experimental flag +- ADPCM PSX decoder +- 3dostr, dcstr, fsb, genh, vag, xvag, ads, msf, svag & vpk demuxer +- zscale filter +- wve demuxer +- zero-copy Intel QSV transcoding in ffmpeg +- shuffleframes filter +- SDX2 DPCM decoder +- vibrato filter +- innoHeim/Rsupport Screen Capture Codec decoder +- ADPCM AICA decoder +- Interplay ACM demuxer and audio decoder +- XMA1 & XMA2 decoder +- realtime filter +- anoisesrc audio filter source +- IVR demuxer +- compensationdelay filter +- acompressor filter +- support encoding 16-bit RLE SGI images +- apulsator filter +- sidechaingate audio filter +- mipsdspr1 option has been renamed to mipsdsp +- aemphasis filter +- mips32r5 option has been removed +- mips64r6 option has been removed +- DXVA2-accelerated VP9 decoding +- SOFAlizer: virtual binaural acoustics filter +- VAAPI VP9 hwaccel +- audio high-order multiband parametric equalizer +- automatic bitstream filtering +- showspectrumpic filter +- libstagefright support removed +- spectrumsynth filter +- ahistogram filter +- only seek with the right mouse button in ffplay +- toggle full screen when double-clicking with the left mouse button in ffplay +- afftfilt filter +- convolution filter +- libquvi support removed +- support for dvaudio in wav and avi +- libaacplus and libvo-aacenc support removed +- Cineform HD decoder +- new DCA decoder with full support for DTS-HD extensions +- significant performance improvements in Windows Television (WTV) demuxer +- nnedi deinterlacer +- streamselect video and astreamselect audio filter +- swaprect filter +- metadata video and ametadata audio filter +- SMPTE VC-2 HQ profile support for the Dirac decoder +- SMPTE VC-2 native encoder supporting the HQ profile + + +version 2.8: +- colorkey video filter +- BFSTM/BCSTM demuxer +- little-endian ADPCM_THP decoder +- Hap decoder and encoder +- DirectDraw Surface image/texture decoder +- ssim filter +- optional new ASF demuxer +- showvolume filter +- Many improvements to the JPEG 2000 decoder +- Go2Meeting decoding support +- adrawgraph audio and drawgraph video filter +- removegrain video filter +- Intel QSV-accelerated MPEG-2 video and HEVC encoding +- Intel QSV-accelerated MPEG-2 video and HEVC decoding +- Intel QSV-accelerated VC-1 video decoding +- libkvazaar HEVC encoder +- erosion, dilation, deflate and inflate video filters +- Dynamic Audio Normalizer as dynaudnorm filter +- Reverse video and areverse audio filter +- Random filter +- deband filter +- AAC fixed-point decoding +- sidechaincompress audio filter +- bitstream filter for converting HEVC from MP4 to Annex B +- acrossfade audio filter +- allyuv and allrgb video sources +- atadenoise video filter +- OS X VideoToolbox support +- aphasemeter filter +- showfreqs filter +- vectorscope filter +- waveform filter +- hstack and vstack filter +- Support DNx100 (1440x1080@8) +- VAAPI hevc hwaccel +- VDPAU hevc hwaccel +- framerate filter +- Switched default encoders for webm to VP9 and Opus +- Removed experimental flag from the JPEG 2000 encoder + + +version 2.7: +- FFT video filter +- TDSC decoder +- DTS lossless extension (XLL) decoding (not lossless, disabled by default) +- showwavespic filter +- DTS decoding through libdcadec +- Drop support for nvenc API before 5.0 +- nvenc HEVC encoder +- Detelecine filter +- Intel QSV-accelerated H.264 encoding +- MMAL-accelerated H.264 decoding +- basic APNG encoder and muxer with default extension "apng" +- unpack DivX-style packed B-frames in MPEG-4 bitstream filter +- WebM Live Chunk Muxer +- nvenc level and tier options +- chorus filter +- Canopus HQ/HQA decoder +- Automatically rotate videos based on metadata in ffmpeg +- improved Quickdraw compatibility +- VP9 high bit-depth and extended colorspaces decoding support +- WebPAnimEncoder API when available for encoding and muxing WebP +- Direct3D11-accelerated decoding +- Support Secure Transport +- Multipart JPEG demuxer + + +version 2.6: +- nvenc encoder +- 10bit spp filter +- colorlevels filter +- RIFX format for *.wav files +- RTP/mpegts muxer +- non continuous cache protocol support +- tblend filter +- cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold +- Camellia symmetric block cipher +- OpenH264 encoder wrapper +- VOC seeking support +- Closed caption Decoder +- fspp, uspp, pp7 MPlayer postprocessing filters ported to native filters +- showpalette filter +- Twofish symmetric block cipher +- Support DNx100 (960x720@8) +- eq2 filter ported from libmpcodecs as eq filter +- removed libmpcodecs +- Changed default DNxHD colour range in QuickTime .mov derivatives to mpeg range +- ported softpulldown filter from libmpcodecs as repeatfields filter +- dcshift filter +- RTP depacketizer for loss tolerant payload format for MP3 audio (RFC 5219) +- RTP depacketizer for AC3 payload format (RFC 4184) +- palettegen and paletteuse filters +- VP9 RTP payload format (draft 0) experimental depacketizer +- RTP depacketizer for DV (RFC 6469) +- DXVA2-accelerated HEVC decoding +- AAC ELD 480 decoding +- Intel QSV-accelerated H.264 decoding +- DSS SP decoder and DSS demuxer +- Fix stsd atom corruption in DNxHD QuickTimes +- Canopus HQX decoder +- RTP depacketization of T.140 text (RFC 4103) +- Port MIPS optimizations to 64-bit + + +version 2.5: +- HEVC/H.265 RTP payload format (draft v6) packetizer +- SUP/PGS subtitle demuxer +- ffprobe -show_pixel_formats option +- CAST128 symmetric block cipher, ECB mode +- STL subtitle demuxer and decoder +- libutvideo YUV 4:2:2 10bit support +- XCB-based screen-grabber +- UDP-Lite support (RFC 3828) +- xBR scaling filter +- AVFoundation screen capturing support +- ffserver supports codec private options +- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer +- WebP muxer with animated WebP support +- zygoaudio decoding support +- APNG demuxer +- postproc visualization support + + +version 2.4: +- Icecast protocol +- ported lenscorrection filter from frei0r filter +- large optimizations in dctdnoiz to make it usable +- ICY metadata are now requested by default with the HTTP protocol +- support for using metadata in stream specifiers in fftools +- LZMA compression support in TIFF decoder +- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer +- HEVC/H.265 RTP payload format (draft v6) depacketizer +- added codecview filter to visualize information exported by some codecs +- Matroska 3D support thorugh side data +- HTML generation using texi2html is deprecated in favor of makeinfo/texi2any +- silenceremove filter + + +version 2.3: +- AC3 fixed-point decoding +- shuffleplanes filter +- subfile protocol +- Phantom Cine demuxer +- replaygain data export +- VP7 video decoder +- Alias PIX image encoder and decoder +- Improvements to the BRender PIX image decoder +- Improvements to the XBM decoder +- QTKit input device +- improvements to OpenEXR image decoder +- support decoding 16-bit RLE SGI images +- GDI screen grabbing for Windows +- alternative rendition support for HTTP Live Streaming +- AVFoundation input device +- Direct Stream Digital (DSD) decoder +- Magic Lantern Video (MLV) demuxer +- On2 AVC (Audio for Video) decoder +- support for decoding through DXVA2 in ffmpeg +- libbs2b-based stereo-to-binaural audio filter +- libx264 reference frames count limiting depending on level +- native Opus decoder +- display matrix export and rotation API +- WebVTT encoder +- showcqt multimedia filter +- zoompan filter +- signalstats filter +- hqx filter (hq2x, hq3x, hq4x) +- flanger filter +- Image format auto-detection +- LRC demuxer and muxer +- Samba protocol (via libsmbclient) +- WebM DASH Manifest muxer +- libfribidi support in drawtext + + +version 2.2: + +- HNM version 4 demuxer and video decoder +- Live HDS muxer +- setsar/setdar filters now support variables in ratio expressions +- elbg filter +- string validation in ffprobe +- support for decoding through VDPAU in ffmpeg (the -hwaccel option) +- complete Voxware MetaSound decoder +- remove mp3_header_compress bitstream filter +- Windows resource files for shared libraries +- aeval filter +- stereoscopic 3d metadata handling +- WebP encoding via libwebp +- ATRAC3+ decoder +- VP8 in Ogg demuxing +- side & metadata support in NUT +- framepack filter +- XYZ12 rawvideo support in NUT +- Exif metadata support in WebP decoder +- OpenGL device +- Use metadata_header_padding to control padding in ID3 tags (currently used in + MP3, AIFF, and OMA files), FLAC header, and the AVI "junk" block. +- Mirillis FIC video decoder +- Support DNx444 +- libx265 encoder +- dejudder filter +- Autodetect VDA like all other hardware accelerations +- aliases and defaults for Ogg subtypes (opus, spx) + + +version 2.1: + +- aecho filter +- perspective filter ported from libmpcodecs +- ffprobe -show_programs option +- compand filter +- RTMP seek support +- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate + even when used as an input option. Previous behavior can be restored with + the -noaccurate_seek option. +- ffmpeg -t option can now be used for inputs, to limit the duration of + data read from an input file +- incomplete Voxware MetaSound decoder +- read EXIF metadata from JPEG +- DVB teletext decoder +- phase filter ported from libmpcodecs +- w3fdif filter +- Opus support in Matroska +- FFV1 version 1.3 is stable and no longer experimental +- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support +- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be + more consistent with other muxers. +- adelay filter +- pullup filter ported from libmpcodecs +- ffprobe -read_intervals option +- Lossless and alpha support for WebP decoder +- Error Resilient AAC syntax (ER AAC LC) decoding +- Low Delay AAC (ER AAC LD) decoding +- mux chapters in ASF files +- SFTP protocol (via libssh) +- libx264: add ability to encode in YUVJ422P and YUVJ444P +- Fraps: use BT.709 colorspace by default for yuv, as reference fraps decoder does +- make decoding alpha optional for prores, ffv1 and vp6 by setting + the skip_alpha flag. +- ladspa wrapper filter +- native VP9 decoder +- dpx parser +- max_error_rate parameter in ffmpeg +- PulseAudio output device +- ReplayGain scanner +- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support) +- Linux framebuffer output device +- HEVC decoder +- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing +- mergeplanes filter + + +version 2.0: + +- curves filter +- reference-counting for AVFrame and AVPacket data +- ffmpeg now fails when input options are used for output file + or vice versa +- support for Monkey's Audio versions from 3.93 +- perms and aperms filters +- audio filtering support in ffplay +- 10% faster aac encoding on x86 and MIPS +- sine audio filter source +- WebP demuxing and decoding support +- ffmpeg options -filter_script and -filter_complex_script, which allow a + filtergraph description to be read from a file +- OpenCL support +- audio phaser filter +- separatefields filter +- libquvi demuxer +- uniform options syntax across all filters +- telecine filter +- interlace filter +- smptehdbars source +- inverse telecine filters (fieldmatch and decimate) +- colorbalance filter +- colorchannelmixer filter +- The matroska demuxer can now output proper verbatim ASS packets. It will + become the default at the next libavformat major bump. +- decent native animated GIF encoding +- asetrate filter +- interleave filter +- timeline editing with filters +- vidstabdetect and vidstabtransform filters for video stabilization using + the vid.stab library +- astats filter +- trim and atrim filters +- ffmpeg -t and -ss (output-only) options are now sample-accurate when + transcoding audio +- Matroska muxer can now put the index at the beginning of the file. +- extractplanes filter +- avectorscope filter +- ADPCM DTK decoder +- ADP demuxer +- RSD demuxer +- RedSpark demuxer +- ADPCM IMA Radical decoder +- zmq filters +- DCT denoiser filter (dctdnoiz) +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow") +- Apple Intermediate Codec decoder +- Escape 130 video decoder +- FTP protocol support +- V4L2 output device +- 3D LUT filter (lut3d) +- SMPTE 302M audio encoder +- support for slice multithreading in libavfilter +- Hald CLUT support (generation and filtering) +- VC-1 interlaced B-frame support +- support for WavPack muxing (raw and in Matroska) +- XVideo output device +- vignette filter +- True Audio (TTA) encoder +- Go2Webinar decoder +- mcdeint filter ported from libmpcodecs +- sab filter ported from libmpcodecs +- ffprobe -show_chapters option +- WavPack encoding through libwavpack +- rotate filter +- spp filter ported from libmpcodecs +- libgme support +- psnr filter + + +version 1.2: + +- VDPAU hardware acceleration through normal hwaccel +- SRTP support +- Error diffusion dither in Swscale +- Chained Ogg support +- Theora Midstream reconfiguration support +- EVRC decoder +- audio fade filter +- filtering audio with unknown channel layout +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass + and treble audio filter +- improved showspectrum filter, with multichannel support and sox-like colors +- histogram filter +- tee muxer +- il filter ported from libmpcodecs +- support ID3v2 tags in ASF files +- encrypted TTA stream decoding support +- RF64 support in WAV muxer +- noise filter ported from libmpcodecs +- Subtitles character encoding conversion +- blend filter +- stereo3d filter ported from libmpcodecs + + +version 1.1: + +- stream disposition information printing in ffprobe +- filter for loudness analysis following EBU R128 +- Opus encoder using libopus +- ffprobe -select_streams option +- Pinnacle TARGA CineWave YUV16 decoder +- TAK demuxer, decoder and parser +- DTS-HD demuxer +- remove -same_quant, it hasn't worked for years +- FFM2 support +- X-Face image encoder and decoder +- 24-bit FLAC encoding +- multi-channel ALAC encoding up to 7.1 +- metadata (INFO tag) support in WAV muxer +- subtitles raw text decoder +- support for building DLLs using MSVC +- LVF demuxer +- ffescape tool +- metadata (info chunk) support in CAF muxer +- field filter ported from libmpcodecs +- AVR demuxer +- geq filter ported from libmpcodecs +- remove ffserver daemon mode +- AST muxer/demuxer +- new expansion syntax for drawtext +- BRender PIX image decoder +- ffprobe -show_entries option +- ffprobe -sections option +- ADPCM IMA Dialogic decoder +- BRSTM demuxer +- animated GIF decoder and demuxer +- PVF demuxer +- subtitles filter +- IRCAM muxer/demuxer +- Paris Audio File demuxer +- Virtual concatenation demuxer +- VobSub demuxer +- JSON captions for TED talks decoding support +- SOX Resampler support in libswresample +- aselect filter +- SGI RLE 8-bit / Silicon Graphics RLE 8-bit video decoder +- Silicon Graphics Motion Video Compressor 1 & 2 decoder +- Silicon Graphics Movie demuxer +- apad filter +- Resolution & pixel format change support with multithreading for H.264 +- documentation split into per-component manuals +- pp (postproc) filter ported from MPlayer +- NIST Sphere demuxer +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders +- Sony Wave64 muxer +- adobe and limelight publisher authentication in RTMP +- data: URI scheme +- support building on the Plan 9 operating system +- kerndeint filter ported from MPlayer +- histeq filter ported from VirtualDub +- Megalux Frame demuxer +- 012v decoder +- Improved AVC Intra decoding support + + +version 1.0: + +- INI and flat output in ffprobe +- Scene detection in libavfilter +- Indeo Audio decoder +- channelsplit audio filter +- setnsamples audio filter +- atempo filter +- ffprobe -show_data option +- RTMPT protocol support +- iLBC encoding/decoding via libilbc +- Microsoft Screen 1 decoder +- join audio filter +- audio channel mapping filter +- Microsoft ATC Screen decoder +- RTSP listen mode +- TechSmith Screen Codec 2 decoder +- AAC encoding via libfdk-aac +- Microsoft Expression Encoder Screen decoder +- RTMPS protocol support +- RTMPTS protocol support +- RTMPE protocol support +- RTMPTE protocol support +- showwaves and showspectrum filter +- LucasArts SMUSH SANM playback support +- LucasArts SMUSH VIMA audio decoder (ADPCM) +- LucasArts SMUSH demuxer +- SAMI, RealText and SubViewer demuxers and decoders +- Heart Of Darkness PAF playback support +- iec61883 device +- asettb filter +- new option: -progress +- 3GPP Timed Text encoder/decoder +- GeoTIFF decoder support +- ffmpeg -(no)stdin option +- Opus decoder using libopus +- caca output device using libcaca +- alphaextract and alphamerge filters +- concat filter +- flite filter +- Canopus Lossless Codec decoder +- bitmap subtitles in filters (experimental and temporary) +- MP2 encoding via TwoLAME +- bmp parser +- smptebars source +- asetpts filter +- hue filter +- ICO muxer +- SubRip encoder and decoder without embedded timing +- edge detection filter +- framestep filter +- ffmpeg -shortest option is now per-output file + -pass and -passlogfile are now per-output stream +- volume measurement filter +- Ut Video encoder +- Microsoft Screen 2 decoder +- smartblur filter ported from MPlayer +- CPiA decoder +- decimate filter ported from MPlayer +- RTP depacketization of JPEG +- Smooth Streaming live segmenter muxer +- F4V muxer +- sendcmd and asendcmd filters +- WebVTT demuxer and decoder (simple tags supported) +- RTP packetization of JPEG +- faststart option in the MOV/MP4 muxer +- support for building with MSVC + + +version 0.11: + +- Fixes: CVE-2012-2772, CVE-2012-2774, CVE-2012-2775, CVE-2012-2776, CVE-2012-2777, + CVE-2012-2779, CVE-2012-2782, CVE-2012-2783, CVE-2012-2784, CVE-2012-2785, + CVE-2012-2786, CVE-2012-2787, CVE-2012-2788, CVE-2012-2789, CVE-2012-2790, + CVE-2012-2791, CVE-2012-2792, CVE-2012-2793, CVE-2012-2794, CVE-2012-2795, + CVE-2012-2796, CVE-2012-2797, CVE-2012-2798, CVE-2012-2799, CVE-2012-2800, + CVE-2012-2801, CVE-2012-2802, CVE-2012-2803, CVE-2012-2804, +- v408 Quicktime and Microsoft AYUV Uncompressed 4:4:4:4 encoder and decoder +- setfield filter +- CDXL demuxer and decoder +- Apple ProRes encoder +- ffprobe -count_packets and -count_frames options +- Sun Rasterfile Encoder +- ID3v2 attached pictures reading and writing +- WMA Lossless decoder +- bluray protocol +- blackdetect filter +- libutvideo encoder wrapper (--enable-libutvideo) +- swapuv filter +- bbox filter +- XBM encoder and decoder +- RealAudio Lossless decoder +- ZeroCodec decoder +- tile video filter +- Metal Gear Solid: The Twin Snakes demuxer +- OpenEXR image decoder +- removelogo filter +- drop support for ffmpeg without libavfilter +- drawtext video filter: fontconfig support +- ffmpeg -benchmark_all option +- super2xsai filter ported from libmpcodecs +- add libavresample audio conversion library for compatibility +- MicroDVD decoder +- Avid Meridien (AVUI) encoder and decoder +- accept + prefix to -pix_fmt option to disable automatic conversions. +- complete audio filtering in libavfilter and ffmpeg +- add fps filter +- vorbis parser +- png parser +- audio mix filter +- ffv1: support (draft) version 1.3 + + +version 0.10: + +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936, + CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944, + CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949, + CVE-2011-3950, CVE-2011-3951, CVE-2011-3952 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder +- SBaGen (SBG) binaural beats script demuxer +- OpenMG Audio muxer +- Timecode extraction in DV and MOV +- thumbnail video filter +- XML output in ffprobe +- asplit audio filter +- tinterlace video filter +- astreamsync audio filter +- amerge audio filter +- ISMV (Smooth Streaming) muxer +- GSM audio parser +- SMJPEG muxer +- XWD encoder and decoder +- Automatic thread count based on detection number of (available) CPU cores +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder +- ffprobe -show_error option +- Avid 1:1 10-bit RGB Packer codec +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder +- yuv4 libquicktime packed 4:2:0 encoder and decoder +- ffprobe -show_frames option +- silencedetect audio filter +- ffprobe -show_program_version, -show_library_versions, -show_versions options +- rv34: frame-level multi-threading +- optimized iMDCT transform on x86 using SSE for for mpegaudiodec +- Improved PGS subtitle decoder +- dumpgraph option to lavfi device +- r210 and r10k encoders +- ffwavesynth decoder +- aviocat tool +- ffeval tool +- support encoding and decoding 4-channel SGI images + + +version 0.9: + +- openal input device added +- boxblur filter added +- BWF muxer +- Flash Screen Video 2 decoder +- lavfi input device added +- added avconv, which is almost the same for now, except +for a few incompatible changes in the options, which will hopefully make them +easier to use. The changes are: + * The options placement is now strictly enforced! While in theory the + options for ffmpeg should be given in [input options] -i INPUT [output + options] OUTPUT order, in practice it was possible to give output options + before the -i and it mostly worked. Except when it didn't - the behavior was + a bit inconsistent. In avconv, it is not possible to mix input and output + options. All non-global options are reset after an input or output filename. + * All per-file options are now truly per-file - they apply only to the next + input or output file and specifying different values for different files + will now work properly (notably -ss and -t options). + * All per-stream options are now truly per-stream - it is possible to + specify which stream(s) should a given option apply to. See the Stream + specifiers section in the avconv manual for details. + * In ffmpeg some options (like -newvideo/-newaudio/...) are irregular in the + sense that they're specified after the output filename instead of before, + like all other options. In avconv this irregularity is removed, all options + apply to the next input or output file. + * -newvideo/-newaudio/-newsubtitle options were removed. Not only were they + irregular and highly confusing, they were also redundant. In avconv the -map + option will create new streams in the output file and map input streams to + them. E.g. avconv -i INPUT -map 0 OUTPUT will create an output stream for + each stream in the first input file. + * The -map option now has slightly different and more powerful syntax: + + Colons (':') are used to separate file index/stream type/stream index + instead of dots. Comma (',') is used to separate the sync stream instead + of colon.. This is done for consistency with other options. + + It's possible to specify stream type. E.g. -map 0:a:2 creates an + output stream from the third input audio stream. + + Omitting the stream index now maps all the streams of the given type, + not just the first. E.g. -map 0:s creates output streams for all the + subtitle streams in the first input file. + + Since -map can now match multiple streams, negative mappings were + introduced. Negative mappings disable some streams from an already + defined map. E.g. '-map 0 -map -0:a:1' means 'create output streams for + all the stream in the first input file, except for the second audio + stream'. + * There is a new option -c (or -codec) for choosing the decoder/encoder to + use, which makes it possible to precisely specify target stream(s) consistently with + other options. E.g. -c:v lib264 sets the codec for all video streams, -c:a:0 + libvorbis sets the codec for the first audio stream and -c copy copies all + the streams without reencoding. Old -vcodec/-acodec/-scodec options are now + aliases to -c:v/a/s + * It is now possible to precisely specify which stream should an AVOption + apply to. E.g. -b:v:0 2M sets the bitrate for the first video stream, while + -b:a 128k sets the bitrate for all audio streams. Note that the old -ab 128k + syntax is deprecated and will stop working soon. + * -map_chapters now takes only an input file index and applies to the next + output file. This is consistent with how all the other options work. + * -map_metadata now takes only an input metadata specifier and applies to + the next output file. Output metadata specifier is now part of the option + name, similarly to the AVOptions/map/codec feature above. + * -metadata can now be used to set metadata on streams and chapters, e.g. + -metadata:s:1 language=eng sets the language of the first stream to 'eng'. + This made -vlang/-alang/-slang options redundant, so they were removed. + * -qscale option now uses stream specifiers and applies to all streams, not + just video. I.e. plain -qscale number would now apply to all streams. To get + the old behavior, use -qscale:v. Also there is now a shortcut -q for -qscale + and -aq is now an alias for -q:a. + * -vbsf/-absf/-sbsf options were removed and replaced by a -bsf option which + uses stream specifiers. Use -bsf:v/a/s instead of the old options. + * -itsscale option now uses stream specifiers, so its argument is only the + scale parameter. + * -intra option was removed, use -g 0 for the same effect. + * -psnr option was removed, use -flags +psnr for the same effect. + * -vf option is now an alias to the new -filter option, which uses stream specifiers. + * -vframes/-aframes/-dframes options are now aliases to the new -frames option. + * -vtag/-atag/-stag options are now aliases to the new -tag option. +- XMV demuxer +- LOAS demuxer +- ashowinfo filter added +- Windows Media Image decoder +- amovie source added +- LATM muxer/demuxer +- Speex encoder via libspeex +- JSON output in ffprobe +- WTV muxer +- Optional C++ Support (needed for libstagefright) +- H.264 Decoding on Android via Stagefright +- Prores decoder +- BIN/XBIN/ADF/IDF text file decoder +- aconvert audio filter added +- audio support to lavfi input device added +- libcdio-paranoia input device for audio CD grabbing +- Apple ProRes decoder +- CELT in Ogg demuxing +- G.723.1 demuxer and decoder +- libmodplug support (--enable-libmodplug) +- VC-1 interlaced decoding +- libutvideo wrapper (--enable-libutvideo) +- aevalsrc audio source added +- Ut Video decoder +- Speex encoding via libspeex +- 4:2:2 H.264 decoding support +- 4:2:2 and 4:4:4 H.264 encoding with libx264 +- Pulseaudio input device +- Prores encoder +- Video Decoder Acceleration (VDA) HWAccel module. +- replacement Indeo 3 decoder +- new ffmpeg option: -map_channel +- volume audio filter added +- earwax audio filter added +- libv4l2 support (--enable-libv4l2) +- TLS/SSL and HTTPS protocol support +- AVOptions API rewritten and documented +- most of CODEC_FLAG2_*, some CODEC_FLAG_* and many codec-specific fields in + AVCodecContext deprecated. Codec private options should be used instead. +- Properly working defaults in libx264 wrapper, support for native presets. +- Encrypted OMA files support +- Discworld II BMV decoding support +- VBLE Decoder +- OS X Video Decoder Acceleration (VDA) support +- compact and csv output in ffprobe +- pan audio filter +- IFF Amiga Continuous Bitmap (ACBM) decoder +- ass filter +- CRI ADX audio format muxer and demuxer +- Playstation Portable PMP format demuxer +- Microsoft Windows ICO demuxer +- life source +- PCM format support in OMA demuxer +- CLJR encoder +- new option: -report +- Dxtory capture format decoder +- cellauto source +- Simple segmenting muxer +- Indeo 4 decoder +- SMJPEG demuxer + + +version 0.8: + +- many many things we forgot because we rather write code than changelogs +- WebM support in Matroska de/muxer +- low overhead Ogg muxing +- MMS-TCP support +- VP8 de/encoding via libvpx +- Demuxer for On2's IVF format +- Pictor/PC Paint decoder +- HE-AAC v2 decoder +- HE-AAC v2 encoding with libaacplus +- libfaad2 wrapper removed +- DTS-ES extension (XCh) decoding support +- native VP8 decoder +- RTSP tunneling over HTTP +- RTP depacketization of SVQ3 +- -strict inofficial replaced by -strict unofficial +- ffplay -exitonkeydown and -exitonmousedown options added +- native GSM / GSM MS decoder +- RTP depacketization of QDM2 +- ANSI/ASCII art playback system +- Lego Mindstorms RSO de/muxer +- libavcore added (and subsequently removed) +- SubRip subtitle file muxer and demuxer +- Chinese AVS encoding via libxavs +- ffprobe -show_packets option added +- RTP packetization of Theora and Vorbis +- RTP depacketization of MP4A-LATM +- RTP packetization and depacketization of VP8 +- hflip filter +- Apple HTTP Live Streaming demuxer +- a64 codec +- MMS-HTTP support +- G.722 ADPCM audio encoder/decoder +- R10k video decoder +- ocv_smooth filter +- frei0r wrapper filter +- change crop filter syntax to width:height:x:y +- make the crop filter accept parametric expressions +- make ffprobe accept AVFormatContext options +- yadif filter +- blackframe filter +- Demuxer for Leitch/Harris' VR native stream format (LXF) +- RTP depacketization of the X-QT QuickTime format +- SAP (Session Announcement Protocol, RFC 2974) muxer and demuxer +- cropdetect filter +- ffmpeg -crop* options removed +- transpose filter added +- ffmpeg -force_key_frames option added +- demuxer for receiving raw rtp:// URLs without an SDP description +- single stream LATM/LOAS decoder +- setpts filter added +- Win64 support for optimized x86 assembly functions +- MJPEG/AVI1 to JPEG/JFIF bitstream filter +- ASS subtitle encoder and decoder +- IEC 61937 encapsulation for E-AC-3, TrueHD, DTS-HD (for HDMI passthrough) +- overlay filter added +- rename aspect filter to setdar, and pixelaspect to setsar +- IEC 61937 demuxer +- Mobotix .mxg demuxer +- frei0r source added +- hqdn3d filter added +- RTP depacketization of QCELP +- FLAC parser added +- gradfun filter added +- AMR-WB decoder +- replace the ocv_smooth filter with a more generic ocv filter +- Windows Televison (WTV) demuxer +- FFmpeg metadata format muxer and demuxer +- SubRip (srt) subtitle encoder and decoder +- floating-point AC-3 encoder added +- Lagarith decoder +- ffmpeg -copytb option added +- IVF muxer added +- Wing Commander IV movies decoder added +- movie source added +- Bink version 'b' audio and video decoder +- Bitmap Brothers JV playback system +- Apple HTTP Live Streaming protocol handler +- sndio support for playback and record +- Linux framebuffer input device added +- Chronomaster DFA decoder +- DPX image encoder +- MicroDVD subtitle file muxer and demuxer +- Playstation Portable PMP format demuxer +- fieldorder video filter added +- AAC encoding via libvo-aacenc +- AMR-WB encoding via libvo-amrwbenc +- xWMA demuxer +- Mobotix MxPEG decoder +- VP8 frame-multithreading +- NEON optimizations for VP8 +- Lots of deprecated API cruft removed +- fft and imdct optimizations for AVX (Sandy Bridge) processors +- showinfo filter added +- SMPTE 302M AES3 audio decoder +- Apple Core Audio Format muxer +- 9bit and 10bit per sample support in the H.264 decoder +- 9bit and 10bit FFV1 encoding / decoding +- split filter added +- select filter added +- sdl output device added +- libmpcodecs video filter support (3 times as many filters than before) +- mpeg2 aspect ratio dection fixed +- libxvid aspect pickiness fixed +- Frame multithreaded decoding +- E-AC-3 audio encoder +- ac3enc: add channel coupling support +- floating-point sample format support to the ac3, eac3, dca, aac, and vorbis decoders. +- H264/MPEG frame-level multi-threading +- All av_metadata_* functions renamed to av_dict_* and moved to libavutil +- 4:4:4 H.264 decoding support +- 10-bit H.264 optimizations for x86 +- lut, lutrgb, and lutyuv filters added +- buffersink libavfilter sink added +- Bump libswscale for recently reported ABI break +- New J2K encoder (via OpenJPEG) + + +version 0.7: + +- all the changes for 0.8, but keeping API/ABI compatibility with the 0.6 release + + +version 0.6: + +- PB-frame decoding for H.263 +- deprecated vhook subsystem removed +- deprecated old scaler removed +- VQF demuxer +- Alpha channel scaler +- PCX encoder +- RTP packetization of H.263 +- RTP packetization of AMR +- RTP depacketization of Vorbis +- CorePNG decoding support +- Cook multichannel decoding support +- introduced avlanguage helpers in libavformat +- 8088flex TMV demuxer and decoder +- per-stream language-tags extraction in asfdec +- V210 decoder and encoder +- remaining GPL parts in AC-3 decoder converted to LGPL +- QCP demuxer +- SoX native format muxer and demuxer +- AMR-NB decoding/encoding, AMR-WB decoding via OpenCORE libraries +- DPX image decoder +- Electronic Arts Madcow decoder +- DivX (XSUB) subtitle encoder +- nonfree libamr support for AMR-NB/WB decoding/encoding removed +- experimental AAC encoder +- RTP depacketization of ASF and RTSP from WMS servers +- RTMP support in libavformat +- noX handling for OPT_BOOL X options +- Wave64 demuxer +- IEC-61937 compatible Muxer +- TwinVQ decoder +- Bluray (PGS) subtitle decoder +- LPCM support in MPEG-TS (HDMV RID as found on Blu-ray disks) +- WMA Pro decoder +- Core Audio Format demuxer +- ATRAC1 decoder +- MD STUDIO audio demuxer +- RF64 support in WAV demuxer +- MPEG-4 Audio Lossless Coding (ALS) decoder +- -formats option split into -formats, -codecs, -bsfs, and -protocols +- IV8 demuxer +- CDG demuxer and decoder +- R210 decoder +- Auravision Aura 1 and 2 decoders +- Deluxe Paint Animation playback system +- SIPR decoder +- Adobe Filmstrip muxer and demuxer +- RTP depacketization of H.263 +- Bink demuxer and audio/video decoders +- enable symbol versioning by default for linkers that support it +- IFF PBM/ILBM bitmap decoder +- concat protocol +- Indeo 5 decoder +- RTP depacketization of AMR +- WMA Voice decoder +- ffprobe tool +- AMR-NB decoder +- RTSP muxer +- HE-AAC v1 decoder +- Kega Game Video (KGV1) decoder +- VorbisComment writing for FLAC, Ogg FLAC and Ogg Speex files +- RTP depacketization of Theora +- HTTP Digest authentication +- RTMP/RTMPT/RTMPS/RTMPE/RTMPTE protocol support via librtmp +- Psygnosis YOP demuxer and video decoder +- spectral extension support in the E-AC-3 decoder +- unsharp video filter +- RTP hinting in the mov/3gp/mp4 muxer +- Dirac in Ogg demuxing +- seek to keyframes in Ogg +- 4:2:2 and 4:4:4 Theora decoding +- 35% faster VP3/Theora decoding +- faster AAC decoding +- faster H.264 decoding +- RealAudio 1.0 (14.4K) encoder + + +version 0.5: + +- DV50 AKA DVCPRO50 encoder, decoder, muxer and demuxer +- TechSmith Camtasia (TSCC) video decoder +- IBM Ultimotion (ULTI) video decoder +- Sierra Online audio file demuxer and decoder +- Apple QuickDraw (qdrw) video decoder +- Creative ADPCM audio decoder (16 bits as well as 8 bits schemes) +- Electronic Arts Multimedia (WVE/UV2/etc.) file demuxer +- Miro VideoXL (VIXL) video decoder +- H.261 video encoder +- QPEG video decoder +- Nullsoft Video (NSV) file demuxer +- Shorten audio decoder +- LOCO video decoder +- Apple Lossless Audio Codec (ALAC) decoder +- Winnov WNV1 video decoder +- Autodesk Animator Studio Codec (AASC) decoder +- Indeo 2 video decoder +- Fraps FPS1 video decoder +- Snow video encoder/decoder +- Sonic audio encoder/decoder +- Vorbis audio decoder +- Macromedia ADPCM decoder +- Duck TrueMotion 2 video decoder +- support for decoding FLX and DTA extensions in FLIC files +- H.264 custom quantization matrices support +- ffserver fixed, it should now be usable again +- QDM2 audio decoder +- Real Cooker audio decoder +- TrueSpeech audio decoder +- WMA2 audio decoder fixed, now all files should play correctly +- RealAudio 14.4 and 28.8 decoders fixed +- JPEG-LS decoder +- build system improvements +- tabs and trailing whitespace removed from the codebase +- CamStudio video decoder +- AIFF/AIFF-C audio format, encoding and decoding +- ADTS AAC file reading and writing +- Creative VOC file reading and writing +- American Laser Games multimedia (*.mm) playback system +- Zip Motion Blocks Video decoder +- improved Theora/VP3 decoder +- True Audio (TTA) decoder +- AVS demuxer and video decoder +- JPEG-LS encoder +- Smacker demuxer and decoder +- NuppelVideo/MythTV demuxer and RTjpeg decoder +- KMVC decoder +- MPEG-2 intra VLC support +- MPEG-2 4:2:2 encoder +- Flash Screen Video decoder +- GXF demuxer +- Chinese AVS decoder +- GXF muxer +- MXF demuxer +- VC-1/WMV3/WMV9 video decoder +- MacIntel support +- AviSynth support +- VMware video decoder +- VP5 video decoder +- VP6 video decoder +- WavPack lossless audio decoder +- Targa (.TGA) picture decoder +- Vorbis audio encoder +- Delphine Software .cin demuxer/audio and video decoder +- Tiertex .seq demuxer/video decoder +- MTV demuxer +- TIFF picture encoder and decoder +- GIF picture decoder +- Intel Music Coder decoder +- Zip Motion Blocks Video encoder +- Musepack decoder +- Flash Screen Video encoder +- Theora encoding via libtheora +- BMP encoder +- WMA encoder +- GSM-MS encoder and decoder +- DCA decoder +- DXA demuxer and decoder +- DNxHD decoder +- Gamecube movie (.THP) playback system +- Blackfin optimizations +- Interplay C93 demuxer and video decoder +- Bethsoft VID demuxer and video decoder +- CRYO APC demuxer +- ATRAC3 decoder +- V.Flash PTX decoder +- RoQ muxer, RoQ audio encoder +- Renderware TXD demuxer and decoder +- extern C declarations for C++ removed from headers +- sws_flags command line option +- codebook generator +- RoQ video encoder +- QTRLE encoder +- OS/2 support removed and restored again +- AC-3 decoder +- NUT muxer +- additional SPARC (VIS) optimizations +- Matroska muxer +- slice-based parallel H.264 decoding +- Monkey's Audio demuxer and decoder +- AMV audio and video decoder +- DNxHD encoder +- H.264 PAFF decoding +- Nellymoser ASAO decoder +- Beam Software SIFF demuxer and decoder +- libvorbis Vorbis decoding removed in favor of native decoder +- IntraX8 (J-Frame) subdecoder for WMV2 and VC-1 +- Ogg (Theora, Vorbis and FLAC) muxer +- The "device" muxers and demuxers are now in a new libavdevice library +- PC Paintbrush PCX decoder +- Sun Rasterfile decoder +- TechnoTrend PVA demuxer +- Linux Media Labs MPEG-4 (LMLM4) demuxer +- AVM2 (Flash 9) SWF muxer +- QT variant of IMA ADPCM encoder +- VFW grabber +- iPod/iPhone compatible mp4 muxer +- Mimic decoder +- MSN TCP Webcam stream demuxer +- RL2 demuxer / decoder +- IFF demuxer +- 8SVX audio decoder +- non-recursive Makefiles +- BFI demuxer +- MAXIS EA XA (.xa) demuxer / decoder +- BFI video decoder +- OMA demuxer +- MLP/TrueHD decoder +- Electronic Arts CMV decoder +- Motion Pixels Video decoder +- Motion Pixels MVI demuxer +- removed animated GIF decoder/demuxer +- D-Cinema audio muxer +- Electronic Arts TGV decoder +- Apple Lossless Audio Codec (ALAC) encoder +- AAC decoder +- floating point PCM encoder/decoder +- MXF muxer +- DV100 AKA DVCPRO HD decoder and demuxer +- E-AC-3 support added to AC-3 decoder +- Nellymoser ASAO encoder +- ASS and SSA demuxer and muxer +- liba52 wrapper removed +- SVQ3 watermark decoding support +- Speex decoding via libspeex +- Electronic Arts TGQ decoder +- RV40 decoder +- QCELP / PureVoice decoder +- RV30 decoder +- hybrid WavPack support +- R3D REDCODE demuxer +- ALSA support for playback and record +- Electronic Arts TQI decoder +- OpenJPEG based JPEG 2000 decoder +- NC (NC4600) camera file demuxer +- Gopher client support +- MXF D-10 muxer +- generic metadata API +- flash ScreenVideo2 encoder + + +version 0.4.9-pre1: + +- DV encoder, DV muxer +- Microsoft RLE video decoder +- Microsoft Video-1 decoder +- Apple Animation (RLE) decoder +- Apple Graphics (SMC) decoder +- Apple Video (RPZA) decoder +- Cinepak decoder +- Sega FILM (CPK) file demuxer +- Westwood multimedia support (VQA & AUD files) +- Id Quake II CIN playback support +- 8BPS video decoder +- FLIC playback support +- RealVideo 2.0 (RV20) decoder +- Duck TrueMotion v1 (DUCK) video decoder +- Sierra VMD demuxer and video decoder +- MSZH and ZLIB decoder support +- SVQ1 video encoder +- AMR-WB support +- PPC optimizations +- rate distortion optimal cbp support +- rate distorted optimal ac prediction for MPEG-4 +- rate distorted optimal lambda->qp support +- AAC encoding with libfaac +- Sunplus JPEG codec (SP5X) support +- use Lagrange multipler instead of QP for ratecontrol +- Theora/VP3 decoding support +- XA and ADX ADPCM codecs +- export MPEG-2 active display area / pan scan +- Add support for configuring with IBM XLC +- floating point AAN DCT +- initial support for zygo video (not complete) +- RGB ffv1 support +- new audio/video parser API +- av_log() system +- av_read_frame() and av_seek_frame() support +- missing last frame fixes +- seek by mouse in ffplay +- noise reduction of DCT coefficients +- H.263 OBMC & 4MV support +- H.263 alternative inter vlc support +- H.263 loop filter +- H.263 slice structured mode +- interlaced DCT support for MPEG-2 encoding +- stuffing to stay above min_bitrate +- MB type & QP visualization +- frame stepping for ffplay +- interlaced motion estimation +- alternate scantable support +- SVCD scan offset support +- closed GOP support +- SSE2 FDCT +- quantizer noise shaping +- G.726 ADPCM audio codec +- MS ADPCM encoding +- multithreaded/SMP motion estimation +- multithreaded/SMP encoding for MPEG-1/MPEG-2/MPEG-4/H.263 +- multithreaded/SMP decoding for MPEG-2 +- FLAC decoder +- Metrowerks CodeWarrior suppport +- H.263+ custom pcf support +- nicer output for 'ffmpeg -formats' +- Matroska demuxer +- SGI image format, encoding and decoding +- H.264 loop filter support +- H.264 CABAC support +- nicer looking arrows for the motion vector visualization +- improved VCD support +- audio timestamp drift compensation +- MPEG-2 YUV 422/444 support +- polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample +- better image scaling +- H.261 support +- correctly interleave packets during encoding +- VIS optimized motion compensation +- intra_dc_precision>0 encoding support +- support reuse of motion vectors/MB types/field select values of the source video +- more accurate deblock filter +- padding support +- many optimizations and bugfixes +- FunCom ISS audio file demuxer and according ADPCM decoding + + +version 0.4.8: + +- MPEG-2 video encoding (Michael) +- Id RoQ playback subsystem (Mike Melanson and Tim Ferguson) +- Wing Commander III Movie (.mve) file playback subsystem (Mike Melanson + and Mario Brito) +- Xan DPCM audio decoder (Mario Brito) +- Interplay MVE playback subsystem (Mike Melanson) +- Duck DK3 and DK4 ADPCM audio decoders (Mike Melanson) + + +version 0.4.7: + +- RealAudio 1.0 (14_4) and 2.0 (28_8) native decoders. Author unknown, code from mplayerhq + (originally from public domain player for Amiga at http://www.honeypot.net/audio) +- current version now also compiles with older GCC (Fabrice) +- 4X multimedia playback system including 4xm file demuxer (Mike + Melanson), and 4X video and audio codecs (Michael) +- Creative YUV (CYUV) decoder (Mike Melanson) +- FFV1 codec (our very simple lossless intra only codec, compresses much better + than HuffYUV) (Michael) +- ASV1 (Asus), H.264, Intel indeo3 codecs have been added (various) +- tiny PNG encoder and decoder, tiny GIF decoder, PAM decoder (PPM with + alpha support), JPEG YUV colorspace support. (Fabrice Bellard) +- ffplay has been replaced with a newer version which uses SDL (optionally) + for multiplatform support (Fabrice) +- Sorenson Version 3 codec (SVQ3) support has been added (decoding only) - donated + by anonymous +- AMR format has been added (Johannes Carlsson) +- 3GP support has been added (Johannes Carlsson) +- VP3 codec has been added (Mike Melanson) +- more MPEG-1/2 fixes +- better multiplatform support, MS Visual Studio fixes (various) +- AltiVec optimizations (Magnus Damn and others) +- SH4 processor support has been added (BERO) +- new public interfaces (avcodec_get_pix_fmt) (Roman Shaposhnick) +- VOB streaming support (Brian Foley) +- better MP3 autodetection (Andriy Rysin) +- qpel encoding (Michael) +- 4mv+b frames encoding finally fixed (Michael) +- chroma ME (Michael) +- 5 comparison functions for ME (Michael) +- B-frame encoding speedup (Michael) +- WMV2 codec (unfinished - Michael) +- user specified diamond size for EPZS (Michael) +- Playstation STR playback subsystem, still experimental (Mike and Michael) +- ASV2 codec (Michael) +- CLJR decoder (Alex) + +.. And lots more new enhancements and fixes. + + +version 0.4.6: + +- completely new integer only MPEG audio layer 1/2/3 decoder rewritten + from scratch +- Recoded DCT and motion vector search with gcc (no longer depends on nasm) +- fix quantization bug in AC3 encoder +- added PCM codecs and format. Corrected WAV/AVI/ASF PCM issues +- added prototype ffplay program +- added GOB header parsing on H.263/H.263+ decoder (Juanjo) +- bug fix on MCBPC tables of H.263 (Juanjo) +- bug fix on DC coefficients of H.263 (Juanjo) +- added Advanced Prediction Mode on H.263/H.263+ decoder (Juanjo) +- now we can decode H.263 streams found in QuickTime files (Juanjo) +- now we can decode H.263 streams found in VIVO v1 files(Juanjo) +- preliminary RTP "friendly" mode for H.263/H.263+ coding. (Juanjo) +- added GOB header for H.263/H.263+ coding on RTP mode (Juanjo) +- now H.263 picture size is returned on the first decoded frame (Juanjo) +- added first regression tests +- added MPEG-2 TS demuxer +- new demux API for libav +- more accurate and faster IDCT (Michael) +- faster and entropy-controlled motion search (Michael) +- two pass video encoding (Michael) +- new video rate control (Michael) +- added MSMPEG4V1, MSMPEGV2 and WMV1 support (Michael) +- great performance improvement of video encoders and decoders (Michael) +- new and faster bit readers and vlc parsers (Michael) +- high quality encoding mode: tries all macroblock/VLC types (Michael) +- added DV video decoder +- preliminary RTP/RTSP support in ffserver and libavformat +- H.263+ AIC decoding/encoding support (Juanjo) +- VCD MPEG-PS mode (Juanjo) +- PSNR stuff (Juanjo) +- simple stats output (Juanjo) +- 16-bit and 15-bit RGB/BGR/GBR support (Bisqwit) + + +version 0.4.5: + +- some header fixes (Zdenek Kabelac <kabi at informatics.muni.cz>) +- many MMX optimizations (Nick Kurshev <nickols_k at mail.ru>) +- added configure system (actually a small shell script) +- added MPEG audio layer 1/2/3 decoding using LGPL'ed mpglib by + Michael Hipp (temporary solution - waiting for integer only + decoder) +- fixed VIDIOCSYNC interrupt +- added Intel H.263 decoding support ('I263' AVI fourCC) +- added Real Video 1.0 decoding (needs further testing) +- simplified image formats again. Added PGM format (=grey + pgm). Renamed old PGM to PGMYUV. +- fixed msmpeg4 slice issues (tell me if you still find problems) +- fixed OpenDivX bugs with newer versions (added VOL header decoding) +- added support for MPlayer interface +- added macroblock skip optimization +- added MJPEG decoder +- added mmx/mmxext IDCT from libmpeg2 +- added pgmyuvpipe, ppm, and ppm_pipe formats (original patch by Celer + <celer at shell.scrypt.net>) +- added pixel format conversion layer (e.g. for MJPEG or PPM) +- added deinterlacing option +- MPEG-1/2 fixes +- MPEG-4 vol header fixes (Jonathan Marsden <snmjbm at pacbell.net>) +- ARM optimizations (Lionel Ulmer <lionel.ulmer at free.fr>). +- Windows porting of file converter +- added MJPEG raw format (input/output) +- added JPEG image format support (input/output) + + +version 0.4.4: + +- fixed some std header definitions (Bjorn Lindgren + <bjorn.e.lindgren at telia.com>). +- added MPEG demuxer (MPEG-1 and 2 compatible). +- added ASF demuxer +- added prototype RM demuxer +- added AC3 decoding (done with libac3 by Aaron Holtzman) +- added decoding codec parameter guessing (.e.g. for MPEG, because the + header does not include them) +- fixed header generation in MPEG-1, AVI and ASF muxer: wmplayer can now + play them (only tested video) +- fixed H.263 white bug +- fixed phase rounding in img resample filter +- add MMX code for polyphase img resample filter +- added CPU autodetection +- added generic title/author/copyright/comment string handling (ASF and RM + use them) +- added SWF demux to extract MP3 track (not usable yet because no MP3 + decoder) +- added fractional frame rate support +- codecs are no longer searched by read_header() (should fix ffserver + segfault) + + +version 0.4.3: + +- BGR24 patch (initial patch by Jeroen Vreeken <pe1rxq at amsat.org>) +- fixed raw yuv output +- added motion rounding support in MPEG-4 +- fixed motion bug rounding in MSMPEG4 +- added B-frame handling in video core +- added full MPEG-1 decoding support +- added partial (frame only) MPEG-2 support +- changed the FOURCC code for H.263 to "U263" to be able to see the + +AVI/H.263 file with the UB Video H.263+ decoder. MPlayer works with + this +codec ;) (JuanJo). +- Halfpel motion estimation after MB type selection (JuanJo) +- added pgm and .Y.U.V output format +- suppressed 'img:' protocol. Simply use: /tmp/test%d.[pgm|Y] as input or + output. +- added pgmpipe I/O format (original patch from Martin Aumueller + <lists at reserv.at>, but changed completely since we use a format + instead of a protocol) + + +version 0.4.2: + +- added H.263/MPEG-4/MSMPEG4 decoding support. MPEG-4 decoding support + (for OpenDivX) is almost complete: 8x8 MVs and rounding are + missing. MSMPEG4 support is complete. +- added prototype MPEG-1 decoder. Only I- and P-frames handled yet (it + can decode ffmpeg MPEGs :-)). +- added libavcodec API documentation (see apiexample.c). +- fixed image polyphase bug (the bottom of some images could be + greenish) +- added support for non clipped motion vectors (decoding only) + and image sizes non-multiple of 16 +- added support for AC prediction (decoding only) +- added file overwrite confirmation (can be disabled with -y) +- added custom size picture to H.263 using H.263+ (Juanjo) + + +version 0.4.1: + +- added MSMPEG4 (aka DivX) compatible encoder. Changed default codec + of AVI and ASF to DIV3. +- added -me option to set motion estimation method + (default=log). suppressed redundant -hq option. +- added options -acodec and -vcodec to force a given codec (useful for + AVI for example) +- fixed -an option +- improved dct_quantize speed +- factorized some motion estimation code + + +version 0.4.0: + +- removing grab code from ffserver and moved it to ffmpeg. Added + multistream support to ffmpeg. +- added timeshifting support for live feeds (option ?date=xxx in the + URL) +- added high quality image resize code with polyphase filter (need + mmx/see optimization). Enable multiple image size support in ffserver. +- added multi live feed support in ffserver +- suppressed master feature from ffserver (it should be done with an + external program which opens the .ffm url and writes it to another + ffserver) +- added preliminary support for video stream parsing (WAV and AVI half + done). Added proper support for audio/video file conversion in + ffmpeg. +- added preliminary support for video file sending from ffserver +- redesigning I/O subsystem: now using URL based input and output + (see avio.h) +- added WAV format support +- added "tty user interface" to ffmpeg to stop grabbing gracefully +- added MMX/SSE optimizations to SAD (Sums of Absolutes Differences) + (Juan J. Sierralta P. a.k.a. "Juanjo" <juanjo at atmlab.utfsm.cl>) +- added MMX DCT from mpeg2_movie 1.5 (Juanjo) +- added new motion estimation algorithms, log and phods (Juanjo) +- changed directories: libav for format handling, libavcodec for + codecs + + +version 0.3.4: + +- added stereo in MPEG audio encoder + + +version 0.3.3: + +- added 'high quality' mode which use motion vectors. It can be used in + real time at low resolution. +- fixed rounding problems which caused quality problems at high + bitrates and large GOP size + + +version 0.3.2: small fixes + +- ASF fixes +- put_seek bug fix + + +version 0.3.1: added avi/divx support + +- added AVI support +- added MPEG-4 codec compatible with OpenDivX. It is based on the H.263 codec +- added sound for flash format (not tested) + + +version 0.3: initial public release
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/INSTALL.md b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/INSTALL.md new file mode 100644 index 0000000..5db9122 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/INSTALL.md
@@ -0,0 +1,17 @@ +#Installing FFmpeg: + +1. Type `./configure` to create the configuration. A list of configure +options is printed by running `configure --help`. + + `configure` can be launched from a directory different from the FFmpeg +sources to build the objects out of tree. To do this, use an absolute +path when launching `configure`, e.g. `/ffmpegdir/ffmpeg/configure`. + +2. Then type `make` to build FFmpeg. GNU Make 3.81 or later is required. + +3. Type `make install` to install all binaries and libraries you built. + +NOTICE +------ + + - Non system dependencies (e.g. libx264, libvpx) are disabled by default.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/LICENSE.md b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/LICENSE.md new file mode 100644 index 0000000..0c53d0f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/LICENSE.md
@@ -0,0 +1,114 @@ +#FFmpeg: + +Most files in FFmpeg are under the GNU Lesser General Public License version 2.1 +or later (LGPL v2.1+). Read the file `COPYING.LGPLv2.1` for details. Some other +files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to +FFmpeg. + +Some optional parts of FFmpeg are licensed under the GNU General Public License +version 2 or later (GPL v2+). See the file `COPYING.GPLv2` for details. None of +these parts are used by default, you have to explicitly pass `--enable-gpl` to +configure to activate them. In this case, FFmpeg's license changes to GPL v2+. + +Specifically, the GPL parts of FFmpeg are: + +- libpostproc +- optional x86 optimizations in the files + - `libavcodec/x86/flac_dsp_gpl.asm` + - `libavcodec/x86/idct_mmx.c` + - `libavfilter/x86/vf_removegrain.asm` +- libutvideo encoding/decoding wrappers in + `libavcodec/libutvideo*.cpp` +- the X11 grabber in `libavdevice/x11grab.c` +- the swresample test app in + `libswresample/swresample-test.c` +- the `texi2pod.pl` tool +- the following filters in libavfilter: + - `f_ebur128.c` + - `vf_blackframe.c` + - `vf_boxblur.c` + - `vf_colormatrix.c` + - `vf_cover_rect.c` + - `vf_cropdetect.c` + - `vf_delogo.c` + - `vf_eq.c` + - `vf_find_rect.c` + - `vf_fspp.c` + - `vf_geq.c` + - `vf_histeq.c` + - `vf_hqdn3d.c` + - `vf_interlace.c` + - `vf_kerndeint.c` + - `vf_mcdeint.c` + - `vf_mpdecimate.c` + - `vf_owdenoise.c` + - `vf_perspective.c` + - `vf_phase.c` + - `vf_pp.c` + - `vf_pp7.c` + - `vf_pullup.c` + - `vf_sab.c` + - `vf_smartblur.c` + - `vf_repeatfields.c` + - `vf_spp.c` + - `vf_stereo3d.c` + - `vf_super2xsai.c` + - `vf_tinterlace.c` + - `vf_uspp.c` + - `vsrc_mptestsrc.c` + +Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then +the configure parameter `--enable-version3` will activate this licensing option +for you. Read the file `COPYING.LGPLv3` or, if you have enabled GPL parts, +`COPYING.GPLv3` to learn the exact legal terms that apply in this case. + +There are a handful of files under other licensing terms, namely: + +* The files `libavcodec/jfdctfst.c`, `libavcodec/jfdctint_template.c` and + `libavcodec/jrevdct.c` are taken from libjpeg, see the top of the files for + licensing details. Specifically note that you must credit the IJG in the + documentation accompanying your program if you only distribute executables. + You must also indicate any changes including additions and deletions to + those three files in the documentation. +* `tests/reference.pnm` is under the expat license. + + +external libraries +================== + +FFmpeg can be combined with a number of external libraries, which sometimes +affect the licensing of binaries resulting from the combination. + +compatible libraries +-------------------- + +The following libraries are under GPL: +- frei0r +- libcdio +- librubberband +- libutvideo +- libvidstab +- libx264 +- libx265 +- libxavs +- libxvid + +When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by +passing `--enable-gpl` to configure. + +The OpenCORE and VisualOn libraries are under the Apache License 2.0. That +license is incompatible with the LGPL v2.1 and the GPL v2, but not with +version 3 of those licenses. So to combine these libraries with FFmpeg, the +license version needs to be upgraded by passing `--enable-version3` to configure. + +incompatible libraries +---------------------- + +The Fraunhofer AAC library and FAAC are under licenses which +are incompatible with the GPLv2 and v3. We do not know for certain if their +licenses are compatible with the LGPL. +If you wish to enable these libraries, pass `--enable-nonfree` to configure. +But note that if you enable any of these libraries the resulting binary will +be under a complex license mix that is more restrictive than the LGPL and that +may result in additional obligations. It is possible that these +restrictions cause the resulting binary to be unredistributeable.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/MAINTAINERS b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/MAINTAINERS new file mode 100644 index 0000000..e57150d --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/MAINTAINERS
@@ -0,0 +1,619 @@ +FFmpeg maintainers +================== + +Below is a list of the people maintaining different parts of the +FFmpeg code. + +Please try to keep entries where you are the maintainer up to date! + +Names in () mean that the maintainer currently has no time to maintain the code. +A (CC <address>) after the name means that the maintainer prefers to be CC-ed on +patches and related discussions. + + +Project Leader +============== + + final design decisions + + +Applications +============ + +ffmpeg: + ffmpeg.c Michael Niedermayer + +ffplay: + ffplay.c Marton Balint + +ffprobe: + ffprobe.c Stefano Sabatini + +ffserver: + ffserver.c Reynaldo H. Verdejo Pinochet + +Commandline utility code: + cmdutils.c, cmdutils.h Michael Niedermayer + +QuickTime faststart: + tools/qt-faststart.c Baptiste Coudurier + + +Miscellaneous Areas +=================== + +documentation Stefano Sabatini, Mike Melanson, Timothy Gu, Lou Logan +build system (configure, makefiles) Diego Biurrun, Mans Rullgard +project server Árpád Gereöffy, Michael Niedermayer, Reimar Doeffinger, Alexander Strasser, Lou Logan +presets Robert Swain +metadata subsystem Aurelien Jacobs +release management Michael Niedermayer + + +Communication +============= + +website Deby Barbara Lepage +fate.ffmpeg.org Timothy Gu +Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan +mailing lists Michael Niedermayer, Baptiste Coudurier, Lou Logan +Google+ Paul B Mahol, Michael Niedermayer, Alexander Strasser +Twitter Lou Logan, Reynaldo H. Verdejo Pinochet +Launchpad Timothy Gu + + +libavutil +========= + +External Interfaces: + libavutil/avutil.h Michael Niedermayer +Internal Interfaces: + libavutil/common.h Michael Niedermayer + +Other: + aes_ctr.c, aes_ctr.h Eran Kornblau + bprint Nicolas George + bswap.h + des Reimar Doeffinger + dynarray.h Nicolas George + eval.c, eval.h Michael Niedermayer + float_dsp Loren Merritt + hash Reimar Doeffinger + intfloat* Michael Niedermayer + integer.c, integer.h Michael Niedermayer + lzo Reimar Doeffinger + mathematics.c, mathematics.h Michael Niedermayer + mem.c, mem.h Michael Niedermayer + opencl.c, opencl.h Wei Gao + opt.c, opt.h Michael Niedermayer + rational.c, rational.h Michael Niedermayer + rc4 Reimar Doeffinger + ripemd.c, ripemd.h James Almer + timecode Clément Bœsch + + +libavcodec +========== + +Generic Parts: + External Interfaces: + avcodec.h Michael Niedermayer + utility code: + utils.c Michael Niedermayer + audio and video frame extraction: + parser.c Michael Niedermayer + bitstream reading: + bitstream.c, bitstream.h Michael Niedermayer + CABAC: + cabac.h, cabac.c Michael Niedermayer + codec names: + codec_names.sh Nicolas George + DSP utilities: + dsputils.c, dsputils.h Michael Niedermayer + entropy coding: + rangecoder.c, rangecoder.h Michael Niedermayer + lzw.* Michael Niedermayer + floating point AAN DCT: + faandct.c, faandct.h Michael Niedermayer + Golomb coding: + golomb.c, golomb.h Michael Niedermayer + LPC: + lpc.c, lpc.h Justin Ruggles + motion estimation: + motion* Michael Niedermayer + rate control: + ratecontrol.c Michael Niedermayer + libxvid_rc.c Michael Niedermayer + simple IDCT: + simple_idct.c, simple_idct.h Michael Niedermayer + postprocessing: + libpostproc/* Michael Niedermayer + table generation: + tableprint.c, tableprint.h Reimar Doeffinger + fixed point FFT: + fft* Zeljko Lukac + Text Subtitles Clément Bœsch + +Codecs: + 4xm.c Michael Niedermayer + 8bps.c Roberto Togni + 8svx.c Jaikrishnan Menon + aacenc*, aaccoder.c Rostislav Pehlivanov + aasc.c Kostya Shishkov + ac3* Justin Ruggles + alacenc.c Jaikrishnan Menon + alsdec.c Thilo Borgmann + apedec.c Kostya Shishkov + ass* Aurelien Jacobs + asv* Michael Niedermayer + atrac3* Benjamin Larsson + atrac3plus* Maxim Poliakovski + bgmc.c, bgmc.h Thilo Borgmann + bink.c Kostya Shishkov + binkaudio.c Peter Ross + bmp.c Mans Rullgard, Kostya Shishkov + cavs* Stefan Gehrer + cdxl.c Paul B Mahol + celp_filters.* Vitor Sessak + cinepak.c Roberto Togni + cinepakenc.c Rl / Aetey G.T. AB + ccaption_dec.c Anshul Maheshwari + cljr Alex Beregszaszi + cllc.c Derek Buitenhuis + cook.c, cookdata.h Benjamin Larsson + cpia.c Stephan Hilb + crystalhd.c Philip Langdale + cscd.c Reimar Doeffinger + dca.c Kostya Shishkov, Benjamin Larsson + dirac* Rostislav Pehlivanov + dnxhd* Baptiste Coudurier + dpcm.c Mike Melanson + dss_sp.c Oleksij Rempel, Michael Niedermayer + dv.c Roman Shaposhnik + dvbsubdec.c Anshul Maheshwari + dxa.c Kostya Shishkov + eacmv*, eaidct*, eat* Peter Ross + evrc* Paul B Mahol + exif.c, exif.h Thilo Borgmann + ffv1* Michael Niedermayer + ffwavesynth.c Nicolas George + fic.c Derek Buitenhuis + flac* Justin Ruggles + flashsv* Benjamin Larsson + flicvideo.c Mike Melanson + g722.c Martin Storsjo + g726.c Roman Shaposhnik + gifdec.c Baptiste Coudurier + h261* Michael Niedermayer + h263* Michael Niedermayer + h264* Loren Merritt, Michael Niedermayer + hap* Tom Butterworth + huffyuv* Michael Niedermayer, Christophe Gisquet + idcinvideo.c Mike Melanson + imc* Benjamin Larsson + indeo2* Kostya Shishkov + indeo5* Kostya Shishkov + interplayvideo.c Mike Melanson + ivi* Kostya Shishkov + jacosub* Clément Bœsch + jpeg2000* Nicolas Bertrand + jpeg_ls.c Kostya Shishkov + jvdec.c Peter Ross + kmvc.c Kostya Shishkov + lcl*.c Roberto Togni, Reimar Doeffinger + libcelt_dec.c Nicolas George + libdirac* David Conrad + libgsm.c Michel Bardiaux + libkvazaar.c Arttu Ylä-Outinen + libopenjpeg.c Jaikrishnan Menon + libopenjpegenc.c Michael Bradshaw + libschroedinger* David Conrad + libspeexdec.c Justin Ruggles + libtheoraenc.c David Conrad + libutvideo* Carl Eugen Hoyos + libvorbis.c David Conrad + libvpx* James Zern + libx264.c Mans Rullgard, Jason Garrett-Glaser + libx265.c Derek Buitenhuis + libxavs.c Stefan Gehrer + libzvbi-teletextdec.c Marton Balint + loco.c Kostya Shishkov + lzo.h, lzo.c Reimar Doeffinger + mdec.c Michael Niedermayer + mimic.c Ramiro Polla + mjpeg*.c Michael Niedermayer + mlp* Ramiro Polla + mmvideo.c Peter Ross + mpc* Kostya Shishkov + mpeg12.c, mpeg12data.h Michael Niedermayer + mpegvideo.c, mpegvideo.h Michael Niedermayer + mqc* Nicolas Bertrand + msmpeg4.c, msmpeg4data.h Michael Niedermayer + msrle.c Mike Melanson + msvideo1.c Mike Melanson + nellymoserdec.c Benjamin Larsson + nuv.c Reimar Doeffinger + nvenc.c Timo Rothenpieler + paf.* Paul B Mahol + pcx.c Ivo van Poorten + pgssubdec.c Reimar Doeffinger + ptx.c Ivo van Poorten + qcelp* Reynaldo H. Verdejo Pinochet + qdm2.c, qdm2data.h Roberto Togni, Benjamin Larsson + qdrw.c Kostya Shishkov + qpeg.c Kostya Shishkov + qsv* Ivan Uskov + qtrle.c Mike Melanson + ra144.c, ra144.h, ra288.c, ra288.h Roberto Togni + resample2.c Michael Niedermayer + rl2.c Sascha Sommer + rpza.c Roberto Togni + rtjpeg.c, rtjpeg.h Reimar Doeffinger + rv10.c Michael Niedermayer + rv3* Kostya Shishkov + rv4* Kostya Shishkov, Christophe Gisquet + s3tc* Ivo van Poorten + smacker.c Kostya Shishkov + smc.c Mike Melanson + smvjpegdec.c Ash Hughes + snow* Michael Niedermayer, Loren Merritt + sonic.c Alex Beregszaszi + srt* Aurelien Jacobs + sunrast.c Ivo van Poorten + svq3.c Michael Niedermayer + tak* Paul B Mahol + targa.c Kostya Shishkov + tiff.c Kostya Shishkov + truemotion1* Mike Melanson + truemotion2* Kostya Shishkov + truespeech.c Kostya Shishkov + tscc.c Kostya Shishkov + tta.c Alex Beregszaszi, Jaikrishnan Menon + ttaenc.c Paul B Mahol + txd.c Ivo van Poorten + ulti* Kostya Shishkov + v410*.c Derek Buitenhuis + vb.c Kostya Shishkov + vble.c Derek Buitenhuis + vc1* Kostya Shishkov, Christophe Gisquet + vc2* Rostislav Pehlivanov + vcr1.c Michael Niedermayer + vda_h264_dec.c Xidorn Quan + vima.c Paul B Mahol + vmnc.c Kostya Shishkov + vorbisdec.c Denes Balatoni, David Conrad + vorbisenc.c Oded Shimon + vp3* Mike Melanson + vp5 Aurelien Jacobs + vp6 Aurelien Jacobs + vp8 David Conrad, Jason Garrett-Glaser, Ronald Bultje + vp9 Ronald Bultje, Clément Bœsch + vqavideo.c Mike Melanson + wavpack.c Kostya Shishkov + wmaprodec.c Sascha Sommer + wmavoice.c Ronald S. Bultje + wmv2.c Michael Niedermayer + wnv1.c Kostya Shishkov + xan.c Mike Melanson + xbm* Paul B Mahol + xface Stefano Sabatini + xl.c Kostya Shishkov + xvmc.c Ivan Kalvachev + xwd* Paul B Mahol + zerocodec.c Derek Buitenhuis + zmbv* Kostya Shishkov + +Hardware acceleration: + crystalhd.c Philip Langdale + dxva2* Hendrik Leppkes, Laurent Aimar + vaapi* Gwenole Beauchesne + vda* Sebastien Zwickert + vdpau* Philip Langdale, Carl Eugen Hoyos + videotoolbox* Sebastien Zwickert + + +libavdevice +=========== + External Interface: + libavdevice/avdevice.h + + + avfoundation.m Thilo Borgmann + decklink* Deti Fliegl + dshow.c Roger Pack (CC rogerdpack@gmail.com) + fbdev_enc.c Lukasz Marek + gdigrab.c Roger Pack (CC rogerdpack@gmail.com) + iec61883.c Georg Lippitsch + lavfi Stefano Sabatini + libdc1394.c Roman Shaposhnik + opengl_enc.c Lukasz Marek + pulse_audio_enc.c Lukasz Marek + qtkit.m Thilo Borgmann + sdl Stefano Sabatini + v4l2.c Giorgio Vazzana + vfwcap.c Ramiro Polla + xv.c Lukasz Marek + +libavfilter +=========== + +Generic parts: + graphdump.c Nicolas George + +Filters: + f_drawgraph.c Paul B Mahol + af_adelay.c Paul B Mahol + af_aecho.c Paul B Mahol + af_afade.c Paul B Mahol + af_amerge.c Nicolas George + af_aphaser.c Paul B Mahol + af_aresample.c Michael Niedermayer + af_astats.c Paul B Mahol + af_atempo.c Pavel Koshevoy + af_biquads.c Paul B Mahol + af_chorus.c Paul B Mahol + af_compand.c Paul B Mahol + af_ladspa.c Paul B Mahol + af_pan.c Nicolas George + af_sidechaincompress.c Paul B Mahol + af_silenceremove.c Paul B Mahol + avf_aphasemeter.c Paul B Mahol + avf_avectorscope.c Paul B Mahol + avf_showcqt.c Muhammad Faiz + vf_blend.c Paul B Mahol + vf_chromakey.c Timo Rothenpieler + vf_colorchannelmixer.c Paul B Mahol + vf_colorbalance.c Paul B Mahol + vf_colorkey.c Timo Rothenpieler + vf_colorlevels.c Paul B Mahol + vf_deband.c Paul B Mahol + vf_dejudder.c Nicholas Robbins + vf_delogo.c Jean Delvare (CC <jdelvare@suse.com>) + vf_drawbox.c/drawgrid Andrey Utkin + vf_extractplanes.c Paul B Mahol + vf_histogram.c Paul B Mahol + vf_hqx.c Clément Bœsch + vf_idet.c Pascal Massimino + vf_il.c Paul B Mahol + vf_lenscorrection.c Daniel Oberhoff + vf_mergeplanes.c Paul B Mahol + vf_neighbor.c Paul B Mahol + vf_psnr.c Paul B Mahol + vf_random.c Paul B Mahol + vf_scale.c Michael Niedermayer + vf_separatefields.c Paul B Mahol + vf_ssim.c Paul B Mahol + vf_stereo3d.c Paul B Mahol + vf_telecine.c Paul B Mahol + vf_yadif.c Michael Niedermayer + vf_zoompan.c Paul B Mahol + +Sources: + vsrc_mandelbrot.c Michael Niedermayer + +libavformat +=========== + +Generic parts: + External Interface: + libavformat/avformat.h Michael Niedermayer + Utility Code: + libavformat/utils.c Michael Niedermayer + + +Muxers/Demuxers: + 4xm.c Mike Melanson + aadec.c Vesselin Bontchev (vesselin.bontchev at yandex dot com) + adtsenc.c Robert Swain + afc.c Paul B Mahol + aiffdec.c Baptiste Coudurier, Matthieu Bouron + aiffenc.c Baptiste Coudurier, Matthieu Bouron + ape.c Kostya Shishkov + apngdec.c Benoit Fouet + ass* Aurelien Jacobs + astdec.c Paul B Mahol + astenc.c James Almer + avi* Michael Niedermayer + avisynth.c AvxSynth Team (avxsynth.testing at gmail dot com) + avr.c Paul B Mahol + bink.c Peter Ross + brstm.c Paul B Mahol + caf* Peter Ross + cdxl.c Paul B Mahol + crc.c Michael Niedermayer + daud.c Reimar Doeffinger + dss.c Oleksij Rempel, Michael Niedermayer + dtshddec.c Paul B Mahol + dv.c Roman Shaposhnik + dxa.c Kostya Shishkov + electronicarts.c Peter Ross + epafdec.c Paul B Mahol + ffm* Baptiste Coudurier + flac* Justin Ruggles + flic.c Mike Melanson + flvdec.c, flvenc.c Michael Niedermayer + gxf.c Reimar Doeffinger + gxfenc.c Baptiste Coudurier + hls.c Anssi Hannula + hls encryption (hlsenc.c) Christian Suloway + idcin.c Mike Melanson + idroqdec.c Mike Melanson + iff.c Jaikrishnan Menon + img2*.c Michael Niedermayer + ipmovie.c Mike Melanson + ircam* Paul B Mahol + iss.c Stefan Gehrer + jacosub* Clément Bœsch + jvdec.c Peter Ross + libmodplug.c Clément Bœsch + libnut.c Oded Shimon + lmlm4.c Ivo van Poorten + lvfdec.c Paul B Mahol + lxfdec.c Tomas Härdin + matroska.c Aurelien Jacobs + matroskadec.c Aurelien Jacobs + matroskaenc.c David Conrad + matroska subtitles (matroskaenc.c) John Peebles + metadata* Aurelien Jacobs + mgsts.c Paul B Mahol + microdvd* Aurelien Jacobs + mm.c Peter Ross + mov.c Michael Niedermayer, Baptiste Coudurier + movenc.c Baptiste Coudurier, Matthieu Bouron + movenccenc.c Eran Kornblau + mpc.c Kostya Shishkov + mpeg.c Michael Niedermayer + mpegenc.c Michael Niedermayer + mpegts.c Marton Balint + mpegtsenc.c Baptiste Coudurier + msnwc_tcp.c Ramiro Polla + mtv.c Reynaldo H. Verdejo Pinochet + mxf* Baptiste Coudurier + mxfdec.c Tomas Härdin + nistspheredec.c Paul B Mahol + nsvdec.c Francois Revol + nut* Michael Niedermayer + nuv.c Reimar Doeffinger + oggdec.c, oggdec.h David Conrad + oggenc.c Baptiste Coudurier + oggparse*.c David Conrad + oggparsedaala* Rostislav Pehlivanov + oma.c Maxim Poliakovski + paf.c Paul B Mahol + psxstr.c Mike Melanson + pva.c Ivo van Poorten + pvfdec.c Paul B Mahol + r3d.c Baptiste Coudurier + raw.c Michael Niedermayer + rdt.c Ronald S. Bultje + rl2.c Sascha Sommer + rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov + rtmp* Kostya Shishkov + rtp.c, rtpenc.c Martin Storsjo + rtpdec_ac3.* Gilles Chanteperdrix + rtpdec_dv.* Thomas Volkert + rtpdec_h261.*, rtpenc_h261.* Thomas Volkert + rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert + rtpdec_mpa_robust.* Gilles Chanteperdrix + rtpdec_asf.* Ronald S. Bultje + rtpdec_vp9.c Thomas Volkert + rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo + rtsp.c Luca Barbato + sbgdec.c Nicolas George + sdp.c Martin Storsjo + segafilm.c Mike Melanson + segment.c Stefano Sabatini + siff.c Kostya Shishkov + smacker.c Kostya Shishkov + smjpeg* Paul B Mahol + spdif* Anssi Hannula + srtdec.c Aurelien Jacobs + swf.c Baptiste Coudurier + takdec.c Paul B Mahol + tta.c Alex Beregszaszi + txd.c Ivo van Poorten + voc.c Aurelien Jacobs + wav.c Michael Niedermayer + wc3movie.c Mike Melanson + webm dash (matroskaenc.c) Vignesh Venkatasubramanian + webvtt* Matthew J Heaney + westwood.c Mike Melanson + wtv.c Peter Ross + wv.c Kostya Shishkov + wvenc.c Paul B Mahol + +Protocols: + async.c Zhang Rui + bluray.c Petri Hintukainen + ftp.c Lukasz Marek + http.c Ronald S. Bultje + libssh.c Lukasz Marek + mms*.c Ronald S. Bultje + udp.c Luca Abeni + icecast.c Marvin Scholz + + +libswresample +============= + +Generic parts: + audioconvert.c Michael Niedermayer + dither.c Michael Niedermayer + rematrix*.c Michael Niedermayer + swresample*.c Michael Niedermayer + +Resamplers: + resample*.c Michael Niedermayer + soxr_resample.c Rob Sykes + + +Operating systems / CPU architectures +===================================== + +Alpha Mans Rullgard, Falk Hueffner +ARM Mans Rullgard +AVR32 Mans Rullgard +MIPS Mans Rullgard, Nedeljko Babic +Mac OS X / PowerPC Romain Dolbeau, Guillaume Poirier +Amiga / PowerPC Colin Ward +Linux / PowerPC Luca Barbato +Windows MinGW Alex Beregszaszi, Ramiro Polla +Windows Cygwin Victor Paesa +Windows MSVC Matthew Oliver, Hendrik Leppkes +Windows ICL Matthew Oliver +ADI/Blackfin DSP Marc Hoffman +Sparc Roman Shaposhnik +x86 Michael Niedermayer + + +Releases +======== + +2.8 Michael Niedermayer +2.7 Michael Niedermayer +2.6 Michael Niedermayer +2.5 Michael Niedermayer +2.4 Michael Niedermayer + +If you want to maintain an older release, please contact us + + +GnuPG Fingerprints of maintainers and contributors +================================================== + +Alexander Strasser 1C96 78B7 83CB 8AA7 9AF5 D1EB A7D8 A57B A876 E58F +Anssi Hannula 1A92 FF42 2DD9 8D2E 8AF7 65A9 4278 C520 513D F3CB +Anton Khirnov 6D0C 6625 56F8 65D1 E5F5 814B B50A 1241 C067 07AB +Ash Hughes 694D 43D2 D180 C7C7 6421 ABD3 A641 D0B7 623D 6029 +Attila Kinali 11F0 F9A6 A1D2 11F6 C745 D10C 6520 BCDD F2DF E765 +Baptiste Coudurier 8D77 134D 20CC 9220 201F C5DB 0AC9 325C 5C1A BAAA +Ben Littler 3EE3 3723 E560 3214 A8CD 4DEB 2CDB FCE7 768C 8D2C +Benoit Fouet B22A 4F4F 43EF 636B BB66 FCDC 0023 AE1E 2985 49C8 +Clément Bœsch 52D0 3A82 D445 F194 DB8B 2B16 87EE 2CB8 F4B8 FCF9 +Daniel Verkamp 78A6 07ED 782C 653E C628 B8B9 F0EB 8DD8 2F0E 21C7 +Diego Biurrun 8227 1E31 B6D9 4994 7427 E220 9CAE D6CC 4757 FCC5 +FFmpeg release signing key FCF9 86EA 15E6 E293 A564 4F10 B432 2F04 D676 58D8 +Ganesh Ajjanagadde C96A 848E 97C3 CEA2 AB72 5CE4 45F9 6A2D 3C36 FB1B +Gwenole Beauchesne 2E63 B3A6 3E44 37E2 017D 2704 53C7 6266 B153 99C4 +Jaikrishnan Menon 61A1 F09F 01C9 2D45 78E1 C862 25DC 8831 AF70 D368 +Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A +Justin Ruggles 3136 ECC0 C10D 6C04 5F43 CA29 FCBE CD2A 3787 1EBF +Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE +Lou Logan 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A +Luca Barbato 6677 4209 213C 8843 5B67 29E7 E84C 78C2 84E9 0E34 +Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB +Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93 +Panagiotis Issaris 6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029 +Peter Ross A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B +Philip Langdale 5DC5 8D66 5FBA 3A43 18EC 045E F8D6 B194 6A75 682E +Reimar Doeffinger C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7 +Reinhard Tartler 9300 5DC2 7E87 6C37 ED7B CA9A 9808 3544 9453 48A4 +Reynaldo H. Verdejo Pinochet 6E27 CD34 170C C78E 4D4F 5F40 C18E 077F 3114 452A +Robert Swain EE7A 56EA 4A81 A7B5 2001 A521 67FA 362D A2FC 3E71 +Sascha Sommer 38A0 F88B 868E 9D3A 97D4 D6A0 E823 706F 1E07 0D3C +Stefano Sabatini 0D0B AD6B 5330 BBAD D3D6 6A0C 719C 2839 FC43 2D5F +Stephan Hilb 4F38 0B3A 5F39 B99B F505 E562 8D5C 5554 4E17 8863 +Tiancheng "Timothy" Gu 9456 AFC0 814A 8139 E994 8351 7FE6 B095 B582 B0D4 +Tim Nicholson 38CF DB09 3ED0 F607 8B67 6CED 0C0B FC44 8B0B FC83 +Tomas Härdin A79D 4E3D F38F 763F 91F5 8B33 A01E 8AE0 41BB 2551 +Wei Gao 4269 7741 857A 0E60 9EC5 08D2 4744 4EFA 62C1 87B9
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/Makefile b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/Makefile new file mode 100644 index 0000000..87a9869 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/Makefile
@@ -0,0 +1,209 @@ +MAIN_MAKEFILE=1 +include config.mak + +vpath %.c $(SRC_PATH) +vpath %.cpp $(SRC_PATH) +vpath %.h $(SRC_PATH) +vpath %.inc $(SRC_PATH) +vpath %.m $(SRC_PATH) +vpath %.S $(SRC_PATH) +vpath %.asm $(SRC_PATH) +vpath %.rc $(SRC_PATH) +vpath %.v $(SRC_PATH) +vpath %.texi $(SRC_PATH) +vpath %/fate_config.sh.template $(SRC_PATH) + +AVPROGS-$(CONFIG_FFMPEG) += ffmpeg +AVPROGS-$(CONFIG_FFPLAY) += ffplay +AVPROGS-$(CONFIG_FFPROBE) += ffprobe +AVPROGS-$(CONFIG_FFSERVER) += ffserver + +AVPROGS := $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF)) +INSTPROGS = $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF)) +PROGS += $(AVPROGS) + +AVBASENAMES = ffmpeg ffplay ffprobe ffserver +ALLAVPROGS = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF)) +ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF)) + +$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog) += cmdutils.o)) +$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog)-$(CONFIG_OPENCL) += cmdutils_opencl.o)) + +OBJS-ffmpeg += ffmpeg_opt.o ffmpeg_filter.o +OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o +OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o +ifndef CONFIG_VIDEOTOOLBOX +OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_videotoolbox.o +endif +OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += ffmpeg_videotoolbox.o +OBJS-ffmpeg-$(CONFIG_LIBMFX) += ffmpeg_qsv.o +OBJS-ffserver += ffserver_config.o + +TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64 +HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options +TOOLS = qt-faststart trasher uncoded_frame +TOOLS-$(CONFIG_ZLIB) += cws2fws + +# $(FFLIBS-yes) needs to be in linking order +FFLIBS-$(CONFIG_AVDEVICE) += avdevice +FFLIBS-$(CONFIG_AVFILTER) += avfilter +FFLIBS-$(CONFIG_AVFORMAT) += avformat +FFLIBS-$(CONFIG_AVCODEC) += avcodec +FFLIBS-$(CONFIG_AVRESAMPLE) += avresample +FFLIBS-$(CONFIG_POSTPROC) += postproc +FFLIBS-$(CONFIG_SWRESAMPLE) += swresample +FFLIBS-$(CONFIG_SWSCALE) += swscale + +FFLIBS := avutil + +DATA_FILES := $(wildcard $(SRC_PATH)/presets/*.ffpreset) $(SRC_PATH)/doc/ffprobe.xsd +EXAMPLES_FILES := $(wildcard $(SRC_PATH)/doc/examples/*.c) $(SRC_PATH)/doc/examples/Makefile $(SRC_PATH)/doc/examples/README + +SKIPHEADERS = cmdutils_common_opts.h compat/w32pthreads.h + +include $(SRC_PATH)/common.mak + +FF_EXTRALIBS := $(FFEXTRALIBS) +FF_DEP_LIBS := $(DEP_LIBS) +FF_STATIC_DEP_LIBS := $(STATIC_DEP_LIBS) + +all: $(AVPROGS) + +$(TOOLS): %$(EXESUF): %.o $(EXEOBJS) + $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) + +tools/cws2fws$(EXESUF): ELIBS = $(ZLIB) +tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS) +tools/uncoded_frame$(EXESUF): ELIBS = $(FF_EXTRALIBS) + +config.h: .config +.config: $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c)) + @-tput bold 2>/dev/null + @-printf '\nWARNING: $(?F) newer than config.h, rerun configure\n\n' + @-tput sgr0 2>/dev/null + +SUBDIR_VARS := CLEANFILES EXAMPLES FFLIBS HOSTPROGS TESTPROGS TOOLS \ + HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS \ + ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS \ + ALTIVEC-OBJS MMX-OBJS YASM-OBJS \ + MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSP-OBJS MSA-OBJS \ + MMI-OBJS OBJS SLIBOBJS HOSTOBJS TESTOBJS + +define RESET +$(1) := +$(1)-yes := +endef + +define DOSUBDIR +$(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V)))) +SUBDIR := $(1)/ +include $(SRC_PATH)/$(1)/Makefile +-include $(SRC_PATH)/$(1)/$(ARCH)/Makefile +-include $(SRC_PATH)/$(1)/$(INTRINSICS)/Makefile +include $(SRC_PATH)/library.mak +endef + +$(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D)))) + +include $(SRC_PATH)/doc/Makefile + +define DOPROG +OBJS-$(1) += $(1).o $(EXEOBJS) $(OBJS-$(1)-yes) +$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1)) +$$(OBJS-$(1)): CFLAGS += $(CFLAGS-$(1)) +$(1)$(PROGSSUF)_g$(EXESUF): LDFLAGS += $(LDFLAGS-$(1)) +$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += $(LIBS-$(1)) +-include $$(OBJS-$(1):.o=.d) +endef + +$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=)))) + +ffprobe.o cmdutils.o libavcodec/utils.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h + +$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF) + $(CP) $< $@ + $(STRIP) $@ + +%$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS) + $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS) + +OBJDIRS += tools + +-include $(wildcard tools/*.d) + +VERSION_SH = $(SRC_PATH)/version.sh +GIT_LOG = $(SRC_PATH)/.git/logs/HEAD + +.version: $(wildcard $(GIT_LOG)) $(VERSION_SH) config.mak +.version: M=@ + +libavutil/ffversion.h .version: + $(M)$(VERSION_SH) $(SRC_PATH) libavutil/ffversion.h $(EXTRA_VERSION) + $(Q)touch .version + +# force version.sh to run whenever version might have changed +-include .version + +ifdef AVPROGS +install: install-progs install-data +endif + +install: install-libs install-headers + +install-libs: install-libs-yes + +install-progs-yes: +install-progs-$(CONFIG_SHARED): install-libs + +install-progs: install-progs-yes $(AVPROGS) + $(Q)mkdir -p "$(BINDIR)" + $(INSTALL) -c -m 755 $(INSTPROGS) "$(BINDIR)" + +install-data: $(DATA_FILES) $(EXAMPLES_FILES) + $(Q)mkdir -p "$(DATADIR)/examples" + $(INSTALL) -m 644 $(DATA_FILES) "$(DATADIR)" + $(INSTALL) -m 644 $(EXAMPLES_FILES) "$(DATADIR)/examples" + +uninstall: uninstall-libs uninstall-headers uninstall-progs uninstall-data + +uninstall-progs: + $(RM) $(addprefix "$(BINDIR)/", $(ALLAVPROGS)) + +uninstall-data: + $(RM) -r "$(DATADIR)" + +clean:: + $(RM) $(ALLAVPROGS) $(ALLAVPROGS_G) + $(RM) $(CLEANSUFFIXES) + $(RM) $(CLEANSUFFIXES:%=tools/%) + $(RM) -r coverage-html + $(RM) -rf coverage.info coverage.info.in lcov + +distclean:: + $(RM) $(DISTCLEANSUFFIXES) + $(RM) config.* .config libavutil/avconfig.h .version avversion.h version.h libavutil/ffversion.h libavcodec/codec_names.h +ifeq ($(SRC_LINK),src) + $(RM) src +endif + $(RM) -rf doc/examples/pc-uninstalled + +config: + $(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION) + +check: all alltools examples testprogs fate + +include $(SRC_PATH)/tests/Makefile + +$(sort $(OBJDIRS)): + $(Q)mkdir -p $@ + +# Dummy rule to stop make trying to rebuild removed or renamed headers +%.h: + @: + +# Disable suffix rules. Most of the builtin rules are suffix rules, +# so this saves some time on slow systems. +.SUFFIXES: + +.PHONY: all all-yes alltools check *clean config install* +.PHONY: testprogs uninstall*
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/README.md b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/README.md new file mode 100644 index 0000000..2419191 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/README.md
@@ -0,0 +1,49 @@ +FFmpeg README +============= + +FFmpeg is a collection of libraries and tools to process multimedia content +such as audio, video, subtitles and related metadata. + +## Libraries + +* `libavcodec` provides implementation of a wider range of codecs. +* `libavformat` implements streaming protocols, container formats and basic I/O access. +* `libavutil` includes hashers, decompressors and miscellaneous utility functions. +* `libavfilter` provides a mean to alter decoded Audio and Video through chain of filters. +* `libavdevice` provides an abstraction to access capture and playback devices. +* `libswresample` implements audio mixing and resampling routines. +* `libswscale` implements color conversion and scaling routines. + +## Tools + +* [ffmpeg](https://ffmpeg.org/ffmpeg.html) is a command line toolbox to + manipulate, convert and stream multimedia content. +* [ffplay](https://ffmpeg.org/ffplay.html) is a minimalistic multimedia player. +* [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect + multimedia content. +* [ffserver](https://ffmpeg.org/ffserver.html) is a multimedia streaming server + for live broadcasts. +* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`. + +## Documentation + +The offline documentation is available in the **doc/** directory. + +The online documentation is available in the main [website](https://ffmpeg.org) +and in the [wiki](https://trac.ffmpeg.org). + +### Examples + +Coding examples are available in the **doc/examples** directory. + +## License + +FFmpeg codebase is mainly LGPL-licensed with optional components licensed under +GPL. Please refer to the LICENSE file for detailed information. + +## Contributing + +Patches should be submitted to the ffmpeg-devel mailing list using +`git format-patch` or `git send-email`. Github pull requests should be +avoided because they are not part of our review process. Few developers +follow pull requests so they will likely be ignored.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/RELEASE b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/RELEASE new file mode 100644 index 0000000..9f55b2c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/RELEASE
@@ -0,0 +1 @@ +3.0
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/RELEASE_NOTES b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/RELEASE_NOTES new file mode 100644 index 0000000..861dc04 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/RELEASE_NOTES
@@ -0,0 +1,15 @@ + + ┌─────────────────────────────────────────┐ + │ RELEASE NOTES for FFmpeg 3.0 "Einstein" │ + └─────────────────────────────────────────┘ + + The FFmpeg Project proudly presents FFmpeg 3.0 "Einstein", about 5 + months after the release of FFmpeg 2.8. + + A complete Changelog is available at the root of the project, and the + complete Git history on http://source.ffmpeg.org. + + We hope you will like this release as much as we enjoyed working on it, and + as usual, if you have any questions about it, or any FFmpeg related topic, + feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask + on the mailing-lists.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/VERSION b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/VERSION new file mode 100644 index 0000000..9f55b2c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/VERSION
@@ -0,0 +1 @@ +3.0
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/arch.mak b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/arch.mak new file mode 100644 index 0000000..08f78b4 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/arch.mak
@@ -0,0 +1,17 @@ +OBJS-$(HAVE_ARMV5TE) += $(ARMV5TE-OBJS) $(ARMV5TE-OBJS-yes) +OBJS-$(HAVE_ARMV6) += $(ARMV6-OBJS) $(ARMV6-OBJS-yes) +OBJS-$(HAVE_ARMV8) += $(ARMV8-OBJS) $(ARMV8-OBJS-yes) +OBJS-$(HAVE_VFP) += $(VFP-OBJS) $(VFP-OBJS-yes) +OBJS-$(HAVE_NEON) += $(NEON-OBJS) $(NEON-OBJS-yes) + +OBJS-$(HAVE_MIPSFPU) += $(MIPSFPU-OBJS) $(MIPSFPU-OBJS-yes) +OBJS-$(HAVE_MIPSDSP) += $(MIPSDSP-OBJS) $(MIPSDSP-OBJS-yes) +OBJS-$(HAVE_MIPSDSPR2) += $(MIPSDSPR2-OBJS) $(MIPSDSPR2-OBJS-yes) +OBJS-$(HAVE_MSA) += $(MSA-OBJS) $(MSA-OBJS-yes) +OBJS-$(HAVE_MMI) += $(MMI-OBJS) $(MMI-OBJS-yes) + +OBJS-$(HAVE_ALTIVEC) += $(ALTIVEC-OBJS) $(ALTIVEC-OBJS-yes) +OBJS-$(HAVE_VSX) += $(VSX-OBJS) $(VSX-OBJS-yes) + +OBJS-$(HAVE_MMX) += $(MMX-OBJS) $(MMX-OBJS-yes) +OBJS-$(HAVE_YASM) += $(YASM-OBJS) $(YASM-OBJS-yes)
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils.c new file mode 100644 index 0000000..03a4836 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils.c
@@ -0,0 +1,2250 @@ +/* + * Various utilities for command line tools + * Copyright (c) 2000-2003 Fabrice Bellard + * + * 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 + */ + +#include <string.h> +#include <stdint.h> +#include <stdlib.h> +#include <errno.h> +#include <math.h> + +/* Include only the enabled headers since some compilers (namely, Sun + Studio) will not omit unused inline functions and create undefined + references to libraries that are not being built. */ + +#include "config.h" +#include "compat/va_copy.h" +#include "libavformat/avformat.h" +#include "libavfilter/avfilter.h" +#include "libavdevice/avdevice.h" +#include "libavresample/avresample.h" +#include "libswscale/swscale.h" +#include "libswresample/swresample.h" +#include "libpostproc/postprocess.h" +#include "libavutil/avassert.h" +#include "libavutil/avstring.h" +#include "libavutil/bprint.h" +#include "libavutil/display.h" +#include "libavutil/mathematics.h" +#include "libavutil/imgutils.h" +#include "libavutil/libm.h" +#include "libavutil/parseutils.h" +#include "libavutil/pixdesc.h" +#include "libavutil/eval.h" +#include "libavutil/dict.h" +#include "libavutil/opt.h" +#include "libavutil/cpu.h" +#include "libavutil/ffversion.h" +#include "libavutil/version.h" +#include "cmdutils.h" +#if CONFIG_NETWORK +#include "libavformat/network.h" +#endif +#if HAVE_SYS_RESOURCE_H +#include <sys/time.h> +#include <sys/resource.h> +#endif + +static int init_report(const char *env); + +AVDictionary *sws_dict; +AVDictionary *swr_opts; +AVDictionary *format_opts, *codec_opts, *resample_opts; + +static FILE *report_file; +static int report_file_level = AV_LOG_DEBUG; +int hide_banner = 0; + +void init_opts(void) +{ + av_dict_set(&sws_dict, "flags", "bicubic", 0); +} + +void uninit_opts(void) +{ + av_dict_free(&swr_opts); + av_dict_free(&sws_dict); + av_dict_free(&format_opts); + av_dict_free(&codec_opts); + av_dict_free(&resample_opts); +} + +void log_callback_help(void *ptr, int level, const char *fmt, va_list vl) +{ + vfprintf(stdout, fmt, vl); +} + +static void log_callback_report(void *ptr, int level, const char *fmt, va_list vl) +{ + va_list vl2; + char line[1024]; + static int print_prefix = 1; + + va_copy(vl2, vl); + av_log_default_callback(ptr, level, fmt, vl); + av_log_format_line(ptr, level, fmt, vl2, line, sizeof(line), &print_prefix); + va_end(vl2); + if (report_file_level >= level) { + fputs(line, report_file); + fflush(report_file); + } +} + +static void (*program_exit)(int ret); + +void register_exit(void (*cb)(int ret)) +{ + program_exit = cb; +} + +void exit_program(int ret) +{ + if (program_exit) + program_exit(ret); + + exit(ret); +} + +double parse_number_or_die(const char *context, const char *numstr, int type, + double min, double max) +{ + char *tail; + const char *error; + double d = av_strtod(numstr, &tail); + if (*tail) + error = "Expected number for %s but found: %s\n"; + else if (d < min || d > max) + error = "The value for %s was %s which is not within %f - %f\n"; + else if (type == OPT_INT64 && (int64_t)d != d) + error = "Expected int64 for %s but found %s\n"; + else if (type == OPT_INT && (int)d != d) + error = "Expected int for %s but found %s\n"; + else + return d; + av_log(NULL, AV_LOG_FATAL, error, context, numstr, min, max); + exit_program(1); + return 0; +} + +int64_t parse_time_or_die(const char *context, const char *timestr, + int is_duration) +{ + int64_t us; + if (av_parse_time(&us, timestr, is_duration) < 0) { + av_log(NULL, AV_LOG_FATAL, "Invalid %s specification for %s: %s\n", + is_duration ? "duration" : "date", context, timestr); + exit_program(1); + } + return us; +} + +void show_help_options(const OptionDef *options, const char *msg, int req_flags, + int rej_flags, int alt_flags) +{ + const OptionDef *po; + int first; + + first = 1; + for (po = options; po->name; po++) { + char buf[64]; + + if (((po->flags & req_flags) != req_flags) || + (alt_flags && !(po->flags & alt_flags)) || + (po->flags & rej_flags)) + continue; + + if (first) { + printf("%s\n", msg); + first = 0; + } + av_strlcpy(buf, po->name, sizeof(buf)); + if (po->argname) { + av_strlcat(buf, " ", sizeof(buf)); + av_strlcat(buf, po->argname, sizeof(buf)); + } + printf("-%-17s %s\n", buf, po->help); + } + printf("\n"); +} + +void show_help_children(const AVClass *class, int flags) +{ + const AVClass *child = NULL; + if (class->option) { + av_opt_show2(&class, NULL, flags, 0); + printf("\n"); + } + + while (child = av_opt_child_class_next(class, child)) + show_help_children(child, flags); +} + +static const OptionDef *find_option(const OptionDef *po, const char *name) +{ + const char *p = strchr(name, ':'); + int len = p ? p - name : strlen(name); + + while (po->name) { + if (!strncmp(name, po->name, len) && strlen(po->name) == len) + break; + po++; + } + return po; +} + +/* _WIN32 means using the windows libc - cygwin doesn't define that + * by default. HAVE_COMMANDLINETOARGVW is true on cygwin, while + * it doesn't provide the actual command line via GetCommandLineW(). */ +#if HAVE_COMMANDLINETOARGVW && defined(_WIN32) +#include <windows.h> +#include <shellapi.h> +/* Will be leaked on exit */ +static char** win32_argv_utf8 = NULL; +static int win32_argc = 0; + +/** + * Prepare command line arguments for executable. + * For Windows - perform wide-char to UTF-8 conversion. + * Input arguments should be main() function arguments. + * @param argc_ptr Arguments number (including executable) + * @param argv_ptr Arguments list. + */ +static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) +{ + char *argstr_flat; + wchar_t **argv_w; + int i, buffsize = 0, offset = 0; + + if (win32_argv_utf8) { + *argc_ptr = win32_argc; + *argv_ptr = win32_argv_utf8; + return; + } + + win32_argc = 0; + argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc); + if (win32_argc <= 0 || !argv_w) + return; + + /* determine the UTF-8 buffer size (including NULL-termination symbols) */ + for (i = 0; i < win32_argc; i++) + buffsize += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, + NULL, 0, NULL, NULL); + + win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize); + argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1); + if (!win32_argv_utf8) { + LocalFree(argv_w); + return; + } + + for (i = 0; i < win32_argc; i++) { + win32_argv_utf8[i] = &argstr_flat[offset]; + offset += WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, + &argstr_flat[offset], + buffsize - offset, NULL, NULL); + } + win32_argv_utf8[i] = NULL; + LocalFree(argv_w); + + *argc_ptr = win32_argc; + *argv_ptr = win32_argv_utf8; +} +#else +static inline void prepare_app_arguments(int *argc_ptr, char ***argv_ptr) +{ + /* nothing to do */ +} +#endif /* HAVE_COMMANDLINETOARGVW */ + +static int write_option(void *optctx, const OptionDef *po, const char *opt, + const char *arg) +{ + /* new-style options contain an offset into optctx, old-style address of + * a global var*/ + void *dst = po->flags & (OPT_OFFSET | OPT_SPEC) ? + (uint8_t *)optctx + po->u.off : po->u.dst_ptr; + int *dstcount; + + if (po->flags & OPT_SPEC) { + SpecifierOpt **so = dst; + char *p = strchr(opt, ':'); + char *str; + + dstcount = (int *)(so + 1); + *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1); + str = av_strdup(p ? p + 1 : ""); + if (!str) + return AVERROR(ENOMEM); + (*so)[*dstcount - 1].specifier = str; + dst = &(*so)[*dstcount - 1].u; + } + + if (po->flags & OPT_STRING) { + char *str; + str = av_strdup(arg); + av_freep(dst); + if (!str) + return AVERROR(ENOMEM); + *(char **)dst = str; + } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) { + *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); + } else if (po->flags & OPT_INT64) { + *(int64_t *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX); + } else if (po->flags & OPT_TIME) { + *(int64_t *)dst = parse_time_or_die(opt, arg, 1); + } else if (po->flags & OPT_FLOAT) { + *(float *)dst = parse_number_or_die(opt, arg, OPT_FLOAT, -INFINITY, INFINITY); + } else if (po->flags & OPT_DOUBLE) { + *(double *)dst = parse_number_or_die(opt, arg, OPT_DOUBLE, -INFINITY, INFINITY); + } else if (po->u.func_arg) { + int ret = po->u.func_arg(optctx, opt, arg); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, + "Failed to set value '%s' for option '%s': %s\n", + arg, opt, av_err2str(ret)); + return ret; + } + } + if (po->flags & OPT_EXIT) + exit_program(0); + + return 0; +} + +int parse_option(void *optctx, const char *opt, const char *arg, + const OptionDef *options) +{ + const OptionDef *po; + int ret; + + po = find_option(options, opt); + if (!po->name && opt[0] == 'n' && opt[1] == 'o') { + /* handle 'no' bool option */ + po = find_option(options, opt + 2); + if ((po->name && (po->flags & OPT_BOOL))) + arg = "0"; + } else if (po->flags & OPT_BOOL) + arg = "1"; + + if (!po->name) + po = find_option(options, "default"); + if (!po->name) { + av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'\n", opt); + return AVERROR(EINVAL); + } + if (po->flags & HAS_ARG && !arg) { + av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'\n", opt); + return AVERROR(EINVAL); + } + + ret = write_option(optctx, po, opt, arg); + if (ret < 0) + return ret; + + return !!(po->flags & HAS_ARG); +} + +void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, + void (*parse_arg_function)(void *, const char*)) +{ + const char *opt; + int optindex, handleoptions = 1, ret; + + /* perform system-dependent conversions for arguments list */ + prepare_app_arguments(&argc, &argv); + + /* parse options */ + optindex = 1; + while (optindex < argc) { + opt = argv[optindex++]; + + if (handleoptions && opt[0] == '-' && opt[1] != '\0') { + if (opt[1] == '-' && opt[2] == '\0') { + handleoptions = 0; + continue; + } + opt++; + + if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0) + exit_program(1); + optindex += ret; + } else { + if (parse_arg_function) + parse_arg_function(optctx, opt); + } + } +} + +int parse_optgroup(void *optctx, OptionGroup *g) +{ + int i, ret; + + av_log(NULL, AV_LOG_DEBUG, "Parsing a group of options: %s %s.\n", + g->group_def->name, g->arg); + + for (i = 0; i < g->nb_opts; i++) { + Option *o = &g->opts[i]; + + if (g->group_def->flags && + !(g->group_def->flags & o->opt->flags)) { + av_log(NULL, AV_LOG_ERROR, "Option %s (%s) cannot be applied to " + "%s %s -- you are trying to apply an input option to an " + "output file or vice versa. Move this option before the " + "file it belongs to.\n", o->key, o->opt->help, + g->group_def->name, g->arg); + return AVERROR(EINVAL); + } + + av_log(NULL, AV_LOG_DEBUG, "Applying option %s (%s) with argument %s.\n", + o->key, o->opt->help, o->val); + + ret = write_option(optctx, o->opt, o->key, o->val); + if (ret < 0) + return ret; + } + + av_log(NULL, AV_LOG_DEBUG, "Successfully parsed a group of options.\n"); + + return 0; +} + +int locate_option(int argc, char **argv, const OptionDef *options, + const char *optname) +{ + const OptionDef *po; + int i; + + for (i = 1; i < argc; i++) { + const char *cur_opt = argv[i]; + + if (*cur_opt++ != '-') + continue; + + po = find_option(options, cur_opt); + if (!po->name && cur_opt[0] == 'n' && cur_opt[1] == 'o') + po = find_option(options, cur_opt + 2); + + if ((!po->name && !strcmp(cur_opt, optname)) || + (po->name && !strcmp(optname, po->name))) + return i; + + if (!po->name || po->flags & HAS_ARG) + i++; + } + return 0; +} + +static void dump_argument(const char *a) +{ + const unsigned char *p; + + for (p = a; *p; p++) + if (!((*p >= '+' && *p <= ':') || (*p >= '@' && *p <= 'Z') || + *p == '_' || (*p >= 'a' && *p <= 'z'))) + break; + if (!*p) { + fputs(a, report_file); + return; + } + fputc('"', report_file); + for (p = a; *p; p++) { + if (*p == '\\' || *p == '"' || *p == '$' || *p == '`') + fprintf(report_file, "\\%c", *p); + else if (*p < ' ' || *p > '~') + fprintf(report_file, "\\x%02x", *p); + else + fputc(*p, report_file); + } + fputc('"', report_file); +} + +static void check_options(const OptionDef *po) +{ + while (po->name) { + if (po->flags & OPT_PERFILE) + av_assert0(po->flags & (OPT_INPUT | OPT_OUTPUT)); + po++; + } +} + +void parse_loglevel(int argc, char **argv, const OptionDef *options) +{ + int idx = locate_option(argc, argv, options, "loglevel"); + const char *env; + + check_options(options); + + if (!idx) + idx = locate_option(argc, argv, options, "v"); + if (idx && argv[idx + 1]) + opt_loglevel(NULL, "loglevel", argv[idx + 1]); + idx = locate_option(argc, argv, options, "report"); + if ((env = getenv("FFREPORT")) || idx) { + init_report(env); + if (report_file) { + int i; + fprintf(report_file, "Command line:\n"); + for (i = 0; i < argc; i++) { + dump_argument(argv[i]); + fputc(i < argc - 1 ? ' ' : '\n', report_file); + } + fflush(report_file); + } + } + idx = locate_option(argc, argv, options, "hide_banner"); + if (idx) + hide_banner = 1; +} + +static const AVOption *opt_find(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags) +{ + const AVOption *o = av_opt_find(obj, name, unit, opt_flags, search_flags); + if(o && !o->flags) + return NULL; + return o; +} + +#define FLAGS (o->type == AV_OPT_TYPE_FLAGS && (arg[0]=='-' || arg[0]=='+')) ? AV_DICT_APPEND : 0 +int opt_default(void *optctx, const char *opt, const char *arg) +{ + const AVOption *o; + int consumed = 0; + char opt_stripped[128]; + const char *p; + const AVClass *cc = avcodec_get_class(), *fc = avformat_get_class(); +#if CONFIG_AVRESAMPLE + const AVClass *rc = avresample_get_class(); +#endif +#if CONFIG_SWSCALE + const AVClass *sc = sws_get_class(); +#endif +#if CONFIG_SWRESAMPLE + const AVClass *swr_class = swr_get_class(); +#endif + + if (!strcmp(opt, "debug") || !strcmp(opt, "fdebug")) + av_log_set_level(AV_LOG_DEBUG); + + if (!(p = strchr(opt, ':'))) + p = opt + strlen(opt); + av_strlcpy(opt_stripped, opt, FFMIN(sizeof(opt_stripped), p - opt + 1)); + + if ((o = opt_find(&cc, opt_stripped, NULL, 0, + AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) || + ((opt[0] == 'v' || opt[0] == 'a' || opt[0] == 's') && + (o = opt_find(&cc, opt + 1, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ)))) { + av_dict_set(&codec_opts, opt, arg, FLAGS); + consumed = 1; + } + if ((o = opt_find(&fc, opt, NULL, 0, + AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) { + av_dict_set(&format_opts, opt, arg, FLAGS); + if (consumed) + av_log(NULL, AV_LOG_VERBOSE, "Routing option %s to both codec and muxer layer\n", opt); + consumed = 1; + } +#if CONFIG_SWSCALE + if (!consumed && (o = opt_find(&sc, opt, NULL, 0, + AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) { + struct SwsContext *sws = sws_alloc_context(); + int ret = av_opt_set(sws, opt, arg, 0); + sws_freeContext(sws); + if (!strcmp(opt, "srcw") || !strcmp(opt, "srch") || + !strcmp(opt, "dstw") || !strcmp(opt, "dsth") || + !strcmp(opt, "src_format") || !strcmp(opt, "dst_format")) { + av_log(NULL, AV_LOG_ERROR, "Directly using swscale dimensions/format options is not supported, please use the -s or -pix_fmt options\n"); + return AVERROR(EINVAL); + } + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt); + return ret; + } + + av_dict_set(&sws_dict, opt, arg, FLAGS); + + consumed = 1; + } +#else + if (!consumed && !strcmp(opt, "sws_flags")) { + av_log(NULL, AV_LOG_WARNING, "Ignoring %s %s, due to disabled swscale\n", opt, arg); + consumed = 1; + } +#endif +#if CONFIG_SWRESAMPLE + if (!consumed && (o=opt_find(&swr_class, opt, NULL, 0, + AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) { + struct SwrContext *swr = swr_alloc(); + int ret = av_opt_set(swr, opt, arg, 0); + swr_free(&swr); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error setting option %s.\n", opt); + return ret; + } + av_dict_set(&swr_opts, opt, arg, FLAGS); + consumed = 1; + } +#endif +#if CONFIG_AVRESAMPLE + if ((o=opt_find(&rc, opt, NULL, 0, + AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ))) { + av_dict_set(&resample_opts, opt, arg, FLAGS); + consumed = 1; + } +#endif + + if (consumed) + return 0; + return AVERROR_OPTION_NOT_FOUND; +} + +/* + * Check whether given option is a group separator. + * + * @return index of the group definition that matched or -1 if none + */ +static int match_group_separator(const OptionGroupDef *groups, int nb_groups, + const char *opt) +{ + int i; + + for (i = 0; i < nb_groups; i++) { + const OptionGroupDef *p = &groups[i]; + if (p->sep && !strcmp(p->sep, opt)) + return i; + } + + return -1; +} + +/* + * Finish parsing an option group. + * + * @param group_idx which group definition should this group belong to + * @param arg argument of the group delimiting option + */ +static void finish_group(OptionParseContext *octx, int group_idx, + const char *arg) +{ + OptionGroupList *l = &octx->groups[group_idx]; + OptionGroup *g; + + GROW_ARRAY(l->groups, l->nb_groups); + g = &l->groups[l->nb_groups - 1]; + + *g = octx->cur_group; + g->arg = arg; + g->group_def = l->group_def; + g->sws_dict = sws_dict; + g->swr_opts = swr_opts; + g->codec_opts = codec_opts; + g->format_opts = format_opts; + g->resample_opts = resample_opts; + + codec_opts = NULL; + format_opts = NULL; + resample_opts = NULL; + sws_dict = NULL; + swr_opts = NULL; + init_opts(); + + memset(&octx->cur_group, 0, sizeof(octx->cur_group)); +} + +/* + * Add an option instance to currently parsed group. + */ +static void add_opt(OptionParseContext *octx, const OptionDef *opt, + const char *key, const char *val) +{ + int global = !(opt->flags & (OPT_PERFILE | OPT_SPEC | OPT_OFFSET)); + OptionGroup *g = global ? &octx->global_opts : &octx->cur_group; + + GROW_ARRAY(g->opts, g->nb_opts); + g->opts[g->nb_opts - 1].opt = opt; + g->opts[g->nb_opts - 1].key = key; + g->opts[g->nb_opts - 1].val = val; +} + +static void init_parse_context(OptionParseContext *octx, + const OptionGroupDef *groups, int nb_groups) +{ + static const OptionGroupDef global_group = { "global" }; + int i; + + memset(octx, 0, sizeof(*octx)); + + octx->nb_groups = nb_groups; + octx->groups = av_mallocz_array(octx->nb_groups, sizeof(*octx->groups)); + if (!octx->groups) + exit_program(1); + + for (i = 0; i < octx->nb_groups; i++) + octx->groups[i].group_def = &groups[i]; + + octx->global_opts.group_def = &global_group; + octx->global_opts.arg = ""; + + init_opts(); +} + +void uninit_parse_context(OptionParseContext *octx) +{ + int i, j; + + for (i = 0; i < octx->nb_groups; i++) { + OptionGroupList *l = &octx->groups[i]; + + for (j = 0; j < l->nb_groups; j++) { + av_freep(&l->groups[j].opts); + av_dict_free(&l->groups[j].codec_opts); + av_dict_free(&l->groups[j].format_opts); + av_dict_free(&l->groups[j].resample_opts); + + av_dict_free(&l->groups[j].sws_dict); + av_dict_free(&l->groups[j].swr_opts); + } + av_freep(&l->groups); + } + av_freep(&octx->groups); + + av_freep(&octx->cur_group.opts); + av_freep(&octx->global_opts.opts); + + uninit_opts(); +} + +int split_commandline(OptionParseContext *octx, int argc, char *argv[], + const OptionDef *options, + const OptionGroupDef *groups, int nb_groups) +{ + int optindex = 1; + int dashdash = -2; + + /* perform system-dependent conversions for arguments list */ + prepare_app_arguments(&argc, &argv); + + init_parse_context(octx, groups, nb_groups); + av_log(NULL, AV_LOG_DEBUG, "Splitting the commandline.\n"); + + while (optindex < argc) { + const char *opt = argv[optindex++], *arg; + const OptionDef *po; + int ret; + + av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt); + + if (opt[0] == '-' && opt[1] == '-' && !opt[2]) { + dashdash = optindex; + continue; + } + /* unnamed group separators, e.g. output filename */ + if (opt[0] != '-' || !opt[1] || dashdash+1 == optindex) { + finish_group(octx, 0, opt); + av_log(NULL, AV_LOG_DEBUG, " matched as %s.\n", groups[0].name); + continue; + } + opt++; + +#define GET_ARG(arg) \ +do { \ + arg = argv[optindex++]; \ + if (!arg) { \ + av_log(NULL, AV_LOG_ERROR, "Missing argument for option '%s'.\n", opt);\ + return AVERROR(EINVAL); \ + } \ +} while (0) + + /* named group separators, e.g. -i */ + if ((ret = match_group_separator(groups, nb_groups, opt)) >= 0) { + GET_ARG(arg); + finish_group(octx, ret, arg); + av_log(NULL, AV_LOG_DEBUG, " matched as %s with argument '%s'.\n", + groups[ret].name, arg); + continue; + } + + /* normal options */ + po = find_option(options, opt); + if (po->name) { + if (po->flags & OPT_EXIT) { + /* optional argument, e.g. -h */ + arg = argv[optindex++]; + } else if (po->flags & HAS_ARG) { + GET_ARG(arg); + } else { + arg = "1"; + } + + add_opt(octx, po, opt, arg); + av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with " + "argument '%s'.\n", po->name, po->help, arg); + continue; + } + + /* AVOptions */ + if (argv[optindex]) { + ret = opt_default(NULL, opt, argv[optindex]); + if (ret >= 0) { + av_log(NULL, AV_LOG_DEBUG, " matched as AVOption '%s' with " + "argument '%s'.\n", opt, argv[optindex]); + optindex++; + continue; + } else if (ret != AVERROR_OPTION_NOT_FOUND) { + av_log(NULL, AV_LOG_ERROR, "Error parsing option '%s' " + "with argument '%s'.\n", opt, argv[optindex]); + return ret; + } + } + + /* boolean -nofoo options */ + if (opt[0] == 'n' && opt[1] == 'o' && + (po = find_option(options, opt + 2)) && + po->name && po->flags & OPT_BOOL) { + add_opt(octx, po, opt, "0"); + av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with " + "argument 0.\n", po->name, po->help); + continue; + } + + av_log(NULL, AV_LOG_ERROR, "Unrecognized option '%s'.\n", opt); + return AVERROR_OPTION_NOT_FOUND; + } + + if (octx->cur_group.nb_opts || codec_opts || format_opts || resample_opts) + av_log(NULL, AV_LOG_WARNING, "Trailing options were found on the " + "commandline.\n"); + + av_log(NULL, AV_LOG_DEBUG, "Finished splitting the commandline.\n"); + + return 0; +} + +int opt_cpuflags(void *optctx, const char *opt, const char *arg) +{ + int ret; + unsigned flags = av_get_cpu_flags(); + + if ((ret = av_parse_cpu_caps(&flags, arg)) < 0) + return ret; + + av_force_cpu_flags(flags); + return 0; +} + +int opt_loglevel(void *optctx, const char *opt, const char *arg) +{ + const struct { const char *name; int level; } log_levels[] = { + { "quiet" , AV_LOG_QUIET }, + { "panic" , AV_LOG_PANIC }, + { "fatal" , AV_LOG_FATAL }, + { "error" , AV_LOG_ERROR }, + { "warning", AV_LOG_WARNING }, + { "info" , AV_LOG_INFO }, + { "verbose", AV_LOG_VERBOSE }, + { "debug" , AV_LOG_DEBUG }, + { "trace" , AV_LOG_TRACE }, + }; + char *tail; + int level; + int flags; + int i; + + flags = av_log_get_flags(); + tail = strstr(arg, "repeat"); + if (tail) + flags &= ~AV_LOG_SKIP_REPEATED; + else + flags |= AV_LOG_SKIP_REPEATED; + + av_log_set_flags(flags); + if (tail == arg) + arg += 6 + (arg[6]=='+'); + if(tail && !*arg) + return 0; + + for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) { + if (!strcmp(log_levels[i].name, arg)) { + av_log_set_level(log_levels[i].level); + return 0; + } + } + + level = strtol(arg, &tail, 10); + if (*tail) { + av_log(NULL, AV_LOG_FATAL, "Invalid loglevel \"%s\". " + "Possible levels are numbers or:\n", arg); + for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) + av_log(NULL, AV_LOG_FATAL, "\"%s\"\n", log_levels[i].name); + exit_program(1); + } + av_log_set_level(level); + return 0; +} + +static void expand_filename_template(AVBPrint *bp, const char *template, + struct tm *tm) +{ + int c; + + while ((c = *(template++))) { + if (c == '%') { + if (!(c = *(template++))) + break; + switch (c) { + case 'p': + av_bprintf(bp, "%s", program_name); + break; + case 't': + av_bprintf(bp, "%04d%02d%02d-%02d%02d%02d", + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + break; + case '%': + av_bprint_chars(bp, c, 1); + break; + } + } else { + av_bprint_chars(bp, c, 1); + } + } +} + +static int init_report(const char *env) +{ + char *filename_template = NULL; + char *key, *val; + int ret, count = 0; + time_t now; + struct tm *tm; + AVBPrint filename; + + if (report_file) /* already opened */ + return 0; + time(&now); + tm = localtime(&now); + + while (env && *env) { + if ((ret = av_opt_get_key_value(&env, "=", ":", 0, &key, &val)) < 0) { + if (count) + av_log(NULL, AV_LOG_ERROR, + "Failed to parse FFREPORT environment variable: %s\n", + av_err2str(ret)); + break; + } + if (*env) + env++; + count++; + if (!strcmp(key, "file")) { + av_free(filename_template); + filename_template = val; + val = NULL; + } else if (!strcmp(key, "level")) { + char *tail; + report_file_level = strtol(val, &tail, 10); + if (*tail) { + av_log(NULL, AV_LOG_FATAL, "Invalid report file level\n"); + exit_program(1); + } + } else { + av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key); + } + av_free(val); + av_free(key); + } + + av_bprint_init(&filename, 0, 1); + expand_filename_template(&filename, + av_x_if_null(filename_template, "%p-%t.log"), tm); + av_free(filename_template); + if (!av_bprint_is_complete(&filename)) { + av_log(NULL, AV_LOG_ERROR, "Out of memory building report file name\n"); + return AVERROR(ENOMEM); + } + + report_file = fopen(filename.str, "w"); + if (!report_file) { + int ret = AVERROR(errno); + av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n", + filename.str, strerror(errno)); + return ret; + } + av_log_set_callback(log_callback_report); + av_log(NULL, AV_LOG_INFO, + "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n" + "Report written to \"%s\"\n", + program_name, + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec, + filename.str); + av_bprint_finalize(&filename, NULL); + return 0; +} + +int opt_report(const char *opt) +{ + return init_report(NULL); +} + +int opt_max_alloc(void *optctx, const char *opt, const char *arg) +{ + char *tail; + size_t max; + + max = strtol(arg, &tail, 10); + if (*tail) { + av_log(NULL, AV_LOG_FATAL, "Invalid max_alloc \"%s\".\n", arg); + exit_program(1); + } + av_max_alloc(max); + return 0; +} + +int opt_timelimit(void *optctx, const char *opt, const char *arg) +{ +#if HAVE_SETRLIMIT + int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); + struct rlimit rl = { lim, lim + 1 }; + if (setrlimit(RLIMIT_CPU, &rl)) + perror("setrlimit"); +#else + av_log(NULL, AV_LOG_WARNING, "-%s not implemented on this OS\n", opt); +#endif + return 0; +} + +void print_error(const char *filename, int err) +{ + char errbuf[128]; + const char *errbuf_ptr = errbuf; + + if (av_strerror(err, errbuf, sizeof(errbuf)) < 0) + errbuf_ptr = strerror(AVUNERROR(err)); + av_log(NULL, AV_LOG_ERROR, "%s: %s\n", filename, errbuf_ptr); +} + +static int warned_cfg = 0; + +#define INDENT 1 +#define SHOW_VERSION 2 +#define SHOW_CONFIG 4 +#define SHOW_COPYRIGHT 8 + +#define PRINT_LIB_INFO(libname, LIBNAME, flags, level) \ + if (CONFIG_##LIBNAME) { \ + const char *indent = flags & INDENT? " " : ""; \ + if (flags & SHOW_VERSION) { \ + unsigned int version = libname##_version(); \ + av_log(NULL, level, \ + "%slib%-11s %2d.%3d.%3d / %2d.%3d.%3d\n", \ + indent, #libname, \ + LIB##LIBNAME##_VERSION_MAJOR, \ + LIB##LIBNAME##_VERSION_MINOR, \ + LIB##LIBNAME##_VERSION_MICRO, \ + AV_VERSION_MAJOR(version), AV_VERSION_MINOR(version),\ + AV_VERSION_MICRO(version)); \ + } \ + if (flags & SHOW_CONFIG) { \ + const char *cfg = libname##_configuration(); \ + if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \ + if (!warned_cfg) { \ + av_log(NULL, level, \ + "%sWARNING: library configuration mismatch\n", \ + indent); \ + warned_cfg = 1; \ + } \ + av_log(NULL, level, "%s%-11s configuration: %s\n", \ + indent, #libname, cfg); \ + } \ + } \ + } \ + +static void print_all_libs_info(int flags, int level) +{ + PRINT_LIB_INFO(avutil, AVUTIL, flags, level); + PRINT_LIB_INFO(avcodec, AVCODEC, flags, level); + PRINT_LIB_INFO(avformat, AVFORMAT, flags, level); + PRINT_LIB_INFO(avdevice, AVDEVICE, flags, level); + PRINT_LIB_INFO(avfilter, AVFILTER, flags, level); + PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level); + PRINT_LIB_INFO(swscale, SWSCALE, flags, level); + PRINT_LIB_INFO(swresample, SWRESAMPLE, flags, level); + PRINT_LIB_INFO(postproc, POSTPROC, flags, level); +} + +static void print_program_info(int flags, int level) +{ + const char *indent = flags & INDENT? " " : ""; + + av_log(NULL, level, "%s version " FFMPEG_VERSION, program_name); + if (flags & SHOW_COPYRIGHT) + av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers", + program_birth_year, CONFIG_THIS_YEAR); + av_log(NULL, level, "\n"); + av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT); + + av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent); +} + +static void print_buildconf(int flags, int level) +{ + const char *indent = flags & INDENT ? " " : ""; + char str[] = { FFMPEG_CONFIGURATION }; + char *conflist, *remove_tilde, *splitconf; + + // Change all the ' --' strings to '~--' so that + // they can be identified as tokens. + while ((conflist = strstr(str, " --")) != NULL) { + strncpy(conflist, "~--", 3); + } + + // Compensate for the weirdness this would cause + // when passing 'pkg-config --static'. + while ((remove_tilde = strstr(str, "pkg-config~")) != NULL) { + strncpy(remove_tilde, "pkg-config ", 11); + } + + splitconf = strtok(str, "~"); + av_log(NULL, level, "\n%sconfiguration:\n", indent); + while (splitconf != NULL) { + av_log(NULL, level, "%s%s%s\n", indent, indent, splitconf); + splitconf = strtok(NULL, "~"); + } +} + +void show_banner(int argc, char **argv, const OptionDef *options) +{ + int idx = locate_option(argc, argv, options, "version"); + if (hide_banner || idx) + return; + + print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO); + print_all_libs_info(INDENT|SHOW_CONFIG, AV_LOG_INFO); + print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_INFO); +} + +int show_version(void *optctx, const char *opt, const char *arg) +{ + av_log_set_callback(log_callback_help); + print_program_info (SHOW_COPYRIGHT, AV_LOG_INFO); + print_all_libs_info(SHOW_VERSION, AV_LOG_INFO); + + return 0; +} + +int show_buildconf(void *optctx, const char *opt, const char *arg) +{ + av_log_set_callback(log_callback_help); + print_buildconf (INDENT|0, AV_LOG_INFO); + + return 0; +} + +int show_license(void *optctx, const char *opt, const char *arg) +{ +#if CONFIG_NONFREE + printf( + "This version of %s has nonfree parts compiled in.\n" + "Therefore it is not legally redistributable.\n", + program_name ); +#elif CONFIG_GPLV3 + printf( + "%s is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 3 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "%s is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with %s. If not, see <http://www.gnu.org/licenses/>.\n", + program_name, program_name, program_name ); +#elif CONFIG_GPL + printf( + "%s is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "%s is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with %s; if not, write to the Free Software\n" + "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n", + program_name, program_name, program_name ); +#elif CONFIG_LGPLV3 + printf( + "%s is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU Lesser General Public License as published by\n" + "the Free Software Foundation; either version 3 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "%s is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU Lesser General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU Lesser General Public License\n" + "along with %s. If not, see <http://www.gnu.org/licenses/>.\n", + program_name, program_name, program_name ); +#else + printf( + "%s is free software; you can redistribute it and/or\n" + "modify it under the terms of the GNU Lesser General Public\n" + "License as published by the Free Software Foundation; either\n" + "version 2.1 of the License, or (at your option) any later version.\n" + "\n" + "%s is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + "Lesser General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU Lesser General Public\n" + "License along with %s; if not, write to the Free Software\n" + "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n", + program_name, program_name, program_name ); +#endif + + return 0; +} + +static int is_device(const AVClass *avclass) +{ + if (!avclass) + return 0; + return AV_IS_INPUT_DEVICE(avclass->category) || AV_IS_OUTPUT_DEVICE(avclass->category); +} + +static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only) +{ + AVInputFormat *ifmt = NULL; + AVOutputFormat *ofmt = NULL; + const char *last_name; + int is_dev; + + printf("%s\n" + " D. = Demuxing supported\n" + " .E = Muxing supported\n" + " --\n", device_only ? "Devices:" : "File formats:"); + last_name = "000"; + for (;;) { + int decode = 0; + int encode = 0; + const char *name = NULL; + const char *long_name = NULL; + + while ((ofmt = av_oformat_next(ofmt))) { + is_dev = is_device(ofmt->priv_class); + if (!is_dev && device_only) + continue; + if ((!name || strcmp(ofmt->name, name) < 0) && + strcmp(ofmt->name, last_name) > 0) { + name = ofmt->name; + long_name = ofmt->long_name; + encode = 1; + } + } + while ((ifmt = av_iformat_next(ifmt))) { + is_dev = is_device(ifmt->priv_class); + if (!is_dev && device_only) + continue; + if ((!name || strcmp(ifmt->name, name) < 0) && + strcmp(ifmt->name, last_name) > 0) { + name = ifmt->name; + long_name = ifmt->long_name; + encode = 0; + } + if (name && strcmp(ifmt->name, name) == 0) + decode = 1; + } + if (!name) + break; + last_name = name; + + printf(" %s%s %-15s %s\n", + decode ? "D" : " ", + encode ? "E" : " ", + name, + long_name ? long_name:" "); + } + return 0; +} + +int show_formats(void *optctx, const char *opt, const char *arg) +{ + return show_formats_devices(optctx, opt, arg, 0); +} + +int show_devices(void *optctx, const char *opt, const char *arg) +{ + return show_formats_devices(optctx, opt, arg, 1); +} + +#define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \ + if (codec->field) { \ + const type *p = codec->field; \ + \ + printf(" Supported " list_name ":"); \ + while (*p != term) { \ + get_name(*p); \ + printf(" %s", name); \ + p++; \ + } \ + printf("\n"); \ + } \ + +static void print_codec(const AVCodec *c) +{ + int encoder = av_codec_is_encoder(c); + + printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name, + c->long_name ? c->long_name : ""); + + printf(" General capabilities: "); + if (c->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND) + printf("horizband "); + if (c->capabilities & AV_CODEC_CAP_DR1) + printf("dr1 "); + if (c->capabilities & AV_CODEC_CAP_TRUNCATED) + printf("trunc "); + if (c->capabilities & AV_CODEC_CAP_DELAY) + printf("delay "); + if (c->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME) + printf("small "); + if (c->capabilities & AV_CODEC_CAP_SUBFRAMES) + printf("subframes "); + if (c->capabilities & AV_CODEC_CAP_EXPERIMENTAL) + printf("exp "); + if (c->capabilities & AV_CODEC_CAP_CHANNEL_CONF) + printf("chconf "); + if (c->capabilities & AV_CODEC_CAP_PARAM_CHANGE) + printf("paramchange "); + if (c->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) + printf("variable "); + if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS | + AV_CODEC_CAP_SLICE_THREADS | + AV_CODEC_CAP_AUTO_THREADS)) + printf("threads "); + if (!c->capabilities) + printf("none"); + printf("\n"); + + if (c->type == AVMEDIA_TYPE_VIDEO || + c->type == AVMEDIA_TYPE_AUDIO) { + printf(" Threading capabilities: "); + switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS | + AV_CODEC_CAP_SLICE_THREADS | + AV_CODEC_CAP_AUTO_THREADS)) { + case AV_CODEC_CAP_FRAME_THREADS | + AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break; + case AV_CODEC_CAP_FRAME_THREADS: printf("frame"); break; + case AV_CODEC_CAP_SLICE_THREADS: printf("slice"); break; + case AV_CODEC_CAP_AUTO_THREADS : printf("auto"); break; + default: printf("none"); break; + } + printf("\n"); + } + + if (c->supported_framerates) { + const AVRational *fps = c->supported_framerates; + + printf(" Supported framerates:"); + while (fps->num) { + printf(" %d/%d", fps->num, fps->den); + fps++; + } + printf("\n"); + } + PRINT_CODEC_SUPPORTED(c, pix_fmts, enum AVPixelFormat, "pixel formats", + AV_PIX_FMT_NONE, GET_PIX_FMT_NAME); + PRINT_CODEC_SUPPORTED(c, supported_samplerates, int, "sample rates", 0, + GET_SAMPLE_RATE_NAME); + PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample formats", + AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME); + PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts", + 0, GET_CH_LAYOUT_DESC); + + if (c->priv_class) { + show_help_children(c->priv_class, + AV_OPT_FLAG_ENCODING_PARAM | + AV_OPT_FLAG_DECODING_PARAM); + } +} + +static char get_media_type_char(enum AVMediaType type) +{ + switch (type) { + case AVMEDIA_TYPE_VIDEO: return 'V'; + case AVMEDIA_TYPE_AUDIO: return 'A'; + case AVMEDIA_TYPE_DATA: return 'D'; + case AVMEDIA_TYPE_SUBTITLE: return 'S'; + case AVMEDIA_TYPE_ATTACHMENT:return 'T'; + default: return '?'; + } +} + +static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev, + int encoder) +{ + while ((prev = av_codec_next(prev))) { + if (prev->id == id && + (encoder ? av_codec_is_encoder(prev) : av_codec_is_decoder(prev))) + return prev; + } + return NULL; +} + +static int compare_codec_desc(const void *a, const void *b) +{ + const AVCodecDescriptor * const *da = a; + const AVCodecDescriptor * const *db = b; + + return (*da)->type != (*db)->type ? FFDIFFSIGN((*da)->type, (*db)->type) : + strcmp((*da)->name, (*db)->name); +} + +static unsigned get_codecs_sorted(const AVCodecDescriptor ***rcodecs) +{ + const AVCodecDescriptor *desc = NULL; + const AVCodecDescriptor **codecs; + unsigned nb_codecs = 0, i = 0; + + while ((desc = avcodec_descriptor_next(desc))) + nb_codecs++; + if (!(codecs = av_calloc(nb_codecs, sizeof(*codecs)))) { + av_log(NULL, AV_LOG_ERROR, "Out of memory\n"); + exit_program(1); + } + desc = NULL; + while ((desc = avcodec_descriptor_next(desc))) + codecs[i++] = desc; + av_assert0(i == nb_codecs); + qsort(codecs, nb_codecs, sizeof(*codecs), compare_codec_desc); + *rcodecs = codecs; + return nb_codecs; +} + +static void print_codecs_for_id(enum AVCodecID id, int encoder) +{ + const AVCodec *codec = NULL; + + printf(" (%s: ", encoder ? "encoders" : "decoders"); + + while ((codec = next_codec_for_id(id, codec, encoder))) + printf("%s ", codec->name); + + printf(")"); +} + +int show_codecs(void *optctx, const char *opt, const char *arg) +{ + const AVCodecDescriptor **codecs; + unsigned i, nb_codecs = get_codecs_sorted(&codecs); + + printf("Codecs:\n" + " D..... = Decoding supported\n" + " .E.... = Encoding supported\n" + " ..V... = Video codec\n" + " ..A... = Audio codec\n" + " ..S... = Subtitle codec\n" + " ...I.. = Intra frame-only codec\n" + " ....L. = Lossy compression\n" + " .....S = Lossless compression\n" + " -------\n"); + for (i = 0; i < nb_codecs; i++) { + const AVCodecDescriptor *desc = codecs[i]; + const AVCodec *codec = NULL; + + if (strstr(desc->name, "_deprecated")) + continue; + + printf(" "); + printf(avcodec_find_decoder(desc->id) ? "D" : "."); + printf(avcodec_find_encoder(desc->id) ? "E" : "."); + + printf("%c", get_media_type_char(desc->type)); + printf((desc->props & AV_CODEC_PROP_INTRA_ONLY) ? "I" : "."); + printf((desc->props & AV_CODEC_PROP_LOSSY) ? "L" : "."); + printf((desc->props & AV_CODEC_PROP_LOSSLESS) ? "S" : "."); + + printf(" %-20s %s", desc->name, desc->long_name ? desc->long_name : ""); + + /* print decoders/encoders when there's more than one or their + * names are different from codec name */ + while ((codec = next_codec_for_id(desc->id, codec, 0))) { + if (strcmp(codec->name, desc->name)) { + print_codecs_for_id(desc->id, 0); + break; + } + } + codec = NULL; + while ((codec = next_codec_for_id(desc->id, codec, 1))) { + if (strcmp(codec->name, desc->name)) { + print_codecs_for_id(desc->id, 1); + break; + } + } + + printf("\n"); + } + av_free(codecs); + return 0; +} + +static void print_codecs(int encoder) +{ + const AVCodecDescriptor **codecs; + unsigned i, nb_codecs = get_codecs_sorted(&codecs); + + printf("%s:\n" + " V..... = Video\n" + " A..... = Audio\n" + " S..... = Subtitle\n" + " .F.... = Frame-level multithreading\n" + " ..S... = Slice-level multithreading\n" + " ...X.. = Codec is experimental\n" + " ....B. = Supports draw_horiz_band\n" + " .....D = Supports direct rendering method 1\n" + " ------\n", + encoder ? "Encoders" : "Decoders"); + for (i = 0; i < nb_codecs; i++) { + const AVCodecDescriptor *desc = codecs[i]; + const AVCodec *codec = NULL; + + while ((codec = next_codec_for_id(desc->id, codec, encoder))) { + printf(" %c", get_media_type_char(desc->type)); + printf((codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) ? "F" : "."); + printf((codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) ? "S" : "."); + printf((codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) ? "X" : "."); + printf((codec->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)?"B" : "."); + printf((codec->capabilities & AV_CODEC_CAP_DR1) ? "D" : "."); + + printf(" %-20s %s", codec->name, codec->long_name ? codec->long_name : ""); + if (strcmp(codec->name, desc->name)) + printf(" (codec %s)", desc->name); + + printf("\n"); + } + } + av_free(codecs); +} + +int show_decoders(void *optctx, const char *opt, const char *arg) +{ + print_codecs(0); + return 0; +} + +int show_encoders(void *optctx, const char *opt, const char *arg) +{ + print_codecs(1); + return 0; +} + +int show_bsfs(void *optctx, const char *opt, const char *arg) +{ + AVBitStreamFilter *bsf = NULL; + + printf("Bitstream filters:\n"); + while ((bsf = av_bitstream_filter_next(bsf))) + printf("%s\n", bsf->name); + printf("\n"); + return 0; +} + +int show_protocols(void *optctx, const char *opt, const char *arg) +{ + void *opaque = NULL; + const char *name; + + printf("Supported file protocols:\n" + "Input:\n"); + while ((name = avio_enum_protocols(&opaque, 0))) + printf(" %s\n", name); + printf("Output:\n"); + while ((name = avio_enum_protocols(&opaque, 1))) + printf(" %s\n", name); + return 0; +} + +int show_filters(void *optctx, const char *opt, const char *arg) +{ +#if CONFIG_AVFILTER + const AVFilter *filter = NULL; + char descr[64], *descr_cur; + int i, j; + const AVFilterPad *pad; + + printf("Filters:\n" + " T.. = Timeline support\n" + " .S. = Slice threading\n" + " ..C = Command support\n" + " A = Audio input/output\n" + " V = Video input/output\n" + " N = Dynamic number and/or type of input/output\n" + " | = Source or sink filter\n"); + while ((filter = avfilter_next(filter))) { + descr_cur = descr; + for (i = 0; i < 2; i++) { + if (i) { + *(descr_cur++) = '-'; + *(descr_cur++) = '>'; + } + pad = i ? filter->outputs : filter->inputs; + for (j = 0; pad && avfilter_pad_get_name(pad, j); j++) { + if (descr_cur >= descr + sizeof(descr) - 4) + break; + *(descr_cur++) = get_media_type_char(avfilter_pad_get_type(pad, j)); + } + if (!j) + *(descr_cur++) = ((!i && (filter->flags & AVFILTER_FLAG_DYNAMIC_INPUTS)) || + ( i && (filter->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS))) ? 'N' : '|'; + } + *descr_cur = 0; + printf(" %c%c%c %-17s %-10s %s\n", + filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE ? 'T' : '.', + filter->flags & AVFILTER_FLAG_SLICE_THREADS ? 'S' : '.', + filter->process_command ? 'C' : '.', + filter->name, descr, filter->description); + } +#else + printf("No filters available: libavfilter disabled\n"); +#endif + return 0; +} + +int show_colors(void *optctx, const char *opt, const char *arg) +{ + const char *name; + const uint8_t *rgb; + int i; + + printf("%-32s #RRGGBB\n", "name"); + + for (i = 0; name = av_get_known_color_name(i, &rgb); i++) + printf("%-32s #%02x%02x%02x\n", name, rgb[0], rgb[1], rgb[2]); + + return 0; +} + +int show_pix_fmts(void *optctx, const char *opt, const char *arg) +{ + const AVPixFmtDescriptor *pix_desc = NULL; + + printf("Pixel formats:\n" + "I.... = Supported Input format for conversion\n" + ".O... = Supported Output format for conversion\n" + "..H.. = Hardware accelerated format\n" + "...P. = Paletted format\n" + "....B = Bitstream format\n" + "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n" + "-----\n"); + +#if !CONFIG_SWSCALE +# define sws_isSupportedInput(x) 0 +# define sws_isSupportedOutput(x) 0 +#endif + + while ((pix_desc = av_pix_fmt_desc_next(pix_desc))) { + enum AVPixelFormat pix_fmt = av_pix_fmt_desc_get_id(pix_desc); + printf("%c%c%c%c%c %-16s %d %2d\n", + sws_isSupportedInput (pix_fmt) ? 'I' : '.', + sws_isSupportedOutput(pix_fmt) ? 'O' : '.', + pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL ? 'H' : '.', + pix_desc->flags & AV_PIX_FMT_FLAG_PAL ? 'P' : '.', + pix_desc->flags & AV_PIX_FMT_FLAG_BITSTREAM ? 'B' : '.', + pix_desc->name, + pix_desc->nb_components, + av_get_bits_per_pixel(pix_desc)); + } + return 0; +} + +int show_layouts(void *optctx, const char *opt, const char *arg) +{ + int i = 0; + uint64_t layout, j; + const char *name, *descr; + + printf("Individual channels:\n" + "NAME DESCRIPTION\n"); + for (i = 0; i < 63; i++) { + name = av_get_channel_name((uint64_t)1 << i); + if (!name) + continue; + descr = av_get_channel_description((uint64_t)1 << i); + printf("%-14s %s\n", name, descr); + } + printf("\nStandard channel layouts:\n" + "NAME DECOMPOSITION\n"); + for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) { + if (name) { + printf("%-14s ", name); + for (j = 1; j; j <<= 1) + if ((layout & j)) + printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j)); + printf("\n"); + } + } + return 0; +} + +int show_sample_fmts(void *optctx, const char *opt, const char *arg) +{ + int i; + char fmt_str[128]; + for (i = -1; i < AV_SAMPLE_FMT_NB; i++) + printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i)); + return 0; +} + +static void show_help_codec(const char *name, int encoder) +{ + const AVCodecDescriptor *desc; + const AVCodec *codec; + + if (!name) { + av_log(NULL, AV_LOG_ERROR, "No codec name specified.\n"); + return; + } + + codec = encoder ? avcodec_find_encoder_by_name(name) : + avcodec_find_decoder_by_name(name); + + if (codec) + print_codec(codec); + else if ((desc = avcodec_descriptor_get_by_name(name))) { + int printed = 0; + + while ((codec = next_codec_for_id(desc->id, codec, encoder))) { + printed = 1; + print_codec(codec); + } + + if (!printed) { + av_log(NULL, AV_LOG_ERROR, "Codec '%s' is known to FFmpeg, " + "but no %s for it are available. FFmpeg might need to be " + "recompiled with additional external libraries.\n", + name, encoder ? "encoders" : "decoders"); + } + } else { + av_log(NULL, AV_LOG_ERROR, "Codec '%s' is not recognized by FFmpeg.\n", + name); + } +} + +static void show_help_demuxer(const char *name) +{ + const AVInputFormat *fmt = av_find_input_format(name); + + if (!fmt) { + av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name); + return; + } + + printf("Demuxer %s [%s]:\n", fmt->name, fmt->long_name); + + if (fmt->extensions) + printf(" Common extensions: %s.\n", fmt->extensions); + + if (fmt->priv_class) + show_help_children(fmt->priv_class, AV_OPT_FLAG_DECODING_PARAM); +} + +static void show_help_muxer(const char *name) +{ + const AVCodecDescriptor *desc; + const AVOutputFormat *fmt = av_guess_format(name, NULL, NULL); + + if (!fmt) { + av_log(NULL, AV_LOG_ERROR, "Unknown format '%s'.\n", name); + return; + } + + printf("Muxer %s [%s]:\n", fmt->name, fmt->long_name); + + if (fmt->extensions) + printf(" Common extensions: %s.\n", fmt->extensions); + if (fmt->mime_type) + printf(" Mime type: %s.\n", fmt->mime_type); + if (fmt->video_codec != AV_CODEC_ID_NONE && + (desc = avcodec_descriptor_get(fmt->video_codec))) { + printf(" Default video codec: %s.\n", desc->name); + } + if (fmt->audio_codec != AV_CODEC_ID_NONE && + (desc = avcodec_descriptor_get(fmt->audio_codec))) { + printf(" Default audio codec: %s.\n", desc->name); + } + if (fmt->subtitle_codec != AV_CODEC_ID_NONE && + (desc = avcodec_descriptor_get(fmt->subtitle_codec))) { + printf(" Default subtitle codec: %s.\n", desc->name); + } + + if (fmt->priv_class) + show_help_children(fmt->priv_class, AV_OPT_FLAG_ENCODING_PARAM); +} + +#if CONFIG_AVFILTER +static void show_help_filter(const char *name) +{ +#if CONFIG_AVFILTER + const AVFilter *f = avfilter_get_by_name(name); + int i, count; + + if (!name) { + av_log(NULL, AV_LOG_ERROR, "No filter name specified.\n"); + return; + } else if (!f) { + av_log(NULL, AV_LOG_ERROR, "Unknown filter '%s'.\n", name); + return; + } + + printf("Filter %s\n", f->name); + if (f->description) + printf(" %s\n", f->description); + + if (f->flags & AVFILTER_FLAG_SLICE_THREADS) + printf(" slice threading supported\n"); + + printf(" Inputs:\n"); + count = avfilter_pad_count(f->inputs); + for (i = 0; i < count; i++) { + printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i), + media_type_string(avfilter_pad_get_type(f->inputs, i))); + } + if (f->flags & AVFILTER_FLAG_DYNAMIC_INPUTS) + printf(" dynamic (depending on the options)\n"); + else if (!count) + printf(" none (source filter)\n"); + + printf(" Outputs:\n"); + count = avfilter_pad_count(f->outputs); + for (i = 0; i < count; i++) { + printf(" #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i), + media_type_string(avfilter_pad_get_type(f->outputs, i))); + } + if (f->flags & AVFILTER_FLAG_DYNAMIC_OUTPUTS) + printf(" dynamic (depending on the options)\n"); + else if (!count) + printf(" none (sink filter)\n"); + + if (f->priv_class) + show_help_children(f->priv_class, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | + AV_OPT_FLAG_AUDIO_PARAM); + if (f->flags & AVFILTER_FLAG_SUPPORT_TIMELINE) + printf("This filter has support for timeline through the 'enable' option.\n"); +#else + av_log(NULL, AV_LOG_ERROR, "Build without libavfilter; " + "can not to satisfy request\n"); +#endif +} +#endif + +int show_help(void *optctx, const char *opt, const char *arg) +{ + char *topic, *par; + av_log_set_callback(log_callback_help); + + topic = av_strdup(arg ? arg : ""); + if (!topic) + return AVERROR(ENOMEM); + par = strchr(topic, '='); + if (par) + *par++ = 0; + + if (!*topic) { + show_help_default(topic, par); + } else if (!strcmp(topic, "decoder")) { + show_help_codec(par, 0); + } else if (!strcmp(topic, "encoder")) { + show_help_codec(par, 1); + } else if (!strcmp(topic, "demuxer")) { + show_help_demuxer(par); + } else if (!strcmp(topic, "muxer")) { + show_help_muxer(par); +#if CONFIG_AVFILTER + } else if (!strcmp(topic, "filter")) { + show_help_filter(par); +#endif + } else { + show_help_default(topic, par); + } + + av_freep(&topic); + return 0; +} + +int read_yesno(void) +{ + int c = getchar(); + int yesno = (av_toupper(c) == 'Y'); + + while (c != '\n' && c != EOF) + c = getchar(); + + return yesno; +} + +FILE *get_preset_file(char *filename, size_t filename_size, + const char *preset_name, int is_path, + const char *codec_name) +{ + FILE *f = NULL; + int i; + const char *base[3] = { getenv("FFMPEG_DATADIR"), + getenv("HOME"), + FFMPEG_DATADIR, }; + + if (is_path) { + av_strlcpy(filename, preset_name, filename_size); + f = fopen(filename, "r"); + } else { +#ifdef _WIN32 + char datadir[MAX_PATH], *ls; + base[2] = NULL; + + if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1)) + { + for (ls = datadir; ls < datadir + strlen(datadir); ls++) + if (*ls == '\\') *ls = '/'; + + if (ls = strrchr(datadir, '/')) + { + *ls = 0; + strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir)); + base[2] = datadir; + } + } +#endif + for (i = 0; i < 3 && !f; i++) { + if (!base[i]) + continue; + snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], + i != 1 ? "" : "/.ffmpeg", preset_name); + f = fopen(filename, "r"); + if (!f && codec_name) { + snprintf(filename, filename_size, + "%s%s/%s-%s.ffpreset", + base[i], i != 1 ? "" : "/.ffmpeg", codec_name, + preset_name); + f = fopen(filename, "r"); + } + } + } + + return f; +} + +int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec) +{ + int ret = avformat_match_stream_specifier(s, st, spec); + if (ret < 0) + av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec); + return ret; +} + +AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, + AVFormatContext *s, AVStream *st, AVCodec *codec) +{ + AVDictionary *ret = NULL; + AVDictionaryEntry *t = NULL; + int flags = s->oformat ? AV_OPT_FLAG_ENCODING_PARAM + : AV_OPT_FLAG_DECODING_PARAM; + char prefix = 0; + const AVClass *cc = avcodec_get_class(); + + if (!codec) + codec = s->oformat ? avcodec_find_encoder(codec_id) + : avcodec_find_decoder(codec_id); + + switch (st->codec->codec_type) { + case AVMEDIA_TYPE_VIDEO: + prefix = 'v'; + flags |= AV_OPT_FLAG_VIDEO_PARAM; + break; + case AVMEDIA_TYPE_AUDIO: + prefix = 'a'; + flags |= AV_OPT_FLAG_AUDIO_PARAM; + break; + case AVMEDIA_TYPE_SUBTITLE: + prefix = 's'; + flags |= AV_OPT_FLAG_SUBTITLE_PARAM; + break; + } + + while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) { + char *p = strchr(t->key, ':'); + + /* check stream specification in opt name */ + if (p) + switch (check_stream_specifier(s, st, p + 1)) { + case 1: *p = 0; break; + case 0: continue; + default: exit_program(1); + } + + if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) || + !codec || + (codec->priv_class && + av_opt_find(&codec->priv_class, t->key, NULL, flags, + AV_OPT_SEARCH_FAKE_OBJ))) + av_dict_set(&ret, t->key, t->value, 0); + else if (t->key[0] == prefix && + av_opt_find(&cc, t->key + 1, NULL, flags, + AV_OPT_SEARCH_FAKE_OBJ)) + av_dict_set(&ret, t->key + 1, t->value, 0); + + if (p) + *p = ':'; + } + return ret; +} + +AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, + AVDictionary *codec_opts) +{ + int i; + AVDictionary **opts; + + if (!s->nb_streams) + return NULL; + opts = av_mallocz_array(s->nb_streams, sizeof(*opts)); + if (!opts) { + av_log(NULL, AV_LOG_ERROR, + "Could not alloc memory for stream options.\n"); + return NULL; + } + for (i = 0; i < s->nb_streams; i++) + opts[i] = filter_codec_opts(codec_opts, s->streams[i]->codec->codec_id, + s, s->streams[i], NULL); + return opts; +} + +void *grow_array(void *array, int elem_size, int *size, int new_size) +{ + if (new_size >= INT_MAX / elem_size) { + av_log(NULL, AV_LOG_ERROR, "Array too big.\n"); + exit_program(1); + } + if (*size < new_size) { + uint8_t *tmp = av_realloc_array(array, new_size, elem_size); + if (!tmp) { + av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n"); + exit_program(1); + } + memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size); + *size = new_size; + return tmp; + } + return array; +} + +double get_rotation(AVStream *st) +{ + AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0); + uint8_t* displaymatrix = av_stream_get_side_data(st, + AV_PKT_DATA_DISPLAYMATRIX, NULL); + double theta = 0; + + if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) { + char *tail; + theta = av_strtod(rotate_tag->value, &tail); + if (*tail) + theta = 0; + } + if (displaymatrix && !theta) + theta = -av_display_rotation_get((int32_t*) displaymatrix); + + theta -= 360*floor(theta/360 + 0.9/360); + + if (fabs(theta - 90*round(theta/90)) > 2) + av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n" + "If you want to help, upload a sample " + "of this file to ftp://upload.ffmpeg.org/incoming/ " + "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)"); + + return theta; +} + +#if CONFIG_AVDEVICE +static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts) +{ + int ret, i; + AVDeviceInfoList *device_list = NULL; + + if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category)) + return AVERROR(EINVAL); + + printf("Audo-detected sources for %s:\n", fmt->name); + if (!fmt->get_device_list) { + ret = AVERROR(ENOSYS); + printf("Cannot list sources. Not implemented.\n"); + goto fail; + } + + if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) { + printf("Cannot list sources.\n"); + goto fail; + } + + for (i = 0; i < device_list->nb_devices; i++) { + printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ", + device_list->devices[i]->device_name, device_list->devices[i]->device_description); + } + + fail: + avdevice_free_list_devices(&device_list); + return ret; +} + +static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts) +{ + int ret, i; + AVDeviceInfoList *device_list = NULL; + + if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category)) + return AVERROR(EINVAL); + + printf("Audo-detected sinks for %s:\n", fmt->name); + if (!fmt->get_device_list) { + ret = AVERROR(ENOSYS); + printf("Cannot list sinks. Not implemented.\n"); + goto fail; + } + + if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) { + printf("Cannot list sinks.\n"); + goto fail; + } + + for (i = 0; i < device_list->nb_devices; i++) { + printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ", + device_list->devices[i]->device_name, device_list->devices[i]->device_description); + } + + fail: + avdevice_free_list_devices(&device_list); + return ret; +} + +static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts) +{ + int ret; + if (arg) { + char *opts_str = NULL; + av_assert0(dev && opts); + *dev = av_strdup(arg); + if (!*dev) + return AVERROR(ENOMEM); + if ((opts_str = strchr(*dev, ','))) { + *(opts_str++) = '\0'; + if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) { + av_freep(dev); + return ret; + } + } + } else + printf("\nDevice name is not provided.\n" + "You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n"); + return 0; +} + +int show_sources(void *optctx, const char *opt, const char *arg) +{ + AVInputFormat *fmt = NULL; + char *dev = NULL; + AVDictionary *opts = NULL; + int ret = 0; + int error_level = av_log_get_level(); + + av_log_set_level(AV_LOG_ERROR); + + if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0) + goto fail; + + do { + fmt = av_input_audio_device_next(fmt); + if (fmt) { + if (!strcmp(fmt->name, "lavfi")) + continue; //it's pointless to probe lavfi + if (dev && !av_match_name(dev, fmt->name)) + continue; + print_device_sources(fmt, opts); + } + } while (fmt); + do { + fmt = av_input_video_device_next(fmt); + if (fmt) { + if (dev && !av_match_name(dev, fmt->name)) + continue; + print_device_sources(fmt, opts); + } + } while (fmt); + fail: + av_dict_free(&opts); + av_free(dev); + av_log_set_level(error_level); + return ret; +} + +int show_sinks(void *optctx, const char *opt, const char *arg) +{ + AVOutputFormat *fmt = NULL; + char *dev = NULL; + AVDictionary *opts = NULL; + int ret = 0; + int error_level = av_log_get_level(); + + av_log_set_level(AV_LOG_ERROR); + + if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0) + goto fail; + + do { + fmt = av_output_audio_device_next(fmt); + if (fmt) { + if (dev && !av_match_name(dev, fmt->name)) + continue; + print_device_sinks(fmt, opts); + } + } while (fmt); + do { + fmt = av_output_video_device_next(fmt); + if (fmt) { + if (dev && !av_match_name(dev, fmt->name)) + continue; + print_device_sinks(fmt, opts); + } + } while (fmt); + fail: + av_dict_free(&opts); + av_free(dev); + av_log_set_level(error_level); + return ret; +} + +#endif
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils.h new file mode 100644 index 0000000..83ea4ad --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils.h
@@ -0,0 +1,590 @@ +/* + * Various utilities for command line tools + * copyright (c) 2003 Fabrice Bellard + * + * 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 + */ + +#ifndef CMDUTILS_H +#define CMDUTILS_H + +#include <stdint.h> + +#include "config.h" +#include "libavcodec/avcodec.h" +#include "libavfilter/avfilter.h" +#include "libavformat/avformat.h" +#include "libswscale/swscale.h" + +#ifdef _WIN32 +#undef main /* We don't want SDL to override our main() */ +#endif + +/** + * program name, defined by the program for show_version(). + */ +extern const char program_name[]; + +/** + * program birth year, defined by the program for show_banner() + */ +extern const int program_birth_year; + +extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; +extern AVFormatContext *avformat_opts; +extern AVDictionary *sws_dict; +extern AVDictionary *swr_opts; +extern AVDictionary *format_opts, *codec_opts, *resample_opts; +extern int hide_banner; + +/** + * Register a program-specific cleanup routine. + */ +void register_exit(void (*cb)(int ret)); + +/** + * Wraps exit with a program-specific cleanup routine. + */ +void exit_program(int ret) av_noreturn; + +/** + * Initialize the cmdutils option system, in particular + * allocate the *_opts contexts. + */ +void init_opts(void); +/** + * Uninitialize the cmdutils option system, in particular + * free the *_opts contexts and their contents. + */ +void uninit_opts(void); + +/** + * Trivial log callback. + * Only suitable for opt_help and similar since it lacks prefix handling. + */ +void log_callback_help(void* ptr, int level, const char* fmt, va_list vl); + +/** + * Override the cpuflags. + */ +int opt_cpuflags(void *optctx, const char *opt, const char *arg); + +/** + * Fallback for options that are not explicitly handled, these will be + * parsed through AVOptions. + */ +int opt_default(void *optctx, const char *opt, const char *arg); + +/** + * Set the libav* libraries log level. + */ +int opt_loglevel(void *optctx, const char *opt, const char *arg); + +int opt_report(const char *opt); + +int opt_max_alloc(void *optctx, const char *opt, const char *arg); + +int opt_codec_debug(void *optctx, const char *opt, const char *arg); + +#if CONFIG_OPENCL +int opt_opencl(void *optctx, const char *opt, const char *arg); + +int opt_opencl_bench(void *optctx, const char *opt, const char *arg); +#endif + +/** + * Limit the execution time. + */ +int opt_timelimit(void *optctx, const char *opt, const char *arg); + +/** + * Parse a string and return its corresponding value as a double. + * Exit from the application if the string cannot be correctly + * parsed or the corresponding value is invalid. + * + * @param context the context of the value to be set (e.g. the + * corresponding command line option name) + * @param numstr the string to be parsed + * @param type the type (OPT_INT64 or OPT_FLOAT) as which the + * string should be parsed + * @param min the minimum valid accepted value + * @param max the maximum valid accepted value + */ +double parse_number_or_die(const char *context, const char *numstr, int type, + double min, double max); + +/** + * Parse a string specifying a time and return its corresponding + * value as a number of microseconds. Exit from the application if + * the string cannot be correctly parsed. + * + * @param context the context of the value to be set (e.g. the + * corresponding command line option name) + * @param timestr the string to be parsed + * @param is_duration a flag which tells how to interpret timestr, if + * not zero timestr is interpreted as a duration, otherwise as a + * date + * + * @see av_parse_time() + */ +int64_t parse_time_or_die(const char *context, const char *timestr, + int is_duration); + +typedef struct SpecifierOpt { + char *specifier; /**< stream/chapter/program/... specifier */ + union { + uint8_t *str; + int i; + int64_t i64; + float f; + double dbl; + } u; +} SpecifierOpt; + +typedef struct OptionDef { + const char *name; + int flags; +#define HAS_ARG 0x0001 +#define OPT_BOOL 0x0002 +#define OPT_EXPERT 0x0004 +#define OPT_STRING 0x0008 +#define OPT_VIDEO 0x0010 +#define OPT_AUDIO 0x0020 +#define OPT_INT 0x0080 +#define OPT_FLOAT 0x0100 +#define OPT_SUBTITLE 0x0200 +#define OPT_INT64 0x0400 +#define OPT_EXIT 0x0800 +#define OPT_DATA 0x1000 +#define OPT_PERFILE 0x2000 /* the option is per-file (currently ffmpeg-only). + implied by OPT_OFFSET or OPT_SPEC */ +#define OPT_OFFSET 0x4000 /* option is specified as an offset in a passed optctx */ +#define OPT_SPEC 0x8000 /* option is to be stored in an array of SpecifierOpt. + Implies OPT_OFFSET. Next element after the offset is + an int containing element count in the array. */ +#define OPT_TIME 0x10000 +#define OPT_DOUBLE 0x20000 +#define OPT_INPUT 0x40000 +#define OPT_OUTPUT 0x80000 + union { + void *dst_ptr; + int (*func_arg)(void *, const char *, const char *); + size_t off; + } u; + const char *help; + const char *argname; +} OptionDef; + +/** + * Print help for all options matching specified flags. + * + * @param options a list of options + * @param msg title of this group. Only printed if at least one option matches. + * @param req_flags print only options which have all those flags set. + * @param rej_flags don't print options which have any of those flags set. + * @param alt_flags print only options that have at least one of those flags set + */ +void show_help_options(const OptionDef *options, const char *msg, int req_flags, + int rej_flags, int alt_flags); + +/** + * Show help for all options with given flags in class and all its + * children. + */ +void show_help_children(const AVClass *class, int flags); + +/** + * Per-fftool specific help handler. Implemented in each + * fftool, called by show_help(). + */ +void show_help_default(const char *opt, const char *arg); + +/** + * Generic -h handler common to all fftools. + */ +int show_help(void *optctx, const char *opt, const char *arg); + +/** + * Parse the command line arguments. + * + * @param optctx an opaque options context + * @param argc number of command line arguments + * @param argv values of command line arguments + * @param options Array with the definitions required to interpret every + * option of the form: -option_name [argument] + * @param parse_arg_function Name of the function called to process every + * argument without a leading option name flag. NULL if such arguments do + * not have to be processed. + */ +void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, + void (* parse_arg_function)(void *optctx, const char*)); + +/** + * Parse one given option. + * + * @return on success 1 if arg was consumed, 0 otherwise; negative number on error + */ +int parse_option(void *optctx, const char *opt, const char *arg, + const OptionDef *options); + +/** + * An option extracted from the commandline. + * Cannot use AVDictionary because of options like -map which can be + * used multiple times. + */ +typedef struct Option { + const OptionDef *opt; + const char *key; + const char *val; +} Option; + +typedef struct OptionGroupDef { + /**< group name */ + const char *name; + /** + * Option to be used as group separator. Can be NULL for groups which + * are terminated by a non-option argument (e.g. ffmpeg output files) + */ + const char *sep; + /** + * Option flags that must be set on each option that is + * applied to this group + */ + int flags; +} OptionGroupDef; + +typedef struct OptionGroup { + const OptionGroupDef *group_def; + const char *arg; + + Option *opts; + int nb_opts; + + AVDictionary *codec_opts; + AVDictionary *format_opts; + AVDictionary *resample_opts; + AVDictionary *sws_dict; + AVDictionary *swr_opts; +} OptionGroup; + +/** + * A list of option groups that all have the same group type + * (e.g. input files or output files) + */ +typedef struct OptionGroupList { + const OptionGroupDef *group_def; + + OptionGroup *groups; + int nb_groups; +} OptionGroupList; + +typedef struct OptionParseContext { + OptionGroup global_opts; + + OptionGroupList *groups; + int nb_groups; + + /* parsing state */ + OptionGroup cur_group; +} OptionParseContext; + +/** + * Parse an options group and write results into optctx. + * + * @param optctx an app-specific options context. NULL for global options group + */ +int parse_optgroup(void *optctx, OptionGroup *g); + +/** + * Split the commandline into an intermediate form convenient for further + * processing. + * + * The commandline is assumed to be composed of options which either belong to a + * group (those with OPT_SPEC, OPT_OFFSET or OPT_PERFILE) or are global + * (everything else). + * + * A group (defined by an OptionGroupDef struct) is a sequence of options + * terminated by either a group separator option (e.g. -i) or a parameter that + * is not an option (doesn't start with -). A group without a separator option + * must always be first in the supplied groups list. + * + * All options within the same group are stored in one OptionGroup struct in an + * OptionGroupList, all groups with the same group definition are stored in one + * OptionGroupList in OptionParseContext.groups. The order of group lists is the + * same as the order of group definitions. + */ +int split_commandline(OptionParseContext *octx, int argc, char *argv[], + const OptionDef *options, + const OptionGroupDef *groups, int nb_groups); + +/** + * Free all allocated memory in an OptionParseContext. + */ +void uninit_parse_context(OptionParseContext *octx); + +/** + * Find the '-loglevel' option in the command line args and apply it. + */ +void parse_loglevel(int argc, char **argv, const OptionDef *options); + +/** + * Return index of option opt in argv or 0 if not found. + */ +int locate_option(int argc, char **argv, const OptionDef *options, + const char *optname); + +/** + * Check if the given stream matches a stream specifier. + * + * @param s Corresponding format context. + * @param st Stream from s to be checked. + * @param spec A stream specifier of the [v|a|s|d]:[\<stream index\>] form. + * + * @return 1 if the stream matches, 0 if it doesn't, <0 on error + */ +int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); + +/** + * Filter out options for given codec. + * + * Create a new options dictionary containing only the options from + * opts which apply to the codec with ID codec_id. + * + * @param opts dictionary to place options in + * @param codec_id ID of the codec that should be filtered for + * @param s Corresponding format context. + * @param st A stream from s for which the options should be filtered. + * @param codec The particular codec for which the options should be filtered. + * If null, the default one is looked up according to the codec id. + * @return a pointer to the created dictionary + */ +AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, + AVFormatContext *s, AVStream *st, AVCodec *codec); + +/** + * Setup AVCodecContext options for avformat_find_stream_info(). + * + * Create an array of dictionaries, one dictionary for each stream + * contained in s. + * Each dictionary will contain the options from codec_opts which can + * be applied to the corresponding stream codec context. + * + * @return pointer to the created array of dictionaries, NULL if it + * cannot be created + */ +AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, + AVDictionary *codec_opts); + +/** + * Print an error message to stderr, indicating filename and a human + * readable description of the error code err. + * + * If strerror_r() is not available the use of this function in a + * multithreaded application may be unsafe. + * + * @see av_strerror() + */ +void print_error(const char *filename, int err); + +/** + * Print the program banner to stderr. The banner contents depend on the + * current version of the repository and of the libav* libraries used by + * the program. + */ +void show_banner(int argc, char **argv, const OptionDef *options); + +/** + * Print the version of the program to stdout. The version message + * depends on the current versions of the repository and of the libav* + * libraries. + * This option processing function does not utilize the arguments. + */ +int show_version(void *optctx, const char *opt, const char *arg); + +/** + * Print the build configuration of the program to stdout. The contents + * depend on the definition of FFMPEG_CONFIGURATION. + * This option processing function does not utilize the arguments. + */ +int show_buildconf(void *optctx, const char *opt, const char *arg); + +/** + * Print the license of the program to stdout. The license depends on + * the license of the libraries compiled into the program. + * This option processing function does not utilize the arguments. + */ +int show_license(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the formats supported by the + * program (including devices). + * This option processing function does not utilize the arguments. + */ +int show_formats(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the devices supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_devices(void *optctx, const char *opt, const char *arg); + +#if CONFIG_AVDEVICE +/** + * Print a listing containing audodetected sinks of the output device. + * Device name with options may be passed as an argument to limit results. + */ +int show_sinks(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing audodetected sources of the input device. + * Device name with options may be passed as an argument to limit results. + */ +int show_sources(void *optctx, const char *opt, const char *arg); +#endif + +/** + * Print a listing containing all the codecs supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_codecs(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the decoders supported by the + * program. + */ +int show_decoders(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the encoders supported by the + * program. + */ +int show_encoders(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the filters supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_filters(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the bit stream filters supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_bsfs(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the protocols supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_protocols(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the pixel formats supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_pix_fmts(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the standard channel layouts supported by + * the program. + * This option processing function does not utilize the arguments. + */ +int show_layouts(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the sample formats supported by the + * program. + */ +int show_sample_fmts(void *optctx, const char *opt, const char *arg); + +/** + * Print a listing containing all the color names and values recognized + * by the program. + */ +int show_colors(void *optctx, const char *opt, const char *arg); + +/** + * Return a positive value if a line read from standard input + * starts with [yY], otherwise return 0. + */ +int read_yesno(void); + +/** + * Get a file corresponding to a preset file. + * + * If is_path is non-zero, look for the file in the path preset_name. + * Otherwise search for a file named arg.ffpreset in the directories + * $FFMPEG_DATADIR (if set), $HOME/.ffmpeg, and in the datadir defined + * at configuration time or in a "ffpresets" folder along the executable + * on win32, in that order. If no such file is found and + * codec_name is defined, then search for a file named + * codec_name-preset_name.avpreset in the above-mentioned directories. + * + * @param filename buffer where the name of the found filename is written + * @param filename_size size in bytes of the filename buffer + * @param preset_name name of the preset to search + * @param is_path tell if preset_name is a filename path + * @param codec_name name of the codec for which to look for the + * preset, may be NULL + */ +FILE *get_preset_file(char *filename, size_t filename_size, + const char *preset_name, int is_path, const char *codec_name); + +/** + * Realloc array to hold new_size elements of elem_size. + * Calls exit() on failure. + * + * @param array array to reallocate + * @param elem_size size in bytes of each element + * @param size new element count will be written here + * @param new_size number of elements to place in reallocated array + * @return reallocated array + */ +void *grow_array(void *array, int elem_size, int *size, int new_size); + +#define media_type_string av_get_media_type_string + +#define GROW_ARRAY(array, nb_elems)\ + array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1) + +#define GET_PIX_FMT_NAME(pix_fmt)\ + const char *name = av_get_pix_fmt_name(pix_fmt); + +#define GET_SAMPLE_FMT_NAME(sample_fmt)\ + const char *name = av_get_sample_fmt_name(sample_fmt) + +#define GET_SAMPLE_RATE_NAME(rate)\ + char name[16];\ + snprintf(name, sizeof(name), "%d", rate); + +#define GET_CH_LAYOUT_NAME(ch_layout)\ + char name[16];\ + snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout); + +#define GET_CH_LAYOUT_DESC(ch_layout)\ + char name[128];\ + av_get_channel_layout_string(name, sizeof(name), 0, ch_layout); + +double get_rotation(AVStream *st); + +#endif /* CMDUTILS_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils_common_opts.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils_common_opts.h new file mode 100644 index 0000000..758dac1 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils_common_opts.h
@@ -0,0 +1,35 @@ + { "L" , OPT_EXIT, {.func_arg = show_license}, "show license" }, + { "h" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" }, + { "?" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" }, + { "help" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" }, + { "-help" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" }, + { "version" , OPT_EXIT, {.func_arg = show_version}, "show version" }, + { "buildconf" , OPT_EXIT, {.func_arg = show_buildconf}, "show build configuration" }, + { "formats" , OPT_EXIT, {.func_arg = show_formats }, "show available formats" }, + { "devices" , OPT_EXIT, {.func_arg = show_devices }, "show available devices" }, + { "codecs" , OPT_EXIT, {.func_arg = show_codecs }, "show available codecs" }, + { "decoders" , OPT_EXIT, {.func_arg = show_decoders }, "show available decoders" }, + { "encoders" , OPT_EXIT, {.func_arg = show_encoders }, "show available encoders" }, + { "bsfs" , OPT_EXIT, {.func_arg = show_bsfs }, "show available bit stream filters" }, + { "protocols" , OPT_EXIT, {.func_arg = show_protocols}, "show available protocols" }, + { "filters" , OPT_EXIT, {.func_arg = show_filters }, "show available filters" }, + { "pix_fmts" , OPT_EXIT, {.func_arg = show_pix_fmts }, "show available pixel formats" }, + { "layouts" , OPT_EXIT, {.func_arg = show_layouts }, "show standard channel layouts" }, + { "sample_fmts", OPT_EXIT, {.func_arg = show_sample_fmts }, "show available audio sample formats" }, + { "colors" , OPT_EXIT, {.func_arg = show_colors }, "show available color names" }, + { "loglevel" , HAS_ARG, {.func_arg = opt_loglevel}, "set logging level", "loglevel" }, + { "v", HAS_ARG, {.func_arg = opt_loglevel}, "set logging level", "loglevel" }, + { "report" , 0, {(void*)opt_report}, "generate a report" }, + { "max_alloc" , HAS_ARG, {.func_arg = opt_max_alloc}, "set maximum size of a single allocated block", "bytes" }, + { "cpuflags" , HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" }, + { "hide_banner", OPT_BOOL | OPT_EXPERT, {&hide_banner}, "do not show program banner", "hide_banner" }, +#if CONFIG_OPENCL + { "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" }, + { "opencl_options", HAS_ARG, {.func_arg = opt_opencl}, "set OpenCL environment options" }, +#endif +#if CONFIG_AVDEVICE + { "sources" , OPT_EXIT | HAS_ARG, { .func_arg = show_sources }, + "list sources of the input device", "device" }, + { "sinks" , OPT_EXIT | HAS_ARG, { .func_arg = show_sinks }, + "list sinks of the output device", "device" }, +#endif
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils_opencl.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils_opencl.c new file mode 100644 index 0000000..dd21344 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/cmdutils_opencl.c
@@ -0,0 +1,278 @@ +/* + * Copyright (C) 2013 Lenny Wang + * + * 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 + */ + +#include "libavutil/opt.h" +#include "libavutil/time.h" +#include "libavutil/log.h" +#include "libavutil/opencl.h" +#include "libavutil/avstring.h" +#include "cmdutils.h" + +typedef struct { + int platform_idx; + int device_idx; + char device_name[64]; + int64_t runtime; +} OpenCLDeviceBenchmark; + +const char *ocl_bench_source = AV_OPENCL_KERNEL( +inline unsigned char clip_uint8(int a) +{ + if (a & (~0xFF)) + return (-a)>>31; + else + return a; +} + +kernel void unsharp_bench( + global unsigned char *src, + global unsigned char *dst, + global int *mask, + int width, + int height) +{ + int i, j, local_idx, lc_idx, sum = 0; + int2 thread_idx, block_idx, global_idx, lm_idx; + thread_idx.x = get_local_id(0); + thread_idx.y = get_local_id(1); + block_idx.x = get_group_id(0); + block_idx.y = get_group_id(1); + global_idx.x = get_global_id(0); + global_idx.y = get_global_id(1); + local uchar data[32][32]; + local int lc[128]; + + for (i = 0; i <= 1; i++) { + lm_idx.y = -8 + (block_idx.y + i) * 16 + thread_idx.y; + lm_idx.y = lm_idx.y < 0 ? 0 : lm_idx.y; + lm_idx.y = lm_idx.y >= height ? height - 1: lm_idx.y; + for (j = 0; j <= 1; j++) { + lm_idx.x = -8 + (block_idx.x + j) * 16 + thread_idx.x; + lm_idx.x = lm_idx.x < 0 ? 0 : lm_idx.x; + lm_idx.x = lm_idx.x >= width ? width - 1: lm_idx.x; + data[i*16 + thread_idx.y][j*16 + thread_idx.x] = src[lm_idx.y*width + lm_idx.x]; + } + } + local_idx = thread_idx.y*16 + thread_idx.x; + if (local_idx < 128) + lc[local_idx] = mask[local_idx]; + barrier(CLK_LOCAL_MEM_FENCE); + + \n#pragma unroll\n + for (i = -4; i <= 4; i++) { + lm_idx.y = 8 + i + thread_idx.y; + \n#pragma unroll\n + for (j = -4; j <= 4; j++) { + lm_idx.x = 8 + j + thread_idx.x; + lc_idx = (i + 4)*8 + j + 4; + sum += (int)data[lm_idx.y][lm_idx.x] * lc[lc_idx]; + } + } + int temp = (int)data[thread_idx.y + 8][thread_idx.x + 8]; + int res = temp + (((temp - (int)((sum + 1<<15) >> 16))) >> 16); + if (global_idx.x < width && global_idx.y < height) + dst[global_idx.x + global_idx.y*width] = clip_uint8(res); +} +); + +#define OCLCHECK(method, ... ) \ +do { \ + status = method(__VA_ARGS__); \ + if (status != CL_SUCCESS) { \ + av_log(NULL, AV_LOG_ERROR, # method " error '%s'\n", \ + av_opencl_errstr(status)); \ + ret = AVERROR_EXTERNAL; \ + goto end; \ + } \ +} while (0) + +#define CREATEBUF(out, flags, size) \ +do { \ + out = clCreateBuffer(ext_opencl_env->context, flags, size, NULL, &status); \ + if (status != CL_SUCCESS) { \ + av_log(NULL, AV_LOG_ERROR, "Could not create OpenCL buffer\n"); \ + ret = AVERROR_EXTERNAL; \ + goto end; \ + } \ +} while (0) + +static void fill_rand_int(int *data, int n) +{ + int i; + srand(av_gettime()); + for (i = 0; i < n; i++) + data[i] = rand(); +} + +#define OPENCL_NB_ITER 5 +static int64_t run_opencl_bench(AVOpenCLExternalEnv *ext_opencl_env) +{ + int i, arg = 0, width = 1920, height = 1088; + int64_t start, ret = 0; + cl_int status; + size_t kernel_len; + char *inbuf; + int *mask; + int buf_size = width * height * sizeof(char); + int mask_size = sizeof(uint32_t) * 128; + + cl_mem cl_mask, cl_inbuf, cl_outbuf; + cl_kernel kernel = NULL; + cl_program program = NULL; + size_t local_work_size_2d[2] = {16, 16}; + size_t global_work_size_2d[2] = {(size_t)width, (size_t)height}; + + if (!(inbuf = av_malloc(buf_size)) || !(mask = av_malloc(mask_size))) { + av_log(NULL, AV_LOG_ERROR, "Out of memory\n"); + ret = AVERROR(ENOMEM); + goto end; + } + fill_rand_int((int*)inbuf, buf_size/4); + fill_rand_int(mask, mask_size/4); + + CREATEBUF(cl_mask, CL_MEM_READ_ONLY, mask_size); + CREATEBUF(cl_inbuf, CL_MEM_READ_ONLY, buf_size); + CREATEBUF(cl_outbuf, CL_MEM_READ_WRITE, buf_size); + + kernel_len = strlen(ocl_bench_source); + program = clCreateProgramWithSource(ext_opencl_env->context, 1, &ocl_bench_source, + &kernel_len, &status); + if (status != CL_SUCCESS || !program) { + av_log(NULL, AV_LOG_ERROR, "OpenCL unable to create benchmark program\n"); + ret = AVERROR_EXTERNAL; + goto end; + } + status = clBuildProgram(program, 1, &(ext_opencl_env->device_id), NULL, NULL, NULL); + if (status != CL_SUCCESS) { + av_log(NULL, AV_LOG_ERROR, "OpenCL unable to build benchmark program\n"); + ret = AVERROR_EXTERNAL; + goto end; + } + kernel = clCreateKernel(program, "unsharp_bench", &status); + if (status != CL_SUCCESS) { + av_log(NULL, AV_LOG_ERROR, "OpenCL unable to create benchmark kernel\n"); + ret = AVERROR_EXTERNAL; + goto end; + } + + OCLCHECK(clEnqueueWriteBuffer, ext_opencl_env->command_queue, cl_inbuf, CL_TRUE, 0, + buf_size, inbuf, 0, NULL, NULL); + OCLCHECK(clEnqueueWriteBuffer, ext_opencl_env->command_queue, cl_mask, CL_TRUE, 0, + mask_size, mask, 0, NULL, NULL); + OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_mem), &cl_inbuf); + OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_mem), &cl_outbuf); + OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_mem), &cl_mask); + OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_int), &width); + OCLCHECK(clSetKernelArg, kernel, arg++, sizeof(cl_int), &height); + + start = av_gettime_relative(); + for (i = 0; i < OPENCL_NB_ITER; i++) + OCLCHECK(clEnqueueNDRangeKernel, ext_opencl_env->command_queue, kernel, 2, NULL, + global_work_size_2d, local_work_size_2d, 0, NULL, NULL); + clFinish(ext_opencl_env->command_queue); + ret = (av_gettime_relative() - start)/OPENCL_NB_ITER; +end: + if (kernel) + clReleaseKernel(kernel); + if (program) + clReleaseProgram(program); + if (cl_inbuf) + clReleaseMemObject(cl_inbuf); + if (cl_outbuf) + clReleaseMemObject(cl_outbuf); + if (cl_mask) + clReleaseMemObject(cl_mask); + av_free(inbuf); + av_free(mask); + return ret; +} + +static int compare_ocl_device_desc(const void *a, const void *b) +{ + const OpenCLDeviceBenchmark* va = (const OpenCLDeviceBenchmark*)a; + const OpenCLDeviceBenchmark* vb = (const OpenCLDeviceBenchmark*)b; + return FFDIFFSIGN(va->runtime , vb->runtime); +} + +int opt_opencl_bench(void *optctx, const char *opt, const char *arg) +{ + int i, j, nb_devices = 0, count = 0; + int64_t score = 0; + AVOpenCLDeviceList *device_list; + AVOpenCLDeviceNode *device_node = NULL; + OpenCLDeviceBenchmark *devices = NULL; + cl_platform_id platform; + + av_opencl_get_device_list(&device_list); + for (i = 0; i < device_list->platform_num; i++) + nb_devices += device_list->platform_node[i]->device_num; + if (!nb_devices) { + av_log(NULL, AV_LOG_ERROR, "No OpenCL device detected!\n"); + return AVERROR(EINVAL); + } + if (!(devices = av_malloc_array(nb_devices, sizeof(OpenCLDeviceBenchmark)))) { + av_log(NULL, AV_LOG_ERROR, "Could not allocate buffer\n"); + return AVERROR(ENOMEM); + } + + for (i = 0; i < device_list->platform_num; i++) { + for (j = 0; j < device_list->platform_node[i]->device_num; j++) { + device_node = device_list->platform_node[i]->device_node[j]; + platform = device_list->platform_node[i]->platform_id; + score = av_opencl_benchmark(device_node, platform, run_opencl_bench); + if (score > 0) { + devices[count].platform_idx = i; + devices[count].device_idx = j; + devices[count].runtime = score; + av_strlcpy(devices[count].device_name, device_node->device_name, + sizeof(devices[count].device_name)); + count++; + } + } + } + qsort(devices, count, sizeof(OpenCLDeviceBenchmark), compare_ocl_device_desc); + fprintf(stderr, "platform_idx\tdevice_idx\tdevice_name\truntime\n"); + for (i = 0; i < count; i++) + fprintf(stdout, "%d\t%d\t%s\t%"PRId64"\n", + devices[i].platform_idx, devices[i].device_idx, + devices[i].device_name, devices[i].runtime); + + av_opencl_free_device_list(&device_list); + av_free(devices); + return 0; +} + +int opt_opencl(void *optctx, const char *opt, const char *arg) +{ + char *key, *value; + const char *opts = arg; + int ret = 0; + while (*opts) { + ret = av_opt_get_key_value(&opts, "=", ":", 0, &key, &value); + if (ret < 0) + return ret; + ret = av_opencl_set_option(key, value); + if (ret < 0) + return ret; + if (*opts) + opts++; + } + return ret; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/common.mak b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/common.mak new file mode 100644 index 0000000..03b51c5 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/common.mak
@@ -0,0 +1,168 @@ +# +# common bits used by all libraries +# + +# first so "all" becomes default target +all: all-yes + +DEFAULT_YASMD=.dbg + +ifeq ($(DBG),1) +YASMD=$(DEFAULT_YASMD) +else +YASMD= +endif + +ifndef SUBDIR + +ifndef V +Q = @ +ECHO = printf "$(1)\t%s\n" $(2) +BRIEF = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES +SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM + +MSG = $@ +M = @$(call ECHO,$(TAG),$@); +$(foreach VAR,$(BRIEF), \ + $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR)))) +$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR)))) +$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL)) +endif + +ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample + +# NASM requires -I path terminated with / +IFLAGS := -I. -I$(SRC_LINK)/ +CPPFLAGS := $(IFLAGS) $(CPPFLAGS) +CFLAGS += $(ECFLAGS) +CCFLAGS = $(CPPFLAGS) $(CFLAGS) +OBJCFLAGS += $(EOBJCFLAGS) +OBJCCFLAGS = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS) +ASFLAGS := $(CPPFLAGS) $(ASFLAGS) +CXXFLAGS += $(CPPFLAGS) $(CFLAGS) +YASMFLAGS += $(IFLAGS:%=%/) -Pconfig.asm + +HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS) +LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS) + +define COMPILE + $(call $(1)DEP,$(1)) + $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) +endef + +COMPILE_C = $(call COMPILE,CC) +COMPILE_CXX = $(call COMPILE,CXX) +COMPILE_S = $(call COMPILE,AS) +COMPILE_M = $(call COMPILE,OBJCC) +COMPILE_HOSTC = $(call COMPILE,HOSTCC) + +%.o: %.c + $(COMPILE_C) + +%.o: %.cpp + $(COMPILE_CXX) + +%.o: %.m + $(COMPILE_M) + +%.s: %.c + $(CC) $(CCFLAGS) -S -o $@ $< + +%.o: %.S + $(COMPILE_S) + +%_host.o: %.c + $(COMPILE_HOSTC) + +%.o: %.rc + $(WINDRES) $(IFLAGS) --preprocessor "$(DEPWINDRES) -E -xc-header -DRC_INVOKED $(CC_DEPFLAGS)" -o $@ $< + +%.i: %.c + $(CC) $(CCFLAGS) $(CC_E) $< + +%.h.c: + $(Q)echo '#include "$*.h"' >$@ + +%.ver: %.v + $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ | sed -e 's/:/:\ +/' -e 's/; /;\ +/g' > $@ + +%.c %.h: TAG = GEN + +# Dummy rule to stop make trying to rebuild removed or renamed headers +%.h: + @: + +# Disable suffix rules. Most of the builtin rules are suffix rules, +# so this saves some time on slow systems. +.SUFFIXES: + +# Do not delete intermediate files from chains of implicit rules +$(OBJS): +endif + +include $(SRC_PATH)/arch.mak + +OBJS += $(OBJS-yes) +SLIBOBJS += $(SLIBOBJS-yes) +FFLIBS := $($(NAME)_FFLIBS) $(FFLIBS-yes) $(FFLIBS) +TESTPROGS += $(TESTPROGS-yes) + +LDLIBS = $(FFLIBS:%=%$(BUILDSUF)) +FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS) + +OBJS := $(sort $(OBJS:%=$(SUBDIR)%)) +SLIBOBJS := $(sort $(SLIBOBJS:%=$(SUBDIR)%)) +TESTOBJS := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o) +TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF)) +HOSTOBJS := $(HOSTPROGS:%=$(SUBDIR)%.o) +HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF)) +TOOLS += $(TOOLS-yes) +TOOLOBJS := $(TOOLS:%=tools/%.o) +TOOLS := $(TOOLS:%=tools/%$(EXESUF)) +HEADERS += $(HEADERS-yes) + +PATH_LIBNAME = $(foreach NAME,$(1),lib$(NAME)/$($(2)LIBNAME)) +DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib),$(CONFIG_SHARED:yes=S))) +STATIC_DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib))) + +SRC_DIR := $(SRC_PATH)/lib$(NAME) +ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h)) +SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-) +SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%) +HOBJS = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o)) +checkheaders: $(HOBJS) +.SECONDARY: $(HOBJS:.o=.c) + +alltools: $(TOOLS) + +$(HOSTOBJS): %.o: %.c + $(COMPILE_HOSTC) + +$(HOSTPROGS): %$(HOSTEXESUF): %.o + $(HOSTLD) $(HOSTLDFLAGS) $(HOSTLD_O) $^ $(HOSTLIBS) + +$(OBJS): | $(sort $(dir $(OBJS))) +$(HOBJS): | $(sort $(dir $(HOBJS))) +$(HOSTOBJS): | $(sort $(dir $(HOSTOBJS))) +$(SLIBOBJS): | $(sort $(dir $(SLIBOBJS))) +$(TESTOBJS): | $(sort $(dir $(TESTOBJS))) +$(TOOLOBJS): | tools + +OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS)) + +CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ver-sol2 *.ho *.gcno *.gcda *$(DEFAULT_YASMD).asm +DISTCLEANSUFFIXES = *.pc +LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a + +define RULES +clean:: + $(RM) $(OBJS) $(OBJS:.o=.d) $(OBJS:.o=$(DEFAULT_YASMD).d) + $(RM) $(HOSTPROGS) + $(RM) $(TOOLS) +endef + +$(eval $(RULES)) + +-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d)) $(OBJS:.o=$(DEFAULT_YASMD).d)
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/aix/math.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/aix/math.h new file mode 100644 index 0000000..dee13c8 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/aix/math.h
@@ -0,0 +1,31 @@ +/* + * Work around the class() function in AIX math.h clashing with + * identifiers named "class". + * + * 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 + */ + +#ifndef COMPAT_AIX_MATH_H +#define COMPAT_AIX_MATH_H + +#define class class_in_math_h_causes_problems + +#include_next <math.h> + +#undef class + +#endif /* COMPAT_AIX_MATH_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avisynth_c.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avisynth_c.h new file mode 100644 index 0000000..0189dad --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avisynth_c.h
@@ -0,0 +1,882 @@ +// Avisynth C Interface Version 0.20 +// Copyright 2003 Kevin Atkinson + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA, or visit +// http://www.gnu.org/copyleft/gpl.html . +// +// As a special exception, I give you permission to link to the +// Avisynth C interface with independent modules that communicate with +// the Avisynth C interface solely through the interfaces defined in +// avisynth_c.h, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting combined work +// under terms of your choice, provided that every copy of the +// combined work is accompanied by a complete copy of the source code +// of the Avisynth C interface and Avisynth itself (with the version +// used to produce the combined work), being distributed under the +// terms of the GNU General Public License plus this exception. An +// independent module is a module which is not derived from or based +// on Avisynth C Interface, such as 3rd-party filters, import and +// export plugins, or graphical user interfaces. + +// NOTE: this is a partial update of the Avisynth C interface to recognize +// new color spaces added in Avisynth 2.60. By no means is this document +// completely Avisynth 2.60 compliant. + +#ifndef __AVISYNTH_C__ +#define __AVISYNTH_C__ + +#include "avs/config.h" +#include "avs/capi.h" +#include "avs/types.h" + + +///////////////////////////////////////////////////////////////////// +// +// Constants +// + +#ifndef __AVISYNTH_6_H__ +enum { AVISYNTH_INTERFACE_VERSION = 6 }; +#endif + +enum {AVS_SAMPLE_INT8 = 1<<0, + AVS_SAMPLE_INT16 = 1<<1, + AVS_SAMPLE_INT24 = 1<<2, + AVS_SAMPLE_INT32 = 1<<3, + AVS_SAMPLE_FLOAT = 1<<4}; + +enum {AVS_PLANAR_Y=1<<0, + AVS_PLANAR_U=1<<1, + AVS_PLANAR_V=1<<2, + AVS_PLANAR_ALIGNED=1<<3, + AVS_PLANAR_Y_ALIGNED=AVS_PLANAR_Y|AVS_PLANAR_ALIGNED, + AVS_PLANAR_U_ALIGNED=AVS_PLANAR_U|AVS_PLANAR_ALIGNED, + AVS_PLANAR_V_ALIGNED=AVS_PLANAR_V|AVS_PLANAR_ALIGNED, + AVS_PLANAR_A=1<<4, + AVS_PLANAR_R=1<<5, + AVS_PLANAR_G=1<<6, + AVS_PLANAR_B=1<<7, + AVS_PLANAR_A_ALIGNED=AVS_PLANAR_A|AVS_PLANAR_ALIGNED, + AVS_PLANAR_R_ALIGNED=AVS_PLANAR_R|AVS_PLANAR_ALIGNED, + AVS_PLANAR_G_ALIGNED=AVS_PLANAR_G|AVS_PLANAR_ALIGNED, + AVS_PLANAR_B_ALIGNED=AVS_PLANAR_B|AVS_PLANAR_ALIGNED}; + + // Colorspace properties. +enum {AVS_CS_BGR = 1<<28, + AVS_CS_YUV = 1<<29, + AVS_CS_INTERLEAVED = 1<<30, + AVS_CS_PLANAR = 1<<31, + + AVS_CS_SHIFT_SUB_WIDTH = 0, + AVS_CS_SHIFT_SUB_HEIGHT = 8, + AVS_CS_SHIFT_SAMPLE_BITS = 16, + + AVS_CS_SUB_WIDTH_MASK = 7 << AVS_CS_SHIFT_SUB_WIDTH, + AVS_CS_SUB_WIDTH_1 = 3 << AVS_CS_SHIFT_SUB_WIDTH, // YV24 + AVS_CS_SUB_WIDTH_2 = 0 << AVS_CS_SHIFT_SUB_WIDTH, // YV12, I420, YV16 + AVS_CS_SUB_WIDTH_4 = 1 << AVS_CS_SHIFT_SUB_WIDTH, // YUV9, YV411 + + AVS_CS_VPLANEFIRST = 1 << 3, // YV12, YV16, YV24, YV411, YUV9 + AVS_CS_UPLANEFIRST = 1 << 4, // I420 + + AVS_CS_SUB_HEIGHT_MASK = 7 << AVS_CS_SHIFT_SUB_HEIGHT, + AVS_CS_SUB_HEIGHT_1 = 3 << AVS_CS_SHIFT_SUB_HEIGHT, // YV16, YV24, YV411 + AVS_CS_SUB_HEIGHT_2 = 0 << AVS_CS_SHIFT_SUB_HEIGHT, // YV12, I420 + AVS_CS_SUB_HEIGHT_4 = 1 << AVS_CS_SHIFT_SUB_HEIGHT, // YUV9 + + AVS_CS_SAMPLE_BITS_MASK = 7 << AVS_CS_SHIFT_SAMPLE_BITS, + AVS_CS_SAMPLE_BITS_8 = 0 << AVS_CS_SHIFT_SAMPLE_BITS, + AVS_CS_SAMPLE_BITS_16 = 1 << AVS_CS_SHIFT_SAMPLE_BITS, + AVS_CS_SAMPLE_BITS_32 = 2 << AVS_CS_SHIFT_SAMPLE_BITS, + + AVS_CS_PLANAR_MASK = AVS_CS_PLANAR | AVS_CS_INTERLEAVED | AVS_CS_YUV | AVS_CS_BGR | AVS_CS_SAMPLE_BITS_MASK | AVS_CS_SUB_HEIGHT_MASK | AVS_CS_SUB_WIDTH_MASK, + AVS_CS_PLANAR_FILTER = ~( AVS_CS_VPLANEFIRST | AVS_CS_UPLANEFIRST )}; + + // Specific colorformats +enum { + AVS_CS_UNKNOWN = 0, + AVS_CS_BGR24 = 1<<0 | AVS_CS_BGR | AVS_CS_INTERLEAVED, + AVS_CS_BGR32 = 1<<1 | AVS_CS_BGR | AVS_CS_INTERLEAVED, + AVS_CS_YUY2 = 1<<2 | AVS_CS_YUV | AVS_CS_INTERLEAVED, + // AVS_CS_YV12 = 1<<3 Reserved + // AVS_CS_I420 = 1<<4 Reserved + AVS_CS_RAW32 = 1<<5 | AVS_CS_INTERLEAVED, + + AVS_CS_YV24 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_1 | AVS_CS_SUB_WIDTH_1, // YVU 4:4:4 planar + AVS_CS_YV16 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_1 | AVS_CS_SUB_WIDTH_2, // YVU 4:2:2 planar + AVS_CS_YV12 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_2 | AVS_CS_SUB_WIDTH_2, // YVU 4:2:0 planar + AVS_CS_I420 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_UPLANEFIRST | AVS_CS_SUB_HEIGHT_2 | AVS_CS_SUB_WIDTH_2, // YUV 4:2:0 planar + AVS_CS_IYUV = AVS_CS_I420, + AVS_CS_YV411 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_1 | AVS_CS_SUB_WIDTH_4, // YVU 4:1:1 planar + AVS_CS_YUV9 = AVS_CS_PLANAR | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 | AVS_CS_VPLANEFIRST | AVS_CS_SUB_HEIGHT_4 | AVS_CS_SUB_WIDTH_4, // YVU 4:1:0 planar + AVS_CS_Y8 = AVS_CS_PLANAR | AVS_CS_INTERLEAVED | AVS_CS_YUV | AVS_CS_SAMPLE_BITS_8 // Y 4:0:0 planar +}; + +enum { + AVS_IT_BFF = 1<<0, + AVS_IT_TFF = 1<<1, + AVS_IT_FIELDBASED = 1<<2}; + +enum { + AVS_FILTER_TYPE=1, + AVS_FILTER_INPUT_COLORSPACE=2, + AVS_FILTER_OUTPUT_TYPE=9, + AVS_FILTER_NAME=4, + AVS_FILTER_AUTHOR=5, + AVS_FILTER_VERSION=6, + AVS_FILTER_ARGS=7, + AVS_FILTER_ARGS_INFO=8, + AVS_FILTER_ARGS_DESCRIPTION=10, + AVS_FILTER_DESCRIPTION=11}; + +enum { //SUBTYPES + AVS_FILTER_TYPE_AUDIO=1, + AVS_FILTER_TYPE_VIDEO=2, + AVS_FILTER_OUTPUT_TYPE_SAME=3, + AVS_FILTER_OUTPUT_TYPE_DIFFERENT=4}; + +enum { + // New 2.6 explicitly defined cache hints. + AVS_CACHE_NOTHING=10, // Do not cache video. + AVS_CACHE_WINDOW=11, // Hard protect upto X frames within a range of X from the current frame N. + AVS_CACHE_GENERIC=12, // LRU cache upto X frames. + AVS_CACHE_FORCE_GENERIC=13, // LRU cache upto X frames, override any previous CACHE_WINDOW. + + AVS_CACHE_GET_POLICY=30, // Get the current policy. + AVS_CACHE_GET_WINDOW=31, // Get the current window h_span. + AVS_CACHE_GET_RANGE=32, // Get the current generic frame range. + + AVS_CACHE_AUDIO=50, // Explicitly do cache audio, X byte cache. + AVS_CACHE_AUDIO_NOTHING=51, // Explicitly do not cache audio. + AVS_CACHE_AUDIO_NONE=52, // Audio cache off (auto mode), X byte intial cache. + AVS_CACHE_AUDIO_AUTO=53, // Audio cache on (auto mode), X byte intial cache. + + AVS_CACHE_GET_AUDIO_POLICY=70, // Get the current audio policy. + AVS_CACHE_GET_AUDIO_SIZE=71, // Get the current audio cache size. + + AVS_CACHE_PREFETCH_FRAME=100, // Queue request to prefetch frame N. + AVS_CACHE_PREFETCH_GO=101, // Action video prefetches. + + AVS_CACHE_PREFETCH_AUDIO_BEGIN=120, // Begin queue request transaction to prefetch audio (take critical section). + AVS_CACHE_PREFETCH_AUDIO_STARTLO=121, // Set low 32 bits of start. + AVS_CACHE_PREFETCH_AUDIO_STARTHI=122, // Set high 32 bits of start. + AVS_CACHE_PREFETCH_AUDIO_COUNT=123, // Set low 32 bits of length. + AVS_CACHE_PREFETCH_AUDIO_COMMIT=124, // Enqueue request transaction to prefetch audio (release critical section). + AVS_CACHE_PREFETCH_AUDIO_GO=125, // Action audio prefetches. + + AVS_CACHE_GETCHILD_CACHE_MODE=200, // Cache ask Child for desired video cache mode. + AVS_CACHE_GETCHILD_CACHE_SIZE=201, // Cache ask Child for desired video cache size. + AVS_CACHE_GETCHILD_AUDIO_MODE=202, // Cache ask Child for desired audio cache mode. + AVS_CACHE_GETCHILD_AUDIO_SIZE=203, // Cache ask Child for desired audio cache size. + + AVS_CACHE_GETCHILD_COST=220, // Cache ask Child for estimated processing cost. + AVS_CACHE_COST_ZERO=221, // Child response of zero cost (ptr arithmetic only). + AVS_CACHE_COST_UNIT=222, // Child response of unit cost (less than or equal 1 full frame blit). + AVS_CACHE_COST_LOW=223, // Child response of light cost. (Fast) + AVS_CACHE_COST_MED=224, // Child response of medium cost. (Real time) + AVS_CACHE_COST_HI=225, // Child response of heavy cost. (Slow) + + AVS_CACHE_GETCHILD_THREAD_MODE=240, // Cache ask Child for thread safetyness. + AVS_CACHE_THREAD_UNSAFE=241, // Only 1 thread allowed for all instances. 2.5 filters default! + AVS_CACHE_THREAD_CLASS=242, // Only 1 thread allowed for each instance. 2.6 filters default! + AVS_CACHE_THREAD_SAFE=243, // Allow all threads in any instance. + AVS_CACHE_THREAD_OWN=244, // Safe but limit to 1 thread, internally threaded. + + AVS_CACHE_GETCHILD_ACCESS_COST=260, // Cache ask Child for preferred access pattern. + AVS_CACHE_ACCESS_RAND=261, // Filter is access order agnostic. + AVS_CACHE_ACCESS_SEQ0=262, // Filter prefers sequential access (low cost) + AVS_CACHE_ACCESS_SEQ1=263, // Filter needs sequential access (high cost) + }; + +#ifdef BUILDING_AVSCORE +struct AVS_ScriptEnvironment { + IScriptEnvironment * env; + const char * error; + AVS_ScriptEnvironment(IScriptEnvironment * e = 0) + : env(e), error(0) {} +}; +#endif + +typedef struct AVS_Clip AVS_Clip; +typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment; + +///////////////////////////////////////////////////////////////////// +// +// AVS_VideoInfo +// + +// AVS_VideoInfo is layed out identicly to VideoInfo +typedef struct AVS_VideoInfo { + int width, height; // width=0 means no video + unsigned fps_numerator, fps_denominator; + int num_frames; + + int pixel_type; + + int audio_samples_per_second; // 0 means no audio + int sample_type; + INT64 num_audio_samples; + int nchannels; + + // Imagetype properties + + int image_type; +} AVS_VideoInfo; + +// useful functions of the above +AVSC_INLINE int avs_has_video(const AVS_VideoInfo * p) + { return (p->width!=0); } + +AVSC_INLINE int avs_has_audio(const AVS_VideoInfo * p) + { return (p->audio_samples_per_second!=0); } + +AVSC_INLINE int avs_is_rgb(const AVS_VideoInfo * p) + { return !!(p->pixel_type&AVS_CS_BGR); } + +AVSC_INLINE int avs_is_rgb24(const AVS_VideoInfo * p) + { return (p->pixel_type&AVS_CS_BGR24)==AVS_CS_BGR24; } // Clear out additional properties + +AVSC_INLINE int avs_is_rgb32(const AVS_VideoInfo * p) + { return (p->pixel_type & AVS_CS_BGR32) == AVS_CS_BGR32 ; } + +AVSC_INLINE int avs_is_yuv(const AVS_VideoInfo * p) + { return !!(p->pixel_type&AVS_CS_YUV ); } + +AVSC_INLINE int avs_is_yuy2(const AVS_VideoInfo * p) + { return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; } + +AVSC_API(int, avs_is_yv24)(const AVS_VideoInfo * p); + +AVSC_API(int, avs_is_yv16)(const AVS_VideoInfo * p); + +AVSC_API(int, avs_is_yv12)(const AVS_VideoInfo * p) ; + +AVSC_API(int, avs_is_yv411)(const AVS_VideoInfo * p); + +AVSC_API(int, avs_is_y8)(const AVS_VideoInfo * p); + +AVSC_INLINE int avs_is_property(const AVS_VideoInfo * p, int property) + { return ((p->image_type & property)==property ); } + +AVSC_INLINE int avs_is_planar(const AVS_VideoInfo * p) + { return !!(p->pixel_type & AVS_CS_PLANAR); } + +AVSC_API(int, avs_is_color_space)(const AVS_VideoInfo * p, int c_space); + +AVSC_INLINE int avs_is_field_based(const AVS_VideoInfo * p) + { return !!(p->image_type & AVS_IT_FIELDBASED); } + +AVSC_INLINE int avs_is_parity_known(const AVS_VideoInfo * p) + { return ((p->image_type & AVS_IT_FIELDBASED)&&(p->image_type & (AVS_IT_BFF | AVS_IT_TFF))); } + +AVSC_INLINE int avs_is_bff(const AVS_VideoInfo * p) + { return !!(p->image_type & AVS_IT_BFF); } + +AVSC_INLINE int avs_is_tff(const AVS_VideoInfo * p) + { return !!(p->image_type & AVS_IT_TFF); } + +AVSC_API(int, avs_get_plane_width_subsampling)(const AVS_VideoInfo * p, int plane); + +AVSC_API(int, avs_get_plane_height_subsampling)(const AVS_VideoInfo * p, int plane); + + +AVSC_API(int, avs_bits_per_pixel)(const AVS_VideoInfo * p); + +AVSC_API(int, avs_bytes_from_pixels)(const AVS_VideoInfo * p, int pixels); + +AVSC_API(int, avs_row_size)(const AVS_VideoInfo * p, int plane); + +AVSC_API(int, avs_bmp_size)(const AVS_VideoInfo * vi); + +AVSC_INLINE int avs_samples_per_second(const AVS_VideoInfo * p) + { return p->audio_samples_per_second; } + + +AVSC_INLINE int avs_bytes_per_channel_sample(const AVS_VideoInfo * p) +{ + switch (p->sample_type) { + case AVS_SAMPLE_INT8: return sizeof(signed char); + case AVS_SAMPLE_INT16: return sizeof(signed short); + case AVS_SAMPLE_INT24: return 3; + case AVS_SAMPLE_INT32: return sizeof(signed int); + case AVS_SAMPLE_FLOAT: return sizeof(float); + default: return 0; + } +} +AVSC_INLINE int avs_bytes_per_audio_sample(const AVS_VideoInfo * p) + { return p->nchannels*avs_bytes_per_channel_sample(p);} + +AVSC_INLINE INT64 avs_audio_samples_from_frames(const AVS_VideoInfo * p, INT64 frames) + { return ((INT64)(frames) * p->audio_samples_per_second * p->fps_denominator / p->fps_numerator); } + +AVSC_INLINE int avs_frames_from_audio_samples(const AVS_VideoInfo * p, INT64 samples) + { return (int)(samples * (INT64)p->fps_numerator / (INT64)p->fps_denominator / (INT64)p->audio_samples_per_second); } + +AVSC_INLINE INT64 avs_audio_samples_from_bytes(const AVS_VideoInfo * p, INT64 bytes) + { return bytes / avs_bytes_per_audio_sample(p); } + +AVSC_INLINE INT64 avs_bytes_from_audio_samples(const AVS_VideoInfo * p, INT64 samples) + { return samples * avs_bytes_per_audio_sample(p); } + +AVSC_INLINE int avs_audio_channels(const AVS_VideoInfo * p) + { return p->nchannels; } + +AVSC_INLINE int avs_sample_type(const AVS_VideoInfo * p) + { return p->sample_type;} + +// useful mutator +AVSC_INLINE void avs_set_property(AVS_VideoInfo * p, int property) + { p->image_type|=property; } + +AVSC_INLINE void avs_clear_property(AVS_VideoInfo * p, int property) + { p->image_type&=~property; } + +AVSC_INLINE void avs_set_field_based(AVS_VideoInfo * p, int isfieldbased) + { if (isfieldbased) p->image_type|=AVS_IT_FIELDBASED; else p->image_type&=~AVS_IT_FIELDBASED; } + +AVSC_INLINE void avs_set_fps(AVS_VideoInfo * p, unsigned numerator, unsigned denominator) +{ + unsigned x=numerator, y=denominator; + while (y) { // find gcd + unsigned t = x%y; x = y; y = t; + } + p->fps_numerator = numerator/x; + p->fps_denominator = denominator/x; +} + +#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR +AVSC_INLINE int avs_is_same_colorspace(AVS_VideoInfo * x, AVS_VideoInfo * y) +{ + return (x->pixel_type == y->pixel_type) + || (avs_is_yv12(x) && avs_is_yv12(y)); +} +#endif + +///////////////////////////////////////////////////////////////////// +// +// AVS_VideoFrame +// + +// VideoFrameBuffer holds information about a memory block which is used +// for video data. For efficiency, instances of this class are not deleted +// when the refcount reaches zero; instead they're stored in a linked list +// to be reused. The instances are deleted when the corresponding AVS +// file is closed. + +// AVS_VideoFrameBuffer is layed out identicly to VideoFrameBuffer +// DO NOT USE THIS STRUCTURE DIRECTLY +typedef struct AVS_VideoFrameBuffer { + BYTE * data; + int data_size; + // sequence_number is incremented every time the buffer is changed, so + // that stale views can tell they're no longer valid. + volatile long sequence_number; + + volatile long refcount; +} AVS_VideoFrameBuffer; + +// VideoFrame holds a "window" into a VideoFrameBuffer. + +// AVS_VideoFrame is layed out identicly to IVideoFrame +// DO NOT USE THIS STRUCTURE DIRECTLY +typedef struct AVS_VideoFrame { + volatile long refcount; + AVS_VideoFrameBuffer * vfb; + int offset, pitch, row_size, height, offsetU, offsetV, pitchUV; // U&V offsets are from top of picture. + int row_sizeUV, heightUV; +} AVS_VideoFrame; + +// Access functions for AVS_VideoFrame +AVSC_API(int, avs_get_pitch_p)(const AVS_VideoFrame * p, int plane); + +#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR +AVSC_INLINE int avs_get_pitch(const AVS_VideoFrame * p) { + return avs_get_pitch_p(p, 0);} +#endif + +AVSC_API(int, avs_get_row_size_p)(const AVS_VideoFrame * p, int plane); + +AVSC_INLINE int avs_get_row_size(const AVS_VideoFrame * p) { + return p->row_size; } + +AVSC_API(int, avs_get_height_p)(const AVS_VideoFrame * p, int plane); + +AVSC_INLINE int avs_get_height(const AVS_VideoFrame * p) { + return p->height;} + +AVSC_API(const BYTE *, avs_get_read_ptr_p)(const AVS_VideoFrame * p, int plane); + +#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR +AVSC_INLINE const BYTE* avs_get_read_ptr(const AVS_VideoFrame * p) { + return avs_get_read_ptr_p(p, 0);} +#endif + +AVSC_API(int, avs_is_writable)(const AVS_VideoFrame * p); + +AVSC_API(BYTE *, avs_get_write_ptr_p)(const AVS_VideoFrame * p, int plane); + +#ifdef AVS_IMPLICIT_FUNCTION_DECLARATION_ERROR +AVSC_INLINE BYTE* avs_get_write_ptr(const AVS_VideoFrame * p) { + return avs_get_write_ptr_p(p, 0);} +#endif + +AVSC_API(void, avs_release_video_frame)(AVS_VideoFrame *); +// makes a shallow copy of a video frame +AVSC_API(AVS_VideoFrame *, avs_copy_video_frame)(AVS_VideoFrame *); + +#ifndef AVSC_NO_DECLSPEC +AVSC_INLINE void avs_release_frame(AVS_VideoFrame * f) + {avs_release_video_frame(f);} +AVSC_INLINE AVS_VideoFrame * avs_copy_frame(AVS_VideoFrame * f) + {return avs_copy_video_frame(f);} +#endif + +///////////////////////////////////////////////////////////////////// +// +// AVS_Value +// + +// Treat AVS_Value as a fat pointer. That is use avs_copy_value +// and avs_release_value appropiaty as you would if AVS_Value was +// a pointer. + +// To maintain source code compatibility with future versions of the +// avisynth_c API don't use the AVS_Value directly. Use the helper +// functions below. + +// AVS_Value is layed out identicly to AVSValue +typedef struct AVS_Value AVS_Value; +struct AVS_Value { + short type; // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong + // for some function e'rror + short array_size; + union { + void * clip; // do not use directly, use avs_take_clip + char boolean; + int integer; + float floating_pt; + const char * string; + const AVS_Value * array; + } d; +}; + +// AVS_Value should be initilized with avs_void. +// Should also set to avs_void after the value is released +// with avs_copy_value. Consider it the equalvent of setting +// a pointer to NULL +static const AVS_Value avs_void = {'v'}; + +AVSC_API(void, avs_copy_value)(AVS_Value * dest, AVS_Value src); +AVSC_API(void, avs_release_value)(AVS_Value); + +AVSC_INLINE int avs_defined(AVS_Value v) { return v.type != 'v'; } +AVSC_INLINE int avs_is_clip(AVS_Value v) { return v.type == 'c'; } +AVSC_INLINE int avs_is_bool(AVS_Value v) { return v.type == 'b'; } +AVSC_INLINE int avs_is_int(AVS_Value v) { return v.type == 'i'; } +AVSC_INLINE int avs_is_float(AVS_Value v) { return v.type == 'f' || v.type == 'i'; } +AVSC_INLINE int avs_is_string(AVS_Value v) { return v.type == 's'; } +AVSC_INLINE int avs_is_array(AVS_Value v) { return v.type == 'a'; } +AVSC_INLINE int avs_is_error(AVS_Value v) { return v.type == 'e'; } + +AVSC_API(AVS_Clip *, avs_take_clip)(AVS_Value, AVS_ScriptEnvironment *); +AVSC_API(void, avs_set_to_clip)(AVS_Value *, AVS_Clip *); + +AVSC_INLINE int avs_as_bool(AVS_Value v) + { return v.d.boolean; } +AVSC_INLINE int avs_as_int(AVS_Value v) + { return v.d.integer; } +AVSC_INLINE const char * avs_as_string(AVS_Value v) + { return avs_is_error(v) || avs_is_string(v) ? v.d.string : 0; } +AVSC_INLINE double avs_as_float(AVS_Value v) + { return avs_is_int(v) ? v.d.integer : v.d.floating_pt; } +AVSC_INLINE const char * avs_as_error(AVS_Value v) + { return avs_is_error(v) ? v.d.string : 0; } +AVSC_INLINE const AVS_Value * avs_as_array(AVS_Value v) + { return v.d.array; } +AVSC_INLINE int avs_array_size(AVS_Value v) + { return avs_is_array(v) ? v.array_size : 1; } +AVSC_INLINE AVS_Value avs_array_elt(AVS_Value v, int index) + { return avs_is_array(v) ? v.d.array[index] : v; } + +// only use these functions on an AVS_Value that does not already have +// an active value. Remember, treat AVS_Value as a fat pointer. +AVSC_INLINE AVS_Value avs_new_value_bool(int v0) + { AVS_Value v; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; } +AVSC_INLINE AVS_Value avs_new_value_int(int v0) + { AVS_Value v; v.type = 'i'; v.d.integer = v0; return v; } +AVSC_INLINE AVS_Value avs_new_value_string(const char * v0) + { AVS_Value v; v.type = 's'; v.d.string = v0; return v; } +AVSC_INLINE AVS_Value avs_new_value_float(float v0) + { AVS_Value v; v.type = 'f'; v.d.floating_pt = v0; return v;} +AVSC_INLINE AVS_Value avs_new_value_error(const char * v0) + { AVS_Value v; v.type = 'e'; v.d.string = v0; return v; } +#ifndef AVSC_NO_DECLSPEC +AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0) + { AVS_Value v; avs_set_to_clip(&v, v0); return v; } +#endif +AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size) + { AVS_Value v; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; } + +///////////////////////////////////////////////////////////////////// +// +// AVS_Clip +// + +AVSC_API(void, avs_release_clip)(AVS_Clip *); +AVSC_API(AVS_Clip *, avs_copy_clip)(AVS_Clip *); + +AVSC_API(const char *, avs_clip_get_error)(AVS_Clip *); // return 0 if no error + +AVSC_API(const AVS_VideoInfo *, avs_get_video_info)(AVS_Clip *); + +AVSC_API(int, avs_get_version)(AVS_Clip *); + +AVSC_API(AVS_VideoFrame *, avs_get_frame)(AVS_Clip *, int n); +// The returned video frame must be released with avs_release_video_frame + +AVSC_API(int, avs_get_parity)(AVS_Clip *, int n); +// return field parity if field_based, else parity of first field in frame + +AVSC_API(int, avs_get_audio)(AVS_Clip *, void * buf, + INT64 start, INT64 count); +// start and count are in samples + +AVSC_API(int, avs_set_cache_hints)(AVS_Clip *, + int cachehints, int frame_range); + +// This is the callback type used by avs_add_function +typedef AVS_Value (AVSC_CC * AVS_ApplyFunc) + (AVS_ScriptEnvironment *, AVS_Value args, void * user_data); + +typedef struct AVS_FilterInfo AVS_FilterInfo; +struct AVS_FilterInfo +{ + // these members should not be modified outside of the AVS_ApplyFunc callback + AVS_Clip * child; + AVS_VideoInfo vi; + AVS_ScriptEnvironment * env; + AVS_VideoFrame * (AVSC_CC * get_frame)(AVS_FilterInfo *, int n); + int (AVSC_CC * get_parity)(AVS_FilterInfo *, int n); + int (AVSC_CC * get_audio)(AVS_FilterInfo *, void * buf, + INT64 start, INT64 count); + int (AVSC_CC * set_cache_hints)(AVS_FilterInfo *, int cachehints, + int frame_range); + void (AVSC_CC * free_filter)(AVS_FilterInfo *); + + // Should be set when ever there is an error to report. + // It is cleared before any of the above methods are called + const char * error; + // this is to store whatever and may be modified at will + void * user_data; +}; + +// Create a new filter +// fi is set to point to the AVS_FilterInfo so that you can +// modify it once it is initilized. +// store_child should generally be set to true. If it is not +// set than ALL methods (the function pointers) must be defined +// If it is set than you do not need to worry about freeing the child +// clip. +AVSC_API(AVS_Clip *, avs_new_c_filter)(AVS_ScriptEnvironment * e, + AVS_FilterInfo * * fi, + AVS_Value child, int store_child); + +///////////////////////////////////////////////////////////////////// +// +// AVS_ScriptEnvironment +// + +// For GetCPUFlags. These are backwards-compatible with those in VirtualDub. +enum { + /* slowest CPU to support extension */ + AVS_CPU_FORCE = 0x01, // N/A + AVS_CPU_FPU = 0x02, // 386/486DX + AVS_CPU_MMX = 0x04, // P55C, K6, PII + AVS_CPU_INTEGER_SSE = 0x08, // PIII, Athlon + AVS_CPU_SSE = 0x10, // PIII, Athlon XP/MP + AVS_CPU_SSE2 = 0x20, // PIV, Hammer + AVS_CPU_3DNOW = 0x40, // K6-2 + AVS_CPU_3DNOW_EXT = 0x80, // Athlon + AVS_CPU_X86_64 = 0xA0, // Hammer (note: equiv. to 3DNow + SSE2, + // which only Hammer will have anyway) + AVS_CPUF_SSE3 = 0x100, // PIV+, K8 Venice + AVS_CPUF_SSSE3 = 0x200, // Core 2 + AVS_CPUF_SSE4 = 0x400, // Penryn, Wolfdale, Yorkfield + AVS_CPUF_SSE4_1 = 0x400, +//AVS_CPUF_AVX = 0x800, // Sandy Bridge, Bulldozer + AVS_CPUF_SSE4_2 = 0x1000, // Nehalem +//AVS_CPUF_AVX2 = 0x2000, // Haswell +//AVS_CPUF_AVX512 = 0x4000, // Knights Landing +}; + + +AVSC_API(const char *, avs_get_error)(AVS_ScriptEnvironment *); // return 0 if no error + +AVSC_API(int, avs_get_cpu_flags)(AVS_ScriptEnvironment *); +AVSC_API(int, avs_check_version)(AVS_ScriptEnvironment *, int version); + +AVSC_API(char *, avs_save_string)(AVS_ScriptEnvironment *, const char* s, int length); +AVSC_API(char *, avs_sprintf)(AVS_ScriptEnvironment *, const char * fmt, ...); + +AVSC_API(char *, avs_vsprintf)(AVS_ScriptEnvironment *, const char * fmt, void* val); + // note: val is really a va_list; I hope everyone typedefs va_list to a pointer + +AVSC_API(int, avs_add_function)(AVS_ScriptEnvironment *, + const char * name, const char * params, + AVS_ApplyFunc apply, void * user_data); + +AVSC_API(int, avs_function_exists)(AVS_ScriptEnvironment *, const char * name); + +AVSC_API(AVS_Value, avs_invoke)(AVS_ScriptEnvironment *, const char * name, + AVS_Value args, const char** arg_names); +// The returned value must be be released with avs_release_value + +AVSC_API(AVS_Value, avs_get_var)(AVS_ScriptEnvironment *, const char* name); +// The returned value must be be released with avs_release_value + +AVSC_API(int, avs_set_var)(AVS_ScriptEnvironment *, const char* name, AVS_Value val); + +AVSC_API(int, avs_set_global_var)(AVS_ScriptEnvironment *, const char* name, const AVS_Value val); + +//void avs_push_context(AVS_ScriptEnvironment *, int level=0); +//void avs_pop_context(AVS_ScriptEnvironment *); + +AVSC_API(AVS_VideoFrame *, avs_new_video_frame_a)(AVS_ScriptEnvironment *, + const AVS_VideoInfo * vi, int align); +// align should be at least 16 + +#ifndef AVSC_NO_DECLSPEC +AVSC_INLINE +AVS_VideoFrame * avs_new_video_frame(AVS_ScriptEnvironment * env, + const AVS_VideoInfo * vi) + {return avs_new_video_frame_a(env,vi,FRAME_ALIGN);} + +AVSC_INLINE +AVS_VideoFrame * avs_new_frame(AVS_ScriptEnvironment * env, + const AVS_VideoInfo * vi) + {return avs_new_video_frame_a(env,vi,FRAME_ALIGN);} +#endif + + +AVSC_API(int, avs_make_writable)(AVS_ScriptEnvironment *, AVS_VideoFrame * * pvf); + +AVSC_API(void, avs_bit_blt)(AVS_ScriptEnvironment *, BYTE* dstp, int dst_pitch, const BYTE* srcp, int src_pitch, int row_size, int height); + +typedef void (AVSC_CC *AVS_ShutdownFunc)(void* user_data, AVS_ScriptEnvironment * env); +AVSC_API(void, avs_at_exit)(AVS_ScriptEnvironment *, AVS_ShutdownFunc function, void * user_data); + +AVSC_API(AVS_VideoFrame *, avs_subframe)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height); +// The returned video frame must be be released + +AVSC_API(int, avs_set_memory_max)(AVS_ScriptEnvironment *, int mem); + +AVSC_API(int, avs_set_working_dir)(AVS_ScriptEnvironment *, const char * newdir); + +// avisynth.dll exports this; it's a way to use it as a library, without +// writing an AVS script or without going through AVIFile. +AVSC_API(AVS_ScriptEnvironment *, avs_create_script_environment)(int version); + +// this symbol is the entry point for the plugin and must +// be defined +AVSC_EXPORT +const char * AVSC_CC avisynth_c_plugin_init(AVS_ScriptEnvironment* env); + + +AVSC_API(void, avs_delete_script_environment)(AVS_ScriptEnvironment *); + + +AVSC_API(AVS_VideoFrame *, avs_subframe_planar)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV); +// The returned video frame must be be released + +#ifdef AVSC_NO_DECLSPEC +// use LoadLibrary and related functions to dynamically load Avisynth instead of declspec(dllimport) +/* + The following functions needs to have been declared, probably from windows.h + + void* malloc(size_t) + void free(void*); + + HMODULE LoadLibrary(const char*); + void* GetProcAddress(HMODULE, const char*); + FreeLibrary(HMODULE); +*/ + + +typedef struct AVS_Library AVS_Library; + +#define AVSC_DECLARE_FUNC(name) name##_func name + +struct AVS_Library { + HMODULE handle; + + AVSC_DECLARE_FUNC(avs_add_function); + AVSC_DECLARE_FUNC(avs_at_exit); + AVSC_DECLARE_FUNC(avs_bit_blt); + AVSC_DECLARE_FUNC(avs_check_version); + AVSC_DECLARE_FUNC(avs_clip_get_error); + AVSC_DECLARE_FUNC(avs_copy_clip); + AVSC_DECLARE_FUNC(avs_copy_value); + AVSC_DECLARE_FUNC(avs_copy_video_frame); + AVSC_DECLARE_FUNC(avs_create_script_environment); + AVSC_DECLARE_FUNC(avs_delete_script_environment); + AVSC_DECLARE_FUNC(avs_function_exists); + AVSC_DECLARE_FUNC(avs_get_audio); + AVSC_DECLARE_FUNC(avs_get_cpu_flags); + AVSC_DECLARE_FUNC(avs_get_frame); + AVSC_DECLARE_FUNC(avs_get_parity); + AVSC_DECLARE_FUNC(avs_get_var); + AVSC_DECLARE_FUNC(avs_get_version); + AVSC_DECLARE_FUNC(avs_get_video_info); + AVSC_DECLARE_FUNC(avs_invoke); + AVSC_DECLARE_FUNC(avs_make_writable); + AVSC_DECLARE_FUNC(avs_new_c_filter); + AVSC_DECLARE_FUNC(avs_new_video_frame_a); + AVSC_DECLARE_FUNC(avs_release_clip); + AVSC_DECLARE_FUNC(avs_release_value); + AVSC_DECLARE_FUNC(avs_release_video_frame); + AVSC_DECLARE_FUNC(avs_save_string); + AVSC_DECLARE_FUNC(avs_set_cache_hints); + AVSC_DECLARE_FUNC(avs_set_global_var); + AVSC_DECLARE_FUNC(avs_set_memory_max); + AVSC_DECLARE_FUNC(avs_set_to_clip); + AVSC_DECLARE_FUNC(avs_set_var); + AVSC_DECLARE_FUNC(avs_set_working_dir); + AVSC_DECLARE_FUNC(avs_sprintf); + AVSC_DECLARE_FUNC(avs_subframe); + AVSC_DECLARE_FUNC(avs_subframe_planar); + AVSC_DECLARE_FUNC(avs_take_clip); + AVSC_DECLARE_FUNC(avs_vsprintf); + + AVSC_DECLARE_FUNC(avs_get_error); + AVSC_DECLARE_FUNC(avs_is_yv24); + AVSC_DECLARE_FUNC(avs_is_yv16); + AVSC_DECLARE_FUNC(avs_is_yv12); + AVSC_DECLARE_FUNC(avs_is_yv411); + AVSC_DECLARE_FUNC(avs_is_y8); + AVSC_DECLARE_FUNC(avs_is_color_space); + + AVSC_DECLARE_FUNC(avs_get_plane_width_subsampling); + AVSC_DECLARE_FUNC(avs_get_plane_height_subsampling); + AVSC_DECLARE_FUNC(avs_bits_per_pixel); + AVSC_DECLARE_FUNC(avs_bytes_from_pixels); + AVSC_DECLARE_FUNC(avs_row_size); + AVSC_DECLARE_FUNC(avs_bmp_size); + AVSC_DECLARE_FUNC(avs_get_pitch_p); + AVSC_DECLARE_FUNC(avs_get_row_size_p); + AVSC_DECLARE_FUNC(avs_get_height_p); + AVSC_DECLARE_FUNC(avs_get_read_ptr_p); + AVSC_DECLARE_FUNC(avs_is_writable); + AVSC_DECLARE_FUNC(avs_get_write_ptr_p); +}; + +#undef AVSC_DECLARE_FUNC + + +AVSC_INLINE AVS_Library * avs_load_library() { + AVS_Library *library = (AVS_Library *)malloc(sizeof(AVS_Library)); + if (library == NULL) + return NULL; + library->handle = LoadLibrary("avisynth"); + if (library->handle == NULL) + goto fail; + +#define __AVSC_STRINGIFY(x) #x +#define AVSC_STRINGIFY(x) __AVSC_STRINGIFY(x) +#define AVSC_LOAD_FUNC(name) {\ + library->name = (name##_func) GetProcAddress(library->handle, AVSC_STRINGIFY(name));\ + if (library->name == NULL)\ + goto fail;\ +} + + AVSC_LOAD_FUNC(avs_add_function); + AVSC_LOAD_FUNC(avs_at_exit); + AVSC_LOAD_FUNC(avs_bit_blt); + AVSC_LOAD_FUNC(avs_check_version); + AVSC_LOAD_FUNC(avs_clip_get_error); + AVSC_LOAD_FUNC(avs_copy_clip); + AVSC_LOAD_FUNC(avs_copy_value); + AVSC_LOAD_FUNC(avs_copy_video_frame); + AVSC_LOAD_FUNC(avs_create_script_environment); + AVSC_LOAD_FUNC(avs_delete_script_environment); + AVSC_LOAD_FUNC(avs_function_exists); + AVSC_LOAD_FUNC(avs_get_audio); + AVSC_LOAD_FUNC(avs_get_cpu_flags); + AVSC_LOAD_FUNC(avs_get_frame); + AVSC_LOAD_FUNC(avs_get_parity); + AVSC_LOAD_FUNC(avs_get_var); + AVSC_LOAD_FUNC(avs_get_version); + AVSC_LOAD_FUNC(avs_get_video_info); + AVSC_LOAD_FUNC(avs_invoke); + AVSC_LOAD_FUNC(avs_make_writable); + AVSC_LOAD_FUNC(avs_new_c_filter); + AVSC_LOAD_FUNC(avs_new_video_frame_a); + AVSC_LOAD_FUNC(avs_release_clip); + AVSC_LOAD_FUNC(avs_release_value); + AVSC_LOAD_FUNC(avs_release_video_frame); + AVSC_LOAD_FUNC(avs_save_string); + AVSC_LOAD_FUNC(avs_set_cache_hints); + AVSC_LOAD_FUNC(avs_set_global_var); + AVSC_LOAD_FUNC(avs_set_memory_max); + AVSC_LOAD_FUNC(avs_set_to_clip); + AVSC_LOAD_FUNC(avs_set_var); + AVSC_LOAD_FUNC(avs_set_working_dir); + AVSC_LOAD_FUNC(avs_sprintf); + AVSC_LOAD_FUNC(avs_subframe); + AVSC_LOAD_FUNC(avs_subframe_planar); + AVSC_LOAD_FUNC(avs_take_clip); + AVSC_LOAD_FUNC(avs_vsprintf); + + AVSC_LOAD_FUNC(avs_get_error); + AVSC_LOAD_FUNC(avs_is_yv24); + AVSC_LOAD_FUNC(avs_is_yv16); + AVSC_LOAD_FUNC(avs_is_yv12); + AVSC_LOAD_FUNC(avs_is_yv411); + AVSC_LOAD_FUNC(avs_is_y8); + AVSC_LOAD_FUNC(avs_is_color_space); + + AVSC_LOAD_FUNC(avs_get_plane_width_subsampling); + AVSC_LOAD_FUNC(avs_get_plane_height_subsampling); + AVSC_LOAD_FUNC(avs_bits_per_pixel); + AVSC_LOAD_FUNC(avs_bytes_from_pixels); + AVSC_LOAD_FUNC(avs_row_size); + AVSC_LOAD_FUNC(avs_bmp_size); + AVSC_LOAD_FUNC(avs_get_pitch_p); + AVSC_LOAD_FUNC(avs_get_row_size_p); + AVSC_LOAD_FUNC(avs_get_height_p); + AVSC_LOAD_FUNC(avs_get_read_ptr_p); + AVSC_LOAD_FUNC(avs_is_writable); + AVSC_LOAD_FUNC(avs_get_write_ptr_p); + +#undef __AVSC_STRINGIFY +#undef AVSC_STRINGIFY +#undef AVSC_LOAD_FUNC + + return library; + +fail: + free(library); + return NULL; +} + +AVSC_INLINE void avs_free_library(AVS_Library *library) { + if (library == NULL) + return; + FreeLibrary(library->handle); + free(library); +} +#endif + +#endif
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/capi.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/capi.h new file mode 100644 index 0000000..6ed6770 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/capi.h
@@ -0,0 +1,62 @@ +// Avisynth C Interface Version 0.20 +// Copyright 2003 Kevin Atkinson + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit +// http://www.gnu.org/copyleft/gpl.html . +// +// As a special exception, I give you permission to link to the +// Avisynth C interface with independent modules that communicate with +// the Avisynth C interface solely through the interfaces defined in +// avisynth_c.h, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting combined work +// under terms of your choice, provided that every copy of the +// combined work is accompanied by a complete copy of the source code +// of the Avisynth C interface and Avisynth itself (with the version +// used to produce the combined work), being distributed under the +// terms of the GNU General Public License plus this exception. An +// independent module is a module which is not derived from or based +// on Avisynth C Interface, such as 3rd-party filters, import and +// export plugins, or graphical user interfaces. + +#ifndef AVS_CAPI_H +#define AVS_CAPI_H + +#ifdef __cplusplus +# define EXTERN_C extern "C" +#else +# define EXTERN_C +#endif + +#ifndef AVSC_USE_STDCALL +# define AVSC_CC __cdecl +#else +# define AVSC_CC __stdcall +#endif + +#define AVSC_INLINE static __inline + +#ifdef BUILDING_AVSCORE +# define AVSC_EXPORT EXTERN_C +# define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name +#else +# define AVSC_EXPORT EXTERN_C __declspec(dllexport) +# ifndef AVSC_NO_DECLSPEC +# define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name +# else +# define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func) +# endif +#endif + +#endif //AVS_CAPI_H
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/config.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/config.h new file mode 100644 index 0000000..7acd95b --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/config.h
@@ -0,0 +1,55 @@ +// Avisynth C Interface Version 0.20 +// Copyright 2003 Kevin Atkinson + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit +// http://www.gnu.org/copyleft/gpl.html . +// +// As a special exception, I give you permission to link to the +// Avisynth C interface with independent modules that communicate with +// the Avisynth C interface solely through the interfaces defined in +// avisynth_c.h, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting combined work +// under terms of your choice, provided that every copy of the +// combined work is accompanied by a complete copy of the source code +// of the Avisynth C interface and Avisynth itself (with the version +// used to produce the combined work), being distributed under the +// terms of the GNU General Public License plus this exception. An +// independent module is a module which is not derived from or based +// on Avisynth C Interface, such as 3rd-party filters, import and +// export plugins, or graphical user interfaces. + +#ifndef AVS_CONFIG_H +#define AVS_CONFIG_H + +// Undefine this to get cdecl calling convention +#define AVSC_USE_STDCALL 1 + +// NOTE TO PLUGIN AUTHORS: +// Because FRAME_ALIGN can be substantially higher than the alignment +// a plugin actually needs, plugins should not use FRAME_ALIGN to check for +// alignment. They should always request the exact alignment value they need. +// This is to make sure that plugins work over the widest range of AviSynth +// builds possible. +#define FRAME_ALIGN 32 + +#if defined(_M_AMD64) || defined(__x86_64) +# define X86_64 +#elif defined(_M_IX86) || defined(__i386__) +# define X86_32 +#else +# error Unsupported CPU architecture. +#endif + +#endif //AVS_CONFIG_H
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/types.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/types.h new file mode 100644 index 0000000..e5f084c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avs/types.h
@@ -0,0 +1,51 @@ +// Avisynth C Interface Version 0.20 +// Copyright 2003 Kevin Atkinson + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit +// http://www.gnu.org/copyleft/gpl.html . +// +// As a special exception, I give you permission to link to the +// Avisynth C interface with independent modules that communicate with +// the Avisynth C interface solely through the interfaces defined in +// avisynth_c.h, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting combined work +// under terms of your choice, provided that every copy of the +// combined work is accompanied by a complete copy of the source code +// of the Avisynth C interface and Avisynth itself (with the version +// used to produce the combined work), being distributed under the +// terms of the GNU General Public License plus this exception. An +// independent module is a module which is not derived from or based +// on Avisynth C Interface, such as 3rd-party filters, import and +// export plugins, or graphical user interfaces. + +#ifndef AVS_TYPES_H +#define AVS_TYPES_H + +// Define all types necessary for interfacing with avisynth.dll + +// Raster types used by VirtualDub & Avisynth +typedef unsigned int Pixel32; +typedef unsigned char BYTE; + +// Audio Sample information +typedef float SFLOAT; + +#ifdef __GNUC__ +typedef long long int INT64; +#else +typedef __int64 INT64; +#endif + +#endif //AVS_TYPES_H
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avxsynth_c.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avxsynth_c.h new file mode 100644 index 0000000..991f4be --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/avxsynth_c.h
@@ -0,0 +1,728 @@ +// Avisynth C Interface Version 0.20 +// Copyright 2003 Kevin Atkinson + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA, or visit +// http://www.gnu.org/copyleft/gpl.html . +// +// As a special exception, I give you permission to link to the +// Avisynth C interface with independent modules that communicate with +// the Avisynth C interface solely through the interfaces defined in +// avisynth_c.h, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting combined work +// under terms of your choice, provided that every copy of the +// combined work is accompanied by a complete copy of the source code +// of the Avisynth C interface and Avisynth itself (with the version +// used to produce the combined work), being distributed under the +// terms of the GNU General Public License plus this exception. An +// independent module is a module which is not derived from or based +// on Avisynth C Interface, such as 3rd-party filters, import and +// export plugins, or graphical user interfaces. + +#ifndef __AVXSYNTH_C__ +#define __AVXSYNTH_C__ + +#include "windowsPorts/windows2linux.h" +#include <stdarg.h> + +#ifdef __cplusplus +# define EXTERN_C extern "C" +#else +# define EXTERN_C +#endif + +#define AVSC_USE_STDCALL 1 + +#ifndef AVSC_USE_STDCALL +# define AVSC_CC __cdecl +#else +# define AVSC_CC __stdcall +#endif + +#define AVSC_INLINE static __inline + +#ifdef AVISYNTH_C_EXPORTS +# define AVSC_EXPORT EXTERN_C +# define AVSC_API(ret, name) EXTERN_C __declspec(dllexport) ret AVSC_CC name +#else +# define AVSC_EXPORT EXTERN_C __declspec(dllexport) +# ifndef AVSC_NO_DECLSPEC +# define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name +# else +# define AVSC_API(ret, name) typedef ret (AVSC_CC *name##_func) +# endif +#endif + +#ifdef __GNUC__ +typedef long long int INT64; +#else +typedef __int64 INT64; +#endif + + +///////////////////////////////////////////////////////////////////// +// +// Constants +// + +#ifndef __AVXSYNTH_H__ +enum { AVISYNTH_INTERFACE_VERSION = 3 }; +#endif + +enum {AVS_SAMPLE_INT8 = 1<<0, + AVS_SAMPLE_INT16 = 1<<1, + AVS_SAMPLE_INT24 = 1<<2, + AVS_SAMPLE_INT32 = 1<<3, + AVS_SAMPLE_FLOAT = 1<<4}; + +enum {AVS_PLANAR_Y=1<<0, + AVS_PLANAR_U=1<<1, + AVS_PLANAR_V=1<<2, + AVS_PLANAR_ALIGNED=1<<3, + AVS_PLANAR_Y_ALIGNED=AVS_PLANAR_Y|AVS_PLANAR_ALIGNED, + AVS_PLANAR_U_ALIGNED=AVS_PLANAR_U|AVS_PLANAR_ALIGNED, + AVS_PLANAR_V_ALIGNED=AVS_PLANAR_V|AVS_PLANAR_ALIGNED}; + + // Colorspace properties. +enum {AVS_CS_BGR = 1<<28, + AVS_CS_YUV = 1<<29, + AVS_CS_INTERLEAVED = 1<<30, + AVS_CS_PLANAR = 1<<31}; + + // Specific colorformats +enum { + AVS_CS_UNKNOWN = 0, + AVS_CS_BGR24 = 1<<0 | AVS_CS_BGR | AVS_CS_INTERLEAVED, + AVS_CS_BGR32 = 1<<1 | AVS_CS_BGR | AVS_CS_INTERLEAVED, + AVS_CS_YUY2 = 1<<2 | AVS_CS_YUV | AVS_CS_INTERLEAVED, + AVS_CS_YV12 = 1<<3 | AVS_CS_YUV | AVS_CS_PLANAR, // y-v-u, planar + AVS_CS_I420 = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR, // y-u-v, planar + AVS_CS_IYUV = 1<<4 | AVS_CS_YUV | AVS_CS_PLANAR // same as above +}; + +enum { + AVS_IT_BFF = 1<<0, + AVS_IT_TFF = 1<<1, + AVS_IT_FIELDBASED = 1<<2}; + +enum { + AVS_FILTER_TYPE=1, + AVS_FILTER_INPUT_COLORSPACE=2, + AVS_FILTER_OUTPUT_TYPE=9, + AVS_FILTER_NAME=4, + AVS_FILTER_AUTHOR=5, + AVS_FILTER_VERSION=6, + AVS_FILTER_ARGS=7, + AVS_FILTER_ARGS_INFO=8, + AVS_FILTER_ARGS_DESCRIPTION=10, + AVS_FILTER_DESCRIPTION=11}; + +enum { //SUBTYPES + AVS_FILTER_TYPE_AUDIO=1, + AVS_FILTER_TYPE_VIDEO=2, + AVS_FILTER_OUTPUT_TYPE_SAME=3, + AVS_FILTER_OUTPUT_TYPE_DIFFERENT=4}; + +enum { + AVS_CACHE_NOTHING=0, + AVS_CACHE_RANGE=1, + AVS_CACHE_ALL=2, + AVS_CACHE_AUDIO=3, + AVS_CACHE_AUDIO_NONE=4, + AVS_CACHE_AUDIO_AUTO=5 +}; + +#define AVS_FRAME_ALIGN 16 + +typedef struct AVS_Clip AVS_Clip; +typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment; + +///////////////////////////////////////////////////////////////////// +// +// AVS_VideoInfo +// + +// AVS_VideoInfo is layed out identicly to VideoInfo +typedef struct AVS_VideoInfo { + int width, height; // width=0 means no video + unsigned fps_numerator, fps_denominator; + int num_frames; + + int pixel_type; + + int audio_samples_per_second; // 0 means no audio + int sample_type; + INT64 num_audio_samples; + int nchannels; + + // Imagetype properties + + int image_type; +} AVS_VideoInfo; + +// useful functions of the above +AVSC_INLINE int avs_has_video(const AVS_VideoInfo * p) + { return (p->width!=0); } + +AVSC_INLINE int avs_has_audio(const AVS_VideoInfo * p) + { return (p->audio_samples_per_second!=0); } + +AVSC_INLINE int avs_is_rgb(const AVS_VideoInfo * p) + { return !!(p->pixel_type&AVS_CS_BGR); } + +AVSC_INLINE int avs_is_rgb24(const AVS_VideoInfo * p) + { return (p->pixel_type&AVS_CS_BGR24)==AVS_CS_BGR24; } // Clear out additional properties + +AVSC_INLINE int avs_is_rgb32(const AVS_VideoInfo * p) + { return (p->pixel_type & AVS_CS_BGR32) == AVS_CS_BGR32 ; } + +AVSC_INLINE int avs_is_yuv(const AVS_VideoInfo * p) + { return !!(p->pixel_type&AVS_CS_YUV ); } + +AVSC_INLINE int avs_is_yuy2(const AVS_VideoInfo * p) + { return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; } + +AVSC_INLINE int avs_is_yv12(const AVS_VideoInfo * p) + { return ((p->pixel_type & AVS_CS_YV12) == AVS_CS_YV12)||((p->pixel_type & AVS_CS_I420) == AVS_CS_I420); } + +AVSC_INLINE int avs_is_color_space(const AVS_VideoInfo * p, int c_space) + { return ((p->pixel_type & c_space) == c_space); } + +AVSC_INLINE int avs_is_property(const AVS_VideoInfo * p, int property) + { return ((p->pixel_type & property)==property ); } + +AVSC_INLINE int avs_is_planar(const AVS_VideoInfo * p) + { return !!(p->pixel_type & AVS_CS_PLANAR); } + +AVSC_INLINE int avs_is_field_based(const AVS_VideoInfo * p) + { return !!(p->image_type & AVS_IT_FIELDBASED); } + +AVSC_INLINE int avs_is_parity_known(const AVS_VideoInfo * p) + { return ((p->image_type & AVS_IT_FIELDBASED)&&(p->image_type & (AVS_IT_BFF | AVS_IT_TFF))); } + +AVSC_INLINE int avs_is_bff(const AVS_VideoInfo * p) + { return !!(p->image_type & AVS_IT_BFF); } + +AVSC_INLINE int avs_is_tff(const AVS_VideoInfo * p) + { return !!(p->image_type & AVS_IT_TFF); } + +AVSC_INLINE int avs_bits_per_pixel(const AVS_VideoInfo * p) +{ + switch (p->pixel_type) { + case AVS_CS_BGR24: return 24; + case AVS_CS_BGR32: return 32; + case AVS_CS_YUY2: return 16; + case AVS_CS_YV12: + case AVS_CS_I420: return 12; + default: return 0; + } +} +AVSC_INLINE int avs_bytes_from_pixels(const AVS_VideoInfo * p, int pixels) + { return pixels * (avs_bits_per_pixel(p)>>3); } // Will work on planar images, but will return only luma planes + +AVSC_INLINE int avs_row_size(const AVS_VideoInfo * p) + { return avs_bytes_from_pixels(p,p->width); } // Also only returns first plane on planar images + +AVSC_INLINE int avs_bmp_size(const AVS_VideoInfo * vi) + { if (avs_is_planar(vi)) {int p = vi->height * ((avs_row_size(vi)+3) & ~3); p+=p>>1; return p; } return vi->height * ((avs_row_size(vi)+3) & ~3); } + +AVSC_INLINE int avs_samples_per_second(const AVS_VideoInfo * p) + { return p->audio_samples_per_second; } + + +AVSC_INLINE int avs_bytes_per_channel_sample(const AVS_VideoInfo * p) +{ + switch (p->sample_type) { + case AVS_SAMPLE_INT8: return sizeof(signed char); + case AVS_SAMPLE_INT16: return sizeof(signed short); + case AVS_SAMPLE_INT24: return 3; + case AVS_SAMPLE_INT32: return sizeof(signed int); + case AVS_SAMPLE_FLOAT: return sizeof(float); + default: return 0; + } +} +AVSC_INLINE int avs_bytes_per_audio_sample(const AVS_VideoInfo * p) + { return p->nchannels*avs_bytes_per_channel_sample(p);} + +AVSC_INLINE INT64 avs_audio_samples_from_frames(const AVS_VideoInfo * p, INT64 frames) + { return ((INT64)(frames) * p->audio_samples_per_second * p->fps_denominator / p->fps_numerator); } + +AVSC_INLINE int avs_frames_from_audio_samples(const AVS_VideoInfo * p, INT64 samples) + { return (int)(samples * (INT64)p->fps_numerator / (INT64)p->fps_denominator / (INT64)p->audio_samples_per_second); } + +AVSC_INLINE INT64 avs_audio_samples_from_bytes(const AVS_VideoInfo * p, INT64 bytes) + { return bytes / avs_bytes_per_audio_sample(p); } + +AVSC_INLINE INT64 avs_bytes_from_audio_samples(const AVS_VideoInfo * p, INT64 samples) + { return samples * avs_bytes_per_audio_sample(p); } + +AVSC_INLINE int avs_audio_channels(const AVS_VideoInfo * p) + { return p->nchannels; } + +AVSC_INLINE int avs_sample_type(const AVS_VideoInfo * p) + { return p->sample_type;} + +// useful mutator +AVSC_INLINE void avs_set_property(AVS_VideoInfo * p, int property) + { p->image_type|=property; } + +AVSC_INLINE void avs_clear_property(AVS_VideoInfo * p, int property) + { p->image_type&=~property; } + +AVSC_INLINE void avs_set_field_based(AVS_VideoInfo * p, int isfieldbased) + { if (isfieldbased) p->image_type|=AVS_IT_FIELDBASED; else p->image_type&=~AVS_IT_FIELDBASED; } + +AVSC_INLINE void avs_set_fps(AVS_VideoInfo * p, unsigned numerator, unsigned denominator) +{ + unsigned x=numerator, y=denominator; + while (y) { // find gcd + unsigned t = x%y; x = y; y = t; + } + p->fps_numerator = numerator/x; + p->fps_denominator = denominator/x; +} + +AVSC_INLINE int avs_is_same_colorspace(AVS_VideoInfo * x, AVS_VideoInfo * y) +{ + return (x->pixel_type == y->pixel_type) + || (avs_is_yv12(x) && avs_is_yv12(y)); +} + +///////////////////////////////////////////////////////////////////// +// +// AVS_VideoFrame +// + +// VideoFrameBuffer holds information about a memory block which is used +// for video data. For efficiency, instances of this class are not deleted +// when the refcount reaches zero; instead they're stored in a linked list +// to be reused. The instances are deleted when the corresponding AVS +// file is closed. + +// AVS_VideoFrameBuffer is layed out identicly to VideoFrameBuffer +// DO NOT USE THIS STRUCTURE DIRECTLY +typedef struct AVS_VideoFrameBuffer { + unsigned char * data; + int data_size; + // sequence_number is incremented every time the buffer is changed, so + // that stale views can tell they're no longer valid. + long sequence_number; + + long refcount; +} AVS_VideoFrameBuffer; + +// VideoFrame holds a "window" into a VideoFrameBuffer. + +// AVS_VideoFrame is layed out identicly to IVideoFrame +// DO NOT USE THIS STRUCTURE DIRECTLY +typedef struct AVS_VideoFrame { + int refcount; + AVS_VideoFrameBuffer * vfb; + int offset, pitch, row_size, height, offsetU, offsetV, pitchUV; // U&V offsets are from top of picture. +} AVS_VideoFrame; + +// Access functions for AVS_VideoFrame +AVSC_INLINE int avs_get_pitch(const AVS_VideoFrame * p) { + return p->pitch;} + +AVSC_INLINE int avs_get_pitch_p(const AVS_VideoFrame * p, int plane) { + switch (plane) { + case AVS_PLANAR_U: case AVS_PLANAR_V: return p->pitchUV;} + return p->pitch;} + +AVSC_INLINE int avs_get_row_size(const AVS_VideoFrame * p) { + return p->row_size; } + +AVSC_INLINE int avs_get_row_size_p(const AVS_VideoFrame * p, int plane) { + int r; + switch (plane) { + case AVS_PLANAR_U: case AVS_PLANAR_V: + if (p->pitchUV) return p->row_size>>1; + else return 0; + case AVS_PLANAR_U_ALIGNED: case AVS_PLANAR_V_ALIGNED: + if (p->pitchUV) { + r = ((p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)) )>>1; // Aligned rowsize + if (r < p->pitchUV) + return r; + return p->row_size>>1; + } else return 0; + case AVS_PLANAR_Y_ALIGNED: + r = (p->row_size+AVS_FRAME_ALIGN-1)&(~(AVS_FRAME_ALIGN-1)); // Aligned rowsize + if (r <= p->pitch) + return r; + return p->row_size; + } + return p->row_size; +} + +AVSC_INLINE int avs_get_height(const AVS_VideoFrame * p) { + return p->height;} + +AVSC_INLINE int avs_get_height_p(const AVS_VideoFrame * p, int plane) { + switch (plane) { + case AVS_PLANAR_U: case AVS_PLANAR_V: + if (p->pitchUV) return p->height>>1; + return 0; + } + return p->height;} + +AVSC_INLINE const unsigned char* avs_get_read_ptr(const AVS_VideoFrame * p) { + return p->vfb->data + p->offset;} + +AVSC_INLINE const unsigned char* avs_get_read_ptr_p(const AVS_VideoFrame * p, int plane) +{ + switch (plane) { + case AVS_PLANAR_U: return p->vfb->data + p->offsetU; + case AVS_PLANAR_V: return p->vfb->data + p->offsetV; + default: return p->vfb->data + p->offset;} +} + +AVSC_INLINE int avs_is_writable(const AVS_VideoFrame * p) { + return (p->refcount == 1 && p->vfb->refcount == 1);} + +AVSC_INLINE unsigned char* avs_get_write_ptr(const AVS_VideoFrame * p) +{ + if (avs_is_writable(p)) { + ++p->vfb->sequence_number; + return p->vfb->data + p->offset; + } else + return 0; +} + +AVSC_INLINE unsigned char* avs_get_write_ptr_p(const AVS_VideoFrame * p, int plane) +{ + if (plane==AVS_PLANAR_Y && avs_is_writable(p)) { + ++p->vfb->sequence_number; + return p->vfb->data + p->offset; + } else if (plane==AVS_PLANAR_Y) { + return 0; + } else { + switch (plane) { + case AVS_PLANAR_U: return p->vfb->data + p->offsetU; + case AVS_PLANAR_V: return p->vfb->data + p->offsetV; + default: return p->vfb->data + p->offset; + } + } +} + +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(void, avs_release_video_frame)(AVS_VideoFrame *); +// makes a shallow copy of a video frame +AVSC_API(AVS_VideoFrame *, avs_copy_video_frame)(AVS_VideoFrame *); +#if defined __cplusplus +} +#endif // __cplusplus + +#ifndef AVSC_NO_DECLSPEC +AVSC_INLINE void avs_release_frame(AVS_VideoFrame * f) + {avs_release_video_frame(f);} +AVSC_INLINE AVS_VideoFrame * avs_copy_frame(AVS_VideoFrame * f) + {return avs_copy_video_frame(f);} +#endif + +///////////////////////////////////////////////////////////////////// +// +// AVS_Value +// + +// Treat AVS_Value as a fat pointer. That is use avs_copy_value +// and avs_release_value appropiaty as you would if AVS_Value was +// a pointer. + +// To maintain source code compatibility with future versions of the +// avisynth_c API don't use the AVS_Value directly. Use the helper +// functions below. + +// AVS_Value is layed out identicly to AVSValue +typedef struct AVS_Value AVS_Value; +struct AVS_Value { + short type; // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong + // for some function e'rror + short array_size; + union { + void * clip; // do not use directly, use avs_take_clip + char boolean; + int integer; + INT64 integer64; // match addition of __int64 to avxplugin.h + float floating_pt; + const char * string; + const AVS_Value * array; + } d; +}; + +// AVS_Value should be initilized with avs_void. +// Should also set to avs_void after the value is released +// with avs_copy_value. Consider it the equalvent of setting +// a pointer to NULL +static const AVS_Value avs_void = {'v'}; + +AVSC_API(void, avs_copy_value)(AVS_Value * dest, AVS_Value src); +AVSC_API(void, avs_release_value)(AVS_Value); + +AVSC_INLINE int avs_defined(AVS_Value v) { return v.type != 'v'; } +AVSC_INLINE int avs_is_clip(AVS_Value v) { return v.type == 'c'; } +AVSC_INLINE int avs_is_bool(AVS_Value v) { return v.type == 'b'; } +AVSC_INLINE int avs_is_int(AVS_Value v) { return v.type == 'i'; } +AVSC_INLINE int avs_is_float(AVS_Value v) { return v.type == 'f' || v.type == 'i'; } +AVSC_INLINE int avs_is_string(AVS_Value v) { return v.type == 's'; } +AVSC_INLINE int avs_is_array(AVS_Value v) { return v.type == 'a'; } +AVSC_INLINE int avs_is_error(AVS_Value v) { return v.type == 'e'; } + +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(AVS_Clip *, avs_take_clip)(AVS_Value, AVS_ScriptEnvironment *); +AVSC_API(void, avs_set_to_clip)(AVS_Value *, AVS_Clip *); +#if defined __cplusplus +} +#endif // __cplusplus + +AVSC_INLINE int avs_as_bool(AVS_Value v) + { return v.d.boolean; } +AVSC_INLINE int avs_as_int(AVS_Value v) + { return v.d.integer; } +AVSC_INLINE const char * avs_as_string(AVS_Value v) + { return avs_is_error(v) || avs_is_string(v) ? v.d.string : 0; } +AVSC_INLINE double avs_as_float(AVS_Value v) + { return avs_is_int(v) ? v.d.integer : v.d.floating_pt; } +AVSC_INLINE const char * avs_as_error(AVS_Value v) + { return avs_is_error(v) ? v.d.string : 0; } +AVSC_INLINE const AVS_Value * avs_as_array(AVS_Value v) + { return v.d.array; } +AVSC_INLINE int avs_array_size(AVS_Value v) + { return avs_is_array(v) ? v.array_size : 1; } +AVSC_INLINE AVS_Value avs_array_elt(AVS_Value v, int index) + { return avs_is_array(v) ? v.d.array[index] : v; } + +// only use these functions on am AVS_Value that does not already have +// an active value. Remember, treat AVS_Value as a fat pointer. +AVSC_INLINE AVS_Value avs_new_value_bool(int v0) + { AVS_Value v = {0}; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; } +AVSC_INLINE AVS_Value avs_new_value_int(int v0) + { AVS_Value v = {0}; v.type = 'i'; v.d.integer = v0; return v; } +AVSC_INLINE AVS_Value avs_new_value_string(const char * v0) + { AVS_Value v = {0}; v.type = 's'; v.d.string = v0; return v; } +AVSC_INLINE AVS_Value avs_new_value_float(float v0) + { AVS_Value v = {0}; v.type = 'f'; v.d.floating_pt = v0; return v;} +AVSC_INLINE AVS_Value avs_new_value_error(const char * v0) + { AVS_Value v = {0}; v.type = 'e'; v.d.string = v0; return v; } +#ifndef AVSC_NO_DECLSPEC +AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0) + { AVS_Value v = {0}; avs_set_to_clip(&v, v0); return v; } +#endif +AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size) + { AVS_Value v = {0}; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; } + +///////////////////////////////////////////////////////////////////// +// +// AVS_Clip +// +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(void, avs_release_clip)(AVS_Clip *); +AVSC_API(AVS_Clip *, avs_copy_clip)(AVS_Clip *); + +AVSC_API(const char *, avs_clip_get_error)(AVS_Clip *); // return 0 if no error + +AVSC_API(const AVS_VideoInfo *, avs_get_video_info)(AVS_Clip *); + +AVSC_API(int, avs_get_version)(AVS_Clip *); + +AVSC_API(AVS_VideoFrame *, avs_get_frame)(AVS_Clip *, int n); +// The returned video frame must be released with avs_release_video_frame + +AVSC_API(int, avs_get_parity)(AVS_Clip *, int n); +// return field parity if field_based, else parity of first field in frame + +AVSC_API(int, avs_get_audio)(AVS_Clip *, void * buf, + INT64 start, INT64 count); +// start and count are in samples + +AVSC_API(int, avs_set_cache_hints)(AVS_Clip *, + int cachehints, size_t frame_range); +#if defined __cplusplus +} +#endif // __cplusplus + +// This is the callback type used by avs_add_function +typedef AVS_Value (AVSC_CC * AVS_ApplyFunc) + (AVS_ScriptEnvironment *, AVS_Value args, void * user_data); + +typedef struct AVS_FilterInfo AVS_FilterInfo; +struct AVS_FilterInfo +{ + // these members should not be modified outside of the AVS_ApplyFunc callback + AVS_Clip * child; + AVS_VideoInfo vi; + AVS_ScriptEnvironment * env; + AVS_VideoFrame * (AVSC_CC * get_frame)(AVS_FilterInfo *, int n); + int (AVSC_CC * get_parity)(AVS_FilterInfo *, int n); + int (AVSC_CC * get_audio)(AVS_FilterInfo *, void * buf, + INT64 start, INT64 count); + int (AVSC_CC * set_cache_hints)(AVS_FilterInfo *, int cachehints, + int frame_range); + void (AVSC_CC * free_filter)(AVS_FilterInfo *); + + // Should be set when ever there is an error to report. + // It is cleared before any of the above methods are called + const char * error; + // this is to store whatever and may be modified at will + void * user_data; +}; + +// Create a new filter +// fi is set to point to the AVS_FilterInfo so that you can +// modify it once it is initilized. +// store_child should generally be set to true. If it is not +// set than ALL methods (the function pointers) must be defined +// If it is set than you do not need to worry about freeing the child +// clip. +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(AVS_Clip *, avs_new_c_filter)(AVS_ScriptEnvironment * e, + AVS_FilterInfo * * fi, + AVS_Value child, int store_child); +#if defined __cplusplus +} +#endif // __cplusplus + + +///////////////////////////////////////////////////////////////////// +// +// AVS_ScriptEnvironment +// + +// For GetCPUFlags. These are backwards-compatible with those in VirtualDub. +enum { + /* slowest CPU to support extension */ + AVS_CPU_FORCE = 0x01, // N/A + AVS_CPU_FPU = 0x02, // 386/486DX + AVS_CPU_MMX = 0x04, // P55C, K6, PII + AVS_CPU_INTEGER_SSE = 0x08, // PIII, Athlon + AVS_CPU_SSE = 0x10, // PIII, Athlon XP/MP + AVS_CPU_SSE2 = 0x20, // PIV, Hammer + AVS_CPU_3DNOW = 0x40, // K6-2 + AVS_CPU_3DNOW_EXT = 0x80, // Athlon + AVS_CPU_X86_64 = 0xA0, // Hammer (note: equiv. to 3DNow + SSE2, + // which only Hammer will have anyway) +}; + +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(const char *, avs_get_error)(AVS_ScriptEnvironment *); // return 0 if no error + +AVSC_API(long, avs_get_cpu_flags)(AVS_ScriptEnvironment *); +AVSC_API(int, avs_check_version)(AVS_ScriptEnvironment *, int version); + +AVSC_API(char *, avs_save_string)(AVS_ScriptEnvironment *, const char* s, int length); +AVSC_API(char *, avs_sprintf)(AVS_ScriptEnvironment *, const char * fmt, ...); + +AVSC_API(char *, avs_vsprintf)(AVS_ScriptEnvironment *, const char * fmt, va_list val); + // note: val is really a va_list; I hope everyone typedefs va_list to a pointer + +AVSC_API(int, avs_add_function)(AVS_ScriptEnvironment *, + const char * name, const char * params, + AVS_ApplyFunc apply, void * user_data); + +AVSC_API(int, avs_function_exists)(AVS_ScriptEnvironment *, const char * name); + +AVSC_API(AVS_Value, avs_invoke)(AVS_ScriptEnvironment *, const char * name, + AVS_Value args, const char** arg_names); +// The returned value must be be released with avs_release_value + +AVSC_API(AVS_Value, avs_get_var)(AVS_ScriptEnvironment *, const char* name); +// The returned value must be be released with avs_release_value + +AVSC_API(int, avs_set_var)(AVS_ScriptEnvironment *, const char* name, AVS_Value val); + +AVSC_API(int, avs_set_global_var)(AVS_ScriptEnvironment *, const char* name, const AVS_Value val); + +//void avs_push_context(AVS_ScriptEnvironment *, int level=0); +//void avs_pop_context(AVS_ScriptEnvironment *); + +AVSC_API(AVS_VideoFrame *, avs_new_video_frame_a)(AVS_ScriptEnvironment *, + const AVS_VideoInfo * vi, int align); +// align should be at least 16 +#if defined __cplusplus +} +#endif // __cplusplus + +#ifndef AVSC_NO_DECLSPEC +AVSC_INLINE +AVS_VideoFrame * avs_new_video_frame(AVS_ScriptEnvironment * env, + const AVS_VideoInfo * vi) + {return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);} + +AVSC_INLINE +AVS_VideoFrame * avs_new_frame(AVS_ScriptEnvironment * env, + const AVS_VideoInfo * vi) + {return avs_new_video_frame_a(env,vi,AVS_FRAME_ALIGN);} +#endif + +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(int, avs_make_writable)(AVS_ScriptEnvironment *, AVS_VideoFrame * * pvf); + +AVSC_API(void, avs_bit_blt)(AVS_ScriptEnvironment *, unsigned char* dstp, int dst_pitch, const unsigned char* srcp, int src_pitch, int row_size, int height); + +typedef void (AVSC_CC *AVS_ShutdownFunc)(void* user_data, AVS_ScriptEnvironment * env); +AVSC_API(void, avs_at_exit)(AVS_ScriptEnvironment *, AVS_ShutdownFunc function, void * user_data); + +AVSC_API(AVS_VideoFrame *, avs_subframe)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height); +// The returned video frame must be be released + +AVSC_API(int, avs_set_memory_max)(AVS_ScriptEnvironment *, int mem); + +AVSC_API(int, avs_set_working_dir)(AVS_ScriptEnvironment *, const char * newdir); + +// avisynth.dll exports this; it's a way to use it as a library, without +// writing an AVS script or without going through AVIFile. +AVSC_API(AVS_ScriptEnvironment *, avs_create_script_environment)(int version); +#if defined __cplusplus +} +#endif // __cplusplus + +// this symbol is the entry point for the plugin and must +// be defined +AVSC_EXPORT +const char * AVSC_CC avisynth_c_plugin_init(AVS_ScriptEnvironment* env); + + +#if defined __cplusplus +extern "C" +{ +#endif // __cplusplus +AVSC_API(void, avs_delete_script_environment)(AVS_ScriptEnvironment *); + + +AVSC_API(AVS_VideoFrame *, avs_subframe_planar)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV); +// The returned video frame must be be released +#if defined __cplusplus +} +#endif // __cplusplus + +#endif //__AVXSYNTH_C__
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/windowsPorts/basicDataTypeConversions.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/windowsPorts/basicDataTypeConversions.h new file mode 100644 index 0000000..ff367d5 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/windowsPorts/basicDataTypeConversions.h
@@ -0,0 +1,85 @@ +#ifndef __DATA_TYPE_CONVERSIONS_H__ +#define __DATA_TYPE_CONVERSIONS_H__ + +#include <stdint.h> +#include <wchar.h> + +#ifdef __cplusplus +namespace avxsynth { +#endif // __cplusplus + +typedef int64_t __int64; +typedef int32_t __int32; +#ifdef __cplusplus +typedef bool BOOL; +#else +typedef uint32_t BOOL; +#endif // __cplusplus +typedef void* HMODULE; +typedef void* LPVOID; +typedef void* PVOID; +typedef PVOID HANDLE; +typedef HANDLE HWND; +typedef HANDLE HINSTANCE; +typedef void* HDC; +typedef void* HBITMAP; +typedef void* HICON; +typedef void* HFONT; +typedef void* HGDIOBJ; +typedef void* HBRUSH; +typedef void* HMMIO; +typedef void* HACMSTREAM; +typedef void* HACMDRIVER; +typedef void* HIC; +typedef void* HACMOBJ; +typedef HACMSTREAM* LPHACMSTREAM; +typedef void* HACMDRIVERID; +typedef void* LPHACMDRIVER; +typedef unsigned char BYTE; +typedef BYTE* LPBYTE; +typedef char TCHAR; +typedef TCHAR* LPTSTR; +typedef const TCHAR* LPCTSTR; +typedef char* LPSTR; +typedef LPSTR LPOLESTR; +typedef const char* LPCSTR; +typedef LPCSTR LPCOLESTR; +typedef wchar_t WCHAR; +typedef unsigned short WORD; +typedef unsigned int UINT; +typedef UINT MMRESULT; +typedef uint32_t DWORD; +typedef DWORD COLORREF; +typedef DWORD FOURCC; +typedef DWORD HRESULT; +typedef DWORD* LPDWORD; +typedef DWORD* DWORD_PTR; +typedef int32_t LONG; +typedef int32_t* LONG_PTR; +typedef LONG_PTR LRESULT; +typedef uint32_t ULONG; +typedef uint32_t* ULONG_PTR; +//typedef __int64_t intptr_t; +typedef uint64_t _fsize_t; + + +// +// Structures +// + +typedef struct _GUID { + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[8]; +} GUID; + +typedef GUID REFIID; +typedef GUID CLSID; +typedef CLSID* LPCLSID; +typedef GUID IID; + +#ifdef __cplusplus +}; // namespace avxsynth +#endif // __cplusplus +#endif // __DATA_TYPE_CONVERSIONS_H__
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/windowsPorts/windows2linux.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/windowsPorts/windows2linux.h new file mode 100644 index 0000000..7cf4600 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/avisynth/windowsPorts/windows2linux.h
@@ -0,0 +1,77 @@ +#ifndef __WINDOWS2LINUX_H__ +#define __WINDOWS2LINUX_H__ + +/* + * LINUX SPECIFIC DEFINITIONS +*/ +// +// Data types conversions +// +#include <stdlib.h> +#include <string.h> +#include "basicDataTypeConversions.h" + +#ifdef __cplusplus +namespace avxsynth { +#endif // __cplusplus +// +// purposefully define the following MSFT definitions +// to mean nothing (as they do not mean anything on Linux) +// +#define __stdcall +#define __cdecl +#define noreturn +#define __declspec(x) +#define STDAPI extern "C" HRESULT +#define STDMETHODIMP HRESULT __stdcall +#define STDMETHODIMP_(x) x __stdcall + +#define STDMETHOD(x) virtual HRESULT x +#define STDMETHOD_(a, x) virtual a x + +#ifndef TRUE +#define TRUE true +#endif + +#ifndef FALSE +#define FALSE false +#endif + +#define S_OK (0x00000000) +#define S_FALSE (0x00000001) +#define E_NOINTERFACE (0X80004002) +#define E_POINTER (0x80004003) +#define E_FAIL (0x80004005) +#define E_OUTOFMEMORY (0x8007000E) + +#define INVALID_HANDLE_VALUE ((HANDLE)((LONG_PTR)-1)) +#define FAILED(hr) ((hr) & 0x80000000) +#define SUCCEEDED(hr) (!FAILED(hr)) + + +// +// Functions +// +#define MAKEDWORD(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) +#define MAKEWORD(a,b) (((a) << 8) | (b)) + +#define lstrlen strlen +#define lstrcpy strcpy +#define lstrcmpi strcasecmp +#define _stricmp strcasecmp +#define InterlockedIncrement(x) __sync_fetch_and_add((x), 1) +#define InterlockedDecrement(x) __sync_fetch_and_sub((x), 1) +// Windows uses (new, old) ordering but GCC has (old, new) +#define InterlockedCompareExchange(x,y,z) __sync_val_compare_and_swap(x,z,y) + +#define UInt32x32To64(a, b) ( (uint64_t) ( ((uint64_t)((uint32_t)(a))) * ((uint32_t)(b)) ) ) +#define Int64ShrlMod32(a, b) ( (uint64_t) ( (uint64_t)(a) >> (b) ) ) +#define Int32x32To64(a, b) ((__int64)(((__int64)((long)(a))) * ((long)(b)))) + +#define MulDiv(nNumber, nNumerator, nDenominator) (int32_t) (((int64_t) (nNumber) * (int64_t) (nNumerator) + (int64_t) ((nDenominator)/2)) / (int64_t) (nDenominator)) + +#ifdef __cplusplus +}; // namespace avxsynth +#endif // __cplusplus + +#endif // __WINDOWS2LINUX_H__
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/float/float.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/float/float.h new file mode 100644 index 0000000..1f0d3ab --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/float/float.h
@@ -0,0 +1,35 @@ +/* + * Work around broken floating point limits on some systems. + * + * 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 + */ + +#include_next <float.h> + +#ifdef FLT_MAX +#undef FLT_MAX +#define FLT_MAX 3.40282346638528859812e+38F + +#undef FLT_MIN +#define FLT_MIN 1.17549435082228750797e-38F + +#undef DBL_MAX +#define DBL_MAX ((double)1.79769313486231570815e+308L) + +#undef DBL_MIN +#define DBL_MIN ((double)2.22507385850720138309e-308L) +#endif
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/float/limits.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/float/limits.h new file mode 100644 index 0000000..7ea374a --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/float/limits.h
@@ -0,0 +1,22 @@ +/* + * Work around broken floating point limits on some systems. + * + * 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 + */ + +#include_next <limits.h> +#include <float.h>
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/getopt.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/getopt.c new file mode 100644 index 0000000..41a641f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/getopt.c
@@ -0,0 +1,84 @@ +/* + * 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 + */ + +/* + * This file was copied from the following newsgroup posting: + * + * Newsgroups: mod.std.unix + * Subject: public domain AT&T getopt source + * Date: 3 Nov 85 19:34:15 GMT + * + * Here's something you've all been waiting for: the AT&T public domain + * source for getopt(3). It is the code which was given out at the 1985 + * UNIFORUM conference in Dallas. I obtained it by electronic mail + * directly from AT&T. The people there assure me that it is indeed + * in the public domain. + */ + +#include <stdio.h> +#include <string.h> + +static int opterr = 1; +static int optind = 1; +static int optopt; +static char *optarg; + +static int getopt(int argc, char *argv[], char *opts) +{ + static int sp = 1; + int c; + char *cp; + + if (sp == 1) { + if (optind >= argc || + argv[optind][0] != '-' || argv[optind][1] == '\0') + return EOF; + else if (!strcmp(argv[optind], "--")) { + optind++; + return EOF; + } + } + optopt = c = argv[optind][sp]; + if (c == ':' || !(cp = strchr(opts, c))) { + fprintf(stderr, ": illegal option -- %c\n", c); + if (argv[optind][++sp] == '\0') { + optind++; + sp = 1; + } + return '?'; + } + if (*++cp == ':') { + if (argv[optind][sp+1] != '\0') + optarg = &argv[optind++][sp+1]; + else if(++optind >= argc) { + fprintf(stderr, ": option requires an argument -- %c\n", c); + sp = 1; + return '?'; + } else + optarg = argv[optind++]; + sp = 1; + } else { + if (argv[optind][++sp] == '\0') { + sp = 1; + optind++; + } + optarg = NULL; + } + + return c; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/msvcrt/snprintf.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/msvcrt/snprintf.c new file mode 100644 index 0000000..c64653f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/msvcrt/snprintf.c
@@ -0,0 +1,71 @@ +/* + * C99-compatible snprintf() and vsnprintf() implementations + * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com> + * + * 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 + */ + +#include <stdio.h> +#include <stdarg.h> +#include <limits.h> +#include <string.h> + +#include "compat/va_copy.h" +#include "libavutil/error.h" + +#if defined(__MINGW32__) +#define EOVERFLOW EFBIG +#endif + +int avpriv_snprintf(char *s, size_t n, const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = avpriv_vsnprintf(s, n, fmt, ap); + va_end(ap); + + return ret; +} + +int avpriv_vsnprintf(char *s, size_t n, const char *fmt, + va_list ap) +{ + int ret; + va_list ap_copy; + + if (n == 0) + return _vscprintf(fmt, ap); + else if (n > INT_MAX) + return AVERROR(EOVERFLOW); + + /* we use n - 1 here because if the buffer is not big enough, the MS + * runtime libraries don't add a terminating zero at the end. MSDN + * recommends to provide _snprintf/_vsnprintf() a buffer size that + * is one less than the actual buffer, and zero it before calling + * _snprintf/_vsnprintf() to workaround this problem. + * See http://msdn.microsoft.com/en-us/library/1kt27hek(v=vs.80).aspx */ + memset(s, 0, n); + va_copy(ap_copy, ap); + ret = _vsnprintf(s, n - 1, fmt, ap_copy); + va_end(ap_copy); + if (ret == -1) + ret = _vscprintf(fmt, ap); + + return ret; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/msvcrt/snprintf.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/msvcrt/snprintf.h new file mode 100644 index 0000000..cd47953 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/msvcrt/snprintf.h
@@ -0,0 +1,38 @@ +/* + * C99-compatible snprintf() and vsnprintf() implementations + * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com> + * + * 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 + */ + +#ifndef COMPAT_MSVCRT_SNPRINTF_H +#define COMPAT_MSVCRT_SNPRINTF_H + +#include <stdarg.h> +#include <stdio.h> + +int avpriv_snprintf(char *s, size_t n, const char *fmt, ...); +int avpriv_vsnprintf(char *s, size_t n, const char *fmt, va_list ap); + +#undef snprintf +#undef _snprintf +#undef vsnprintf +#define snprintf avpriv_snprintf +#define _snprintf avpriv_snprintf +#define vsnprintf avpriv_vsnprintf + +#endif /* COMPAT_MSVCRT_SNPRINTF_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/os2threads.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/os2threads.h new file mode 100644 index 0000000..40a119f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/os2threads.h
@@ -0,0 +1,201 @@ +/* + * Copyright (c) 2011 KO Myung-Hun <komh@chollian.net> + * + * 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 + * os2threads to pthreads wrapper + */ + +#ifndef COMPAT_OS2THREADS_H +#define COMPAT_OS2THREADS_H + +#define INCL_DOS +#include <os2.h> + +#undef __STRICT_ANSI__ /* for _beginthread() */ +#include <stdlib.h> + +#include <sys/builtin.h> +#include <sys/fmutex.h> + +#include "libavutil/attributes.h" + +typedef struct { + TID tid; + void *(*start_routine)(void *); + void *arg; + void *result; +} pthread_t; + +typedef void pthread_attr_t; + +typedef HMTX pthread_mutex_t; +typedef void pthread_mutexattr_t; + +typedef struct { + HEV event_sem; + HEV ack_sem; + volatile unsigned wait_count; +} pthread_cond_t; + +typedef void pthread_condattr_t; + +typedef struct { + volatile int done; + _fmutex mtx; +} pthread_once_t; + +#define PTHREAD_ONCE_INIT {0, _FMUTEX_INITIALIZER} + +static void thread_entry(void *arg) +{ + pthread_t *thread = arg; + + thread->result = thread->start_routine(thread->arg); +} + +static av_always_inline int pthread_create(pthread_t *thread, + const pthread_attr_t *attr, + void *(*start_routine)(void*), + void *arg) +{ + thread->start_routine = start_routine; + thread->arg = arg; + thread->result = NULL; + + thread->tid = _beginthread(thread_entry, NULL, 1024 * 1024, thread); + + return 0; +} + +static av_always_inline int pthread_join(pthread_t thread, void **value_ptr) +{ + DosWaitThread(&thread.tid, DCWW_WAIT); + + if (value_ptr) + *value_ptr = thread.result; + + return 0; +} + +static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, + const pthread_mutexattr_t *attr) +{ + DosCreateMutexSem(NULL, (PHMTX)mutex, 0, FALSE); + + return 0; +} + +static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex) +{ + DosCloseMutexSem(*(PHMTX)mutex); + + return 0; +} + +static av_always_inline int pthread_mutex_lock(pthread_mutex_t *mutex) +{ + DosRequestMutexSem(*(PHMTX)mutex, SEM_INDEFINITE_WAIT); + + return 0; +} + +static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + DosReleaseMutexSem(*(PHMTX)mutex); + + return 0; +} + +static av_always_inline int pthread_cond_init(pthread_cond_t *cond, + const pthread_condattr_t *attr) +{ + DosCreateEventSem(NULL, &cond->event_sem, DCE_POSTONE, FALSE); + DosCreateEventSem(NULL, &cond->ack_sem, DCE_POSTONE, FALSE); + + cond->wait_count = 0; + + return 0; +} + +static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond) +{ + DosCloseEventSem(cond->event_sem); + DosCloseEventSem(cond->ack_sem); + + return 0; +} + +static av_always_inline int pthread_cond_signal(pthread_cond_t *cond) +{ + if (!__atomic_cmpxchg32(&cond->wait_count, 0, 0)) { + DosPostEventSem(cond->event_sem); + DosWaitEventSem(cond->ack_sem, SEM_INDEFINITE_WAIT); + } + + return 0; +} + +static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond) +{ + while (!__atomic_cmpxchg32(&cond->wait_count, 0, 0)) + pthread_cond_signal(cond); + + return 0; +} + +static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, + pthread_mutex_t *mutex) +{ + __atomic_increment(&cond->wait_count); + + pthread_mutex_unlock(mutex); + + DosWaitEventSem(cond->event_sem, SEM_INDEFINITE_WAIT); + + __atomic_decrement(&cond->wait_count); + + DosPostEventSem(cond->ack_sem); + + pthread_mutex_lock(mutex); + + return 0; +} + +static av_always_inline int pthread_once(pthread_once_t *once_control, + void (*init_routine)(void)) +{ + if (!once_control->done) + { + _fmutex_request(&once_control->mtx, 0); + + if (!once_control->done) + { + init_routine(); + + once_control->done = 1; + } + + _fmutex_release(&once_control->mtx); + } + + return 0; +} +#endif /* COMPAT_OS2THREADS_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/head b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/head new file mode 100755 index 0000000..2840b2d --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/head
@@ -0,0 +1,10 @@ +#!/bin/sh + +n=10 + +case "$1" in + -n) n=$2; shift 2 ;; + -n*) n=${1#-n}; shift ;; +esac + +exec sed ${n}q "$@"
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/main.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/main.c new file mode 100644 index 0000000..d46f96d --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/main.c
@@ -0,0 +1,34 @@ +/* + * 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 + */ + +int plan9_main(int argc, char **argv); + +#undef main +int main(int argc, char **argv) +{ + /* The setfcr() function in lib9 is broken, must use asm. */ +#ifdef __i386 + short fcr; + __asm__ volatile ("fstcw %0 \n" + "or $63, %0 \n" + "fldcw %0 \n" + : "=m"(fcr)); +#endif + + return plan9_main(argc, argv); +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/printf b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/printf new file mode 100755 index 0000000..1a70a9e --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/plan9/printf
@@ -0,0 +1,2 @@ +#!/bin/sh +exec awk "BEGIN { for (i = 2; i < ARGC; i++) printf \"$1\", ARGV[i] }" "$@"
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/solaris/make_sunver.pl b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/solaris/make_sunver.pl new file mode 100755 index 0000000..0e9ed1d --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/solaris/make_sunver.pl
@@ -0,0 +1,352 @@ +#!/usr/bin/env perl + +# make_sunver.pl +# +# Copyright (C) 2010, 2011, 2012, 2013 +# Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING.GPLv3. If not see +# <http://www.gnu.org/licenses/>. + +# This script takes at least two arguments, a GNU style version script and +# a list of object and archive files, and generates a corresponding Sun +# style version script as follows: +# +# Each glob pattern, C++ mangled pattern or literal in the input script is +# matched against all global symbols in the input objects, emitting those +# that matched (or nothing if no match was found). +# A comment with the original pattern and its type is left in the output +# file to make it easy to understand the matches. +# +# It uses elfdump when present (native), GNU readelf otherwise. +# It depends on the GNU version of c++filt, since it must understand the +# GNU mangling style. + +use FileHandle; +use IPC::Open2; + +# Enforce C locale. +$ENV{'LC_ALL'} = "C"; +$ENV{'LANG'} = "C"; + +# Input version script, GNU style. +my $symvers = shift; + +########## +# Get all the symbols from the library, match them, and add them to a hash. + +my %sym_hash = (); + +# List of objects and archives to process. +my @OBJECTS = (); + +# List of shared objects to omit from processing. +my @SHAREDOBJS = (); + +# Filter out those input archives that have corresponding shared objects to +# avoid adding all symbols matched in the archive to the output map. +foreach $file (@ARGV) { + if (($so = $file) =~ s/\.a$/.so/ && -e $so) { + printf STDERR "omitted $file -> $so\n"; + push (@SHAREDOBJS, $so); + } else { + push (@OBJECTS, $file); + } +} + +# We need to detect and ignore hidden symbols. Solaris nm can only detect +# this in the harder to parse default output format, and GNU nm not at all, +# so use elfdump -s in the native case and GNU readelf -s otherwise. +# GNU objdump -t cannot be used since it produces a variable number of +# columns. + +# The path to elfdump. +my $elfdump = "/usr/ccs/bin/elfdump"; + +if (-f $elfdump) { + open ELFDUMP,$elfdump.' -s '.(join ' ',@OBJECTS).'|' or die $!; + my $skip_arsym = 0; + + while (<ELFDUMP>) { + chomp; + + # Ignore empty lines. + if (/^$/) { + # End of archive symbol table, stop skipping. + $skip_arsym = 0 if $skip_arsym; + next; + } + + # Keep skipping until end of archive symbol table. + next if ($skip_arsym); + + # Ignore object name header for individual objects and archives. + next if (/:$/); + + # Ignore table header lines. + next if (/^Symbol Table Section:/); + next if (/index.*value.*size/); + + # Start of archive symbol table: start skipping. + if (/^Symbol Table: \(archive/) { + $skip_arsym = 1; + next; + } + + # Split table. + (undef, undef, undef, undef, $bind, $oth, undef, $shndx, $name) = split; + + # Error out for unknown input. + die "unknown input line:\n$_" unless defined($bind); + + # Ignore local symbols. + next if ($bind eq "LOCL"); + # Ignore hidden symbols. + next if ($oth eq "H"); + # Ignore undefined symbols. + next if ($shndx eq "UNDEF"); + # Error out for unhandled cases. + if ($bind !~ /^(GLOB|WEAK)/ or $oth ne "D") { + die "unhandled symbol:\n$_"; + } + + # Remember symbol. + $sym_hash{$name}++; + } + close ELFDUMP or die "$elfdump error"; +} else { + open READELF, 'readelf -s -W '.(join ' ',@OBJECTS).'|' or die $!; + # Process each symbol. + while (<READELF>) { + chomp; + + # Ignore empty lines. + next if (/^$/); + + # Ignore object name header. + next if (/^File: .*$/); + + # Ignore table header lines. + next if (/^Symbol table.*contains.*:/); + next if (/Num:.*Value.*Size/); + + # Split table. + (undef, undef, undef, undef, $bind, $vis, $ndx, $name) = split; + + # Error out for unknown input. + die "unknown input line:\n$_" unless defined($bind); + + # Ignore local symbols. + next if ($bind eq "LOCAL"); + # Ignore hidden symbols. + next if ($vis eq "HIDDEN"); + # Ignore undefined symbols. + next if ($ndx eq "UND"); + # Error out for unhandled cases. + if ($bind !~ /^(GLOBAL|WEAK)/ or $vis ne "DEFAULT") { + die "unhandled symbol:\n$_"; + } + + # Remember symbol. + $sym_hash{$name}++; + } + close READELF or die "readelf error"; +} + +########## +# The various types of glob patterns. +# +# A glob pattern that is to be applied to the demangled name: 'cxx'. +# A glob patterns that applies directly to the name in the .o files: 'glob'. +# This pattern is ignored; used for local variables (usually just '*'): 'ign'. + +# The type of the current pattern. +my $glob = 'glob'; + +# We're currently inside `extern "C++"', which Sun ld doesn't understand. +my $in_extern = 0; + +# The c++filt command to use. This *must* be GNU c++filt; the Sun Studio +# c++filt doesn't handle the GNU mangling style. +my $cxxfilt = $ENV{'CXXFILT'} || "c++filt"; + +# The current version name. +my $current_version = ""; + +# Was there any attempt to match a symbol to this version? +my $matches_attempted; + +# The number of versions which matched this symbol. +my $matched_symbols; + +open F,$symvers or die $!; + +# Print information about generating this file +print "# This file was generated by make_sunver.pl. DO NOT EDIT!\n"; +print "# It was generated by:\n"; +printf "# %s %s %s\n", $0, $symvers, (join ' ',@ARGV); +printf "# Omitted archives with corresponding shared libraries: %s\n", + (join ' ', @SHAREDOBJS) if $#SHAREDOBJS >= 0; +print "#\n\n"; + +print "\$mapfile_version 2\n"; + +while (<F>) { + # Lines of the form '};' + if (/^([ \t]*)(\}[ \t]*;[ \t]*)$/) { + $glob = 'glob'; + if ($in_extern) { + $in_extern--; + print "$1##$2\n"; + } else { + print; + } + next; + } + + # Lines of the form '} SOME_VERSION_NAME_1.0;' + if (/^[ \t]*\}[ \tA-Z0-9_.a-z]+;[ \t]*$/) { + $glob = 'glob'; + # We tried to match symbols agains this version, but none matched. + # Emit dummy hidden symbol to avoid marking this version WEAK. + if ($matches_attempted && $matched_symbols == 0) { + print " hidden:\n"; + print " .force_WEAK_off_$current_version = DATA S0x0 V0x0;\n"; + } + print; next; + } + + # Comment and blank lines + if (/^[ \t]*\#/) { print; next; } + if (/^[ \t]*$/) { print; next; } + + # Lines of the form '{' + if (/^([ \t]*){$/) { + if ($in_extern) { + print "$1##{\n"; + } else { + print; + } + next; + } + + # Lines of the form 'SOME_VERSION_NAME_1.1 {' + if (/^([A-Z0-9_.]+)[ \t]+{$/) { + # Record version name. + $current_version = $1; + # Reset match attempts, #matched symbols for this version. + $matches_attempted = 0; + $matched_symbols = 0; + print "SYMBOL_VERSION $1 {\n"; + next; + } + + # Ignore 'global:' + if (/^[ \t]*global:$/) { print; next; } + + # After 'local:', globs should be ignored, they won't be exported. + if (/^[ \t]*local:$/) { + $glob = 'ign'; + print; + next; + } + + # After 'extern "C++"', globs are C++ patterns + if (/^([ \t]*)(extern \"C\+\+\"[ \t]*)$/) { + $in_extern++; + $glob = 'cxx'; + # Need to comment, Sun ld cannot handle this. + print "$1##$2\n"; next; + } + + # Chomp newline now we're done with passing through the input file. + chomp; + + # Catch globs. Note that '{}' is not allowed in globs by this script, + # so only '*' and '[]' are available. + if (/^([ \t]*)([^ \t;{}#]+);?[ \t]*$/) { + my $ws = $1; + my $ptn = $2; + # Turn the glob into a regex by replacing '*' with '.*', '?' with '.'. + # Keep $ptn so we can still print the original form. + ($pattern = $ptn) =~ s/\*/\.\*/g; + $pattern =~ s/\?/\./g; + + if ($glob eq 'ign') { + # We're in a local: * section; just continue. + print "$_\n"; + next; + } + + # Print the glob commented for human readers. + print "$ws##$ptn ($glob)\n"; + # We tried to match a symbol to this version. + $matches_attempted++; + + if ($glob eq 'glob') { + my %ptn_syms = (); + + # Match ptn against symbols in %sym_hash. + foreach my $sym (keys %sym_hash) { + # Maybe it matches one of the patterns based on the symbol in + # the .o file. + $ptn_syms{$sym}++ if ($sym =~ /^$pattern$/); + } + + foreach my $sym (sort keys(%ptn_syms)) { + $matched_symbols++; + print "$ws$sym;\n"; + } + } elsif ($glob eq 'cxx') { + my %dem_syms = (); + + # Verify that we're actually using GNU c++filt. Other versions + # most likely cannot handle GNU style symbol mangling. + my $cxxout = `$cxxfilt --version 2>&1`; + $cxxout =~ m/GNU/ or die "$0 requires GNU c++filt to function"; + + # Talk to c++filt through a pair of file descriptors. + # Need to start a fresh instance per pattern, otherwise the + # process grows to 500+ MB. + my $pid = open2(*FILTIN, *FILTOUT, $cxxfilt) or die $!; + + # Match ptn against symbols in %sym_hash. + foreach my $sym (keys %sym_hash) { + # No? Well, maybe its demangled form matches one of those + # patterns. + printf FILTOUT "%s\n",$sym; + my $dem = <FILTIN>; + chomp $dem; + $dem_syms{$sym}++ if ($dem =~ /^$pattern$/); + } + + close FILTOUT or die "c++filt error"; + close FILTIN or die "c++filt error"; + # Need to wait for the c++filt process to avoid lots of zombies. + waitpid $pid, 0; + + foreach my $sym (sort keys(%dem_syms)) { + $matched_symbols++; + print "$ws$sym;\n"; + } + } else { + # No? Well, then ignore it. + } + next; + } + # Important sanity check. This script can't handle lots of formats + # that GNU ld can, so be sure to error out if one is seen! + die "strange line `$_'"; +} +close F;
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/strtod.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/strtod.c new file mode 100644 index 0000000..3a9452e --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/strtod.c
@@ -0,0 +1,93 @@ +/* + * C99-compatible strtod() implementation + * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com> + * + * 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 + */ + +#include <limits.h> +#include <stdlib.h> + +#include "libavutil/avstring.h" +#include "libavutil/mathematics.h" + +static char *check_nan_suffix(char *s) +{ + char *start = s; + + if (*s++ != '(') + return start; + + while ((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || + (*s >= '0' && *s <= '9') || *s == '_') + s++; + + return *s == ')' ? s + 1 : start; +} + +#undef strtod +double strtod(const char *, char **); + +double avpriv_strtod(const char *nptr, char **endptr) +{ + char *end; + double res; + + /* Skip leading spaces */ + while (av_isspace(*nptr)) + nptr++; + + if (!av_strncasecmp(nptr, "infinity", 8)) { + end = nptr + 8; + res = INFINITY; + } else if (!av_strncasecmp(nptr, "inf", 3)) { + end = nptr + 3; + res = INFINITY; + } else if (!av_strncasecmp(nptr, "+infinity", 9)) { + end = nptr + 9; + res = INFINITY; + } else if (!av_strncasecmp(nptr, "+inf", 4)) { + end = nptr + 4; + res = INFINITY; + } else if (!av_strncasecmp(nptr, "-infinity", 9)) { + end = nptr + 9; + res = -INFINITY; + } else if (!av_strncasecmp(nptr, "-inf", 4)) { + end = nptr + 4; + res = -INFINITY; + } else if (!av_strncasecmp(nptr, "nan", 3)) { + end = check_nan_suffix(nptr + 3); + res = NAN; + } else if (!av_strncasecmp(nptr, "+nan", 4) || + !av_strncasecmp(nptr, "-nan", 4)) { + end = check_nan_suffix(nptr + 4); + res = NAN; + } else if (!av_strncasecmp(nptr, "0x", 2) || + !av_strncasecmp(nptr, "-0x", 3) || + !av_strncasecmp(nptr, "+0x", 3)) { + /* FIXME this doesn't handle exponents, non-integers (float/double) + * and numbers too large for long long */ + res = strtoll(nptr, &end, 16); + } else { + res = strtod(nptr, &end); + } + + if (endptr) + *endptr = end; + + return res; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/tms470/math.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/tms470/math.h new file mode 100644 index 0000000..0a42743 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/tms470/math.h
@@ -0,0 +1,30 @@ +/* + * 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 + */ + +#ifndef COMPAT_TMS470_MATH_H +#define COMPAT_TMS470_MATH_H + +#include_next <math.h> + +#undef INFINITY +#undef NAN + +#define INFINITY (*(const float*)((const unsigned []){ 0x7f800000 })) +#define NAN (*(const float*)((const unsigned []){ 0x7fc00000 })) + +#endif /* COMPAT_TMS470_MATH_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/va_copy.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/va_copy.h new file mode 100644 index 0000000..a40bbe6 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/va_copy.h
@@ -0,0 +1,34 @@ +/* + * MSVC Compatible va_copy macro + * Copyright (c) 2012 Derek Buitenhuis + * + * 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 + */ + +#ifndef COMPAT_VA_COPY_H +#define COMPAT_VA_COPY_H + +#include <stdarg.h> + +#if !defined(va_copy) && defined(_MSC_VER) +#define va_copy(dst, src) ((dst) = (src)) +#endif +#if !defined(va_copy) && defined(__GNUC__) && __GNUC__ < 3 +#define va_copy(dst, src) __va_copy(dst, src) +#endif + +#endif /* COMPAT_VA_COPY_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/w32pthreads.h b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/w32pthreads.h new file mode 100644 index 0000000..4ac2a99 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/w32pthreads.h
@@ -0,0 +1,418 @@ +/* + * Copyright (C) 2010-2011 x264 project + * + * Authors: Steven Walters <kemuri9@gmail.com> + * Pegasys Inc. <http://www.pegasys-inc.com> + * + * 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 + * w32threads to pthreads wrapper + */ + +#ifndef COMPAT_W32PTHREADS_H +#define COMPAT_W32PTHREADS_H + +/* Build up a pthread-like API using underlying Windows API. Have only static + * methods so as to not conflict with a potentially linked in pthread-win32 + * library. + * As most functions here are used without checking return values, + * only implement return values as necessary. */ + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <process.h> + +#if _WIN32_WINNT < 0x0600 && defined(__MINGW32__) +#undef MemoryBarrier +#define MemoryBarrier __sync_synchronize +#endif + +#include "libavutil/attributes.h" +#include "libavutil/common.h" +#include "libavutil/internal.h" +#include "libavutil/mem.h" + +typedef struct pthread_t { + void *handle; + void *(*func)(void* arg); + void *arg; + void *ret; +} pthread_t; + +/* the conditional variable api for windows 6.0+ uses critical sections and + * not mutexes */ +typedef CRITICAL_SECTION pthread_mutex_t; + +/* This is the CONDITION_VARIABLE typedef for using Windows' native + * conditional variables on kernels 6.0+. */ +#if HAVE_CONDITION_VARIABLE_PTR +typedef CONDITION_VARIABLE pthread_cond_t; +#else +typedef struct pthread_cond_t { + void *Ptr; +} pthread_cond_t; +#endif + +#if _WIN32_WINNT >= 0x0600 +#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0) +#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE) +#endif + +static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg) +{ + pthread_t *h = arg; + h->ret = h->func(h->arg); + return 0; +} + +static av_unused int pthread_create(pthread_t *thread, const void *unused_attr, + void *(*start_routine)(void*), void *arg) +{ + thread->func = start_routine; + thread->arg = arg; +#if HAVE_WINRT + thread->handle = (void*)CreateThread(NULL, 0, win32thread_worker, thread, + 0, NULL); +#else + thread->handle = (void*)_beginthreadex(NULL, 0, win32thread_worker, thread, + 0, NULL); +#endif + return !thread->handle; +} + +static av_unused int pthread_join(pthread_t thread, void **value_ptr) +{ + DWORD ret = WaitForSingleObject(thread.handle, INFINITE); + if (ret != WAIT_OBJECT_0) { + if (ret == WAIT_ABANDONED) + return EINVAL; + else + return EDEADLK; + } + if (value_ptr) + *value_ptr = thread.ret; + CloseHandle(thread.handle); + return 0; +} + +static inline int pthread_mutex_init(pthread_mutex_t *m, void* attr) +{ + InitializeCriticalSection(m); + return 0; +} +static inline int pthread_mutex_destroy(pthread_mutex_t *m) +{ + DeleteCriticalSection(m); + return 0; +} +static inline int pthread_mutex_lock(pthread_mutex_t *m) +{ + EnterCriticalSection(m); + return 0; +} +static inline int pthread_mutex_unlock(pthread_mutex_t *m) +{ + LeaveCriticalSection(m); + return 0; +} + +#if _WIN32_WINNT >= 0x0600 +typedef INIT_ONCE pthread_once_t; +#define PTHREAD_ONCE_INIT INIT_ONCE_STATIC_INIT + +static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) +{ + BOOL pending = FALSE; + InitOnceBeginInitialize(once_control, 0, &pending, NULL); + if (pending) + init_routine(); + InitOnceComplete(once_control, 0, NULL); + return 0; +} + +static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr) +{ + InitializeConditionVariable(cond); + return 0; +} + +/* native condition variables do not destroy */ +static inline int pthread_cond_destroy(pthread_cond_t *cond) +{ + return 0; +} + +static inline int pthread_cond_broadcast(pthread_cond_t *cond) +{ + WakeAllConditionVariable(cond); + return 0; +} + +static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + SleepConditionVariableCS(cond, mutex, INFINITE); + return 0; +} + +static inline int pthread_cond_signal(pthread_cond_t *cond) +{ + WakeConditionVariable(cond); + return 0; +} + +#else // _WIN32_WINNT < 0x0600 + +/* atomic init state of dynamically loaded functions */ +static LONG w32thread_init_state = 0; +static av_unused void w32thread_init(void); + +/* for pre-Windows 6.0 platforms, define INIT_ONCE struct, + * compatible to the one used in the native API */ + +typedef union pthread_once_t { + void * Ptr; ///< For the Windows 6.0+ native functions + LONG state; ///< For the pre-Windows 6.0 compat code +} pthread_once_t; + +#define PTHREAD_ONCE_INIT {0} + +/* function pointers to init once API on windows 6.0+ kernels */ +static BOOL (WINAPI *initonce_begin)(pthread_once_t *lpInitOnce, DWORD dwFlags, BOOL *fPending, void **lpContext); +static BOOL (WINAPI *initonce_complete)(pthread_once_t *lpInitOnce, DWORD dwFlags, void *lpContext); + +/* pre-Windows 6.0 compat using a spin-lock */ +static inline void w32thread_once_fallback(LONG volatile *state, void (*init_routine)(void)) +{ + switch (InterlockedCompareExchange(state, 1, 0)) { + /* Initial run */ + case 0: + init_routine(); + InterlockedExchange(state, 2); + break; + /* Another thread is running init */ + case 1: + while (1) { + MemoryBarrier(); + if (*state == 2) + break; + Sleep(0); + } + break; + /* Initialization complete */ + case 2: + break; + } +} + +static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) +{ + w32thread_once_fallback(&w32thread_init_state, w32thread_init); + + /* Use native functions on Windows 6.0+ */ + if (initonce_begin && initonce_complete) { + BOOL pending = FALSE; + initonce_begin(once_control, 0, &pending, NULL); + if (pending) + init_routine(); + initonce_complete(once_control, 0, NULL); + return 0; + } + + w32thread_once_fallback(&once_control->state, init_routine); + return 0; +} + +/* for pre-Windows 6.0 platforms we need to define and use our own condition + * variable and api */ + +typedef struct win32_cond_t { + pthread_mutex_t mtx_broadcast; + pthread_mutex_t mtx_waiter_count; + volatile int waiter_count; + HANDLE semaphore; + HANDLE waiters_done; + volatile int is_broadcast; +} win32_cond_t; + +/* function pointers to conditional variable API on windows 6.0+ kernels */ +static void (WINAPI *cond_broadcast)(pthread_cond_t *cond); +static void (WINAPI *cond_init)(pthread_cond_t *cond); +static void (WINAPI *cond_signal)(pthread_cond_t *cond); +static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex, + DWORD milliseconds); + +static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr) +{ + win32_cond_t *win32_cond = NULL; + + w32thread_once_fallback(&w32thread_init_state, w32thread_init); + + if (cond_init) { + cond_init(cond); + return 0; + } + + /* non native condition variables */ + win32_cond = av_mallocz(sizeof(win32_cond_t)); + if (!win32_cond) + return ENOMEM; + cond->Ptr = win32_cond; + win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); + if (!win32_cond->semaphore) + return ENOMEM; + win32_cond->waiters_done = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!win32_cond->waiters_done) + return ENOMEM; + + pthread_mutex_init(&win32_cond->mtx_waiter_count, NULL); + pthread_mutex_init(&win32_cond->mtx_broadcast, NULL); + return 0; +} + +static av_unused int pthread_cond_destroy(pthread_cond_t *cond) +{ + win32_cond_t *win32_cond = cond->Ptr; + /* native condition variables do not destroy */ + if (cond_init) + return 0; + + /* non native condition variables */ + CloseHandle(win32_cond->semaphore); + CloseHandle(win32_cond->waiters_done); + pthread_mutex_destroy(&win32_cond->mtx_waiter_count); + pthread_mutex_destroy(&win32_cond->mtx_broadcast); + av_freep(&win32_cond); + cond->Ptr = NULL; + return 0; +} + +static av_unused int pthread_cond_broadcast(pthread_cond_t *cond) +{ + win32_cond_t *win32_cond = cond->Ptr; + int have_waiter; + + if (cond_broadcast) { + cond_broadcast(cond); + return 0; + } + + /* non native condition variables */ + pthread_mutex_lock(&win32_cond->mtx_broadcast); + pthread_mutex_lock(&win32_cond->mtx_waiter_count); + have_waiter = 0; + + if (win32_cond->waiter_count) { + win32_cond->is_broadcast = 1; + have_waiter = 1; + } + + if (have_waiter) { + ReleaseSemaphore(win32_cond->semaphore, win32_cond->waiter_count, NULL); + pthread_mutex_unlock(&win32_cond->mtx_waiter_count); + WaitForSingleObject(win32_cond->waiters_done, INFINITE); + ResetEvent(win32_cond->waiters_done); + win32_cond->is_broadcast = 0; + } else + pthread_mutex_unlock(&win32_cond->mtx_waiter_count); + pthread_mutex_unlock(&win32_cond->mtx_broadcast); + return 0; +} + +static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + win32_cond_t *win32_cond = cond->Ptr; + int last_waiter; + if (cond_wait) { + cond_wait(cond, mutex, INFINITE); + return 0; + } + + /* non native condition variables */ + pthread_mutex_lock(&win32_cond->mtx_broadcast); + pthread_mutex_lock(&win32_cond->mtx_waiter_count); + win32_cond->waiter_count++; + pthread_mutex_unlock(&win32_cond->mtx_waiter_count); + pthread_mutex_unlock(&win32_cond->mtx_broadcast); + + // unlock the external mutex + pthread_mutex_unlock(mutex); + WaitForSingleObject(win32_cond->semaphore, INFINITE); + + pthread_mutex_lock(&win32_cond->mtx_waiter_count); + win32_cond->waiter_count--; + last_waiter = !win32_cond->waiter_count || !win32_cond->is_broadcast; + pthread_mutex_unlock(&win32_cond->mtx_waiter_count); + + if (last_waiter) + SetEvent(win32_cond->waiters_done); + + // lock the external mutex + return pthread_mutex_lock(mutex); +} + +static av_unused int pthread_cond_signal(pthread_cond_t *cond) +{ + win32_cond_t *win32_cond = cond->Ptr; + int have_waiter; + if (cond_signal) { + cond_signal(cond); + return 0; + } + + pthread_mutex_lock(&win32_cond->mtx_broadcast); + + /* non-native condition variables */ + pthread_mutex_lock(&win32_cond->mtx_waiter_count); + have_waiter = win32_cond->waiter_count; + pthread_mutex_unlock(&win32_cond->mtx_waiter_count); + + if (have_waiter) { + ReleaseSemaphore(win32_cond->semaphore, 1, NULL); + WaitForSingleObject(win32_cond->waiters_done, INFINITE); + ResetEvent(win32_cond->waiters_done); + } + + pthread_mutex_unlock(&win32_cond->mtx_broadcast); + return 0; +} +#endif + +static av_unused void w32thread_init(void) +{ +#if _WIN32_WINNT < 0x0600 + HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll")); + /* if one is available, then they should all be available */ + cond_init = + (void*)GetProcAddress(kernel_dll, "InitializeConditionVariable"); + cond_broadcast = + (void*)GetProcAddress(kernel_dll, "WakeAllConditionVariable"); + cond_signal = + (void*)GetProcAddress(kernel_dll, "WakeConditionVariable"); + cond_wait = + (void*)GetProcAddress(kernel_dll, "SleepConditionVariableCS"); + initonce_begin = + (void*)GetProcAddress(kernel_dll, "InitOnceBeginInitialize"); + initonce_complete = + (void*)GetProcAddress(kernel_dll, "InitOnceComplete"); +#endif + +} + +#endif /* COMPAT_W32PTHREADS_H */
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/windows/makedef b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/windows/makedef new file mode 100755 index 0000000..fcaf108 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/windows/makedef
@@ -0,0 +1,132 @@ +#!/bin/sh + +# Copyright (c) 2013, Derek Buitenhuis +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# mktemp isn't POSIX, so supply an implementation +mktemp() { + echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$" +} + +if [ $# -lt 2 ]; then + echo "Usage: makedef <version_script> <objects>" >&2 + exit 0 +fi + +vscript=$1 +shift + +if [ ! -f "$vscript" ]; then + echo "Version script does not exist" >&2 + exit 1 +fi + +for object in "$@"; do + if [ ! -f "$object" ]; then + echo "Object does not exist: ${object}" >&2 + exit 1 + fi +done + +# Create a lib temporarily to dump symbols from. +# It's just much easier to do it this way +libname=$(mktemp -u "library").lib + +trap 'rm -f -- $libname' EXIT + +lib -out:${libname} $@ >/dev/null +if [ $? != 0 ]; then + echo "Could not create temporary library." >&2 + exit 1 +fi + +IFS=' +' + +# Determine if we're building for x86 or x86_64 and +# set the symbol prefix accordingly. +prefix="" +arch=$(dumpbin -headers ${libname} | + tr '\t' ' ' | + grep '^ \+.\+machine \+(.\+)' | + head -1 | + sed -e 's/^ \{1,\}.\{1,\} \{1,\}machine \{1,\}(\(...\)).*/\1/') + +if [ "${arch}" = "x86" ]; then + prefix="_" +else + if [ "${arch}" != "ARM" ] && [ "${arch}" != "x64" ]; then + echo "Unknown machine type." >&2 + exit 1 + fi +fi + +started=0 +regex="none" + +for line in $(cat ${vscript} | tr '\t' ' '); do + # We only care about global symbols + echo "${line}" | grep -q '^ \+global:' + if [ $? = 0 ]; then + started=1 + line=$(echo "${line}" | sed -e 's/^ \{1,\}global: *//') + else + echo "${line}" | grep -q '^ \+local:' + if [ $? = 0 ]; then + started=0 + fi + fi + + if [ ${started} = 0 ]; then + continue + fi + + # Handle multiple symbols on one line + IFS=';' + + # Work around stupid expansion to filenames + line=$(echo "${line}" | sed -e 's/\*/.\\+/g') + for exp in ${line}; do + # Remove leading and trailing whitespace + exp=$(echo "${exp}" | sed -e 's/^ *//' -e 's/ *$//') + + if [ "${regex}" = "none" ]; then + regex="${exp}" + else + regex="${regex};${exp}" + fi + done + + IFS=' +' +done + +dump=$(dumpbin -linkermember:1 ${libname}) + +rm ${libname} + +IFS=';' +list="" +for exp in ${regex}; do + list="${list}"' +'$(echo "${dump}" | + sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' | + tail -n +2 | + cut -d' ' -f3 | + grep "^${exp}" | + sed -e 's/^/ /') +done + +echo "EXPORTS" +echo "${list}" | sort | uniq | tail -n +2
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/windows/mslink b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/windows/mslink new file mode 100755 index 0000000..07b2b3e --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/compat/windows/mslink
@@ -0,0 +1,9 @@ +#!/bin/sh + +LINK_EXE_PATH=$(dirname "$(command -v cl)")/link +if [ -x "$LINK_EXE_PATH" ]; then + "$LINK_EXE_PATH" $@ +else + link $@ +fi +exit $?
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/configure b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/configure new file mode 100755 index 0000000..2148f11 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/configure
@@ -0,0 +1,6547 @@ +#!/bin/sh +# +# FFmpeg configure script +# +# Copyright (c) 2000-2002 Fabrice Bellard +# Copyright (c) 2005-2008 Diego Biurrun +# Copyright (c) 2005-2008 Mans Rullgard +# + +# Prevent locale nonsense from breaking basic text processing. +LC_ALL=C +export LC_ALL + +# make sure we are running under a compatible shell +# try to make this part work with most shells + +try_exec(){ + echo "Trying shell $1" + type "$1" > /dev/null 2>&1 && exec "$@" +} + +unset foo +(: ${foo%%bar}) 2> /dev/null +E1="$?" + +(: ${foo?}) 2> /dev/null +E2="$?" + +if test "$E1" != 0 || test "$E2" = 0; then + echo "Broken shell detected. Trying alternatives." + export FF_CONF_EXEC + if test "0$FF_CONF_EXEC" -lt 1; then + FF_CONF_EXEC=1 + try_exec bash "$0" "$@" + fi + if test "0$FF_CONF_EXEC" -lt 2; then + FF_CONF_EXEC=2 + try_exec ksh "$0" "$@" + fi + if test "0$FF_CONF_EXEC" -lt 3; then + FF_CONF_EXEC=3 + try_exec /usr/xpg4/bin/sh "$0" "$@" + fi + echo "No compatible shell script interpreter found." + echo "This configure script requires a POSIX-compatible shell" + echo "such as bash or ksh." + echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH." + echo "Instead, install a working POSIX-compatible shell." + echo "Disabling this configure test will create a broken FFmpeg." + if test "$BASH_VERSION" = '2.04.0(1)-release'; then + echo "This bash version ($BASH_VERSION) is broken on your platform." + echo "Upgrade to a later version if available." + fi + exit 1 +fi + +test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH + +show_help(){ + cat <<EOF +Usage: configure [options] +Options: [defaults in brackets after descriptions] + +Help options: + --help print this message + --list-decoders show all available decoders + --list-encoders show all available encoders + --list-hwaccels show all available hardware accelerators + --list-demuxers show all available demuxers + --list-muxers show all available muxers + --list-parsers show all available parsers + --list-protocols show all available protocols + --list-bsfs show all available bitstream filters + --list-indevs show all available input devices + --list-outdevs show all available output devices + --list-filters show all available filters + +Standard options: + --logfile=FILE log tests and output to FILE [config.log] + --disable-logging do not log configure debug information + --fatal-warnings fail if any configure warning is generated + --prefix=PREFIX install in PREFIX [$prefix] + --bindir=DIR install binaries in DIR [PREFIX/bin] + --datadir=DIR install data files in DIR [PREFIX/share/ffmpeg] + --docdir=DIR install documentation in DIR [PREFIX/share/doc/ffmpeg] + --libdir=DIR install libs in DIR [PREFIX/lib] + --shlibdir=DIR install shared libs in DIR [LIBDIR] + --incdir=DIR install includes in DIR [PREFIX/include] + --mandir=DIR install man page in DIR [PREFIX/share/man] + --pkgconfigdir=DIR install pkg-config files in DIR [LIBDIR/pkgconfig] + --enable-rpath use rpath to allow installing libraries in paths + not part of the dynamic linker search path + use rpath when linking programs [USE WITH CARE] + +Licensing options: + --enable-gpl allow use of GPL code, the resulting libs + and binaries will be under GPL [no] + --enable-version3 upgrade (L)GPL to version 3 [no] + --enable-nonfree allow use of nonfree code, the resulting libs + and binaries will be unredistributable [no] + +Configuration options: + --disable-static do not build static libraries [no] + --enable-shared build shared libraries [no] + --enable-small optimize for size instead of speed + --disable-runtime-cpudetect disable detecting cpu capabilities at runtime (smaller binary) + --enable-gray enable full grayscale support (slower color) + --disable-swscale-alpha disable alpha channel support in swscale + --disable-all disable building components, libraries and programs + --enable-incompatible-libav-abi enable incompatible Libav fork ABI [no] + --enable-raise-major increase major version numbers in sonames [no] + +Program options: + --disable-programs do not build command line programs + --disable-ffmpeg disable ffmpeg build + --disable-ffplay disable ffplay build + --disable-ffprobe disable ffprobe build + --disable-ffserver disable ffserver build + +Documentation options: + --disable-doc do not build documentation + --disable-htmlpages do not build HTML documentation pages + --disable-manpages do not build man documentation pages + --disable-podpages do not build POD documentation pages + --disable-txtpages do not build text documentation pages + +Component options: + --disable-avdevice disable libavdevice build + --disable-avcodec disable libavcodec build + --disable-avformat disable libavformat build + --disable-swresample disable libswresample build + --disable-swscale disable libswscale build + --disable-postproc disable libpostproc build + --disable-avfilter disable libavfilter build + --enable-avresample enable libavresample build [no] + --disable-pthreads disable pthreads [autodetect] + --disable-w32threads disable Win32 threads [autodetect] + --disable-os2threads disable OS/2 threads [autodetect] + --disable-network disable network support [no] + --disable-dct disable DCT code + --disable-dwt disable DWT code + --disable-error-resilience disable error resilience code + --disable-lsp disable LSP code + --disable-lzo disable LZO decoder code + --disable-mdct disable MDCT code + --disable-rdft disable RDFT code + --disable-fft disable FFT code + --disable-faan disable floating point AAN (I)DCT code + --disable-pixelutils disable pixel utils in libavutil + +Hardware accelerators: + --disable-d3d11va disable D3D11VA code [autodetect] + --disable-dxva2 disable DXVA2 code [autodetect] + --disable-vaapi disable VAAPI code [autodetect] + --disable-vda disable VDA code [autodetect] + --disable-vdpau disable VDPAU code [autodetect] + --enable-videotoolbox enable VideoToolbox code [autodetect] + +Individual component options: + --disable-everything disable all components listed below + --disable-encoder=NAME disable encoder NAME + --enable-encoder=NAME enable encoder NAME + --disable-encoders disable all encoders + --disable-decoder=NAME disable decoder NAME + --enable-decoder=NAME enable decoder NAME + --disable-decoders disable all decoders + --disable-hwaccel=NAME disable hwaccel NAME + --enable-hwaccel=NAME enable hwaccel NAME + --disable-hwaccels disable all hwaccels + --disable-muxer=NAME disable muxer NAME + --enable-muxer=NAME enable muxer NAME + --disable-muxers disable all muxers + --disable-demuxer=NAME disable demuxer NAME + --enable-demuxer=NAME enable demuxer NAME + --disable-demuxers disable all demuxers + --enable-parser=NAME enable parser NAME + --disable-parser=NAME disable parser NAME + --disable-parsers disable all parsers + --enable-bsf=NAME enable bitstream filter NAME + --disable-bsf=NAME disable bitstream filter NAME + --disable-bsfs disable all bitstream filters + --enable-protocol=NAME enable protocol NAME + --disable-protocol=NAME disable protocol NAME + --disable-protocols disable all protocols + --enable-indev=NAME enable input device NAME + --disable-indev=NAME disable input device NAME + --disable-indevs disable input devices + --enable-outdev=NAME enable output device NAME + --disable-outdev=NAME disable output device NAME + --disable-outdevs disable output devices + --disable-devices disable all devices + --enable-filter=NAME enable filter NAME + --disable-filter=NAME disable filter NAME + --disable-filters disable all filters + +External library support: + --enable-avisynth enable reading of AviSynth script files [no] + --disable-bzlib disable bzlib [autodetect] + --enable-chromaprint enable audio fingerprinting with chromaprint [no] + --enable-fontconfig enable fontconfig, useful for drawtext filter [no] + --enable-frei0r enable frei0r video filtering [no] + --enable-gcrypt enable gcrypt, needed for rtmp(t)e support + if openssl, librtmp or gmp is not used [no] + --enable-gmp enable gmp, needed for rtmp(t)e support + if openssl or librtmp is not used [no] + --enable-gnutls enable gnutls, needed for https support + if openssl is not used [no] + --disable-iconv disable iconv [autodetect] + --enable-ladspa enable LADSPA audio filtering [no] + --enable-libass enable libass subtitles rendering, + needed for subtitles and ass filter [no] + --enable-libbluray enable BluRay reading using libbluray [no] + --enable-libbs2b enable bs2b DSP library [no] + --enable-libcaca enable textual display using libcaca [no] + --enable-libcelt enable CELT decoding via libcelt [no] + --enable-libcdio enable audio CD grabbing with libcdio [no] + --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 + and libraw1394 [no] + --enable-libdcadec enable DCA decoding via libdcadec [no] + --enable-libfaac enable AAC encoding via libfaac [no] + --enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no] + --enable-libflite enable flite (voice synthesis) support via libflite [no] + --enable-libfreetype enable libfreetype, needed for drawtext filter [no] + --enable-libfribidi enable libfribidi, improves drawtext filter [no] + --enable-libgme enable Game Music Emu via libgme [no] + --enable-libgsm enable GSM de/encoding via libgsm [no] + --enable-libiec61883 enable iec61883 via libiec61883 [no] + --enable-libilbc enable iLBC de/encoding via libilbc [no] + --enable-libkvazaar enable HEVC encoding via libkvazaar [no] + --enable-libmfx enable HW acceleration through libmfx + --enable-libmodplug enable ModPlug via libmodplug [no] + --enable-libmp3lame enable MP3 encoding via libmp3lame [no] + --enable-libnut enable NUT (de)muxing via libnut, + native (de)muxer exists [no] + --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no] + --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no] + --enable-libopencv enable video filtering via libopencv [no] + --enable-libopenh264 enable H.264 encoding via OpenH264 [no] + --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no] + --enable-libopus enable Opus de/encoding via libopus [no] + --enable-libpulse enable Pulseaudio input via libpulse [no] + --enable-librubberband enable rubberband needed for rubberband filter [no] + --enable-librtmp enable RTMP[E] support via librtmp [no] + --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no] + --enable-libshine enable fixed-point MP3 encoding via libshine [no] + --enable-libsmbclient enable Samba protocol via libsmbclient [no] + --enable-libsnappy enable Snappy compression, needed for hap encoding [no] + --enable-libsoxr enable Include libsoxr resampling [no] + --enable-libspeex enable Speex de/encoding via libspeex [no] + --enable-libssh enable SFTP protocol via libssh [no] + --enable-libtesseract enable Tesseract, needed for ocr filter [no] + --enable-libtheora enable Theora encoding via libtheora [no] + --enable-libtwolame enable MP2 encoding via libtwolame [no] + --enable-libutvideo enable Ut Video encoding and decoding via libutvideo [no] + --enable-libv4l2 enable libv4l2/v4l-utils [no] + --enable-libvidstab enable video stabilization using vid.stab [no] + --enable-libvo-amrwbenc enable AMR-WB encoding via libvo-amrwbenc [no] + --enable-libvorbis enable Vorbis en/decoding via libvorbis, + native implementation exists [no] + --enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no] + --enable-libwavpack enable wavpack encoding via libwavpack [no] + --enable-libwebp enable WebP encoding via libwebp [no] + --enable-libx264 enable H.264 encoding via x264 [no] + --enable-libx265 enable HEVC encoding via x265 [no] + --enable-libxavs enable AVS encoding via xavs [no] + --enable-libxcb enable X11 grabbing using XCB [autodetect] + --enable-libxcb-shm enable X11 grabbing shm communication [autodetect] + --enable-libxcb-xfixes enable X11 grabbing mouse rendering [autodetect] + --enable-libxcb-shape enable X11 grabbing shape rendering [autodetect] + --enable-libxvid enable Xvid encoding via xvidcore, + native MPEG-4/Xvid encoder exists [no] + --enable-libzimg enable z.lib, needed for zscale filter [no] + --enable-libzmq enable message passing via libzmq [no] + --enable-libzvbi enable teletext support via libzvbi [no] + --disable-lzma disable lzma [autodetect] + --enable-decklink enable Blackmagic DeckLink I/O support [no] + --enable-mmal enable decoding via MMAL [no] + --enable-netcdf enable NetCDF, needed for sofalizer filter [no] + --enable-nvenc enable NVIDIA NVENC support [no] + --enable-openal enable OpenAL 1.1 capture support [no] + --enable-opencl enable OpenCL code + --enable-opengl enable OpenGL rendering [no] + --enable-openssl enable openssl, needed for https support + if gnutls is not used [no] + --disable-schannel disable SChannel SSP, needed for TLS support on + Windows if openssl and gnutls are not used [autodetect] + --disable-sdl disable sdl [autodetect] + --disable-securetransport disable Secure Transport, needed for TLS support + on OSX if openssl and gnutls are not used [autodetect] + --enable-x11grab enable X11 grabbing (legacy) [no] + --disable-xlib disable xlib [autodetect] + --disable-zlib disable zlib [autodetect] + +Toolchain options: + --arch=ARCH select architecture [$arch] + --cpu=CPU select the minimum required CPU (affects + instruction selection, may crash on older CPUs) + --cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix] + --progs-suffix=SUFFIX program name suffix [] + --enable-cross-compile assume a cross-compiler is used + --sysroot=PATH root of cross-build tree + --sysinclude=PATH location of cross-build system headers + --target-os=OS compiler targets OS [$target_os] + --target-exec=CMD command to run executables on target + --target-path=DIR path to view of build directory on target + --target-samples=DIR path to samples directory on target + --tempprefix=PATH force fixed dir/prefix instead of mktemp for checks + --toolchain=NAME set tool defaults according to NAME + --nm=NM use nm tool NM [$nm_default] + --ar=AR use archive tool AR [$ar_default] + --as=AS use assembler AS [$as_default] + --windres=WINDRES use windows resource compiler WINDRES [$windres_default] + --yasmexe=EXE use yasm-compatible assembler EXE [$yasmexe_default] + --cc=CC use C compiler CC [$cc_default] + --cxx=CXX use C compiler CXX [$cxx_default] + --objcc=OCC use ObjC compiler OCC [$cc_default] + --dep-cc=DEPCC use dependency generator DEPCC [$cc_default] + --ld=LD use linker LD [$ld_default] + --pkg-config=PKGCONFIG use pkg-config tool PKGCONFIG [$pkg_config_default] + --pkg-config-flags=FLAGS pass additional flags to pkgconf [] + --ranlib=RANLIB use ranlib RANLIB [$ranlib_default] + --doxygen=DOXYGEN use DOXYGEN to generate API doc [$doxygen_default] + --host-cc=HOSTCC use host C compiler HOSTCC + --host-cflags=HCFLAGS use HCFLAGS when compiling for host + --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host + --host-ld=HOSTLD use host linker HOSTLD + --host-ldflags=HLDFLAGS use HLDFLAGS when linking for host + --host-libs=HLIBS use libs HLIBS when linking for host + --host-os=OS compiler host OS [$target_os] + --extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [$CFLAGS] + --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS] + --extra-objcflags=FLAGS add FLAGS to OBJCFLAGS [$CFLAGS] + --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS] + --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS] + --extra-ldlibflags=ELDFLAGS add ELDFLAGS to LDLIBFLAGS [$LDLIBFLAGS] + --extra-libs=ELIBS add ELIBS [$ELIBS] + --extra-version=STRING version string suffix [] + --optflags=OPTFLAGS override optimization-related compiler flags + --build-suffix=SUFFIX library name suffix [] + --enable-pic build position-independent code + --enable-thumb compile for Thumb instruction set + --enable-lto use link-time optimization + --env="ENV=override" override the environment variables + +Advanced options (experts only): + --malloc-prefix=PREFIX prefix malloc and related names with PREFIX + --custom-allocator=NAME use a supported custom allocator + --disable-symver disable symbol versioning + --enable-hardcoded-tables use hardcoded tables instead of runtime generation + --disable-safe-bitstream-reader + disable buffer boundary checking in bitreaders + (faster, but may crash) + --enable-memalign-hack emulate memalign, interferes with memory debuggers + --sws-max-filter-size=N the max filter size swscale uses [$sws_max_filter_size_default] + +Optimization options (experts only): + --disable-asm disable all assembly optimizations + --disable-altivec disable AltiVec optimizations + --disable-vsx disable VSX optimizations + --disable-power8 disable POWER8 optimizations + --disable-amd3dnow disable 3DNow! optimizations + --disable-amd3dnowext disable 3DNow! extended optimizations + --disable-mmx disable MMX optimizations + --disable-mmxext disable MMXEXT optimizations + --disable-sse disable SSE optimizations + --disable-sse2 disable SSE2 optimizations + --disable-sse3 disable SSE3 optimizations + --disable-ssse3 disable SSSE3 optimizations + --disable-sse4 disable SSE4 optimizations + --disable-sse42 disable SSE4.2 optimizations + --disable-avx disable AVX optimizations + --disable-xop disable XOP optimizations + --disable-fma3 disable FMA3 optimizations + --disable-fma4 disable FMA4 optimizations + --disable-avx2 disable AVX2 optimizations + --disable-aesni disable AESNI optimizations + --disable-armv5te disable armv5te optimizations + --disable-armv6 disable armv6 optimizations + --disable-armv6t2 disable armv6t2 optimizations + --disable-vfp disable VFP optimizations + --disable-neon disable NEON optimizations + --disable-inline-asm disable use of inline assembly + --disable-yasm disable use of nasm/yasm assembly + --disable-mipsdsp disable MIPS DSP ASE R1 optimizations + --disable-mipsdspr2 disable MIPS DSP ASE R2 optimizations + --disable-msa disable MSA optimizations + --disable-mipsfpu disable floating point MIPS optimizations + --disable-mmi disable Loongson SIMD optimizations + --disable-fast-unaligned consider unaligned accesses slow + +Developer options (useful when working on FFmpeg itself): + --disable-debug disable debugging symbols + --enable-debug=LEVEL set the debug level [$debuglevel] + --disable-optimizations disable compiler optimizations + --enable-extra-warnings enable more compiler warnings + --disable-stripping disable stripping of executables and shared libraries + --assert-level=level 0(default), 1 or 2, amount of assertion testing, + 2 causes a slowdown at runtime. + --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data + --valgrind=VALGRIND run "make fate" tests through valgrind to detect memory + leaks and errors, using the specified valgrind binary. + Cannot be combined with --target-exec + --enable-ftrapv Trap arithmetic overflows + --samples=PATH location of test samples for FATE, if not set use + \$FATE_SAMPLES at make invocation time. + --enable-neon-clobber-test check NEON registers for clobbering (should be + used only for debugging purposes) + --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only; + should be used only for debugging purposes) + --enable-random randomly enable/disable components + --disable-random + --enable-random=LIST randomly enable/disable specific components or + --disable-random=LIST component groups. LIST is a comma-separated list + of NAME[:PROB] entries where NAME is a component + (group) and PROB the probability associated with + NAME (default 0.5). + --random-seed=VALUE seed value for --enable/disable-random + --disable-valgrind-backtrace do not print a backtrace under Valgrind + (only applies to --disable-optimizations builds) + +NOTE: Object files are built at the place where configure is launched. +EOF + exit 0 +} + +quotes='""' +if test -t 1 && which tput >/dev/null 2>&1; then + ncolors=$(tput colors) + if test -n "$ncolors" && test $ncolors -ge 8; then + bold_color=$(tput bold) + warn_color=$(tput setaf 3) + error_color=$(tput setaf 1) + reset_color=$(tput sgr0) + fi + # 72 used instead of 80 since that's the default of pr + ncols=$(tput cols) +fi +: ${ncols:=72} + +log(){ + echo "$@" >> $logfile +} + +log_file(){ + log BEGIN $1 + pr -n -t $1 >> $logfile + log END $1 +} + +warn(){ + log "WARNING: $*" + WARNINGS="${WARNINGS}WARNING: $*\n" +} + +die(){ + log "$@" + echo "$error_color$bold_color$@$reset_color" + cat <<EOF + +If you think configure made a mistake, make sure you are using the latest +version from Git. If the latest version fails, report the problem to the +ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net. +EOF + if disabled logging; then + cat <<EOF +Rerun configure with logging enabled (do not use --disable-logging), and +include the log this produces with your report. +EOF + else + cat <<EOF +Include the log file "$logfile" produced by configure as this will help +solve the problem. +EOF + fi + exit 1 +} + +# Avoid locale weirdness, besides we really just want to translate ASCII. +toupper(){ + echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ +} + +tolower(){ + echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz +} + +c_escape(){ + echo "$*" | sed 's/["\\]/\\\0/g' +} + +sh_quote(){ + v=$(echo "$1" | sed "s/'/'\\\\''/g") + test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'" + echo "$v" +} + +cleanws(){ + echo "$@" | sed 's/^ *//;s/[[:space:]][[:space:]]*/ /g;s/ *$//' +} + +filter(){ + pat=$1 + shift + for v; do + eval "case $v in $pat) echo $v ;; esac" + done +} + +filter_out(){ + pat=$1 + shift + for v; do + eval "case $v in $pat) ;; *) echo $v ;; esac" + done +} + +map(){ + m=$1 + shift + for v; do eval $m; done +} + +add_suffix(){ + suffix=$1 + shift + for v; do echo ${v}${suffix}; done +} + +set_all(){ + value=$1 + shift + for var in $*; do + eval $var=$value + done +} + +set_weak(){ + value=$1 + shift + for var; do + eval : \${$var:=$value} + done +} + +sanitize_var_name(){ + echo $@ | sed 's/[^A-Za-z0-9_]/_/g' +} + +set_safe(){ + var=$1 + shift + eval $(sanitize_var_name "$var")='$*' +} + +get_safe(){ + eval echo \$$(sanitize_var_name "$1") +} + +pushvar(){ + for pvar in $*; do + eval level=\${${pvar}_level:=0} + eval ${pvar}_${level}="\$$pvar" + eval ${pvar}_level=$(($level+1)) + done +} + +popvar(){ + for pvar in $*; do + eval level=\${${pvar}_level:-0} + test $level = 0 && continue + eval level=$(($level-1)) + eval $pvar="\${${pvar}_${level}}" + eval ${pvar}_level=$level + eval unset ${pvar}_${level} + done +} + +enable(){ + set_all yes $* +} + +disable(){ + set_all no $* +} + +enable_weak(){ + set_weak yes $* +} + +disable_weak(){ + set_weak no $* +} + +enable_safe(){ + for var; do + enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g') + done +} + +disable_safe(){ + for var; do + disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g') + done +} + +do_enable_deep(){ + for var; do + enabled $var && continue + eval sel="\$${var}_select" + eval sgs="\$${var}_suggest" + pushvar var sgs + enable_deep $sel + popvar sgs + enable_deep_weak $sgs + popvar var + done +} + +enable_deep(){ + do_enable_deep $* + enable $* +} + +enable_deep_weak(){ + for var; do + disabled $var && continue + pushvar var + do_enable_deep $var + popvar var + enable_weak $var + done +} + +enabled(){ + test "${1#!}" = "$1" && op='=' || op=!= + eval test "x\$${1#!}" $op "xyes" +} + +disabled(){ + test "${1#!}" = "$1" && op='=' || op=!= + eval test "x\$${1#!}" $op "xno" +} + +enabled_all(){ + for opt; do + enabled $opt || return 1 + done +} + +disabled_all(){ + for opt; do + disabled $opt || return 1 + done +} + +enabled_any(){ + for opt; do + enabled $opt && return 0 + done +} + +disabled_any(){ + for opt; do + disabled $opt && return 0 + done + return 1 +} + +set_default(){ + for opt; do + eval : \${$opt:=\$${opt}_default} + done +} + +is_in(){ + value=$1 + shift + for var in $*; do + [ $var = $value ] && return 0 + done + return 1 +} + +do_check_deps(){ + for cfg; do + cfg="${cfg#!}" + enabled ${cfg}_checking && die "Circular dependency for $cfg." + disabled ${cfg}_checking && continue + enable ${cfg}_checking + append allopts $cfg + + eval dep_all="\$${cfg}_deps" + eval dep_any="\$${cfg}_deps_any" + eval dep_sel="\$${cfg}_select" + eval dep_sgs="\$${cfg}_suggest" + eval dep_ifa="\$${cfg}_if" + eval dep_ifn="\$${cfg}_if_any" + + pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn + do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn + popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn + + [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; } + [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; } + enabled_all $dep_all || disable $cfg + enabled_any $dep_any || disable $cfg + disabled_any $dep_sel && disable $cfg + + if enabled $cfg; then + enable_deep $dep_sel + enable_deep_weak $dep_sgs + fi + + disable ${cfg}_checking + done +} + +check_deps(){ + unset allopts + + do_check_deps "$@" + + for cfg in $allopts; do + enabled $cfg || continue + eval dep_extralibs="\$${cfg}_extralibs" + test -n "$dep_extralibs" && add_extralibs $dep_extralibs + done +} + +print_config(){ + pfx=$1 + files=$2 + shift 2 + map 'eval echo "$v \${$v:-no}"' "$@" | + awk "BEGIN { split(\"$files\", files) } + { + c = \"$pfx\" toupper(\$1); + v = \$2; + sub(/yes/, 1, v); + sub(/no/, 0, v); + for (f in files) { + file = files[f]; + if (file ~ /\\.h\$/) { + printf(\"#define %s %d\\n\", c, v) >>file; + } else if (file ~ /\\.asm\$/) { + printf(\"%%define %s %d\\n\", c, v) >>file; + } else if (file ~ /\\.mak\$/) { + n = -v ? \"\" : \"!\"; + printf(\"%s%s=yes\\n\", n, c) >>file; + } else if (file ~ /\\.texi\$/) { + pre = -v ? \"\" : \"@c \"; + yesno = \$2; + c2 = tolower(c); + gsub(/_/, \"-\", c2); + printf(\"%s@set %s %s\\n\", pre, c2, yesno) >>file; + } + } + }" +} + +print_enabled(){ + suf=$1 + shift + for v; do + enabled $v && printf "%s\n" ${v%$suf}; + done +} + +append(){ + var=$1 + shift + eval "$var=\"\$$var $*\"" +} + +prepend(){ + var=$1 + shift + eval "$var=\"$* \$$var\"" +} + +unique(){ + var=$1 + uniq_list="" + for tok in $(eval echo \$$var); do + uniq_list="$(filter_out $tok $uniq_list) $tok" + done + eval "$var=\"${uniq_list}\"" +} + +add_cppflags(){ + append CPPFLAGS "$@" +} + +add_cflags(){ + append CFLAGS $($cflags_filter "$@") +} + +add_cxxflags(){ + append CXXFLAGS $($cflags_filter "$@") +} + +add_asflags(){ + append ASFLAGS $($asflags_filter "$@") +} + +add_objcflags(){ + append OBJCFLAGS $($objcflags_filter "$@") +} + +add_ldflags(){ + append LDFLAGS $($ldflags_filter "$@") +} + +add_ldexeflags(){ + append LDEXEFLAGS $($ldflags_filter "$@") +} + +add_ldlibflags(){ + append LDLIBFLAGS $($ldflags_filter "$@") +} + +add_stripflags(){ + append ASMSTRIPFLAGS "$@" +} + +add_extralibs(){ + prepend extralibs $($ldflags_filter "$@") +} + +add_host_cppflags(){ + append host_cppflags "$@" +} + +add_host_cflags(){ + append host_cflags $($host_cflags_filter "$@") +} + +add_host_ldflags(){ + append host_ldflags $($host_ldflags_filter "$@") +} + +add_compat(){ + append compat_objs $1 + shift + map 'add_cppflags -D$v' "$@" +} + +check_cmd(){ + log "$@" + "$@" >> $logfile 2>&1 +} + +check_stat(){ + log check_stat "$@" + stat "$1" >> $logfile 2>&1 +} + +cc_o(){ + eval printf '%s\\n' $CC_O +} + +cc_e(){ + eval printf '%s\\n' $CC_E +} + +check_cc(){ + log check_cc "$@" + cat > $TMPC + log_file $TMPC + check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC +} + +check_cxx(){ + log check_cxx "$@" + cat > $TMPCPP + log_file $TMPCPP + check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP +} + +check_objcc(){ + log check_objcc "$@" + cat > $TMPM + log_file $TMPM + check_cmd $objcc -Werror=missing-prototypes $CPPFLAGS $CFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPM +} + +check_cpp(){ + log check_cpp "$@" + cat > $TMPC + log_file $TMPC + check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC +} + +as_o(){ + eval printf '%s\\n' $AS_O +} + +check_as(){ + log check_as "$@" + cat > $TMPS + log_file $TMPS + check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS +} + +check_inline_asm(){ + log check_inline_asm "$@" + name="$1" + code="$2" + shift 2 + disable $name + check_cc "$@" <<EOF && enable $name +void foo(void){ __asm__ volatile($code); } +EOF +} + +check_insn(){ + log check_insn "$@" + check_inline_asm ${1}_inline "\"$2\"" + echo "$2" | check_as && enable ${1}_external || disable ${1}_external +} + +check_yasm(){ + log check_yasm "$@" + echo "$1" > $TMPS + log_file $TMPS + shift 1 + check_cmd $yasmexe $YASMFLAGS -Werror "$@" -o $TMPO $TMPS +} + +ld_o(){ + eval printf '%s\\n' $LD_O +} + +check_ld(){ + log check_ld "$@" + type=$1 + shift 1 + flags=$(filter_out '-l*|*.so' $@) + libs=$(filter '-l*|*.so' $@) + check_$type $($cflags_filter $flags) || return + flags=$($ldflags_filter $flags) + libs=$($ldflags_filter $libs) + check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs +} + +print_include(){ + hdr=$1 + test "${hdr%.h}" = "${hdr}" && + echo "#include $hdr" || + echo "#include <$hdr>" +} + +check_code(){ + log check_code "$@" + check=$1 + headers=$2 + code=$3 + shift 3 + { + for hdr in $headers; do + print_include $hdr + done + echo "int main(void) { $code; return 0; }" + } | check_$check "$@" +} + +check_cppflags(){ + log check_cppflags "$@" + check_cc "$@" <<EOF && append CPPFLAGS "$@" +int x; +EOF +} + +test_cflags(){ + log test_cflags "$@" + set -- $($cflags_filter "$@") + check_cc "$@" <<EOF +int x; +EOF +} + +check_cflags(){ + log check_cflags "$@" + test_cflags "$@" && add_cflags "$@" +} + +check_cxxflags(){ + log check_cxxflags "$@" + set -- $($cflags_filter "$@") + check_cxx "$@" <<EOF && append CXXFLAGS "$@" +int x; +EOF +} + +test_objcflags(){ + log test_cflags "$@" + set -- $($cflags_filter "$@") + check_objcc "$@" <<EOF +int x; +EOF +} + +check_objcflags(){ + log check_cflags "$@" + test_objcflags "$@" && add_objcflags "$@" +} + +test_ldflags(){ + log test_ldflags "$@" + check_ld "cc" "$@" <<EOF +int main(void){ return 0; } +EOF +} + +check_ldflags(){ + log check_ldflags "$@" + test_ldflags "$@" && add_ldflags "$@" +} + +test_stripflags(){ + log test_stripflags "$@" + # call check_cc to get a fresh TMPO + check_cc <<EOF +int main(void) { return 0; } +EOF + check_cmd $strip $ASMSTRIPFLAGS "$@" $TMPO +} + +check_stripflags(){ + log check_stripflags "$@" + test_stripflags "$@" && add_stripflags "$@" +} + +check_header(){ + log check_header "$@" + header=$1 + shift + disable_safe $header + check_cpp "$@" <<EOF && enable_safe $header +#include <$header> +int x; +EOF +} + +check_header_objcc(){ + log check_header_objcc "$@" + rm -f -- "$TMPO" + header=$1 + shift + disable_safe $header + { + echo "#include <$header>" + echo "int main(void) { return 0; }" + } | check_objcc && check_stat "$TMPO" && enable_safe $headers +} + +check_func(){ + log check_func "$@" + func=$1 + shift + disable $func + check_ld "cc" "$@" <<EOF && enable $func +extern int $func(); +int main(void){ $func(); } +EOF +} + +check_complexfunc(){ + log check_complexfunc "$@" + func=$1 + narg=$2 + shift 2 + test $narg = 2 && args="f, g" || args="f * I" + disable $func + check_ld "cc" "$@" <<EOF && enable $func +#include <complex.h> +#include <math.h> +float foo(complex float f, complex float g) { return $func($args); } +int main(void){ return (int) foo; } +EOF +} + +check_mathfunc(){ + log check_mathfunc "$@" + func=$1 + narg=$2 + shift 2 + test $narg = 2 && args="f, g" || args="f" + disable $func + check_ld "cc" "$@" <<EOF && enable $func +#include <math.h> +float foo(float f, float g) { return $func($args); } +int main(void){ return (int) foo; } +EOF +} + +check_func_headers(){ + log check_func_headers "$@" + headers=$1 + funcs=$2 + shift 2 + { + for hdr in $headers; do + print_include $hdr + done + for func in $funcs; do + echo "long check_$func(void) { return (long) $func; }" + done + echo "int main(void) { return 0; }" + } | check_ld "cc" "$@" && enable $funcs && enable_safe $headers +} + +check_class_headers_cpp(){ + log check_class_headers_cpp "$@" + headers=$1 + classes=$2 + shift 2 + { + for hdr in $headers; do + echo "#include <$hdr>" + done + echo "int main(void) { " + i=1 + for class in $classes; do + echo "$class obj$i;" + i=$(expr $i + 1) + done + echo "return 0; }" + } | check_ld "cxx" "$@" && enable $funcs && enable_safe $headers +} + +check_cpp_condition(){ + log check_cpp_condition "$@" + header=$1 + condition=$2 + shift 2 + check_cpp "$@" <<EOF +#include <$header> +#if !($condition) +#error "unsatisfied condition: $condition" +#endif +EOF +} + +check_lib(){ + log check_lib "$@" + header="$1" + func="$2" + shift 2 + check_header $header && check_func $func "$@" && add_extralibs "$@" +} + +check_lib2(){ + log check_lib2 "$@" + headers="$1" + funcs="$2" + shift 2 + check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@" +} + +check_lib_cpp(){ + log check_lib_cpp "$@" + headers="$1" + classes="$2" + shift 2 + check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@" +} + +check_pkg_config(){ + log check_pkg_config "$@" + pkgandversion="$1" + pkg="${1%% *}" + headers="$2" + funcs="$3" + shift 3 + check_cmd $pkg_config --exists --print-errors $pkgandversion || return + pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg) + pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg) + check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" && + set_safe "${pkg}_cflags" $pkg_cflags && + set_safe "${pkg}_libs" $pkg_libs +} + +check_exec(){ + check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; } +} + +check_exec_crash(){ + code=$(cat) + + # exit() is not async signal safe. _Exit (C99) and _exit (POSIX) + # are safe but may not be available everywhere. Thus we use + # raise(SIGTERM) instead. The check is run in a subshell so we + # can redirect the "Terminated" message from the shell. SIGBUS + # is not defined by standard C so it is used conditionally. + + (check_exec "$@") >> $logfile 2>&1 <<EOF +#include <signal.h> +static void sighandler(int sig){ + raise(SIGTERM); +} +int foo(void){ + $code +} +int (*func_ptr)(void) = foo; +int main(void){ + signal(SIGILL, sighandler); + signal(SIGFPE, sighandler); + signal(SIGSEGV, sighandler); +#ifdef SIGBUS + signal(SIGBUS, sighandler); +#endif + return func_ptr(); +} +EOF +} + +check_type(){ + log check_type "$@" + headers=$1 + type=$2 + shift 2 + disable_safe "$type" + check_code cc "$headers" "$type v" "$@" && enable_safe "$type" +} + +check_struct(){ + log check_struct "$@" + headers=$1 + struct=$2 + member=$3 + shift 3 + disable_safe "${struct}_${member}" + check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" && + enable_safe "${struct}_${member}" +} + +check_builtin(){ + log check_builtin "$@" + name=$1 + headers=$2 + builtin=$3 + shift 3 + disable "$name" + check_code ld "$headers" "$builtin" "cc" "$@" && enable "$name" +} + +check_compile_assert(){ + log check_compile_assert "$@" + name=$1 + headers=$2 + condition=$3 + shift 3 + disable "$name" + check_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name" +} + +require(){ + name="$1" + header="$2" + func="$3" + shift 3 + check_lib $header $func "$@" || die "ERROR: $name not found" +} + +require2(){ + name="$1" + headers="$2" + func="$3" + shift 3 + check_lib2 "$headers" $func "$@" || die "ERROR: $name not found" +} + +require_cpp(){ + name="$1" + headers="$2" + classes="$3" + shift 3 + check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found" +} + +use_pkg_config(){ + pkg="$1" + check_pkg_config "$@" || return 1 + add_cflags $(get_safe "${pkg}_cflags") + add_extralibs $(get_safe "${pkg}_libs") +} + +require_pkg_config(){ + use_pkg_config "$@" || die "ERROR: $pkg not found using pkg-config$pkg_config_fail_message" +} + +require_libfreetype(){ + log require_libfreetype "$@" + pkg="freetype2" + check_cmd $pkg_config --exists --print-errors $pkg \ + || die "ERROR: $pkg not found" + pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg) + pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg) + { + echo "#include <ft2build.h>" + echo "#include FT_FREETYPE_H" + echo "long check_func(void) { return (long) FT_Init_FreeType; }" + echo "int main(void) { return 0; }" + } | check_ld "cc" $pkg_cflags $pkg_libs \ + && set_safe "${pkg}_cflags" $pkg_cflags \ + && set_safe "${pkg}_libs" $pkg_libs \ + || die "ERROR: $pkg not found" + add_cflags $(get_safe "${pkg}_cflags") + add_extralibs $(get_safe "${pkg}_libs") +} + +hostcc_e(){ + eval printf '%s\\n' $HOSTCC_E +} + +hostcc_o(){ + eval printf '%s\\n' $HOSTCC_O +} + +check_host_cc(){ + log check_host_cc "$@" + cat > $TMPC + log_file $TMPC + check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC +} + +check_host_cpp(){ + log check_host_cpp "$@" + cat > $TMPC + log_file $TMPC + check_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC +} + +check_host_cppflags(){ + log check_host_cppflags "$@" + check_host_cc "$@" <<EOF && append host_cppflags "$@" +int x; +EOF +} + +check_host_cflags(){ + log check_host_cflags "$@" + set -- $($host_cflags_filter "$@") + check_host_cc "$@" <<EOF && append host_cflags "$@" +int x; +EOF +} + +check_host_cpp_condition(){ + log check_host_cpp_condition "$@" + header=$1 + condition=$2 + shift 2 + check_host_cpp "$@" <<EOF +#include <$header> +#if !($condition) +#error "unsatisfied condition: $condition" +#endif +EOF +} + +cp_if_changed(){ + cmp -s "$1" "$2" && echo "$2 is unchanged" && return + mkdir -p "$(dirname $2)" + $cp_f "$1" "$2" +} + +# CONFIG_LIST contains configurable options, while HAVE_LIST is for +# system-dependent things. + +AVCODEC_COMPONENTS=" + bsfs + decoders + encoders + hwaccels + parsers +" + +AVDEVICE_COMPONENTS=" + indevs + outdevs +" +AVFILTER_COMPONENTS=" + filters +" +AVFORMAT_COMPONENTS=" + demuxers + muxers + protocols +" + +AVRESAMPLE_COMPONENTS="" +AVUTIL_COMPONENTS="" + +COMPONENT_LIST=" + $AVCODEC_COMPONENTS + $AVDEVICE_COMPONENTS + $AVFILTER_COMPONENTS + $AVFORMAT_COMPONENTS + $AVRESAMPLE_COMPONENTS + $AVUTIL_COMPONENTS +" + +EXAMPLE_LIST=" + avio_reading_example + avio_dir_cmd_example + decoding_encoding_example + demuxing_decoding_example + extract_mvs_example + filter_audio_example + filtering_audio_example + filtering_video_example + metadata_example + muxing_example + qsvdec_example + remuxing_example + resampling_audio_example + scaling_video_example + transcode_aac_example + transcoding_example +" + +EXTERNAL_LIBRARY_LIST=" + avisynth + bzlib + chromaprint + crystalhd + decklink + frei0r + gcrypt + gmp + gnutls + iconv + ladspa + libass + libbluray + libbs2b + libcaca + libcdio + libcelt + libdc1394 + libdcadec + libfaac + libfdk_aac + libflite + libfontconfig + libfreetype + libfribidi + libgme + libgsm + libiec61883 + libilbc + libkvazaar + libmfx + libmodplug + libmp3lame + libnut + libopencore_amrnb + libopencore_amrwb + libopencv + libopenh264 + libopenjpeg + libopus + libpulse + librtmp + librubberband + libschroedinger + libshine + libsmbclient + libsnappy + libsoxr + libspeex + libssh + libtesseract + libtheora + libtwolame + libutvideo + libv4l2 + libvidstab + libvo_amrwbenc + libvorbis + libvpx + libwavpack + libwebp + libx264 + libx265 + libxavs + libxcb + libxcb_shm + libxcb_shape + libxcb_xfixes + libxvid + libzimg + libzmq + libzvbi + lzma + mmal + netcdf + nvenc + openal + opencl + opengl + openssl + schannel + sdl + securetransport + x11grab + xlib + zlib +" + +DOCUMENT_LIST=" + doc + htmlpages + manpages + podpages + txtpages +" + +FEATURE_LIST=" + ftrapv + gray + hardcoded_tables + runtime_cpudetect + safe_bitstream_reader + shared + small + static + swscale_alpha +" + +HWACCEL_LIST=" + d3d11va + dxva2 + vaapi + vda + vdpau + videotoolbox + xvmc +" + +LIBRARY_LIST=" + avcodec + avdevice + avfilter + avformat + avresample + avutil + postproc + swresample + swscale +" + +LICENSE_LIST=" + gpl + nonfree + version3 +" + +PROGRAM_LIST=" + ffplay + ffprobe + ffserver + ffmpeg +" + +SUBSYSTEM_LIST=" + dct + dwt + error_resilience + faan + fast_unaligned + fft + lsp + lzo + mdct + pixelutils + network + rdft +" + +CONFIG_LIST=" + $COMPONENT_LIST + $DOCUMENT_LIST + $EXAMPLE_LIST + $EXTERNAL_LIBRARY_LIST + $FEATURE_LIST + $HWACCEL_LIST + $LICENSE_LIST + $LIBRARY_LIST + $PROGRAM_LIST + $SUBSYSTEM_LIST + fontconfig + incompatible_libav_abi + memalign_hack + memory_poisoning + neon_clobber_test + pic + pod2man + raise_major + thumb + valgrind_backtrace + xmm_clobber_test +" + +THREADS_LIST=" + pthreads + os2threads + w32threads +" + +ATOMICS_LIST=" + atomics_gcc + atomics_suncc + atomics_win32 +" + +ARCH_LIST=" + aarch64 + alpha + arm + avr32 + avr32_ap + avr32_uc + bfin + ia64 + m68k + mips + mips64 + parisc + ppc + ppc64 + s390 + sh4 + sparc + sparc64 + tilegx + tilepro + tomi + x86 + x86_32 + x86_64 +" + +ARCH_EXT_LIST_ARM=" + armv5te + armv6 + armv6t2 + armv8 + neon + vfp + vfpv3 + setend +" + +ARCH_EXT_LIST_MIPS=" + mipsfpu + mips32r2 + mips64r2 + mips32r6 + mips64r6 + mipsdsp + mipsdspr2 + msa +" + +ARCH_EXT_LIST_LOONGSON=" + loongson2 + loongson3 + mmi +" + +ARCH_EXT_LIST_X86_SIMD=" + aesni + amd3dnow + amd3dnowext + avx + avx2 + fma3 + fma4 + mmx + mmxext + sse + sse2 + sse3 + sse4 + sse42 + ssse3 + xop +" + +ARCH_EXT_LIST_PPC=" + altivec + dcbzl + ldbrx + power8 + ppc4xx + vsx +" + +ARCH_EXT_LIST_X86=" + $ARCH_EXT_LIST_X86_SIMD + cpunop + i686 +" + +ARCH_EXT_LIST=" + $ARCH_EXT_LIST_ARM + $ARCH_EXT_LIST_PPC + $ARCH_EXT_LIST_X86 + $ARCH_EXT_LIST_MIPS + $ARCH_EXT_LIST_LOONGSON +" + +ARCH_FEATURES=" + aligned_stack + fast_64bit + fast_clz + fast_cmov + local_aligned_8 + local_aligned_16 + local_aligned_32 + simd_align_16 +" + +BUILTIN_LIST=" + atomic_cas_ptr + atomic_compare_exchange + machine_rw_barrier + MemoryBarrier + mm_empty + rdtsc + sarestart + sync_val_compare_and_swap +" +HAVE_LIST_CMDLINE=" + inline_asm + symver + yasm +" + +HAVE_LIST_PUB=" + bigendian + fast_unaligned + incompatible_libav_abi +" + +HEADERS_LIST=" + alsa_asoundlib_h + altivec_h + arpa_inet_h + asm_types_h + cdio_paranoia_h + cdio_paranoia_paranoia_h + dev_bktr_ioctl_bt848_h + dev_bktr_ioctl_meteor_h + dev_ic_bt8xx_h + dev_video_bktr_ioctl_bt848_h + dev_video_meteor_ioctl_meteor_h + direct_h + dirent_h + dlfcn_h + d3d11_h + dxva_h + ES2_gl_h + gsm_h + io_h + mach_mach_time_h + machine_ioctl_bt848_h + machine_ioctl_meteor_h + malloc_h + opencv2_core_core_c_h + openjpeg_2_1_openjpeg_h + openjpeg_2_0_openjpeg_h + openjpeg_1_5_openjpeg_h + OpenGL_gl3_h + poll_h + sndio_h + soundcard_h + sys_mman_h + sys_param_h + sys_resource_h + sys_select_h + sys_soundcard_h + sys_time_h + sys_un_h + sys_videoio_h + termios_h + udplite_h + unistd_h + valgrind_valgrind_h + windows_h + winsock2_h +" + +INTRINSICS_LIST=" + intrinsics_neon +" + +COMPLEX_FUNCS=" + cabs + cexp +" + +MATH_FUNCS=" + atanf + atan2f + cbrt + cbrtf + copysign + cosf + erf + exp2 + exp2f + expf + hypot + isfinite + isinf + isnan + ldexpf + llrint + llrintf + log2 + log2f + log10f + lrint + lrintf + powf + rint + round + roundf + sinf + trunc + truncf +" + +SYSTEM_FUNCS=" + access + aligned_malloc + arc4random + clock_gettime + closesocket + CommandLineToArgvW + CoTaskMemFree + CryptGenRandom + dlopen + fcntl + flt_lim + fork + getaddrinfo + gethrtime + getopt + GetProcessAffinityMask + GetProcessMemoryInfo + GetProcessTimes + getrusage + GetSystemTimeAsFileTime + gettimeofday + glob + glXGetProcAddress + gmtime_r + inet_aton + isatty + jack_port_get_latency_range + kbhit + localtime_r + lstat + lzo1x_999_compress + mach_absolute_time + MapViewOfFile + memalign + mkstemp + mmap + mprotect + nanosleep + PeekNamedPipe + posix_memalign + pthread_cancel + sched_getaffinity + SetConsoleTextAttribute + SetConsoleCtrlHandler + setmode + setrlimit + Sleep + strerror_r + sysconf + sysctl + usleep + UTGetOSTypeFromString + VirtualAlloc + wglGetProcAddress +" + +TOOLCHAIN_FEATURES=" + as_dn_directive + as_func + as_object_arch + asm_mod_q + attribute_may_alias + attribute_packed + ebp_available + ebx_available + gnu_as + gnu_windres + ibm_asm + inline_asm_direct_symbol_refs + inline_asm_labels + inline_asm_nonlocal_labels + pragma_deprecated + rsync_contimeout + symver_asm_label + symver_gnu_asm + vfp_args + xform_asm + xmm_clobbers +" + +TYPES_LIST=" + CONDITION_VARIABLE_Ptr + socklen_t + struct_addrinfo + struct_group_source_req + struct_ip_mreq_source + struct_ipv6_mreq + struct_pollfd + struct_rusage_ru_maxrss + struct_sctp_event_subscribe + struct_sockaddr_in6 + struct_sockaddr_sa_len + struct_sockaddr_storage + struct_stat_st_mtim_tv_nsec + struct_v4l2_frmivalenum_discrete +" + +HAVE_LIST=" + $ARCH_EXT_LIST + $(add_suffix _external $ARCH_EXT_LIST) + $(add_suffix _inline $ARCH_EXT_LIST) + $ARCH_FEATURES + $ATOMICS_LIST + $BUILTIN_LIST + $COMPLEX_FUNCS + $HAVE_LIST_CMDLINE + $HAVE_LIST_PUB + $HEADERS_LIST + $INTRINSICS_LIST + $MATH_FUNCS + $SYSTEM_FUNCS + $THREADS_LIST + $TOOLCHAIN_FEATURES + $TYPES_LIST + atomics_native + dos_paths + dxva2_lib + dxva2api_cobj + libc_msvcrt + libdc1394_1 + libdc1394_2 + makeinfo + makeinfo_html + perl + pod2man + sdl + section_data_rel_ro + texi2html + threads + vaapi_x11 + vdpau_x11 + winrt + xlib +" + +# options emitted with CONFIG_ prefix but not available on the command line +CONFIG_EXTRA=" + aandcttables + ac3dsp + audio_frame_queue + audiodsp + blockdsp + bswapdsp + cabac + dirac_parse + dvprofile + exif + faandct + faanidct + fdctdsp + flacdsp + fmtconvert + frame_thread_encoder + g722dsp + golomb + gplv3 + h263dsp + h264chroma + h264dsp + h264pred + h264qpel + hpeldsp + huffman + huffyuvdsp + huffyuvencdsp + idctdsp + iirfilter + imdct15 + intrax8 + ividsp + jpegtables + lgplv3 + libx262 + llauddsp + llviddsp + lpc + lzf + me_cmp + mpeg_er + mpegaudio + mpegaudiodsp + mpegvideo + mpegvideoenc + mss34dsp + pixblockdsp + qpeldsp + qsv + qsvdec + qsvenc + rangecoder + riffdec + riffenc + rtpdec + rtpenc_chain + rv34dsp + sinewin + snappy + startcode + texturedsp + texturedspenc + tpeldsp + videodsp + vp3dsp + vp56dsp + vp8dsp + wma_freqs + wmv2dsp +" + +CMDLINE_SELECT=" + $ARCH_EXT_LIST + $CONFIG_LIST + $HAVE_LIST_CMDLINE + $THREADS_LIST + asm + cross_compile + debug + extra_warnings + logging + lto + optimizations + rpath + stripping +" + +PATHS_LIST=" + bindir + datadir + docdir + incdir + libdir + mandir + pkgconfigdir + prefix + shlibdir +" + +CMDLINE_SET=" + $PATHS_LIST + ar + arch + as + assert_level + build_suffix + cc + objcc + cpu + cross_prefix + custom_allocator + cxx + dep_cc + doxygen + env + extra_version + gas + host_cc + host_cflags + host_ld + host_ldflags + host_libs + host_os + install + ld + logfile + malloc_prefix + nm + optflags + pkg_config + pkg_config_flags + progs_suffix + random_seed + ranlib + samples + strip + sws_max_filter_size + sysinclude + sysroot + target_exec + target_os + target_path + target_samples + tempprefix + toolchain + valgrind + yasmexe +" + +CMDLINE_APPEND=" + extra_cflags + extra_cxxflags + extra_objcflags + host_cppflags +" + +# code dependency declarations + +# architecture extensions + +armv5te_deps="arm" +armv6_deps="arm" +armv6t2_deps="arm" +armv8_deps="aarch64" +neon_deps_any="aarch64 arm" +intrinsics_neon_deps="neon" +vfp_deps_any="aarch64 arm" +vfpv3_deps="vfp" +setend_deps="arm" + +map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM + +mipsfpu_deps="mips" +mipsdsp_deps="mips" +mipsdspr2_deps="mips" +mips32r2_deps="mips" +mips32r6_deps="mips" +mips64r2_deps="mips" +mips64r6_deps="mips" +msa_deps="mips" +mmi_deps="mips" + +altivec_deps="ppc" +dcbzl_deps="ppc" +ldbrx_deps="ppc" +ppc4xx_deps="ppc" +vsx_deps="altivec" +power8_deps="vsx" + +cpunop_deps="i686" +x86_64_select="i686" +x86_64_suggest="fast_cmov" + +amd3dnow_deps="mmx" +amd3dnowext_deps="amd3dnow" +i686_deps="x86" +mmx_deps="x86" +mmxext_deps="mmx" +sse_deps="mmxext" +sse2_deps="sse" +sse3_deps="sse2" +ssse3_deps="sse3" +sse4_deps="ssse3" +sse42_deps="sse4" +aesni_deps="sse42" +avx_deps="sse42" +xop_deps="avx" +fma3_deps="avx" +fma4_deps="avx" +avx2_deps="avx" + +mmx_external_deps="yasm" +mmx_inline_deps="inline_asm" +mmx_suggest="mmx_external mmx_inline" + +for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do + eval dep=\$${ext}_deps + eval ${ext}_external_deps='"${dep}_external"' + eval ${ext}_inline_deps='"${dep}_inline"' + eval ${ext}_suggest='"${ext}_external ${ext}_inline"' +done + +aligned_stack_if_any="aarch64 ppc x86" +fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64" +fast_clz_if_any="aarch64 alpha avr32 mips ppc x86" +fast_unaligned_if_any="aarch64 ppc x86" +simd_align_16_if_any="altivec neon sse" + +# system capabilities +symver_if_any="symver_asm_label symver_gnu_asm" +valgrind_backtrace_deps="!optimizations valgrind_valgrind_h" + +# threading support +atomics_gcc_if_any="sync_val_compare_and_swap atomic_compare_exchange" +atomics_suncc_if="atomic_cas_ptr machine_rw_barrier" +atomics_win32_if="MemoryBarrier" +atomics_native_if_any="$ATOMICS_LIST" +w32threads_deps="atomics_native" +threads_if_any="$THREADS_LIST" + +# subsystems +dct_select="rdft" +dirac_parse_select="golomb" +error_resilience_select="me_cmp" +faandct_deps="faan fdctdsp" +faanidct_deps="faan idctdsp" +frame_thread_encoder_deps="encoders threads" +intrax8_select="error_resilience" +mdct_select="fft" +me_cmp_select="fdctdsp idctdsp pixblockdsp" +mpeg_er_select="error_resilience" +mpegaudio_select="mpegaudiodsp" +mpegaudiodsp_select="dct" +mpegvideo_select="blockdsp h264chroma hpeldsp idctdsp me_cmp mpeg_er videodsp" +mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp" +qsvdec_select="qsv" +qsvenc_select="qsv" +rdft_select="fft" + +# decoders / encoders +aac_decoder_select="imdct15 mdct sinewin" +aac_fixed_decoder_select="mdct sinewin" +aac_encoder_select="audio_frame_queue iirfilter lpc mdct sinewin" +aac_latm_decoder_select="aac_decoder aac_latm_parser" +ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct" +ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct" +ac3_encoder_select="ac3dsp audiodsp mdct me_cmp" +ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp" +adpcm_g722_decoder_select="g722dsp" +adpcm_g722_encoder_select="g722dsp" +aic_decoder_select="golomb idctdsp" +alac_encoder_select="lpc" +als_decoder_select="bswapdsp" +amrnb_decoder_select="lsp" +amrwb_decoder_select="lsp" +amv_decoder_select="sp5x_decoder exif" +amv_encoder_select="aandcttables jpegtables mpegvideoenc" +ape_decoder_select="bswapdsp llauddsp" +apng_decoder_select="zlib" +apng_encoder_select="huffyuvencdsp zlib" +asv1_decoder_select="blockdsp bswapdsp idctdsp" +asv1_encoder_select="bswapdsp fdctdsp pixblockdsp" +asv2_decoder_select="blockdsp bswapdsp idctdsp" +asv2_encoder_select="bswapdsp fdctdsp pixblockdsp" +atrac1_decoder_select="mdct sinewin" +atrac3_decoder_select="mdct" +atrac3p_decoder_select="mdct sinewin" +avrn_decoder_select="exif jpegtables" +bink_decoder_select="blockdsp hpeldsp" +binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs" +binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs" +cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp" +cllc_decoder_select="bswapdsp" +comfortnoise_encoder_select="lpc" +cook_decoder_select="audiodsp mdct sinewin" +cscd_decoder_select="lzo" +cscd_decoder_suggest="zlib" +dca_decoder_select="mdct" +dds_decoder_select="texturedsp" +dirac_decoder_select="dirac_parse dwt golomb videodsp mpegvideoenc" +dnxhd_decoder_select="blockdsp idctdsp" +dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp" +dvvideo_decoder_select="dvprofile idctdsp" +dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp" +dxa_decoder_select="zlib" +dxv_decoder_select="lzf texturedsp" +eac3_decoder_select="ac3_decoder" +eac3_encoder_select="ac3_encoder" +eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo" +eatgq_decoder_select="aandcttables" +eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder" +exr_decoder_select="zlib" +ffv1_decoder_select="golomb rangecoder" +ffv1_encoder_select="rangecoder" +ffvhuff_decoder_select="huffyuv_decoder" +ffvhuff_encoder_select="huffyuv_encoder" +fic_decoder_select="golomb" +flac_decoder_select="flacdsp golomb" +flac_encoder_select="bswapdsp flacdsp golomb lpc" +flashsv2_decoder_select="zlib" +flashsv2_encoder_select="zlib" +flashsv_decoder_select="zlib" +flashsv_encoder_select="zlib" +flv_decoder_select="h263_decoder" +flv_encoder_select="h263_encoder" +fourxm_decoder_select="blockdsp bswapdsp" +fraps_decoder_select="bswapdsp huffman" +g2m_decoder_select="blockdsp idctdsp jpegtables zlib" +g729_decoder_select="audiodsp" +h261_decoder_select="mpegvideo" +h261_encoder_select="aandcttables mpegvideoenc" +h263_decoder_select="h263_parser h263dsp mpegvideo qpeldsp" +h263_encoder_select="aandcttables h263dsp mpegvideoenc" +h263i_decoder_select="h263_decoder" +h263p_decoder_select="h263_decoder" +h263p_encoder_select="h263_encoder" +h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp" +h264_decoder_suggest="error_resilience" +h264_qsv_decoder_deps="libmfx" +h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec h264_qsv_hwaccel" +h264_qsv_encoder_deps="libmfx" +h264_qsv_encoder_select="qsvenc" +hap_decoder_select="snappy texturedsp" +hap_encoder_deps="libsnappy" +hap_encoder_select="texturedspenc" +hevc_decoder_select="bswapdsp cabac golomb videodsp" +hevc_qsv_decoder_deps="libmfx" +hevc_qsv_decoder_select="hevc_mp4toannexb_bsf hevc_parser qsvdec hevc_qsv_hwaccel" +hevc_qsv_encoder_deps="libmfx" +hevc_qsv_encoder_select="qsvenc" +huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp" +huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llviddsp" +iac_decoder_select="imc_decoder" +imc_decoder_select="bswapdsp fft mdct sinewin" +indeo3_decoder_select="hpeldsp" +indeo4_decoder_select="ividsp" +indeo5_decoder_select="ividsp" +interplay_video_decoder_select="hpeldsp" +jpegls_decoder_select="golomb mjpeg_decoder" +jpegls_encoder_select="golomb" +jv_decoder_select="blockdsp" +lagarith_decoder_select="huffyuvdsp" +ljpeg_encoder_select="aandcttables idctdsp jpegtables" +loco_decoder_select="golomb" +mdec_decoder_select="blockdsp idctdsp mpegvideo" +metasound_decoder_select="lsp mdct sinewin" +mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp" +mjpeg_decoder_select="blockdsp hpeldsp exif idctdsp jpegtables" +mjpeg_encoder_select="aandcttables jpegtables mpegvideoenc" +mjpegb_decoder_select="mjpeg_decoder" +mlp_decoder_select="mlp_parser" +motionpixels_decoder_select="bswapdsp" +mp1_decoder_select="mpegaudio" +mp1float_decoder_select="mpegaudio" +mp2_decoder_select="mpegaudio" +mp2float_decoder_select="mpegaudio" +mp3_decoder_select="mpegaudio" +mp3adu_decoder_select="mpegaudio" +mp3adufloat_decoder_select="mpegaudio" +mp3float_decoder_select="mpegaudio" +mp3on4_decoder_select="mpegaudio" +mp3on4float_decoder_select="mpegaudio" +mpc7_decoder_select="bswapdsp mpegaudiodsp" +mpc8_decoder_select="mpegaudiodsp" +mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h" +mpeg_xvmc_decoder_select="mpeg2video_decoder" +mpegvideo_decoder_select="mpegvideo" +mpeg1video_decoder_select="mpegvideo" +mpeg1video_encoder_select="aandcttables mpegvideoenc h263dsp" +mpeg2video_decoder_select="mpegvideo" +mpeg2video_encoder_select="aandcttables mpegvideoenc h263dsp" +mpeg2_qsv_decoder_deps="libmfx" +mpeg2_qsv_decoder_select="qsvdec mpeg2_qsv_hwaccel" +mpeg2_qsv_encoder_deps="libmfx" +mpeg2_qsv_encoder_select="qsvenc" +mpeg4_decoder_select="h263_decoder mpeg4video_parser" +mpeg4_encoder_select="h263_encoder" +msa1_decoder_select="mss34dsp" +msmpeg4v1_decoder_select="h263_decoder" +msmpeg4v2_decoder_select="h263_decoder" +msmpeg4v2_encoder_select="h263_encoder" +msmpeg4v3_decoder_select="h263_decoder" +msmpeg4v3_encoder_select="h263_encoder" +mss2_decoder_select="vc1_decoder" +mts2_decoder_select="mss34dsp" +mxpeg_decoder_select="mjpeg_decoder" +nellymoser_decoder_select="mdct sinewin" +nellymoser_encoder_select="audio_frame_queue mdct sinewin" +nuv_decoder_select="idctdsp lzo" +on2avc_decoder_select="mdct" +opus_decoder_deps="swresample" +opus_decoder_select="imdct15" +png_decoder_select="zlib" +png_encoder_select="huffyuvencdsp zlib" +prores_decoder_select="blockdsp idctdsp" +prores_encoder_select="fdctdsp" +qcelp_decoder_select="lsp" +qdm2_decoder_select="mdct rdft mpegaudiodsp" +ra_144_decoder_select="audiodsp" +ra_144_encoder_select="audio_frame_queue lpc audiodsp" +ralf_decoder_select="golomb" +rawvideo_decoder_select="bswapdsp" +rscc_decoder_select="zlib" +rtjpeg_decoder_select="me_cmp" +rv10_decoder_select="h263_decoder" +rv10_encoder_select="h263_encoder" +rv20_decoder_select="h263_decoder" +rv20_encoder_select="h263_encoder" +rv30_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp" +rv40_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp" +screenpresso_decoder_select="zlib" +shorten_decoder_select="golomb" +sipr_decoder_select="lsp" +snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp" +snow_encoder_select="aandcttables dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder" +sonic_decoder_select="golomb rangecoder" +sonic_encoder_select="golomb rangecoder" +sonic_ls_encoder_select="golomb rangecoder" +sp5x_decoder_select="mjpeg_decoder" +svq1_decoder_select="hpeldsp" +svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc" +svq3_decoder_select="h264_decoder hpeldsp tpeldsp" +svq3_decoder_suggest="zlib" +tak_decoder_select="audiodsp" +tdsc_decoder_select="zlib mjpeg_decoder" +theora_decoder_select="vp3_decoder" +thp_decoder_select="mjpeg_decoder" +tiff_decoder_suggest="zlib lzma" +tiff_encoder_suggest="zlib" +truehd_decoder_select="mlp_parser" +truemotion2_decoder_select="bswapdsp" +truespeech_decoder_select="bswapdsp" +tscc_decoder_select="zlib" +twinvq_decoder_select="mdct lsp sinewin" +txd_decoder_select="texturedsp" +utvideo_decoder_select="bswapdsp" +utvideo_encoder_select="bswapdsp huffman huffyuvencdsp" +vble_decoder_select="huffyuvdsp" +vc1_decoder_select="blockdsp h263_decoder h264qpel intrax8 qpeldsp startcode" +vc1_qsv_decoder_deps="libmfx" +vc1_qsv_decoder_select="qsvdec vc1_qsv_hwaccel" +vc1image_decoder_select="vc1_decoder" +vorbis_decoder_select="mdct" +vorbis_encoder_select="mdct" +vp3_decoder_select="hpeldsp vp3dsp videodsp" +vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp vp56dsp" +vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp vp56dsp" +vp6a_decoder_select="vp6_decoder" +vp6f_decoder_select="vp6_decoder" +vp7_decoder_select="h264pred videodsp vp8dsp" +vp8_decoder_select="h264pred videodsp vp8dsp" +vp9_decoder_select="videodsp vp9_parser" +webp_decoder_select="vp8_decoder exif" +wmalossless_decoder_select="llauddsp" +wmapro_decoder_select="mdct sinewin wma_freqs" +wmav1_decoder_select="mdct sinewin wma_freqs" +wmav1_encoder_select="mdct sinewin wma_freqs" +wmav2_decoder_select="mdct sinewin wma_freqs" +wmav2_encoder_select="mdct sinewin wma_freqs" +wmavoice_decoder_select="lsp rdft dct mdct sinewin" +wmv1_decoder_select="h263_decoder" +wmv1_encoder_select="h263_encoder" +wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp wmv2dsp" +wmv2_encoder_select="h263_encoder wmv2dsp" +wmv3_decoder_select="vc1_decoder" +wmv3image_decoder_select="wmv3_decoder" +xma1_decoder_select="wmapro_decoder" +xma2_decoder_select="wmapro_decoder" +zerocodec_decoder_select="zlib" +zlib_decoder_select="zlib" +zlib_encoder_select="zlib" +zmbv_decoder_select="zlib" +zmbv_encoder_select="zlib" + +# hardware accelerators +crystalhd_deps="libcrystalhd_libcrystalhd_if_h" +d3d11va_deps="d3d11_h dxva_h ID3D11VideoDecoder ID3D11VideoContext" +dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode" +vaapi_deps="va_va_h" +vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads" +vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore" +vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" +videotoolbox_deps="VideoToolbox_VideoToolbox_h pthreads" +videotoolbox_extralibs="-framework CoreFoundation -framework VideoToolbox -framework CoreMedia -framework QuartzCore -framework CoreVideo" +xvmc_deps="X11_extensions_XvMClib_h" + +h263_vaapi_hwaccel_deps="vaapi" +h263_vaapi_hwaccel_select="h263_decoder" +h263_videotoolbox_hwaccel_deps="videotoolbox" +h263_videotoolbox_hwaccel_select="h263_decoder" +h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser" +h264_d3d11va_hwaccel_deps="d3d11va" +h264_d3d11va_hwaccel_select="h264_decoder" +h264_dxva2_hwaccel_deps="dxva2" +h264_dxva2_hwaccel_select="h264_decoder" +h264_mmal_decoder_deps="mmal" +h264_mmal_decoder_select="mmal" +h264_mmal_hwaccel_deps="mmal" +h264_qsv_hwaccel_deps="libmfx" +h264_vaapi_hwaccel_deps="vaapi" +h264_vaapi_hwaccel_select="h264_decoder" +h264_vda_decoder_deps="vda" +h264_vda_decoder_select="h264_decoder" +h264_vda_hwaccel_deps="vda" +h264_vda_hwaccel_select="h264_decoder" +h264_vda_old_hwaccel_deps="vda" +h264_vda_old_hwaccel_select="h264_decoder" +h264_vdpau_decoder_deps="vdpau" +h264_vdpau_decoder_select="h264_decoder" +h264_vdpau_hwaccel_deps="vdpau" +h264_vdpau_hwaccel_select="h264_decoder" +h264_videotoolbox_hwaccel_deps="videotoolbox" +h264_videotoolbox_hwaccel_select="h264_decoder" +hevc_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_HEVC" +hevc_d3d11va_hwaccel_select="hevc_decoder" +hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" +hevc_dxva2_hwaccel_select="hevc_decoder" +hevc_qsv_hwaccel_deps="libmfx" +hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" +hevc_vaapi_hwaccel_select="hevc_decoder" +hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" +hevc_vdpau_hwaccel_select="hevc_decoder" +mpeg_vdpau_decoder_deps="vdpau" +mpeg_vdpau_decoder_select="mpeg2video_decoder" +mpeg_xvmc_hwaccel_deps="xvmc" +mpeg_xvmc_hwaccel_select="mpeg2video_decoder" +mpeg1_vdpau_decoder_deps="vdpau" +mpeg1_vdpau_decoder_select="mpeg1video_decoder" +mpeg1_vdpau_hwaccel_deps="vdpau" +mpeg1_vdpau_hwaccel_select="mpeg1video_decoder" +mpeg1_videotoolbox_hwaccel_deps="videotoolbox" +mpeg1_videotoolbox_hwaccel_select="mpeg1video_decoder" +mpeg1_xvmc_hwaccel_deps="xvmc" +mpeg1_xvmc_hwaccel_select="mpeg1video_decoder" +mpeg2_crystalhd_decoder_select="crystalhd" +mpeg2_d3d11va_hwaccel_deps="d3d11va" +mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder" +mpeg2_dxva2_hwaccel_deps="dxva2" +mpeg2_dxva2_hwaccel_select="mpeg2video_decoder" +mpeg2_mmal_decoder_deps="mmal" +mpeg2_mmal_decoder_select="mmal" +mpeg2_mmal_hwaccel_deps="mmal" +mpeg2_qsv_hwaccel_deps="libmfx" +mpeg2_qsv_hwaccel_select="qsvdec_mpeg2" +mpeg2_vaapi_hwaccel_deps="vaapi" +mpeg2_vaapi_hwaccel_select="mpeg2video_decoder" +mpeg2_vdpau_hwaccel_deps="vdpau" +mpeg2_vdpau_hwaccel_select="mpeg2video_decoder" +mpeg2_videotoolbox_hwaccel_deps="videotoolbox" +mpeg2_videotoolbox_hwaccel_select="mpeg2video_decoder" +mpeg2_xvmc_hwaccel_deps="xvmc" +mpeg2_xvmc_hwaccel_select="mpeg2video_decoder" +mpeg4_crystalhd_decoder_select="crystalhd" +mpeg4_mmal_decoder_deps="mmal" +mpeg4_mmal_decoder_select="mmal" +mpeg4_mmal_hwaccel_deps="mmal" +mpeg4_vaapi_hwaccel_deps="vaapi" +mpeg4_vaapi_hwaccel_select="mpeg4_decoder" +mpeg4_vdpau_decoder_deps="vdpau" +mpeg4_vdpau_decoder_select="mpeg4_decoder" +mpeg4_vdpau_hwaccel_deps="vdpau" +mpeg4_vdpau_hwaccel_select="mpeg4_decoder" +mpeg4_videotoolbox_hwaccel_deps="videotoolbox" +mpeg4_videotoolbox_hwaccel_select="mpeg4_decoder" +msmpeg4_crystalhd_decoder_select="crystalhd" +vc1_crystalhd_decoder_select="crystalhd" +vc1_d3d11va_hwaccel_deps="d3d11va" +vc1_d3d11va_hwaccel_select="vc1_decoder" +vc1_dxva2_hwaccel_deps="dxva2" +vc1_dxva2_hwaccel_select="vc1_decoder" +vc1_mmal_decoder_deps="mmal" +vc1_mmal_decoder_select="mmal" +vc1_mmal_hwaccel_deps="mmal" +vc1_qsv_hwaccel_deps="libmfx" +vc1_qsv_hwaccel_select="qsvdec_vc1" +vc1_vaapi_hwaccel_deps="vaapi" +vc1_vaapi_hwaccel_select="vc1_decoder" +vc1_vdpau_decoder_deps="vdpau" +vc1_vdpau_decoder_select="vc1_decoder" +vc1_vdpau_hwaccel_deps="vdpau" +vc1_vdpau_hwaccel_select="vc1_decoder" +vp9_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_VP9" +vp9_d3d11va_hwaccel_select="vp9_decoder" +vp9_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_VP9" +vp9_dxva2_hwaccel_select="vp9_decoder" +vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9" +vp9_vaapi_hwaccel_select="vp9_decoder" +wmv3_crystalhd_decoder_select="crystalhd" +wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel" +wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel" +wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel" +wmv3_vdpau_decoder_select="vc1_vdpau_decoder" +wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel" + +# parsers +h264_parser_select="h264_decoder" +hevc_parser_select="golomb" +mpegvideo_parser_select="mpegvideo" +mpeg4video_parser_select="h263dsp mpegvideo qpeldsp" +vc1_parser_select="mpegvideo startcode vc1_decoder" + +# bitstream_filters +mjpeg2jpeg_bsf_select="jpegtables" + +# external libraries +chromaprint_muxer_deps="chromaprint" +libcelt_decoder_deps="libcelt" +libdcadec_decoder_deps="libdcadec" +libfaac_encoder_deps="libfaac" +libfaac_encoder_select="audio_frame_queue" +libfdk_aac_decoder_deps="libfdk_aac" +libfdk_aac_encoder_deps="libfdk_aac" +libfdk_aac_encoder_select="audio_frame_queue" +libgme_demuxer_deps="libgme" +libgsm_decoder_deps="libgsm" +libgsm_encoder_deps="libgsm" +libgsm_ms_decoder_deps="libgsm" +libgsm_ms_encoder_deps="libgsm" +libilbc_decoder_deps="libilbc" +libilbc_encoder_deps="libilbc" +libkvazaar_encoder_deps="libkvazaar" +libmodplug_demuxer_deps="libmodplug" +libmp3lame_encoder_deps="libmp3lame" +libmp3lame_encoder_select="audio_frame_queue" +libopencore_amrnb_decoder_deps="libopencore_amrnb" +libopencore_amrnb_encoder_deps="libopencore_amrnb" +libopencore_amrnb_encoder_select="audio_frame_queue" +libopencore_amrwb_decoder_deps="libopencore_amrwb" +libopenh264_encoder_deps="libopenh264" +libopenjpeg_decoder_deps="libopenjpeg" +libopenjpeg_encoder_deps="libopenjpeg" +libopus_decoder_deps="libopus" +libopus_encoder_deps="libopus" +libopus_encoder_select="audio_frame_queue" +libschroedinger_decoder_deps="libschroedinger" +libschroedinger_encoder_deps="libschroedinger" +libshine_encoder_deps="libshine" +libshine_encoder_select="audio_frame_queue" +libspeex_decoder_deps="libspeex" +libspeex_encoder_deps="libspeex" +libspeex_encoder_select="audio_frame_queue" +libtheora_encoder_deps="libtheora" +libtwolame_encoder_deps="libtwolame" +libutvideo_decoder_deps="libutvideo" +libutvideo_encoder_deps="libutvideo" +libvo_amrwbenc_encoder_deps="libvo_amrwbenc" +libvorbis_decoder_deps="libvorbis" +libvorbis_encoder_deps="libvorbis" +libvorbis_encoder_select="audio_frame_queue" +libvpx_vp8_decoder_deps="libvpx" +libvpx_vp8_encoder_deps="libvpx" +libvpx_vp9_decoder_deps="libvpx" +libvpx_vp9_encoder_deps="libvpx" +libwavpack_encoder_deps="libwavpack" +libwebp_encoder_deps="libwebp" +libwebp_anim_encoder_deps="libwebp" +libx262_encoder_deps="libx262" +libx264_encoder_deps="libx264" +libx264rgb_encoder_deps="libx264" +libx264rgb_encoder_select="libx264_encoder" +libx265_encoder_deps="libx265" +libxavs_encoder_deps="libxavs" +libxvid_encoder_deps="libxvid" +libzvbi_teletext_decoder_deps="libzvbi" +nvenc_encoder_deps="nvenc" +nvenc_h264_encoder_deps="nvenc" +nvenc_hevc_encoder_deps="nvenc" + +# demuxers / muxers +ac3_demuxer_select="ac3_parser" +asf_demuxer_select="riffdec" +asf_o_demuxer_select="riffdec" +asf_muxer_select="riffenc" +asf_stream_muxer_select="asf_muxer" +avi_demuxer_select="riffdec exif" +avi_muxer_select="riffenc" +avisynth_demuxer_deps="avisynth" +avisynth_demuxer_select="riffdec" +caf_demuxer_select="riffdec" +dash_muxer_select="mp4_muxer" +dirac_demuxer_select="dirac_parser" +dts_demuxer_select="dca_parser" +dtshd_demuxer_select="dca_parser" +dv_demuxer_select="dvprofile" +dv_muxer_select="dvprofile" +dxa_demuxer_select="riffdec" +eac3_demuxer_select="ac3_parser" +f4v_muxer_select="mov_muxer" +flac_demuxer_select="flac_parser" +hds_muxer_select="flv_muxer" +hls_muxer_select="mpegts_muxer" +image2_alias_pix_demuxer_select="image2_demuxer" +image2_brender_pix_demuxer_select="image2_demuxer" +ipod_muxer_select="mov_muxer" +ismv_muxer_select="mov_muxer" +libnut_demuxer_deps="libnut" +libnut_muxer_deps="libnut" +matroska_audio_muxer_select="matroska_muxer" +matroska_demuxer_select="riffdec" +matroska_demuxer_suggest="bzlib lzo zlib" +matroska_muxer_select="riffenc" +mmf_muxer_select="riffenc" +mov_demuxer_select="riffdec" +mov_demuxer_suggest="zlib" +mov_muxer_select="riffenc rtpenc_chain" +mp3_demuxer_select="mpegaudio_parser" +mp4_muxer_select="mov_muxer" +mpegts_muxer_select="adts_muxer latm_muxer" +mpegtsraw_demuxer_select="mpegts_demuxer" +mxf_d10_muxer_select="mxf_muxer" +mxf_opatom_muxer_select="mxf_muxer" +nut_muxer_select="riffenc" +nuv_demuxer_select="riffdec" +oga_muxer_select="ogg_muxer" +ogg_demuxer_select="dirac_parse" +opus_muxer_select="ogg_muxer" +psp_muxer_select="mov_muxer" +rtp_demuxer_select="sdp_demuxer" +rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol" +rtsp_demuxer_select="http_protocol rtpdec" +rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain" +sap_demuxer_select="sdp_demuxer" +sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain" +sdp_demuxer_select="rtpdec" +smoothstreaming_muxer_select="ismv_muxer" +spdif_muxer_select="aac_parser" +spx_muxer_select="ogg_muxer" +swf_demuxer_suggest="zlib" +tak_demuxer_select="tak_parser" +tg2_muxer_select="mov_muxer" +tgp_muxer_select="mov_muxer" +vobsub_demuxer_select="mpegps_demuxer" +w64_demuxer_select="wav_demuxer" +w64_muxer_select="wav_muxer" +wav_demuxer_select="riffdec" +wav_muxer_select="riffenc" +webm_muxer_select="riffenc" +wtv_demuxer_select="riffdec" +wtv_muxer_select="riffenc" +xmv_demuxer_select="riffdec" +xwma_demuxer_select="riffdec" + +# indevs / outdevs +alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp" +alsa_outdev_deps="alsa_asoundlib_h" +avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia" +avfoundation_indev_select="avfoundation" +bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h" +caca_outdev_deps="libcaca" +decklink_indev_deps="decklink pthreads" +decklink_indev_extralibs="-lstdc++" +decklink_outdev_deps="decklink pthreads" +decklink_outdev_extralibs="-lstdc++" +dshow_indev_deps="IBaseFilter" +dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi" +dv1394_indev_deps="dv1394" +dv1394_indev_select="dv_demuxer" +fbdev_indev_deps="linux_fb_h" +fbdev_outdev_deps="linux_fb_h" +gdigrab_indev_deps="CreateDIBSection" +gdigrab_indev_extralibs="-lgdi32" +gdigrab_indev_select="bmp_decoder" +iec61883_indev_deps="libiec61883" +jack_indev_deps="jack_jack_h sem_timedwait" +lavfi_indev_deps="avfilter" +libcdio_indev_deps="libcdio" +libdc1394_indev_deps="libdc1394" +libv4l2_indev_deps="libv4l2" +openal_indev_deps="openal" +opengl_outdev_deps="opengl" +oss_indev_deps_any="soundcard_h sys_soundcard_h" +oss_outdev_deps_any="soundcard_h sys_soundcard_h" +pulse_indev_deps="libpulse" +pulse_outdev_deps="libpulse" +qtkit_indev_extralibs="-framework QTKit -framework Foundation -framework QuartzCore" +qtkit_indev_select="qtkit" +sdl_outdev_deps="sdl" +sndio_indev_deps="sndio_h" +sndio_outdev_deps="sndio_h" +v4l_indev_deps="linux_videodev_h" +v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" +v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h" +vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines" +vfwcap_indev_extralibs="-lavicap32" +x11grab_indev_deps="x11grab" +x11grab_xcb_indev_deps="libxcb" +xv_outdev_deps="X11_extensions_Xvlib_h XvGetPortAttribute" +xv_outdev_extralibs="-lXv -lX11 -lXext" + +# protocols +async_protocol_deps="threads" +bluray_protocol_deps="libbluray" +ffrtmpcrypt_protocol_deps="!librtmp_protocol" +ffrtmpcrypt_protocol_deps_any="gcrypt gmp openssl" +ffrtmpcrypt_protocol_select="tcp_protocol" +ffrtmphttp_protocol_deps="!librtmp_protocol" +ffrtmphttp_protocol_select="http_protocol" +ftp_protocol_select="tcp_protocol" +gopher_protocol_select="network" +http_protocol_select="tcp_protocol" +httpproxy_protocol_select="tcp_protocol" +https_protocol_select="tls_protocol" +icecast_protocol_select="http_protocol" +librtmp_protocol_deps="librtmp" +librtmpe_protocol_deps="librtmp" +librtmps_protocol_deps="librtmp" +librtmpt_protocol_deps="librtmp" +librtmpte_protocol_deps="librtmp" +libsmbclient_protocol_deps="libsmbclient gplv3" +libssh_protocol_deps="libssh" +mmsh_protocol_select="http_protocol" +mmst_protocol_select="network" +rtmp_protocol_deps="!librtmp_protocol" +rtmp_protocol_select="tcp_protocol" +rtmpe_protocol_select="ffrtmpcrypt_protocol" +rtmps_protocol_deps="!librtmp_protocol" +rtmps_protocol_select="tls_protocol" +rtmpt_protocol_select="ffrtmphttp_protocol" +rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol" +rtmpts_protocol_select="ffrtmphttp_protocol https_protocol" +rtp_protocol_select="udp_protocol" +sctp_protocol_deps="struct_sctp_event_subscribe" +sctp_protocol_select="network" +srtp_protocol_select="rtp_protocol" +tcp_protocol_select="network" +tls_gnutls_protocol_deps="gnutls !tls_schannel_protocol !tls_securetransport_protocol" +tls_gnutls_protocol_select="tcp_protocol" +tls_openssl_protocol_deps="openssl !tls_schannel_protocol !tls_securetransport_protocol !tls_gnutls_protocol" +tls_openssl_protocol_select="tcp_protocol" +tls_schannel_protocol_deps="schannel" +tls_schannel_protocol_select="tcp_protocol" +tls_securetransport_protocol_deps="securetransport" +tls_securetransport_protocol_select="tcp_protocol" +tls_protocol_deps_any="tls_schannel_protocol tls_securetransport_protocol tls_gnutls_protocol tls_openssl_protocol" +udp_protocol_select="network" +udplite_protocol_select="network" +unix_protocol_deps="sys_un_h" +unix_protocol_select="network" + +# filters +afftfilt_filter_deps="avcodec" +afftfilt_filter_select="fft" +amovie_filter_deps="avcodec avformat" +aresample_filter_deps="swresample" +ass_filter_deps="libass" +asyncts_filter_deps="avresample" +atempo_filter_deps="avcodec" +atempo_filter_select="rdft" +azmq_filter_deps="libzmq" +blackframe_filter_deps="gpl" +boxblur_filter_deps="gpl" +bs2b_filter_deps="libbs2b" +colormatrix_filter_deps="gpl" +cover_rect_filter_deps="avcodec avformat gpl" +cropdetect_filter_deps="gpl" +delogo_filter_deps="gpl" +deshake_filter_select="pixelutils" +drawtext_filter_deps="libfreetype" +ebur128_filter_deps="gpl" +eq_filter_deps="gpl" +fftfilt_filter_deps="avcodec" +fftfilt_filter_select="rdft" +find_rect_filter_deps="avcodec avformat gpl" +flite_filter_deps="libflite" +frei0r_filter_deps="frei0r dlopen" +frei0r_src_filter_deps="frei0r dlopen" +fspp_filter_deps="gpl" +geq_filter_deps="gpl" +histeq_filter_deps="gpl" +hqdn3d_filter_deps="gpl" +interlace_filter_deps="gpl" +kerndeint_filter_deps="gpl" +ladspa_filter_deps="ladspa dlopen" +mcdeint_filter_deps="avcodec gpl" +movie_filter_deps="avcodec avformat" +mpdecimate_filter_deps="gpl" +mpdecimate_filter_select="pixelutils" +mptestsrc_filter_deps="gpl" +negate_filter_deps="lut_filter" +nnedi_filter_deps="gpl" +ocr_filter_deps="libtesseract" +ocv_filter_deps="libopencv" +owdenoise_filter_deps="gpl" +pan_filter_deps="swresample" +perspective_filter_deps="gpl" +phase_filter_deps="gpl" +pp7_filter_deps="gpl" +pp_filter_deps="gpl postproc" +pullup_filter_deps="gpl" +removelogo_filter_deps="avcodec avformat swscale" +repeatfields_filter_deps="gpl" +resample_filter_deps="avresample" +rubberband_filter_deps="librubberband" +sab_filter_deps="gpl swscale" +scale2ref_filter_deps="swscale" +scale_filter_deps="swscale" +select_filter_select="pixelutils" +showcqt_filter_deps="avcodec avformat swscale" +showcqt_filter_select="fft" +showfreqs_filter_deps="avcodec" +showfreqs_filter_select="fft" +showspectrum_filter_deps="avcodec" +showspectrum_filter_select="fft" +showspectrumpic_filter_deps="avcodec" +showspectrumpic_filter_select="fft" +smartblur_filter_deps="gpl swscale" +sofalizer_filter_deps="netcdf avcodec" +sofalizer_filter_select="fft" +spectrumsynth_filter_deps="avcodec" +spectrumsynth_filter_select="fft" +spp_filter_deps="gpl avcodec" +spp_filter_select="fft idctdsp fdctdsp me_cmp pixblockdsp" +stereo3d_filter_deps="gpl" +subtitles_filter_deps="avformat avcodec libass" +super2xsai_filter_deps="gpl" +pixfmts_super2xsai_test_deps="super2xsai_filter" +tinterlace_filter_deps="gpl" +tinterlace_merge_test_deps="tinterlace_filter" +tinterlace_pad_test_deps="tinterlace_filter" +uspp_filter_deps="gpl avcodec" +vidstabdetect_filter_deps="libvidstab" +vidstabtransform_filter_deps="libvidstab" +zmq_filter_deps="libzmq" +zoompan_filter_deps="swscale" +zscale_filter_deps="libzimg" + +# examples +avcodec_example_deps="avcodec avutil" +avio_dir_cmd="avformat avutil" +avio_reading="avformat avcodec avutil" +decoding_encoding_example_deps="avcodec avformat avutil" +demuxing_decoding_example_deps="avcodec avformat avutil" +extract_mvs_example_deps="avcodec avformat avutil" +filter_audio_example_deps="avfilter avutil" +filtering_audio_example_deps="avfilter avcodec avformat avutil" +filtering_video_example_deps="avfilter avcodec avformat avutil" +metadata_example_deps="avformat avutil" +muxing_example_deps="avcodec avformat avutil swscale" +qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder vaapi_x11" +remuxing_example_deps="avcodec avformat avutil" +resampling_audio_example_deps="avutil swresample" +scaling_video_example_deps="avutil swscale" +transcode_aac_example_deps="avcodec avformat swresample" +transcoding_example_deps="avfilter avcodec avformat avutil" + +# libraries, in linking order +avcodec_deps="avutil" +avdevice_deps="avformat avcodec avutil" +avfilter_deps="avutil" +avformat_deps="avcodec avutil" +avresample_deps="avutil" +postproc_deps="avutil gpl" +swresample_deps="avutil" +swscale_deps="avutil" + +# programs +ffmpeg_deps="avcodec avfilter avformat swresample" +ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter + null_filter + setpts_filter trim_filter" +ffplay_deps="avcodec avformat swscale swresample sdl" +ffplay_libs='$sdl_libs' +ffplay_select="rdft crop_filter transpose_filter hflip_filter vflip_filter rotate_filter" +ffprobe_deps="avcodec avformat" +ffserver_deps="avformat fork sarestart" +ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer" + +# documentation +podpages_deps="perl" +manpages_deps="perl pod2man" +htmlpages_deps="perl" +htmlpages_deps_any="makeinfo_html texi2html" +txtpages_deps="perl makeinfo" +doc_deps_any="manpages htmlpages podpages txtpages" + +# default parameters + +logfile="config.log" + +# installation paths +prefix_default="/usr/local" +bindir_default='${prefix}/bin' +datadir_default='${prefix}/share/ffmpeg' +docdir_default='${prefix}/share/doc/ffmpeg' +incdir_default='${prefix}/include' +libdir_default='${prefix}/lib' +mandir_default='${prefix}/share/man' + +# toolchain +ar_default="ar" +cc_default="gcc" +cxx_default="g++" +host_cc_default="gcc" +cp_f="cp -f" +doxygen_default="doxygen" +install="install" +ln_s="ln -s -f" +nm_default="nm -g" +objformat="elf" +pkg_config_default=pkg-config +ranlib_default="ranlib" +strip_default="strip" +yasmexe_default="yasm" +windres_default="windres" + +# OS +target_os_default=$(tolower $(uname -s)) +host_os=$target_os_default + +# machine +if test "$target_os_default" = aix; then + arch_default=$(uname -p) + strip_default="strip -X32_64" +else + arch_default=$(uname -m) +fi +cpu="generic" +intrinsics="none" + +# configurable options +enable $PROGRAM_LIST +enable $DOCUMENT_LIST +enable $EXAMPLE_LIST +enable $(filter_out avresample $LIBRARY_LIST) +enable stripping + +enable asm +enable debug +enable doc +enable faan faandct faanidct +enable optimizations +enable runtime_cpudetect +enable safe_bitstream_reader +enable static +enable swscale_alpha +enable valgrind_backtrace + +sws_max_filter_size_default=256 +set_default sws_max_filter_size + +# Enable hwaccels by default. +enable d3d11va dxva2 vaapi vda vdpau videotoolbox xvmc +enable xlib + +# build settings +SHFLAGS='-shared -Wl,-soname,$$(@F)' +LIBPREF="lib" +LIBSUF=".a" +FULLNAME='$(NAME)$(BUILDSUF)' +LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)' +SLIBPREF="lib" +SLIBSUF=".so" +SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)' +SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)' +SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' +LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' +SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' +SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)' + +asflags_filter=echo +cflags_filter=echo +ldflags_filter=echo + +AS_C='-c' +AS_O='-o $@' +CC_C='-c' +CC_E='-E -o $@' +CC_O='-o $@' +CXX_C='-c' +CXX_O='-o $@' +OBJCC_C='-c' +OBJCC_E='-E -o $@' +OBJCC_O='-o $@' +LD_O='-o $@' +LD_LIB='-l%' +LD_PATH='-L' +HOSTCC_C='-c' +HOSTCC_E='-E -o $@' +HOSTCC_O='-o $@' +HOSTLD_O='-o $@' + +host_libs='-lm' +host_cflags_filter=echo +host_ldflags_filter=echo + +target_path='$(CURDIR)' + +# since the object filename is not given with the -MM flag, the compiler +# is only able to print the basename, and we must add the path ourselves +DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>/dev/null | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(@F),$(@D)/$(@F)," > $(@:.o=.d)' +DEPFLAGS='-MM' + +# find source path +if test -f configure; then + source_path=. +else + source_path=$(cd $(dirname "$0"); pwd) + case "$source_path" in + *[[:blank:]]*) die "Out of tree builds are impossible with whitespace in source path." ;; + esac + test -e "$source_path/config.h" && + die "Out of tree builds are impossible with config.h in source dir." +fi + +for v in "$@"; do + r=${v#*=} + l=${v%"$r"} + r=$(sh_quote "$r") + FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}" +done + +find_things(){ + thing=$1 + pattern=$2 + file=$source_path/$3 + sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file" +} + +ENCODER_LIST=$(find_things encoder ENC libavcodec/allcodecs.c) +DECODER_LIST=$(find_things decoder DEC libavcodec/allcodecs.c) +HWACCEL_LIST=$(find_things hwaccel HWACCEL libavcodec/allcodecs.c) +PARSER_LIST=$(find_things parser PARSER libavcodec/allcodecs.c) +BSF_LIST=$(find_things bsf BSF libavcodec/allcodecs.c) +MUXER_LIST=$(find_things muxer _MUX libavformat/allformats.c) +DEMUXER_LIST=$(find_things demuxer DEMUX libavformat/allformats.c) +OUTDEV_LIST=$(find_things outdev OUTDEV libavdevice/alldevices.c) +INDEV_LIST=$(find_things indev _IN libavdevice/alldevices.c) +PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c) +FILTER_LIST=$(find_things filter FILTER libavfilter/allfilters.c) + +ALL_COMPONENTS=" + $BSF_LIST + $DECODER_LIST + $DEMUXER_LIST + $ENCODER_LIST + $FILTER_LIST + $HWACCEL_LIST + $INDEV_LIST + $MUXER_LIST + $OUTDEV_LIST + $PARSER_LIST + $PROTOCOL_LIST +" + +for n in $COMPONENT_LIST; do + v=$(toupper ${n%s})_LIST + eval enable \$$v + eval ${n}_if_any="\$$v" +done + +enable $ARCH_EXT_LIST + +die_unknown(){ + echo "Unknown option \"$1\"." + echo "See $0 --help for available options." + exit 1 +} + +print_in_columns() { + cols=$(expr $ncols / 24) + cat | tr ' ' '\n' | sort | pr -r "-$cols" -w $ncols -t +} + +show_list() { + suffix=_$1 + shift + echo $* | sed s/$suffix//g | print_in_columns + exit 0 +} + +rand_list(){ + IFS=', ' + set -- $* + unset IFS + for thing; do + comp=${thing%:*} + prob=${thing#$comp} + prob=${prob#:} + is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST + echo "prob ${prob:-0.5}" + printf '%s\n' $comp + done +} + +do_random(){ + action=$1 + shift + random_seed=$(awk "BEGIN { srand($random_seed); print srand() }") + $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }") +} + +for opt do + optval="${opt#*=}" + case "$opt" in + --extra-ldflags=*) + add_ldflags $optval + ;; + --extra-ldexeflags=*) + add_ldexeflags $optval + ;; + --extra-ldlibflags=*) + add_ldlibflags $optval + ;; + --extra-libs=*) + add_extralibs $optval + ;; + --disable-devices) + disable $INDEV_LIST $OUTDEV_LIST + ;; + --enable-debug=*) + debuglevel="$optval" + ;; + --disable-programs) + disable $PROGRAM_LIST + ;; + --disable-everything) + map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST + ;; + --disable-all) + map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST + disable $LIBRARY_LIST $PROGRAM_LIST doc + enable avutil + ;; + --enable-random|--disable-random) + action=${opt%%-random} + do_random ${action#--} $COMPONENT_LIST + ;; + --enable-random=*|--disable-random=*) + action=${opt%%-random=*} + do_random ${action#--} $optval + ;; + --enable-*=*|--disable-*=*) + eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/') + is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt" + eval list=\$$(toupper $thing)_LIST + name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing} + list=$(filter "$name" $list) + [ "$list" = "" ] && warn "Option $opt did not match anything" + $action $list + ;; + --enable-?*|--disable-?*) + eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g') + if is_in $option $COMPONENT_LIST; then + test $action = disable && action=unset + eval $action \$$(toupper ${option%s})_LIST + elif is_in $option $CMDLINE_SELECT; then + $action $option + else + die_unknown $opt + fi + ;; + --list-*) + NAME="${opt#--list-}" + is_in $NAME $COMPONENT_LIST || die_unknown $opt + NAME=${NAME%s} + eval show_list $NAME \$$(toupper $NAME)_LIST + ;; + --help|-h) show_help + ;; + --fatal-warnings) enable fatal_warnings + ;; + *) + optname="${opt%%=*}" + optname="${optname#--}" + optname=$(echo "$optname" | sed 's/-/_/g') + if is_in $optname $CMDLINE_SET; then + eval $optname='$optval' + elif is_in $optname $CMDLINE_APPEND; then + append $optname "$optval" + else + die_unknown $opt + fi + ;; + esac +done + +for e in $env; do + eval "export $e" +done + +disabled logging && logfile=/dev/null + +# Disable all the library-specific components if the library itself +# is disabled, see AVCODEC_LIST and following _LIST variables. + +disable_components(){ + disabled ${1} && disable $( + eval components="\$$(toupper ${1})_COMPONENTS" + map 'eval echo \${$(toupper ${v%s})_LIST}' $components + ) +} + +map 'disable_components $v' $LIBRARY_LIST + +echo "# $0 $FFMPEG_CONFIGURATION" > $logfile +set >> $logfile + +test -n "$valgrind" && toolchain="valgrind-memcheck" + +case "$toolchain" in + clang-asan) + cc_default="clang" + add_cflags -fsanitize=address + add_ldflags -fsanitize=address + ;; + clang-tsan) + cc_default="clang" + add_cflags -fsanitize=thread -pie + add_ldflags -fsanitize=thread -pie + ;; + clang-usan) + cc_default="clang" + add_cflags -fsanitize=undefined + add_ldflags -fsanitize=undefined + ;; + gcc-asan) + cc_default="gcc" + add_cflags -fsanitize=address + add_ldflags -fsanitize=address + ;; + gcc-tsan) + cc_default="gcc" + add_cflags -fsanitize=thread -pie -fPIC + add_ldflags -fsanitize=thread -pie -fPIC + ;; + gcc-usan) + cc_default="gcc" + add_cflags -fsanitize=undefined + add_ldflags -fsanitize=undefined + ;; + valgrind-massif) + target_exec_default=${valgrind:-"valgrind"} + target_exec_args="--tool=massif --alloc-fn=av_malloc --alloc-fn=av_mallocz --alloc-fn=av_calloc --alloc-fn=av_fast_padded_malloc --alloc-fn=av_fast_malloc --alloc-fn=av_realloc_f --alloc-fn=av_fast_realloc --alloc-fn=av_realloc" + ;; + valgrind-memcheck) + target_exec_default=${valgrind:-"valgrind"} + target_exec_args="--error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp" + ;; + msvc) + # Check whether the current MSVC version needs the C99 converter. + # From MSVC 2013 (compiler major version 18) onwards, it does actually + # support enough of C99 to build ffmpeg. Default to the new + # behaviour if the regexp was unable to match anything, since this + # successfully parses the version number of existing supported + # versions that require the converter (MSVC 2010 and 2012). + cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p') + if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then + cc_default="cl" + else + cc_default="c99wrap cl" + fi + ld_default="$source_path/compat/windows/mslink" + nm_default="dumpbin -symbols" + ar_default="lib" + case "$arch" in + arm*) + as_default="armasm" + ;; + esac + target_os_default="win32" + # Use a relative path for TMPDIR. This makes sure all the + # ffconf temp files are written with a relative path, avoiding + # issues with msys/win32 path conversion for MSVC parameters + # such as -Fo<file> or -out:<file>. + TMPDIR=. + ;; + icl) + cc_default="icl" + ld_default="xilink" + nm_default="dumpbin -symbols" + ar_default="xilib" + target_os_default="win32" + TMPDIR=. + ;; + gcov) + add_cflags -fprofile-arcs -ftest-coverage + add_ldflags -fprofile-arcs -ftest-coverage + ;; + hardened) + add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 + add_cflags -fno-strict-overflow -fstack-protector-all + add_ldflags -Wl,-z,relro -Wl,-z,now + ;; + ?*) + die "Unknown toolchain $toolchain" + ;; +esac + +test -n "$cross_prefix" && enable cross_compile + +if enabled cross_compile; then + test -n "$arch" && test -n "$target_os" || + die "Must specify target arch and OS when cross-compiling" +fi + +ar_default="${cross_prefix}${ar_default}" +cc_default="${cross_prefix}${cc_default}" +cxx_default="${cross_prefix}${cxx_default}" +nm_default="${cross_prefix}${nm_default}" +pkg_config_default="${cross_prefix}${pkg_config_default}" +if ${cross_prefix}${ranlib_default} 2>&1 | grep -q "\-D "; then + ranlib_default="${cross_prefix}${ranlib_default} -D" +else + ranlib_default="${cross_prefix}${ranlib_default}" +fi +strip_default="${cross_prefix}${strip_default}" +windres_default="${cross_prefix}${windres_default}" + +sysinclude_default="${sysroot}/usr/include" + +set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \ + target_exec target_os yasmexe +enabled cross_compile || host_cc_default=$cc +set_default host_cc + +pkg_config_fail_message="" +if ! $pkg_config --version >/dev/null 2>&1; then + warn "$pkg_config not found, library detection may fail." + pkg_config=false +elif is_in -static $cc $LDFLAGS && ! is_in --static $pkg_config $pkg_config_flags; then + pkg_config_fail_message=" +Note: When building a static binary, add --pkg-config-flags=\"--static\"." +fi + +if test $doxygen != $doxygen_default && \ + ! $doxygen --version >/dev/null 2>&1; then + warn "Specified doxygen \"$doxygen\" not found, API documentation will fail to build." +fi + +exesuf() { + case $1 in + mingw32*|mingw64*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;; + esac +} + +EXESUF=$(exesuf $target_os) +HOSTEXESUF=$(exesuf $host_os) + +# set temporary file name +: ${TMPDIR:=$TEMPDIR} +: ${TMPDIR:=$TMP} +: ${TMPDIR:=/tmp} + +if [ -n "$tempprefix" ] ; then + mktemp(){ + echo $tempprefix.${HOSTNAME}.${UID} + } +elif ! check_cmd mktemp -u XXXXXX; then + # simple replacement for missing mktemp + # NOT SAFE FOR GENERAL USE + mktemp(){ + echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$" + } +fi + +tmpfile(){ + tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 && + (set -C; exec > $tmp) 2>/dev/null || + die "Unable to create temporary file in $TMPDIR." + append TMPFILES $tmp + eval $1=$tmp +} + +trap 'rm -f -- $TMPFILES' EXIT + +tmpfile TMPASM .asm +tmpfile TMPC .c +tmpfile TMPCPP .cpp +tmpfile TMPE $EXESUF +tmpfile TMPH .h +tmpfile TMPM .m +tmpfile TMPO .o +tmpfile TMPS .S +tmpfile TMPSH .sh +tmpfile TMPV .ver + +unset -f mktemp + +chmod +x $TMPE + +# make sure we can execute files in $TMPDIR +cat > $TMPSH 2>> $logfile <<EOF +#! /bin/sh +EOF +chmod +x $TMPSH >> $logfile 2>&1 +if ! $TMPSH >> $logfile 2>&1; then + cat <<EOF +Unable to create and execute files in $TMPDIR. Set the TMPDIR environment +variable to another directory and make sure that it is not mounted noexec. +EOF + die "Sanity test failed." +fi + +armasm_flags(){ + for flag; do + case $flag in + # Filter out MSVC cl.exe options from cflags that shouldn't + # be passed to gas-preprocessor + -M[TD]*) ;; + *) echo $flag ;; + esac + done +} + +ccc_flags(){ + for flag; do + case $flag in + -std=c99) echo -c99 ;; + -mcpu=*) echo -arch ${flag#*=} ;; + -mieee) echo -ieee ;; + -O*|-fast) echo $flag ;; + -fno-math-errno) echo -assume nomath_errno ;; + -g) echo -g3 ;; + -Wall) echo -msg_enable level2 ;; + -Wno-pointer-sign) echo -msg_disable ptrmismatch1 ;; + -Wl,*) echo $flag ;; + -f*|-W*) ;; + *) echo $flag ;; + esac + done +} + +cparser_flags(){ + for flag; do + case $flag in + -Wno-switch) echo -Wno-switch-enum ;; + -Wno-format-zero-length) ;; + -Wdisabled-optimization) ;; + -Wno-pointer-sign) echo -Wno-other ;; + *) echo $flag ;; + esac + done +} + +msvc_common_flags(){ + for flag; do + case $flag in + # In addition to specifying certain flags under the compiler + # specific filters, they must be specified here as well or else the + # generic catch all at the bottom will print the original flag. + -Wall) ;; + -std=c99) ;; + # Common flags + -fomit-frame-pointer) ;; + -g) echo -Z7 ;; + -fno-math-errno) ;; + -fno-common) ;; + -fno-signed-zeros) ;; + -fPIC) ;; + -mthumb) ;; + -march=*) ;; + -lz) echo zlib.lib ;; + -lavifil32) echo vfw32.lib ;; + -lavicap32) echo vfw32.lib user32.lib ;; + -lx264) echo libx264.lib ;; + -l*) echo ${flag#-l}.lib ;; + -LARGEADDRESSAWARE) echo $flag ;; + -L*) echo -libpath:${flag#-L} ;; + *) echo $flag ;; + esac + done +} + +msvc_flags(){ + msvc_common_flags "$@" + for flag; do + case $flag in + -Wall) echo -W4 -wd4244 -wd4127 -wd4018 -wd4389 \ + -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \ + -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \ + -wd4307 \ + -wd4273 -wd4554 -wd4701 ;; + esac + done +} + +icl_flags(){ + msvc_common_flags "$@" + for flag; do + case $flag in + # Despite what Intel's documentation says -Wall, which is supported + # on Windows, does enable remarks so disable them here. + -Wall) echo $flag -Qdiag-disable:remark ;; + -std=c99) echo -Qstd=c99 ;; + -flto) echo -ipo ;; + esac + done +} + +icc_flags(){ + for flag; do + case $flag in + -flto) echo -ipo ;; + *) echo $flag ;; + esac + done +} + +pgi_flags(){ + for flag; do + case $flag in + -flto) echo -Mipa=fast,libopt,libinline,vestigial ;; + -fomit-frame-pointer) echo -Mnoframe ;; + -g) echo -gopt ;; + *) echo $flag ;; + esac + done +} + +suncc_flags(){ + for flag; do + case $flag in + -march=*|-mcpu=*) + case "${flag#*=}" in + native) echo -xtarget=native ;; + v9|niagara) echo -xarch=sparc ;; + ultrasparc) echo -xarch=sparcvis ;; + ultrasparc3|niagara2) echo -xarch=sparcvis2 ;; + i586|pentium) echo -xchip=pentium ;; + i686|pentiumpro|pentium2) echo -xtarget=pentium_pro ;; + pentium3*|c3-2) echo -xtarget=pentium3 ;; + pentium-m) echo -xarch=sse2 -xchip=pentium3 ;; + pentium4*) echo -xtarget=pentium4 ;; + prescott|nocona) echo -xarch=sse3 -xchip=pentium4 ;; + *-sse3) echo -xarch=sse3 ;; + core2) echo -xarch=ssse3 -xchip=core2 ;; + bonnell) echo -xarch=ssse3 ;; + corei7|nehalem) echo -xtarget=nehalem ;; + westmere) echo -xtarget=westmere ;; + silvermont) echo -xarch=sse4_2 ;; + corei7-avx|sandybridge) echo -xtarget=sandybridge ;; + core-avx*|ivybridge|haswell|broadwell) + echo -xarch=avx ;; + amdfam10|barcelona) echo -xtarget=barcelona ;; + btver1) echo -xarch=amdsse4a ;; + btver2|bdver*) echo -xarch=avx ;; + athlon-4|athlon-[mx]p) echo -xarch=ssea ;; + k8|opteron|athlon64|athlon-fx) + echo -xarch=sse2a ;; + athlon*) echo -xarch=pentium_proa ;; + esac + ;; + -std=c99) echo -xc99 ;; + -fomit-frame-pointer) echo -xregs=frameptr ;; + -fPIC) echo -KPIC -xcode=pic32 ;; + -W*,*) echo $flag ;; + -f*-*|-W*|-mimpure-text) ;; + -shared) echo -G ;; + *) echo $flag ;; + esac + done +} + +tms470_flags(){ + for flag; do + case $flag in + -march=*|-mcpu=*) + case "${flag#*=}" in + armv7-a|cortex-a*) echo -mv=7a8 ;; + armv7-r|cortex-r*) echo -mv=7r4 ;; + armv7-m|cortex-m*) echo -mv=7m3 ;; + armv6*|arm11*) echo -mv=6 ;; + armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) + echo -mv=5e ;; + armv4*|arm7*|arm9[24]*) echo -mv=4 ;; + esac + ;; + -mfpu=neon) echo --float_support=vfpv3 --neon ;; + -mfpu=vfp) echo --float_support=vfpv2 ;; + -mfpu=vfpv3) echo --float_support=vfpv3 ;; + -mfpu=vfpv3-d16) echo --float_support=vfpv3d16 ;; + -msoft-float) echo --float_support=vfplib ;; + -O[0-3]|-mf=*) echo $flag ;; + -g) echo -g -mn ;; + -pds=*) echo $flag ;; + -D*|-I*) echo $flag ;; + --gcc|--abi=*) echo $flag ;; + -me) echo $flag ;; + esac + done +} + +probe_cc(){ + pfx=$1 + _cc=$2 + first=$3 + + unset _type _ident _cc_c _cc_e _cc_o _flags _cflags + unset _ld_o _ldflags _ld_lib _ld_path + unset _depflags _DEPCMD _DEPFLAGS + _flags_filter=echo + + if $_cc --version 2>&1 | grep -q '^GNU assembler'; then + true # no-op to avoid reading stdin in following checks + elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then + _type=llvm_gcc + gcc_extra_ver=$(expr "$($_cc --version 2>/dev/null | head -n1)" : '.*\((.*)\)') + _ident="llvm-gcc $($_cc -dumpversion 2>/dev/null) $gcc_extra_ver" + _depflags='-MMD -MF $(@:.o=.d) -MT $@' + _cflags_speed='-O3' + _cflags_size='-Os' + elif $_cc -v 2>&1 | grep -qi ^gcc; then + _type=gcc + gcc_version=$($_cc --version | head -n1) + gcc_basever=$($_cc -dumpversion) + gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)') + gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)") + _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver") + case $gcc_basever in + 2) ;; + 2.*) ;; + *) _depflags='-MMD -MF $(@:.o=.d) -MT $@' ;; + esac + if [ "$first" = true ]; then + case $gcc_basever in + 4.2*) + warn "gcc 4.2 is outdated and may miscompile FFmpeg. Please use a newer compiler." ;; + esac + fi + _cflags_speed='-O3' + _cflags_size='-Os' + elif $_cc --version 2>/dev/null | grep -q ^icc; then + _type=icc + _ident=$($_cc --version | head -n1) + _depflags='-MMD' + _cflags_speed='-O3' + _cflags_size='-Os' + _cflags_noopt='-O1' + _flags_filter=icc_flags + elif $_cc -v 2>&1 | grep -q xlc; then + _type=xlc + _ident=$($_cc -qversion 2>/dev/null | head -n1) + _cflags_speed='-O5' + _cflags_size='-O5 -qcompact' + elif $_cc -V 2>/dev/null | grep -q Compaq; then + _type=ccc + _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3) + _DEPFLAGS='-M' + _cflags_speed='-fast' + _cflags_size='-O1' + _flags_filter=ccc_flags + elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then + test -d "$sysroot" || die "No valid sysroot specified." + _type=armcc + _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //') + armcc_conf="$PWD/armcc.conf" + $_cc --arm_linux_configure \ + --arm_linux_config_file="$armcc_conf" \ + --configure_sysroot="$sysroot" \ + --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 || + die "Error creating armcc configuration file." + $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc + _flags="--arm_linux_config_file=$armcc_conf --translate_gcc" + as_default="${cross_prefix}gcc" + _depflags='-MMD' + _cflags_speed='-O3' + _cflags_size='-Os' + elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then + _type=tms470 + _ident=$($_cc -version | head -n1 | tr -s ' ') + _flags='--gcc --abi=eabi -me' + _cc_e='-ppl -fe=$@' + _cc_o='-fe=$@' + _depflags='-ppa -ppd=$(@:.o=.d)' + _cflags_speed='-O3 -mf=5' + _cflags_size='-O3 -mf=2' + _flags_filter=tms470_flags + elif $_cc -v 2>&1 | grep -q clang; then + _type=clang + _ident=$($_cc --version 2>/dev/null | head -n1) + _depflags='-MMD -MF $(@:.o=.d) -MT $@' + _cflags_speed='-O3' + _cflags_size='-Os' + elif $_cc -V 2>&1 | grep -q Sun; then + _type=suncc + _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-) + _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)' + _DEPFLAGS='-xM1 -xc99' + _ldflags='-std=c99' + _cflags_speed='-O5' + _cflags_size='-O5 -xspace' + _flags_filter=suncc_flags + elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then + _type=pathscale + _ident=$($_cc -v 2>&1 | head -n1 | tr -d :) + _depflags='-MMD -MF $(@:.o=.d) -MT $@' + _cflags_speed='-O2' + _cflags_size='-Os' + _flags_filter='filter_out -Wdisabled-optimization' + elif $_cc -v 2>&1 | grep -q Open64; then + _type=open64 + _ident=$($_cc -v 2>&1 | head -n1 | tr -d :) + _depflags='-MMD -MF $(@:.o=.d) -MT $@' + _cflags_speed='-O2' + _cflags_size='-Os' + _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros' + elif $_cc -V 2>&1 | grep -q Portland; then + _type=pgi + _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')" + opt_common='-alias=ansi -Mdse -Mlre -Mpre' + _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common" + _cflags_size="-O2 -Munroll=c:1 $opt_common" + _cflags_noopt="-O" + _flags_filter=pgi_flags + elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then + _type=armasm + _ident=$($_cc | head -n1) + # 4509: "This form of conditional instruction is deprecated" + _flags="-nologo -ignore 4509" + _flags_filter=armasm_flags + elif $_cc 2>&1 | grep -q Intel; then + _type=icl + _ident=$($_cc 2>&1 | head -n1) + _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@' + # Not only is O3 broken on 13.x+ but it is slower on all previous + # versions (tested) as well. + _cflags_speed="-O2" + _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff + if $_cc 2>&1 | grep -q Linker; then + _ld_o='-out:$@' + else + _ld_o='-Fe$@' + fi + _cc_o='-Fo$@' + _cc_e='-P' + _flags_filter=icl_flags + _ld_lib='lib%.a' + _ld_path='-libpath:' + # -Qdiag-error to make icl error when seeing certain unknown arguments + _flags='-nologo -Qdiag-error:4044,10157' + # -Qvec- -Qsimd- to prevent miscompilation, -GS, fp:precise for consistency + # with MSVC which enables it by default. + _cflags='-D_USE_MATH_DEFINES -Qms0 -Qvec- -Qsimd- -GS -fp:precise' + disable stripping + elif $_cc -nologo- 2>&1 | grep -q Microsoft; then + _type=msvc + _ident=$($_cc 2>&1 | head -n1) + _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)' + _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs' + _cflags_speed="-O2" + _cflags_size="-O1" + if $_cc -nologo- 2>&1 | grep -q Linker; then + _ld_o='-out:$@' + else + _ld_o='-Fe$@' + fi + _cc_o='-Fo$@' + _cc_e='-P -Fi$@' + _flags_filter=msvc_flags + _ld_lib='lib%.a' + _ld_path='-libpath:' + _flags='-nologo' + _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS' + disable stripping + elif $_cc --version 2>/dev/null | grep -q ^cparser; then + _type=cparser + _ident=$($_cc --version | head -n1) + _depflags='-MMD' + _cflags_speed='-O4' + _cflags_size='-O2' + _flags_filter=cparser_flags + fi + + eval ${pfx}_type=\$_type + eval ${pfx}_ident=\$_ident +} + +set_ccvars(){ + eval ${1}_C=\${_cc_c-\${${1}_C}} + eval ${1}_E=\${_cc_e-\${${1}_E}} + eval ${1}_O=\${_cc_o-\${${1}_O}} + + if [ -n "$_depflags" ]; then + eval ${1}_DEPFLAGS=\$_depflags + else + eval ${1}DEP=\${_DEPCMD:-\$DEPCMD} + eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS} + eval DEP${1}FLAGS=\$_flags + fi +} + +probe_cc cc "$cc" "true" +cflags_filter=$_flags_filter +cflags_speed=$_cflags_speed +cflags_size=$_cflags_size +cflags_noopt=$_cflags_noopt +add_cflags $_flags $_cflags +cc_ldflags=$_ldflags +set_ccvars CC + +probe_cc hostcc "$host_cc" +host_cflags_filter=$_flags_filter +add_host_cflags $_flags $_cflags +set_ccvars HOSTCC + +test -n "$cc_type" && enable $cc_type || + warn "Unknown C compiler $cc, unable to select optimal CFLAGS" + +: ${as_default:=$cc} +: ${objcc_default:=$cc} +: ${dep_cc_default:=$cc} +: ${ld_default:=$cc} +: ${host_ld_default:=$host_cc} +set_default ar as objcc dep_cc ld host_ld windres + +probe_cc as "$as" +asflags_filter=$_flags_filter +add_asflags $_flags $_cflags +set_ccvars AS + +probe_cc objcc "$objcc" +objcflags_filter=$_flags_filter +add_objcflags $_flags $_cflags +set_ccvars OBJC + +probe_cc ld "$ld" +ldflags_filter=$_flags_filter +add_ldflags $_flags $_ldflags +test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags +LD_O=${_ld_o-$LD_O} +LD_LIB=${_ld_lib-$LD_LIB} +LD_PATH=${_ld_path-$LD_PATH} + +probe_cc hostld "$host_ld" +host_ldflags_filter=$_flags_filter +add_host_ldflags $_flags $_ldflags +HOSTLD_O=${_ld_o-$HOSTLD_O} + +if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then + probe_cc depcc "$dep_cc" + CCDEP=${_DEPCMD:-$DEPCMD} + CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS} + DEPCCFLAGS=$_flags +fi + +if $ar 2>&1 | grep -q Microsoft; then + arflags="-nologo" + ar_o='-out:$@' +elif $ar 2>&1 | grep -q 'Texas Instruments'; then + arflags="rq" + ar_o='$@' +elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then + arflags='-Xany -r -c' + ar_o='$@' +elif $ar 2>&1 | grep -q "\[D\] "; then + arflags="rcD" + ar_o='$@' +else + arflags="rc" + ar_o='$@' +fi + +add_cflags $extra_cflags +add_cxxflags $extra_cxxflags +add_objcflags $extra_objcflags +add_asflags $extra_cflags + +if test -n "$sysroot"; then + case "$cc_type" in + gcc|llvm_gcc|clang) + add_cppflags --sysroot="$sysroot" + add_ldflags --sysroot="$sysroot" +# On Darwin --sysroot may be ignored, -isysroot always affects headers and linking + add_cppflags -isysroot "$sysroot" + add_ldflags -isysroot "$sysroot" + ;; + tms470) + add_cppflags -I"$sysinclude" + add_ldflags --sysroot="$sysroot" + ;; + esac +fi + +if test "$cpu" = host; then + enabled cross_compile && + die "--cpu=host makes no sense when cross-compiling." + + case "$cc_type" in + gcc|llvm_gcc) + check_native(){ + $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return + sed -n "/cc1.*$1=/{ + s/.*$1=\\([^ ]*\\).*/\\1/ + p + q + }" $TMPE + } + cpu=$(check_native -march || check_native -mcpu) + ;; + clang) + check_native(){ + $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return + sed -n "/cc1.*-target-cpu /{ + s/.*-target-cpu \\([^ ]*\\).*/\\1/ + p + q + }" $TMPE + } + cpu=$(check_native -march) + ;; + esac + + test "${cpu:-host}" = host && + die "--cpu=host not supported with compiler $cc" +fi + +# Deal with common $arch aliases +case "$arch" in + aarch64|arm64) + arch="aarch64" + ;; + arm*|iPad*|iPhone*) + arch="arm" + ;; + mips*|IP*) + case "$arch" in + *el) + add_cppflags -EL + add_ldflags -EL + ;; + *eb) + add_cppflags -EB + add_ldflags -EB + ;; + esac + arch="mips" + ;; + parisc*|hppa*) + arch="parisc" + ;; + "Power Macintosh"|ppc*|powerpc*) + arch="ppc" + ;; + s390|s390x) + arch="s390" + ;; + sh4|sh) + arch="sh4" + ;; + sun4u|sparc*) + arch="sparc" + ;; + tilegx|tile-gx) + arch="tilegx" + ;; + i[3-6]86*|i86pc|BePC|x86pc|x86_64|x86_32|amd64) + arch="x86" + ;; +esac + +is_in $arch $ARCH_LIST || warn "unknown architecture $arch" +enable $arch + +# Add processor-specific flags +if enabled aarch64; then + + case $cpu in + armv*) + cpuflags="-march=$cpu" + ;; + *) + cpuflags="-mcpu=$cpu" + ;; + esac + +elif enabled alpha; then + + cpuflags="-mcpu=$cpu" + +elif enabled arm; then + + check_arm_arch() { + check_cpp_condition stddef.h \ + "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \ + $cpuflags + } + + probe_arm_arch() { + if check_arm_arch 4; then echo armv4; + elif check_arm_arch 4T; then echo armv4t; + elif check_arm_arch 5; then echo armv5; + elif check_arm_arch 5E; then echo armv5e; + elif check_arm_arch 5T; then echo armv5t; + elif check_arm_arch 5TE; then echo armv5te; + elif check_arm_arch 5TEJ; then echo armv5te; + elif check_arm_arch 6; then echo armv6; + elif check_arm_arch 6J; then echo armv6j; + elif check_arm_arch 6K; then echo armv6k; + elif check_arm_arch 6Z; then echo armv6z; + elif check_arm_arch 6ZK; then echo armv6zk; + elif check_arm_arch 6T2; then echo armv6t2; + elif check_arm_arch 7; then echo armv7; + elif check_arm_arch 7A 7_A; then echo armv7-a; + elif check_arm_arch 7S; then echo armv7-a; + elif check_arm_arch 7R 7_R; then echo armv7-r; + elif check_arm_arch 7M 7_M; then echo armv7-m; + elif check_arm_arch 7EM 7E_M; then echo armv7-m; + elif check_arm_arch 8A 8_A; then echo armv8-a; + fi + } + + [ "$cpu" = generic ] && cpu=$(probe_arm_arch) + + case $cpu in + armv*) + cpuflags="-march=$cpu" + subarch=$(echo $cpu | sed 's/[^a-z0-9]//g') + ;; + *) + cpuflags="-mcpu=$cpu" + case $cpu in + cortex-a*) subarch=armv7a ;; + cortex-r*) subarch=armv7r ;; + cortex-m*) enable thumb; subarch=armv7m ;; + arm11*) subarch=armv6 ;; + arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;; + armv4*|arm7*|arm9[24]*) subarch=armv4 ;; + *) subarch=$(probe_arm_arch) ;; + esac + ;; + esac + + case "$subarch" in + armv5t*) enable fast_clz ;; + armv[6-8]*) + enable fast_clz + disabled fast_unaligned || enable fast_unaligned + ;; + esac + +elif enabled avr32; then + + case $cpu in + ap7[02]0[0-2]) + subarch="avr32_ap" + cpuflags="-mpart=$cpu" + ;; + ap) + subarch="avr32_ap" + cpuflags="-march=$cpu" + ;; + uc3[ab]*) + subarch="avr32_uc" + cpuflags="-mcpu=$cpu" + ;; + uc) + subarch="avr32_uc" + cpuflags="-march=$cpu" + ;; + esac + +elif enabled bfin; then + + cpuflags="-mcpu=$cpu" + +elif enabled mips; then + + cpuflags="-march=$cpu" + + case $cpu in + 24kc) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsfpu + disable mipsdsp + disable mipsdspr2 + disable msa + ;; + 24kf*) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsdsp + disable mipsdspr2 + disable msa + ;; + 24kec|34kc|1004kc) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsfpu + disable mipsdspr2 + disable msa + ;; + 24kef*|34kf*|1004kf*) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsdspr2 + disable msa + ;; + 74kc) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsfpu + disable msa + ;; + 74kf) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable msa + ;; + p5600) + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsdsp + disable mipsdspr2 + check_cflags "-mtune=p5600" && + check_cflags "-mfp64 -msched-weight -mload-store-pairs -funroll-loops" && + add_asflags "-mfp64" + ;; + i6400) + disable mips32r2 + disable mips32r6 + disable mips64r2 + disable mipsdsp + disable mipsdspr2 + check_cflags "-mtune=i6400 -mabi=64" && + check_cflags "-mfp64 -msched-weight -mload-store-pairs -funroll-loops" && + check_ldflags "-mabi=64" && + add_asflags "-mfp64" + ;; + loongson*) + disable mips32r2 + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsfpu + disable mipsdsp + disable mipsdspr2 + disable msa + enable local_aligned_8 local_aligned_16 local_aligned_32 + enable simd_align_16 + enable fast_64bit + enable fast_clz + enable fast_cmov + enable fast_unaligned + disable aligned_stack + case $cpu in + loongson3*) + cpuflags="-march=loongson3a -mhard-float -fno-expensive-optimizations" + ;; + loongson2e) + cpuflags="-march=loongson2e -mhard-float -fno-expensive-optimizations" + ;; + loongson2f) + cpuflags="-march=loongson2f -mhard-float -fno-expensive-optimizations" + ;; + esac + ;; + generic) + disable mips64r6 + disable msa + ;; + *) + # Unknown CPU. Disable everything. + warn "unknown CPU. Disabling all MIPS optimizations." + disable mipsfpu + disable mips32r2 + disable mips32r6 + disable mips64r2 + disable mips64r6 + disable mipsdsp + disable mipsdspr2 + disable msa + ;; + esac + +elif enabled ppc; then + + disable ldbrx + + case $(tolower $cpu) in + 601|ppc601|powerpc601) + cpuflags="-mcpu=601" + disable altivec + ;; + 603*|ppc603*|powerpc603*) + cpuflags="-mcpu=603" + disable altivec + ;; + 604*|ppc604*|powerpc604*) + cpuflags="-mcpu=604" + disable altivec + ;; + g3|75*|ppc75*|powerpc75*) + cpuflags="-mcpu=750" + disable altivec + ;; + g4|745*|ppc745*|powerpc745*) + cpuflags="-mcpu=7450" + disable vsx + ;; + 74*|ppc74*|powerpc74*) + cpuflags="-mcpu=7400" + disable vsx + ;; + g5|970|ppc970|powerpc970) + cpuflags="-mcpu=970" + disable vsx + ;; + power[3-6]*) + cpuflags="-mcpu=$cpu" + disable vsx + ;; + power[7-8]*) + cpuflags="-mcpu=$cpu" + ;; + cell) + cpuflags="-mcpu=cell" + enable ldbrx + disable vsx + ;; + e500mc) + cpuflags="-mcpu=e500mc" + disable altivec + ;; + e500v2) + cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double" + disable altivec + disable dcbzl + ;; + e500) + cpuflags="-mcpu=8540 -mhard-float" + disable altivec + disable dcbzl + ;; + esac + +elif enabled sparc; then + + case $cpu in + cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789]) + cpuflags="-mcpu=$cpu" + ;; + ultrasparc*|niagara[234]) + cpuflags="-mcpu=$cpu" + ;; + esac + +elif enabled x86; then + + case $cpu in + i[345]86|pentium) + cpuflags="-march=$cpu" + disable i686 + disable mmx + ;; + # targets that do NOT support nopl and conditional mov (cmov) + pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3) + cpuflags="-march=$cpu" + disable i686 + ;; + # targets that do support nopl and conditional mov (cmov) + i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx\ + |core*|atom|bonnell|nehalem|westmere|silvermont|sandybridge|ivybridge|haswell|broadwell|amdfam10|barcelona|b[dt]ver*) + cpuflags="-march=$cpu" + enable i686 + enable fast_cmov + ;; + # targets that do support conditional mov but on which it's slow + pentium4|pentium4m|prescott|nocona) + cpuflags="-march=$cpu" + enable i686 + disable fast_cmov + ;; + esac + +fi + +if [ "$cpu" != generic ]; then + add_cflags $cpuflags + add_asflags $cpuflags + test "$cc_type" = "$ld_type" && add_ldflags $cpuflags +fi + +# compiler sanity check +check_exec <<EOF +int main(void){ return 0; } +EOF +if test "$?" != 0; then + echo "$cc is unable to create an executable file." + if test -z "$cross_prefix" && ! enabled cross_compile ; then + echo "If $cc is a cross-compiler, use the --enable-cross-compile option." + echo "Only do this if you know what cross compiling means." + fi + die "C compiler test failed." +fi + +add_cppflags -D_ISOC99_SOURCE +add_cxxflags -D__STDC_CONSTANT_MACROS +check_cflags -std=c99 +check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64 +#include <stdlib.h> +EOF +check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE +#include <stdlib.h> +EOF + +add_host_cppflags -D_ISOC99_SOURCE +check_host_cflags -std=c99 +check_host_cflags -Wall +check_host_cflags -O3 + +check_64bit(){ + arch32=$1 + arch64=$2 + expr=$3 + check_code cc "" "int test[2*($expr) - 1]" && + subarch=$arch64 || subarch=$arch32 +} + +case "$arch" in + aarch64|alpha|ia64) + spic=$shared + ;; + mips) + check_64bit mips mips64 '_MIPS_SIM > 1' + spic=$shared + ;; + parisc) + check_64bit parisc parisc64 'sizeof(void *) > 4' + spic=$shared + ;; + ppc) + check_64bit ppc ppc64 'sizeof(void *) > 4' + spic=$shared + ;; + s390) + check_64bit s390 s390x 'sizeof(void *) > 4' + spic=$shared + ;; + sparc) + check_64bit sparc sparc64 'sizeof(void *) > 4' + spic=$shared + ;; + x86) + check_64bit x86_32 x86_64 'sizeof(void *) > 4' + # Treat x32 as x64 for now. Note it also needs spic=$shared + test "$subarch" = "x86_32" && check_cpp_condition stddef.h 'defined(__x86_64__)' && + subarch=x86_64 + if test "$subarch" = "x86_64"; then + spic=$shared + fi + ;; + ppc) + check_cc <<EOF && subarch="ppc64" + int test[(int)sizeof(char*) - 7]; +EOF + ;; +esac + +enable $subarch +enabled spic && enable_weak pic + +# OS specific +case $target_os in + aix) + SHFLAGS=-shared + add_cppflags '-I\$(SRC_PATH)/compat/aix' + enabled shared && add_ldflags -Wl,-brtl + ;; + android) + disable symver + enable section_data_rel_ro + SLIB_INSTALL_NAME='$(SLIBNAME)' + SLIB_INSTALL_LINKS= + SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)' + ;; + haiku) + prefix_default="/boot/common" + network_extralibs="-lnetwork" + host_libs= + ;; + sunos) + SHFLAGS='-shared -Wl,-h,$$(@F)' + enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS" + network_extralibs="-lsocket -lnsl" + add_cppflags -D__EXTENSIONS__ + # When using suncc to build, the Solaris linker will mark + # an executable with each instruction set encountered by + # the Solaris assembler. As our libraries contain their own + # guards for processor-specific code, instead suppress + # generation of the HWCAPS ELF section on Solaris x86 only. + enabled_all suncc x86 && + echo "hwcap_1 = OVERRIDE;" > mapfile && + add_ldflags -Wl,-M,mapfile + nm_default='nm -P -g' + SLIB_CREATE_DEF_CMD='$(Q)perl $(SRC_PATH)/compat/solaris/make_sunver.pl $$(filter %.ver,$$^) $(OBJS) | grep -v @ > $(SUBDIR)lib$(NAME).ver-sol2' + ;; + netbsd) + disable symver + oss_indev_extralibs="-lossaudio" + oss_outdev_extralibs="-lossaudio" + enabled gcc || check_ldflags -Wl,-zmuldefs + ;; + openbsd|bitrig) + disable symver + SHFLAGS='-shared' + SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)' + SLIB_INSTALL_LINKS= + oss_indev_extralibs="-lossaudio" + oss_outdev_extralibs="-lossaudio" + ;; + dragonfly) + disable symver + ;; + freebsd) + ;; + bsd/os) + add_extralibs -lpoll -lgnugetopt + strip="strip -d" + ;; + darwin) + enabled ppc && add_asflags -force_cpusubtype_ALL + SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)' + enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress + strip="${strip} -x" + add_ldflags -Wl,-dynamic,-search_paths_first + SLIBSUF=".dylib" + SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)' + SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)' + objformat="macho" + enabled x86_64 && objformat="macho64" + enabled_any pic shared x86_64 || + { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; } + ;; + msys*) + die "Native MSYS builds are discouraged, please use the MINGW environment."; + ;; + mingw32*|mingw64*) + if test $target_os = "mingw32ce"; then + disable network + else + target_os=mingw32 + fi + decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32" + decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32" + LIBTARGET=i386 + if enabled x86_64; then + LIBTARGET="i386:x86-64" + elif enabled arm; then + LIBTARGET=arm-wince + fi + enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres + enabled x86_32 && check_ldflags -Wl,--large-address-aware + shlibdir_default="$bindir_default" + SLIBPREF="" + SLIBSUF=".dll" + SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' + SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' + dlltool="${cross_prefix}dlltool" + if check_cmd lib.exe -list; then + SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)' + if enabled x86_64; then + LIBTARGET=x64 + fi + elif check_cmd $dlltool --version; then + SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); $(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)' + fi + SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' + SLIB_INSTALL_LINKS= + SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)' + SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)' + SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.orig.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--disable-auto-image-base' + objformat="win32" + ranlib=: + enable dos_paths + check_ldflags -Wl,--nxcompat,--dynamicbase + # Lets work around some stupidity in binutils. + # ld will strip relocations from executables even though we need them + # for dynamicbase (ASLR). Using -pie does retain the reloc section + # however ld then forgets what the entry point should be (oops) so we + # have to manually (re)set it. + if enabled x86_32; then + add_ldexeflags -Wl,--pic-executable,-e,_mainCRTStartup + elif enabled x86_64; then + add_ldexeflags -Wl,--pic-executable,-e,mainCRTStartup + check_ldflags -Wl,--high-entropy-va # binutils 2.25 + # Set image base >4GB for extra entropy with HEASLR + add_ldexeflags -Wl,--image-base,0x140000000 + append SHFLAGS -Wl,--image-base,0x180000000 + fi + ;; + win32|win64) + disable symver + if enabled shared; then + # Link to the import library instead of the normal static library + # for shared libs. + LD_LIB='%.lib' + # Cannot build both shared and static libs with MSVC or icl. + disable static + fi + enabled x86_32 && check_ldflags -LARGEADDRESSAWARE + shlibdir_default="$bindir_default" + SLIBPREF="" + SLIBSUF=".dll" + SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' + SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' + SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)' + SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' + SLIB_INSTALL_LINKS= + SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)' + SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)' + SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)' + objformat="win32" + ranlib=: + enable dos_paths + ;; + cygwin*) + target_os=cygwin + shlibdir_default="$bindir_default" + SLIBPREF="cyg" + SLIBSUF=".dll" + SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' + SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' + SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' + SLIB_INSTALL_LINKS= + SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a' + SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a' + objformat="win32" + enable dos_paths + enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres + ;; + *-dos|freedos|opendos) + network_extralibs="-lsocket" + objformat="coff" + enable dos_paths + add_cppflags -U__STRICT_ANSI__ + ;; + linux) + enable dv1394 + enable section_data_rel_ro + ;; + irix*) + target_os=irix + ranlib="echo ignoring ranlib" + ;; + os/2*) + strip="lxlite -CS" + ln_s="cp -f" + objformat="aout" + add_cppflags -D_GNU_SOURCE + add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap + SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf' + LIBSUF="_s.a" + SLIBPREF="" + SLIBSUF=".dll" + SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)' + SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)' + SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \ + echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \ + echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \ + echo EXPORTS >> $(SUBDIR)$(NAME).def; \ + emxexp $(OBJS) >> $(SUBDIR)$(NAME).def' + SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \ + emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;' + SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib' + enable dos_paths + enable_weak os2threads + ;; + gnu/kfreebsd) + add_cppflags -D_BSD_SOURCE + ;; + gnu) + ;; + qnx) + add_cppflags -D_QNX_SOURCE + network_extralibs="-lsocket" + ;; + symbian) + SLIBSUF=".dll" + enable dos_paths + add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default + add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS + add_ldflags -Wl,--target1-abs,--no-undefined \ + -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \ + -Wl,--entry=_E32Startup -Wl,-u,_E32Startup + add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \ + -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \ + -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib + ;; + osf1) + add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT + ;; + minix) + ;; + plan9) + add_cppflags -D_C99_SNPRINTF_EXTENSION \ + -D_REENTRANT_SOURCE \ + -D_RESEARCH_SOURCE \ + -DFD_SETSIZE=96 \ + -DHAVE_SOCK_OPTS + add_compat strtod.o strtod=avpriv_strtod + network_extralibs='-lbsd' + exeobjs=compat/plan9/main.o + disable ffserver + cp_f='cp' + ;; + none) + ;; + *) + die "Unknown OS '$target_os'." + ;; +esac + +# test if creating links works +link_dest=$(mktemp -u $TMPDIR/dest_XXXXXXXX) +link_name=$(mktemp -u $TMPDIR/name_XXXXXXXX) +mkdir "$link_dest" +$ln_s "$link_dest" "$link_name" +touch "$link_dest/test_file" +if [ "$source_path" != "." ] && ([ ! -d src ] || [ -L src ]) && [ -e "$link_name/test_file" ]; then + # create link to source path + [ -e src ] && rm src + $ln_s "$source_path" src + source_link=src +else + # creating directory links doesn't work + # fall back to using the full source path + source_link="$source_path" +fi +# cleanup +rm -r "$link_dest" +rm -r "$link_name" + +# determine libc flavour + +probe_libc(){ + pfx=$1 + pfx_no_=${pfx%_} + # uclibc defines __GLIBC__, so it needs to be checked before glibc. + if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then + eval ${pfx}libc_type=uclibc + add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 + elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then + eval ${pfx}libc_type=glibc + add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 + # MinGW headers can be installed on Cygwin, so check for newlib first. + elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then + eval ${pfx}libc_type=newlib + add_${pfx}cppflags -U__STRICT_ANSI__ + # MinGW64 is backwards compatible with MinGW32, so check for it first. + elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then + eval ${pfx}libc_type=mingw64 + if check_${pfx}cpp_condition _mingw.h "__MINGW64_VERSION_MAJOR < 3"; then + add_compat msvcrt/snprintf.o + add_cflags "-include $source_path/compat/msvcrt/snprintf.h" + fi + add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 + eval test \$${pfx_no_}cc_type = "gcc" && + add_${pfx}cppflags -D__printf__=__gnu_printf__ + elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION" || + check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then + eval ${pfx}libc_type=mingw32 + check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \ + (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" || + die "ERROR: MinGW32 runtime version must be >= 3.15." + add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 + eval test \$${pfx_no_}cc_type = "gcc" && + add_${pfx}cppflags -D__printf__=__gnu_printf__ + elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then + eval ${pfx}libc_type=msvcrt + if check_${pfx}cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION < 14"; then + if [ "$pfx" = host_ ]; then + add_host_cppflags -Dsnprintf=_snprintf + else + add_compat strtod.o strtod=avpriv_strtod + add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf \ + _snprintf=avpriv_snprintf \ + vsnprintf=avpriv_vsnprintf + fi + fi + # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to + # 0x601 by default unless something else is set by the user. + # This can easily lead to us detecting functions only present + # in such new versions and producing binaries requiring windows 7.0. + # Therefore explicitly set the default to XP unless the user has + # set something else on the command line. + # Don't do this if WINAPI_FAMILY is set and is set to a non-desktop + # family. For these cases, configure is free to use any functions + # found in the SDK headers by default. (Alternatively, we could force + # _WIN32_WINNT to 0x0602 in that case.) + check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" || + { check_${pfx}cpp <<EOF && add_${pfx}cppflags -D_WIN32_WINNT=0x0502; } +#ifdef WINAPI_FAMILY +#include <winapifamily.h> +#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#error not desktop +#endif +#endif +EOF + elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then + eval ${pfx}libc_type=klibc + elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then + eval ${pfx}libc_type=bionic + elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then + eval ${pfx}libc_type=solaris + add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 + fi + check_${pfx}cc <<EOF +#include <time.h> +void *v = localtime_r; +EOF +test "$?" != 0 && check_${pfx}cc -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 <<EOF && add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 +#include <time.h> +void *v = localtime_r; +EOF + +} + +probe_libc +test -n "$libc_type" && enable libc_$libc_type +probe_libc host_ +test -n "$host_libc_type" && enable host_libc_$host_libc_type + +case $libc_type in + bionic) + add_compat strtod.o strtod=avpriv_strtod + ;; +esac + +# hacks for compiler/libc/os combinations + +if enabled_all tms470 libc_glibc; then + CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}" + add_cppflags -D__USER_LABEL_PREFIX__= + add_cppflags -D__builtin_memset=memset + add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED + add_cflags -pds=48 # incompatible redefinition of macro +fi + +if enabled_all ccc libc_glibc; then + add_ldflags -Wl,-z,now # calls to libots crash without this +fi + +check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" || + add_cppflags '-I\$(SRC_PATH)/compat/float' + +esc(){ + echo "$*" | sed 's/%/%25/g;s/:/%3a/g' +} + +echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate + +check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic + +set_default libdir +: ${shlibdir_default:="$libdir"} +: ${pkgconfigdir_default:="$libdir/pkgconfig"} + +set_default $PATHS_LIST +set_default nm + +# we need to build at least one lib type +if ! enabled_any static shared; then + cat <<EOF +At least one library type must be built. +Specify --enable-static to build the static libraries or --enable-shared to +build the shared libraries as well. To only build the shared libraries specify +--disable-static in addition to --enable-shared. +EOF + exit 1; +fi + +die_license_disabled() { + enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; } +} + +die_license_disabled_gpl() { + enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; } +} + +die_license_disabled gpl frei0r +die_license_disabled gpl libcdio +die_license_disabled gpl librubberband +die_license_disabled gpl libsmbclient +die_license_disabled gpl libutvideo +die_license_disabled gpl libvidstab +die_license_disabled gpl libx264 +die_license_disabled gpl libx265 +die_license_disabled gpl libxavs +die_license_disabled gpl libxvid +die_license_disabled gpl x11grab + +die_license_disabled nonfree libfaac +die_license_disabled nonfree nvenc +enabled gpl && die_license_disabled_gpl nonfree libfdk_aac +enabled gpl && die_license_disabled_gpl nonfree openssl + +die_license_disabled version3 gmp +die_license_disabled version3 libopencore_amrnb +die_license_disabled version3 libopencore_amrwb +die_license_disabled version3 libsmbclient +die_license_disabled version3 libvo_amrwbenc + +enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; } + +disabled optimizations || check_cflags -fomit-frame-pointer + +enable_weak_pic() { + disabled pic && return + enable pic + add_cppflags -DPIC + case "$target_os" in + mingw*|cygwin*) + ;; + *) + add_cflags -fPIC + ;; + esac + add_asflags -fPIC +} + +enabled pic && enable_weak_pic + +check_cc <<EOF || die "Symbol mangling check failed." +int ff_extern; +EOF +sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }') +extern_prefix=${sym%%ff_extern*} + +check_cc <<EOF && enable_weak inline_asm +void foo(void) { __asm__ volatile ("" ::); } +EOF + +_restrict= +for restrict_keyword in restrict __restrict__ __restrict; do + check_cc <<EOF && _restrict=$restrict_keyword && break +void foo(char * $restrict_keyword p); +EOF +done + +check_cc <<EOF && enable pragma_deprecated +void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") } +EOF + +check_cc <<EOF && enable attribute_packed +struct { int x; } __attribute__((packed)) x; +EOF + +check_cc <<EOF && enable attribute_may_alias +union { int x; } __attribute__((may_alias)) x; +EOF + +check_cc <<EOF || die "endian test failed" +unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E'; +EOF +od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian + +if ! enabled ppc64 || enabled bigendian; then + disable vsx +fi + +check_gas() { + log "check_gas using '$as' as AS" + # :vararg is used on aarch64, arm and ppc altivec + check_as <<EOF || return 1 +.macro m n, y:vararg=0 +\n: .int \y +.endm +m x +EOF + # .altmacro is only used in arm asm + ! enabled arm || check_as <<EOF || return 1 +.altmacro +EOF + enable gnu_as + return 0 +} + +if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then + nogas=: + enabled_any arm aarch64 && nogas=die + enabled_all ppc altivec && [ $target_os_default != aix ] && nogas=warn + as_noop=-v + + case $as_type in + arm*) gaspp_as_type=armasm; as_noop=-h ;; + gcc) gaspp_as_type=gas ;; + *) gaspp_as_type=$as_type ;; + esac + + [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type" + + test "${as#*gas-preprocessor.pl}" != "$as" || + check_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- ${as:=$cc} $as_noop && + gas="${gas:=gas-preprocessor.pl} -arch $arch -as-type $gaspp_as_type -- ${as:=$cc}" + + if ! check_gas ; then + as=${gas:=$as} + check_gas || \ + $nogas "GNU assembler not found, install/update gas-preprocessor" + fi + + check_as <<EOF && enable as_func +.func test +.endfunc +EOF +fi + +check_inline_asm inline_asm_labels '"1:\n"' + +check_inline_asm inline_asm_nonlocal_labels '"Label:\n"' + +if enabled aarch64; then + enabled armv8 && check_insn armv8 'prfm pldl1strm, [x0]' + # internal assembler in clang 3.3 does not support this instruction + enabled neon && check_insn neon 'ext v0.8B, v0.8B, v1.8B, #1' + enabled vfp && check_insn vfp 'fmadd d0, d0, d1, d2' + + map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM + +elif enabled alpha; then + + check_cflags -mieee + +elif enabled arm; then + + enabled msvc && check_cpp_condition stddef.h "defined _M_ARMT" && enable thumb + + check_cpp_condition stddef.h "defined __thumb__" && check_cc <<EOF && enable_weak thumb +float func(float a, float b){ return a+b; } +EOF + + enabled thumb && check_cflags -mthumb || check_cflags -marm + + if check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then + enable vfp_args + elif check_cpp_condition stddef.h "defined _M_ARM_FP && _M_ARM_FP >= 30"; then + enable vfp_args + elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__" && [ $target_os != darwin ]; then + case "${cross_prefix:-$cc}" in + *hardfloat*) enable vfp_args; fpabi=vfp ;; + *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;; +__asm__ (".eabi_attribute 28, 1"); +int main(void) { return 0; } +EOF + esac + warn "Compiler does not indicate floating-point ABI, guessing $fpabi." + fi + + enabled armv5te && check_insn armv5te 'qadd r0, r0, r0' + enabled armv6 && check_insn armv6 'sadd16 r0, r0, r0' + enabled armv6t2 && check_insn armv6t2 'movt r0, #0' + enabled neon && check_insn neon 'vadd.i16 q0, q0, q0' + enabled vfp && check_insn vfp 'fadds s0, s0, s0' + enabled vfpv3 && check_insn vfpv3 'vmov.f32 s0, #1.0' + enabled setend && check_insn setend 'setend be' + + [ $target_os = linux ] || [ $target_os = android ] || + map 'enabled_any ${v}_external ${v}_inline || disable $v' \ + $ARCH_EXT_LIST_ARM + + check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)' + + check_as <<EOF && enable as_dn_directive +ra .dn d0.i16 +.unreq ra +EOF + + # llvm's integrated assembler supports .object_arch from llvm 3.5 + [ "$objformat" = elf ] && check_as <<EOF && enable as_object_arch +.object_arch armv4 +EOF + + [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic + +elif enabled mips; then + + enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"' + enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"' + enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"' + + # Enable minimum ISA based on selected options + if enabled mips64 && (enabled mipsdsp || enabled mipsdspr2); then + add_cflags "-mips64r2" + add_asflags "-mips64r2" + elif enabled mips64 && enabled mipsfpu && disabled loongson2 && disabled loongson3; then + add_cflags "-mips64" + add_asflags "-mips64" + elif enabled mipsdsp || enabled mipsdspr2; then + add_cflags "-mips32r2 -mfp32" + add_asflags "-mips32r2 -mfp32" + fi + + enabled mipsdsp && add_cflags "-mdsp" && add_asflags "-mdsp" && + check_inline_asm mipsdsp '"addu.qb $t0, $t1, $t2"' + enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" && + check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"' + enabled mipsfpu && add_cflags "-mhard-float" && add_asflags "-mhard-float" && + check_inline_asm mipsfpu '"madd.d $f0, $f2, $f4, $f6"' + enabled msa && check_cflags "-mmsa" && check_ldflags "-mmsa" && + check_inline_asm msa '"addvi.b $w0, $w1, 1"' + + enabled msa && add_asflags "-mmsa" + +elif enabled parisc; then + + if enabled gcc; then + case $($cc -dumpversion) in + 4.[3-9].*) check_cflags -fno-optimize-sibling-calls ;; + esac + fi + +elif enabled ppc; then + + enable local_aligned_8 local_aligned_16 local_aligned_32 + + check_inline_asm dcbzl '"dcbzl 0, %0" :: "r"(0)' + check_inline_asm ibm_asm '"add 0, 0, 0"' + check_inline_asm ppc4xx '"maclhw r10, r11, r12"' + check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)' + + # AltiVec flags: The FSF version of GCC differs from the Apple version + if enabled altivec; then + check_cflags -maltivec -mabi=altivec && + { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } || + check_cflags -faltivec + + # check if our compiler supports Motorola AltiVec C API + check_cc <<EOF || disable altivec +$inc_altivec_h +int main(void) { + vector signed int v1 = (vector signed int) { 0 }; + vector signed int v2 = (vector signed int) { 1 }; + v1 = vec_add(v1, v2); + return 0; +} +EOF + + enabled altivec || warn "Altivec disabled, possibly missing --cpu flag" + fi + + if enabled vsx; then + check_cflags -mvsx && + check_builtin vec_vsx_ld "altivec.h" "__builtin_vec_vsx_ld" || disable vsx + fi + + if enabled power8; then + check_cpp_condition "altivec.h" "defined(_ARCH_PWR8)" || disable power8 + fi + +elif enabled x86; then + + check_builtin rdtsc intrin.h "__rdtsc()" + check_builtin mm_empty mmintrin.h "_mm_empty()" + + enable local_aligned_8 local_aligned_16 local_aligned_32 + + # check whether EBP is available on x86 + # As 'i' is stored on the stack, this program will crash + # if the base pointer is used to access it because the + # base pointer is cleared in the inline assembly code. + check_exec_crash <<EOF && enable ebp_available +volatile int i=0; +__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp"); +return i; +EOF + + # check whether EBX is available on x86 + check_inline_asm ebx_available '""::"b"(0)' && + check_inline_asm ebx_available '"":::"%ebx"' + + # check whether xmm clobbers are supported + check_inline_asm xmm_clobbers '"":::"%xmm0"' + + check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test, %eax"' || + check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test(%rip), %eax"' + + # check whether binutils is new enough to compile SSSE3/MMXEXT + enabled ssse3 && check_inline_asm ssse3_inline '"pabsw %xmm0, %xmm0"' + enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"' + + if ! disabled_any asm mmx yasm; then + if check_cmd $yasmexe --version; then + enabled x86_64 && yasm_extra="-m amd64" + yasm_debug="-g dwarf2" + elif check_cmd nasm -v; then + yasmexe=nasm + yasm_debug="-g -F dwarf" + if enabled x86_64; then + case "$objformat" in + elf) objformat=elf64 ;; + win32) objformat=win64 ;; + esac + fi + fi + + YASMFLAGS="-f $objformat $yasm_extra" + enabled pic && append YASMFLAGS "-DPIC" + test -n "$extern_prefix" && append YASMFLAGS "-DPREFIX" + case "$objformat" in + elf*) enabled debug && append YASMFLAGS $yasm_debug ;; + esac + + check_yasm "movbe ecx, [5]" && enable yasm || + die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build." + check_yasm "vextracti128 xmm0, ymm0, 0" || disable avx2_external + check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external + check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external + check_yasm "CPU amdnop" || disable cpunop + fi + + case "$cpu" in + athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode) + disable fast_clz + ;; + esac + +fi + +check_code cc arm_neon.h "int16x8_t test = vdupq_n_s16(0)" && enable intrinsics_neon + +check_ldflags -Wl,--as-needed +check_ldflags -Wl,-z,noexecstack + +if check_func dlopen; then + ldl= +elif check_func dlopen -ldl; then + ldl=-ldl +fi + +decklink_outdev_extralibs="$decklink_outdev_extralibs $ldl" +decklink_indev_extralibs="$decklink_indev_extralibs $ldl" +frei0r_filter_extralibs='$ldl' +frei0r_src_filter_extralibs='$ldl' +ladspa_filter_extralibs='$ldl' +nvenc_encoder_extralibs='$ldl' + +if ! disabled network; then + check_func getaddrinfo $network_extralibs + check_func inet_aton $network_extralibs + + check_type netdb.h "struct addrinfo" + check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE + check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE + check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE + check_type poll.h "struct pollfd" + check_type netinet/sctp.h "struct sctp_event_subscribe" + check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len + check_type netinet/in.h "struct sockaddr_in6" + check_type "sys/types.h sys/socket.h" "struct sockaddr_storage" + check_type "sys/types.h sys/socket.h" socklen_t + + # Prefer arpa/inet.h over winsock2 + if check_header arpa/inet.h ; then + check_func closesocket + elif check_header winsock2.h ; then + check_func_headers winsock2.h closesocket -lws2 && + network_extralibs="-lws2" || + { check_func_headers winsock2.h closesocket -lws2_32 && + network_extralibs="-lws2_32"; } || disable winsock2_h network + check_func_headers ws2tcpip.h getaddrinfo $network_extralibs + + check_type ws2tcpip.h socklen_t + check_type ws2tcpip.h "struct addrinfo" + check_type ws2tcpip.h "struct group_source_req" + check_type ws2tcpip.h "struct ip_mreq_source" + check_type ws2tcpip.h "struct ipv6_mreq" + check_type winsock2.h "struct pollfd" + check_struct winsock2.h "struct sockaddr" sa_len + check_type ws2tcpip.h "struct sockaddr_in6" + check_type ws2tcpip.h "struct sockaddr_storage" + else + disable network + fi +fi + +check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)" +check_builtin atomic_compare_exchange "" "int *ptr, *oldval; int newval; __atomic_compare_exchange_n(ptr, oldval, newval, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)" +check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()" +check_builtin MemoryBarrier windows.h "MemoryBarrier()" +check_builtin sarestart signal.h "SA_RESTART" +check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)" +check_builtin gmtime_r time.h "time_t *time; struct tm *tm; gmtime_r(time, tm)" +check_builtin localtime_r time.h "time_t *time; struct tm *tm; localtime_r(time, tm)" + +case "$custom_allocator" in + jemalloc) + # jemalloc by default does not use a prefix + require libjemalloc jemalloc/jemalloc.h malloc -ljemalloc + ;; + tcmalloc) + require_pkg_config libtcmalloc gperftools/tcmalloc.h tc_malloc + malloc_prefix=tc_ + ;; +esac + +check_func_headers malloc.h _aligned_malloc && enable aligned_malloc +check_func ${malloc_prefix}memalign && enable memalign +check_func ${malloc_prefix}posix_memalign && enable posix_memalign + +check_func access +check_func arc4random +check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt && LIBRT="-lrt"; } +check_func fcntl +check_func fork +check_func gethrtime +check_func getopt +check_func getrusage +check_func gettimeofday +check_func isatty +check_func mach_absolute_time +check_func mkstemp +check_func mmap +check_func mprotect +# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that +check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt && LIBRT="-lrt"; } +check_func sched_getaffinity +check_func setrlimit +check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE +check_func strerror_r +check_func sysconf +check_func sysctl +check_func usleep + +check_func_headers conio.h kbhit +check_func_headers io.h setmode +check_func_headers lzo/lzo1x.h lzo1x_999_compress +check_func_headers stdlib.h getenv +check_func_headers sys/stat.h lstat + +check_func_headers windows.h CoTaskMemFree -lole32 +check_func_headers windows.h GetProcessAffinityMask +check_func_headers windows.h GetProcessTimes +check_func_headers windows.h GetSystemTimeAsFileTime +check_func_headers windows.h MapViewOfFile +check_func_headers windows.h PeekNamedPipe +check_func_headers windows.h SetConsoleTextAttribute +check_func_headers windows.h SetConsoleCtrlHandler +check_func_headers windows.h Sleep +check_func_headers windows.h VirtualAlloc +check_struct windows.h "CONDITION_VARIABLE" Ptr +check_func_headers glob.h glob +enabled xlib && + check_func_headers "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext + +check_header direct.h +check_header dirent.h +check_header dlfcn.h +check_header d3d11.h +check_header dxva.h +check_header dxva2api.h -D_WIN32_WINNT=0x0600 +check_header io.h +check_header libcrystalhd/libcrystalhd_if.h +check_header mach/mach_time.h +check_header malloc.h +check_header net/udplite.h +check_header poll.h +check_header sys/mman.h +check_header sys/param.h +check_header sys/resource.h +check_header sys/select.h +check_header sys/time.h +check_header sys/un.h +check_header termios.h +check_header unistd.h +check_header valgrind/valgrind.h +check_header vdpau/vdpau.h +check_header vdpau/vdpau_x11.h +check_header VideoDecodeAcceleration/VDADecoder.h +check_header VideoToolbox/VideoToolbox.h +check_header windows.h +check_header X11/extensions/XvMClib.h +check_header asm/types.h + +check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32 +check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32 +check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi +check_lib "CoreServices/CoreServices.h" UTGetOSTypeFromString "-framework CoreServices" + +check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss + +check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0 +check_type "windows.h dxva.h" "DXVA_PicParams_VP9" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0 +check_type "windows.h d3d11.h" "ID3D11VideoDecoder" +check_type "windows.h d3d11.h" "ID3D11VideoContext" +check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0602 + +check_type "va/va.h" "VAPictureParameterBufferHEVC" +check_type "va/va.h" "VADecPictureParameterBufferVP9" + +check_type "vdpau/vdpau.h" "VdpPictureInfoHEVC" + +check_cpp_condition windows.h "!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)" && enable winrt || disable winrt + +if ! disabled w32threads && ! enabled pthreads; then + check_func_headers "windows.h process.h" _beginthreadex && + enable w32threads || disable w32threads + if ! enabled w32threads && enabled winrt; then + check_func_headers "windows.h" CreateThread && + enable w32threads || disable w32threads + fi +fi + +# check for some common methods of building with pthread support +# do this before the optional library checks as some of them require pthreads +if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then + enable pthreads + if check_func pthread_join -pthread && check_func pthread_create -pthread; then + add_cflags -pthread + add_extralibs -pthread + elif check_func pthread_join -pthreads && check_func pthread_create -pthreads; then + add_cflags -pthreads + add_extralibs -pthreads + elif check_func pthread_join -ldl -pthread && check_func pthread_create -ldl -pthread; then + add_cflags -ldl -pthread + add_extralibs -ldl -pthread + elif check_func pthread_join -lpthreadGC2 && check_func pthread_create -lpthreadGC2; then + add_extralibs -lpthreadGC2 + elif check_lib pthread.h pthread_join -lpthread && check_lib pthread.h pthread_create -lpthread; then + : + elif ! check_func pthread_join && ! check_func pthread_create; then + disable pthreads + fi + check_code cc "pthread.h" "static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER" || disable pthreads +fi + + +if enabled pthreads; then + check_func pthread_cancel +fi + +disabled zlib || check_lib zlib.h zlibVersion -lz || disable zlib +disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib +disabled lzma || check_lib2 lzma.h lzma_version_number -llzma || disable lzma + +check_lib math.h sin -lm && LIBM="-lm" +disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd + +atan2f_args=2 +copysign_args=2 +hypot_args=2 +ldexpf_args=2 +powf_args=2 + +for func in $MATH_FUNCS; do + eval check_mathfunc $func \${${func}_args:-1} +done + +for func in $COMPLEX_FUNCS; do + eval check_complexfunc $func \${${func}_args:-1} +done + +# these are off by default, so fail if requested and not available +enabled avfoundation_indev && { check_header_objcc AVFoundation/AVFoundation.h || disable avfoundation_indev; } +enabled avfoundation_indev && { check_lib2 CoreGraphics/CoreGraphics.h CGGetActiveDisplayList -framework CoreGraphics || + check_lib2 ApplicationServices/ApplicationServices.h CGGetActiveDisplayList -framework ApplicationServices; } +enabled avisynth && { { check_lib2 "windows.h" LoadLibrary; } || + { check_lib2 "dlfcn.h" dlopen -ldl; } || + die "ERROR: LoadLibrary/dlopen not found for avisynth"; } +enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint +enabled decklink && { check_header DeckLinkAPI.h || die "ERROR: DeckLinkAPI.h header not found"; } +enabled frei0r && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; } +enabled gmp && require2 gmp gmp.h mpz_export -lgmp +enabled gnutls && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init +enabled ladspa && { check_header ladspa.h || die "ERROR: ladspa.h header not found"; } +enabled libiec61883 && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883 +enabled libass && require_pkg_config libass ass/ass.h ass_library_init +enabled libbluray && require_pkg_config libbluray libbluray/bluray.h bd_open +enabled libbs2b && require_pkg_config libbs2b bs2b.h bs2b_open +enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 && + { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 || + die "ERROR: libcelt must be installed and version must be >= 0.11.0."; } +enabled libcaca && require_pkg_config caca caca.h caca_create_canvas +enabled libdcadec && require_pkg_config "dcadec >= 0.1.0" libdcadec/dca_context.h dcadec_context_create +enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac +enabled libfdk_aac && { use_pkg_config fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen || + { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac && + warn "using libfdk without pkg-config"; } } +flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite" +enabled libflite && require2 libflite "flite/flite.h" flite_init $flite_libs +enabled fontconfig && enable libfontconfig +enabled libfontconfig && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit +enabled libfreetype && require_libfreetype +enabled libfribidi && require_pkg_config fribidi fribidi.h fribidi_version_info +enabled libgme && require libgme gme/gme.h gme_new_emu -lgme -lstdc++ +enabled libgsm && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do + check_lib "${gsm_hdr}" gsm_create -lgsm && break; + done || die "ERROR: libgsm not found"; } +enabled libilbc && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc +enabled libkvazaar && require_pkg_config "kvazaar >= 0.8.1" kvazaar.h kvz_api_get +enabled libmfx && require_pkg_config libmfx "mfx/mfxvideo.h" MFXInit +enabled libmodplug && require_pkg_config libmodplug libmodplug/modplug.h ModPlug_Load +enabled libmp3lame && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame +enabled libnut && require libnut libnut.h nut_demuxer_init -lnut +enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb +enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb +enabled libopencv && { check_header opencv2/core/core_c.h && + require_pkg_config opencv opencv2/core/core_c.h cvCreateImageHeader || + require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader; } +enabled libopenh264 && require_pkg_config openh264 wels/codec_api.h WelsGetCodecVersion +enabled libopenjpeg && { check_lib openjpeg-2.1/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC || + check_lib openjpeg-2.0/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC || + check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC || + check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC || + die "ERROR: libopenjpeg not found"; } +enabled libopus && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create +enabled libpulse && require_pkg_config libpulse pulse/pulseaudio.h pa_context_new +enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket +enabled librubberband && require_pkg_config "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new +enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init +enabled libshine && require_pkg_config shine shine/layer3.h shine_encode_buffer +enabled libsmbclient && { use_pkg_config smbclient libsmbclient.h smbc_init || + require smbclient libsmbclient.h smbc_init -lsmbclient; } +enabled libsnappy && require snappy snappy-c.h snappy_compress -lsnappy +enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr && LIBSOXR="-lsoxr" +enabled libssh && require_pkg_config libssh libssh/sftp.h sftp_init +enabled libspeex && require_pkg_config speex speex/speex.h speex_decoder_init -lspeex +enabled libtesseract && require_pkg_config tesseract tesseract/capi.h TessBaseAPICreate +enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg +enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame && + { check_lib twolame.h twolame_encode_buffer_float32_interleaved -ltwolame || + die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; } +enabled libutvideo && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++ +enabled libv4l2 && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl +enabled libvidstab && require_pkg_config "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit +enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc +enabled libvorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg + +enabled libvpx && { + enabled libvpx_vp8_decoder && { + use_pkg_config "vpx >= 0.9.1" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp8_dx || + check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx || + die "ERROR: libvpx decoder version must be >=0.9.1"; + } + enabled libvpx_vp8_encoder && { + use_pkg_config "vpx >= 0.9.7" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp8_cx || + check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx || + die "ERROR: libvpx encoder version must be >=0.9.7"; + } + enabled libvpx_vp9_decoder && { + use_pkg_config "vpx >= 1.3.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp9_dx || + check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || + disable libvpx_vp9_decoder; + } + enabled libvpx_vp9_encoder && { + use_pkg_config "vpx >= 1.3.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp9_cx || + check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VP9E_SET_AQ_MODE" -lvpx || + disable libvpx_vp9_encoder; + } + if disabled_all libvpx_vp8_decoder libvpx_vp9_decoder libvpx_vp8_encoder libvpx_vp9_encoder; then + die "libvpx enabled but no supported decoders found" + fi +} + +enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput -lwavpack +enabled libwebp && { + enabled libwebp_encoder && require_pkg_config "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion + enabled libwebp_anim_encoder && { use_pkg_config "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit || disable libwebp_anim_encoder; } } +enabled libx264 && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode || + { require libx264 x264.h x264_encoder_encode -lx264 && + warn "using libx264 without pkg-config"; } } && + { check_cpp_condition x264.h "X264_BUILD >= 118" || + die "ERROR: libx264 must be installed and version must be >= 0.118."; } && + { check_cpp_condition x264.h "X264_MPEG2" && + enable libx262; } +enabled libx265 && require_pkg_config x265 x265.h x265_api_get && + { check_cpp_condition x265.h "X265_BUILD >= 68" || + die "ERROR: libx265 version must be >= 68."; } +enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs +enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore +enabled libzimg && require_pkg_config zimg zimg.h zimg_get_api_version +enabled libzmq && require_pkg_config libzmq zmq.h zmq_ctx_new +enabled libzvbi && require libzvbi libzvbi.h vbi_decoder_new -lzvbi && + { check_cpp_condition libzvbi.h "VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28" || + enabled gpl || die "ERROR: libzvbi requires version 0.2.28 or --enable-gpl."; } +enabled mmal && { check_lib interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host || + { ! enabled cross_compile && { + add_cflags -isystem/opt/vc/include/ -isystem/opt/vc/include/interface/vmcs_host/linux -isystem/opt/vc/include/interface/vcos/pthreads -fgnu89-inline ; + add_extralibs -L/opt/vc/lib/ -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host ; + check_lib interface/mmal/mmal.h mmal_port_connect ; } + check_lib interface/mmal/mmal.h mmal_port_connect ; } || + die "ERROR: mmal not found"; } +enabled mmal && + (check_code cc interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS" || + die "ERROR: mmal firmware headers too old") + +enabled netcdf && require_pkg_config netcdf netcdf.h nc_inq_libvers +enabled nvenc && { check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found."; } && + { check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" || + die "ERROR: NVENC API version 4 or older is not supported"; } && + { [ $target_os != cygwin ] || die "ERROR: NVENC is not supported on Cygwin currently."; } +enabled openal && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do + check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } || + die "ERROR: openal not found"; } && + { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" || + die "ERROR: openal must be installed and version must be 1.1 or compatible"; } +enabled opencl && { check_lib2 OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL || + check_lib2 CL/cl.h clEnqueueNDRangeKernel -lOpenCL || + die "ERROR: opencl not found"; } && + { check_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" || + check_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" || + die "ERROR: opencl must be installed and version must be 1.2 or compatible"; } +enabled opengl && { check_lib GL/glx.h glXGetProcAddress "-lGL" || + check_lib2 windows.h wglGetProcAddress "-lopengl32 -lgdi32" || + check_lib2 OpenGL/gl3.h glGetError "-Wl,-framework,OpenGL" || + check_lib2 ES2/gl.h glGetError "-isysroot=${sysroot} -Wl,-framework,OpenGLES" || + die "ERROR: opengl not found." + } +enabled openssl && { use_pkg_config openssl openssl/ssl.h SSL_library_init || + check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto || + check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 || + check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 || + die "ERROR: openssl not found"; } +enabled qtkit_indev && { check_header_objcc QTKit/QTKit.h || disable qtkit_indev; } + +# libdc1394 check +if enabled libdc1394; then + { require_pkg_config libdc1394-2 dc1394/dc1394.h dc1394_new && + enable libdc1394_2; } || + { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 && + enable libdc1394_1; } || + die "ERROR: No version of libdc1394 found " +fi + +if enabled gcrypt; then + GCRYPT_CONFIG="${cross_prefix}libgcrypt-config" + if "${GCRYPT_CONFIG}" --version > /dev/null 2>&1; then + gcrypt_cflags=$("${GCRYPT_CONFIG}" --cflags) + gcrypt_libs=$("${GCRYPT_CONFIG}" --libs) + check_func_headers gcrypt.h gcry_mpi_new $gcrypt_cflags $gcrypt_libs || + die "ERROR: gcrypt not found" + add_cflags $gcrypt_cflags && add_extralibs $gcrypt_libs + else + require2 gcrypt gcrypt.h gcry_mpi_new -lgcrypt + fi +fi + +if ! disabled sdl; then + SDL_CONFIG="${cross_prefix}sdl-config" + if check_pkg_config sdl SDL_events.h SDL_PollEvent; then + check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags && + check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags && + enable sdl + else + if "${SDL_CONFIG}" --version > /dev/null 2>&1; then + sdl_cflags=$("${SDL_CONFIG}" --cflags) + sdl_libs=$("${SDL_CONFIG}" --libs) + check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs && + check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags && + check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags && + enable sdl + elif enabled sdl ; then + die "ERROR: SDL not found" + else + disable sdl + fi + fi + if test $target_os = "mingw32"; then + sdl_libs="$sdl_libs -mconsole" + fi +fi +enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs + +disabled securetransport || { check_func SecIdentityCreate "-Wl,-framework,CoreFoundation -Wl,-framework,Security" && + check_lib2 "Security/SecureTransport.h Security/Security.h" "SSLCreateContext SecItemImport" "-Wl,-framework,CoreFoundation -Wl,-framework,Security" && + enable securetransport; } + +disabled schannel || { check_func_headers "windows.h Security.h" InitializeSecurityContext -DSECURITY_WIN32 -lSecur32 && + enable schannel && add_extralibs -lSecur32; } + +makeinfo --version > /dev/null 2>&1 && enable makeinfo || disable makeinfo +enabled makeinfo \ + && [ 0$(makeinfo --version | grep "texinfo" | sed 's/.*texinfo[^0-9]*\([0-9]*\)\..*/\1/') -ge 5 ] \ + && enable makeinfo_html || disable makeinfo_html +disabled makeinfo_html && texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html +perl -v > /dev/null 2>&1 && enable perl || disable perl +pod2man --help > /dev/null 2>&1 && enable pod2man || disable pod2man +rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout + +check_header linux/fb.h +check_header linux/videodev.h +check_header linux/videodev2.h +check_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete + +check_header sys/videoio.h +check_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete + +check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs" +# check that WM_CAP_DRIVER_CONNECT is defined to the proper value +# w32api 3.12 had it defined wrong +check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines + +check_type "dshow.h" IBaseFilter + +# check for ioctl_meteor.h, ioctl_bt848.h and alternatives +{ check_header dev/bktr/ioctl_meteor.h && + check_header dev/bktr/ioctl_bt848.h; } || +{ check_header machine/ioctl_meteor.h && + check_header machine/ioctl_bt848.h; } || +{ check_header dev/video/meteor/ioctl_meteor.h && + check_header dev/video/bktr/ioctl_bt848.h; } || +check_header dev/ic/bt8xx.h + +check_header sndio.h +if check_struct sys/soundcard.h audio_buf_info bytes; then + enable_safe sys/soundcard.h +else + check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h + #include <sys/soundcard.h> + audio_buf_info abc; +EOF +fi +check_header soundcard.h + +enabled_any alsa_indev alsa_outdev && + check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound + +enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait && + check_func jack_port_get_latency_range -ljack + +enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio + +if enabled libcdio; then + check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio || + check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio || + die "ERROR: No usable libcdio/cdparanoia found" +fi + +enabled xlib && + check_lib X11/Xlib.h XOpenDisplay -lX11 || disable xlib + +if ! disabled libxcb; then + check_pkg_config "xcb >= 1.4" xcb/xcb.h xcb_connect || { + enabled libxcb && die "ERROR: libxcb >= 1.4 not found"; + } && disable x11grab && enable libxcb + +if enabled libxcb; then + disabled libxcb_shm || { + check_pkg_config xcb-shm xcb/shm.h xcb_shm_attach || { + enabled libxcb_shm && die "ERROR: libxcb_shm not found"; + } && check_header sys/shm.h && enable libxcb_shm; } + + disabled libxcb_xfixes || { + check_pkg_config xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image || { + enabled libxcb_xfixes && die "ERROR: libxcb_xfixes not found"; + } && enable libxcb_xfixes; } + + disabled libxcb_shape || { + check_pkg_config xcb-shape xcb/shape.h xcb_shape_get_rectangles || { + enabled libxcb_shape && die "ERROR: libxcb_shape not found"; + } && enable libxcb_shape; } + + add_cflags $xcb_cflags $xcb_shm_cflags $xcb_xfixes_cflags $xcb_shape_cflags + add_extralibs $xcb_libs $xcb_shm_libs $xcb_xfixes_libs $xcb_shape_libs +fi +fi + +if enabled x11grab; then + enabled xlib || die "ERROR: Xlib not found" + require Xext X11/extensions/XShm.h XShmCreateImage -lXext + require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes +fi + +check_func_headers "windows.h" CreateDIBSection "$gdigrab_indev_extralibs" + +enabled dxva2api_h && + check_cc <<EOF && enable dxva2api_cobj +#define _WIN32_WINNT 0x0600 +#define COBJMACROS +#include <windows.h> +#include <d3d9.h> +#include <dxva2api.h> +int main(void) { IDirectXVideoDecoder *o = NULL; IDirectXVideoDecoder_Release(o); return 0; } +EOF + +enabled vaapi && + check_lib va/va.h vaInitialize -lva || + disable vaapi + +enabled vaapi && enabled xlib && + check_lib2 "va/va.h va/va_x11.h" vaGetDisplay -lva -lva-x11 && + enable vaapi_x11 + +enabled vdpau && + check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" || + disable vdpau + +enabled vdpau && enabled xlib && + check_func_headers "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau && + prepend ffmpeg_libs $($ldflags_filter "-lvdpau") && + enable vdpau_x11 + +# Funny iconv installations are not unusual, so check it after all flags have been set +disabled iconv || check_func_headers iconv.h iconv || check_lib2 iconv.h iconv -liconv || disable iconv + +enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel" + +# add some useful compiler flags if supported +check_cflags -Wdeclaration-after-statement +check_cflags -Wall +check_cflags -Wdisabled-optimization +check_cflags -Wpointer-arith +check_cflags -Wredundant-decls +check_cflags -Wwrite-strings +check_cflags -Wtype-limits +check_cflags -Wundef +check_cflags -Wmissing-prototypes +check_cflags -Wno-pointer-to-int-cast +check_cflags -Wstrict-prototypes +check_cflags -Wempty-body +enabled extra_warnings && check_cflags -Winline +enabled extra_warnings && check_cflags -Wcast-qual + +check_disable_warning(){ + warning_flag=-W${1#-Wno-} + test_cflags $warning_flag && add_cflags $1 +} + +check_disable_warning -Wno-parentheses +check_disable_warning -Wno-switch +check_disable_warning -Wno-format-zero-length +check_disable_warning -Wno-pointer-sign +check_disable_warning -Wno-unused-const-variable + +# add some linker flags +check_ldflags -Wl,--warn-common +check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample +enabled rpath && add_ldexeflags -Wl,-rpath,$libdir +enabled rpath && add_ldlibflags -Wl,-rpath,$libdir +test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic + +# add some strip flags +# -wN '..@*' is more selective than -x, but not available everywhere. +check_stripflags -wN \'..@*\' || check_stripflags -x + +enabled neon_clobber_test && + check_ldflags -Wl,--wrap,avcodec_open2 \ + -Wl,--wrap,avcodec_decode_audio4 \ + -Wl,--wrap,avcodec_decode_video2 \ + -Wl,--wrap,avcodec_decode_subtitle2 \ + -Wl,--wrap,avcodec_encode_audio2 \ + -Wl,--wrap,avcodec_encode_video2 \ + -Wl,--wrap,avcodec_encode_subtitle \ + -Wl,--wrap,swr_convert \ + -Wl,--wrap,avresample_convert || + disable neon_clobber_test + +enabled xmm_clobber_test && + check_ldflags -Wl,--wrap,avcodec_open2 \ + -Wl,--wrap,avcodec_decode_audio4 \ + -Wl,--wrap,avcodec_decode_video2 \ + -Wl,--wrap,avcodec_decode_subtitle2 \ + -Wl,--wrap,avcodec_encode_audio2 \ + -Wl,--wrap,avcodec_encode_video2 \ + -Wl,--wrap,avcodec_encode_subtitle \ + -Wl,--wrap,swr_convert \ + -Wl,--wrap,avresample_convert \ + -Wl,--wrap,sws_scale || + disable xmm_clobber_test + +echo "X { local: *; };" > $TMPV +if test_ldflags -Wl,--version-script,$TMPV; then + append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver' +elif test_ldflags -Wl,-M,$TMPV; then + append SHFLAGS '-Wl,-M,\$(SUBDIR)lib\$(NAME).ver-sol2' +fi + +check_cc <<EOF && enable symver_asm_label +void ff_foo(void) __asm__ ("av_foo@VERSION"); +void ff_foo(void) { ${inline_asm+__asm__($quotes);} } +EOF + check_cc <<EOF && enable symver_gnu_asm +__asm__(".symver ff_foo,av_foo@VERSION"); +void ff_foo(void) {} +EOF + +if [ -z "$optflags" ]; then + if enabled small; then + optflags=$cflags_size + elif enabled optimizations; then + optflags=$cflags_speed + else + optflags=$cflags_noopt + fi +fi + +check_optflags(){ + check_cflags "$@" + enabled lto && check_ldflags "$@" +} + + +if enabled lto; then + test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker" + check_cflags -flto + check_ldflags -flto $cpuflags + disable inline_asm_direct_symbol_refs +fi + +check_optflags $optflags +check_optflags -fno-math-errno +check_optflags -fno-signed-zeros + +enabled ftrapv && check_cflags -ftrapv + +check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone" +int x; +EOF + + +if enabled icc; then + # Just warnings, no remarks + check_cflags -w1 + # -wd: Disable following warnings + # 144, 167, 556: -Wno-pointer-sign + # 188: enumerated type mixed with another type + # 1292: attribute "foo" ignored + # 1419: external declaration in primary source file + # 10006: ignoring unknown option -fno-signed-zeros + # 10148: ignoring unknown option -Wno-parentheses + # 10156: ignoring option '-W'; no argument required + # 13200: No EMMS instruction before call to function + # 13203: No EMMS instruction before return from function + check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156,13200,13203 + # 11030: Warning unknown option --as-needed + # 10156: ignoring option '-export'; no argument required + check_ldflags -wd10156,11030 + # icc 11.0 and 11.1 work with ebp_available, but don't pass the test + enable ebp_available + # The test above does not test linking + enabled lto && disable symver_asm_label + if enabled x86_32; then + icc_version=$($cc -dumpversion) + test ${icc_version%%.*} -ge 11 && + check_cflags -falign-stack=maintain-16-byte || + disable aligned_stack + fi +elif enabled ccc; then + # disable some annoying warnings + add_cflags -msg_disable bitnotint + add_cflags -msg_disable mixfuncvoid + add_cflags -msg_disable nonstandcast + add_cflags -msg_disable unsupieee +elif enabled gcc; then + case $gcc_basever in + 4.9*) enabled x86 || check_optflags -fno-tree-vectorize ;; + 4.*) check_optflags -fno-tree-vectorize ;; + *) enabled x86 || check_optflags -fno-tree-vectorize ;; + esac + check_cflags -Werror=format-security + check_cflags -Werror=implicit-function-declaration + check_cflags -Werror=missing-prototypes + check_cflags -Werror=return-type + check_cflags -Werror=vla + check_cflags -Wformat + check_cflags -fdiagnostics-color=auto + enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized +elif enabled llvm_gcc; then + check_cflags -mllvm -stack-alignment=16 +elif enabled clang; then + check_cflags -mllvm -stack-alignment=16 + check_cflags -Qunused-arguments + check_cflags -Werror=implicit-function-declaration + check_cflags -Werror=missing-prototypes + check_cflags -Werror=return-type +elif enabled cparser; then + add_cflags -Wno-missing-variable-declarations + add_cflags -Wno-empty-statement +elif enabled armcc; then + add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat + add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir + # 2523: use of inline assembly is deprecated + add_cflags -W${armcc_opt},--diag_suppress=2523 + add_cflags -W${armcc_opt},--diag_suppress=1207 + add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition + add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat + add_cflags -W${armcc_opt},--diag_suppress=167 # pointer sign + add_cflags -W${armcc_opt},--diag_suppress=513 # pointer sign +elif enabled tms470; then + add_cflags -pds=824 -pds=837 + disable inline_asm +elif enabled pathscale; then + add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF +elif enabled_any msvc icl; then + enabled x86_32 && disable aligned_stack + enabled_all x86_32 debug && add_cflags -Oy- + enabled debug && add_ldflags -debug + enable pragma_deprecated + if enabled icl; then + # -Qansi-alias is basically -fstrict-aliasing, but does not work + # (correctly) on icl 13.x. + check_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" && + add_cflags -Qansi-alias + # Some inline asm is not compilable in debug + if enabled debug; then + disable ebp_available + disable ebx_available + fi + fi + # msvcrt10 x64 incorrectly enables log2, only msvcrt12 (MSVC 2013) onwards actually has log2. + check_cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION >= 12" || disable log2 + # The CRT headers contain __declspec(restrict) in a few places, but if redefining + # restrict, this might break. MSVC 2010 and 2012 fail with __declspec(__restrict) + # (as it ends up if the restrict redefine is done before including stdlib.h), while + # MSVC 2013 and newer can handle it fine. + # If this declspec fails, force including stdlib.h before the restrict redefinition + # happens in config.h. + if [ $_restrict != restrict ]; then + check_cc <<EOF || add_cflags -FIstdlib.h +__declspec($_restrict) void* foo(int); +EOF + fi + check_func strtoll || add_cflags -Dstrtoll=_strtoi64 +fi + +for pfx in "" host_; do + varname=${pfx%_}cc_type + eval "type=\$$varname" + if [ $type = "msvc" ]; then + check_${pfx}cc <<EOF || add_${pfx}cflags -Dinline=__inline +static inline int foo(int a) { return a; } +EOF + fi +done + +case $as_type in + clang) + add_asflags -Qunused-arguments + ;; +esac + +case $ld_type in + clang) + check_ldflags -Qunused-arguments + ;; +esac + +case $target_os in + osf1) + enabled ccc && add_ldflags '-Wl,-expect_unresolved,*' + ;; + plan9) + add_cppflags -Dmain=plan9_main + ;; +esac + +enable frame_thread_encoder + +enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; } + +check_deps $CONFIG_LIST \ + $CONFIG_EXTRA \ + $HAVE_LIST \ + $ALL_COMPONENTS \ + +enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86" + + +if test $target_os = "haiku"; then + disable memalign + disable posix_memalign +fi + +enabled_all dxva2 dxva2api_cobj CoTaskMemFree && + prepend ffmpeg_libs $($ldflags_filter "-lole32" "-luser32") && + enable dxva2_lib + +! enabled_any memalign posix_memalign aligned_malloc && + enabled simd_align_16 && enable memalign_hack + +# add_dep lib dep +# -> enable ${lib}_deps_${dep} +# -> add $dep to ${lib}_deps only once +add_dep() { + lib=$1 + dep=$2 + enabled "${lib}_deps_${dep}" && return 0 + enable "${lib}_deps_${dep}" + prepend "${lib}_deps" $dep +} + +# merge deps lib components +# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_* +merge_deps() { + lib=$1 + shift + for comp in $*; do + enabled $comp || continue + eval "dep=\"\$${comp}_deps\"" + for d in $dep; do + add_dep $lib $d + done + done +} + +merge_deps libavfilter $FILTER_LIST + +map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST + +for thread in $THREADS_LIST; do + if enabled $thread; then + test -n "$thread_type" && + die "ERROR: Only one thread type must be selected." || + thread_type="$thread" + fi +done + +enabled zlib && add_cppflags -DZLIB_CONST + +# conditional library dependencies, in linking order +enabled afftfilt_filter && prepend avfilter_deps "avcodec" +enabled amovie_filter && prepend avfilter_deps "avformat avcodec" +enabled aresample_filter && prepend avfilter_deps "swresample" +enabled asyncts_filter && prepend avfilter_deps "avresample" +enabled atempo_filter && prepend avfilter_deps "avcodec" +enabled cover_rect_filter && prepend avfilter_deps "avformat avcodec" +enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample" +enabled elbg_filter && prepend avfilter_deps "avcodec" +enabled fftfilt_filter && prepend avfilter_deps "avcodec" +enabled find_rect_filter && prepend avfilter_deps "avformat avcodec" +enabled mcdeint_filter && prepend avfilter_deps "avcodec" +enabled movie_filter && prepend avfilter_deps "avformat avcodec" +enabled pan_filter && prepend avfilter_deps "swresample" +enabled pp_filter && prepend avfilter_deps "postproc" +enabled removelogo_filter && prepend avfilter_deps "avformat avcodec swscale" +enabled resample_filter && prepend avfilter_deps "avresample" +enabled sab_filter && prepend avfilter_deps "swscale" +enabled scale_filter && prepend avfilter_deps "swscale" +enabled scale2ref_filter && prepend avfilter_deps "swscale" +enabled sofalizer_filter && prepend avfilter_deps "avcodec" +enabled showcqt_filter && prepend avfilter_deps "avformat avcodec swscale" +enabled showfreqs_filter && prepend avfilter_deps "avcodec" +enabled showspectrum_filter && prepend avfilter_deps "avcodec" +enabled smartblur_filter && prepend avfilter_deps "swscale" +enabled spectrumsynth_filter && prepend avfilter_deps "avcodec" +enabled subtitles_filter && prepend avfilter_deps "avformat avcodec" +enabled uspp_filter && prepend avfilter_deps "avcodec" + +enabled lavfi_indev && prepend avdevice_deps "avfilter" + +enabled opus_decoder && prepend avcodec_deps "swresample" + +expand_deps(){ + lib_deps=${1}_deps + eval "deps=\$$lib_deps" + append $lib_deps $(map 'eval echo \$${v}_deps' $deps) + unique $lib_deps +} + +#we have to remove gpl from the deps here as some code assumes all lib deps are libs +postproc_deps="$(filter_out 'gpl' $postproc_deps)" + +map 'expand_deps $v' $LIBRARY_LIST + +echo "install prefix $prefix" +echo "source path $source_path" +echo "C compiler $cc" +echo "C library $libc_type" +if test "$host_cc" != "$cc"; then + echo "host C compiler $host_cc" + echo "host C library $host_libc_type" +fi +echo "ARCH $arch ($cpu)" +if test "$build_suffix" != ""; then + echo "build suffix $build_suffix" +fi +if test "$progs_suffix" != ""; then + echo "progs suffix $progs_suffix" +fi +if test "$extra_version" != ""; then + echo "version string suffix $extra_version" +fi +echo "big-endian ${bigendian-no}" +echo "runtime cpu detection ${runtime_cpudetect-no}" +if enabled x86; then + echo "${yasmexe} ${yasm-no}" + echo "MMX enabled ${mmx-no}" + echo "MMXEXT enabled ${mmxext-no}" + echo "3DNow! enabled ${amd3dnow-no}" + echo "3DNow! extended enabled ${amd3dnowext-no}" + echo "SSE enabled ${sse-no}" + echo "SSSE3 enabled ${ssse3-no}" + echo "AESNI enabled ${aesni-no}" + echo "AVX enabled ${avx-no}" + echo "XOP enabled ${xop-no}" + echo "FMA3 enabled ${fma3-no}" + echo "FMA4 enabled ${fma4-no}" + echo "i686 features enabled ${i686-no}" + echo "CMOV is fast ${fast_cmov-no}" + echo "EBX available ${ebx_available-no}" + echo "EBP available ${ebp_available-no}" +fi +if enabled aarch64; then + echo "NEON enabled ${neon-no}" + echo "VFP enabled ${vfp-no}" +fi +if enabled arm; then + echo "ARMv5TE enabled ${armv5te-no}" + echo "ARMv6 enabled ${armv6-no}" + echo "ARMv6T2 enabled ${armv6t2-no}" + echo "VFP enabled ${vfp-no}" + echo "NEON enabled ${neon-no}" + echo "THUMB enabled ${thumb-no}" +fi +if enabled mips; then + echo "MIPS FPU enabled ${mipsfpu-no}" + echo "MIPS DSP R1 enabled ${mipsdsp-no}" + echo "MIPS DSP R2 enabled ${mipsdspr2-no}" + echo "MIPS MSA enabled ${msa-no}" + echo "LOONGSON MMI enabled ${mmi-no}" +fi +if enabled ppc; then + echo "AltiVec enabled ${altivec-no}" + echo "VSX enabled ${vsx-no}" + echo "POWER8 enabled ${power8-no}" + echo "PPC 4xx optimizations ${ppc4xx-no}" + echo "dcbzl available ${dcbzl-no}" +fi +echo "debug symbols ${debug-no}" +echo "strip symbols ${stripping-no}" +echo "optimize for size ${small-no}" +echo "optimizations ${optimizations-no}" +echo "static ${static-no}" +echo "shared ${shared-no}" +echo "postprocessing support ${postproc-no}" +echo "new filter support ${avfilter-no}" +echo "network support ${network-no}" +echo "threading support ${thread_type-no}" +echo "safe bitstream reader ${safe_bitstream_reader-no}" +echo "SDL support ${sdl-no}" +echo "opencl enabled ${opencl-no}" +echo "texi2html enabled ${texi2html-no}" +echo "perl enabled ${perl-no}" +echo "pod2man enabled ${pod2man-no}" +echo "makeinfo enabled ${makeinfo-no}" +echo "makeinfo supports HTML ${makeinfo_html-no}" +test -n "$random_seed" && + echo "random seed ${random_seed}" +echo + +echo "Enabled programs:" +print_enabled '' $PROGRAM_LIST | print_in_columns +echo + +echo "External libraries:" +print_enabled '' $EXTERNAL_LIBRARY_LIST | print_in_columns +echo + +for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do + echo "Enabled ${type}s:" + eval list=\$$(toupper $type)_LIST + print_enabled '_*' $list | print_in_columns + echo +done + +license="LGPL version 2.1 or later" +if enabled nonfree; then + license="nonfree and unredistributable" +elif enabled gplv3; then + license="GPL version 3 or later" +elif enabled lgplv3; then + license="LGPL version 3 or later" +elif enabled gpl; then + license="GPL version 2 or later" +fi + +echo "License: $license" + +echo "Creating config.mak, config.h, and doc/config.texi..." + +test -e Makefile || echo "include $source_path/Makefile" > Makefile + +enabled stripping || strip="echo skipping strip" + +config_files="$TMPH config.mak doc/config.texi" + +cat > config.mak <<EOF +# Automatically generated by configure - do not modify! +ifndef FFMPEG_CONFIG_MAK +FFMPEG_CONFIG_MAK=1 +FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION +prefix=$prefix +LIBDIR=\$(DESTDIR)$libdir +SHLIBDIR=\$(DESTDIR)$shlibdir +INCDIR=\$(DESTDIR)$incdir +BINDIR=\$(DESTDIR)$bindir +DATADIR=\$(DESTDIR)$datadir +DOCDIR=\$(DESTDIR)$docdir +MANDIR=\$(DESTDIR)$mandir +PKGCONFIGDIR=\$(DESTDIR)$pkgconfigdir +SRC_PATH=$source_path +SRC_LINK=$source_link +ifndef MAIN_MAKEFILE +SRC_PATH:=\$(SRC_PATH:.%=..%) +endif +CC_IDENT=$cc_ident +ARCH=$arch +INTRINSICS=$intrinsics +CC=$cc +CXX=$cxx +AS=$as +OBJCC=$objcc +LD=$ld +DEPCC=$dep_cc +DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS) +DEPAS=$as +DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS) +YASM=$yasmexe +DEPYASM=$yasmexe +AR=$ar +ARFLAGS=$arflags +AR_O=$ar_o +RANLIB=$ranlib +STRIP=$strip +CP=cp -p +LN_S=$ln_s +CPPFLAGS=$CPPFLAGS +CFLAGS=$CFLAGS +CXXFLAGS=$CXXFLAGS +OBJCFLAGS=$OBJCFLAGS +ASFLAGS=$ASFLAGS +AS_C=$AS_C +AS_O=$AS_O +OBJCC_C=$OBJCC_C +OBJCC_E=$OBJCC_E +OBJCC_O=$OBJCC_O +CC_C=$CC_C +CC_E=$CC_E +CC_O=$CC_O +CXX_C=$CXX_C +CXX_O=$CXX_O +LD_O=$LD_O +LD_LIB=$LD_LIB +LD_PATH=$LD_PATH +DLLTOOL=$dlltool +WINDRES=$windres +DEPWINDRES=$dep_cc +DOXYGEN=$doxygen +LDFLAGS=$LDFLAGS +LDEXEFLAGS=$LDEXEFLAGS +LDLIBFLAGS=$LDLIBFLAGS +SHFLAGS=$(echo $($ldflags_filter $SHFLAGS)) +ASMSTRIPFLAGS=$ASMSTRIPFLAGS +YASMFLAGS=$YASMFLAGS +BUILDSUF=$build_suffix +PROGSSUF=$progs_suffix +FULLNAME=$FULLNAME +LIBPREF=$LIBPREF +LIBSUF=$LIBSUF +LIBNAME=$LIBNAME +SLIBPREF=$SLIBPREF +SLIBSUF=$SLIBSUF +EXESUF=$EXESUF +EXTRA_VERSION=$extra_version +CCDEP=$CCDEP +CXXDEP=$CXXDEP +CCDEP_FLAGS=$CCDEP_FLAGS +ASDEP=$ASDEP +ASDEP_FLAGS=$ASDEP_FLAGS +CC_DEPFLAGS=$CC_DEPFLAGS +AS_DEPFLAGS=$AS_DEPFLAGS +HOSTCC=$host_cc +HOSTLD=$host_ld +HOSTCFLAGS=$host_cflags +HOSTCPPFLAGS=$host_cppflags +HOSTEXESUF=$HOSTEXESUF +HOSTLDFLAGS=$host_ldflags +HOSTLIBS=$host_libs +DEPHOSTCC=$host_cc +DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS) +HOSTCCDEP=$HOSTCCDEP +HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS +HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS +HOSTCC_C=$HOSTCC_C +HOSTCC_O=$HOSTCC_O +HOSTLD_O=$HOSTLD_O +TARGET_EXEC=$target_exec $target_exec_args +TARGET_PATH=$target_path +TARGET_SAMPLES=${target_samples:-\$(SAMPLES)} +CFLAGS-ffplay=$sdl_cflags +ZLIB=$($ldflags_filter -lz) +LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD +EXTRALIBS=$extralibs +COMPAT_OBJS=$compat_objs +EXEOBJS=$exeobjs +INSTALL=$install +LIBTARGET=${LIBTARGET} +SLIBNAME=${SLIBNAME} +SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION} +SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR} +SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD} +SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD} +SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME} +SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS} +SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB} +SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB} +SAMPLES:=${samples:-\$(FATE_SAMPLES)} +NOREDZONE_FLAGS=$noredzone_flags +EOF + +get_version(){ + lcname=lib${1} + name=$(toupper $lcname) + file=$source_path/$lcname/version.h + eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file") + enabled raise_major && eval ${name}_VERSION_MAJOR=$((${name}_VERSION_MAJOR+100)) + eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO + eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak + eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak + eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak +} + +map 'get_version $v' $LIBRARY_LIST + +map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> config.mak' $LIBRARY_LIST + +print_program_libs(){ + eval "program_libs=\$${1}_libs" + eval echo "LIBS-${1}=${program_libs}" >> config.mak +} + +map 'print_program_libs $v' $PROGRAM_LIST + +cat > $TMPH <<EOF +/* Automatically generated by configure - do not modify! */ +#ifndef FFMPEG_CONFIG_H +#define FFMPEG_CONFIG_H +#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)" +#define FFMPEG_LICENSE "$(c_escape $license)" +#define CONFIG_THIS_YEAR 2016 +#define FFMPEG_DATADIR "$(eval c_escape $datadir)" +#define AVCONV_DATADIR "$(eval c_escape $datadir)" +#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})" +#define av_restrict $_restrict +#define EXTERN_PREFIX "${extern_prefix}" +#define EXTERN_ASM ${extern_prefix} +#define BUILDSUF "$build_suffix" +#define SLIBSUF "$SLIBSUF" +#define HAVE_MMX2 HAVE_MMXEXT +#define SWS_MAX_FILTER_SIZE $sws_max_filter_size +EOF + +test -n "$assert_level" && + echo "#define ASSERT_LEVEL $assert_level" >>$TMPH + +test -n "$malloc_prefix" && + echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH + +if enabled yasm; then + append config_files $TMPASM + printf '' >$TMPASM +fi + +enabled getenv || echo "#define getenv(x) NULL" >> $TMPH + + +mkdir -p doc +mkdir -p tests +mkdir -p tests/api +echo "@c auto-generated by configure - do not modify! " > doc/config.texi + +print_config ARCH_ "$config_files" $ARCH_LIST +print_config HAVE_ "$config_files" $HAVE_LIST +print_config CONFIG_ "$config_files" $CONFIG_LIST \ + $CONFIG_EXTRA \ + $ALL_COMPONENTS \ + +echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH +echo "endif # FFMPEG_CONFIG_MAK" >> config.mak + +# Do not overwrite an unchanged config.h to avoid superfluous rebuilds. +cp_if_changed $TMPH config.h +touch .config + +enabled yasm && cp_if_changed $TMPASM config.asm + +cat > $TMPH <<EOF +/* Generated by ffconf */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +EOF + +print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB + +echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH + +cp_if_changed $TMPH libavutil/avconfig.h + +if test -n "$WARNINGS"; then + printf "\n%s%s$WARNINGS%s" "$warn_color" "$bold_color" "$reset_color" + enabled fatal_warnings && exit 1 +fi + +# build pkg-config files + +lib_version(){ + eval printf "\"lib${1}${build_suffix} >= \$LIB$(toupper ${1})_VERSION, \"" +} + +pkgconfig_generate(){ + name=$1 + shortname=${name#lib}${build_suffix} + comment=$2 + version=$3 + libs=$4 + requires=$(map 'lib_version $v' $(eval echo \$${name#lib}_deps)) + requires=${requires%, } + enabled ${name#lib} || return 0 + mkdir -p $name + cat <<EOF > $name/$name${build_suffix}.pc +prefix=$prefix +exec_prefix=\${prefix} +libdir=$libdir +includedir=$incdir + +Name: $name +Description: $comment +Version: $version +Requires: $(enabled shared || echo $requires) +Requires.private: $(enabled shared && echo $requires) +Conflicts: +Libs: -L\${libdir} $(enabled rpath && echo "-Wl,-rpath,\${libdir}") -l${shortname} $(enabled shared || echo $libs) +Libs.private: $(enabled shared && echo $libs) +Cflags: -I\${includedir} +EOF + +mkdir -p doc/examples/pc-uninstalled +includedir=${source_path} +[ "$includedir" = . ] && includedir="\${pcfiledir}/../../.." + cat <<EOF > doc/examples/pc-uninstalled/$name.pc +prefix= +exec_prefix= +libdir=\${pcfiledir}/../../../$name +includedir=${includedir} + +Name: $name +Description: $comment +Version: $version +Requires: $requires +Conflicts: +Libs: -L\${libdir} -Wl,-rpath,\${libdir} -l${shortname} $(enabled shared || echo $libs) +Cflags: -I\${includedir} +EOF +} + +pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBRT $LIBM" +pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" +pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" +pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" +pkgconfig_generate libavfilter "FFmpeg audio/video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" +pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" "" +pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$LIBM" +pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" +pkgconfig_generate libswresample "FFmpeg audio resampling library" "$LIBSWRESAMPLE_VERSION" "$LIBM $LIBSOXR"
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/APIchanges b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/APIchanges new file mode 100644 index 0000000..85d4db7 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/APIchanges
@@ -0,0 +1,2508 @@ +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: 2015-08-28 +libavdevice: 2015-08-28 +libavfilter: 2015-08-28 +libavformat: 2015-08-28 +libavresample: 2015-08-28 +libpostproc: 2015-08-28 +libswresample: 2015-08-28 +libswscale: 2015-08-28 +libavutil: 2015-08-28 + + +API changes, most recent first: + +-------- 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 - afbd4b8 - 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 - bb78903 - 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 acessed 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<type> -> avio_w[b/l]<type> + put_buffer -> avio_write + b7effd4 rename get_byte -> avio_r8, + get_[b/l]e<type> -> avio_r[b/l]<type> + 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/Doxyfile b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/Doxyfile new file mode 100644 index 0000000..07b4d1f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/Doxyfile
@@ -0,0 +1,1627 @@ +# Doxyfile 1.7.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a 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. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the 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 = 3.0 + +# With the PROJECT_LOGO tag one can specify a 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) +# base path where the generated documentation will be put. +# 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 cause performance problems for the file system. + +CREATE_SUBDIRS = 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. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) 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. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) 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. + +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" "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. + +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. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then 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. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then 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. + +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 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. + +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 +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +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 comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +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 behaviour. +# 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 behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +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. + +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. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# 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 = + +# 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. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +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. + +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, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. 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 that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# 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); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip 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. + +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 (the default) +# 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. + +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. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) 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. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT 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. + +TYPEDEF_HIDES_STRUCT = YES + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_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 and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +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. + +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 (the default) only methods in the interface are included. + +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. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) 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. + +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 (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +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 (the default) these declarations will be included in the +# documentation. + +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 (the default) these blocks will be appended to the +# function's detailed documentation block. + +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 (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +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. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# 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. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) 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. + +SORT_MEMBER_DOCS = NO + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +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 default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to 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 default) +# the group names will appear in their defined order. + +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 default), 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. + +SORT_BY_SCOPE_NAME = 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. + +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. + +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. + +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. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of 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 initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +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. + +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 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 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. See the manual for examples. + +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. The 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. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED 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. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR 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. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +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) + +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 stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be 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. + +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, which is +# also the default input encoding. 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. + +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 pattern (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 *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# 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. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +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 + +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/ + +# 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. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are 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 <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> 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. + +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 +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# 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 also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +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. + +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. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# 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. + +REFERENCES_LINK_SOURCE = 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. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) 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. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# 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. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +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 one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +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. If left blank `html' will be used as the default path. + +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). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +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 the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# 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. +# The allowed range is 0 to 359. + +#HTML_COLORSTYLE_HUE = 120 + +# 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. + +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. + +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. + +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. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# 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, introduced with OS X 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. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# 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. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, 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. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_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. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, 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. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, 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. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, 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). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, 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. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +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. + +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. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +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 +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> +# Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> +# Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, 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. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, 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. + +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. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# 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. + +GENERATE_TREEVIEW = NO + +# 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. + +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. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# 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. + +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 before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# 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. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +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. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# 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. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +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. + +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, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +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. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). 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. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# 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. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE 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. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# 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 very pretty with +# other RTF readers or editors. + +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. If left blank `rtf' will be used as the default path. + +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. + +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 other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +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. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +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. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# 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 is NO. + +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. + +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. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# 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. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see 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. + +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. + +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. + +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. + +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. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +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 (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF 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. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +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. + +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. + +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 +# 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. + +PREDEFINED = "__attribute__(x)=" \ + "DECLARE_ALIGNED(a,t,n)=t n" \ + "offsetof(x,y)=0x42" \ + av_alloc_size \ + AV_GCC_VERSION_AT_LEAST(x,y)=1 \ + AV_GCC_VERSION_AT_MOST(x,y)=0 \ + __GNUC__=1 \ + +# 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. + +EXPAND_AS_DEFINED = declare_idct \ + READ_PAR_DATA \ + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all 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. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. 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. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that 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. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +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. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +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 = + +# 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. + +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, 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) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) 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. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need 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. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are 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 +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are 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. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +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. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# 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. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are 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. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are 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. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are 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. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH 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. + +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). + +DOTFILE_DIRS = + +# 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. + +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. + +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). + +DOT_TRANSPARENT = YES + +# 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. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/Makefile b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/Makefile new file mode 100644 index 0000000..4a77aac --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/Makefile
@@ -0,0 +1,185 @@ +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/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) + +DOC_EXAMPLES-$(CONFIG_AVIO_DIR_CMD_EXAMPLE) += avio_dir_cmd +DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading +DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE) += avcodec +DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding +DOC_EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding +DOC_EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs +DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio +DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio +DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video +DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata +DOC_EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing +DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec +DOC_EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing +DOC_EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio +DOC_EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video +DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE) += transcode_aac +DOC_EXAMPLES-$(CONFIG_TRANSCODING_EXAMPLE) += transcoding +ALL_DOC_EXAMPLES_LIST = $(DOC_EXAMPLES-) $(DOC_EXAMPLES-yes) + +DOC_EXAMPLES := $(DOC_EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)$(EXESUF)) +ALL_DOC_EXAMPLES := $(ALL_DOC_EXAMPLES_LIST:%=doc/examples/%$(PROGSSUF)$(EXESUF)) +ALL_DOC_EXAMPLES_G := $(ALL_DOC_EXAMPLES_LIST:%=doc/examples/%$(PROGSSUF)_g$(EXESUF)) +PROGS += $(DOC_EXAMPLES) + +all-$(CONFIG_DOC): doc + +doc: documentation + +apidoc: doc/doxy/html +documentation: $(DOCS) + +examples: $(DOC_EXAMPLES) + +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/ +$(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples +OBJDIRS += doc/examples + +DOXY_INPUT = $(INSTHEADERS) $(DOC_EXAMPLES:%$(EXESUF)=%.c) $(LIB_EXAMPLES:%$(EXESUF)=%.c) +DOXY_INPUT_DEPS = $(addprefix $(SRC_PATH)/, $(DOXY_INPUT)) + +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 + +examplesclean: + $(RM) $(ALL_DOC_EXAMPLES) $(ALL_DOC_EXAMPLES_G) + $(RM) $(CLEANSUFFIXES:%=doc/examples/%) + +docclean: examplesclean + $(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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/authors.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/authors.texi new file mode 100644 index 0000000..6c8c1d7 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/bitstream_filters.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/bitstream_filters.texi new file mode 100644 index 0000000..563049e --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/bitstream_filters.texi
@@ -0,0 +1,180 @@ +@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 MPEG-4 Audio Specific Configuration +bitstream filter. + +This filter creates an MPEG-4 AudioSpecificConfig from an MPEG-2/4 +ADTS header and removes the ADTS header. + +This is required for example when copying an AAC stream from a raw +ADTS AAC container to a FLV or a MOV/MP4 file. + +@section chomp + +Remove zero padding at the end of a packet. + +@section dump_extra + +Add extradata to the beginning of the filtered packets. + +The additional argument specifies which packets should be filtered. +It accepts the values: +@table @samp +@item a +add extradata to all key packets, but only if @var{local_header} is +set in the @option{flags2} codec context field + +@item k +add extradata to all key packets + +@item e +add extradata to all packets +@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 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 ("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 + +@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 mjpega_dump_header + +@section movsub + +@section mp3_header_decompress + +@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 without damaging the container. Can be +used for fuzzing or testing error resilience/concealment. + +Parameters: +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. + +@example +ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv +@end example +applies the modification to every byte. + +@section remove_extra + +@c man end BITSTREAM FILTERS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/bootstrap.min.css b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/bootstrap.min.css new file mode 100644 index 0000000..6f68017 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/build_system.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/build_system.txt new file mode 100644 index 0000000..a9bd4eb --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/build_system.txt
@@ -0,0 +1,64 @@ +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. + +libavformat/output-example + Build the libavformat basic example. + +libavcodec/api-example + Build the libavcodec basic example. + +libswscale/swscale-test + Build the swscale self-test (useful also as an example). + +config + Reconfigure the project with the current configuration. + + +Useful standard make commands: +make -t <target> + 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<num> + 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/codecs.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/codecs.texi new file mode 100644 index 0000000..b481b4a --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/codecs.texi
@@ -0,0 +1,1162 @@ +@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 gmc +Use gmc. +@item mv0 +Always try a mb with mv=<0,0>. +@item input_preserved + +@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 emu_edge +Do not draw edges. +@item psnr +Set error[?] variables during encoding. +@item truncated + +@item naq +Normalize adaptive quantization. +@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 cbp +Deprecated, use mpegvideo private options instead. +@item qprd +Deprecated, use mpegvideo private options instead. +@item ilme +Apply interlaced motion estimation. +@item cgop +Use closed gop. +@end table + +@item me_method @var{integer} (@emph{encoding,video}) +Set motion estimation method. + +Possible values: +@table @samp +@item zero +zero motion estimation (fastest) +@item full +full motion estimation (slowest) +@item epzs +EPZS motion estimation (default) +@item esa +esa motion estimation (alias for full) +@item tesa +tesa motion estimation +@item dia +dia motion estimation (alias for epzs) +@item log +log motion estimation +@item phods +phods motion estimation +@item x1 +X1 motion estimation +@item hex +hex motion estimation +@item umh +umh motion estimation +@item iter +iter motion estimation +@end table + +@item extradata_size @var{integer} +Set extradata size. + +@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. + +@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 rc_strategy @var{integer} (@emph{encoding,video}) +Set ratecontrol method. + +@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 old_msmpeg4 +some old lavc generated msmpeg4v3 files (no autodetection) +@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 ac_vlc +illegal vlc bug (autodetected per fourcc) +@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 lelim @var{integer} (@emph{encoding,video}) +Set single coefficient elimination threshold for luminance (negative +values also consider DC coefficient). + +@item celim @var{integer} (@emph{encoding,video}) +Set single coefficient elimination threshold for chrominance (negative +values also consider dc coefficient) + +@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 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 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 qsquish @var{float} (@emph{encoding,video}) +How to keep quantizer between qmin and qmax (0 = clip, 1 = use +differentiable function). + +@item rc_qmod_amp @var{float} (@emph{encoding,video}) +Set experimental quantizer modulation. + +@item rc_qmod_freq @var{integer} (@emph{encoding,video}) +Set experimental quantizer modulation. + +@item rc_override_count @var{integer} + +@item rc_eq @var{string} (@emph{encoding,video}) +Set rate control equation. When computing the expression, besides the +standard functions defined in the section 'Expression Evaluation', the +following functions are available: bits2qp(bits), qp2bits(qp). Also +the following constants are available: iTex pTex tex mv fCode iCount +mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex +avgTex. + +@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 rc_buf_aggressivity @var{float} (@emph{encoding,video}) +Currently useless. + +@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 rc_init_cplx @var{float} (@emph{encoding,video}) +Set initial complexity for 1-pass encoding. + +@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 simplealpha + +@item ipp + +@item xvidmmx + +@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 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 mv +motion vector +@item dct_coeff + +@item green_metadata +display complexity metadata for the upcoming frame, GoP or for a given duration. + +@item skip + +@item startcode + +@item pts + +@item er +error recognition +@item mmco +memory management control operations (H.264) +@item bugs + +@item vis_qp +visualize quantization parameter (QP), lower QP are tinted greener +@item vis_mb_type +visualize block types +@item buffers +picture buffer allocations +@item thread_ops +threading operations +@item nomc +skip motion compensation +@end table + +@item vismv @var{integer} (@emph{decoding,video}) +Visualize motion vectors (MVs). + +This option is deprecated, see the codecview filter instead. + +Possible values: +@table @samp +@item pf +forward predicted MVs of P-frames +@item bf +forward predicted MVs of B-frames +@item bb +backward predicted MVs of B-frames +@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. + +@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 dtg_active_format @var{integer} + +@item me_range @var{integer} (@emph{encoding,video}) +Set limit motion vectors range (1023 for DivX player). + +@item ibias @var{integer} (@emph{encoding,video}) +Set intra quant bias. + +@item pbias @var{integer} (@emph{encoding,video}) +Set inter quant bias. + +@item color_table_id @var{integer} + +@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 +@item deflate +deflate-based coder +@end table + +@item context @var{integer} (@emph{encoding,video}) +Set context model. + +@item slice_flags @var{integer} + +@item xvmc_acceleration @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 stream_codec_tag @var{integer} + +@item sc_threshold @var{integer} (@emph{encoding,video}) +Set scene change threshold. + +@item lmin @var{integer} (@emph{encoding,video}) +Set min lagrange factor (VBR). + +@item lmax @var{integer} (@emph{encoding,video}) +Set max lagrange factor (VBR). + +@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}) + +Possible values: +@table @samp +@item fast +Allow non spec compliant speedup tricks. +@item sgop +Deprecated, use mpegvideo private options instead. +@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 skiprd +Deprecated, use mpegvideo private options instead. +@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}. +@end table + +@item error @var{integer} (@emph{encoding,video}) + +@item qns @var{integer} (@emph{encoding,video}) +Deprecated, use mpegvideo private options instead. + +@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 me_threshold @var{integer} (@emph{encoding,video}) +Set motion estimation threshold. + +@item mb_threshold @var{integer} (@emph{encoding,video}) +Set macroblock threshold. + +@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}) + +Possible values: +@table @samp +@item unknown + +@item aac_main + +@item aac_low + +@item aac_ssr + +@item aac_ltp + +@item aac_he + +@item aac_he_v2 + +@item aac_ld + +@item aac_eld + +@item mpeg2_aac_low + +@item mpeg2_aac_he + +@item mpeg4_sp + +@item mpeg4_core + +@item mpeg4_main + +@item mpeg4_asp + +@item dts + +@item dts_es + +@item dts_96_24 + +@item dts_hd_hra + +@item dts_hd_ma + +@end table + +@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 border_mask @var{float} (@emph{encoding,video}) +Increase the quantizer for macroblocks close to borders. + +@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 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 sc_factor @var{integer} (@emph{encoding,video}) +Set value multiplied by qscale for each frame and added to +scene_change_score. + +@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 request_channels @var{integer} (@emph{decoding,audio}) +Set desired number of audio channels. + +@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}) +@item color_trc @var{integer} (@emph{decoding/encoding,video}) +@item colorspace @var{integer} (@emph{decoding/encoding,video}) + +@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. + +@item chroma_sample_location @var{integer} (@emph{decoding/encoding,video}) + +@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{integer} (@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 indention: +@example +ffprobe -dump_separator " + " -i ~/videos/matrixbench_mpeg2.mpg +@end example + +@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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/decoders.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/decoders.texi new file mode 100644 index 0000000..3577114 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/decoders.texi
@@ -0,0 +1,294 @@ +@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 hevc + +HEVC / H.265 decoder. + +Note: the @option{skip_loop_filter} option has effect only at level +@code{all}. + +@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 + +@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. +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 synthetizer. + +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 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 comas, 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. You may use the special * string to +match all pages. Pages that do not match the specified list are dropped. +Default value is *. +@item txt_chop_top +Discards the top teletext line. Default value is 1. +@item txt_format +Specifies the format of the decoded subtitles. The teletext decoder is capable +of decoding the teletext pages to bitmaps or to simple text, you should use +"bitmap" for teletext pages, because certain graphics and colors cannot be +expressed in simple text. You might use "text" for teletext based subtitles if +your application can handle simple text based subtitles. Default value is +bitmap. +@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 charactes. +Default value is 1. +@item txt_duration +Sets the display duration of the decoded teletext pages or subtitles in +miliseconds. Default value is 30000 which is 30 seconds. +@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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/default.css b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/default.css new file mode 100644 index 0000000..bf50200 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/demuxers.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/demuxers.texi new file mode 100644 index 0000000..6b5f8bb --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/demuxers.texi
@@ -0,0 +1,580 @@ +@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{-formats} of the ff* tools will display the list of +enabled demuxers. + +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 applehttp + +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". + +@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 packet 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 to its default -1. + +To make FFmpeg recognize the format automatically, this directive must +appears 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, it 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 flv + +Adobe Flash Video Format demuxer. + +This demuxer is used to demux FLV files and RTMP network streams. + +@table @option +@item -flv_metadata @var{bool} +Allocate the streams according to the onMetaData array content. +@end table + +@section libgme + +The Game Music Emu library is a collection of video game music file emulators. + +See @url{http://code.google.com/p/game-music-emu/} for more information. + +Some files have multiple tracks. The demuxer will pick the first track by +default. The @option{track_index} option can be used to select a different +track. Track indexes start at 0. The demuxer exports the number of tracks as +@var{tracks} meta data entry. + +For very large files, the @option{max_size} option may have to be adjusted. + +@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 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. +@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 mov/mp4/3gp/Quicktme + +Quicktime / MP4 demuxer. + +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. + +@end table + +@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 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. +@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 + +@c man end DEMUXERS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/developer.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/developer.texi new file mode 100644 index 0000000..6db93ce --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/developer.texi
@@ -0,0 +1,811 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Developer Documentation +@titlepage +@center @titlefont{Developer Documentation} +@end titlepage + +@top + +@contents + +@chapter Developers Guide + +@section 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}. + +@section Contributing + +There are 3 ways by which code gets into FFmpeg. +@itemize @bullet +@item Submitting patches to the main developer mailing list. + See @ref{Submitting patches} for details. +@item Directly committing changes to the main tree. +@item Committing changes to a git clone, for example on github.com or + gitorious.org. And asking us to merge these changes. +@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} +@section Coding Rules + +@subsection 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. + +@subsection 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 + +@subsection 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 @};}). +@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 + +@subsection 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_aac_parse_header}. + +@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<name>/lib<name>.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. + +@subsection 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 + +@subsection 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\+\%#\@@<!$/ +@end example + +For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}: +@lisp +(c-add-style "ffmpeg" + '("k&r" + (c-basic-offset . 4) + (indent-tabs-mode . nil) + (show-trailing-whitespace . t) + (c-offsets-alist + (statement-cont . (c-lineup-assignments +))) + ) + ) +(setq c-default-style "ffmpeg") +@end lisp + +@section Development Policy + +@enumerate +@item +Contributions should be licensed under the +@uref{http://www.gnu.org/licenses/lgpl-2.1.html, LGPL 2.1}, +including an "or any later version" clause, or, if you prefer +a gift-style license, the +@uref{http://opensource.org/licenses/isc-license.txt, ISC} or +@uref{http://mit-license.org/, MIT} license. +@uref{http://www.gnu.org/licenses/gpl-2.0.html, 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. + +@item +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. + +@item +The commit message should have a short first line in the form of +a @samp{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. + +@item +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. + +@item +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. +Also if you have doubts about splitting or not splitting, do not hesitate to +ask/discuss it on the developer mailing list. + +@item +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. + +@item +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. + +@item +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 +prefer if the indentation throughout FFmpeg was consistent (Many projects +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 + +@item +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 + +@item +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. + +@item +When applying patches that have been discussed (at length) on the mailing +list, reference the thread in the log message. + +@item +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, +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! + +@item +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. + +@item +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. + +@item +Try to keep important discussions and requests (also) on the public +developer mailing list, so that all developers can benefit from them. + +@item +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. + +@item +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. +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. + +@item +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. + +@item +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. +@end enumerate + +We think our rules are not too hard. If you have comments, contact us. + +@anchor{Submitting patches} +@section 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. + +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. + + +@section 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 + + +@section 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? (git commit -s) +See @url{http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/SubmittingPatches} for the meaning +of 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 ftp://upload.ffmpeg.org. + +@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 + +@section 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} +@section 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]. + +@subsection 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. + +@subsection 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. + +@subsection 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 <your_custom_valgrind_options>} option in +your configure line instead. + +@anchor{Release process} +@section 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} +@subsection 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. + + +@subsection 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/devices.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/devices.texi new file mode 100644 index 0000000..5e74a96 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/doxy-wrapper.sh b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/doxy-wrapper.sh new file mode 100755 index 0000000..fe0102b --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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 - <<EOF +@INCLUDE = ${DOXYFILE} +INPUT = $@ +HTML_TIMESTAMP = NO +PROJECT_NUMBER = $VERSION +OUTPUT_DIRECTORY = $OUT_DIR +EOF
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/encoders.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/encoders.texi new file mode 100644 index 0000000..f38cad3 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/encoders.texi
@@ -0,0 +1,2613 @@ +@chapter Encoders +@c man begin ENCODERS + +Encoders are configured elements in FFmpeg which allow the encoding of +multimedia streams. + +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 @code{--enable-lib} option. You can list all +available encoders using the configure option @code{--list-encoders}. + +You can disable all the encoders with the configure option +@code{--disable-encoders} and selectively enable / disable single encoders +with the options @code{--enable-encoder=@var{ENCODER}} / +@code{--disable-encoder=@var{ENCODER}}. + +The option @code{-encoders} of the ff* tools will display the list of +enabled encoders. + +@c man end ENCODERS + +@chapter Audio Encoders +@c man begin AUDIO ENCODERS + +A description of some of the currently available audio encoders +follows. + +@anchor{aacenc} +@section aac + +Advanced Audio Coding (AAC) encoder. + +This encoder is the default AAC encoder, natively implemented into FFmpeg. Its +quality is on par or better than libfdk_aac at the default bitrate of 128kbps. +This encoder also implements more options, profiles and samplerates than +other encoders (with only the AAC-HE profile pending to be implemented) so this +encoder has become the default and is the recommended choice. + +@subsection Options + +@table @option +@item b +Set bit rate in bits/s. Setting this automatically activates constant bit rate +(CBR) mode. If this option is unspecified it is set to 128kbps. + +@item q +Set quality for variable bit rate (VBR) mode. This option is valid only using +the @command{ffmpeg} command-line tool. For library interface users, use +@option{global_quality}. + +@item cutoff +Set cutoff frequency. If unspecified will allow the encoder to dynamically +adjust the cutoff to improve clarity on low bitrates. + +@item aac_coder +Set AAC encoder coding method. Possible values: + +@table @samp +@item twoloop +Two loop searching (TLS) method. + +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 aac_is/aac_ms/aac_pns are enabled. +This is the default choice for a coder. + +@item anmr +Average noise to mask ratio (ANMR) trellis-based solution. + +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 @option{aac_is} or @option{aac_pns} options. +Not currently recommended. + +@item fast +Constant quantizer method. + +This method sets a constant quantizer for all bands. This is the fastest of all +the methods and has no rate control or support for @option{aac_is} or +@option{aac_pns}. +Not recommended. + +@end table + +@item aac_ms +Sets mid/side coding mode. The default value of auto will automatically use +M/S with bands which will benefit from such coding. Can be forced for all bands +using the value "enable", which is mainly useful for debugging or disabled using +"disable". + +@item aac_is +Sets intensity stereo coding tool usage. By default, it's enabled and will +automatically toggle IS for similar pairs of stereo bands if it's benefitial. +Can be disabled for debugging by setting the value to "disable". + +@item aac_pns +Uses perceptual noise substitution to replace low entropy high frequency bands +with imperceivable white noise during the decoding process. By default, it's +enabled, but can be disabled for debugging purposes by using "disable". + +@item aac_tns +Enables the use of a multitap FIR 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 "disable". + +@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 @option{-ar} to decrease the samplerate. + +@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 "predicted" 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. + +@item profile +Sets the encoding profile, possible values: + +@table @samp +@item aac_low +The default, AAC "Low-complexity" profile. Is the most compatible and produces +decent quality. + +@item mpeg2_aac_low +Equivalent to -profile:a aac_low -aac_pns 0. PNS was introduced with the MPEG4 +specifications. + +@item aac_ltp +Long term prediction profile, is enabled by and will enable the aac_ltp option. +Introduced in MPEG4. + +@item aac_main +Main-type prediction profile, is enabled by and will enable the aac_pred option. +Introduced in MPEG2. + +If this option is unspecified it is set to @samp{aac_low}. +@end table +@end table + +@section ac3 and ac3_fixed + +AC-3 audio encoders. + +These encoders implement part of ATSC A/52:2010 and ETSI TS 102 366, as well as +the undocumented RealAudio 3 (a.k.a. dnet). + +The @var{ac3} encoder uses floating-point math, while the @var{ac3_fixed} +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 floating-point encoder will generally produce better +quality audio for a given bitrate. The @var{ac3_fixed} encoder is not the +default codec for any of the output formats, so it must be specified explicitly +using the option @code{-acodec ac3_fixed} in order to use it. + +@subsection AC-3 Metadata + +The AC-3 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. + +These parameters are described in detail in several publicly-available +documents. +@itemize +@item @uref{http://www.atsc.org/cms/standards/a_52-2010.pdf,A/52:2010 - Digital Audio Compression (AC-3) (E-AC-3) Standard} +@item @uref{http://www.atsc.org/cms/standards/a_54a_with_corr_1.pdf,A/54 - Guide to the Use of the ATSC Digital Television Standard} +@item @uref{http://www.dolby.com/uploadedFiles/zz-_Shared_Assets/English_PDFs/Professional/18_Metadata.Guide.pdf,Dolby Metadata Guide} +@item @uref{http://www.dolby.com/uploadedFiles/zz-_Shared_Assets/English_PDFs/Professional/46_DDEncodingGuidelines.pdf,Dolby Digital Professional Encoding Guidelines} +@end itemize + +@subsubsection Metadata Control Options + +@table @option + +@item -per_frame_metadata @var{boolean} +Allow Per-Frame Metadata. Specifies if the encoder should check for changing +metadata for each frame. +@table @option +@item 0 +The metadata values set at initialization will be used for every frame in the +stream. (default) +@item 1 +Metadata values can be changed before encoding each frame. +@end table + +@end table + +@subsubsection Downmix Levels + +@table @option + +@item -center_mixlev @var{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: +@table @option +@item 0.707 +Apply -3dB gain +@item 0.595 +Apply -4.5dB gain (default) +@item 0.500 +Apply -6dB gain +@end table + +@item -surround_mixlev @var{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: +@table @option +@item 0.707 +Apply -3dB gain +@item 0.500 +Apply -6dB gain (default) +@item 0.000 +Silence Surround Channel(s) +@end table + +@end table + +@subsubsection Audio Production Information +Audio Production Information is optional information describing the mixing +environment. Either none or both of the fields are written to the bitstream. + +@table @option + +@item -mixing_level @var{number} +Mixing Level. Specifies peak sound pressure level (SPL) 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 @code{room_type} option is not the default value, the @code{mixing_level} +option must not be -1. + +@item -room_type @var{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 @code{mixing_level} +option and the @code{room_type} option have the default values. +@table @option +@item 0 +@itemx notindicated +Not Indicated (default) +@item 1 +@itemx large +Large Room +@item 2 +@itemx small +Small Room +@end table + +@end table + +@subsubsection Other Metadata Options + +@table @option + +@item -copyright @var{boolean} +Copyright Indicator. Specifies whether a copyright exists for this audio. +@table @option +@item 0 +@itemx off +No Copyright Exists (default) +@item 1 +@itemx on +Copyright Exists +@end table + +@item -dialnorm @var{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. + +@item -dsur_mode @var{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 @b{NOT} mean the encoder will actually +apply Dolby Surround processing. +@table @option +@item 0 +@itemx notindicated +Not Indicated (default) +@item 1 +@itemx off +Not Dolby Surround Encoded +@item 2 +@itemx on +Dolby Surround Encoded +@end table + +@item -original @var{boolean} +Original Bit Stream Indicator. Specifies whether this audio is from the +original source and not a copy. +@table @option +@item 0 +@itemx off +Not Original Source +@item 1 +@itemx on +Original Source (default) +@end table + +@end table + +@subsection Extended Bitstream Information +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 @code{center_mixlev} +and @code{surround_mixlev} options if it supports the Alternate Bit Stream +Syntax. + +@subsubsection Extended Bitstream Information - Part 1 + +@table @option + +@item -dmix_mode @var{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. +@table @option +@item 0 +@itemx notindicated +Not Indicated (default) +@item 1 +@itemx ltrt +Lt/Rt Downmix Preferred +@item 2 +@itemx loro +Lo/Ro Downmix Preferred +@end table + +@item -ltrt_cmixlev @var{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. +@table @option +@item 1.414 +Apply +3dB gain +@item 1.189 +Apply +1.5dB gain +@item 1.000 +Apply 0dB gain +@item 0.841 +Apply -1.5dB gain +@item 0.707 +Apply -3.0dB gain +@item 0.595 +Apply -4.5dB gain (default) +@item 0.500 +Apply -6.0dB gain +@item 0.000 +Silence Center Channel +@end table + +@item -ltrt_surmixlev @var{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. +@table @option +@item 0.841 +Apply -1.5dB gain +@item 0.707 +Apply -3.0dB gain +@item 0.595 +Apply -4.5dB gain +@item 0.500 +Apply -6.0dB gain (default) +@item 0.000 +Silence Surround Channel(s) +@end table + +@item -loro_cmixlev @var{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. +@table @option +@item 1.414 +Apply +3dB gain +@item 1.189 +Apply +1.5dB gain +@item 1.000 +Apply 0dB gain +@item 0.841 +Apply -1.5dB gain +@item 0.707 +Apply -3.0dB gain +@item 0.595 +Apply -4.5dB gain (default) +@item 0.500 +Apply -6.0dB gain +@item 0.000 +Silence Center Channel +@end table + +@item -loro_surmixlev @var{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. +@table @option +@item 0.841 +Apply -1.5dB gain +@item 0.707 +Apply -3.0dB gain +@item 0.595 +Apply -4.5dB gain +@item 0.500 +Apply -6.0dB gain (default) +@item 0.000 +Silence Surround Channel(s) +@end table + +@end table + +@subsubsection Extended Bitstream Information - Part 2 + +@table @option + +@item -dsurex_mode @var{mode} +Dolby Surround EX Mode. Indicates whether the stream uses Dolby Surround EX +(7.1 matrixed to 5.1). Using this option does @b{NOT} mean the encoder will actually +apply Dolby Surround EX processing. +@table @option +@item 0 +@itemx notindicated +Not Indicated (default) +@item 1 +@itemx on +Dolby Surround EX Off +@item 2 +@itemx off +Dolby Surround EX On +@end table + +@item -dheadphone_mode @var{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 @b{NOT} mean the encoder will actually apply Dolby Headphone +processing. +@table @option +@item 0 +@itemx notindicated +Not Indicated (default) +@item 1 +@itemx on +Dolby Headphone Off +@item 2 +@itemx off +Dolby Headphone On +@end table + +@item -ad_conv_type @var{type} +A/D Converter Type. Indicates whether the audio has passed through HDCD A/D +conversion. +@table @option +@item 0 +@itemx standard +Standard A/D Converter (default) +@item 1 +@itemx hdcd +HDCD A/D Converter +@end table + +@end table + +@subsection Other AC-3 Encoding Options + +@table @option + +@item -stereo_rematrixing @var{boolean} +Stereo Rematrixing. Enables/Disables use of rematrixing for stereo input. This +is an optional AC-3 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. + +@end table + +@subsection Floating-Point-Only AC-3 Encoding Options + +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. + +@table @option + +@item -channel_coupling @var{boolean} +Enables/Disables use of channel coupling, which is an optional AC-3 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. +@table @option +@item -1 +@itemx auto +Selected by Encoder (default) +@item 0 +@itemx off +Disable Channel Coupling +@item 1 +@itemx on +Enable Channel Coupling +@end table + +@item -cpl_start_band @var{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 @var{auto} 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. +@table @option +@item -1 +@itemx auto +Selected by Encoder (default) +@end table + +@end table + +@anchor{flac} +@section flac + +FLAC (Free Lossless Audio Codec) Encoder + +@subsection Options + +The following options are supported by FFmpeg's flac encoder. + +@table @option +@item compression_level +Sets the compression level, which chooses defaults for many other options +if they are not set explicitly. + +@item frame_size +Sets the size of the frames in samples per channel. + +@item lpc_coeff_precision +Sets the LPC coefficient precision, valid values are from 1 to 15, 15 is the +default. + +@item lpc_type +Sets the first stage LPC algorithm +@table @samp +@item none +LPC is not used + +@item fixed +fixed LPC coefficients + +@item levinson + +@item cholesky +@end table + +@item lpc_passes +Number of passes to use for Cholesky factorization during LPC analysis + +@item min_partition_order +The minimum partition order + +@item max_partition_order +The maximum partition order + +@item prediction_order_method +@table @samp +@item estimation +@item 2level +@item 4level +@item 8level +@item search +Bruteforce search +@item log +@end table + +@item ch_mode +Channel mode +@table @samp +@item auto +The mode is chosen automatically for each frame +@item indep +Chanels are independently coded +@item left_side +@item right_side +@item mid_side +@end table + +@item exact_rice_parameters +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. + +@item multi_dim_quant +Multi Dimensional Quantization. If set to 1 then a 2nd stage LPC algorithm is +applied after the first stage to finetune the coefficients. This is quite slow +and slightly improves compression. + +@end table + +@anchor{libfaac} +@section libfaac + +libfaac AAC (Advanced Audio Coding) encoder wrapper. + +This encoder is of much lower quality and is more unstable than any other AAC +encoders, so it's highly recommended to instead use other encoders, like +@ref{aacenc,,the native FFmpeg AAC encoder}. + +This encoder also requires the presence of the libfaac headers and library +during configuration. You need to explicitly configure the build with +@code{--enable-libfaac --enable-nonfree}. + +@subsection Options + +The following shared FFmpeg codec options are recognized. + +The following options are supported by the libfaac wrapper. The +@command{faac}-equivalent of the options are listed in parentheses. + +@table @option +@item b (@emph{-b}) +Set bit rate in bits/s for ABR (Average Bit Rate) mode. If the bit rate +is not explicitly specified, it is automatically set to a suitable +value depending on the selected profile. @command{faac} bitrate is +expressed in kilobits/s. + +Note that libfaac does not support CBR (Constant Bit Rate) but only +ABR (Average Bit Rate). + +If VBR mode is enabled this option is ignored. + +@item ar (@emph{-R}) +Set audio sampling rate (in Hz). + +@item ac (@emph{-c}) +Set the number of audio channels. + +@item cutoff (@emph{-C}) +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. + +@item profile +Set audio profile. + +The following profiles are recognized: +@table @samp +@item aac_main +Main AAC (Main) + +@item aac_low +Low Complexity AAC (LC) + +@item aac_ssr +Scalable Sample Rate (SSR) + +@item aac_ltp +Long Term Prediction (LTP) +@end table + +If not specified it is set to @samp{aac_low}. + +@item flags +qscale +Set constant quality VBR (Variable Bit Rate) mode. + +@item global_quality +Set quality in VBR mode as an integer number of 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}, +and used to set the quality value used by libfaac. A reasonable range +for the option value in QP units is [10-500], the higher the value the +higher the quality. + +@item q (@emph{-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 sets the quality value used by libfaac. A reasonable range +for the option value is [10-500], the higher the value the higher the +quality. + +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 +Use @command{ffmpeg} to convert an audio file to ABR 128 kbps AAC in an M4A (MP4) +container: +@example +ffmpeg -i input.wav -codec:a libfaac -b:a 128k -output.m4a +@end example + +@item +Use @command{ffmpeg} to convert an audio file to VBR AAC, using the +LTP AAC profile: +@example +ffmpeg -i input.wav -c:a libfaac -profile:a aac_ltp -q:a 100 output.m4a +@end example +@end itemize + +@anchor{libfdk-aac-enc} +@section libfdk_aac + +libfdk-aac AAC (Advanced Audio Coding) encoder wrapper. + +The libfdk-aac library is based on the Fraunhofer FDK AAC code from +the Android project. + +Requires the presence of the libfdk-aac headers and library during +configuration. You need to explicitly configure the build with +@code{--enable-libfdk-aac}. The library is also incompatible with GPL, +so if you allow the use of GPL, you should configure with +@code{--enable-gpl --enable-nonfree --enable-libfdk-aac}. + +This encoder is considered to produce output on par or worse at 128kbps to the +@ref{aacenc,,the native FFmpeg AAC encoder} but can often produce better +sounding audio at identical or lower bitrates and has support for the +AAC-HE profiles. + +VBR encoding, enabled through the @option{vbr} or @option{flags ++qscale} options, is experimental and only works with some +combinations of parameters. + +Support for encoding 7.1 audio is only available with libfdk-aac 0.1.3 or +higher. + +For more information see the fdk-aac project at +@url{http://sourceforge.net/p/opencore-amr/fdk-aac/}. + +@subsection Options + +The following options are mapped on the shared FFmpeg codec options. + +@table @option +@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. + +In case VBR mode is enabled the option is ignored. + +@item ar +Set audio sampling rate (in Hz). + +@item channels +Set the number of audio channels. + +@item flags +qscale +Enable fixed quality, VBR (Variable Bit Rate) mode. +Note that VBR is implicitly enabled when the @option{vbr} value is +positive. + +@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. + +@item profile +Set audio profile. + +The following profiles are recognized: +@table @samp +@item aac_low +Low Complexity AAC (LC) + +@item aac_he +High Efficiency AAC (HE-AAC) + +@item aac_he_v2 +High Efficiency AAC version 2 (HE-AACv2) + +@item aac_ld +Low Delay AAC (LD) + +@item aac_eld +Enhanced Low Delay AAC (ELD) +@end table + +If not specified it is set to @samp{aac_low}. +@end table + +The following are private options of the libfdk_aac encoder. + +@table @option +@item afterburner +Enable afterburner feature if set to 1, disabled if set to 0. This +improves the quality but also the required processing power. + +Default value is 1. + +@item eld_sbr +Enable SBR (Spectral Band Replication) for ELD if set to 1, disabled +if set to 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 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 + +@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 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 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). + +@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{libwavpack} +@section libwavpack + +A wrapper providing WavPack encoding through libwavpack. + +Only lossless mode using 32-bit integer samples is supported currently. + +Requires the presence of the libwavpack headers and library during +configuration. You need to explicitly configure the build with +@code{--enable-libwavpack}. + +Note that a libavcodec-native encoder for the WavPack codec exists so users can +encode audios with this codec without using this encoder. See @ref{wavpackenc}. + +@subsection Options + +@command{wavpack} command line utility's corresponding options are listed in +parentheses, if any. + +@table @option +@item frame_size (@emph{--blocksize}) +Default is 32768. + +@item compression_level +Set speed vs. compression tradeoff. Acceptable arguments are listed below: + +@table @samp +@item 0 (@emph{-f}) +Fast mode. + +@item 1 +Normal (default) settings. + +@item 2 (@emph{-h}) +High quality. + +@item 3 (@emph{-hh}) +Very high quality. + +@item 4-8 (@emph{-hh -x}@var{EXTRAPROC}) +Same as @samp{3}, but with extra processing enabled. + +@samp{4} is the same as @option{-x2} and @samp{8} is the same as @option{-x6}. + +@end table +@end table + +@anchor{wavpackenc} +@section wavpack + +WavPack lossless audio encoder. + +This is a libavcodec-native WavPack encoder. There is also an encoder based on +libwavpack, but there is virtually no reason to use that encoder. + +See also @ref{libwavpack}. + +@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}) +This option's syntax is consistent with @ref{libwavpack}'s. +@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 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 follwing 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 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 +Can be set to either @code{j2k} or @code{jp2} (the default) that +makes it possible to store non-rgb pix_fmts. + +@end table + +@section snow + +@subsection Options + +@table @option +@item iterative_dia_size +dia size for the iterative motion estimation +@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). +@item arnr-max-frames +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 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). +@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 +@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. FFmpeg only supports one bit depth in one particular +build. In other words, it is not possible to build one FFmpeg with multiple +versions of x264 with different bit depths. + +@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 --full-help} 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 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 comparation 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 -vcodec 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 0 (off). + +@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 preset +Set the x265 preset. + +@item tune +Set the x265 tune parameter. + +@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 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 mpeg2 + +MPEG-2 video encoder. + +@subsection Options + +@table @option +@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 +@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 +@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 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 QSV encoders + +The family of Intel QuickSync Video encoders (MPEG-2, H.264 and HEVC) + +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 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 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/errno.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/errno.txt new file mode 100644 index 0000000..933a4de --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/Makefile b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/Makefile new file mode 100644 index 0000000..af38159 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/Makefile
@@ -0,0 +1,46 @@ +# 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_dir_cmd \ + avio_reading \ + decoding_encoding \ + demuxing_decoding \ + extract_mvs \ + filtering_video \ + filtering_audio \ + http_multiclient \ + 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 +decoding_encoding: 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/README b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/README new file mode 100644 index 0000000..c1ce619 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/README
@@ -0,0 +1,23 @@ +FFmpeg examples README +---------------------- + +Both following use cases rely on pkg-config and make, thus make sure +that you have them installed and working on your system. + + +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. + +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 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/avio_dir_cmd.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/avio_dir_cmd.c new file mode 100644 index 0000000..50c435c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/avio_dir_cmd.c
@@ -0,0 +1,180 @@ +/* + * 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 <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavformat/avio.h> + +static const char *type_string(int type) +{ + switch (type) { + case AVIO_ENTRY_DIRECTORY: + return "<DIR>"; + case AVIO_ENTRY_FILE: + return "<FILE>"; + case AVIO_ENTRY_BLOCK_DEVICE: + return "<BLOCK DEVICE>"; + case AVIO_ENTRY_CHARACTER_DEVICE: + return "<CHARACTER DEVICE>"; + case AVIO_ENTRY_NAMED_PIPE: + return "<PIPE>"; + case AVIO_ENTRY_SYMBOLIC_LINK: + return "<LINK>"; + case AVIO_ENTRY_SOCKET: + return "<SOCKET>"; + case AVIO_ENTRY_SERVER: + return "<SERVER>"; + case AVIO_ENTRY_SHARE: + return "<SHARE>"; + case AVIO_ENTRY_WORKGROUP: + return "<WORKGROUP>"; + case AVIO_ENTRY_UNKNOWN: + default: + break; + } + return "<UNKNOWN>"; +} + +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 int del_op(const char *url) +{ + int ret = avpriv_io_delete(url); + if (ret < 0) + av_log(NULL, AV_LOG_ERROR, "Cannot delete '%s': %s.\n", url, av_err2str(ret)); + return ret; +} + +static int move_op(const char *src, const char *dst) +{ + int ret = avpriv_io_move(src, dst); + if (ret < 0) + av_log(NULL, AV_LOG_ERROR, "Cannot move '%s' into '%s': %s.\n", src, dst, av_err2str(ret)); + return ret; +} + + +static void usage(const char *program_name) +{ + fprintf(stderr, "usage: %s OPERATION entry1 [entry2]\n" + "API example program to show how to manipulate resources " + "accessed through AVIOContext.\n" + "OPERATIONS:\n" + "list list content of the directory\n" + "move rename content in directory\n" + "del delete content in directory\n", + program_name); +} + +int main(int argc, char *argv[]) +{ + const char *op = NULL; + int ret; + + av_log_set_level(AV_LOG_DEBUG); + + if (argc < 2) { + usage(argv[0]); + return 1; + } + + /* register codecs and formats and other lavf/lavc components*/ + av_register_all(); + avformat_network_init(); + + op = argv[1]; + if (strcmp(op, "list") == 0) { + if (argc < 3) { + av_log(NULL, AV_LOG_INFO, "Missing argument for list operation.\n"); + ret = AVERROR(EINVAL); + } else { + ret = list_op(argv[2]); + } + } else if (strcmp(op, "del") == 0) { + if (argc < 3) { + av_log(NULL, AV_LOG_INFO, "Missing argument for del operation.\n"); + ret = AVERROR(EINVAL); + } else { + ret = del_op(argv[2]); + } + } else if (strcmp(op, "move") == 0) { + if (argc < 4) { + av_log(NULL, AV_LOG_INFO, "Missing argument for move operation.\n"); + ret = AVERROR(EINVAL); + } else { + ret = move_op(argv[2], argv[3]); + } + } else { + av_log(NULL, AV_LOG_INFO, "Invalid operation %s\n", op); + ret = AVERROR(EINVAL); + } + + avformat_network_deinit(); + + return ret < 0 ? 1 : 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/avio_reading.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/avio_reading.c new file mode 100644 index 0000000..02474e9 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/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 <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavformat/avio.h> +#include <libavutil/file.h> + +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); + + 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]; + + /* register codecs and formats and other lavf/lavc components*/ + av_register_all(); + + /* 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); + av_freep(&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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/decoding_encoding.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/decoding_encoding.c new file mode 100644 index 0000000..06a98a6 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/decoding_encoding.c
@@ -0,0 +1,665 @@ +/* + * 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. + * + * @example decoding_encoding.c + * 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 + */ + +#include <math.h> + +#include <libavutil/opt.h> +#include <libavcodec/avcodec.h> +#include <libavutil/channel_layout.h> +#include <libavutil/common.h> +#include <libavutil/imgutils.h> +#include <libavutil/mathematics.h> +#include <libavutil/samplefmt.h> + +#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 = 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; + + /* 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); + if (buffer_size < 0) { + fprintf(stderr, "Could not get sample buffer size\n"); + exit(1); + } + 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_packet_unref(&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_packet_unref(&pkt); + } + } + fclose(f); + + av_freep(&samples); + av_frame_free(&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 + AV_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 i, ch; + int got_frame = 0; + + if (!decoded_frame) { + if (!(decoded_frame = av_frame_alloc())) { + fprintf(stderr, "Could not allocate audio frame\n"); + exit(1); + } + } + + 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_get_bytes_per_sample(c->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<decoded_frame->nb_samples; i++) + for (ch=0; ch<c->channels; ch++) + fwrite(decoded_frame->data[ch] + data_size*i, 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); + av_frame_free(&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}; + /* 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 */ + 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 = 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; + + /* 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; 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 */ + 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_packet_unref(&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_packet_unref(&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]); + av_frame_free(&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; i < ysize; i++) + fwrite(buf + i * wrap, 1, xsize, f); + fclose(f); +} + +static int decode_write_frame(const char *outfilename, AVCodecContext *avctx, + AVFrame *frame, int *frame_count, AVPacket *pkt, int last) +{ + int len, got_frame; + char buf[1024]; + + len = avcodec_decode_video2(avctx, frame, &got_frame, pkt); + if (len < 0) { + fprintf(stderr, "Error while decoding frame %d\n", *frame_count); + return len; + } + if (got_frame) { + printf("Saving %sframe %3d\n", last ? "last " : "", *frame_count); + fflush(stdout); + + /* the picture is allocated by the decoder, no need to free it */ + snprintf(buf, sizeof(buf), outfilename, *frame_count); + pgm_save(frame->data[0], frame->linesize[0], + frame->width, frame->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 + AV_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, AV_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 & AV_CODEC_CAP_TRUNCATED) + c->flags |= AV_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 = av_frame_alloc(); + 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); + av_frame_free(&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 chosen 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.pcm", "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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/demuxing_decoding.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/demuxing_decoding.c new file mode 100644 index 0000000..59e0ccc --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/demuxing_decoding.c
@@ -0,0 +1,383 @@ +/* + * Copyright (c) 2012 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 + * Demuxing and decoding example. + * + * Show how to use the libavformat and libavcodec API to demux and + * decode audio and video data. + * @example demuxing_decoding.c + */ + +#include <libavutil/imgutils.h> +#include <libavutil/samplefmt.h> +#include <libavutil/timestamp.h> +#include <libavformat/avformat.h> + +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; +static const char *audio_dst_filename = NULL; +static FILE *video_dst_file = NULL; +static FILE *audio_dst_file = NULL; + +static uint8_t *video_dst_data[4] = {NULL}; +static int video_dst_linesize[4]; +static int video_dst_bufsize; + +static int video_stream_idx = -1, audio_stream_idx = -1; +static AVFrame *frame = NULL; +static AVPacket pkt; +static int video_frame_count = 0; +static int audio_frame_count = 0; + +/* Enable or disable frame reference counting. You are not supposed to support + * both paths in your application but pick the one most appropriate to your + * needs. Look for the use of refcount in this example to see what are the + * differences of API usage between them. */ +static int refcount = 0; + +static int decode_packet(int *got_frame, int cached) +{ + int ret = 0; + int decoded = pkt.size; + + *got_frame = 0; + + if (pkt.stream_index == video_stream_idx) { + /* decode video frame */ + ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt); + if (ret < 0) { + fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret)); + return ret; + } + + if (*got_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%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)); + + /* 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); + } + } 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 (%s)\n", av_err2str(ret)); + 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); + } + } + + /* If we use frame reference counting, we own the data and need + * to de-reference it when we don't use it anymore */ + if (*got_frame && refcount) + av_frame_unref(frame); + + return decoded; +} + +static int open_codec_context(int *stream_idx, + AVFormatContext *fmt_ctx, enum AVMediaType type) +{ + 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) { + fprintf(stderr, "Could not find %s stream in input file '%s'\n", + av_get_media_type_string(type), src_filename); + return ret; + } else { + 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); + if (!dec) { + fprintf(stderr, "Failed to find %s codec\n", + av_get_media_type_string(type)); + return AVERROR(EINVAL); + } + + /* Init the decoders, with or without reference counting */ + av_dict_set(&opts, "refcounted_frames", refcount ? "1" : "0", 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; + } + *stream_idx = stream_index; + } + + return 0; +} + +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; +} + +int main (int argc, char **argv) +{ + int ret = 0, got_frame; + + if (argc != 4 && argc != 5) { + fprintf(stderr, "usage: %s [-refcount] 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" + "If the -refcount option is specified, the program use the\n" + "reference counting frame system which allows keeping a copy of\n" + "the data for longer than one decode call.\n" + "\n", argv[0]); + exit(1); + } + if (argc == 5 && !strcmp(argv[1], "-refcount")) { + refcount = 1; + argv++; + } + 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); + exit(1); + } + + /* retrieve stream information */ + if (avformat_find_stream_info(fmt_ctx, NULL) < 0) { + fprintf(stderr, "Could not find stream information\n"); + exit(1); + } + + if (open_codec_context(&video_stream_idx, 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) { + fprintf(stderr, "Could not open destination file %s\n", video_dst_filename); + ret = 1; + goto end; + } + + /* 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, + width, height, pix_fmt, 1); + if (ret < 0) { + fprintf(stderr, "Could not allocate raw video buffer\n"); + goto end; + } + video_dst_bufsize = ret; + } + + if (open_codec_context(&audio_stream_idx, 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", audio_dst_filename); + ret = 1; + goto end; + } + } + + /* dump input information to stderr */ + av_dump_format(fmt_ctx, 0, src_filename, 0); + + if (!audio_stream && !video_stream) { + fprintf(stderr, "Could not find audio or 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; + } + + /* initialize packet, set data to NULL, let the demuxer fill it */ + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + if (video_stream) + printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename); + if (audio_stream) + 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_packet_unref(&orig_pkt); + } + + /* flush cached frames */ + pkt.data = NULL; + pkt.size = 0; + do { + decode_packet(&got_frame, 1); + } while (got_frame); + + 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(pix_fmt), width, height, + video_dst_filename); + } + + if (audio_stream) { + enum AVSampleFormat sfmt = audio_dec_ctx->sample_fmt; + int n_channels = audio_dec_ctx->channels; + const char *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 = 1; + } + + 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, audio_dec_ctx->sample_rate, + audio_dst_filename); + } + +end: + avcodec_close(video_dec_ctx); + avcodec_close(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_frame_free(&frame); + av_free(video_dst_data[0]); + + return ret < 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/extract_mvs.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/extract_mvs.c new file mode 100644 index 0000000..975189c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/extract_mvs.c
@@ -0,0 +1,185 @@ +/* + * 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 <libavutil/motion_vector.h> +#include <libavformat/avformat.h> + +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 AVPacket pkt; +static int video_frame_count = 0; + +static int decode_packet(int *got_frame, int cached) +{ + int decoded = pkt.size; + + *got_frame = 0; + + if (pkt.stream_index == video_stream_idx) { + int ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt); + if (ret < 0) { + fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret)); + return ret; + } + + if (*got_frame) { + 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); + } + } + } + } + + return decoded; +} + +static int open_codec_context(int *stream_idx, + 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, NULL, 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 { + *stream_idx = ret; + st = fmt_ctx->streams[*stream_idx]; + + /* find decoder for the stream */ + dec_ctx = st->codec; + dec = avcodec_find_decoder(dec_ctx->codec_id); + if (!dec) { + fprintf(stderr, "Failed to find %s codec\n", + av_get_media_type_string(type)); + return AVERROR(EINVAL); + } + + /* 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; + } + } + + return 0; +} + +int main(int argc, char **argv) +{ + int ret = 0, got_frame; + + if (argc != 2) { + fprintf(stderr, "Usage: %s <video>\n", argv[0]); + exit(1); + } + src_filename = argv[1]; + + av_register_all(); + + 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); + } + + if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) { + video_stream = fmt_ctx->streams[video_stream_idx]; + video_dec_ctx = video_stream->codec; + } + + 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"); + + /* initialize packet, set data to NULL, let the demuxer fill it */ + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + /* 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_packet_unref(&orig_pkt); + } + + /* flush cached frames */ + pkt.data = NULL; + pkt.size = 0; + do { + decode_packet(&got_frame, 1); + } while (got_frame); + +end: + avcodec_close(video_dec_ctx); + avformat_close_input(&fmt_ctx); + av_frame_free(&frame); + return ret < 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filter_audio.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filter_audio.c new file mode 100644 index 0000000..01761dc --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filter_audio.c
@@ -0,0 +1,365 @@ +/* + * 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 <inttypes.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> + +#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; + AVFilter *abuffer; + AVFilterContext *volume_ctx; + AVFilter *volume; + AVFilterContext *aformat_ctx; + AVFilter *aformat; + AVFilterContext *abuffersink_ctx; + 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 <duration>\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; + } + + avfilter_register_all(); + + /* 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filtering_audio.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filtering_audio.c new file mode 100644 index 0000000..89c80cf --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filtering_audio.c
@@ -0,0 +1,295 @@ +/* + * Copyright (c) 2010 Nicolas George + * Copyright (c) 2011 Stefano Sabatini + * Copyright (c) 2012 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. + */ + +/** + * @file + * API example for audio decoding and filtering + * @example filtering_audio.c + */ + +#include <unistd.h> + +#include <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavfilter/avfiltergraph.h> +#include <libavfilter/buffersink.h> +#include <libavfilter/buffersrc.h> +#include <libavutil/opt.h> + +static const char *filter_descr = "aresample=8000,aformat=sample_fmts=s16:channel_layouts=mono"; +static const char *player = "ffplay -f s16le -ar 8000 -ac 1 -"; + +static AVFormatContext *fmt_ctx; +static AVCodecContext *dec_ctx; +AVFilterContext *buffersink_ctx; +AVFilterContext *buffersrc_ctx; +AVFilterGraph *filter_graph; +static int audio_stream_index = -1; + +static int open_input_file(const char *filename) +{ + int ret; + AVCodec *dec; + + if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n"); + 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; + } + + /* 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"); + 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); + + /* init the audio decoder */ + if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open audio decoder\n"); + return ret; + } + + return 0; +} + +static int init_filters(const char *filters_descr) +{ + char args[512]; + int ret = 0; + AVFilter *abuffersrc = avfilter_get_by_name("abuffer"); + 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 }; + static const int64_t out_channel_layouts[] = { AV_CH_LAYOUT_MONO, -1 }; + static const int out_sample_rates[] = { 8000, -1 }; + const AVFilterLink *outlink; + 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) + 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, + time_base.num, 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, abuffersrc, "in", + args, NULL, filter_graph); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n"); + goto end; + } + + /* buffer audio sink: to terminate the filter chain. */ + ret = avfilter_graph_create_filter(&buffersink_ctx, abuffersink, "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_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"); + 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"); + 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"); + goto end; + } + + /* + * 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) + goto end; + + if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0) + goto end; + + /* Print summary of the sink buffer + * Note: args buffer is reused to store channel layout string */ + outlink = buffersink_ctx->inputs[0]; + av_get_channel_layout_string(args, sizeof(args), -1, outlink->channel_layout); + av_log(NULL, AV_LOG_INFO, "Output: srate:%dHz fmt:%s chlayout:%s\n", + (int)outlink->sample_rate, + (char *)av_x_if_null(av_get_sample_fmt_name(outlink->format), "?"), + args); + +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 uint16_t *p = (uint16_t*)frame->data[0]; + const uint16_t *p_end = p + n; + + while (p < p_end) { + fputc(*p & 0xff, stdout); + fputc(*p>>8 & 0xff, stdout); + p++; + } + fflush(stdout); +} + +int main(int argc, char **argv) +{ + int ret; + AVPacket packet0, packet; + AVFrame *frame = av_frame_alloc(); + AVFrame *filt_frame = av_frame_alloc(); + int got_frame; + + if (!frame || !filt_frame) { + perror("Could not allocate frame"); + exit(1); + } + if (argc != 2) { + fprintf(stderr, "Usage: %s file | %s\n", argv[0], player); + exit(1); + } + + av_register_all(); + avfilter_register_all(); + + if ((ret = open_input_file(argv[1])) < 0) + goto end; + if ((ret = init_filters(filter_descr)) < 0) + goto end; + + /* read all packets */ + packet0.data = NULL; + packet.data = NULL; + while (1) { + if (!packet0.data) { + if ((ret = av_read_frame(fmt_ctx, &packet)) < 0) + break; + packet0 = packet; + } + + if (packet.stream_index == audio_stream_index) { + got_frame = 0; + ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, &packet); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n"); + continue; + } + packet.size -= ret; + packet.data += ret; + + 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"); + break; + } + + /* 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); + } + } + + if (packet.size <= 0) + av_packet_unref(&packet0); + } else { + /* discard non-wanted packets */ + av_packet_unref(&packet0); + } + } +end: + avfilter_graph_free(&filter_graph); + avcodec_close(dec_ctx); + avformat_close_input(&fmt_ctx); + av_frame_free(&frame); + av_frame_free(&filt_frame); + + if (ret < 0 && ret != AVERROR_EOF) { + fprintf(stderr, "Error occurred: %s\n", av_err2str(ret)); + exit(1); + } + + exit(0); +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filtering_video.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filtering_video.c new file mode 100644 index 0000000..3dabf13 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/filtering_video.c
@@ -0,0 +1,280 @@ +/* + * Copyright (c) 2010 Nicolas George + * Copyright (c) 2011 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 + * API example for decoding and filtering + * @example filtering_video.c + */ + +#define _XOPEN_SOURCE 600 /* for usleep */ +#include <unistd.h> + +#include <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavfilter/avfiltergraph.h> +#include <libavfilter/buffersink.h> +#include <libavfilter/buffersrc.h> +#include <libavutil/opt.h> + +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; +AVFilterContext *buffersink_ctx; +AVFilterContext *buffersrc_ctx; +AVFilterGraph *filter_graph; +static int video_stream_index = -1; +static int64_t last_pts = AV_NOPTS_VALUE; + +static int open_input_file(const char *filename) +{ + int ret; + AVCodec *dec; + + if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n"); + 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; + } + + /* select the video stream */ + ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot find a video stream in the input file\n"); + return ret; + } + video_stream_index = ret; + dec_ctx = fmt_ctx->streams[video_stream_index]->codec; + av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0); + + /* init the video decoder */ + if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open video decoder\n"); + return ret; + } + + return 0; +} + +static int init_filters(const char *filters_descr) +{ + char args[512]; + int ret = 0; + AVFilter *buffersrc = avfilter_get_by_name("buffer"); + 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 }; + + 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, + 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"); + goto end; + } + + /* buffer video sink: to terminate the filter chain. */ + 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_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; + } + + /* + * 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) + goto end; + + if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0) + goto end; + +end: + avfilter_inout_free(&inputs); + avfilter_inout_free(&outputs); + + return ret; +} + +static void display_frame(const AVFrame *frame, AVRational time_base) +{ + int x, y; + uint8_t *p0, *p; + int64_t delay; + + if (frame->pts != AV_NOPTS_VALUE) { + if (last_pts != AV_NOPTS_VALUE) { + /* sleep roughly the right amount of time; + * usleep is in microseconds, just like AV_TIME_BASE. */ + delay = av_rescale_q(frame->pts - last_pts, + time_base, AV_TIME_BASE_Q); + if (delay > 0 && delay < 1000000) + usleep(delay); + } + last_pts = frame->pts; + } + + /* Trivial ASCII grayscale display. */ + p0 = frame->data[0]; + puts("\033c"); + for (y = 0; y < frame->height; y++) { + p = p0; + for (x = 0; x < frame->width; x++) + putchar(" .-+#"[*(p++) / 52]); + putchar('\n'); + p0 += frame->linesize[0]; + } + fflush(stdout); +} + +int main(int argc, char **argv) +{ + int ret; + 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"); + exit(1); + } + if (argc != 2) { + fprintf(stderr, "Usage: %s file\n", argv[0]); + exit(1); + } + + av_register_all(); + avfilter_register_all(); + + if ((ret = open_input_file(argv[1])) < 0) + goto end; + if ((ret = init_filters(filter_descr)) < 0) + goto end; + + /* read all packets */ + while (1) { + if ((ret = av_read_frame(fmt_ctx, &packet)) < 0) + break; + + if (packet.stream_index == video_stream_index) { + got_frame = 0; + ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &packet); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error decoding video\n"); + break; + } + + if (got_frame) { + frame->pts = av_frame_get_best_effort_timestamp(frame); + + /* push the 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 filtergraph\n"); + break; + } + + /* pull filtered frames 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; + display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base); + av_frame_unref(filt_frame); + } + av_frame_unref(frame); + } + } + av_packet_unref(&packet); + } +end: + avfilter_graph_free(&filter_graph); + avcodec_close(dec_ctx); + avformat_close_input(&fmt_ctx); + av_frame_free(&frame); + av_frame_free(&filt_frame); + + if (ret < 0 && ret != AVERROR_EOF) { + fprintf(stderr, "Error occurred: %s\n", av_err2str(ret)); + exit(1); + } + + exit(0); +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/http_multiclient.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/http_multiclient.c new file mode 100644 index 0000000..b9a306d --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/http_multiclient.c
@@ -0,0 +1,155 @@ +/* + * 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 <libavformat/avformat.h> +#include <libavutil/opt.h> +#include <unistd.h> + +void process_client(AVIOContext *client, const char *in_uri) +{ + AVIOContext *input = NULL; + uint8_t buf[1024]; + int ret, n, reply_code; + char *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; + } + 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); +} + +int main(int argc, char **argv) +{ + av_log_set_level(AV_LOG_TRACE); + AVDictionary *options = NULL; + AVIOContext *client = NULL, *server = NULL; + const char *in_uri, *out_uri; + int ret, pid; + 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]; + + av_register_all(); + 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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/metadata.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/metadata.c new file mode 100644 index 0000000..f73c267 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/metadata.c
@@ -0,0 +1,56 @@ +/* + * Copyright (c) 2011 Reinhard Tartler + * + * 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 + * Shows how the metadata API can be used in application programs. + * @example metadata.c + */ + +#include <stdio.h> + +#include <libavformat/avformat.h> +#include <libavutil/dict.h> + +int main (int argc, char **argv) +{ + AVFormatContext *fmt_ctx = NULL; + AVDictionaryEntry *tag = NULL; + int ret; + + if (argc != 2) { + printf("usage: %s <input_file>\n" + "example program to demonstrate the use of the libavformat metadata API.\n" + "\n", argv[0]); + return 1; + } + + av_register_all(); + if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL))) + return ret; + + while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) + printf("%s=%s\n", tag->key, tag->value); + + avformat_close_input(&fmt_ctx); + return 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/muxing.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/muxing.c new file mode 100644 index 0000000..d4dac5c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/muxing.c
@@ -0,0 +1,651 @@ +/* + * Copyright (c) 2003 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 + * libavformat API example. + * + * Output a media file in any supported libavformat format. The default + * codecs are used. + * @example muxing.c + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> + +#include <libavutil/avassert.h> +#include <libavutil/channel_layout.h> +#include <libavutil/opt.h> +#include <libavutil/mathematics.h> +#include <libavutil/timestamp.h> +#include <libavformat/avformat.h> +#include <libswscale/swscale.h> +#include <libswresample/swresample.h> + +#define STREAM_DURATION 10.0 +#define STREAM_FRAME_RATE 25 /* 25 images/s */ +#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */ + +#define SCALE_FLAGS SWS_BICUBIC + +// a wrapper around a single output AVStream +typedef struct OutputStream { + AVStream *st; + + /* 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, const AVRational *time_base, AVStream *st, AVPacket *pkt) +{ + /* rescale output packet timestamp values from codec to stream timebase */ + av_packet_rescale_ts(pkt, *time_base, st->time_base); + pkt->stream_index = st->index; + + /* Write the compressed frame to the media file. */ + log_packet(fmt_ctx, pkt); + return av_interleaved_write_frame(fmt_ctx, pkt); +} + +/* Add an output stream. */ +static void add_stream(OutputStream *ost, AVFormatContext *oc, + AVCodec **codec, + enum AVCodecID codec_id) +{ + AVCodecContext *c; + int i; + + /* find the encoder */ + *codec = avcodec_find_encoder(codec_id); + if (!(*codec)) { + fprintf(stderr, "Could not find encoder for '%s'\n", + avcodec_get_name(codec_id)); + exit(1); + } + + ost->st = avformat_new_stream(oc, *codec); + if (!ost->st) { + fprintf(stderr, "Could not allocate stream\n"); + exit(1); + } + ost->st->id = oc->nb_streams-1; + c = ost->st->codec; + + switch ((*codec)->type) { + case AVMEDIA_TYPE_AUDIO: + c->sample_fmt = (*codec)->sample_fmts ? + (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; + c->bit_rate = 64000; + c->sample_rate = 44100; + 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: + c->codec_id = codec_id; + + c->bit_rate = 400000; + /* Resolution must be a multiple of two. */ + c->width = 352; + c->height = 288; + /* timebase: This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identical to 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 */ + c->max_b_frames = 2; + } + if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) { + /* Needed to avoid using macroblocks in which some coeffs overflow. + * This does not happen with normal video, it just happens here as + * the motion of the chroma plane does not match the luma plane. */ + c->mb_decision = 2; + } + break; + + default: + break; + } + + /* Some formats want stream headers to be separate. */ + if (oc->oformat->flags & AVFMT_GLOBALHEADER) + c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; +} + +/**************************************************************/ +/* audio output */ + +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); + } + + frame->format = sample_fmt; + frame->channel_layout = channel_layout; + frame->sample_rate = sample_rate; + frame->nb_samples = nb_samples; + + if (nb_samples) { + ret = av_frame_get_buffer(frame, 0); + if (ret < 0) { + fprintf(stderr, "Error allocating an audio buffer\n"); + exit(1); + } + } + + return frame; +} + +static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg) +{ + AVCodecContext *c; + int nb_samples; + int ret; + AVDictionary *opt = NULL; + + c = ost->st->codec; + + /* open it */ + 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 */ + ost->t = 0; + ost->tincr = 2 * M_PI * 110.0 / c->sample_rate; + /* increment frequency by 110 Hz per second */ + 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; + + 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); + + /* create resampler context */ + ost->swr_ctx = swr_alloc(); + if (!ost->swr_ctx) { + fprintf(stderr, "Could not allocate resampler context\n"); + exit(1); + } + + /* 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); + } +} + +/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and + * 'nb_channels' channels. */ +static AVFrame *get_audio_frame(OutputStream *ost) +{ + AVFrame *frame = ost->tmp_frame; + int j, i, v; + int16_t *q = (int16_t*)frame->data[0]; + + /* check if we want to generate more frames */ + if (av_compare_ts(ost->next_pts, ost->st->codec->time_base, + STREAM_DURATION, (AVRational){ 1, 1 }) >= 0) + return NULL; + + for (j = 0; j <frame->nb_samples; j++) { + v = (int)(sin(ost->t) * 10000); + for (i = 0; i < ost->st->codec->channels; i++) + *q++ = v; + ost->t += ost->tincr; + ost->tincr += ost->tincr2; + } + + frame->pts = ost->next_pts; + ost->next_pts += frame->nb_samples; + + return frame; +} + +/* + * 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; + int ret; + int got_packet; + int dst_nb_samples; + + av_init_packet(&pkt); + c = ost->st->codec; + + frame = get_audio_frame(ost); + + 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(ost->swr_ctx, c->sample_rate) + frame->nb_samples, + c->sample_rate, c->sample_rate, AV_ROUND_UP); + 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(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); + } + 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; + } + + 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); + } + + if (got_packet) { + ret = write_frame(oc, &c->time_base, ost->st, &pkt); + if (ret < 0) { + fprintf(stderr, "Error while writing audio frame: %s\n", + av_err2str(ret)); + exit(1); + } + } + + return (frame || got_packet) ? 0 : 1; +} + +/**************************************************************/ +/* video output */ + +static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height) +{ + AVFrame *picture; + int ret; + + picture = av_frame_alloc(); + if (!picture) + return NULL; + + picture->format = pix_fmt; + picture->width = width; + picture->height = height; + + /* allocate the buffers for the frame data */ + ret = av_frame_get_buffer(picture, 32); + if (ret < 0) { + fprintf(stderr, "Could not allocate frame data.\n"); + exit(1); + } + + return picture; +} + +static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg) +{ + int ret; + AVCodecContext *c = ost->st->codec; + AVDictionary *opt = NULL; + + av_dict_copy(&opt, opt_arg, 0); + + /* open the codec */ + 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 */ + ost->frame = alloc_picture(c->pix_fmt, c->width, c->height); + if (!ost->frame) { + fprintf(stderr, "Could not allocate video frame\n"); + 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) { + 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); + } + } +} + +/* Prepare a dummy image. */ +static void fill_yuv_image(AVFrame *pict, int frame_index, + int width, int height) +{ + int x, y, i, ret; + + /* 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(pict); + if (ret < 0) + exit(1); + + i = frame_index; + + /* Y */ + for (y = 0; y < height; y++) + for (x = 0; x < width; x++) + pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3; + + /* Cb and Cr */ + for (y = 0; y < height / 2; y++) { + for (x = 0; x < width / 2; x++) { + pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2; + pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5; + } + } +} + +static AVFrame *get_video_frame(OutputStream *ost) +{ + AVCodecContext *c = ost->st->codec; + + /* check if we want to generate more frames */ + if (av_compare_ts(ost->next_pts, ost->st->codec->time_base, + STREAM_DURATION, (AVRational){ 1, 1 }) >= 0) + return NULL; + + 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 { + fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height); + } + + ost->frame->pts = ost->next_pts++; + + return ost->frame; +} + +/* + * 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) +{ + int ret; + AVCodecContext *c; + AVFrame *frame; + int got_packet = 0; + AVPacket pkt = { 0 }; + + c = ost->st->codec; + + frame = get_video_frame(ost); + + av_init_packet(&pkt); + + /* 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 (got_packet) { + ret = write_frame(oc, &c->time_base, ost->st, &pkt); + } else { + ret = 0; + } + + if (ret < 0) { + fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret)); + exit(1); + } + + return (frame || got_packet) ? 0 : 1; +} + +static void close_stream(AVFormatContext *oc, OutputStream *ost) +{ + avcodec_close(ost->st->codec); + av_frame_free(&ost->frame); + av_frame_free(&ost->tmp_frame); + sws_freeContext(ost->sws_ctx); + swr_free(&ost->swr_ctx); +} + +/**************************************************************/ +/* media file output */ + +int main(int argc, char **argv) +{ + OutputStream video_st = { 0 }, audio_st = { 0 }; + const char *filename; + AVOutputFormat *fmt; + AVFormatContext *oc; + AVCodec *audio_codec, *video_codec; + int ret; + int have_video = 0, have_audio = 0; + int encode_video = 0, encode_audio = 0; + AVDictionary *opt = NULL; + + /* Initialize libavcodec, and register all codecs and formats. */ + av_register_all(); + + 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" + "muxes them into a file named output_file.\n" + "The output format is automatically guessed according to the file extension.\n" + "Raw images can also be output by using '%%d' in the filename.\n" + "\n", argv[0]); + return 1; + } + + filename = argv[1]; + if (argc > 3 && !strcmp(argv[2], "-flags")) { + av_dict_set(&opt, argv[2]+1, argv[3], 0); + } + + /* allocate the output media context */ + avformat_alloc_output_context2(&oc, NULL, NULL, filename); + if (!oc) { + printf("Could not deduce output format from file extension: using MPEG.\n"); + avformat_alloc_output_context2(&oc, NULL, "mpeg", filename); + } + if (!oc) + return 1; + + fmt = oc->oformat; + + /* Add the audio and video streams using the default format codecs + * and initialize the codecs. */ + if (fmt->video_codec != AV_CODEC_ID_NONE) { + add_stream(&video_st, oc, &video_codec, fmt->video_codec); + have_video = 1; + encode_video = 1; + } + if (fmt->audio_codec != AV_CODEC_ID_NONE) { + 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 (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); + + /* open the output file, if needed */ + if (!(fmt->flags & AVFMT_NOFILE)) { + ret = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE); + if (ret < 0) { + fprintf(stderr, "Could not open '%s': %s\n", filename, + av_err2str(ret)); + return 1; + } + } + + /* Write the stream header, if any. */ + ret = avformat_write_header(oc, &opt); + if (ret < 0) { + fprintf(stderr, "Error occurred when opening output file: %s\n", + av_err2str(ret)); + return 1; + } + + while (encode_video || encode_audio) { + /* select the stream to encode */ + if (encode_video && + (!encode_audio || av_compare_ts(video_st.next_pts, video_st.st->codec->time_base, + audio_st.next_pts, audio_st.st->codec->time_base) <= 0)) { + encode_video = !write_video_frame(oc, &video_st); + } else { + encode_audio = !write_audio_frame(oc, &audio_st); + } + } + + /* Write the trailer, if any. The trailer must be written before you + * close the CodecContexts open when you wrote the header; otherwise + * av_write_trailer() may try to use memory that was freed on + * av_codec_close(). */ + av_write_trailer(oc); + + /* Close each codec. */ + 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_closep(&oc->pb); + + /* free the stream */ + avformat_free_context(oc); + + return 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/qsvdec.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/qsvdec.c new file mode 100644 index 0000000..fd934be --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/qsvdec.c
@@ -0,0 +1,487 @@ +/* + * 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 VA-API video surfaces. + */ + +#include "config.h" + +#include <stdio.h> + +#include <mfx/mfxvideo.h> + +#include <va/va.h> +#include <va/va_x11.h> +#include <X11/Xlib.h> + +#include "libavformat/avformat.h" +#include "libavformat/avio.h" + +#include "libavcodec/avcodec.h" +#include "libavcodec/qsv.h" + +#include "libavutil/error.h" +#include "libavutil/mem.h" + +typedef struct DecodeContext { + mfxSession mfx_session; + VADisplay va_dpy; + + VASurfaceID *surfaces; + mfxMemId *surface_ids; + int *surface_used; + int nb_surfaces; + + mfxFrameInfo frame_info; +} DecodeContext; + +static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, + mfxFrameAllocResponse *resp) +{ + DecodeContext *decode = pthis; + int err, i; + + if (decode->surfaces) { + fprintf(stderr, "Multiple allocation requests.\n"); + return MFX_ERR_MEMORY_ALLOC; + } + if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET)) { + fprintf(stderr, "Unsupported surface type: %d\n", req->Type); + return MFX_ERR_UNSUPPORTED; + } + if (req->Info.BitDepthLuma != 8 || req->Info.BitDepthChroma != 8 || + req->Info.Shift || req->Info.FourCC != MFX_FOURCC_NV12 || + req->Info.ChromaFormat != MFX_CHROMAFORMAT_YUV420) { + fprintf(stderr, "Unsupported surface properties.\n"); + return MFX_ERR_UNSUPPORTED; + } + + decode->surfaces = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surfaces)); + decode->surface_ids = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surface_ids)); + decode->surface_used = av_mallocz_array(req->NumFrameSuggested, sizeof(*decode->surface_used)); + if (!decode->surfaces || !decode->surface_ids || !decode->surface_used) + goto fail; + + err = vaCreateSurfaces(decode->va_dpy, VA_RT_FORMAT_YUV420, + req->Info.Width, req->Info.Height, + decode->surfaces, req->NumFrameSuggested, + NULL, 0); + if (err != VA_STATUS_SUCCESS) { + fprintf(stderr, "Error allocating VA surfaces\n"); + goto fail; + } + decode->nb_surfaces = req->NumFrameSuggested; + + for (i = 0; i < decode->nb_surfaces; i++) + decode->surface_ids[i] = &decode->surfaces[i]; + + resp->mids = decode->surface_ids; + resp->NumFrameActual = decode->nb_surfaces; + + decode->frame_info = req->Info; + + return MFX_ERR_NONE; +fail: + av_freep(&decode->surfaces); + av_freep(&decode->surface_ids); + av_freep(&decode->surface_used); + + return MFX_ERR_MEMORY_ALLOC; +} + +static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp) +{ + return MFX_ERR_NONE; +} + +static mfxStatus frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) +{ + return MFX_ERR_UNSUPPORTED; +} + +static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) +{ + return MFX_ERR_UNSUPPORTED; +} + +static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) +{ + *hdl = mid; + return MFX_ERR_NONE; +} + +static void free_surfaces(DecodeContext *decode) +{ + if (decode->surfaces) + vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces); + av_freep(&decode->surfaces); + av_freep(&decode->surface_ids); + av_freep(&decode->surface_used); + decode->nb_surfaces = 0; +} + +static void free_buffer(void *opaque, uint8_t *data) +{ + int *used = opaque; + *used = 0; + av_freep(&data); +} + +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags) +{ + DecodeContext *decode = avctx->opaque; + + mfxFrameSurface1 *surf; + AVBufferRef *surf_buf; + int idx; + + for (idx = 0; idx < decode->nb_surfaces; idx++) { + if (!decode->surface_used[idx]) + break; + } + if (idx == decode->nb_surfaces) { + fprintf(stderr, "No free surfaces\n"); + return AVERROR(ENOMEM); + } + + surf = av_mallocz(sizeof(*surf)); + if (!surf) + return AVERROR(ENOMEM); + surf_buf = av_buffer_create((uint8_t*)surf, sizeof(*surf), free_buffer, + &decode->surface_used[idx], AV_BUFFER_FLAG_READONLY); + if (!surf_buf) { + av_freep(&surf); + return AVERROR(ENOMEM); + } + + surf->Info = decode->frame_info; + surf->Data.MemId = &decode->surfaces[idx]; + + frame->buf[0] = surf_buf; + frame->data[3] = (uint8_t*)surf; + + decode->surface_used[idx] = 1; + + return 0; +} + +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) { + if (!avctx->hwaccel_context) { + DecodeContext *decode = avctx->opaque; + AVQSVContext *qsv = av_qsv_alloc_context(); + if (!qsv) + return AV_PIX_FMT_NONE; + + qsv->session = decode->mfx_session; + qsv->iopattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; + + avctx->hwaccel_context = qsv; + } + + 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, AVPacket *pkt, + AVIOContext *output_ctx) +{ + int ret = 0; + int got_frame = 1; + + while (pkt->size > 0 || (!pkt->data && got_frame)) { + ret = avcodec_decode_video2(decoder_ctx, frame, &got_frame, pkt); + if (ret < 0) { + fprintf(stderr, "Error during decoding\n"); + return ret; + } + + pkt->data += ret; + pkt->size -= 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. */ + if (got_frame) { + mfxFrameSurface1 *surf = (mfxFrameSurface1*)frame->data[3]; + VASurfaceID surface = *(VASurfaceID*)surf->Data.MemId; + + VAImageFormat img_fmt = { + .fourcc = VA_FOURCC_NV12, + .byte_order = VA_LSB_FIRST, + .bits_per_pixel = 8, + .depth = 8, + }; + + VAImage img; + + VAStatus err; + uint8_t *data; + int i, j; + + img.buf = VA_INVALID_ID; + img.image_id = VA_INVALID_ID; + + err = vaCreateImage(decode->va_dpy, &img_fmt, + frame->width, frame->height, &img); + if (err != VA_STATUS_SUCCESS) { + fprintf(stderr, "Error creating an image: %s\n", + vaErrorStr(err)); + ret = AVERROR_UNKNOWN; + goto fail; + } + + err = vaGetImage(decode->va_dpy, surface, 0, 0, + frame->width, frame->height, + img.image_id); + if (err != VA_STATUS_SUCCESS) { + fprintf(stderr, "Error getting an image: %s\n", + vaErrorStr(err)); + ret = AVERROR_UNKNOWN; + goto fail; + } + + err = vaMapBuffer(decode->va_dpy, img.buf, (void**)&data); + if (err != VA_STATUS_SUCCESS) { + fprintf(stderr, "Error mapping the image buffer: %s\n", + vaErrorStr(err)); + ret = AVERROR_UNKNOWN; + goto fail; + } + + for (i = 0; i < img.num_planes; i++) + for (j = 0; j < (img.height >> (i > 0)); j++) + avio_write(output_ctx, data + img.offsets[i] + j * img.pitches[i], img.width); + +fail: + if (img.buf != VA_INVALID_ID) + vaUnmapBuffer(decode->va_dpy, img.buf); + if (img.image_id != VA_INVALID_ID) + vaDestroyImage(decode->va_dpy, img.image_id); + 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; + + DecodeContext decode = { NULL }; + + Display *dpy = NULL; + int va_ver_major, va_ver_minor; + + mfxIMPL mfx_impl = MFX_IMPL_AUTO_ANY; + mfxVersion mfx_ver = { { 1, 1 } }; + + mfxFrameAllocator frame_allocator = { + .pthis = &decode, + .Alloc = frame_alloc, + .Lock = frame_lock, + .Unlock = frame_unlock, + .GetHDL = frame_get_hdl, + .Free = frame_free, + }; + + AVIOContext *output_ctx = NULL; + + int ret, i, err; + + av_register_all(); + + if (argc < 3) { + fprintf(stderr, "Usage: %s <input file> <output file>\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->codec->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; + } + + /* initialize VA-API */ + dpy = XOpenDisplay(NULL); + if (!dpy) { + fprintf(stderr, "Cannot open the X display\n"); + goto finish; + } + decode.va_dpy = vaGetDisplay(dpy); + if (!decode.va_dpy) { + fprintf(stderr, "Cannot open the VA display\n"); + goto finish; + } + + err = vaInitialize(decode.va_dpy, &va_ver_major, &va_ver_minor); + if (err != VA_STATUS_SUCCESS) { + fprintf(stderr, "Cannot initialize VA: %s\n", vaErrorStr(err)); + goto finish; + } + fprintf(stderr, "Initialized VA v%d.%d\n", va_ver_major, va_ver_minor); + + /* initialize an MFX session */ + err = MFXInit(mfx_impl, &mfx_ver, &decode.mfx_session); + if (err != MFX_ERR_NONE) { + fprintf(stderr, "Error initializing an MFX session\n"); + goto finish; + } + + MFXVideoCORE_SetHandle(decode.mfx_session, MFX_HANDLE_VA_DISPLAY, decode.va_dpy); + MFXVideoCORE_SetFrameAllocator(decode.mfx_session, &frame_allocator); + + /* 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->codec->extradata_size) { + decoder_ctx->extradata = av_mallocz(video_st->codec->extradata_size + + AV_INPUT_BUFFER_PADDING_SIZE); + if (!decoder_ctx->extradata) { + ret = AVERROR(ENOMEM); + goto finish; + } + memcpy(decoder_ctx->extradata, video_st->codec->extradata, + video_st->codec->extradata_size); + decoder_ctx->extradata_size = video_st->codec->extradata_size; + } + decoder_ctx->refcounted_frames = 1; + + decoder_ctx->opaque = &decode; + decoder_ctx->get_buffer2 = get_buffer; + 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(); + if (!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, &pkt, output_ctx); + + av_packet_unref(&pkt); + } + + /* flush the decoder */ + pkt.data = NULL; + pkt.size = 0; + ret = decode_packet(&decode, decoder_ctx, 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); + + if (decoder_ctx) + av_freep(&decoder_ctx->hwaccel_context); + avcodec_free_context(&decoder_ctx); + + free_surfaces(&decode); + + if (decode.mfx_session) + MFXClose(decode.mfx_session); + if (decode.va_dpy) + vaTerminate(decode.va_dpy); + if (dpy) + XCloseDisplay(dpy); + + avio_close(output_ctx); + + return ret; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/remuxing.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/remuxing.c new file mode 100644 index 0000000..65437d9 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/remuxing.c
@@ -0,0 +1,165 @@ +/* + * 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 <libavutil/timestamp.h> +#include <libavformat/avformat.h> + +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; + + 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]; + + av_register_all(); + + 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; + } + + ofmt = ofmt_ctx->oformat; + + for (i = 0; i < ifmt_ctx->nb_streams; i++) { + AVStream *in_stream = ifmt_ctx->streams[i]; + AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec); + if (!out_stream) { + fprintf(stderr, "Failed allocating output stream\n"); + ret = AVERROR_UNKNOWN; + goto end; + } + + ret = avcodec_copy_context(out_stream->codec, in_stream->codec); + if (ret < 0) { + fprintf(stderr, "Failed to copy context from input to output stream codec context\n"); + goto end; + } + out_stream->codec->codec_tag = 0; + if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) + out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + } + 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]; + 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); + + if (ret < 0 && ret != AVERROR_EOF) { + fprintf(stderr, "Error occurred: %s\n", av_err2str(ret)); + return 1; + } + + return 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/resampling_audio.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/resampling_audio.c new file mode 100644 index 0000000..f35e7e1 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/resampling_audio.c
@@ -0,0 +1,214 @@ +/* + * Copyright (c) 2012 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. + */ + +/** + * @example resampling_audio.c + * libswresample API use example. + */ + +#include <libavutil/opt.h> +#include <libavutil/channel_layout.h> +#include <libavutil/samplefmt.h> +#include <libswresample/swresample.h> + +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 not supported as output format\n", + av_get_sample_fmt_name(sample_fmt)); + return AVERROR(EINVAL); +} + +/** + * Fill dst buffer with nb_samples, generated starting from 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; + const double c = 2 * M_PI * 440.0; + + /* generate sin tone with 440Hz frequency and duplicated channels */ + for (i = 0; i < nb_samples; i++) { + *dstp = sin(c * *t); + for (j = 1; j < nb_channels; j++) + dstp[j] = dstp[0]; + dstp += nb_channels; + *t += tincr; + } +} + +int main(int argc, char **argv) +{ + int64_t src_ch_layout = AV_CH_LAYOUT_STEREO, dst_ch_layout = AV_CH_LAYOUT_SURROUND; + int src_rate = 48000, dst_rate = 44100; + uint8_t **src_data = NULL, **dst_data = NULL; + int src_nb_channels = 0, dst_nb_channels = 0; + int src_linesize, dst_linesize; + int src_nb_samples = 1024, dst_nb_samples, max_dst_nb_samples; + enum AVSampleFormat src_sample_fmt = AV_SAMPLE_FMT_DBL, dst_sample_fmt = AV_SAMPLE_FMT_S16; + const char *dst_filename = NULL; + FILE *dst_file; + int dst_bufsize; + const char *fmt; + struct SwrContext *swr_ctx; + double t; + int ret; + + if (argc != 2) { + fprintf(stderr, "Usage: %s output_file\n" + "API example program to show how to resample an audio stream with libswresample.\n" + "This program generates a series of audio frames, resamples them to a specified " + "output format and rate and saves them to an output file named output_file.\n", + argv[0]); + exit(1); + } + dst_filename = argv[1]; + + dst_file = fopen(dst_filename, "wb"); + if (!dst_file) { + fprintf(stderr, "Could not open destination file %s\n", dst_filename); + exit(1); + } + + /* create resampler context */ + swr_ctx = swr_alloc(); + if (!swr_ctx) { + fprintf(stderr, "Could not allocate resampler context\n"); + ret = AVERROR(ENOMEM); + goto end; + } + + /* set options */ + av_opt_set_int(swr_ctx, "in_channel_layout", src_ch_layout, 0); + av_opt_set_int(swr_ctx, "in_sample_rate", src_rate, 0); + av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", src_sample_fmt, 0); + + av_opt_set_int(swr_ctx, "out_channel_layout", dst_ch_layout, 0); + av_opt_set_int(swr_ctx, "out_sample_rate", dst_rate, 0); + av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", dst_sample_fmt, 0); + + /* initialize the resampling context */ + if ((ret = swr_init(swr_ctx)) < 0) { + fprintf(stderr, "Failed to initialize the resampling context\n"); + goto end; + } + + /* allocate source and destination samples buffers */ + + src_nb_channels = av_get_channel_layout_nb_channels(src_ch_layout); + ret = av_samples_alloc_array_and_samples(&src_data, &src_linesize, src_nb_channels, + src_nb_samples, src_sample_fmt, 0); + if (ret < 0) { + fprintf(stderr, "Could not allocate source samples\n"); + goto end; + } + + /* 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 = dst_nb_samples = + av_rescale_rnd(src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); + + /* buffer is going to be directly written to a rawaudio file, no alignment */ + dst_nb_channels = av_get_channel_layout_nb_channels(dst_ch_layout); + ret = av_samples_alloc_array_and_samples(&dst_data, &dst_linesize, dst_nb_channels, + dst_nb_samples, dst_sample_fmt, 0); + if (ret < 0) { + fprintf(stderr, "Could not allocate destination samples\n"); + goto end; + } + + t = 0; + do { + /* generate synthetic audio */ + fill_samples((double *)src_data[0], src_nb_samples, src_nb_channels, src_rate, &t); + + /* compute destination number of samples */ + 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_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) + break; + max_dst_nb_samples = dst_nb_samples; + } + + /* convert to destination format */ + ret = swr_convert(swr_ctx, dst_data, dst_nb_samples, (const uint8_t **)src_data, src_nb_samples); + if (ret < 0) { + fprintf(stderr, "Error while converting\n"); + goto end; + } + 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); + + if ((ret = get_format_from_sample_fmt(&fmt, dst_sample_fmt)) < 0) + goto end; + fprintf(stderr, "Resampling succeeded. Play the output file with the command:\n" + "ffplay -f %s -channel_layout %"PRId64" -channels %d -ar %d %s\n", + fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename); + +end: + fclose(dst_file); + + if (src_data) + av_freep(&src_data[0]); + av_freep(&src_data); + + if (dst_data) + av_freep(&dst_data[0]); + av_freep(&dst_data); + + swr_free(&swr_ctx); + return ret < 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/scaling_video.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/scaling_video.c new file mode 100644 index 0000000..587f3ab --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/scaling_video.c
@@ -0,0 +1,140 @@ +/* + * Copyright (c) 2012 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 + * libswscale API use example. + * @example scaling_video.c + */ + +#include <libavutil/imgutils.h> +#include <libavutil/parseutils.h> +#include <libswscale/swscale.h> + +static void fill_yuv_image(uint8_t *data[4], int linesize[4], + int width, int height, int frame_index) +{ + int x, y; + + /* Y */ + for (y = 0; y < height; y++) + for (x = 0; x < width; x++) + data[0][y * linesize[0] + x] = x + y + frame_index * 3; + + /* Cb and Cr */ + for (y = 0; y < height / 2; y++) { + for (x = 0; x < width / 2; x++) { + data[1][y * linesize[1] + x] = 128 + y + frame_index * 2; + data[2][y * linesize[2] + x] = 64 + x + frame_index * 5; + } + } +} + +int main(int argc, char **argv) +{ + uint8_t *src_data[4], *dst_data[4]; + int src_linesize[4], dst_linesize[4]; + int src_w = 320, src_h = 240, dst_w, dst_h; + enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_YUV420P, dst_pix_fmt = AV_PIX_FMT_RGB24; + const char *dst_size = NULL; + const char *dst_filename = NULL; + FILE *dst_file; + int dst_bufsize; + struct SwsContext *sws_ctx; + int i, ret; + + if (argc != 3) { + fprintf(stderr, "Usage: %s output_file output_size\n" + "API example program to show how to scale an image with libswscale.\n" + "This program generates a series of pictures, rescales them to the given " + "output_size and saves them to an output file named output_file\n." + "\n", argv[0]); + exit(1); + } + dst_filename = argv[1]; + dst_size = argv[2]; + + if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) { + fprintf(stderr, + "Invalid size '%s', must be in the form WxH or a valid size abbreviation\n", + dst_size); + exit(1); + } + + dst_file = fopen(dst_filename, "wb"); + if (!dst_file) { + fprintf(stderr, "Could not open destination file %s\n", dst_filename); + exit(1); + } + + /* create scaling context */ + sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt, + dst_w, dst_h, dst_pix_fmt, + SWS_BILINEAR, NULL, NULL, NULL); + if (!sws_ctx) { + fprintf(stderr, + "Impossible to create scale context for the conversion " + "fmt:%s s:%dx%d -> fmt:%s s:%dx%d\n", + av_get_pix_fmt_name(src_pix_fmt), src_w, src_h, + av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h); + ret = AVERROR(EINVAL); + goto end; + } + + /* allocate source and destination image buffers */ + if ((ret = av_image_alloc(src_data, src_linesize, + src_w, src_h, src_pix_fmt, 16)) < 0) { + fprintf(stderr, "Could not allocate source image\n"); + goto end; + } + + /* buffer is going to be written to rawvideo file, no alignment */ + if ((ret = av_image_alloc(dst_data, dst_linesize, + dst_w, dst_h, dst_pix_fmt, 1)) < 0) { + fprintf(stderr, "Could not allocate destination image\n"); + goto end; + } + dst_bufsize = ret; + + for (i = 0; i < 100; i++) { + /* generate synthetic video */ + fill_yuv_image(src_data, src_linesize, src_w, src_h, i); + + /* convert to destination format */ + sws_scale(sws_ctx, (const uint8_t * const*)src_data, + src_linesize, 0, src_h, dst_data, dst_linesize); + + /* write scaled image to file */ + fwrite(dst_data[0], 1, dst_bufsize, dst_file); + } + + fprintf(stderr, "Scaling succeeded. Play the output file with the command:\n" + "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n", + av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename); + +end: + fclose(dst_file); + av_freep(&src_data[0]); + av_freep(&dst_data[0]); + sws_freeContext(sws_ctx); + return ret < 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/transcode_aac.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/transcode_aac.c new file mode 100644 index 0000000..486e54c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/transcode_aac.c
@@ -0,0 +1,770 @@ +/* + * 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. + * @author Andreas Unterweger (dustsigns@gmail.com) + */ + +#include <stdio.h> + +#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 kbit/s */ +#define OUTPUT_BIT_RATE 96000 +/** The number of output channels */ +#define OUTPUT_CHANNELS 2 + +/** + * Convert an error code into a text message. + * @param error Error code to be converted + * @return Corresponding error text (not thread-safe) + */ +static const char *get_error_text(const int error) +{ + static char error_buffer[255]; + av_strerror(error, error_buffer, sizeof(error_buffer)); + return error_buffer; +} + +/** Open an input file and the required decoder. */ +static int open_input_file(const char *filename, + AVFormatContext **input_format_context, + AVCodecContext **input_codec_context) +{ + 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, get_error_text(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", + get_error_text(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]->codec->codec_id))) { + fprintf(stderr, "Could not find input codec\n"); + avformat_close_input(input_format_context); + return AVERROR_EXIT; + } + + /** Open the decoder for the audio stream to use it later. */ + if ((error = avcodec_open2((*input_format_context)->streams[0]->codec, + input_codec, NULL)) < 0) { + fprintf(stderr, "Could not open input codec (error '%s')\n", + get_error_text(error)); + avformat_close_input(input_format_context); + return error; + } + + /** Save the decoder context for easier access later. */ + *input_codec_context = (*input_format_context)->streams[0]->codec; + + 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. + */ +static int open_output_file(const char *filename, + AVCodecContext *input_codec_context, + AVFormatContext **output_format_context, + AVCodecContext **output_codec_context) +{ + 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, get_error_text(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; + } + + av_strlcpy((*output_format_context)->filename, filename, + sizeof((*output_format_context)->filename)); + + /** 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, output_codec))) { + fprintf(stderr, "Could not create new stream\n"); + error = AVERROR(ENOMEM); + goto cleanup; + } + + /** Save the encoder context for easier access later. */ + *output_codec_context = stream->codec; + + /** + * Set the basic encoder parameters. + * The input file's sample rate is used to avoid a sample rate conversion. + */ + (*output_codec_context)->channels = OUTPUT_CHANNELS; + (*output_codec_context)->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS); + (*output_codec_context)->sample_rate = input_codec_context->sample_rate; + (*output_codec_context)->sample_fmt = output_codec->sample_fmts[0]; + (*output_codec_context)->bit_rate = OUTPUT_BIT_RATE; + + /** Allow the use of the experimental AAC encoder */ + (*output_codec_context)->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) + (*output_codec_context)->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + + /** Open the encoder for the audio stream to use it later. */ + if ((error = avcodec_open2(*output_codec_context, output_codec, NULL)) < 0) { + fprintf(stderr, "Could not open output codec (error '%s')\n", + get_error_text(error)); + goto cleanup; + } + + return 0; + +cleanup: + 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. */ +static void init_packet(AVPacket *packet) +{ + av_init_packet(packet); + /** Set the packet data and size so that it is recognized as being empty. */ + packet->data = NULL; + packet->size = 0; +} + +/** Initialize one audio frame for reading from the input file */ +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. + */ +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. */ +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. */ +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", + get_error_text(error)); + return error; + } + return 0; +} + +/** Decode one audio frame from the input file. */ +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; + init_packet(&input_packet); + + /** 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", + get_error_text(error)); + return error; + } + } + + /** + * Decode the audio frame stored in the temporary packet. + * The input audio stream decoder is used to do this. + * If we are at the end of the file, pass an empty packet to the decoder + * to flush it. + */ + if ((error = avcodec_decode_audio4(input_codec_context, frame, + data_present, &input_packet)) < 0) { + fprintf(stderr, "Could not decode frame (error '%s')\n", + get_error_text(error)); + av_packet_unref(&input_packet); + return error; + } + + /** + * If the decoder has not been flushed completely, we are not finished, + * so that this function has to be called again. + */ + if (*finished && *data_present) + *finished = 0; + av_packet_unref(&input_packet); + return 0; +} + +/** + * 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. + */ +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", + get_error_text(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. + */ +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", + get_error_text(error)); + return error; + } + + return 0; +} + +/** Add converted input audio samples to the FIFO buffer for later processing. */ +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, decodes, converts and stores + * it in the FIFO buffer. + */ +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; + 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 && !data_present) { + 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. + */ +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 allocate output frame samples (error '%s')\n", + get_error_text(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. */ +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; + init_packet(&output_packet); + + /** Set a timestamp based on the sample rate for the container. */ + if (frame) { + frame->pts = pts; + pts += frame->nb_samples; + } + + /** + * Encode the audio frame and store it in the temporary packet. + * The output audio stream encoder is used to do this. + */ + if ((error = avcodec_encode_audio2(output_codec_context, &output_packet, + frame, data_present)) < 0) { + fprintf(stderr, "Could not encode frame (error '%s')\n", + get_error_text(error)); + av_packet_unref(&output_packet); + return error; + } + + /** Write one audio frame from the temporary packet to the output file. */ + if (*data_present) { + if ((error = av_write_frame(output_format_context, &output_packet)) < 0) { + fprintf(stderr, "Could not write frame (error '%s')\n", + get_error_text(error)); + av_packet_unref(&output_packet); + return error; + } + + av_packet_unref(&output_packet); + } + + return 0; +} + +/** + * Load one audio frame from the FIFO buffer, encode and write it to the + * output file. + */ +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. */ +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", + get_error_text(error)); + return error; + } + return 0; +} + +/** Convert an audio file to an AAC file in an MP4 container. */ +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 <input file> <output file>\n", argv[0]); + exit(1); + } + + /** Register all codecs and formats so that they can be used. */ + av_register_all(); + /** 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 { + 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_close(output_codec_context); + if (output_format_context) { + avio_closep(&output_format_context->pb); + avformat_free_context(output_format_context); + } + if (input_codec_context) + avcodec_close(input_codec_context); + if (input_format_context) + avformat_close_input(&input_format_context); + + return ret; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/transcoding.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/transcoding.c new file mode 100644 index 0000000..d5d410b --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/examples/transcoding.c
@@ -0,0 +1,582 @@ +/* + * 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 <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavfilter/avfiltergraph.h> +#include <libavfilter/buffersink.h> +#include <libavfilter/buffersrc.h> +#include <libavutil/opt.h> +#include <libavutil/pixdesc.h> + +static AVFormatContext *ifmt_ctx; +static AVFormatContext *ofmt_ctx; +typedef struct FilteringContext { + AVFilterContext *buffersink_ctx; + AVFilterContext *buffersrc_ctx; + AVFilterGraph *filter_graph; +} FilteringContext; +static FilteringContext *filter_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; + } + + for (i = 0; i < ifmt_ctx->nb_streams; i++) { + AVStream *stream; + AVCodecContext *codec_ctx; + stream = ifmt_ctx->streams[i]; + codec_ctx = stream->codec; + /* Reencode video & audio and remux subtitles etc. */ + if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO + || codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) { + /* Open decoder */ + ret = avcodec_open2(codec_ctx, + avcodec_find_decoder(codec_ctx->codec_id), NULL); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i); + return ret; + } + } + } + + 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 = in_stream->codec; + enc_ctx = out_stream->codec; + + 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; + } + + /* 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 */ + enc_ctx->pix_fmt = encoder->pix_fmts[0]; + /* video time_base can be set to whatever is handy and supported by encoder */ + enc_ctx->time_base = dec_ctx->time_base; + } 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}; + } + + /* 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; + } + } 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_copy_context(ofmt_ctx->streams[i]->codec, + ifmt_ctx->streams[i]->codec); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n"); + return ret; + } + } + + if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) + enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + + } + 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; + AVFilter *buffersrc = NULL; + 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]->codec->codec_type == AVMEDIA_TYPE_AUDIO + || ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)) + continue; + + + if (ifmt_ctx->streams[i]->codec->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], ifmt_ctx->streams[i]->codec, + ofmt_ctx->streams[i]->codec, filter_spec); + if (ret) + return ret; + } + return 0; +} + +static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) { + int ret; + int got_frame_local; + AVPacket enc_pkt; + int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) = + (ifmt_ctx->streams[stream_index]->codec->codec_type == + AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2; + + if (!got_frame) + got_frame = &got_frame_local; + + av_log(NULL, AV_LOG_INFO, "Encoding frame\n"); + /* encode filtered frame */ + enc_pkt.data = NULL; + enc_pkt.size = 0; + av_init_packet(&enc_pkt); + ret = enc_func(ofmt_ctx->streams[stream_index]->codec, &enc_pkt, + filt_frame, got_frame); + av_frame_free(&filt_frame); + if (ret < 0) + return ret; + if (!(*got_frame)) + return 0; + + /* prepare packet for muxing */ + enc_pkt.stream_index = stream_index; + av_packet_rescale_ts(&enc_pkt, + ofmt_ctx->streams[stream_index]->codec->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) +{ + int ret; + AVFrame *filt_frame; + + 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_ctx[stream_index].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) { + filt_frame = av_frame_alloc(); + if (!filt_frame) { + ret = AVERROR(ENOMEM); + break; + } + av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n"); + ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx, + filt_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; + av_frame_free(&filt_frame); + break; + } + + filt_frame->pict_type = AV_PICTURE_TYPE_NONE; + ret = encode_write_frame(filt_frame, stream_index, NULL); + if (ret < 0) + break; + } + + return ret; +} + +static int flush_encoder(unsigned int stream_index) +{ + int ret; + int got_frame; + + if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities & + AV_CODEC_CAP_DELAY)) + return 0; + + while (1) { + av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index); + ret = encode_write_frame(NULL, stream_index, &got_frame); + if (ret < 0) + break; + if (!got_frame) + return 0; + } + return ret; +} + +int main(int argc, char **argv) +{ + int ret; + AVPacket packet = { .data = NULL, .size = 0 }; + AVFrame *frame = NULL; + enum AVMediaType type; + unsigned int stream_index; + unsigned int i; + int got_frame; + int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *); + + if (argc != 3) { + av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file> <output file>\n", argv[0]); + return 1; + } + + av_register_all(); + avfilter_register_all(); + + 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; + + /* read all packets */ + while (1) { + if ((ret = av_read_frame(ifmt_ctx, &packet)) < 0) + break; + stream_index = packet.stream_index; + type = ifmt_ctx->streams[packet.stream_index]->codec->codec_type; + av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n", + stream_index); + + if (filter_ctx[stream_index].filter_graph) { + av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n"); + frame = av_frame_alloc(); + if (!frame) { + ret = AVERROR(ENOMEM); + break; + } + av_packet_rescale_ts(&packet, + ifmt_ctx->streams[stream_index]->time_base, + ifmt_ctx->streams[stream_index]->codec->time_base); + dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 : + avcodec_decode_audio4; + ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame, + &got_frame, &packet); + if (ret < 0) { + av_frame_free(&frame); + av_log(NULL, AV_LOG_ERROR, "Decoding failed\n"); + break; + } + + if (got_frame) { + frame->pts = av_frame_get_best_effort_timestamp(frame); + ret = filter_encode_write_frame(frame, stream_index); + av_frame_free(&frame); + if (ret < 0) + goto end; + } else { + av_frame_free(&frame); + } + } 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_unref(&packet); + av_frame_free(&frame); + for (i = 0; i < ifmt_ctx->nb_streams; i++) { + avcodec_close(ifmt_ctx->streams[i]->codec); + if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && ofmt_ctx->streams[i]->codec) + avcodec_close(ofmt_ctx->streams[i]->codec); + if (filter_ctx && filter_ctx[i].filter_graph) + avfilter_graph_free(&filter_ctx[i].filter_graph); + } + av_free(filter_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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/faq.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/faq.texi new file mode 100644 index 0000000..ef111c7 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/faq.texi
@@ -0,0 +1,621 @@ +\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{http://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', '-flags qprd', '-flags mv0', '-flags skiprd'. + +@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', '-flags qprd', '-flags mv0', '-flags skiprd. + +@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{https://ffmpeg.org/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{https://ffmpeg.org/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{https://ffmpeg.org/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{https://ffmpeg.org/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{https://www.ffmpeg.org/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{https://ffmpeg.org/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 -acodec 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 -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 -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 \ + -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{https://ffmpeg.org/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 + +@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{http://www.tux.org/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/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fate.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fate.texi new file mode 100644 index 0000000..353443a --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fate.texi
@@ -0,0 +1,206 @@ +\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=<path to the samples directory>}. 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 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. +@end table + +@section Examples + +@example +make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate +@end example
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fate_config.sh.template b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fate_config.sh.template new file mode 100644 index 0000000..059a1f8 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fate_config.sh.template
@@ -0,0 +1,30 @@ +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 + +# 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' +#tar= # command to create a tar archive from its arguments on stdout, + # defaults to 'tar c'
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-bitstream-filters.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-bitstream-filters.texi new file mode 100644 index 0000000..bbde257 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-bitstream-filters.texi
@@ -0,0 +1,46 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Bitstream Filters Documentation +@titlepage +@center @titlefont{FFmpeg Bitstream Filters Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes the bitstream filters provided by the +libavcodec library. + +A bitstream filter operates on the encoded stream data, and performs +bitstream level modifications without performing decoding. + +@c man end DESCRIPTION + +@include bitstream_filters.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavcodec.html,libavcodec} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-bitstream-filters +@settitle FFmpeg bitstream filters + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-codecs.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-codecs.texi new file mode 100644 index 0000000..7df4391 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-codecs.texi
@@ -0,0 +1,43 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Codecs Documentation +@titlepage +@center @titlefont{FFmpeg Codecs Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes the codecs (decoders and encoders) provided by +the libavcodec library. + +@c man end DESCRIPTION + +@include codecs.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavcodec.html,libavcodec} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-codecs +@settitle FFmpeg codecs + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-devices.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-devices.texi new file mode 100644 index 0000000..721c0df --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-devices.texi
@@ -0,0 +1,43 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Devices Documentation +@titlepage +@center @titlefont{FFmpeg Devices Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes the input and output devices provided by the +libavdevice library. + +@c man end DESCRIPTION + +@include devices.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavdevice.html,libavdevice} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavdevice(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-devices +@settitle FFmpeg devices + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-filters.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-filters.texi new file mode 100644 index 0000000..b643f2c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-filters.texi
@@ -0,0 +1,43 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Filters Documentation +@titlepage +@center @titlefont{FFmpeg Filters Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes filters, sources, and sinks provided by the +libavfilter library. + +@c man end DESCRIPTION + +@include filters.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavfilter.html,libavfilter} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavfilter(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-filters +@settitle FFmpeg filters + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-formats.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-formats.texi new file mode 100644 index 0000000..d916ee8 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-formats.texi
@@ -0,0 +1,43 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Formats Documentation +@titlepage +@center @titlefont{FFmpeg Formats Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes the supported formats (muxers and demuxers) +provided by the libavformat library. + +@c man end DESCRIPTION + +@include formats.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavformat.html,libavformat} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-formats +@settitle FFmpeg formats + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-protocols.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-protocols.texi new file mode 100644 index 0000000..f3a09f6 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-protocols.texi
@@ -0,0 +1,43 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Protocols Documentation +@titlepage +@center @titlefont{FFmpeg Protocols Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes the input and output protocols provided by the +libavformat library. + +@c man end DESCRIPTION + +@include protocols.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavformat.html,libavformat} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-protocols +@settitle FFmpeg protocols + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-resampler.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-resampler.texi new file mode 100644 index 0000000..be3784f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-resampler.texi
@@ -0,0 +1,45 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Resampler Documentation +@titlepage +@center @titlefont{FFmpeg Resampler Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The FFmpeg resampler provides a high-level interface to the +libswresample library audio resampling utilities. In particular it +allows one to perform audio resampling, audio channel layout rematrixing, +and convert audio format and packing layout. + +@c man end DESCRIPTION + +@include resampler.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libswresample.html,libswresample} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswresample(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-resampler +@settitle FFmpeg Resampler + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-scaler.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-scaler.texi new file mode 100644 index 0000000..9ab12a1 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-scaler.texi
@@ -0,0 +1,44 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Scaler Documentation +@titlepage +@center @titlefont{FFmpeg Scaler Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The FFmpeg rescaler provides a high-level interface to the libswscale +library image conversion utilities. In particular it allows one to perform +image rescaling and pixel format conversion. + +@c man end DESCRIPTION + +@include scaler.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libswscale.html,libswscale} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswscale(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-scaler +@settitle FFmpeg video scaling and pixel format converter + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-utils.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-utils.texi new file mode 100644 index 0000000..e39cfa8 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg-utils.texi
@@ -0,0 +1,43 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle FFmpeg Utilities Documentation +@titlepage +@center @titlefont{FFmpeg Utilities Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +This document describes some generic features and utilities provided +by the libavutil library. + +@c man end DESCRIPTION + +@include utils.texi + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{libavutil.html,libavutil} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavutil(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg-utils +@settitle FFmpeg utilities + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg.texi new file mode 100644 index 0000000..e02807c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg.texi
@@ -0,0 +1,1621 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle ffmpeg Documentation +@titlepage +@center @titlefont{ffmpeg Documentation} +@end titlepage + +@top + +@contents + +@chapter Synopsis + +ffmpeg [@var{global_options}] @{[@var{input_file_options}] -i @file{input_file}@} ... @{[@var{output_file_options}] @file{output_file}@} ... + +@chapter Description +@c man begin DESCRIPTION + +@command{ffmpeg} 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. + +@command{ffmpeg} reads from an arbitrary number of input "files" (which can be regular +files, pipes, network streams, grabbing devices, etc.), specified by the +@code{-i} option, and writes to an arbitrary number of output "files", which are +specified by a plain output filename. Anything found on the command line which +cannot be interpreted as an option is considered to be an output filename. + +Each input or output file 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 @code{-map} option (see the Stream selection chapter). + +To refer to input files in options, you must use their indices (0-based). E.g. +the first input file is @code{0}, the second is @code{1}, etc. Similarly, streams +within a file are referred to by their indices. E.g. @code{2:3} refers to the +fourth stream in the third input file. Also see the Stream specifiers chapter. + +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. + +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 ONLY to the next input or output file and are reset between files. + +@itemize +@item +To set the video bitrate of the output file to 64 kbit/s: +@example +ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi +@end example + +@item +To force the frame rate of the output file to 24 fps: +@example +ffmpeg -i input.avi -r 24 output.avi +@end example + +@item +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: +@example +ffmpeg -r 1 -i input.m2v -r 24 output.avi +@end example +@end itemize + +The format option may be needed for raw input files. + +@c man end DESCRIPTION + +@chapter Detailed description +@c man begin DETAILED DESCRIPTION + +The transcoding process in @command{ffmpeg} for each output can be described by +the following diagram: + +@verbatim + _______ ______________ +| | | | +| input | demuxer | encoded data | decoder +| file | ---------> | packets | -----+ +|_______| |______________| | + v + _________ + | | + | decoded | + | frames | + |_________| + ________ ______________ | +| | | | | +| output | <-------- | encoded data | <----+ +| file | muxer | packets | encoder +|________| |______________| + + +@end verbatim + +@command{ffmpeg} calls the libavformat library (containing demuxers) to read +input files and get packets containing encoded data from them. When there are +multiple input files, @command{ffmpeg} tries to keep them synchronized by +tracking lowest timestamp on any active input stream. + +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. + +@section Filtering +Before encoding, @command{ffmpeg} can process raw audio and video frames using +filters from the libavfilter library. Several chained filters form a filter +graph. @command{ffmpeg} distinguishes between two types of filtergraphs: +simple and complex. + +@subsection Simple filtergraphs +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: + +@verbatim + _________ ______________ +| | | | +| decoded | | encoded data | +| frames |\ _ | packets | +|_________| \ /||______________| + \ __________ / + simple _\|| | / encoder + filtergraph | filtered |/ + | frames | + |__________| + +@end verbatim + +Simple filtergraphs are configured with the per-stream @option{-filter} option +(with @option{-vf} and @option{-af} aliases for video and audio respectively). +A simple filtergraph for video can look for example like this: + +@verbatim + _______ _____________ _______ ________ +| | | | | | | | +| input | ---> | deinterlace | ---> | scale | ---> | output | +|_______| |_____________| |_______| |________| + +@end verbatim + +Note that some filters change frame properties but not frame contents. E.g. the +@code{fps} filter in the example above changes number of frames, but does not +touch the frame contents. Another example is the @code{setpts} filter, which +only sets timestamps and otherwise passes the frames unchanged. + +@subsection Complex filtergraphs +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: + +@verbatim + _________ +| | +| input 0 |\ __________ +|_________| \ | | + \ _________ /| output 0 | + \ | | / |__________| + _________ \| complex | / +| | | |/ +| input 1 |---->| filter |\ +|_________| | | \ __________ + /| graph | \ | | + / | | \| output 1 | + _________ / |_________| |__________| +| | / +| input 2 |/ +|_________| + +@end verbatim + +Complex filtergraphs are configured with the @option{-filter_complex} option. +Note that this option is global, since a complex filtergraph, by its nature, +cannot be unambiguously associated with a single stream or file. + +The @option{-lavfi} option is equivalent to @option{-filter_complex}. + +A trivial example of a complex filtergraph is the @code{overlay} filter, which +has two video inputs and one video output, containing one video overlaid on top +of the other. Its audio counterpart is the @code{amix} filter. + +@section Stream copy +Stream copy is a mode selected by supplying the @code{copy} parameter to the +@option{-codec} option. It makes @command{ffmpeg} 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: + +@verbatim + _______ ______________ ________ +| | | | | | +| input | demuxer | encoded data | muxer | output | +| file | ---------> | packets | -------> | file | +|_______| |______________| |________| + +@end verbatim + +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. + +@c man end DETAILED DESCRIPTION + +@chapter Stream selection +@c man begin STREAM SELECTION + +By default, @command{ffmpeg} includes only one stream of each type (video, audio, subtitle) +present in the input files and adds them to each output file. It picks the +"best" of each based upon the following criteria: for video, it is the stream +with the highest resolution, for audio, it is the stream with the most channels, for +subtitles, it is the first subtitle stream. In the case where several streams of +the same type rate equally, the stream with the lowest index is chosen. + +You can disable some of those defaults by using the @code{-vn/-an/-sn} options. For +full manual control, use the @code{-map} option, which disables the defaults just +described. + +@c man end STREAM SELECTION + +@chapter Options +@c man begin OPTIONS + +@include fftools-common-opts.texi + +@section Main options + +@table @option + +@item -f @var{fmt} (@emph{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. + +@item -i @var{filename} (@emph{input}) +input file name + +@item -y (@emph{global}) +Overwrite output files without asking. + +@item -n (@emph{global}) +Do not overwrite output files, and exit immediately if a specified +output file already exists. + +@item -stream_loop @var{number} (@emph{input}) +Set number of times input stream shall be looped. Loop 0 means no loop, +loop -1 means infinite loop. + +@item -c[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream}) +@itemx -codec[:@var{stream_specifier}] @var{codec} (@emph{input/output,per-stream}) +Select an encoder (when used before an output file) or a decoder (when used +before an input file) for one or more streams. @var{codec} is the name of a +decoder/encoder or a special value @code{copy} (output only) to indicate that +the stream is not to be re-encoded. + +For example +@example +ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT +@end example +encodes all video streams with libx264 and copies all audio streams. + +For each stream, the last matching @code{c} option is applied, so +@example +ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT +@end example +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. + +@item -t @var{duration} (@emph{input/output}) +When used as an input option (before @code{-i}), limit the @var{duration} of +data read from the input file. + +When used as an output option (before an output filename), stop writing the +output after its duration reaches @var{duration}. + +@var{duration} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +-to and -t are mutually exclusive and -t has priority. + +@item -to @var{position} (@emph{output}) +Stop writing the output at @var{position}. +@var{position} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +-to and -t are mutually exclusive and -t has priority. + +@item -fs @var{limit_size} (@emph{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. + +@item -ss @var{position} (@emph{input/output}) +When used as an input option (before @code{-i}), seeks in this input file to +@var{position}. Note that in most formats it is not possible to seek exactly, +so @command{ffmpeg} will seek to the closest seek point before @var{position}. +When transcoding and @option{-accurate_seek} is enabled (the default), this +extra segment between the seek point and @var{position} will be decoded and +discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it +will be preserved. + +When used as an output option (before an output filename), decodes but discards +input until the timestamps reach @var{position}. + +@var{position} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +@item -sseof @var{position} (@emph{input/output}) + +Like the @code{-ss} option but relative to the "end of file". That is negative +values are earlier in the file, 0 is at EOF. + +@item -itsoffset @var{offset} (@emph{input}) +Set the input time offset. + +@var{offset} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +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 @var{offset}. + +@item -timestamp @var{date} (@emph{output}) +Set the recording timestamp in the container. + +@var{date} must be a date specification, +see @ref{date syntax,,the Date section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +@item -metadata[:metadata_specifier] @var{key}=@var{value} (@emph{output,per-metadata}) +Set a metadata key/value pair. + +An optional @var{metadata_specifier} may be given to set metadata +on streams, chapters or programs. See @code{-map_metadata} +documentation for details. + +This option overrides metadata set with @code{-map_metadata}. It is +also possible to delete metadata by using an empty value. + +For example, for setting the title in the output file: +@example +ffmpeg -i in.avi -metadata title="my title" out.flv +@end example + +To set the language of the first audio stream: +@example +ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT +@end example + +@item -program [title=@var{title}:][program_num=@var{program_num}:]st=@var{stream}[:st=@var{stream}...] (@emph{output}) + +Creates a program with the specified @var{title}, @var{program_num} and adds the specified +@var{stream}(s) to it. + +@item -target @var{type} (@emph{output}) +Specify target file type (@code{vcd}, @code{svcd}, @code{dvd}, @code{dv}, +@code{dv50}). @var{type} may be prefixed with @code{pal-}, @code{ntsc-} or +@code{film-} to use the corresponding standard. All the format options +(bitrate, codecs, buffer sizes) are then set automatically. You can just type: + +@example +ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg +@end example + +Nevertheless you can specify additional options as long as you know +they do not conflict with the standard, as in: + +@example +ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg +@end example + +@item -dframes @var{number} (@emph{output}) +Set the number of data frames to output. This is an alias for @code{-frames:d}. + +@item -frames[:@var{stream_specifier}] @var{framecount} (@emph{output,per-stream}) +Stop writing to the stream after @var{framecount} frames. + +@item -q[:@var{stream_specifier}] @var{q} (@emph{output,per-stream}) +@itemx -qscale[:@var{stream_specifier}] @var{q} (@emph{output,per-stream}) +Use fixed quality scale (VBR). The meaning of @var{q}/@var{qscale} is +codec-dependent. +If @var{qscale} is used without a @var{stream_specifier} 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. + +@anchor{filter_option} +@item -filter[:@var{stream_specifier}] @var{filtergraph} (@emph{output,per-stream}) +Create the filtergraph specified by @var{filtergraph} and use it to +filter the stream. + +@var{filtergraph} 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 @code{in}, and the output to the label @code{out}. See +the ffmpeg-filters manual for more information about the filtergraph +syntax. + +See the @ref{filter_complex_option,,-filter_complex option} if you +want to create filtergraphs with multiple inputs and/or outputs. + +@item -filter_script[:@var{stream_specifier}] @var{filename} (@emph{output,per-stream}) +This option is similar to @option{-filter}, the only difference is that its +argument is the name of the file from which a filtergraph description is to be +read. + +@item -pre[:@var{stream_specifier}] @var{preset_name} (@emph{output,per-stream}) +Specify the preset for matching stream(s). + +@item -stats (@emph{global}) +Print encoding progress/statistics. It is on by default, to explicitly +disable it you need to specify @code{-nostats}. + +@item -progress @var{url} (@emph{global}) +Send program-friendly progress information to @var{url}. + +Progress information is written approximately every second and at the end of +the encoding process. It is made of "@var{key}=@var{value}" lines. @var{key} +consists of only alphanumeric characters. The last key of a sequence of +progress information is always "progress". + +@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 +@code{-nostdin}. + +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 @code{ffmpeg ... < /dev/null} but it requires a +shell. + +@item -debug_ts (@emph{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. + +See also the option @code{-fdebug ts}. + +@item -attach @var{filename} (@emph{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 @code{-map} or automatic mappings). + +Note that for Matroska you also have to set the mimetype metadata tag: +@example +ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv +@end example +(assuming that the attachment stream will be third in the output file). + +@item -dump_attachment[:@var{stream_specifier}] @var{filename} (@emph{input,per-stream}) +Extract the matching attachment stream into a file named @var{filename}. If +@var{filename} is empty, then the value of the @code{filename} metadata tag +will be used. + +E.g. to extract the first attachment to a file named 'out.ttf': +@example +ffmpeg -dump_attachment:t:0 out.ttf -i INPUT +@end example +To extract all attachments to files determined by the @code{filename} tag: +@example +ffmpeg -dump_attachment:t "" -i INPUT +@end example + +Technical note -- attachments are implemented as codec extradata, so this +option can actually be used to extract extradata from any stream, not just +attachments. + +@item -noautorotate +Disable automatically rotating video based on file metadata. + +@end table + +@section Video Options + +@table @option +@item -vframes @var{number} (@emph{output}) +Set the number of video frames to output. This is an alias for @code{-frames:v}. +@item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream}) +Set frame rate (Hz value, fraction or abbreviation). + +As an input option, ignore any timestamps stored in the file and instead +generate timestamps assuming constant frame rate @var{fps}. +This is not the same as the @option{-framerate} 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 @option{-framerate} instead of the input option @option{-r}. + +As an output option, duplicate or drop input frames to achieve constant output +frame rate @var{fps}. + +@item -s[:@var{stream_specifier}] @var{size} (@emph{input/output,per-stream}) +Set frame size. + +As an input option, this is a shortcut for the @option{video_size} 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. + +As an output option, this inserts the @code{scale} video filter to the +@emph{end} of the corresponding filtergraph. Please use the @code{scale} filter +directly to insert it at the beginning or some other place. + +The format is @samp{wxh} (default - same as source). + +@item -aspect[:@var{stream_specifier}] @var{aspect} (@emph{output,per-stream}) +Set the video display aspect ratio specified by @var{aspect}. + +@var{aspect} can be a floating point number string, or a string of the +form @var{num}:@var{den}, where @var{num} and @var{den} are the +numerator and denominator of the aspect ratio. For example "4:3", +"16:9", "1.3333", and "1.7777" are valid argument values. + +If used together with @option{-vcodec copy}, it will affect the aspect ratio +stored at container level, but not the aspect ratio stored in encoded +frames, if it exists. + +@item -vn (@emph{output}) +Disable video recording. + +@item -vcodec @var{codec} (@emph{output}) +Set the video codec. This is an alias for @code{-codec:v}. + +@item -pass[:@var{stream_specifier}] @var{n} (@emph{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: +@example +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 +@end example + +@item -passlogfile[:@var{stream_specifier}] @var{prefix} (@emph{output,per-stream}) +Set two-pass log file name prefix to @var{prefix}, the default file name +prefix is ``ffmpeg2pass''. The complete file name will be +@file{PREFIX-N.log}, where N is a number specific to the output +stream + +@item -vf @var{filtergraph} (@emph{output}) +Create the filtergraph specified by @var{filtergraph} and use it to +filter the stream. + +This is an alias for @code{-filter:v}, see the @ref{filter_option,,-filter option}. +@end table + +@section Advanced Video options + +@table @option +@item -pix_fmt[:@var{stream_specifier}] @var{format} (@emph{input/output,per-stream}) +Set pixel format. Use @code{-pix_fmts} 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 @var{pix_fmt} is prefixed by a @code{+}, ffmpeg will exit with an error +if the requested pixel format can not be selected, and automatic conversions +inside filtergraphs are disabled. +If @var{pix_fmt} is a single @code{+}, ffmpeg selects the same pixel format +as the input (or graph output) and automatic conversions are disabled. + +@item -sws_flags @var{flags} (@emph{input/output}) +Set SwScaler flags. +@item -vdt @var{n} +Discard threshold. + +@item -rc_override[:@var{stream_specifier}] @var{override} (@emph{output,per-stream}) +Rate control override for specific intervals, formatted as "int,int,int" +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. + +@item -ilme +Force interlacing support in encoder (MPEG-2 and MPEG-4 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 with +@option{-deinterlace}, but deinterlacing introduces losses. +@item -psnr +Calculate PSNR of compressed frames. +@item -vstats +Dump video coding statistics to @file{vstats_HHMMSS.log}. +@item -vstats_file @var{file} +Dump video coding statistics to @var{file}. +@item -top[:@var{stream_specifier}] @var{n} (@emph{output,per-stream}) +top=1/bottom=0/auto=-1 field first +@item -dc @var{precision} +Intra_dc_precision. +@item -vtag @var{fourcc/tag} (@emph{output}) +Force video tag/fourcc. This is an alias for @code{-tag:v}. +@item -qphist (@emph{global}) +Show QP histogram +@item -vbsf @var{bitstream_filter} +Deprecated see -bsf + +@item -force_key_frames[:@var{stream_specifier}] @var{time}[,@var{time}...] (@emph{output,per-stream}) +@item -force_key_frames[:@var{stream_specifier}] expr:@var{expr} (@emph{output,per-stream}) +Force key frames at the specified timestamps, more precisely at the first +frames after each specified time. + +If the argument is prefixed with @code{expr:}, the string @var{expr} +is interpreted like an expression and is evaluated for each frame. A +key frame is forced in case the evaluation is non-zero. + +If one of the times is "@code{chapters}[@var{delta}]", it is expanded into +the time of the beginning of all chapters in the file, shifted by +@var{delta}, 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. + +For example, to insert a key frame at 5 minutes, plus key frames 0.1 second +before the beginning of every chapter: +@example +-force_key_frames 0:05:00,chapters-0.1 +@end example + +The expression in @var{expr} can contain the following constants: +@table @option +@item n +the number of current processed frame, starting from 0 +@item n_forced +the number of forced frames +@item prev_forced_n +the number of the previous forced frame, it is @code{NAN} when no +keyframe was forced yet +@item prev_forced_t +the time of the previous forced frame, it is @code{NAN} when no +keyframe was forced yet +@item t +the time of the current processed frame +@end table + +For example to force a key frame every 5 seconds, you can specify: +@example +-force_key_frames expr:gte(t,n_forced*5) +@end example + +To force a key frame 5 seconds after the time of the last forced one, +starting from second 13: +@example +-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5)) +@end example + +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. + +@item -copyinkf[:@var{stream_specifier}] (@emph{output,per-stream}) +When doing stream copy, copy also non-key frames found at the +beginning. + +@item -hwaccel[:@var{stream_specifier}] @var{hwaccel} (@emph{input,per-stream}) +Use hardware acceleration to decode the matching stream(s). The allowed values +of @var{hwaccel} are: +@table @option +@item none +Do not use any hardware acceleration (the default). + +@item auto +Automatically select the hardware acceleration method. + +@item vda +Use Apple VDA hardware acceleration. + +@item vdpau +Use VDPAU (Video Decode and Presentation API for Unix) hardware acceleration. + +@item dxva2 +Use DXVA2 (DirectX Video Acceleration) hardware acceleration. + +@item qsv +Use the Intel QuickSync Video acceleration for video transcoding. + +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. + +For it to work, both the decoder and the encoder must support QSV acceleration +and no filters must be used. +@end table + +This option has no effect if the selected hwaccel is not available or not +supported by the chosen decoder. + +Note that most acceleration methods are intended for playback and will not be +faster than software decoding on modern CPUs. Additionally, @command{ffmpeg} +will usually need to copy the decoded frames from the GPU memory into the system +memory, resulting in further performance loss. This option is thus mainly +useful for testing. + +@item -hwaccel_device[:@var{stream_specifier}] @var{hwaccel_device} (@emph{input,per-stream}) +Select a device to use for hardware acceleration. + +This option only makes sense when the @option{-hwaccel} option is also +specified. Its exact meaning depends on the specific hardware acceleration +method chosen. + +@table @option +@item vdpau +For VDPAU, this option specifies the X11 display/screen to use. If this option +is not specified, the value of the @var{DISPLAY} environment variable is used + +@item dxva2 +For DXVA2, this option should contain the number of the display adapter to use. +If this option is not specified, the default adapter is used. + +@item qsv +For QSV, this option corresponds to the valus of MFX_IMPL_* . Allowed values +are: +@table @option +@item auto +@item sw +@item hw +@item auto_any +@item hw_any +@item hw2 +@item hw3 +@item hw4 +@end table +@end table + +@item -hwaccels +List all hardware acceleration methods supported in this build of ffmpeg. + +@end table + +@section Audio Options + +@table @option +@item -aframes @var{number} (@emph{output}) +Set the number of audio frames to output. This is an alias for @code{-frames:a}. +@item -ar[:@var{stream_specifier}] @var{freq} (@emph{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. +@item -aq @var{q} (@emph{output}) +Set the audio quality (codec-specific, VBR). This is an alias for -q:a. +@item -ac[:@var{stream_specifier}] @var{channels} (@emph{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. +@item -an (@emph{output}) +Disable audio recording. +@item -acodec @var{codec} (@emph{input/output}) +Set the audio codec. This is an alias for @code{-codec:a}. +@item -sample_fmt[:@var{stream_specifier}] @var{sample_fmt} (@emph{output,per-stream}) +Set the audio sample format. Use @code{-sample_fmts} to get a list +of supported sample formats. + +@item -af @var{filtergraph} (@emph{output}) +Create the filtergraph specified by @var{filtergraph} and use it to +filter the stream. + +This is an alias for @code{-filter:a}, see the @ref{filter_option,,-filter option}. +@end table + +@section Advanced Audio options + +@table @option +@item -atag @var{fourcc/tag} (@emph{output}) +Force audio tag/fourcc. This is an alias for @code{-tag:a}. +@item -absf @var{bitstream_filter} +Deprecated, see -bsf +@item -guess_layout_max @var{channels} (@emph{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 @command{ffmpeg} 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. +@end table + +@section Subtitle options + +@table @option +@item -scodec @var{codec} (@emph{input/output}) +Set the subtitle codec. This is an alias for @code{-codec:s}. +@item -sn (@emph{output}) +Disable subtitle recording. +@item -sbsf @var{bitstream_filter} +Deprecated, see -bsf +@end table + +@section Advanced Subtitle options + +@table @option + +@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 DVB 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. + +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. + +@item -canvas_size @var{size} +Set the size of the canvas used to render subtitles. + +@end table + +@section Advanced options + +@table @option +@item -map [-]@var{input_file_id}[:@var{stream_specifier}][,@var{sync_file_id}[:@var{stream_specifier}]] | @var{[linklabel]} (@emph{output}) + +Designate one or more input streams as a source for the output file. Each input +stream is identified by the input file index @var{input_file_id} and +the input stream index @var{input_stream_id} within the input +file. Both indices start at 0. If specified, +@var{sync_file_id}:@var{stream_specifier} sets which input stream +is used as a presentation sync reference. + +The first @code{-map} option on the command line specifies the +source for output stream 0, the second @code{-map} option specifies +the source for output stream 1, etc. + +A @code{-} character before the stream identifier creates a "negative" mapping. +It disables matching streams from already created mappings. + +An alternative @var{[linklabel]} form will map outputs from complex filter +graphs (see the @option{-filter_complex} option) to the output file. +@var{linklabel} must correspond to a defined output link label in the graph. + +For example, to map ALL streams from the first input file to output +@example +ffmpeg -i INPUT -map 0 output +@end example + +For example, if you have two audio streams in the first input file, +these streams are identified by "0:0" and "0:1". You can use +@code{-map} to select which streams to place in an output file. For +example: +@example +ffmpeg -i INPUT -map 0:1 out.wav +@end example +will map the input stream in @file{INPUT} identified by "0:1" to +the (single) output stream in @file{out.wav}. + +For example, to select the stream with index 2 from input file +@file{a.mov} (specified by the identifier "0:2"), and stream with +index 6 from input @file{b.mov} (specified by the identifier "1:6"), +and copy them to the output file @file{out.mov}: +@example +ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov +@end example + +To select all video and the third audio stream from an input file: +@example +ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT +@end example + +To map all the streams except the second audio, use negative mappings +@example +ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT +@end example + +To pick the English audio stream: +@example +ffmpeg -i INPUT -map 0:m:language:eng OUTPUT +@end example + +Note that using this option disables the default mappings for this output file. + +@item -ignore_unknown +Ignore input streams with unknown type instead of failing if copying +such streams is attempted. + +@item -copy_unknown +Allow input streams with unknown type to be copied instead of failing if copying +such streams is attempted. + +@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}] +Map an audio channel from a given input to an output. If +@var{output_file_id}.@var{stream_specifier} is not set, the audio channel will +be mapped on all the audio streams. + +Using "-1" instead of +@var{input_file_id}.@var{stream_specifier}.@var{channel_id} will map a muted +channel. + +For example, assuming @var{INPUT} is a stereo audio file, you can switch the +two audio channels with the following command: +@example +ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT +@end example + +If you want to mute the first channel and keep the second: +@example +ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT +@end example + +The order of the "-map_channel" 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 "-map_channel", stereo if two, etc.). Using "-ac" +in combination of "-map_channel" makes the channel gain levels to be updated if +input and output channel layouts don't match (for instance two "-map_channel" +options and "-ac 6"). + +You can also extract each channel of an input to specific outputs; the following +command extracts two channels of the @var{INPUT} audio stream (file 0, stream 0) +to the respective @var{OUTPUT_CH0} and @var{OUTPUT_CH1} outputs: +@example +ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1 +@end example + +The following example splits the channels of a stereo input into two separate +streams, which are put into the same output file: +@example +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 +@end example + +Note that currently each output stream can only contain channels from a single +input stream; you can't for example use "-map_channel" 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. + +If you need this feature, a possible workaround is to use the @emph{amerge} +filter. For example, if you need to merge a media (here @file{input.mkv}) with 2 +mono audio streams into one single stereo channel audio stream (and keep the +video stream), you can use the following command: +@example +ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv +@end example + +@item -map_metadata[:@var{metadata_spec_out}] @var{infile}[:@var{metadata_spec_in}] (@emph{output,per-metadata}) +Set metadata information of the next output file from @var{infile}. Note that +those are file indices (zero-based), not filenames. +Optional @var{metadata_spec_in/out} parameters specify, which metadata to copy. +A metadata specifier can have the following forms: +@table @option +@item @var{g} +global metadata, i.e. metadata that applies to the whole file + +@item @var{s}[:@var{stream_spec}] +per-stream metadata. @var{stream_spec} is a stream specifier as described +in the @ref{Stream specifiers} chapter. In an input metadata specifier, the first +matching stream is copied from. In an output metadata specifier, all matching +streams are copied to. + +@item @var{c}:@var{chapter_index} +per-chapter metadata. @var{chapter_index} is the zero-based chapter index. + +@item @var{p}:@var{program_index} +per-program metadata. @var{program_index} is the zero-based program index. +@end table +If metadata specifier is omitted, it defaults to global. + +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. + +For example to copy metadata from the first stream of the input file to global metadata +of the output file: +@example +ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3 +@end example + +To do the reverse, i.e. copy global metadata to all audio streams: +@example +ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv +@end example +Note that simple @code{0} would work as well in this example, since global +metadata is assumed by default. + +@item -map_chapters @var{input_file_index} (@emph{output}) +Copy chapters from input file with index @var{input_file_index} 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. + +@item -benchmark (@emph{global}) +Show benchmarking information at the end of an encode. +Shows CPU time used and maximum memory consumption. +Maximum memory consumption is not supported on all systems, +it will usually display as 0 if not supported. +@item -benchmark_all (@emph{global}) +Show benchmarking information during the encode. +Shows CPU time used in various steps (audio/video encode/decode). +@item -timelimit @var{duration} (@emph{global}) +Exit after ffmpeg has been running for @var{duration} seconds. +@item -dump (@emph{global}) +Dump each input packet to stderr. +@item -hex (@emph{global}) +When dumping packets, also dump the payload. +@item -re (@emph{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 @command{ffmpeg} 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). +@item -loop_input +Loop over the input stream. Currently it works only for image +streams. This option is used for automatic FFserver testing. +This option is deprecated, use -loop 1. +@item -loop_output @var{number_of_times} +Repeatedly loop output for formats that support looping such as animated GIF +(0 will loop the output infinitely). +This option is deprecated, use -loop. +@item -vsync @var{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. + +@table @option +@item 0, passthrough +Each frame is passed with its timestamp from the demuxer to the muxer. +@item 1, cfr +Frames will be duplicated and dropped to achieve exactly the requested +constant frame rate. +@item 2, vfr +Frames are passed through with their timestamp or dropped so as to +prevent 2 frames from having the same timestamp. +@item drop +As passthrough but destroys all timestamps, making the muxer generate +fresh timestamps based on frame-rate. +@item -1, auto +Chooses between 1 and 2 depending on muxer capabilities. This is the +default method. +@end table + +Note that the timestamps may be further modified by the muxer, after this. +For example, in the case that the format option @option{avoid_negative_ts} +is enabled. + +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. + +@item -frame_drop_threshold @var{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. + +@item -async @var{samples_per_second} +Audio sync method. "Stretches/squeezes" 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. + +Note that the timestamps may be further modified by the muxer, after this. +For example, in the case that the format option @option{avoid_negative_ts} +is enabled. + +This option has been deprecated. Use the @code{aresample} audio filter instead. + +@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. + +Note that, depending on the @option{vsync} option or on specific muxer +processing (e.g. in case the format option @option{avoid_negative_ts} +is enabled) the output timestamps may mismatch with the input +timestamps even when this option is selected. + +@item -start_at_zero +When used with @option{copyts}, shift input timestamps so they start at zero. + +This means that using e.g. @code{-ss 50} will make output timestamps start at +50 seconds, regardless of what timestamp the input file started at. + +@item -copytb @var{mode} +Specify how to set the encoder timebase when stream copying. @var{mode} is an +integer numeric value, and can assume one of the following values: + +@table @option +@item 1 +Use the demuxer timebase. + +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. + +@item 0 +Use the decoder timebase. + +The time base is copied to the output encoder from the corresponding input +decoder. + +@item -1 +Try to make the choice automatically, in order to generate a sane output. +@end table + +Default value is -1. + +@item -shortest (@emph{output}) +Finish encoding when the shortest input stream ends. +@item -dts_delta_threshold +Timestamp discontinuity delta threshold. +@item -muxdelay @var{seconds} (@emph{input}) +Set the maximum demux-decode delay. +@item -muxpreload @var{seconds} (@emph{input}) +Set the initial demux-decode delay. +@item -streamid @var{output-stream-index}:@var{new-value} (@emph{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. + +For example, to set the stream 0 PID to 33 and the stream 1 PID to 36 for +an output mpegts file: +@example +ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts +@end example + +@item -bsf[:@var{stream_specifier}] @var{bitstream_filters} (@emph{output,per-stream}) +Set bitstream filters for matching streams. @var{bitstream_filters} is +a comma-separated list of bitstream filters. Use the @code{-bsfs} option +to get the list of bitstream filters. +@example +ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264 +@end example +@example +ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt +@end example + +@item -tag[:@var{stream_specifier}] @var{codec_tag} (@emph{input/output,per-stream}) +Force a tag/fourcc for matching streams. + +@item -timecode @var{hh}:@var{mm}:@var{ss}SEP@var{ff} +Specify Timecode for writing. @var{SEP} is ':' for non drop timecode and ';' +(or '.') for drop. +@example +ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg +@end example + +@anchor{filter_complex_option} +@item -filter_complex @var{filtergraph} (@emph{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 @option{-filter} options. @var{filtergraph} is a description of +the filtergraph, as described in the ``Filtergraph syntax'' section of the +ffmpeg-filters manual. + +Input link labels must refer to input streams using the +@code{[file_index:stream_specifier]} syntax (i.e. the same as @option{-map} +uses). If @var{stream_specifier} 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. + +Output link labels are referred to with @option{-map}. Unlabeled outputs are +added to the first output file. + +Note that with this option it is possible to use only lavfi sources without +normal input files. + +For example, to overlay an image over video +@example +ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map +'[out]' out.mkv +@end example +Here @code{[0:v]} 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. + +Assuming there is only one video stream in each input file, we can omit input +labels, so the above is equivalent to +@example +ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map +'[out]' out.mkv +@end example + +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 +@example +ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv +@end example + +To generate 5 seconds of pure red video using lavfi @code{color} source: +@example +ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv +@end example + +@item -lavfi @var{filtergraph} (@emph{global}) +Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or +outputs. Equivalent to @option{-filter_complex}. + +@item -filter_complex_script @var{filename} (@emph{global}) +This option is similar to @option{-filter_complex}, the only difference is that +its argument is the name of the file from which a complex filtergraph +description is to be read. + +@item -accurate_seek (@emph{input}) +This option enables or disables accurate seeking in input files with the +@option{-ss} option. It is enabled by default, so seeking is accurate when +transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful +e.g. when copying some streams and transcoding the others. + +@item -seek_timestamp (@emph{input}) +This option enables or disables seeking by timestamp in input files with the +@option{-ss} option. It is disabled by default. If enabled, the argument +to the @option{-ss} 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. + +@item -thread_queue_size @var{size} (@emph{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; raising this value can +avoid it. + +@item -override_ffserver (@emph{global}) +Overrides the input specifications from @command{ffserver}. Using this +option you can map any input stream to @command{ffserver} and control +many aspects of the encoding from @command{ffmpeg}. Without this +option @command{ffmpeg} will transmit to @command{ffserver} what is +requested by @command{ffserver}. + +The option is intended for cases where features are needed that cannot be +specified to @command{ffserver} but can be to @command{ffmpeg}. + +@item -sdp_file @var{file} (@emph{global}) +Print sdp information for an output stream to @var{file}. +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). + +@item -discard (@emph{input}) +Allows discarding specific streams or frames of streams at the demuxer. +Not all demuxers support this. + +@table @option +@item none +Discard no frame. + +@item default +Default, which discards no frames. + +@item noref +Discard all non-reference frames. + +@item bidir +Discard all bidirectional frames. + +@item nokey +Discard all frames excepts keyframes. + +@item all +Discard all frames. +@end table + +@item -abort_on @var{flags} (@emph{global}) +Stop and abort on various conditions. The following flags are available: + +@table @option +@item empty_output +No packets were passed to the muxer, the output is empty. +@end table + +@item -xerror (@emph{global}) +Stop and exit on error + +@end table + +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. + +For example, to hardcode subtitles on top of a DVB-T recording stored in +MPEG-TS format, delaying the subtitles by 1 second: +@example +ffmpeg -i input.ts -filter_complex \ + '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \ + -sn -map '#0x2dc' output.mkv +@end example +(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) + +@section Preset files +A preset file contains a sequence of @var{option}=@var{value} 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 @file{presets} directory in the FFmpeg source tree for examples. + +There are two types of preset files: ffpreset and avpreset files. + +@subsection ffpreset files +ffpreset files are specified with the @code{vpre}, @code{apre}, +@code{spre}, and @code{fpre} options. The @code{fpre} 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 @code{vpre}, @code{apre}, and +@code{spre} options, the options specified in a preset file are +applied to the currently selected codec of the same type as the preset +option. + +The argument passed to the @code{vpre}, @code{apre}, and @code{spre} +preset options identifies the preset file to use according to the +following rules: + +First ffmpeg searches for a file named @var{arg}.ffpreset in the +directories @file{$FFMPEG_DATADIR} (if set), and @file{$HOME/.ffmpeg}, and in +the datadir defined at configuration time (usually @file{PREFIX/share/ffmpeg}) +or in a @file{ffpresets} folder along the executable on win32, +in that order. For example, if the argument is @code{libvpx-1080p}, it will +search for the file @file{libvpx-1080p.ffpreset}. + +If no such file is found, then ffmpeg will search for a file named +@var{codec_name}-@var{arg}.ffpreset in the above-mentioned +directories, where @var{codec_name} is the name of the codec to which +the preset file options will be applied. For example, if you select +the video codec with @code{-vcodec libvpx} and use @code{-vpre 1080p}, +then it will search for the file @file{libvpx-1080p.ffpreset}. + +@subsection avpreset files +avpreset files are specified with the @code{pre} option. They work similar to +ffpreset files, but they only allow encoder- specific options. Therefore, an +@var{option}=@var{value} pair specifying an encoder cannot be used. + +When the @code{pre} option is specified, ffmpeg will look for files with the +suffix .avpreset in the directories @file{$AVCONV_DATADIR} (if set), and +@file{$HOME/.avconv}, and in the datadir defined at configuration time (usually +@file{PREFIX/share/ffmpeg}), in that order. + +First ffmpeg searches for a file named @var{codec_name}-@var{arg}.avpreset in +the above-mentioned directories, where @var{codec_name} is the name of the codec +to which the preset file options will be applied. For example, if you select the +video codec with @code{-vcodec libvpx} and use @code{-pre 1080p}, then it will +search for the file @file{libvpx-1080p.avpreset}. + +If no such file is found, then ffmpeg will search for a file named +@var{arg}.avpreset in the same directories. + +@c man end OPTIONS + +@chapter Examples +@c man begin EXAMPLES + +@section Video and Audio grabbing + +If you specify the input format and device then ffmpeg can grab video +and audio directly. + +@example +ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg +@end example + +Or with an ALSA audio source (mono input, card id 1) instead of OSS: +@example +ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg +@end example + +Note that you must activate the right video source and channel before +launching ffmpeg with any TV viewer such as +@uref{http://linux.bytesex.org/xawtv/, xawtv} by Gerd Knorr. You also +have to set the audio recording levels correctly with a +standard mixer. + +@section X11 grabbing + +Grab the X11 display with ffmpeg via + +@example +ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg +@end example + +0.0 is display.screen number of your X11 server, same as +the DISPLAY environment variable. + +@example +ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg +@end example + +0.0 is display.screen number of your X11 server, same as the DISPLAY environment +variable. 10 is the x-offset and 20 the y-offset for the grabbing. + +@section Video and Audio file format conversion + +Any supported file format and protocol can serve as input to ffmpeg: + +Examples: +@itemize +@item +You can use YUV files as input: + +@example +ffmpeg -i /tmp/test%d.Y /tmp/out.mpg +@end example + +It will use the files: +@example +/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, +/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc... +@end example + +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 @option{-s} option +if ffmpeg cannot guess it. + +@item +You can input from a raw YUV420P file: + +@example +ffmpeg -i /tmp/test.yuv /tmp/out.avi +@end example + +test.yuv is a file containing raw YUV planar data. Each frame is composed +of the Y plane followed by the U and V planes at half vertical and +horizontal resolution. + +@item +You can output to a raw YUV420P file: + +@example +ffmpeg -i mydivx.avi hugefile.yuv +@end example + +@item +You can set several input files and output files: + +@example +ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg +@end example + +Converts the audio file a.wav and the raw YUV video file a.yuv +to MPEG file a.mpg. + +@item +You can also do audio and video conversions at the same time: + +@example +ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2 +@end example + +Converts a.wav to MPEG audio at 22050 Hz sample rate. + +@item +You can encode to several formats at the same time and define a +mapping from input stream to output streams: + +@example +ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2 +@end example + +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. + +@item +You can transcode decrypted VOBs: + +@example +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 +@end example + +This is a typical DVD ripping example; the input is a VOB file, the +output an AVI file with MPEG-4 video and MP3 audio. Note that in this +command we use B-frames so the MPEG-4 stream is DivX5 compatible, and +GOP 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 LAME support by passing @code{--enable-libmp3lame} to configure. +The mapping is particularly useful for DVD transcoding +to get the desired audio language. + +NOTE: To see the supported input formats, use @code{ffmpeg -formats}. + +@item +You can extract images from a video, or create a video from many images: + +For extracting images from a video: +@example +ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg +@end example + +This will extract one video frame per second from the video and will +output them in files named @file{foo-001.jpeg}, @file{foo-002.jpeg}, +etc. Images will be rescaled to fit the new WxH values. + +If you want to extract just a limited number of frames, you can use the +above command in combination with the -vframes or -t option, or in +combination with -ss to start extracting from a certain point in time. + +For creating a video from many images: +@example +ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi +@end example + +The syntax @code{foo-%03d.jpeg} 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. + +When importing an image sequence, -i also supports expanding +shell-like wildcard patterns (globbing) internally, by selecting the +image2-specific @code{-pattern_type glob} option. + +For example, for creating a video from filenames matching the glob pattern +@code{foo-*.jpeg}: +@example +ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi +@end example + +@item +You can put many streams of the same type in the output: + +@example +ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut +@end example + +The resulting output file @file{test12.nut} will contain the first four streams +from the input files in reverse order. + +@item +To force CBR video output: +@example +ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v +@end example + +@item +The four options lmin, lmax, mblmin and mblmax use 'lambda' units, +but you may use the QP2LAMBDA constant to easily convert from 'q' units: +@example +ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext +@end example + +@end itemize +@c man end EXAMPLES + +@include config.texi +@ifset config-all +@ifset config-avutil +@include utils.texi +@end ifset +@ifset config-avcodec +@include codecs.texi +@include bitstream_filters.texi +@end ifset +@ifset config-avformat +@include formats.texi +@include protocols.texi +@end ifset +@ifset config-avdevice +@include devices.texi +@end ifset +@ifset config-swresample +@include resampler.texi +@end ifset +@ifset config-swscale +@include scaler.texi +@end ifset +@ifset config-avfilter +@include filters.texi +@end ifset +@end ifset + +@chapter See Also + +@ifhtml +@ifset config-all +@url{ffmpeg.html,ffmpeg} +@end ifset +@ifset config-not-all +@url{ffmpeg-all.html,ffmpeg-all}, +@end ifset +@url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-utils.html,ffmpeg-utils}, +@url{ffmpeg-scaler.html,ffmpeg-scaler}, +@url{ffmpeg-resampler.html,ffmpeg-resampler}, +@url{ffmpeg-codecs.html,ffmpeg-codecs}, +@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters}, +@url{ffmpeg-formats.html,ffmpeg-formats}, +@url{ffmpeg-devices.html,ffmpeg-devices}, +@url{ffmpeg-protocols.html,ffmpeg-protocols}, +@url{ffmpeg-filters.html,ffmpeg-filters} +@end ifhtml + +@ifnothtml +@ifset config-all +ffmpeg(1), +@end ifset +@ifset config-not-all +ffmpeg-all(1), +@end ifset +ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), +ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), +ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffmpeg +@settitle ffmpeg video converter + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg.txt new file mode 100644 index 0000000..a028ca2 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffmpeg.txt
@@ -0,0 +1,47 @@ + : + ffmpeg.c : libav* + ======== : ====== + : + : + --------------------------------:---> AVStream... + InputStream input_streams[] / : + / : + InputFile input_files[] +==========================+ / ^ : + ------> 0 | : st ---:-----------:--/ : : + ^ +------+-----------+-----+ / +--------------------------+ : : + : | :ist_index--:-----:---------/ 1 | : st : | : : + : +------+-----------+-----+ +==========================+ : : + nb_input_files : | :ist_index--:-----:------------------> 2 | : st : | : : + : +------+-----------+-----+ +--------------------------+ : nb_input_streams : + : | :ist_index : | 3 | ... | : : + v +------+-----------+-----+ +--------------------------+ : : + --> 4 | | : : + | +--------------------------+ : : + | 5 | | : : + | +==========================+ v : + | : + | : + | : + | : + --------- --------------------------------:---> AVStream... + \ / : + OutputStream output_streams[] / : + \ / : + +======\======================/======+ ^ : + ------> 0 | : source_index : st-:--- | : : + OutputFile output_files[] / +------------------------------------+ : : + / 1 | : : : | : : + ^ +------+------------+-----+ / +------------------------------------+ : : + : | : ost_index -:-----:------/ 2 | : : : | : : + nb_output_files : +------+------------+-----+ +====================================+ : : + : | : ost_index -:-----|-----------------> 3 | : : : | : : + : +------+------------+-----+ +------------------------------------+ : nb_output_streams : + : | : : | 4 | | : : + : +------+------------+-----+ +------------------------------------+ : : + : | : : | 5 | | : : + v +------+------------+-----+ +------------------------------------+ : : + 6 | | : : + +------------------------------------+ : : + 7 | | : : + +====================================+ v : + :
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffplay.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffplay.texi new file mode 100644 index 0000000..4bc3ced --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffplay.texi
@@ -0,0 +1,322 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle ffplay Documentation +@titlepage +@center @titlefont{ffplay Documentation} +@end titlepage + +@top + +@contents + +@chapter Synopsis + +ffplay [@var{options}] [@file{input_file}] + +@chapter Description +@c man begin DESCRIPTION + +FFplay is a very simple and portable media player using the FFmpeg +libraries and the SDL library. It is mostly used as a testbed for the +various FFmpeg APIs. +@c man end + +@chapter Options +@c man begin OPTIONS + +@include fftools-common-opts.texi + +@section Main options + +@table @option +@item -x @var{width} +Force displayed width. +@item -y @var{height} +Force displayed height. +@item -s @var{size} +Set frame size (WxH or abbreviation), needed for videos which do +not contain a header with the frame size like raw YUV. This option +has been deprecated in favor of private options, try -video_size. +@item -fs +Start in fullscreen mode. +@item -an +Disable audio. +@item -vn +Disable video. +@item -sn +Disable subtitles. +@item -ss @var{pos} +Seek to @var{pos}. Note that in most formats it is not possible to seek +exactly, so @command{ffplay} will seek to the nearest seek point to +@var{pos}. + +@var{pos} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. +@item -t @var{duration} +Play @var{duration} seconds of audio/video. + +@var{duration} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. +@item -bytes +Seek by bytes. +@item -nodisp +Disable graphical display. +@item -f @var{fmt} +Force format. +@item -window_title @var{title} +Set window title (default is the input filename). +@item -loop @var{number} +Loops movie playback <number> times. 0 means forever. +@item -showmode @var{mode} +Set the show mode to use. +Available values for @var{mode} are: +@table @samp +@item 0, video +show video +@item 1, waves +show audio waves +@item 2, rdft +show audio frequency band using RDFT ((Inverse) Real Discrete Fourier Transform) +@end table + +Default value is "video", if video is not present or cannot be played +"rdft" is automatically selected. + +You can interactively cycle through the available show modes by +pressing the key @key{w}. + +@item -vf @var{filtergraph} +Create the filtergraph specified by @var{filtergraph} and use it to +filter the video stream. + +@var{filtergraph} is a description of the filtergraph to apply to +the stream, and must have a single video input and a single video +output. In the filtergraph, the input is associated to the label +@code{in}, and the output to the label @code{out}. See the +ffmpeg-filters manual for more information about the filtergraph +syntax. + +You can specify this parameter multiple times and cycle through the specified +filtergraphs along with the show modes by pressing the key @key{w}. + +@item -af @var{filtergraph} +@var{filtergraph} is a description of the filtergraph to apply to +the input audio. +Use the option "-filters" to show all the available filters (including +sources and sinks). + +@item -i @var{input_file} +Read @var{input_file}. +@end table + +@section Advanced options +@table @option +@item -pix_fmt @var{format} +Set pixel format. +This option has been deprecated in favor of private options, try -pixel_format. + +@item -stats +Print several playback statistics, in particular show the stream +duration, the codec parameters, the current position in the stream and +the audio/video synchronisation drift. It is on by default, to +explicitly disable it you need to specify @code{-nostats}. + +@item -fast +Non-spec-compliant optimizations. +@item -genpts +Generate pts. +@item -sync @var{type} +Set the master clock to audio (@code{type=audio}), video +(@code{type=video}) or external (@code{type=ext}). Default is audio. The +master clock is used to control audio-video synchronization. Most media +players use audio as master clock, but in some cases (streaming or high +quality broadcast) it is necessary to change that. This option is mainly +used for debugging purposes. +@item -ast @var{audio_stream_specifier} +Select the desired audio stream using the given stream specifier. The stream +specifiers are described in the @ref{Stream specifiers} chapter. If this option +is not specified, the "best" audio stream is selected in the program of the +already selected video stream. +@item -vst @var{video_stream_specifier} +Select the desired video stream using the given stream specifier. The stream +specifiers are described in the @ref{Stream specifiers} chapter. If this option +is not specified, the "best" video stream is selected. +@item -sst @var{subtitle_stream_specifier} +Select the desired subtitle stream using the given stream specifier. The stream +specifiers are described in the @ref{Stream specifiers} chapter. If this option +is not specified, the "best" subtitle stream is selected in the program of the +already selected video or audio stream. +@item -autoexit +Exit when video is done playing. +@item -exitonkeydown +Exit if any key is pressed. +@item -exitonmousedown +Exit if any mouse button is pressed. + +@item -codec:@var{media_specifier} @var{codec_name} +Force a specific decoder implementation for the stream identified by +@var{media_specifier}, which can assume the values @code{a} (audio), +@code{v} (video), and @code{s} subtitle. + +@item -acodec @var{codec_name} +Force a specific audio decoder. + +@item -vcodec @var{codec_name} +Force a specific video decoder. + +@item -scodec @var{codec_name} +Force a specific subtitle decoder. + +@item -autorotate +Automatically rotate the video according to file metadata. Enabled by +default, use @option{-noautorotate} to disable it. + +@item -framedrop +Drop video frames if video is out of sync. Enabled by default if the master +clock is not set to video. Use this option to enable frame dropping for all +master clock sources, use @option{-noframedrop} to disable it. + +@item -infbuf +Do not limit the input buffer size, read as much data as possible from the +input as soon as possible. Enabled by default for realtime streams, where data +may be dropped if not read in time. Use this option to enable infinite buffers +for all inputs, use @option{-noinfbuf} to disable it. + +@end table + +@section While playing + +@table @key +@item q, ESC +Quit. + +@item f +Toggle full screen. + +@item p, SPC +Pause. + +@item m +Toggle mute. + +@item 9, 0 +Decrease and increase volume respectively. + +@item /, * +Decrease and increase volume respectively. + +@item a +Cycle audio channel in the current program. + +@item v +Cycle video channel. + +@item t +Cycle subtitle channel in the current program. + +@item c +Cycle program. + +@item w +Cycle video filters or show modes. + +@item s +Step to the next frame. + +Pause if the stream is not already paused, step to the next video +frame, and pause. + +@item left/right +Seek backward/forward 10 seconds. + +@item down/up +Seek backward/forward 1 minute. + +@item page down/page up +Seek to the previous/next chapter. +or if there are no chapters +Seek backward/forward 10 minutes. + +@item right mouse click +Seek to percentage in file corresponding to fraction of width. + +@item left mouse double-click +Toggle full screen. + +@end table + +@c man end + +@include config.texi +@ifset config-all +@set config-readonly +@ifset config-avutil +@include utils.texi +@end ifset +@ifset config-avcodec +@include codecs.texi +@include bitstream_filters.texi +@end ifset +@ifset config-avformat +@include formats.texi +@include protocols.texi +@end ifset +@ifset config-avdevice +@include devices.texi +@end ifset +@ifset config-swresample +@include resampler.texi +@end ifset +@ifset config-swscale +@include scaler.texi +@end ifset +@ifset config-avfilter +@include filters.texi +@end ifset +@end ifset + +@chapter See Also + +@ifhtml +@ifset config-all +@url{ffplay.html,ffplay}, +@end ifset +@ifset config-not-all +@url{ffplay-all.html,ffmpeg-all}, +@end ifset +@url{ffmpeg.html,ffmpeg}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-utils.html,ffmpeg-utils}, +@url{ffmpeg-scaler.html,ffmpeg-scaler}, +@url{ffmpeg-resampler.html,ffmpeg-resampler}, +@url{ffmpeg-codecs.html,ffmpeg-codecs}, +@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters}, +@url{ffmpeg-formats.html,ffmpeg-formats}, +@url{ffmpeg-devices.html,ffmpeg-devices}, +@url{ffmpeg-protocols.html,ffmpeg-protocols}, +@url{ffmpeg-filters.html,ffmpeg-filters} +@end ifhtml + +@ifnothtml +@ifset config-all +ffplay(1), +@end ifset +@ifset config-not-all +ffplay-all(1), +@end ifset +ffmpeg(1), ffprobe(1), ffserver(1), +ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), +ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), +ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffplay +@settitle FFplay media player + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffprobe.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffprobe.texi new file mode 100644 index 0000000..2024eed --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffprobe.texi
@@ -0,0 +1,683 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle ffprobe Documentation +@titlepage +@center @titlefont{ffprobe Documentation} +@end titlepage + +@top + +@contents + +@chapter Synopsis + +ffprobe [@var{options}] [@file{input_file}] + +@chapter Description +@c man begin DESCRIPTION + +ffprobe gathers information from multimedia streams and prints it in +human- and machine-readable fashion. + +For example it can be used to check the format of the container used +by a multimedia stream and the format and type of each media stream +contained in it. + +If a filename is specified in input, ffprobe will try to open and +probe the file content. If the file cannot be opened or recognized as +a multimedia file, a positive exit code is returned. + +ffprobe may be employed both as a standalone application or in +combination with a textual filter, which may perform more +sophisticated processing, e.g. statistical processing or plotting. + +Options are used to list some of the formats supported by ffprobe or +for specifying which information to display, and for setting how +ffprobe will show it. + +ffprobe output is designed to be easily parsable by a textual filter, +and consists of one or more sections of a form defined by the selected +writer, which is specified by the @option{print_format} option. + +Sections may contain other nested sections, and are identified by a +name (which may be shared by other sections), and an unique +name. See the output of @option{sections}. + +Metadata tags stored in the container or in the streams are recognized +and printed in the corresponding "FORMAT", "STREAM" or "PROGRAM_STREAM" +section. + +@c man end + +@chapter Options +@c man begin OPTIONS + +@include fftools-common-opts.texi + +@section Main options + +@table @option + +@item -f @var{format} +Force format to use. + +@item -unit +Show the unit of the displayed values. + +@item -prefix +Use SI prefixes for the displayed values. +Unless the "-byte_binary_prefix" option is used all the prefixes +are decimal. + +@item -byte_binary_prefix +Force the use of binary prefixes for byte values. + +@item -sexagesimal +Use sexagesimal format HH:MM:SS.MICROSECONDS for time values. + +@item -pretty +Prettify the format of the displayed values, it corresponds to the +options "-unit -prefix -byte_binary_prefix -sexagesimal". + +@item -of, -print_format @var{writer_name}[=@var{writer_options}] +Set the output printing format. + +@var{writer_name} specifies the name of the writer, and +@var{writer_options} specifies the options to be passed to the writer. + +For example for printing the output in JSON format, specify: +@example +-print_format json +@end example + +For more details on the available output printing formats, see the +Writers section below. + +@item -sections +Print sections structure and section information, and exit. The output +is not meant to be parsed by a machine. + +@item -select_streams @var{stream_specifier} +Select only the streams specified by @var{stream_specifier}. This +option affects only the options related to streams +(e.g. @code{show_streams}, @code{show_packets}, etc.). + +For example to show only audio streams, you can use the command: +@example +ffprobe -show_streams -select_streams a INPUT +@end example + +To show only video packets belonging to the video stream with index 1: +@example +ffprobe -show_packets -select_streams v:1 INPUT +@end example + +@item -show_data +Show payload data, as a hexadecimal and ASCII dump. Coupled with +@option{-show_packets}, it will dump the packets' data. Coupled with +@option{-show_streams}, it will dump the codec extradata. + +The dump is printed as the "data" field. It may contain newlines. + +@item -show_data_hash @var{algorithm} +Show a hash of payload data, for packets with @option{-show_packets} and for +codec extradata with @option{-show_streams}. + +@item -show_error +Show information about the error found when trying to probe the input. + +The error information is printed within a section with name "ERROR". + +@item -show_format +Show information about the container format of the input multimedia +stream. + +All the container format information is printed within a section with +name "FORMAT". + +@item -show_format_entry @var{name} +Like @option{-show_format}, but only prints the specified entry of the +container format information, rather than all. This option may be given more +than once, then all specified entries will be shown. + +This option is deprecated, use @code{show_entries} instead. + +@item -show_entries @var{section_entries} +Set list of entries to show. + +Entries are specified according to the following +syntax. @var{section_entries} contains a list of section entries +separated by @code{:}. Each section entry is composed by a section +name (or unique name), optionally followed by a list of entries local +to that section, separated by @code{,}. + +If section name is specified but is followed by no @code{=}, all +entries are printed to output, together with all the contained +sections. Otherwise only the entries specified in the local section +entries list are printed. In particular, if @code{=} is specified but +the list of local entries is empty, then no entries will be shown for +that section. + +Note that the order of specification of the local section entries is +not honored in the output, and the usual display order will be +retained. + +The formal syntax is given by: +@example +@var{LOCAL_SECTION_ENTRIES} ::= @var{SECTION_ENTRY_NAME}[,@var{LOCAL_SECTION_ENTRIES}] +@var{SECTION_ENTRY} ::= @var{SECTION_NAME}[=[@var{LOCAL_SECTION_ENTRIES}]] +@var{SECTION_ENTRIES} ::= @var{SECTION_ENTRY}[:@var{SECTION_ENTRIES}] +@end example + +For example, to show only the index and type of each stream, and the PTS +time, duration time, and stream index of the packets, you can specify +the argument: +@example +packet=pts_time,duration_time,stream_index : stream=index,codec_type +@end example + +To show all the entries in the section "format", but only the codec +type in the section "stream", specify the argument: +@example +format : stream=codec_type +@end example + +To show all the tags in the stream and format sections: +@example +stream_tags : format_tags +@end example + +To show only the @code{title} tag (if available) in the stream +sections: +@example +stream_tags=title +@end example + +@item -show_packets +Show information about each packet contained in the input multimedia +stream. + +The information for each single packet is printed within a dedicated +section with name "PACKET". + +@item -show_frames +Show information about each frame and subtitle contained in the input +multimedia stream. + +The information for each single frame is printed within a dedicated +section with name "FRAME" or "SUBTITLE". + +@item -show_streams +Show information about each media stream contained in the input +multimedia stream. + +Each media stream information is printed within a dedicated section +with name "STREAM". + +@item -show_programs +Show information about programs and their streams contained in the input +multimedia stream. + +Each media stream information is printed within a dedicated section +with name "PROGRAM_STREAM". + +@item -show_chapters +Show information about chapters stored in the format. + +Each chapter is printed within a dedicated section with name "CHAPTER". + +@item -count_frames +Count the number of frames per stream and report it in the +corresponding stream section. + +@item -count_packets +Count the number of packets per stream and report it in the +corresponding stream section. + +@item -read_intervals @var{read_intervals} + +Read only the specified intervals. @var{read_intervals} must be a +sequence of interval specifications separated by ",". +@command{ffprobe} will seek to the interval starting point, and will +continue reading from that. + +Each interval is specified by two optional parts, separated by "%". + +The first part specifies the interval start position. It is +interpreted as an abolute position, or as a relative offset from the +current position if it is preceded by the "+" character. If this first +part is not specified, no seeking will be performed when reading this +interval. + +The second part specifies the interval end position. It is interpreted +as an absolute position, or as a relative offset from the current +position if it is preceded by the "+" character. If the offset +specification starts with "#", it is interpreted as the number of +packets to read (not including the flushing packets) from the interval +start. If no second part is specified, the program will read until the +end of the input. + +Note that seeking is not accurate, thus the actual interval start +point may be different from the specified position. Also, when an +interval duration is specified, the absolute end time will be computed +by adding the duration to the interval start point found by seeking +the file, rather than to the specified start value. + +The formal syntax is given by: +@example +@var{INTERVAL} ::= [@var{START}|+@var{START_OFFSET}][%[@var{END}|+@var{END_OFFSET}]] +@var{INTERVALS} ::= @var{INTERVAL}[,@var{INTERVALS}] +@end example + +A few examples follow. +@itemize +@item +Seek to time 10, read packets until 20 seconds after the found seek +point, then seek to position @code{01:30} (1 minute and thirty +seconds) and read packets until position @code{01:45}. +@example +10%+20,01:30%01:45 +@end example + +@item +Read only 42 packets after seeking to position @code{01:23}: +@example +01:23%+#42 +@end example + +@item +Read only the first 20 seconds from the start: +@example +%+20 +@end example + +@item +Read from the start until position @code{02:30}: +@example +%02:30 +@end example +@end itemize + +@item -show_private_data, -private +Show private data, that is data depending on the format of the +particular shown element. +This option is enabled by default, but you may need to disable it +for specific uses, for example when creating XSD-compliant XML output. + +@item -show_program_version +Show information related to program version. + +Version information is printed within a section with name +"PROGRAM_VERSION". + +@item -show_library_versions +Show information related to library versions. + +Version information for each library is printed within a section with +name "LIBRARY_VERSION". + +@item -show_versions +Show information related to program and library versions. This is the +equivalent of setting both @option{-show_program_version} and +@option{-show_library_versions} options. + +@item -show_pixel_formats +Show information about all pixel formats supported by FFmpeg. + +Pixel format information for each format is printed within a section +with name "PIXEL_FORMAT". + +@item -bitexact +Force bitexact output, useful to produce output which is not dependent +on the specific build. + +@item -i @var{input_file} +Read @var{input_file}. + +@end table +@c man end + +@chapter Writers +@c man begin WRITERS + +A writer defines the output format adopted by @command{ffprobe}, and will be +used for printing all the parts of the output. + +A writer may accept one or more arguments, which specify the options +to adopt. The options are specified as a list of @var{key}=@var{value} +pairs, separated by ":". + +All writers support the following options: + +@table @option +@item string_validation, sv +Set string validation mode. + +The following values are accepted. +@table @samp +@item fail +The writer will fail immediately in case an invalid string (UTF-8) +sequence or code point is found in the input. This is especially +useful to validate input metadata. + +@item ignore +Any validation error will be ignored. This will result in possibly +broken output, especially with the json or xml writer. + +@item replace +The writer will substitute invalid UTF-8 sequences or code points with +the string specified with the @option{string_validation_replacement}. +@end table + +Default value is @samp{replace}. + +@item string_validation_replacement, svr +Set replacement string to use in case @option{string_validation} is +set to @samp{replace}. + +In case the option is not specified, the writer will assume the empty +string, that is it will remove the invalid sequences from the input +strings. +@end table + +A description of the currently available writers follows. + +@section default +Default format. + +Print each section in the form: +@example +[SECTION] +key1=val1 +... +keyN=valN +[/SECTION] +@end example + +Metadata tags are printed as a line in the corresponding FORMAT, STREAM or +PROGRAM_STREAM section, and are prefixed by the string "TAG:". + +A description of the accepted options follows. + +@table @option + +@item nokey, nk +If set to 1 specify not to print the key of each field. Default value +is 0. + +@item noprint_wrappers, nw +If set to 1 specify not to print the section header and footer. +Default value is 0. +@end table + +@section compact, csv +Compact and CSV format. + +The @code{csv} writer is equivalent to @code{compact}, but supports +different defaults. + +Each section is printed on a single line. +If no option is specifid, the output has the form: +@example +section|key1=val1| ... |keyN=valN +@end example + +Metadata tags are printed in the corresponding "format" or "stream" +section. A metadata tag key, if printed, is prefixed by the string +"tag:". + +The description of the accepted options follows. + +@table @option + +@item item_sep, s +Specify the character to use for separating fields in the output line. +It must be a single printable character, it is "|" by default ("," for +the @code{csv} writer). + +@item nokey, nk +If set to 1 specify not to print the key of each field. Its default +value is 0 (1 for the @code{csv} writer). + +@item escape, e +Set the escape mode to use, default to "c" ("csv" for the @code{csv} +writer). + +It can assume one of the following values: +@table @option +@item c +Perform C-like escaping. Strings containing a newline (@samp{\n}), carriage +return (@samp{\r}), a tab (@samp{\t}), a form feed (@samp{\f}), the escaping +character (@samp{\}) or the item separator character @var{SEP} are escaped +using C-like fashioned escaping, so that a newline is converted to the +sequence @samp{\n}, a carriage return to @samp{\r}, @samp{\} to @samp{\\} and +the separator @var{SEP} is converted to @samp{\@var{SEP}}. + +@item csv +Perform CSV-like escaping, as described in RFC4180. Strings +containing a newline (@samp{\n}), a carriage return (@samp{\r}), a double quote +(@samp{"}), or @var{SEP} are enclosed in double-quotes. + +@item none +Perform no escaping. +@end table + +@item print_section, p +Print the section name at the begin of each line if the value is +@code{1}, disable it with value set to @code{0}. Default value is +@code{1}. + +@end table + +@section flat +Flat format. + +A free-form output where each line contains an explicit key=value, such as +"streams.stream.3.tags.foo=bar". The output is shell escaped, so it can be +directly embedded in sh scripts as long as the separator character is an +alphanumeric character or an underscore (see @var{sep_char} option). + +The description of the accepted options follows. + +@table @option +@item sep_char, s +Separator character used to separate the chapter, the section name, IDs and +potential tags in the printed field key. + +Default value is @samp{.}. + +@item hierarchical, h +Specify if the section name specification should be hierarchical. If +set to 1, and if there is more than one section in the current +chapter, the section name will be prefixed by the name of the +chapter. A value of 0 will disable this behavior. + +Default value is 1. +@end table + +@section ini +INI format output. + +Print output in an INI based format. + +The following conventions are adopted: + +@itemize +@item +all key and values are UTF-8 +@item +@samp{.} is the subgroup separator +@item +newline, @samp{\t}, @samp{\f}, @samp{\b} and the following characters are +escaped +@item +@samp{\} is the escape character +@item +@samp{#} is the comment indicator +@item +@samp{=} is the key/value separator +@item +@samp{:} is not used but usually parsed as key/value separator +@end itemize + +This writer accepts options as a list of @var{key}=@var{value} pairs, +separated by @samp{:}. + +The description of the accepted options follows. + +@table @option +@item hierarchical, h +Specify if the section name specification should be hierarchical. If +set to 1, and if there is more than one section in the current +chapter, the section name will be prefixed by the name of the +chapter. A value of 0 will disable this behavior. + +Default value is 1. +@end table + +@section json +JSON based format. + +Each section is printed using JSON notation. + +The description of the accepted options follows. + +@table @option + +@item compact, c +If set to 1 enable compact output, that is each section will be +printed on a single line. Default value is 0. +@end table + +For more information about JSON, see @url{http://www.json.org/}. + +@section xml +XML based format. + +The XML output is described in the XML schema description file +@file{ffprobe.xsd} installed in the FFmpeg datadir. + +An updated version of the schema can be retrieved at the url +@url{http://www.ffmpeg.org/schema/ffprobe.xsd}, which redirects to the +latest schema committed into the FFmpeg development source code tree. + +Note that the output issued will be compliant to the +@file{ffprobe.xsd} schema only when no special global output options +(@option{unit}, @option{prefix}, @option{byte_binary_prefix}, +@option{sexagesimal} etc.) are specified. + +The description of the accepted options follows. + +@table @option + +@item fully_qualified, q +If set to 1 specify if the output should be fully qualified. Default +value is 0. +This is required for generating an XML file which can be validated +through an XSD file. + +@item xsd_compliant, x +If set to 1 perform more checks for ensuring that the output is XSD +compliant. Default value is 0. +This option automatically sets @option{fully_qualified} to 1. +@end table + +For more information about the XML format, see +@url{http://www.w3.org/XML/}. +@c man end WRITERS + +@chapter Timecode +@c man begin TIMECODE + +@command{ffprobe} supports Timecode extraction: + +@itemize + +@item +MPEG1/2 timecode is extracted from the GOP, and is available in the video +stream details (@option{-show_streams}, see @var{timecode}). + +@item +MOV timecode is extracted from tmcd track, so is available in the tmcd +stream metadata (@option{-show_streams}, see @var{TAG:timecode}). + +@item +DV, GXF and AVI timecodes are available in format metadata +(@option{-show_format}, see @var{TAG:timecode}). + +@end itemize +@c man end TIMECODE + +@include config.texi +@ifset config-all +@set config-readonly +@ifset config-avutil +@include utils.texi +@end ifset +@ifset config-avcodec +@include codecs.texi +@include bitstream_filters.texi +@end ifset +@ifset config-avformat +@include formats.texi +@include protocols.texi +@end ifset +@ifset config-avdevice +@include devices.texi +@end ifset +@ifset config-swresample +@include resampler.texi +@end ifset +@ifset config-swscale +@include scaler.texi +@end ifset +@ifset config-avfilter +@include filters.texi +@end ifset +@end ifset + +@chapter See Also + +@ifhtml +@ifset config-all +@url{ffprobe.html,ffprobe}, +@end ifset +@ifset config-not-all +@url{ffprobe-all.html,ffprobe-all}, +@end ifset +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffserver.html,ffserver}, +@url{ffmpeg-utils.html,ffmpeg-utils}, +@url{ffmpeg-scaler.html,ffmpeg-scaler}, +@url{ffmpeg-resampler.html,ffmpeg-resampler}, +@url{ffmpeg-codecs.html,ffmpeg-codecs}, +@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters}, +@url{ffmpeg-formats.html,ffmpeg-formats}, +@url{ffmpeg-devices.html,ffmpeg-devices}, +@url{ffmpeg-protocols.html,ffmpeg-protocols}, +@url{ffmpeg-filters.html,ffmpeg-filters} +@end ifhtml + +@ifnothtml +@ifset config-all +ffprobe(1), +@end ifset +@ifset config-not-all +ffprobe-all(1), +@end ifset +ffmpeg(1), ffplay(1), ffserver(1), +ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), +ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), +ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffprobe +@settitle ffprobe media prober + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffprobe.xsd b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffprobe.xsd new file mode 100644 index 0000000..c7d5101 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffprobe.xsd
@@ -0,0 +1,356 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.ffmpeg.org/schema/ffprobe" + xmlns:ffprobe="http://www.ffmpeg.org/schema/ffprobe"> + + <xsd:element name="ffprobe" type="ffprobe:ffprobeType"/> + + <xsd:complexType name="ffprobeType"> + <xsd:sequence> + <xsd:element name="program_version" type="ffprobe:programVersionType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="pixel_formats" type="ffprobe:pixelFormatsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="packets" type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="frames" type="ffprobe:framesType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="packets_and_frames" type="ffprobe:packetsAndFramesType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="format" type="ffprobe:formatType" minOccurs="0" maxOccurs="1" /> + <xsd:element name="error" type="ffprobe:errorType" minOccurs="0" maxOccurs="1" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="packetsType"> + <xsd:sequence> + <xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="framesType"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="packetsAndFramesType"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="packetType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="side_data_list" type="ffprobe:packetSideDataListType" minOccurs="0" maxOccurs="1" /> + </xsd:sequence> + + <xsd:attribute name="codec_type" type="xsd:string" use="required" /> + <xsd:attribute name="stream_index" type="xsd:int" use="required" /> + <xsd:attribute name="pts" type="xsd:long" /> + <xsd:attribute name="pts_time" type="xsd:float" /> + <xsd:attribute name="dts" type="xsd:long" /> + <xsd:attribute name="dts_time" type="xsd:float" /> + <xsd:attribute name="duration" type="xsd:long" /> + <xsd:attribute name="duration_time" type="xsd:float" /> + <xsd:attribute name="convergence_duration" type="xsd:long" /> + <xsd:attribute name="convergence_duration_time" type="xsd:float" /> + <xsd:attribute name="size" type="xsd:long" use="required" /> + <xsd:attribute name="pos" type="xsd:long" /> + <xsd:attribute name="flags" type="xsd:string" use="required" /> + <xsd:attribute name="data" type="xsd:string" /> + <xsd:attribute name="data_hash" type="xsd:string" /> + </xsd:complexType> + + <xsd:complexType name="packetSideDataListType"> + <xsd:sequence> + <xsd:element name="side_data" type="ffprobe:packetSideDataType" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="packetSideDataType"> + <xsd:attribute name="side_data_type" type="xsd:string"/> + <xsd:attribute name="side_data_size" type="xsd:int" /> + </xsd:complexType> + + <xsd:complexType name="frameType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="side_data_list" type="ffprobe:frameSideDataListType" minOccurs="0" maxOccurs="1" /> + </xsd:sequence> + + <xsd:attribute name="media_type" type="xsd:string" use="required"/> + <xsd:attribute name="stream_index" type="xsd:int" /> + <xsd:attribute name="key_frame" type="xsd:int" use="required"/> + <xsd:attribute name="pts" type="xsd:long" /> + <xsd:attribute name="pts_time" type="xsd:float"/> + <xsd:attribute name="pkt_pts" type="xsd:long" /> + <xsd:attribute name="pkt_pts_time" type="xsd:float"/> + <xsd:attribute name="pkt_dts" type="xsd:long" /> + <xsd:attribute name="pkt_dts_time" type="xsd:float"/> + <xsd:attribute name="best_effort_timestamp" type="xsd:long" /> + <xsd:attribute name="best_effort_timestamp_time" type="xsd:float" /> + <xsd:attribute name="pkt_duration" type="xsd:long" /> + <xsd:attribute name="pkt_duration_time" type="xsd:float"/> + <xsd:attribute name="pkt_pos" type="xsd:long" /> + <xsd:attribute name="pkt_size" type="xsd:int" /> + + <!-- audio attributes --> + <xsd:attribute name="sample_fmt" type="xsd:string"/> + <xsd:attribute name="nb_samples" type="xsd:long" /> + <xsd:attribute name="channels" type="xsd:int" /> + <xsd:attribute name="channel_layout" type="xsd:string"/> + + <!-- video attributes --> + <xsd:attribute name="width" type="xsd:long" /> + <xsd:attribute name="height" type="xsd:long" /> + <xsd:attribute name="pix_fmt" type="xsd:string"/> + <xsd:attribute name="sample_aspect_ratio" type="xsd:string"/> + <xsd:attribute name="pict_type" type="xsd:string"/> + <xsd:attribute name="coded_picture_number" type="xsd:long" /> + <xsd:attribute name="display_picture_number" type="xsd:long" /> + <xsd:attribute name="interlaced_frame" type="xsd:int" /> + <xsd:attribute name="top_field_first" type="xsd:int" /> + <xsd:attribute name="repeat_pict" type="xsd:int" /> + </xsd:complexType> + + <xsd:complexType name="frameSideDataListType"> + <xsd:sequence> + <xsd:element name="side_data" type="ffprobe:frameSideDataType" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="frameSideDataType"> + <xsd:attribute name="side_data_type" type="xsd:string"/> + <xsd:attribute name="side_data_size" type="xsd:int" /> + </xsd:complexType> + + <xsd:complexType name="subtitleType"> + <xsd:attribute name="media_type" type="xsd:string" fixed="subtitle" use="required"/> + <xsd:attribute name="pts" type="xsd:long" /> + <xsd:attribute name="pts_time" type="xsd:float"/> + <xsd:attribute name="format" type="xsd:int" /> + <xsd:attribute name="start_display_time" type="xsd:int" /> + <xsd:attribute name="end_display_time" type="xsd:int" /> + <xsd:attribute name="num_rects" type="xsd:int" /> + </xsd:complexType> + + <xsd:complexType name="streamsType"> + <xsd:sequence> + <xsd:element name="stream" type="ffprobe:streamType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="programsType"> + <xsd:sequence> + <xsd:element name="program" type="ffprobe:programType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="streamDispositionType"> + <xsd:attribute name="default" type="xsd:int" use="required" /> + <xsd:attribute name="dub" type="xsd:int" use="required" /> + <xsd:attribute name="original" type="xsd:int" use="required" /> + <xsd:attribute name="comment" type="xsd:int" use="required" /> + <xsd:attribute name="lyrics" type="xsd:int" use="required" /> + <xsd:attribute name="karaoke" type="xsd:int" use="required" /> + <xsd:attribute name="forced" type="xsd:int" use="required" /> + <xsd:attribute name="hearing_impaired" type="xsd:int" use="required" /> + <xsd:attribute name="visual_impaired" type="xsd:int" use="required" /> + <xsd:attribute name="clean_effects" type="xsd:int" use="required" /> + <xsd:attribute name="attached_pic" type="xsd:int" use="required" /> + </xsd:complexType> + + <xsd:complexType name="streamType"> + <xsd:sequence> + <xsd:element name="disposition" type="ffprobe:streamDispositionType" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="side_data_list" type="ffprobe:packetSideDataListType" minOccurs="0" maxOccurs="1" /> + </xsd:sequence> + + <xsd:attribute name="index" type="xsd:int" use="required"/> + <xsd:attribute name="codec_name" type="xsd:string" /> + <xsd:attribute name="codec_long_name" type="xsd:string" /> + <xsd:attribute name="profile" type="xsd:string" /> + <xsd:attribute name="codec_type" type="xsd:string" /> + <xsd:attribute name="codec_time_base" type="xsd:string" use="required"/> + <xsd:attribute name="codec_tag" type="xsd:string" use="required"/> + <xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/> + <xsd:attribute name="extradata" type="xsd:string" /> + <xsd:attribute name="extradata_hash" type="xsd:string" /> + + <!-- video attributes --> + <xsd:attribute name="width" type="xsd:int"/> + <xsd:attribute name="height" type="xsd:int"/> + <xsd:attribute name="coded_width" type="xsd:int"/> + <xsd:attribute name="coded_height" type="xsd:int"/> + <xsd:attribute name="has_b_frames" type="xsd:int"/> + <xsd:attribute name="sample_aspect_ratio" type="xsd:string"/> + <xsd:attribute name="display_aspect_ratio" type="xsd:string"/> + <xsd:attribute name="pix_fmt" type="xsd:string"/> + <xsd:attribute name="level" type="xsd:int"/> + <xsd:attribute name="color_range" type="xsd:string"/> + <xsd:attribute name="color_space" type="xsd:string"/> + <xsd:attribute name="color_transfer" type="xsd:string"/> + <xsd:attribute name="color_primaries" type="xsd:string"/> + <xsd:attribute name="chroma_location" type="xsd:string"/> + <xsd:attribute name="timecode" type="xsd:string"/> + <xsd:attribute name="refs" type="xsd:int"/> + + <!-- audio attributes --> + <xsd:attribute name="sample_fmt" type="xsd:string"/> + <xsd:attribute name="sample_rate" type="xsd:int"/> + <xsd:attribute name="channels" type="xsd:int"/> + <xsd:attribute name="channel_layout" type="xsd:string"/> + <xsd:attribute name="bits_per_sample" type="xsd:int"/> + + <xsd:attribute name="id" type="xsd:string"/> + <xsd:attribute name="r_frame_rate" type="xsd:string" use="required"/> + <xsd:attribute name="avg_frame_rate" type="xsd:string" use="required"/> + <xsd:attribute name="time_base" type="xsd:string" use="required"/> + <xsd:attribute name="start_pts" type="xsd:long"/> + <xsd:attribute name="start_time" type="xsd:float"/> + <xsd:attribute name="duration_ts" type="xsd:long"/> + <xsd:attribute name="duration" type="xsd:float"/> + <xsd:attribute name="bit_rate" type="xsd:int"/> + <xsd:attribute name="max_bit_rate" type="xsd:int"/> + <xsd:attribute name="bits_per_raw_sample" type="xsd:int"/> + <xsd:attribute name="nb_frames" type="xsd:int"/> + <xsd:attribute name="nb_read_frames" type="xsd:int"/> + <xsd:attribute name="nb_read_packets" type="xsd:int"/> + </xsd:complexType> + + <xsd:complexType name="programType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + + <xsd:attribute name="program_id" type="xsd:int" use="required"/> + <xsd:attribute name="program_num" type="xsd:int" use="required"/> + <xsd:attribute name="nb_streams" type="xsd:int" use="required"/> + <xsd:attribute name="start_time" type="xsd:float"/> + <xsd:attribute name="start_pts" type="xsd:long"/> + <xsd:attribute name="end_time" type="xsd:float"/> + <xsd:attribute name="end_pts" type="xsd:long"/> + <xsd:attribute name="pmt_pid" type="xsd:int" use="required"/> + <xsd:attribute name="pcr_pid" type="xsd:int" use="required"/> + </xsd:complexType> + + <xsd:complexType name="formatType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + + <xsd:attribute name="filename" type="xsd:string" use="required"/> + <xsd:attribute name="nb_streams" type="xsd:int" use="required"/> + <xsd:attribute name="nb_programs" type="xsd:int" use="required"/> + <xsd:attribute name="format_name" type="xsd:string" use="required"/> + <xsd:attribute name="format_long_name" type="xsd:string"/> + <xsd:attribute name="start_time" type="xsd:float"/> + <xsd:attribute name="duration" type="xsd:float"/> + <xsd:attribute name="size" type="xsd:long"/> + <xsd:attribute name="bit_rate" type="xsd:long"/> + <xsd:attribute name="probe_score" type="xsd:int"/> + </xsd:complexType> + + <xsd:complexType name="tagType"> + <xsd:attribute name="key" type="xsd:string" use="required"/> + <xsd:attribute name="value" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="errorType"> + <xsd:attribute name="code" type="xsd:int" use="required"/> + <xsd:attribute name="string" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="programVersionType"> + <xsd:attribute name="version" type="xsd:string" use="required"/> + <xsd:attribute name="copyright" type="xsd:string" use="required"/> + <xsd:attribute name="build_date" type="xsd:string"/> + <xsd:attribute name="build_time" type="xsd:string"/> + <xsd:attribute name="compiler_ident" type="xsd:string" use="required"/> + <xsd:attribute name="configuration" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="chaptersType"> + <xsd:sequence> + <xsd:element name="chapter" type="ffprobe:chapterType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="chapterType"> + <xsd:sequence> + <xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + + <xsd:attribute name="id" type="xsd:int" use="required"/> + <xsd:attribute name="time_base" type="xsd:string" use="required"/> + <xsd:attribute name="start" type="xsd:int" use="required"/> + <xsd:attribute name="start_time" type="xsd:float"/> + <xsd:attribute name="end" type="xsd:int" use="required"/> + <xsd:attribute name="end_time" type="xsd:float" use="required"/> + </xsd:complexType> + + <xsd:complexType name="libraryVersionType"> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="major" type="xsd:int" use="required"/> + <xsd:attribute name="minor" type="xsd:int" use="required"/> + <xsd:attribute name="micro" type="xsd:int" use="required"/> + <xsd:attribute name="version" type="xsd:int" use="required"/> + <xsd:attribute name="ident" type="xsd:string" use="required"/> + </xsd:complexType> + + <xsd:complexType name="libraryVersionsType"> + <xsd:sequence> + <xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="pixelFormatFlagsType"> + <xsd:attribute name="big_endian" type="xsd:int" use="required"/> + <xsd:attribute name="palette" type="xsd:int" use="required"/> + <xsd:attribute name="bitstream" type="xsd:int" use="required"/> + <xsd:attribute name="hwaccel" type="xsd:int" use="required"/> + <xsd:attribute name="planar" type="xsd:int" use="required"/> + <xsd:attribute name="rgb" type="xsd:int" use="required"/> + <xsd:attribute name="pseudopal" type="xsd:int" use="required"/> + <xsd:attribute name="alpha" type="xsd:int" use="required"/> + </xsd:complexType> + + <xsd:complexType name="pixelFormatComponentType"> + <xsd:attribute name="index" type="xsd:int" use="required"/> + <xsd:attribute name="bit_depth" type="xsd:int" use="required"/> + </xsd:complexType> + + <xsd:complexType name="pixelFormatComponentsType"> + <xsd:sequence> + <xsd:element name="component" type="ffprobe:pixelFormatComponentType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="pixelFormatType"> + <xsd:sequence> + <xsd:element name="flags" type="ffprobe:pixelFormatFlagsType" minOccurs="0" maxOccurs="1"/> + <xsd:element name="components" type="ffprobe:pixelFormatComponentsType" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="nb_components" type="xsd:int" use="required"/> + <xsd:attribute name="log2_chroma_w" type="xsd:int"/> + <xsd:attribute name="log2_chroma_h" type="xsd:int"/> + <xsd:attribute name="bits_per_pixel" type="xsd:int"/> + </xsd:complexType> + + <xsd:complexType name="pixelFormatsType"> + <xsd:sequence> + <xsd:element name="pixel_format" type="ffprobe:pixelFormatType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema>
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffserver.conf b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffserver.conf new file mode 100644 index 0000000..7a30fb6 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffserver.conf
@@ -0,0 +1,372 @@ +# Port on which the server is listening. You must select a different +# port from your standard HTTP web server if it is running on the same +# computer. +HTTPPort 8090 + +# Address on which the server is bound. Only useful if you have +# several network interfaces. +HTTPBindAddress 0.0.0.0 + +# Number of simultaneous HTTP connections that can be handled. It has +# to be defined *before* the MaxClients parameter, since it defines the +# MaxClients maximum limit. +MaxHTTPConnections 2000 + +# Number of simultaneous requests that can be handled. Since FFServer +# is very fast, it is more likely that you will want to leave this high +# and use MaxBandwidth, below. +MaxClients 1000 + +# This the maximum amount of kbit/sec that you are prepared to +# consume when streaming to clients. +MaxBandwidth 1000 + +# Access log file (uses standard Apache log file format) +# '-' is the standard output. +CustomLog - + +################################################################## +# Definition of the live feeds. Each live feed contains one video +# and/or audio sequence coming from an ffmpeg encoder or another +# ffserver. This sequence may be encoded simultaneously with several +# codecs at several resolutions. + +<Feed feed1.ffm> + +# You must use 'ffmpeg' to send a live feed to ffserver. In this +# example, you can type: +# +# ffmpeg http://localhost:8090/feed1.ffm + +# ffserver can also do time shifting. It means that it can stream any +# previously recorded live stream. The request should contain: +# "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify +# a path where the feed is stored on disk. You also specify the +# maximum size of the feed, where zero means unlimited. Default: +# File=/tmp/feed_name.ffm FileMaxSize=5M +File /tmp/feed1.ffm +FileMaxSize 200K + +# You could specify +# ReadOnlyFile /saved/specialvideo.ffm +# This marks the file as readonly and it will not be deleted or updated. + +# Specify launch in order to start ffmpeg automatically. +# First ffmpeg must be defined with an appropriate path if needed, +# after that options can follow, but avoid adding the http:// field +#Launch ffmpeg + +# Only allow connections from localhost to the feed. +ACL allow 127.0.0.1 + +</Feed> + + +################################################################## +# Now you can define each stream which will be generated from the +# original audio and video stream. Each format has a filename (here +# 'test1.mpg'). FFServer will send this stream when answering a +# request containing this filename. + +<Stream test1.mpg> + +# coming from live feed 'feed1' +Feed feed1.ffm + +# Format of the stream : you can choose among: +# mpeg : MPEG-1 multiplexed video and audio +# mpegvideo : only MPEG-1 video +# mp2 : MPEG-2 audio (use AudioCodec to select layer 2 and 3 codec) +# ogg : Ogg format (Vorbis audio codec) +# rm : RealNetworks-compatible stream. Multiplexed audio and video. +# ra : RealNetworks-compatible stream. Audio only. +# mpjpeg : Multipart JPEG (works with Netscape without any plugin) +# jpeg : Generate a single JPEG image. +# mjpeg : Generate a M-JPEG stream. +# asf : ASF compatible streaming (Windows Media Player format). +# swf : Macromedia Flash compatible stream +# avi : AVI format (MPEG-4 video, MPEG audio sound) +Format mpeg + +# Bitrate for the audio stream. Codecs usually support only a few +# different bitrates. +AudioBitRate 32 + +# Number of audio channels: 1 = mono, 2 = stereo +AudioChannels 1 + +# Sampling frequency for audio. When using low bitrates, you should +# lower this frequency to 22050 or 11025. The supported frequencies +# depend on the selected audio codec. +AudioSampleRate 44100 + +# Bitrate for the video stream +VideoBitRate 64 + +# Ratecontrol buffer size +VideoBufferSize 40 + +# Number of frames per second +VideoFrameRate 3 + +# Size of the video frame: WxH (default: 160x128) +# The following abbreviations are defined: sqcif, qcif, cif, 4cif, qqvga, +# qvga, vga, svga, xga, uxga, qxga, sxga, qsxga, hsxga, wvga, wxga, wsxga, +# wuxga, woxga, wqsxga, wquxga, whsxga, whuxga, cga, ega, hd480, hd720, +# hd1080 +VideoSize 160x128 + +# Transmit only intra frames (useful for low bitrates, but kills frame rate). +#VideoIntraOnly + +# If non-intra only, an intra frame is transmitted every VideoGopSize +# frames. Video synchronization can only begin at an intra frame. +VideoGopSize 12 + +# More MPEG-4 parameters +# VideoHighQuality +# Video4MotionVector + +# Choose your codecs: +#AudioCodec mp2 +#VideoCodec mpeg1video + +# Suppress audio +#NoAudio + +# Suppress video +#NoVideo + +#VideoQMin 3 +#VideoQMax 31 + +# Set this to the number of seconds backwards in time to start. Note that +# most players will buffer 5-10 seconds of video, and also you need to allow +# for a keyframe to appear in the data stream. +#Preroll 15 + +# ACL: + +# You can allow ranges of addresses (or single addresses) +#ACL ALLOW <first address> <last address> + +# You can deny ranges of addresses (or single addresses) +#ACL DENY <first address> <last address> + +# You can repeat the ACL allow/deny as often as you like. It is on a per +# stream basis. The first match defines the action. If there are no matches, +# then the default is the inverse of the last ACL statement. +# +# Thus 'ACL allow localhost' only allows access from localhost. +# 'ACL deny 1.0.0.0 1.255.255.255' would deny the whole of network 1 and +# allow everybody else. + +</Stream> + + +################################################################## +# Example streams + + +# Multipart JPEG + +#<Stream test.mjpg> +#Feed feed1.ffm +#Format mpjpeg +#VideoFrameRate 2 +#VideoIntraOnly +#NoAudio +#Strict -1 +#</Stream> + + +# Single JPEG + +#<Stream test.jpg> +#Feed feed1.ffm +#Format jpeg +#VideoFrameRate 2 +#VideoIntraOnly +##VideoSize 352x240 +#NoAudio +#Strict -1 +#</Stream> + + +# Flash + +#<Stream test.swf> +#Feed feed1.ffm +#Format swf +#VideoFrameRate 2 +#VideoIntraOnly +#NoAudio +#</Stream> + + +# ASF compatible + +<Stream test.asf> +Feed feed1.ffm +Format asf +VideoFrameRate 15 +VideoSize 352x240 +VideoBitRate 256 +VideoBufferSize 40 +VideoGopSize 30 +AudioBitRate 64 +StartSendOnKey +</Stream> + + +# MP3 audio + +#<Stream test.mp3> +#Feed feed1.ffm +#Format mp2 +#AudioCodec mp3 +#AudioBitRate 64 +#AudioChannels 1 +#AudioSampleRate 44100 +#NoVideo +#</Stream> + + +# Ogg Vorbis audio + +#<Stream test.ogg> +#Feed feed1.ffm +#Metadata title "Stream title" +#AudioBitRate 64 +#AudioChannels 2 +#AudioSampleRate 44100 +#NoVideo +#</Stream> + + +# Real with audio only at 32 kbits + +#<Stream test.ra> +#Feed feed1.ffm +#Format rm +#AudioBitRate 32 +#NoVideo +#NoAudio +#</Stream> + + +# Real with audio and video at 64 kbits + +#<Stream test.rm> +#Feed feed1.ffm +#Format rm +#AudioBitRate 32 +#VideoBitRate 128 +#VideoFrameRate 25 +#VideoGopSize 25 +#NoAudio +#</Stream> + + +################################################################## +# A stream coming from a file: you only need to set the input +# filename and optionally a new format. Supported conversions: +# AVI -> ASF + +#<Stream file.rm> +#File "/usr/local/httpd/htdocs/tlive.rm" +#NoAudio +#</Stream> + +#<Stream file.asf> +#File "/usr/local/httpd/htdocs/test.asf" +#NoAudio +#Metadata author "Me" +#Metadata copyright "Super MegaCorp" +#Metadata title "Test stream from disk" +#Metadata comment "Test comment" +#</Stream> + + +################################################################## +# RTSP examples +# +# You can access this stream with the RTSP URL: +# rtsp://localhost:5454/test1-rtsp.mpg +# +# A non-standard RTSP redirector is also created. Its URL is: +# http://localhost:8090/test1-rtsp.rtsp + +#<Stream test1-rtsp.mpg> +#Format rtp +#File "/usr/local/httpd/htdocs/test1.mpg" +#</Stream> + + +# Transcode an incoming live feed to another live feed, +# using libx264 and video presets + +#<Stream live.h264> +#Format rtp +#Feed feed1.ffm +#VideoCodec libx264 +#VideoFrameRate 24 +#VideoBitRate 100 +#VideoSize 480x272 +#AVPresetVideo default +#AVPresetVideo baseline +#AVOptionVideo flags +global_header +# +#AudioCodec libfaac +#AudioBitRate 32 +#AudioChannels 2 +#AudioSampleRate 22050 +#AVOptionAudio flags +global_header +#</Stream> + +################################################################## +# SDP/multicast examples +# +# If you want to send your stream in multicast, you must set the +# multicast address with MulticastAddress. The port and the TTL can +# also be set. +# +# An SDP file is automatically generated by ffserver by adding the +# 'sdp' extension to the stream name (here +# http://localhost:8090/test1-sdp.sdp). You should usually give this +# file to your player to play the stream. +# +# The 'NoLoop' option can be used to avoid looping when the stream is +# terminated. + +#<Stream test1-sdp.mpg> +#Format rtp +#File "/usr/local/httpd/htdocs/test1.mpg" +#MulticastAddress 224.124.0.1 +#MulticastPort 5000 +#MulticastTTL 16 +#NoLoop +#</Stream> + + +################################################################## +# Special streams + +# Server status + +<Stream stat.html> +Format status + +# Only allow local people to get the status +ACL allow localhost +ACL allow 192.168.0.0 192.168.255.255 + +#FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico +</Stream> + + +# Redirect index.html to the appropriate site + +<Redirect index.html> +URL http://www.ffmpeg.org/ +</Redirect>
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffserver.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffserver.texi new file mode 100644 index 0000000..ad48f47 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/ffserver.texi
@@ -0,0 +1,923 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle ffserver Documentation +@titlepage +@center @titlefont{ffserver Documentation} +@end titlepage + +@top + +@contents + +@chapter Synopsis + +ffserver [@var{options}] + +@chapter Description +@c man begin DESCRIPTION + +@command{ffserver} is a streaming server for both audio and video. +It supports several live feeds, streaming from files and time shifting +on live feeds. You can seek to positions in the past on each live +feed, provided you specify a big enough feed storage. + +@command{ffserver} is configured through a configuration file, which +is read at startup. If not explicitly specified, it will read from +@file{/etc/ffserver.conf}. + +@command{ffserver} receives prerecorded files or FFM streams from some +@command{ffmpeg} instance as input, then streams them over +RTP/RTSP/HTTP. + +An @command{ffserver} instance will listen on some port as specified +in the configuration file. You can launch one or more instances of +@command{ffmpeg} and send one or more FFM streams to the port where +ffserver is expecting to receive them. Alternately, you can make +@command{ffserver} launch such @command{ffmpeg} instances at startup. + +Input streams are called feeds, and each one is specified by a +@code{<Feed>} section in the configuration file. + +For each feed you can have different output streams in various +formats, each one specified by a @code{<Stream>} section in the +configuration file. + +@chapter Detailed description + +@command{ffserver} works by forwarding streams encoded by +@command{ffmpeg}, or pre-recorded streams which are read from disk. + +Precisely, @command{ffserver} acts as an HTTP server, accepting POST +requests from @command{ffmpeg} to acquire the stream to publish, and +serving RTSP clients or HTTP clients GET requests with the stream +media content. + +A feed is an @ref{FFM} stream created by @command{ffmpeg}, and sent to +a port where @command{ffserver} is listening. + +Each feed is identified by a unique name, corresponding to the name +of the resource published on @command{ffserver}, and is configured by +a dedicated @code{Feed} section in the configuration file. + +The feed publish URL is given by: +@example +http://@var{ffserver_ip_address}:@var{http_port}/@var{feed_name} +@end example + +where @var{ffserver_ip_address} is the IP address of the machine where +@command{ffserver} is installed, @var{http_port} is the port number of +the HTTP server (configured through the @option{HTTPPort} option), and +@var{feed_name} is the name of the corresponding feed defined in the +configuration file. + +Each feed is associated to a file which is stored on disk. This stored +file is used to send pre-recorded data to a player as fast as +possible when new content is added in real-time to the stream. + +A "live-stream" or "stream" is a resource published by +@command{ffserver}, and made accessible through the HTTP protocol to +clients. + +A stream can be connected to a feed, or to a file. In the first case, +the published stream is forwarded from the corresponding feed +generated by a running instance of @command{ffmpeg}, in the second +case the stream is read from a pre-recorded file. + +Each stream is identified by a unique name, corresponding to the name +of the resource served by @command{ffserver}, and is configured by +a dedicated @code{Stream} section in the configuration file. + +The stream access HTTP URL is given by: +@example +http://@var{ffserver_ip_address}:@var{http_port}/@var{stream_name}[@var{options}] +@end example + +The stream access RTSP URL is given by: +@example +http://@var{ffserver_ip_address}:@var{rtsp_port}/@var{stream_name}[@var{options}] +@end example + +@var{stream_name} is the name of the corresponding stream defined in +the configuration file. @var{options} is a list of options specified +after the URL which affects how the stream is served by +@command{ffserver}. @var{http_port} and @var{rtsp_port} are the HTTP +and RTSP ports configured with the options @var{HTTPPort} and +@var{RTSPPort} respectively. + +In case the stream is associated to a feed, the encoding parameters +must be configured in the stream configuration. They are sent to +@command{ffmpeg} when setting up the encoding. This allows +@command{ffserver} to define the encoding parameters used by +the @command{ffmpeg} encoders. + +The @command{ffmpeg} @option{override_ffserver} commandline option +allows one to override the encoding parameters set by the server. + +Multiple streams can be connected to the same feed. + +For example, you can have a situation described by the following +graph: + +@verbatim + _________ __________ + | | | | +ffmpeg 1 -----| feed 1 |-----| stream 1 | + \ |_________|\ |__________| + \ \ + \ \ __________ + \ \ | | + \ \| stream 2 | + \ |__________| + \ + \ _________ __________ + \ | | | | + \| feed 2 |-----| stream 3 | + |_________| |__________| + + _________ __________ + | | | | +ffmpeg 2 -----| feed 3 |-----| stream 4 | + |_________| |__________| + + _________ __________ + | | | | + | file 1 |-----| stream 5 | + |_________| |__________| + +@end verbatim + +@anchor{FFM} +@section FFM, FFM2 formats + +FFM and FFM2 are formats used by ffserver. They allow storing a wide variety of +video and audio streams and encoding options, and can store a moving time segment +of an infinite movie or a whole movie. + +FFM is version specific, and there is limited compatibility of FFM files +generated by one version of ffmpeg/ffserver and another version of +ffmpeg/ffserver. It may work but it is not guaranteed to work. + +FFM2 is extensible while maintaining compatibility and should work between +differing versions of tools. FFM2 is the default. + +@section Status stream + +@command{ffserver} supports an HTTP interface which exposes the +current status of the server. + +Simply point your browser to the address of the special status stream +specified in the configuration file. + +For example if you have: +@example +<Stream status.html> +Format status + +# Only allow local people to get the status +ACL allow localhost +ACL allow 192.168.0.0 192.168.255.255 +</Stream> +@end example + +then the server will post a page with the status information when +the special stream @file{status.html} is requested. + +@section How do I make it work? + +As a simple test, just run the following two command lines where INPUTFILE +is some file which you can decode with ffmpeg: + +@example +ffserver -f doc/ffserver.conf & +ffmpeg -i INPUTFILE http://localhost:8090/feed1.ffm +@end example + +At this point you should be able to go to your Windows machine and fire up +Windows Media Player (WMP). Go to Open URL and enter + +@example + http://<linuxbox>:8090/test.asf +@end example + +You should (after a short delay) see video and hear audio. + +WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to +transfer the entire file before starting to play. +The same is true of AVI files. + +You should edit the @file{ffserver.conf} file to suit your needs (in +terms of frame rates etc). Then install @command{ffserver} and +@command{ffmpeg}, write a script to start them up, and off you go. + +@section What else can it do? + +You can replay video from .ffm files that was recorded earlier. +However, there are a number of caveats, including the fact that the +ffserver parameters must match the original parameters used to record the +file. If they do not, then ffserver deletes the file before recording into it. +(Now that I write this, it seems broken). + +You can fiddle with many of the codec choices and encoding parameters, and +there are a bunch more parameters that you cannot control. Post a message +to the mailing list if there are some 'must have' parameters. Look in +ffserver.conf for a list of the currently available controls. + +It will automatically generate the ASX or RAM files that are often used +in browsers. These files are actually redirections to the underlying ASF +or RM file. The reason for this is that the browser often fetches the +entire file before starting up the external viewer. The redirection files +are very small and can be transferred quickly. [The stream itself is +often 'infinite' and thus the browser tries to download it and never +finishes.] + +@section Tips + +* When you connect to a live stream, most players (WMP, RA, etc) want to +buffer a certain number of seconds of material so that they can display the +signal continuously. However, ffserver (by default) starts sending data +in realtime. This means that there is a pause of a few seconds while the +buffering is being done by the player. The good news is that this can be +cured by adding a '?buffer=5' to the end of the URL. This means that the +stream should start 5 seconds in the past -- and so the first 5 seconds +of the stream are sent as fast as the network will allow. It will then +slow down to real time. This noticeably improves the startup experience. + +You can also add a 'Preroll 15' statement into the ffserver.conf that will +add the 15 second prebuffering on all requests that do not otherwise +specify a time. In addition, ffserver will skip frames until a key_frame +is found. This further reduces the startup delay by not transferring data +that will be discarded. + +@section Why does the ?buffer / Preroll stop working after a time? + +It turns out that (on my machine at least) the number of frames successfully +grabbed is marginally less than the number that ought to be grabbed. This +means that the timestamp in the encoded data stream gets behind realtime. +This means that if you say 'Preroll 10', then when the stream gets 10 +or more seconds behind, there is no Preroll left. + +Fixing this requires a change in the internals of how timestamps are +handled. + +@section Does the @code{?date=} stuff work. + +Yes (subject to the limitation outlined above). Also note that whenever you +start ffserver, it deletes the ffm file (if any parameters have changed), +thus wiping out what you had recorded before. + +The format of the @code{?date=xxxxxx} is fairly flexible. You should use one +of the following formats (the 'T' is literal): + +@example +* YYYY-MM-DDTHH:MM:SS (localtime) +* YYYY-MM-DDTHH:MM:SSZ (UTC) +@end example + +You can omit the YYYY-MM-DD, and then it refers to the current day. However +note that @samp{?date=16:00:00} refers to 16:00 on the current day -- this +may be in the future and so is unlikely to be useful. + +You use this by adding the ?date= to the end of the URL for the stream. +For example: @samp{http://localhost:8080/test.asf?date=2002-07-26T23:05:00}. +@c man end + +@chapter Options +@c man begin OPTIONS + +@include fftools-common-opts.texi + +@section Main options + +@table @option +@item -f @var{configfile} +Read configuration file @file{configfile}. If not specified it will +read by default from @file{/etc/ffserver.conf}. + +@item -n +Enable no-launch mode. This option disables all the @code{Launch} +directives within the various @code{<Feed>} sections. Since +@command{ffserver} will not launch any @command{ffmpeg} instances, you +will have to launch them manually. + +@item -d +Enable debug mode. This option increases log verbosity, and directs +log messages to stdout. When specified, the @option{CustomLog} option +is ignored. +@end table + +@chapter Configuration file syntax + +@command{ffserver} reads a configuration file containing global +options and settings for each stream and feed. + +The configuration file consists of global options and dedicated +sections, which must be introduced by "<@var{SECTION_NAME} +@var{ARGS}>" on a separate line and must be terminated by a line in +the form "</@var{SECTION_NAME}>". @var{ARGS} is optional. + +Currently the following sections are recognized: @samp{Feed}, +@samp{Stream}, @samp{Redirect}. + +A line starting with @code{#} is ignored and treated as a comment. + +Name of options and sections are case-insensitive. + +@section ACL syntax +An ACL (Access Control List) specifies the address which are allowed +to access a given stream, or to write a given feed. + +It accepts the folling forms +@itemize +@item +Allow/deny access to @var{address}. +@example +ACL ALLOW <address> +ACL DENY <address> +@end example + +@item +Allow/deny access to ranges of addresses from @var{first_address} to +@var{last_address}. +@example +ACL ALLOW <first_address> <last_address> +ACL DENY <first_address> <last_address> +@end example +@end itemize + +You can repeat the ACL allow/deny as often as you like. It is on a per +stream basis. The first match defines the action. If there are no matches, +then the default is the inverse of the last ACL statement. + +Thus 'ACL allow localhost' only allows access from localhost. +'ACL deny 1.0.0.0 1.255.255.255' would deny the whole of network 1 and +allow everybody else. + +@section Global options +@table @option +@item HTTPPort @var{port_number} +@item Port @var{port_number} +@item RTSPPort @var{port_number} + +@var{HTTPPort} sets the HTTP server listening TCP port number, +@var{RTSPPort} sets the RTSP server listening TCP port number. + +@var{Port} is the equivalent of @var{HTTPPort} and is deprecated. + +You must select a different port from your standard HTTP web server if +it is running on the same computer. + +If not specified, no corresponding server will be created. + +@item HTTPBindAddress @var{ip_address} +@item BindAddress @var{ip_address} +@item RTSPBindAddress @var{ip_address} +Set address on which the HTTP/RTSP server is bound. Only useful if you +have several network interfaces. + +@var{BindAddress} is the equivalent of @var{HTTPBindAddress} and is +deprecated. + +@item MaxHTTPConnections @var{n} +Set number of simultaneous HTTP connections that can be handled. It +has to be defined @emph{before} the @option{MaxClients} parameter, +since it defines the @option{MaxClients} maximum limit. + +Default value is 2000. + +@item MaxClients @var{n} +Set number of simultaneous requests that can be handled. Since +@command{ffserver} is very fast, it is more likely that you will want +to leave this high and use @option{MaxBandwidth}. + +Default value is 5. + +@item MaxBandwidth @var{kbps} +Set the maximum amount of kbit/sec that you are prepared to consume +when streaming to clients. + +Default value is 1000. + +@item CustomLog @var{filename} +Set access log file (uses standard Apache log file format). '-' is the +standard output. + +If not specified @command{ffserver} will produce no log. + +In case the commandline option @option{-d} is specified this option is +ignored, and the log is written to standard output. + +@item NoDaemon +Set no-daemon mode. This option is currently ignored since now +@command{ffserver} will always work in no-daemon mode, and is +deprecated. + +@item UseDefaults +@item NoDefaults +Control whether default codec options are used for the all streams or not. +Each stream may overwrite this setting for its own. Default is @var{UseDefaults}. +The lastest occurrence overrides previous if multiple definitions. +@end table + +@section Feed section + +A Feed section defines a feed provided to @command{ffserver}. + +Each live feed contains one video and/or audio sequence coming from an +@command{ffmpeg} encoder or another @command{ffserver}. This sequence +may be encoded simultaneously with several codecs at several +resolutions. + +A feed instance specification is introduced by a line in the form: +@example +<Feed FEED_FILENAME> +@end example + +where @var{FEED_FILENAME} specifies the unique name of the FFM stream. + +The following options are recognized within a Feed section. + +@table @option +@item File @var{filename} +@item ReadOnlyFile @var{filename} +Set the path where the feed file is stored on disk. + +If not specified, the @file{/tmp/FEED.ffm} is assumed, where +@var{FEED} is the feed name. + +If @option{ReadOnlyFile} is used the file is marked as read-only and +it will not be deleted or updated. + +@item Truncate +Truncate the feed file, rather than appending to it. By default +@command{ffserver} will append data to the file, until the maximum +file size value is reached (see @option{FileMaxSize} option). + +@item FileMaxSize @var{size} +Set maximum size of the feed file in bytes. 0 means unlimited. The +postfixes @code{K} (2^10), @code{M} (2^20), and @code{G} (2^30) are +recognized. + +Default value is 5M. + +@item Launch @var{args} +Launch an @command{ffmpeg} command when creating @command{ffserver}. + +@var{args} must be a sequence of arguments to be provided to an +@command{ffmpeg} instance. The first provided argument is ignored, and +it is replaced by a path with the same dirname of the @command{ffserver} +instance, followed by the remaining argument and terminated with a +path corresponding to the feed. + +When the launched process exits, @command{ffserver} will launch +another program instance. + +In case you need a more complex @command{ffmpeg} configuration, +e.g. if you need to generate multiple FFM feeds with a single +@command{ffmpeg} instance, you should launch @command{ffmpeg} by hand. + +This option is ignored in case the commandline option @option{-n} is +specified. + +@item ACL @var{spec} +Specify the list of IP address which are allowed or denied to write +the feed. Multiple ACL options can be specified. +@end table + +@section Stream section + +A Stream section defines a stream provided by @command{ffserver}, and +identified by a single name. + +The stream is sent when answering a request containing the stream +name. + +A stream section must be introduced by the line: +@example +<Stream STREAM_NAME> +@end example + +where @var{STREAM_NAME} specifies the unique name of the stream. + +The following options are recognized within a Stream section. + +Encoding options are marked with the @emph{encoding} tag, and they are +used to set the encoding parameters, and are mapped to libavcodec +encoding options. Not all encoding options are supported, in +particular it is not possible to set encoder private options. In order +to override the encoding options specified by @command{ffserver}, you +can use the @command{ffmpeg} @option{override_ffserver} commandline +option. + +Only one of the @option{Feed} and @option{File} options should be set. + +@table @option +@item Feed @var{feed_name} +Set the input feed. @var{feed_name} must correspond to an existing +feed defined in a @code{Feed} section. + +When this option is set, encoding options are used to setup the +encoding operated by the remote @command{ffmpeg} process. + +@item File @var{filename} +Set the filename of the pre-recorded input file to stream. + +When this option is set, encoding options are ignored and the input +file content is re-streamed as is. + +@item Format @var{format_name} +Set the format of the output stream. + +Must be the name of a format recognized by FFmpeg. If set to +@samp{status}, it is treated as a status stream. + +@item InputFormat @var{format_name} +Set input format. If not specified, it is automatically guessed. + +@item Preroll @var{n} +Set this to the number of seconds backwards in time to start. Note that +most players will buffer 5-10 seconds of video, and also you need to allow +for a keyframe to appear in the data stream. + +Default value is 0. + +@item StartSendOnKey +Do not send stream until it gets the first key frame. By default +@command{ffserver} will send data immediately. + +@item MaxTime @var{n} +Set the number of seconds to run. This value set the maximum duration +of the stream a client will be able to receive. + +A value of 0 means that no limit is set on the stream duration. + +@item ACL @var{spec} +Set ACL for the stream. + +@item DynamicACL @var{spec} + +@item RTSPOption @var{option} + +@item MulticastAddress @var{address} + +@item MulticastPort @var{port} + +@item MulticastTTL @var{integer} + +@item NoLoop + +@item FaviconURL @var{url} +Set favicon (favourite icon) for the server status page. It is ignored +for regular streams. + +@item Author @var{value} +@item Comment @var{value} +@item Copyright @var{value} +@item Title @var{value} +Set metadata corresponding to the option. All these options are +deprecated in favor of @option{Metadata}. + +@item Metadata @var{key} @var{value} +Set metadata value on the output stream. + +@item UseDefaults +@item NoDefaults +Control whether default codec options are used for the stream or not. +Default is @var{UseDefaults} unless disabled globally. + +@item NoAudio +@item NoVideo +Suppress audio/video. + +@item AudioCodec @var{codec_name} (@emph{encoding,audio}) +Set audio codec. + +@item AudioBitRate @var{rate} (@emph{encoding,audio}) +Set bitrate for the audio stream in kbits per second. + +@item AudioChannels @var{n} (@emph{encoding,audio}) +Set number of audio channels. + +@item AudioSampleRate @var{n} (@emph{encoding,audio}) +Set sampling frequency for audio. When using low bitrates, you should +lower this frequency to 22050 or 11025. The supported frequencies +depend on the selected audio codec. + +@item AVOptionAudio [@var{codec}:]@var{option} @var{value} (@emph{encoding,audio}) +Set generic or private option for audio stream. +Private option must be prefixed with codec name or codec must be defined before. + +@item AVPresetAudio @var{preset} (@emph{encoding,audio}) +Set preset for audio stream. + +@item VideoCodec @var{codec_name} (@emph{encoding,video}) +Set video codec. + +@item VideoBitRate @var{n} (@emph{encoding,video}) +Set bitrate for the video stream in kbits per second. + +@item VideoBitRateRange @var{range} (@emph{encoding,video}) +Set video bitrate range. + +A range must be specified in the form @var{minrate}-@var{maxrate}, and +specifies the @option{minrate} and @option{maxrate} encoding options +expressed in kbits per second. + +@item VideoBitRateRangeTolerance @var{n} (@emph{encoding,video}) +Set video bitrate tolerance in kbits per second. + +@item PixelFormat @var{pixel_format} (@emph{encoding,video}) +Set video pixel format. + +@item Debug @var{integer} (@emph{encoding,video}) +Set video @option{debug} encoding option. + +@item Strict @var{integer} (@emph{encoding,video}) +Set video @option{strict} encoding option. + +@item VideoBufferSize @var{n} (@emph{encoding,video}) +Set ratecontrol buffer size, expressed in KB. + +@item VideoFrameRate @var{n} (@emph{encoding,video}) +Set number of video frames per second. + +@item VideoSize (@emph{encoding,video}) +Set size of the video frame, must be an abbreviation or in the form +@var{W}x@var{H}. See @ref{video size syntax,,the Video size section +in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +Default value is @code{160x128}. + +@item VideoIntraOnly (@emph{encoding,video}) +Transmit only intra frames (useful for low bitrates, but kills frame rate). + +@item VideoGopSize @var{n} (@emph{encoding,video}) +If non-intra only, an intra frame is transmitted every VideoGopSize +frames. Video synchronization can only begin at an intra frame. + +@item VideoTag @var{tag} (@emph{encoding,video}) +Set video tag. + +@item VideoHighQuality (@emph{encoding,video}) +@item Video4MotionVector (@emph{encoding,video}) + +@item BitExact (@emph{encoding,video}) +Set bitexact encoding flag. + +@item IdctSimple (@emph{encoding,video}) +Set simple IDCT algorithm. + +@item Qscale @var{n} (@emph{encoding,video}) +Enable constant quality encoding, and set video qscale (quantization +scale) value, expressed in @var{n} QP units. + +@item VideoQMin @var{n} (@emph{encoding,video}) +@item VideoQMax @var{n} (@emph{encoding,video}) +Set video qmin/qmax. + +@item VideoQDiff @var{integer} (@emph{encoding,video}) +Set video @option{qdiff} encoding option. + +@item LumiMask @var{float} (@emph{encoding,video}) +@item DarkMask @var{float} (@emph{encoding,video}) +Set @option{lumi_mask}/@option{dark_mask} encoding options. + +@item AVOptionVideo [@var{codec}:]@var{option} @var{value} (@emph{encoding,video}) +Set generic or private option for video stream. +Private option must be prefixed with codec name or codec must be defined before. + +@item AVPresetVideo @var{preset} (@emph{encoding,video}) +Set preset for video stream. + +@var{preset} must be the path of a preset file. +@end table + +@subsection Server status stream + +A server status stream is a special stream which is used to show +statistics about the @command{ffserver} operations. + +It must be specified setting the option @option{Format} to +@samp{status}. + +@section Redirect section + +A redirect section specifies where to redirect the requested URL to +another page. + +A redirect section must be introduced by the line: +@example +<Redirect NAME> +@end example + +where @var{NAME} is the name of the page which should be redirected. + +It only accepts the option @option{URL}, which specify the redirection +URL. + +@chapter Stream examples + +@itemize +@item +Multipart JPEG +@example +<Stream test.mjpg> +Feed feed1.ffm +Format mpjpeg +VideoFrameRate 2 +VideoIntraOnly +NoAudio +Strict -1 +</Stream> +@end example + +@item +Single JPEG +@example +<Stream test.jpg> +Feed feed1.ffm +Format jpeg +VideoFrameRate 2 +VideoIntraOnly +VideoSize 352x240 +NoAudio +Strict -1 +</Stream> +@end example + +@item +Flash +@example +<Stream test.swf> +Feed feed1.ffm +Format swf +VideoFrameRate 2 +VideoIntraOnly +NoAudio +</Stream> +@end example + +@item +ASF compatible +@example +<Stream test.asf> +Feed feed1.ffm +Format asf +VideoFrameRate 15 +VideoSize 352x240 +VideoBitRate 256 +VideoBufferSize 40 +VideoGopSize 30 +AudioBitRate 64 +StartSendOnKey +</Stream> +@end example + +@item +MP3 audio +@example +<Stream test.mp3> +Feed feed1.ffm +Format mp2 +AudioCodec mp3 +AudioBitRate 64 +AudioChannels 1 +AudioSampleRate 44100 +NoVideo +</Stream> +@end example + +@item +Ogg Vorbis audio +@example +<Stream test.ogg> +Feed feed1.ffm +Metadata title "Stream title" +AudioBitRate 64 +AudioChannels 2 +AudioSampleRate 44100 +NoVideo +</Stream> +@end example + +@item +Real with audio only at 32 kbits +@example +<Stream test.ra> +Feed feed1.ffm +Format rm +AudioBitRate 32 +NoVideo +</Stream> +@end example + +@item +Real with audio and video at 64 kbits +@example +<Stream test.rm> +Feed feed1.ffm +Format rm +AudioBitRate 32 +VideoBitRate 128 +VideoFrameRate 25 +VideoGopSize 25 +</Stream> +@end example + +@item +For stream coming from a file: you only need to set the input filename +and optionally a new format. + +@example +<Stream file.rm> +File "/usr/local/httpd/htdocs/tlive.rm" +NoAudio +</Stream> +@end example + +@example +<Stream file.asf> +File "/usr/local/httpd/htdocs/test.asf" +NoAudio +Metadata author "Me" +Metadata copyright "Super MegaCorp" +Metadata title "Test stream from disk" +Metadata comment "Test comment" +</Stream> +@end example +@end itemize + +@c man end + +@include config.texi +@ifset config-all +@ifset config-avutil +@include utils.texi +@end ifset +@ifset config-avcodec +@include codecs.texi +@include bitstream_filters.texi +@end ifset +@ifset config-avformat +@include formats.texi +@include protocols.texi +@end ifset +@ifset config-avdevice +@include devices.texi +@end ifset +@ifset config-swresample +@include resampler.texi +@end ifset +@ifset config-swscale +@include scaler.texi +@end ifset +@ifset config-avfilter +@include filters.texi +@end ifset +@end ifset + +@chapter See Also + +@ifhtml +@ifset config-all +@url{ffserver.html,ffserver}, +@end ifset +@ifset config-not-all +@url{ffserver-all.html,ffserver-all}, +@end ifset +the @file{doc/ffserver.conf} example, +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, +@url{ffmpeg-utils.html,ffmpeg-utils}, +@url{ffmpeg-scaler.html,ffmpeg-scaler}, +@url{ffmpeg-resampler.html,ffmpeg-resampler}, +@url{ffmpeg-codecs.html,ffmpeg-codecs}, +@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters}, +@url{ffmpeg-formats.html,ffmpeg-formats}, +@url{ffmpeg-devices.html,ffmpeg-devices}, +@url{ffmpeg-protocols.html,ffmpeg-protocols}, +@url{ffmpeg-filters.html,ffmpeg-filters} +@end ifhtml + +@ifnothtml +@ifset config-all +ffserver(1), +@end ifset +@ifset config-not-all +ffserver-all(1), +@end ifset +the @file{doc/ffserver.conf} example, ffmpeg(1), ffplay(1), ffprobe(1), +ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), +ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), +ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename ffserver +@settitle ffserver video server + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fftools-common-opts.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fftools-common-opts.texi new file mode 100644 index 0000000..509c8bc --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/fftools-common-opts.texi
@@ -0,0 +1,389 @@ +All the numerical options, if not specified otherwise, accept a string +representing a number as input, which may be followed by one of the SI +unit prefixes, for example: 'K', 'M', or 'G'. + +If 'i' is appended to the SI unit prefix, the complete prefix will be +interpreted as a unit prefix for binary multiples, which are based on +powers of 1024 instead of powers of 1000. Appending 'B' to the SI unit +prefix multiplies the value by 8. This allows using, for example: +'KB', 'MiB', 'G' and 'B' as number suffixes. + +Options which do not take arguments are boolean options, and set the +corresponding value to true. They can be set to false by prefixing +the option name with "no". For example using "-nofoo" +will set the boolean option with name "foo" to false. + +@anchor{Stream specifiers} +@section Stream specifiers +Some options are applied per-stream, e.g. bitrate or codec. Stream specifiers +are used to precisely specify which stream(s) a given option belongs to. + +A stream specifier is a string generally appended to the option name and +separated from it by a colon. E.g. @code{-codec:a:1 ac3} contains the +@code{a:1} stream specifier, which matches the second audio stream. Therefore, it +would select the ac3 codec for the second audio stream. + +A stream specifier can match several streams, so that the option is applied to all +of them. E.g. the stream specifier in @code{-b:a 128k} matches all audio +streams. + +An empty stream specifier matches all streams. For example, @code{-codec copy} +or @code{-codec: copy} would copy all the streams without reencoding. + +Possible forms of stream specifiers are: +@table @option +@item @var{stream_index} +Matches the stream with this index. E.g. @code{-threads:1 4} would set the +thread count for the second stream to 4. +@item @var{stream_type}[:@var{stream_index}] +@var{stream_type} is one of following: 'v' 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 @var{stream_index} is given, then it matches +stream number @var{stream_index} of this type. Otherwise, it matches all +streams of this type. +@item p:@var{program_id}[:@var{stream_index}] +If @var{stream_index} is given, then it matches the stream with number @var{stream_index} +in the program with the id @var{program_id}. Otherwise, it matches all streams in the +program. +@item #@var{stream_id} or i:@var{stream_id} +Match the stream by stream id (e.g. PID in MPEG-TS container). +@item m:@var{key}[:@var{value}] +Matches streams with the metadata tag @var{key} having the specified value. If +@var{value} is not given, matches streams that contain the given tag with any +value. +@item u +Matches streams with usable configuration, the codec must be defined and the +essential information such as video dimension or audio sample rate must be present. + +Note that in @command{ffmpeg}, matching by metadata will only work properly for +input files. +@end table + +@section Generic options + +These options are shared amongst the ff* tools. + +@table @option + +@item -L +Show license. + +@item -h, -?, -help, --help [@var{arg}] +Show help. An optional parameter may be specified to print help about a specific +item. If no argument is specified, only basic (non advanced) tool +options are shown. + +Possible values of @var{arg} are: +@table @option +@item long +Print advanced tool options in addition to the basic tool options. + +@item full +Print complete list of options, including shared and private options +for encoders, decoders, demuxers, muxers, filters, etc. + +@item decoder=@var{decoder_name} +Print detailed information about the decoder named @var{decoder_name}. Use the +@option{-decoders} option to get a list of all decoders. + +@item encoder=@var{encoder_name} +Print detailed information about the encoder named @var{encoder_name}. Use the +@option{-encoders} option to get a list of all encoders. + +@item demuxer=@var{demuxer_name} +Print detailed information about the demuxer named @var{demuxer_name}. Use the +@option{-formats} option to get a list of all demuxers and muxers. + +@item muxer=@var{muxer_name} +Print detailed information about the muxer named @var{muxer_name}. Use the +@option{-formats} option to get a list of all muxers and demuxers. + +@item filter=@var{filter_name} +Print detailed information about the filter name @var{filter_name}. Use the +@option{-filters} option to get a list of all filters. +@end table + +@item -version +Show version. + +@item -formats +Show available formats (including devices). + +@item -devices +Show available devices. + +@item -codecs +Show all codecs known to libavcodec. + +Note that the term 'codec' is used throughout this documentation as a shortcut +for what is more correctly called a media bitstream format. + +@item -decoders +Show available decoders. + +@item -encoders +Show all available encoders. + +@item -bsfs +Show available bitstream filters. + +@item -protocols +Show available protocols. + +@item -filters +Show available libavfilter filters. + +@item -pix_fmts +Show available pixel formats. + +@item -sample_fmts +Show available sample formats. + +@item -layouts +Show channel names and standard channel layouts. + +@item -colors +Show recognized color names. + +@item -sources @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...] +Show autodetected sources of the intput device. +Some devices may provide system-dependent source names that cannot be autodetected. +The returned list cannot be assumed to be always complete. +@example +ffmpeg -sources pulse,server=192.168.0.4 +@end example + +@item -sinks @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...] +Show autodetected sinks of the output device. +Some devices may provide system-dependent sink names that cannot be autodetected. +The returned list cannot be assumed to be always complete. +@example +ffmpeg -sinks pulse,server=192.168.0.4 +@end example + +@item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel} +Set the logging level used by the library. +Adding "repeat+" indicates that repeated log output should not be compressed +to the first line and the "Last message repeated n times" line will be +omitted. "repeat" can also be used alone. +If "repeat" is used alone, and with no prior loglevel set, the default +loglevel will be used. If multiple loglevel parameters are given, using +'repeat' will not change the loglevel. +@var{loglevel} is a string or a number containing one of the following values: +@table @samp +@item quiet, -8 +Show nothing at all; be silent. +@item panic, 0 +Only show fatal errors which could lead the process to crash, such as +and assert failure. This is not currently used for anything. +@item fatal, 8 +Only show fatal errors. These are errors after which the process absolutely +cannot continue after. +@item error, 16 +Show all errors, including ones which can be recovered from. +@item warning, 24 +Show all warnings and errors. Any message related to possibly +incorrect or unexpected events will be shown. +@item info, 32 +Show informative messages during processing. This is in addition to +warnings and errors. This is the default value. +@item verbose, 40 +Same as @code{info}, except more verbose. +@item debug, 48 +Show everything, including debugging information. +@item trace, 56 +@end table + +By default the program logs to stderr, if coloring is supported by the +terminal, colors are used to mark errors and warnings. Log coloring +can be disabled setting the environment variable +@env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting +the environment variable @env{AV_LOG_FORCE_COLOR}. +The use of the environment variable @env{NO_COLOR} is deprecated and +will be dropped in a following FFmpeg version. + +@item -report +Dump full command line and console output to a file named +@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current +directory. +This file can be useful for bug reports. +It also implies @code{-loglevel verbose}. + +Setting the environment variable @env{FFREPORT} to any value has the +same effect. If the value is a ':'-separated key=value sequence, these +options will affect the report; option values must be escaped if they +contain special characters or the options delimiter ':' (see the +``Quoting and escaping'' section in the ffmpeg-utils manual). + +The following options are recognized: +@table @option +@item file +set the file name to use for the report; @code{%p} is expanded to the name +of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded +to a plain @code{%} +@item level +set the log verbosity level using a numerical value (see @code{-loglevel}). +@end table + +For example, to output a report to a file named @file{ffreport.log} +using a log level of @code{32} (alias for log level @code{info}): + +@example +FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output +@end example + +Errors in parsing the environment variable are not fatal, and will not +appear in the report. + +@item -hide_banner +Suppress printing banner. + +All FFmpeg tools will normally show a copyright notice, build options +and library versions. This option can be used to suppress printing +this information. + +@item -cpuflags flags (@emph{global}) +Allows setting and clearing cpu flags. This option is intended +for testing. Do not use it unless you know what you're doing. +@example +ffmpeg -cpuflags -sse+mmx ... +ffmpeg -cpuflags mmx ... +ffmpeg -cpuflags 0 ... +@end example +Possible flags for this option are: +@table @samp +@item x86 +@table @samp +@item mmx +@item mmxext +@item sse +@item sse2 +@item sse2slow +@item sse3 +@item sse3slow +@item ssse3 +@item atom +@item sse4.1 +@item sse4.2 +@item avx +@item avx2 +@item xop +@item fma3 +@item fma4 +@item 3dnow +@item 3dnowext +@item bmi1 +@item bmi2 +@item cmov +@end table +@item ARM +@table @samp +@item armv5te +@item armv6 +@item armv6t2 +@item vfp +@item vfpv3 +@item neon +@item setend +@end table +@item AArch64 +@table @samp +@item armv8 +@item vfp +@item neon +@end table +@item PowerPC +@table @samp +@item altivec +@end table +@item Specific Processors +@table @samp +@item pentium2 +@item pentium3 +@item pentium4 +@item k6 +@item k62 +@item athlon +@item athlonxp +@item k8 +@end table +@end table + +@item -opencl_bench +This option is used to benchmark all available OpenCL devices and print the +results. This option is only available when FFmpeg has been compiled with +@code{--enable-opencl}. + +When FFmpeg is configured with @code{--enable-opencl}, the options for the +global OpenCL context are set via @option{-opencl_options}. See the +"OpenCL Options" section in the ffmpeg-utils manual for the complete list of +supported options. Amongst others, these options include the ability to select +a specific platform and device to run the OpenCL code on. By default, FFmpeg +will run on the first device of the first platform. While the options for the +global OpenCL context provide flexibility to the user in selecting the OpenCL +device of their choice, most users would probably want to select the fastest +OpenCL device for their system. + +This option assists the selection of the most efficient configuration by +identifying the appropriate device for the user's system. The built-in +benchmark is run on all the OpenCL devices and the performance is measured for +each device. The devices in the results list are sorted based on their +performance with the fastest device listed first. The user can subsequently +invoke @command{ffmpeg} using the device deemed most appropriate via +@option{-opencl_options} to obtain the best performance for the OpenCL +accelerated code. + +Typical usage to use the fastest OpenCL device involve the following steps. + +Run the command: +@example +ffmpeg -opencl_bench +@end example +Note down the platform ID (@var{pidx}) and device ID (@var{didx}) of the first +i.e. fastest device in the list. +Select the platform and device using the command: +@example +ffmpeg -opencl_options platform_idx=@var{pidx}:device_idx=@var{didx} ... +@end example + +@item -opencl_options options (@emph{global}) +Set OpenCL environment options. This option is only available when +FFmpeg has been compiled with @code{--enable-opencl}. + +@var{options} must be a list of @var{key}=@var{value} option pairs +separated by ':'. See the ``OpenCL Options'' section in the +ffmpeg-utils manual for the list of supported options. +@end table + +@section AVOptions + +These options are provided directly by the libavformat, libavdevice and +libavcodec libraries. To see the list of available AVOptions, use the +@option{-help} option. They are separated into two categories: +@table @option +@item generic +These options can be set for any container, codec or device. Generic options +are listed under AVFormatContext options for containers/devices and under +AVCodecContext options for codecs. +@item private +These options are specific to the given container, device or codec. Private +options are listed under their corresponding containers/devices/codecs. +@end table + +For example to write an ID3v2.3 header instead of a default ID3v2.4 to +an MP3 file, use the @option{id3v2_version} private option of the MP3 +muxer: +@example +ffmpeg -i input.flac -id3v2_version 3 out.mp3 +@end example + +All codec AVOptions are per-stream, and thus a stream specifier +should be attached to them. + +Note: the @option{-nooption} syntax cannot be used for boolean +AVOptions, use @option{-option 0}/@option{-option 1}. + +Note: the old undocumented way of specifying per-stream AVOptions by +prepending v/a/s to the options name is now obsolete and will be +removed soon.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/filter_design.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/filter_design.txt new file mode 100644 index 0000000..e8a7c53 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/filter_design.txt
@@ -0,0 +1,269 @@ +Filter design +============= + +This document explains guidelines that should be observed (or ignored with +good reason) when writing filters for libavfilter. + +In this document, the word “frame” indicates either a video frame or a group +of audio samples, as stored in an AVFilterBuffer structure. + + +Format negotiation +================== + + The query_formats method should set, for each input and each output links, + the list of supported formats. + + For video links, that means pixel format. For audio links, that means + channel layout, sample format (the sample packing is implied by the sample + format) and sample rate. + + The lists are not just lists, they are references to shared objects. When + the negotiation mechanism computes the intersection of the formats + supported at each end of a link, all references to both lists are replaced + with a reference to the intersection. And when a single format is + eventually chosen for a link amongst the remaining list, again, all + references to the list are updated. + + That means that if a filter requires that its input and output have the + same format amongst a supported list, all it has to do is use a reference + to the same list of formats. + + query_formats can leave some formats unset and return AVERROR(EAGAIN) to + cause the negotiation mechanism to try again later. That can be used by + filters with complex requirements to use the format negotiated on one link + to set the formats supported on another. + + +Buffer references ownership and permissions +=========================================== + + Principle + --------- + + Audio and video data are voluminous; the buffer and buffer reference + mechanism is intended to avoid, as much as possible, expensive copies of + that data while still allowing the filters to produce correct results. + + The data is stored in buffers represented by AVFilterBuffer structures. + They must not be accessed directly, but through references stored in + AVFilterBufferRef structures. Several references can point to the + same buffer; the buffer is automatically deallocated once all + corresponding references have been destroyed. + + The characteristics of the data (resolution, sample rate, etc.) are + stored in the reference; different references for the same buffer can + show different characteristics. In particular, a video reference can + point to only a part of a video buffer. + + A reference is usually obtained as input to the start_frame or + filter_frame method or requested using the ff_get_video_buffer or + ff_get_audio_buffer functions. A new reference on an existing buffer can + be created with the avfilter_ref_buffer. A reference is destroyed using + the avfilter_unref_bufferp function. + + Reference ownership + ------------------- + + At any time, a reference “belongs” to a particular piece of code, + usually a filter. With a few caveats that will be explained below, only + that piece of code is allowed to access it. It is also responsible for + destroying it, although this is sometimes done automatically (see the + section on link reference fields). + + Here are the (fairly obvious) rules for reference ownership: + + * A reference received by the filter_frame method (or its start_frame + deprecated version) belongs to the corresponding filter. + + Special exception: for video references: the reference may be used + internally for automatic copying and must not be destroyed before + end_frame; it can be given away to ff_start_frame. + + * A reference passed to ff_filter_frame (or the deprecated + ff_start_frame) is given away and must no longer be used. + + * A reference created with avfilter_ref_buffer belongs to the code that + created it. + + * A reference obtained with ff_get_video_buffer or ff_get_audio_buffer + belongs to the code that requested it. + + * A reference given as return value by the get_video_buffer or + get_audio_buffer method is given away and must no longer be used. + + Link reference fields + --------------------- + + The AVFilterLink structure has a few AVFilterBufferRef fields. The + cur_buf and out_buf were used with the deprecated + start_frame/draw_slice/end_frame API and should no longer be used. + src_buf and partial_buf are used by libavfilter internally + and must not be accessed by filters. + + Reference permissions + --------------------- + + The AVFilterBufferRef structure has a perms field that describes what + the code that owns the reference is allowed to do to the buffer data. + Different references for the same buffer can have different permissions. + + For video filters that implement the deprecated + start_frame/draw_slice/end_frame API, the permissions only apply to the + parts of the buffer that have already been covered by the draw_slice + method. + + The value is a binary OR of the following constants: + + * AV_PERM_READ: the owner can read the buffer data; this is essentially + always true and is there for self-documentation. + + * AV_PERM_WRITE: the owner can modify the buffer data. + + * AV_PERM_PRESERVE: the owner can rely on the fact that the buffer data + will not be modified by previous filters. + + * AV_PERM_REUSE: the owner can output the buffer several times, without + modifying the data in between. + + * AV_PERM_REUSE2: the owner can output the buffer several times and + modify the data in between (useless without the WRITE permissions). + + * AV_PERM_ALIGN: the owner can access the data using fast operations + that require data alignment. + + The READ, WRITE and PRESERVE permissions are about sharing the same + buffer between several filters to avoid expensive copies without them + doing conflicting changes on the data. + + The REUSE and REUSE2 permissions are about special memory for direct + rendering. For example a buffer directly allocated in video memory must + not modified once it is displayed on screen, or it will cause tearing; + it will therefore not have the REUSE2 permission. + + The ALIGN permission is about extracting part of the buffer, for + copy-less padding or cropping for example. + + + References received on input pads are guaranteed to have all the + permissions stated in the min_perms field and none of the permissions + stated in the rej_perms. + + References obtained by ff_get_video_buffer and ff_get_audio_buffer are + guaranteed to have at least all the permissions requested as argument. + + References created by avfilter_ref_buffer have the same permissions as + the original reference minus the ones explicitly masked; the mask is + usually ~0 to keep the same permissions. + + Filters should remove permissions on reference they give to output + whenever necessary. It can be automatically done by setting the + rej_perms field on the output pad. + + Here are a few guidelines corresponding to common situations: + + * Filters that modify and forward their frame (like drawtext) need the + WRITE permission. + + * Filters that read their input to produce a new frame on output (like + scale) need the READ permission on input and must request a buffer + with the WRITE permission. + + * Filters that intend to keep a reference after the filtering process + is finished (after filter_frame returns) must have the PRESERVE + permission on it and remove the WRITE permission if they create a new + reference to give it away. + + * Filters that intend to modify a reference they have kept after the end + of the filtering process need the REUSE2 permission and must remove + the PRESERVE permission if they create a new reference to give it + away. + + +Frame scheduling +================ + + The purpose of these rules is to ensure that frames flow in the filter + graph without getting stuck and accumulating somewhere. + + Simple filters that output one frame for each input frame should not have + to worry about it. + + filter_frame + ------------ + + This method is called when a frame is pushed to the filter's input. It + can be called at any time except in a reentrant way. + + If the input frame is enough to produce output, then the filter should + push the output frames on the output link immediately. + + As an exception to the previous rule, if the input frame is enough to + produce several output frames, then the filter needs output only at + least one per link. The additional frames can be left buffered in the + filter; these buffered frames must be flushed immediately if a new input + produces new output. + + (Example: frame rate-doubling filter: filter_frame must (1) flush the + second copy of the previous frame, if it is still there, (2) push the + first copy of the incoming frame, (3) keep the second copy for later.) + + If the input frame is not enough to produce output, the filter must not + call request_frame to get more. It must just process the frame or queue + it. The task of requesting more frames is left to the filter's + request_frame method or the application. + + If a filter has several inputs, the filter must be ready for frames + arriving randomly on any input. Therefore, any filter with several inputs + will most likely require some kind of queuing mechanism. It is perfectly + acceptable to have a limited queue and to drop frames when the inputs + are too unbalanced. + + request_frame + ------------- + + This method is called when a frame is wanted on an output. + + For an input, it should directly call filter_frame on the corresponding + output. + + For a filter, if there are queued frames already ready, one of these + frames should be pushed. If not, the filter should request a frame on + one of its inputs, repeatedly until at least one frame has been pushed. + + Return values: + if request_frame could produce a frame, or at least make progress + towards producing a frame, it should return 0; + if it could not for temporary reasons, it should return AVERROR(EAGAIN); + if it could not because there are no more frames, it should return + AVERROR_EOF. + + The typical implementation of request_frame for a filter with several + inputs will look like that: + + if (frames_queued) { + push_one_frame(); + return 0; + } + input = input_where_a_frame_is_most_needed(); + ret = ff_request_frame(input); + if (ret == AVERROR_EOF) { + process_eof_on_input(); + } else if (ret < 0) { + return ret; + } + return 0; + + Note that, except for filters that can have queued frames, request_frame + does not push frames: it requests them to its input, and as a reaction, + the filter_frame method possibly will be called and do the work. + +Legacy API +========== + + Until libavfilter 3.23, the filter_frame method was split: + + - for video filters, it was made of start_frame, draw_slice (that could be + called several times on distinct parts of the frame) and end_frame; + + - for audio filters, it was called filter_samples.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/filters.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/filters.texi new file mode 100644 index 0000000..68f54f1 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/filters.texi
@@ -0,0 +1,15900 @@ +@chapter Filtering Introduction +@c man begin FILTERING INTRODUCTION + +Filtering in FFmpeg is enabled through the libavfilter library. + +In libavfilter, a filter can have multiple inputs and multiple +outputs. +To illustrate the sorts of things that are possible, we consider the +following filtergraph. + +@verbatim + [main] +input --> split ---------------------> overlay --> output + | ^ + |[tmp] [flip]| + +-----> crop --> vflip -------+ +@end verbatim + +This filtergraph splits the input stream in two streams, then sends one +stream through the crop filter and the vflip filter, before merging it +back with the other stream by overlaying it on top. You can use the +following command to achieve this: + +@example +ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT +@end example + +The result will be that the top half of the video is mirrored +onto the bottom half of the output video. + +Filters in the same linear chain are separated by commas, and distinct +linear chains of filters are separated by semicolons. In our example, +@var{crop,vflip} are in one linear chain, @var{split} and +@var{overlay} are separately in another. The points where the linear +chains join are labelled by names enclosed in square brackets. In the +example, the split filter generates two outputs that are associated to +the labels @var{[main]} and @var{[tmp]}. + +The stream sent to the second output of @var{split}, labelled as +@var{[tmp]}, is processed through the @var{crop} filter, which crops +away the lower half part of the video, and then vertically flipped. The +@var{overlay} filter takes in input the first unchanged output of the +split filter (which was labelled as @var{[main]}), and overlay on its +lower half the output generated by the @var{crop,vflip} filterchain. + +Some filters take in input a list of parameters: they are specified +after the filter name and an equal sign, and are separated from each other +by a colon. + +There exist so-called @var{source filters} that do not have an +audio/video input, and @var{sink filters} that will not have audio/video +output. + +@c man end FILTERING INTRODUCTION + +@chapter graph2dot +@c man begin GRAPH2DOT + +The @file{graph2dot} program included in the FFmpeg @file{tools} +directory can be used to parse a filtergraph description and issue a +corresponding textual representation in the dot language. + +Invoke the command: +@example +graph2dot -h +@end example + +to see how to use @file{graph2dot}. + +You can then pass the dot description to the @file{dot} program (from +the graphviz suite of programs) and obtain a graphical representation +of the filtergraph. + +For example the sequence of commands: +@example +echo @var{GRAPH_DESCRIPTION} | \ +tools/graph2dot -o graph.tmp && \ +dot -Tpng graph.tmp -o graph.png && \ +display graph.png +@end example + +can be used to create and display an image representing the graph +described by the @var{GRAPH_DESCRIPTION} string. Note that this string must be +a complete self-contained graph, with its inputs and outputs explicitly defined. +For example if your command line is of the form: +@example +ffmpeg -i infile -vf scale=640:360 outfile +@end example +your @var{GRAPH_DESCRIPTION} string will need to be of the form: +@example +nullsrc,scale=640:360,nullsink +@end example +you may also need to set the @var{nullsrc} parameters and add a @var{format} +filter in order to simulate a specific input file. + +@c man end GRAPH2DOT + +@chapter Filtergraph description +@c man begin FILTERGRAPH DESCRIPTION + +A filtergraph is a directed graph of connected filters. It can contain +cycles, and there can be multiple links between a pair of +filters. Each link has one input pad on one side connecting it to one +filter from which it takes its input, and one output pad on the other +side connecting it to one filter accepting its output. + +Each filter in a filtergraph is an instance of a filter class +registered in the application, which defines the features and the +number of input and output pads of the filter. + +A filter with no input pads is called a "source", and a filter with no +output pads is called a "sink". + +@anchor{Filtergraph syntax} +@section Filtergraph syntax + +A filtergraph has a textual representation, which is recognized by the +@option{-filter}/@option{-vf}/@option{-af} and +@option{-filter_complex} options in @command{ffmpeg} and +@option{-vf}/@option{-af} in @command{ffplay}, and by the +@code{avfilter_graph_parse_ptr()} function defined in +@file{libavfilter/avfilter.h}. + +A filterchain consists of a sequence of connected filters, each one +connected to the previous one in the sequence. A filterchain is +represented by a list of ","-separated filter descriptions. + +A filtergraph consists of a sequence of filterchains. A sequence of +filterchains is represented by a list of ";"-separated filterchain +descriptions. + +A filter is represented by a string of the form: +[@var{in_link_1}]...[@var{in_link_N}]@var{filter_name}=@var{arguments}[@var{out_link_1}]...[@var{out_link_M}] + +@var{filter_name} is the name of the filter class of which the +described filter is an instance of, and has to be the name of one of +the filter classes registered in the program. +The name of the filter class is optionally followed by a string +"=@var{arguments}". + +@var{arguments} is a string which contains the parameters used to +initialize the filter instance. It may have one of two forms: +@itemize + +@item +A ':'-separated list of @var{key=value} pairs. + +@item +A ':'-separated list of @var{value}. In this case, the keys are assumed to be +the option names in the order they are declared. E.g. the @code{fade} filter +declares three options in this order -- @option{type}, @option{start_frame} and +@option{nb_frames}. Then the parameter list @var{in:0:30} means that the value +@var{in} is assigned to the option @option{type}, @var{0} to +@option{start_frame} and @var{30} to @option{nb_frames}. + +@item +A ':'-separated list of mixed direct @var{value} and long @var{key=value} +pairs. The direct @var{value} must precede the @var{key=value} pairs, and +follow the same constraints order of the previous point. The following +@var{key=value} pairs can be set in any preferred order. + +@end itemize + +If the option value itself is a list of items (e.g. the @code{format} filter +takes a list of pixel formats), the items in the list are usually separated by +@samp{|}. + +The list of arguments can be quoted using the character @samp{'} as initial +and ending mark, and the character @samp{\} for escaping the characters +within the quoted text; otherwise the argument string is considered +terminated when the next special character (belonging to the set +@samp{[]=;,}) is encountered. + +The name and arguments of the filter are optionally preceded and +followed by a list of link labels. +A link label allows one to name a link and associate it to a filter output +or input pad. The preceding labels @var{in_link_1} +... @var{in_link_N}, are associated to the filter input pads, +the following labels @var{out_link_1} ... @var{out_link_M}, are +associated to the output pads. + +When two link labels with the same name are found in the +filtergraph, a link between the corresponding input and output pad is +created. + +If an output pad is not labelled, it is linked by default to the first +unlabelled input pad of the next filter in the filterchain. +For example in the filterchain +@example +nullsrc, split[L1], [L2]overlay, nullsink +@end example +the split filter instance has two output pads, and the overlay filter +instance two input pads. The first output pad of split is labelled +"L1", the first input pad of overlay is labelled "L2", and the second +output pad of split is linked to the second input pad of overlay, +which are both unlabelled. + +In a filter description, if the input label of the first filter is not +specified, "in" is assumed; if the output label of the last filter is not +specified, "out" is assumed. + +In a complete filterchain all the unlabelled filter input and output +pads must be connected. A filtergraph is considered valid if all the +filter input and output pads of all the filterchains are connected. + +Libavfilter will automatically insert @ref{scale} filters where format +conversion is required. It is possible to specify swscale flags +for those automatically inserted scalers by prepending +@code{sws_flags=@var{flags};} +to the filtergraph description. + +Here is a BNF description of the filtergraph syntax: +@example +@var{NAME} ::= sequence of alphanumeric characters and '_' +@var{LINKLABEL} ::= "[" @var{NAME} "]" +@var{LINKLABELS} ::= @var{LINKLABEL} [@var{LINKLABELS}] +@var{FILTER_ARGUMENTS} ::= sequence of chars (possibly quoted) +@var{FILTER} ::= [@var{LINKLABELS}] @var{NAME} ["=" @var{FILTER_ARGUMENTS}] [@var{LINKLABELS}] +@var{FILTERCHAIN} ::= @var{FILTER} [,@var{FILTERCHAIN}] +@var{FILTERGRAPH} ::= [sws_flags=@var{flags};] @var{FILTERCHAIN} [;@var{FILTERGRAPH}] +@end example + +@section Notes on filtergraph escaping + +Filtergraph description composition entails several levels of +escaping. See @ref{quoting_and_escaping,,the "Quoting and escaping" +section in the ffmpeg-utils(1) manual,ffmpeg-utils} for more +information about the employed escaping procedure. + +A first level escaping affects the content of each filter option +value, which may contain the special character @code{:} used to +separate values, or one of the escaping characters @code{\'}. + +A second level escaping affects the whole filter description, which +may contain the escaping characters @code{\'} or the special +characters @code{[],;} used by the filtergraph description. + +Finally, when you specify a filtergraph on a shell commandline, you +need to perform a third level escaping for the shell special +characters contained within it. + +For example, consider the following string to be embedded in +the @ref{drawtext} filter description @option{text} value: +@example +this is a 'string': may contain one, or more, special characters +@end example + +This string contains the @code{'} special escaping character, and the +@code{:} special character, so it needs to be escaped in this way: +@example +text=this is a \'string\'\: may contain one, or more, special characters +@end example + +A second level of escaping is required when embedding the filter +description in a filtergraph description, in order to escape all the +filtergraph special characters. Thus the example above becomes: +@example +drawtext=text=this is a \\\'string\\\'\\: may contain one\, or more\, special characters +@end example +(note that in addition to the @code{\'} escaping special characters, +also @code{,} needs to be escaped). + +Finally an additional level of escaping is needed when writing the +filtergraph description in a shell command, which depends on the +escaping rules of the adopted shell. For example, assuming that +@code{\} is special and needs to be escaped with another @code{\}, the +previous string will finally result in: +@example +-vf "drawtext=text=this is a \\\\\\'string\\\\\\'\\\\: may contain one\\, or more\\, special characters" +@end example + +@chapter Timeline editing + +Some filters support a generic @option{enable} option. For the filters +supporting timeline editing, this option can be set to an expression which is +evaluated before sending a frame to the filter. If the evaluation is non-zero, +the filter will be enabled, otherwise the frame will be sent unchanged to the +next filter in the filtergraph. + +The expression accepts the following values: +@table @samp +@item t +timestamp expressed in seconds, NAN if the input timestamp is unknown + +@item n +sequential number of the input frame, starting from 0 + +@item pos +the position in the file of the input frame, NAN if unknown + +@item w +@item h +width and height of the input frame if video +@end table + +Additionally, these filters support an @option{enable} command that can be used +to re-define the expression. + +Like any other filtering option, the @option{enable} option follows the same +rules. + +For example, to enable a blur filter (@ref{smartblur}) from 10 seconds to 3 +minutes, and a @ref{curves} filter starting at 3 seconds: +@example +smartblur = enable='between(t,10,3*60)', +curves = enable='gte(t,3)' : preset=cross_process +@end example + +@c man end FILTERGRAPH DESCRIPTION + +@chapter Audio Filters +@c man begin AUDIO FILTERS + +When you configure your FFmpeg build, you can disable any of the +existing filters using @code{--disable-filters}. +The configure output will show the audio filters included in your +build. + +Below is a description of the currently available audio filters. + +@section acompressor + +A compressor is mainly used to reduce the dynamic range of a signal. +Especially modern music is mostly compressed at a high ratio to +improve the overall loudness. It's done to get the highest attention +of a listener, "fatten" the sound and bring more "power" to the track. +If a signal is compressed too much it may sound dull or "dead" +afterwards or it may start to "pump" (which could be a powerful effect +but can also destroy a track completely). +The right compression is the key to reach a professional sound and is +the high art of mixing and mastering. Because of its complex settings +it may take a long time to get the right feeling for this kind of effect. + +Compression is done by detecting the volume above a chosen level +@code{threshold} and dividing it by the factor set with @code{ratio}. +So if you set the threshold to -12dB and your signal reaches -6dB a ratio +of 2:1 will result in a signal at -9dB. Because an exact manipulation of +the signal would cause distortion of the waveform the reduction can be +levelled over the time. This is done by setting "Attack" and "Release". +@code{attack} determines how long the signal has to rise above the threshold +before any reduction will occur and @code{release} sets the time the signal +has to fall below the threshold to reduce the reduction again. Shorter signals +than the chosen attack time will be left untouched. +The overall reduction of the signal can be made up afterwards with the +@code{makeup} setting. So compressing the peaks of a signal about 6dB and +raising the makeup to this level results in a signal twice as loud than the +source. To gain a softer entry in the compression the @code{knee} flattens the +hard edge at the threshold in the range of the chosen decibels. + +The filter accepts the following options: + +@table @option +@item level_in +Set input gain. Default is 1. Range is between 0.015625 and 64. + +@item threshold +If a signal of second stream rises above this level it will affect the gain +reduction of the first stream. +By default it is 0.125. Range is between 0.00097563 and 1. + +@item ratio +Set a ratio by which the signal is reduced. 1:2 means that if the level +rose 4dB above the threshold, it will be only 2dB above after the reduction. +Default is 2. Range is between 1 and 20. + +@item attack +Amount of milliseconds the signal has to rise above the threshold before gain +reduction starts. Default is 20. Range is between 0.01 and 2000. + +@item release +Amount of milliseconds the signal has to fall below the threshold before +reduction is decreased again. Default is 250. Range is between 0.01 and 9000. + +@item makeup +Set the amount by how much signal will be amplified after processing. +Default is 2. Range is from 1 and 64. + +@item knee +Curve the sharp knee around the threshold to enter gain reduction more softly. +Default is 2.82843. Range is between 1 and 8. + +@item link +Choose if the @code{average} level between all channels of input stream +or the louder(@code{maximum}) channel of input stream affects the +reduction. Default is @code{average}. + +@item detection +Should the exact signal be taken in case of @code{peak} or an RMS one in case +of @code{rms}. Default is @code{rms} which is mostly smoother. + +@item mix +How much to use compressed signal in output. Default is 1. +Range is between 0 and 1. +@end table + +@section acrossfade + +Apply cross fade from one input audio stream to another input audio stream. +The cross fade is applied for specified duration near the end of first stream. + +The filter accepts the following options: + +@table @option +@item nb_samples, ns +Specify the number of samples for which the cross fade effect has to last. +At the end of the cross fade effect the first input audio will be completely +silent. Default is 44100. + +@item duration, d +Specify the duration of the cross fade effect. See +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. +By default the duration is determined by @var{nb_samples}. +If set this option is used instead of @var{nb_samples}. + +@item overlap, o +Should first stream end overlap with second stream start. Default is enabled. + +@item curve1 +Set curve for cross fade transition for first stream. + +@item curve2 +Set curve for cross fade transition for second stream. + +For description of available curve types see @ref{afade} filter description. +@end table + +@subsection Examples + +@itemize +@item +Cross fade from one input to another: +@example +ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:c1=exp:c2=exp output.flac +@end example + +@item +Cross fade from one input to another but without overlapping: +@example +ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:o=0:c1=exp:c2=exp output.flac +@end example +@end itemize + +@section adelay + +Delay one or more audio channels. + +Samples in delayed channel are filled with silence. + +The filter accepts the following option: + +@table @option +@item delays +Set list of delays in milliseconds for each channel separated by '|'. +At least one delay greater than 0 should be provided. +Unused delays will be silently ignored. If number of given delays is +smaller than number of channels all remaining channels will not be delayed. +@end table + +@subsection Examples + +@itemize +@item +Delay first channel by 1.5 seconds, the third channel by 0.5 seconds and leave +the second channel (and any other channels that may be present) unchanged. +@example +adelay=1500|0|500 +@end example +@end itemize + +@section aecho + +Apply echoing to the input audio. + +Echoes are reflected sound and can occur naturally amongst mountains +(and sometimes large buildings) when talking or shouting; digital echo +effects emulate this behaviour and are often used to help fill out the +sound of a single instrument or vocal. The time difference between the +original signal and the reflection is the @code{delay}, and the +loudness of the reflected signal is the @code{decay}. +Multiple echoes can have different delays and decays. + +A description of the accepted parameters follows. + +@table @option +@item in_gain +Set input gain of reflected signal. Default is @code{0.6}. + +@item out_gain +Set output gain of reflected signal. Default is @code{0.3}. + +@item delays +Set list of time intervals in milliseconds between original signal and reflections +separated by '|'. Allowed range for each @code{delay} is @code{(0 - 90000.0]}. +Default is @code{1000}. + +@item decays +Set list of loudnesses of reflected signals separated by '|'. +Allowed range for each @code{decay} is @code{(0 - 1.0]}. +Default is @code{0.5}. +@end table + +@subsection Examples + +@itemize +@item +Make it sound as if there are twice as many instruments as are actually playing: +@example +aecho=0.8:0.88:60:0.4 +@end example + +@item +If delay is very short, then it sound like a (metallic) robot playing music: +@example +aecho=0.8:0.88:6:0.4 +@end example + +@item +A longer delay will sound like an open air concert in the mountains: +@example +aecho=0.8:0.9:1000:0.3 +@end example + +@item +Same as above but with one more mountain: +@example +aecho=0.8:0.9:1000|1800:0.3|0.25 +@end example +@end itemize + +@section aemphasis +Audio emphasis filter creates or restores material directly taken from LPs or +emphased CDs with different filter curves. E.g. to store music on vinyl the +signal has to be altered by a filter first to even out the disadvantages of +this recording medium. +Once the material is played back the inverse filter has to be applied to +restore the distortion of the frequency response. + +The filter accepts the following options: + +@table @option +@item level_in +Set input gain. + +@item level_out +Set output gain. + +@item mode +Set filter mode. For restoring material use @code{reproduction} mode, otherwise +use @code{production} mode. Default is @code{reproduction} mode. + +@item type +Set filter type. Selects medium. Can be one of the following: + +@table @option +@item col +select Columbia. +@item emi +select EMI. +@item bsi +select BSI (78RPM). +@item riaa +select RIAA. +@item cd +select Compact Disc (CD). +@item 50fm +select 50µs (FM). +@item 75fm +select 75µs (FM). +@item 50kf +select 50µs (FM-KF). +@item 75kf +select 75µs (FM-KF). +@end table +@end table + +@section aeval + +Modify an audio signal according to the specified expressions. + +This filter accepts one or more expressions (one for each channel), +which are evaluated and used to modify a corresponding audio signal. + +It accepts the following parameters: + +@table @option +@item exprs +Set the '|'-separated expressions list for each separate channel. If +the number of input channels is greater than the number of +expressions, the last specified expression is used for the remaining +output channels. + +@item channel_layout, c +Set output channel layout. If not specified, the channel layout is +specified by the number of expressions. If set to @samp{same}, it will +use by default the same input channel layout. +@end table + +Each expression in @var{exprs} can contain the following constants and functions: + +@table @option +@item ch +channel number of the current expression + +@item n +number of the evaluated sample, starting from 0 + +@item s +sample rate + +@item t +time of the evaluated sample expressed in seconds + +@item nb_in_channels +@item nb_out_channels +input and output number of channels + +@item val(CH) +the value of input channel with number @var{CH} +@end table + +Note: this filter is slow. For faster processing you should use a +dedicated filter. + +@subsection Examples + +@itemize +@item +Half volume: +@example +aeval=val(ch)/2:c=same +@end example + +@item +Invert phase of the second channel: +@example +aeval=val(0)|-val(1) +@end example +@end itemize + +@anchor{afade} +@section afade + +Apply fade-in/out effect to input audio. + +A description of the accepted parameters follows. + +@table @option +@item type, t +Specify the effect type, can be either @code{in} for fade-in, or +@code{out} for a fade-out effect. Default is @code{in}. + +@item start_sample, ss +Specify the number of the start sample for starting to apply the fade +effect. Default is 0. + +@item nb_samples, ns +Specify the number of samples for which the fade effect has to last. At +the end of the fade-in effect the output audio will have the same +volume as the input audio, at the end of the fade-out transition +the output audio will be silence. Default is 44100. + +@item start_time, st +Specify the start time of the fade effect. Default is 0. +The value must be specified as a time duration; see +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. +If set this option is used instead of @var{start_sample}. + +@item duration, d +Specify the duration of the fade effect. See +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. +At the end of the fade-in effect the output audio will have the same +volume as the input audio, at the end of the fade-out transition +the output audio will be silence. +By default the duration is determined by @var{nb_samples}. +If set this option is used instead of @var{nb_samples}. + +@item curve +Set curve for fade transition. + +It accepts the following values: +@table @option +@item tri +select triangular, linear slope (default) +@item qsin +select quarter of sine wave +@item hsin +select half of sine wave +@item esin +select exponential sine wave +@item log +select logarithmic +@item ipar +select inverted parabola +@item qua +select quadratic +@item cub +select cubic +@item squ +select square root +@item cbr +select cubic root +@item par +select parabola +@item exp +select exponential +@item iqsin +select inverted quarter of sine wave +@item ihsin +select inverted half of sine wave +@item dese +select double-exponential seat +@item desi +select double-exponential sigmoid +@end table +@end table + +@subsection Examples + +@itemize +@item +Fade in first 15 seconds of audio: +@example +afade=t=in:ss=0:d=15 +@end example + +@item +Fade out last 25 seconds of a 900 seconds audio: +@example +afade=t=out:st=875:d=25 +@end example +@end itemize + +@section afftfilt +Apply arbitrary expressions to samples in frequency domain. + +@table @option +@item real +Set frequency domain real expression for each separate channel separated +by '|'. Default is "1". +If the number of input channels is greater than the number of +expressions, the last specified expression is used for the remaining +output channels. + +@item imag +Set frequency domain imaginary expression for each separate channel +separated by '|'. If not set, @var{real} option is used. + +Each expression in @var{real} and @var{imag} can contain the following +constants: + +@table @option +@item sr +sample rate + +@item b +current frequency bin number + +@item nb +number of available bins + +@item ch +channel number of the current expression + +@item chs +number of channels + +@item pts +current frame pts +@end table + +@item win_size +Set window size. + +It accepts the following values: +@table @samp +@item w16 +@item w32 +@item w64 +@item w128 +@item w256 +@item w512 +@item w1024 +@item w2048 +@item w4096 +@item w8192 +@item w16384 +@item w32768 +@item w65536 +@end table +Default is @code{w4096} + +@item win_func +Set window function. Default is @code{hann}. + +@item overlap +Set window overlap. If set to 1, the recommended overlap for selected +window function will be picked. Default is @code{0.75}. +@end table + +@subsection Examples + +@itemize +@item +Leave almost only low frequencies in audio: +@example +afftfilt="1-clip((b/nb)*b,0,1)" +@end example +@end itemize + +@anchor{aformat} +@section aformat + +Set output format constraints for the input audio. The framework will +negotiate the most appropriate format to minimize conversions. + +It accepts the following parameters: +@table @option + +@item sample_fmts +A '|'-separated list of requested sample formats. + +@item sample_rates +A '|'-separated list of requested sample rates. + +@item channel_layouts +A '|'-separated list of requested channel layouts. + +See @ref{channel layout syntax,,the Channel Layout section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the required syntax. +@end table + +If a parameter is omitted, all values are allowed. + +Force the output to either unsigned 8-bit or signed 16-bit stereo +@example +aformat=sample_fmts=u8|s16:channel_layouts=stereo +@end example + +@section agate + +A gate is mainly used to reduce lower parts of a signal. This kind of signal +processing reduces disturbing noise between useful signals. + +Gating is done by detecting the volume below a chosen level @var{threshold} +and divide it by the factor set with @var{ratio}. The bottom of the noise +floor is set via @var{range}. Because an exact manipulation of the signal +would cause distortion of the waveform the reduction can be levelled over +time. This is done by setting @var{attack} and @var{release}. + +@var{attack} determines how long the signal has to fall below the threshold +before any reduction will occur and @var{release} sets the time the signal +has to raise above the threshold to reduce the reduction again. +Shorter signals than the chosen attack time will be left untouched. + +@table @option +@item level_in +Set input level before filtering. +Default is 1. Allowed range is from 0.015625 to 64. + +@item range +Set the level of gain reduction when the signal is below the threshold. +Default is 0.06125. Allowed range is from 0 to 1. + +@item threshold +If a signal rises above this level the gain reduction is released. +Default is 0.125. Allowed range is from 0 to 1. + +@item ratio +Set a ratio about which the signal is reduced. +Default is 2. Allowed range is from 1 to 9000. + +@item attack +Amount of milliseconds the signal has to rise above the threshold before gain +reduction stops. +Default is 20 milliseconds. Allowed range is from 0.01 to 9000. + +@item release +Amount of milliseconds the signal has to fall below the threshold before the +reduction is increased again. Default is 250 milliseconds. +Allowed range is from 0.01 to 9000. + +@item makeup +Set amount of amplification of signal after processing. +Default is 1. Allowed range is from 1 to 64. + +@item knee +Curve the sharp knee around the threshold to enter gain reduction more softly. +Default is 2.828427125. Allowed range is from 1 to 8. + +@item detection +Choose if exact signal should be taken for detection or an RMS like one. +Default is rms. Can be peak or rms. + +@item link +Choose if the average level between all channels or the louder channel affects +the reduction. +Default is average. Can be average or maximum. +@end table + +@section alimiter + +The limiter prevents input signal from raising over a desired threshold. +This limiter uses lookahead technology to prevent your signal from distorting. +It means that there is a small delay after signal is processed. Keep in mind +that the delay it produces is the attack time you set. + +The filter accepts the following options: + +@table @option +@item level_in +Set input gain. Default is 1. + +@item level_out +Set output gain. Default is 1. + +@item limit +Don't let signals above this level pass the limiter. Default is 1. + +@item attack +The limiter will reach its attenuation level in this amount of time in +milliseconds. Default is 5 milliseconds. + +@item release +Come back from limiting to attenuation 1.0 in this amount of milliseconds. +Default is 50 milliseconds. + +@item asc +When gain reduction is always needed ASC takes care of releasing to an +average reduction level rather than reaching a reduction of 0 in the release +time. + +@item asc_level +Select how much the release time is affected by ASC, 0 means nearly no changes +in release time while 1 produces higher release times. + +@item level +Auto level output signal. Default is enabled. +This normalizes audio back to 0dB if enabled. +@end table + +Depending on picked setting it is recommended to upsample input 2x or 4x times +with @ref{aresample} before applying this filter. + +@section allpass + +Apply a two-pole all-pass filter with central frequency (in Hz) +@var{frequency}, and filter-width @var{width}. +An all-pass filter changes the audio's frequency to phase relationship +without changing its frequency to amplitude relationship. + +The filter accepts the following options: + +@table @option +@item frequency, f +Set frequency in Hz. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Specify the band-width of a filter in width_type units. +@end table + +@anchor{amerge} +@section amerge + +Merge two or more audio streams into a single multi-channel stream. + +The filter accepts the following options: + +@table @option + +@item inputs +Set the number of inputs. Default is 2. + +@end table + +If the channel layouts of the inputs are disjoint, and therefore compatible, +the channel layout of the output will be set accordingly and the channels +will be reordered as necessary. If the channel layouts of the inputs are not +disjoint, the output will have all the channels of the first input then all +the channels of the second input, in that order, and the channel layout of +the output will be the default value corresponding to the total number of +channels. + +For example, if the first input is in 2.1 (FL+FR+LF) and the second input +is FC+BL+BR, then the output will be in 5.1, with the channels in the +following order: a1, a2, b1, a3, b2, b3 (a1 is the first channel of the +first input, b1 is the first channel of the second input). + +On the other hand, if both input are in stereo, the output channels will be +in the default order: a1, a2, b1, b2, and the channel layout will be +arbitrarily set to 4.0, which may or may not be the expected value. + +All inputs must have the same sample rate, and format. + +If inputs do not have the same duration, the output will stop with the +shortest. + +@subsection Examples + +@itemize +@item +Merge two mono files into a stereo stream: +@example +amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge +@end example + +@item +Multiple merges assuming 1 video stream and 6 audio streams in @file{input.mkv}: +@example +ffmpeg -i input.mkv -filter_complex "[0:1][0:2][0:3][0:4][0:5][0:6] amerge=inputs=6" -c:a pcm_s16le output.mkv +@end example +@end itemize + +@section amix + +Mixes multiple audio inputs into a single output. + +Note that this filter only supports float samples (the @var{amerge} +and @var{pan} audio filters support many formats). If the @var{amix} +input has integer samples then @ref{aresample} will be automatically +inserted to perform the conversion to float samples. + +For example +@example +ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT +@end example +will mix 3 input audio streams to a single output with the same duration as the +first input and a dropout transition time of 3 seconds. + +It accepts the following parameters: +@table @option + +@item inputs +The number of inputs. If unspecified, it defaults to 2. + +@item duration +How to determine the end-of-stream. +@table @option + +@item longest +The duration of the longest input. (default) + +@item shortest +The duration of the shortest input. + +@item first +The duration of the first input. + +@end table + +@item dropout_transition +The transition time, in seconds, for volume renormalization when an input +stream ends. The default value is 2 seconds. + +@end table + +@section anequalizer + +High-order parametric multiband equalizer for each channel. + +It accepts the following parameters: +@table @option +@item params + +This option string is in format: +"c@var{chn} f=@var{cf} w=@var{w} g=@var{g} t=@var{f} | ..." +Each equalizer band is separated by '|'. + +@table @option +@item chn +Set channel number to which equalization will be applied. +If input doesn't have that channel the entry is ignored. + +@item cf +Set central frequency for band. +If input doesn't have that frequency the entry is ignored. + +@item w +Set band width in hertz. + +@item g +Set band gain in dB. + +@item f +Set filter type for band, optional, can be: + +@table @samp +@item 0 +Butterworth, this is default. + +@item 1 +Chebyshev type 1. + +@item 2 +Chebyshev type 2. +@end table +@end table + +@item curves +With this option activated frequency response of anequalizer is displayed +in video stream. + +@item size +Set video stream size. Only useful if curves option is activated. + +@item mgain +Set max gain that will be displayed. Only useful if curves option is activated. +Setting this to reasonable value allows to display gain which is derived from +neighbour bands which are too close to each other and thus produce higher gain +when both are activated. + +@item fscale +Set frequency scale used to draw frequency response in video output. +Can be linear or logarithmic. Default is logarithmic. + +@item colors +Set color for each channel curve which is going to be displayed in video stream. +This is list of color names separated by space or by '|'. +Unrecognised or missing colors will be replaced by white color. +@end table + +@subsection Examples + +@itemize +@item +Lower gain by 10 of central frequency 200Hz and width 100 Hz +for first 2 channels using Chebyshev type 1 filter: +@example +anequalizer=c0 f=200 w=100 g=-10 t=1|c1 f=200 w=100 g=-10 t=1 +@end example +@end itemize + +@subsection Commands + +This filter supports the following commands: +@table @option +@item change +Alter existing filter parameters. +Syntax for the commands is : "@var{fN}|f=@var{freq}|w=@var{width}|g=@var{gain}" + +@var{fN} is existing filter number, starting from 0, if no such filter is available +error is returned. +@var{freq} set new frequency parameter. +@var{width} set new width parameter in herz. +@var{gain} set new gain parameter in dB. + +Full filter invocation with asendcmd may look like this: +asendcmd=c='4.0 anequalizer change 0|f=200|w=50|g=1',anequalizer=... +@end table + +@section anull + +Pass the audio source unchanged to the output. + +@section apad + +Pad the end of an audio stream with silence. + +This can be used together with @command{ffmpeg} @option{-shortest} to +extend audio streams to the same length as the video stream. + +A description of the accepted options follows. + +@table @option +@item packet_size +Set silence packet size. Default value is 4096. + +@item pad_len +Set the number of samples of silence to add to the end. After the +value is reached, the stream is terminated. This option is mutually +exclusive with @option{whole_len}. + +@item whole_len +Set the minimum total number of samples in the output audio stream. If +the value is longer than the input audio length, silence is added to +the end, until the value is reached. This option is mutually exclusive +with @option{pad_len}. +@end table + +If neither the @option{pad_len} nor the @option{whole_len} option is +set, the filter will add silence to the end of the input stream +indefinitely. + +@subsection Examples + +@itemize +@item +Add 1024 samples of silence to the end of the input: +@example +apad=pad_len=1024 +@end example + +@item +Make sure the audio output will contain at least 10000 samples, pad +the input with silence if required: +@example +apad=whole_len=10000 +@end example + +@item +Use @command{ffmpeg} to pad the audio input with silence, so that the +video stream will always result the shortest and will be converted +until the end in the output file when using the @option{shortest} +option: +@example +ffmpeg -i VIDEO -i AUDIO -filter_complex "[1:0]apad" -shortest OUTPUT +@end example +@end itemize + +@section aphaser +Add a phasing effect to the input audio. + +A phaser filter creates series of peaks and troughs in the frequency spectrum. +The position of the peaks and troughs are modulated so that they vary over time, creating a sweeping effect. + +A description of the accepted parameters follows. + +@table @option +@item in_gain +Set input gain. Default is 0.4. + +@item out_gain +Set output gain. Default is 0.74 + +@item delay +Set delay in milliseconds. Default is 3.0. + +@item decay +Set decay. Default is 0.4. + +@item speed +Set modulation speed in Hz. Default is 0.5. + +@item type +Set modulation type. Default is triangular. + +It accepts the following values: +@table @samp +@item triangular, t +@item sinusoidal, s +@end table +@end table + +@section apulsator + +Audio pulsator is something between an autopanner and a tremolo. +But it can produce funny stereo effects as well. Pulsator changes the volume +of the left and right channel based on a LFO (low frequency oscillator) with +different waveforms and shifted phases. +This filter have the ability to define an offset between left and right +channel. An offset of 0 means that both LFO shapes match each other. +The left and right channel are altered equally - a conventional tremolo. +An offset of 50% means that the shape of the right channel is exactly shifted +in phase (or moved backwards about half of the frequency) - pulsator acts as +an autopanner. At 1 both curves match again. Every setting in between moves the +phase shift gapless between all stages and produces some "bypassing" sounds with +sine and triangle waveforms. The more you set the offset near 1 (starting from +the 0.5) the faster the signal passes from the left to the right speaker. + +The filter accepts the following options: + +@table @option +@item level_in +Set input gain. By default it is 1. Range is [0.015625 - 64]. + +@item level_out +Set output gain. By default it is 1. Range is [0.015625 - 64]. + +@item mode +Set waveform shape the LFO will use. Can be one of: sine, triangle, square, +sawup or sawdown. Default is sine. + +@item amount +Set modulation. Define how much of original signal is affected by the LFO. + +@item offset_l +Set left channel offset. Default is 0. Allowed range is [0 - 1]. + +@item offset_r +Set right channel offset. Default is 0.5. Allowed range is [0 - 1]. + +@item width +Set pulse width. Default is 1. Allowed range is [0 - 2]. + +@item timing +Set possible timing mode. Can be one of: bpm, ms or hz. Default is hz. + +@item bpm +Set bpm. Default is 120. Allowed range is [30 - 300]. Only used if timing +is set to bpm. + +@item ms +Set ms. Default is 500. Allowed range is [10 - 2000]. Only used if timing +is set to ms. + +@item hz +Set frequency in Hz. Default is 2. Allowed range is [0.01 - 100]. Only used +if timing is set to hz. +@end table + +@anchor{aresample} +@section aresample + +Resample the input audio to the specified parameters, using the +libswresample library. If none are specified then the filter will +automatically convert between its input and output. + +This filter is also able to stretch/squeeze the audio data to make it match +the timestamps or to inject silence / cut out audio to make it match the +timestamps, do a combination of both or do neither. + +The filter accepts the syntax +[@var{sample_rate}:]@var{resampler_options}, where @var{sample_rate} +expresses a sample rate and @var{resampler_options} is a list of +@var{key}=@var{value} pairs, separated by ":". See the +ffmpeg-resampler manual for the complete list of supported options. + +@subsection Examples + +@itemize +@item +Resample the input audio to 44100Hz: +@example +aresample=44100 +@end example + +@item +Stretch/squeeze samples to the given timestamps, with a maximum of 1000 +samples per second compensation: +@example +aresample=async=1000 +@end example +@end itemize + +@section asetnsamples + +Set the number of samples per each output audio frame. + +The last output packet may contain a different number of samples, as +the filter will flush all the remaining samples when the input audio +signal its end. + +The filter accepts the following options: + +@table @option + +@item nb_out_samples, n +Set the number of frames per each output audio frame. 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 frame with zeroes, so +that the last frame will contain the same number of samples as the +previous ones. Default value is 1. +@end table + +For example, to set the number of per-frame samples to 1234 and +disable padding for the last frame, use: +@example +asetnsamples=n=1234:p=0 +@end example + +@section asetrate + +Set the sample rate without altering the PCM data. +This will result in a change of speed and pitch. + +The filter accepts the following options: + +@table @option +@item sample_rate, r +Set the output sample rate. Default is 44100 Hz. +@end table + +@section ashowinfo + +Show a line containing various information for each input audio frame. +The input audio is not modified. + +The shown line contains a sequence of key/value pairs of the form +@var{key}:@var{value}. + +The following values are shown in the output: + +@table @option +@item n +The (sequential) number of the input frame, starting from 0. + +@item pts +The presentation timestamp of the input frame, in time base units; the time base +depends on the filter input pad, and is usually 1/@var{sample_rate}. + +@item pts_time +The presentation timestamp of the input frame in seconds. + +@item pos +position of the frame in the input stream, -1 if this information in +unavailable and/or meaningless (for example in case of synthetic audio) + +@item fmt +The sample format. + +@item chlayout +The channel layout. + +@item rate +The sample rate for the audio frame. + +@item nb_samples +The number of samples (per channel) in the frame. + +@item checksum +The Adler-32 checksum (printed in hexadecimal) of the audio data. For planar +audio, the data is treated as if all the planes were concatenated. + +@item plane_checksums +A list of Adler-32 checksums for each data plane. +@end table + +@anchor{astats} +@section astats + +Display time domain statistical information about the audio channels. +Statistics are calculated and displayed for each audio channel and, +where applicable, an overall figure is also given. + +It accepts the following option: +@table @option +@item length +Short window length in seconds, used for peak and trough RMS measurement. +Default is @code{0.05} (50 milliseconds). Allowed range is @code{[0.1 - 10]}. + +@item metadata + +Set metadata injection. All the metadata keys are prefixed with @code{lavfi.astats.X}, +where @code{X} is channel number starting from 1 or string @code{Overall}. Default is +disabled. + +Available keys for each channel are: +DC_offset +Min_level +Max_level +Min_difference +Max_difference +Mean_difference +Peak_level +RMS_peak +RMS_trough +Crest_factor +Flat_factor +Peak_count +Bit_depth + +and for Overall: +DC_offset +Min_level +Max_level +Min_difference +Max_difference +Mean_difference +Peak_level +RMS_level +RMS_peak +RMS_trough +Flat_factor +Peak_count +Bit_depth +Number_of_samples + +For example full key look like this @code{lavfi.astats.1.DC_offset} or +this @code{lavfi.astats.Overall.Peak_count}. + +For description what each key means read below. + +@item reset +Set number of frame after which stats are going to be recalculated. +Default is disabled. +@end table + +A description of each shown parameter follows: + +@table @option +@item DC offset +Mean amplitude displacement from zero. + +@item Min level +Minimal sample level. + +@item Max level +Maximal sample level. + +@item Min difference +Minimal difference between two consecutive samples. + +@item Max difference +Maximal difference between two consecutive samples. + +@item Mean difference +Mean difference between two consecutive samples. +The average of each difference between two consecutive samples. + +@item Peak level dB +@item RMS level dB +Standard peak and RMS level measured in dBFS. + +@item RMS peak dB +@item RMS trough dB +Peak and trough values for RMS level measured over a short window. + +@item Crest factor +Standard ratio of peak to RMS level (note: not in dB). + +@item Flat factor +Flatness (i.e. consecutive samples with the same value) of the signal at its peak levels +(i.e. either @var{Min level} or @var{Max level}). + +@item Peak count +Number of occasions (not the number of samples) that the signal attained either +@var{Min level} or @var{Max level}. + +@item Bit depth +Overall bit depth of audio. Number of bits used for each sample. +@end table + +@section asyncts + +Synchronize audio data with timestamps by squeezing/stretching it and/or +dropping samples/adding silence when needed. + +This filter is not built by default, please use @ref{aresample} to do squeezing/stretching. + +It accepts the following parameters: +@table @option + +@item compensate +Enable stretching/squeezing the data to make it match the timestamps. Disabled +by default. When disabled, time gaps are covered with silence. + +@item min_delta +The minimum difference between timestamps and audio data (in seconds) to trigger +adding/dropping samples. The default value is 0.1. If you get an imperfect +sync with this filter, try setting this parameter to 0. + +@item max_comp +The maximum compensation in samples per second. Only relevant with compensate=1. +The default value is 500. + +@item first_pts +Assume that the first PTS should be this value. The time base is 1 / sample +rate. This allows for padding/trimming at the start of the stream. By default, +no assumption is made about the first frame's expected PTS, so no padding or +trimming is done. For example, this could be set to 0 to pad the beginning with +silence if an audio stream starts after the video stream or to trim any samples +with a negative PTS due to encoder delay. + +@end table + +@section atempo + +Adjust audio tempo. + +The filter accepts exactly one parameter, the audio tempo. If not +specified then the filter will assume nominal 1.0 tempo. Tempo must +be in the [0.5, 2.0] range. + +@subsection Examples + +@itemize +@item +Slow down audio to 80% tempo: +@example +atempo=0.8 +@end example + +@item +To speed up audio to 125% tempo: +@example +atempo=1.25 +@end example +@end itemize + +@section atrim + +Trim the input so that the output contains one continuous subpart of the input. + +It accepts the following parameters: +@table @option +@item start +Timestamp (in seconds) of the start of the section to keep. I.e. the audio +sample with the timestamp @var{start} will be the first sample in the output. + +@item end +Specify time of the first audio sample that will be dropped, i.e. the +audio sample immediately preceding the one with the timestamp @var{end} will be +the last sample in the output. + +@item start_pts +Same as @var{start}, except this option sets the start timestamp in samples +instead of seconds. + +@item end_pts +Same as @var{end}, except this option sets the end timestamp in samples instead +of seconds. + +@item duration +The maximum duration of the output in seconds. + +@item start_sample +The number of the first sample that should be output. + +@item end_sample +The number of the first sample that should be dropped. +@end table + +@option{start}, @option{end}, and @option{duration} are expressed as time +duration specifications; see +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +Note that the first two sets of the start/end options and the @option{duration} +option look at the frame timestamp, while the _sample options simply count the +samples that pass through the filter. So start/end_pts and start/end_sample will +give different results when the timestamps are wrong, inexact or do not start at +zero. Also note that this filter does not modify the timestamps. If you wish +to have the output timestamps start at zero, insert the asetpts filter after the +atrim filter. + +If multiple start or end options are set, this filter tries to be greedy and +keep all samples that match at least one of the specified constraints. To keep +only the part that matches all the constraints at once, chain multiple atrim +filters. + +The defaults are such that all the input is kept. So it is possible to set e.g. +just the end values to keep everything before the specified time. + +Examples: +@itemize +@item +Drop everything except the second minute of input: +@example +ffmpeg -i INPUT -af atrim=60:120 +@end example + +@item +Keep only the first 1000 samples: +@example +ffmpeg -i INPUT -af atrim=end_sample=1000 +@end example + +@end itemize + +@section bandpass + +Apply a two-pole Butterworth band-pass filter with central +frequency @var{frequency}, and (3dB-point) band-width width. +The @var{csg} option selects a constant skirt gain (peak gain = Q) +instead of the default: constant 0dB peak gain. +The filter roll off at 6dB per octave (20dB per decade). + +The filter accepts the following options: + +@table @option +@item frequency, f +Set the filter's central frequency. Default is @code{3000}. + +@item csg +Constant skirt gain if set to 1. Defaults to 0. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Specify the band-width of a filter in width_type units. +@end table + +@section bandreject + +Apply a two-pole Butterworth band-reject filter with central +frequency @var{frequency}, and (3dB-point) band-width @var{width}. +The filter roll off at 6dB per octave (20dB per decade). + +The filter accepts the following options: + +@table @option +@item frequency, f +Set the filter's central frequency. Default is @code{3000}. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Specify the band-width of a filter in width_type units. +@end table + +@section bass + +Boost or cut the bass (lower) frequencies of the audio using a two-pole +shelving filter with a response similar to that of a standard +hi-fi's tone-controls. This is also known as shelving equalisation (EQ). + +The filter accepts the following options: + +@table @option +@item gain, g +Give the gain at 0 Hz. Its useful range is about -20 +(for a large cut) to +20 (for a large boost). +Beware of clipping when using a positive gain. + +@item frequency, f +Set the filter's central frequency and so can be used +to extend or reduce the frequency range to be boosted or cut. +The default value is @code{100} Hz. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Determine how steep is the filter's shelf transition. +@end table + +@section biquad + +Apply a biquad IIR filter with the given coefficients. +Where @var{b0}, @var{b1}, @var{b2} and @var{a0}, @var{a1}, @var{a2} +are the numerator and denominator coefficients respectively. + +@section bs2b +Bauer stereo to binaural transformation, which improves headphone listening of +stereo audio records. + +It accepts the following parameters: +@table @option + +@item profile +Pre-defined crossfeed level. +@table @option + +@item default +Default level (fcut=700, feed=50). + +@item cmoy +Chu Moy circuit (fcut=700, feed=60). + +@item jmeier +Jan Meier circuit (fcut=650, feed=95). + +@end table + +@item fcut +Cut frequency (in Hz). + +@item feed +Feed level (in Hz). + +@end table + +@section channelmap + +Remap input channels to new locations. + +It accepts the following parameters: +@table @option +@item channel_layout +The channel layout of the output stream. + +@item map +Map channels from input to output. The argument is a '|'-separated list of +mappings, each in the @code{@var{in_channel}-@var{out_channel}} or +@var{in_channel} form. @var{in_channel} can be either the name of the input +channel (e.g. FL for front left) or its index in the input channel layout. +@var{out_channel} is the name of the output channel or its index in the output +channel layout. If @var{out_channel} is not given then it is implicitly an +index, starting with zero and increasing by one for each mapping. +@end table + +If no mapping is present, the filter will implicitly map input channels to +output channels, preserving indices. + +For example, assuming a 5.1+downmix input MOV file, +@example +ffmpeg -i in.mov -filter 'channelmap=map=DL-FL|DR-FR' out.wav +@end example +will create an output WAV file tagged as stereo from the downmix channels of +the input. + +To fix a 5.1 WAV improperly encoded in AAC's native channel order +@example +ffmpeg -i in.wav -filter 'channelmap=1|2|0|5|3|4:5.1' out.wav +@end example + +@section channelsplit + +Split each channel from an input audio stream into a separate output stream. + +It accepts the following parameters: +@table @option +@item channel_layout +The channel layout of the input stream. The default is "stereo". +@end table + +For example, assuming a stereo input MP3 file, +@example +ffmpeg -i in.mp3 -filter_complex channelsplit out.mkv +@end example +will create an output Matroska file with two audio streams, one containing only +the left channel and the other the right channel. + +Split a 5.1 WAV file into per-channel files: +@example +ffmpeg -i in.wav -filter_complex +'channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR]' +-map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]' +front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]' +side_right.wav +@end example + +@section chorus +Add a chorus effect to the audio. + +Can make a single vocal sound like a chorus, but can also be applied to instrumentation. + +Chorus resembles an echo effect with a short delay, but whereas with echo the delay is +constant, with chorus, it is varied using using sinusoidal or triangular modulation. +The modulation depth defines the range the modulated delay is played before or after +the delay. Hence the delayed sound will sound slower or faster, that is the delayed +sound tuned around the original one, like in a chorus where some vocals are slightly +off key. + +It accepts the following parameters: +@table @option +@item in_gain +Set input gain. Default is 0.4. + +@item out_gain +Set output gain. Default is 0.4. + +@item delays +Set delays. A typical delay is around 40ms to 60ms. + +@item decays +Set decays. + +@item speeds +Set speeds. + +@item depths +Set depths. +@end table + +@subsection Examples + +@itemize +@item +A single delay: +@example +chorus=0.7:0.9:55:0.4:0.25:2 +@end example + +@item +Two delays: +@example +chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3 +@end example + +@item +Fuller sounding chorus with three delays: +@example +chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3 +@end example +@end itemize + +@section compand +Compress or expand the audio's dynamic range. + +It accepts the following parameters: + +@table @option + +@item attacks +@item decays +A list of times in seconds for each channel over which the instantaneous level +of the input signal is averaged to determine its volume. @var{attacks} refers to +increase of volume and @var{decays} refers to decrease of volume. For most +situations, the attack time (response to the audio getting louder) should be +shorter than the decay time, because the human ear is more sensitive to sudden +loud audio than sudden soft audio. A typical value for attack is 0.3 seconds and +a typical value for decay is 0.8 seconds. +If specified number of attacks & decays is lower than number of channels, the last +set attack/decay will be used for all remaining channels. + +@item points +A list of points for the transfer function, specified in dB relative to the +maximum possible signal amplitude. Each key points list must be defined using +the following syntax: @code{x0/y0|x1/y1|x2/y2|....} or +@code{x0/y0 x1/y1 x2/y2 ....} + +The input values must be in strictly increasing order but the transfer function +does not have to be monotonically rising. The point @code{0/0} is assumed but +may be overridden (by @code{0/out-dBn}). Typical values for the transfer +function are @code{-70/-70|-60/-20}. + +@item soft-knee +Set the curve radius in dB for all joints. It defaults to 0.01. + +@item gain +Set the additional gain in dB to be applied at all points on the transfer +function. This allows for easy adjustment of the overall gain. +It defaults to 0. + +@item volume +Set an initial volume, in dB, to be assumed for each channel when filtering +starts. This permits the user to supply a nominal level initially, so that, for +example, a very large gain is not applied to initial signal levels before the +companding has begun to operate. A typical value for audio which is initially +quiet is -90 dB. It defaults to 0. + +@item delay +Set a delay, in seconds. The input audio is analyzed immediately, but audio is +delayed before being fed to the volume adjuster. Specifying a delay +approximately equal to the attack/decay times allows the filter to effectively +operate in predictive rather than reactive mode. It defaults to 0. + +@end table + +@subsection Examples + +@itemize +@item +Make music with both quiet and loud passages suitable for listening to in a +noisy environment: +@example +compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2 +@end example + +Another example for audio with whisper and explosion parts: +@example +compand=0|0:1|1:-90/-900|-70/-70|-30/-9|0/-3:6:0:0:0 +@end example + +@item +A noise gate for when the noise is at a lower level than the signal: +@example +compand=.1|.1:.2|.2:-900/-900|-50.1/-900|-50/-50:.01:0:-90:.1 +@end example + +@item +Here is another noise gate, this time for when the noise is at a higher level +than the signal (making it, in some ways, similar to squelch): +@example +compand=.1|.1:.1|.1:-45.1/-45.1|-45/-900|0/-900:.01:45:-90:.1 +@end example + +@item +2:1 compression starting at -6dB: +@example +compand=points=-80/-80|-6/-6|0/-3.8|20/3.5 +@end example + +@item +2:1 compression starting at -9dB: +@example +compand=points=-80/-80|-9/-9|0/-5.3|20/2.9 +@end example + +@item +2:1 compression starting at -12dB: +@example +compand=points=-80/-80|-12/-12|0/-6.8|20/1.9 +@end example + +@item +2:1 compression starting at -18dB: +@example +compand=points=-80/-80|-18/-18|0/-9.8|20/0.7 +@end example + +@item +3:1 compression starting at -15dB: +@example +compand=points=-80/-80|-15/-15|0/-10.8|20/-5.2 +@end example + +@item +Compressor/Gate: +@example +compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6 +@end example + +@item +Expander: +@example +compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3 +@end example + +@item +Hard limiter at -6dB: +@example +compand=attacks=0:points=-80/-80|-6/-6|20/-6 +@end example + +@item +Hard limiter at -12dB: +@example +compand=attacks=0:points=-80/-80|-12/-12|20/-12 +@end example + +@item +Hard noise gate at -35 dB: +@example +compand=attacks=0:points=-80/-115|-35.1/-80|-35/-35|20/20 +@end example + +@item +Soft limiter: +@example +compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8 +@end example +@end itemize + +@section compensationdelay + +Compensation Delay Line is a metric based delay to compensate differing +positions of microphones or speakers. + +For example, you have recorded guitar with two microphones placed in +different location. Because the front of sound wave has fixed speed in +normal conditions, the phasing of microphones can vary and depends on +their location and interposition. The best sound mix can be achieved when +these microphones are in phase (synchronized). Note that distance of +~30 cm between microphones makes one microphone to capture signal in +antiphase to another microphone. That makes the final mix sounding moody. +This filter helps to solve phasing problems by adding different delays +to each microphone track and make them synchronized. + +The best result can be reached when you take one track as base and +synchronize other tracks one by one with it. +Remember that synchronization/delay tolerance depends on sample rate, too. +Higher sample rates will give more tolerance. + +It accepts the following parameters: + +@table @option +@item mm +Set millimeters distance. This is compensation distance for fine tuning. +Default is 0. + +@item cm +Set cm distance. This is compensation distance for tightening distance setup. +Default is 0. + +@item m +Set meters distance. This is compensation distance for hard distance setup. +Default is 0. + +@item dry +Set dry amount. Amount of unprocessed (dry) signal. +Default is 0. + +@item wet +Set wet amount. Amount of processed (wet) signal. +Default is 1. + +@item temp +Set temperature degree in Celsius. This is the temperature of the environment. +Default is 20. +@end table + +@section dcshift +Apply a DC shift to the audio. + +This can be useful to remove a DC offset (caused perhaps by a hardware problem +in the recording chain) from the audio. The effect of a DC offset is reduced +headroom and hence volume. The @ref{astats} filter can be used to determine if +a signal has a DC offset. + +@table @option +@item shift +Set the DC shift, allowed range is [-1, 1]. It indicates the amount to shift +the audio. + +@item limitergain +Optional. It should have a value much less than 1 (e.g. 0.05 or 0.02) and is +used to prevent clipping. +@end table + +@section dynaudnorm +Dynamic Audio Normalizer. + +This filter applies a certain amount of gain to the input audio in order +to bring its peak magnitude to a target level (e.g. 0 dBFS). However, in +contrast to more "simple" normalization algorithms, the Dynamic Audio +Normalizer *dynamically* re-adjusts the gain factor to the input audio. +This allows for applying extra gain to the "quiet" sections of the audio +while avoiding distortions or clipping the "loud" sections. In other words: +The Dynamic Audio Normalizer will "even out" the volume of quiet and loud +sections, in the sense that the volume of each section is brought to the +same target level. Note, however, that the Dynamic Audio Normalizer achieves +this goal *without* applying "dynamic range compressing". It will retain 100% +of the dynamic range *within* each section of the audio file. + +@table @option +@item f +Set the frame length in milliseconds. In range from 10 to 8000 milliseconds. +Default is 500 milliseconds. +The Dynamic Audio Normalizer processes the input audio in small chunks, +referred to as frames. This is required, because a peak magnitude has no +meaning for just a single sample value. Instead, we need to determine the +peak magnitude for a contiguous sequence of sample values. While a "standard" +normalizer would simply use the peak magnitude of the complete file, the +Dynamic Audio Normalizer determines the peak magnitude individually for each +frame. The length of a frame is specified in milliseconds. By default, the +Dynamic Audio Normalizer uses a frame length of 500 milliseconds, which has +been found to give good results with most files. +Note that the exact frame length, in number of samples, will be determined +automatically, based on the sampling rate of the individual input audio file. + +@item g +Set the Gaussian filter window size. In range from 3 to 301, must be odd +number. Default is 31. +Probably the most important parameter of the Dynamic Audio Normalizer is the +@code{window size} of the Gaussian smoothing filter. The filter's window size +is specified in frames, centered around the current frame. For the sake of +simplicity, this must be an odd number. Consequently, the default value of 31 +takes into account the current frame, as well as the 15 preceding frames and +the 15 subsequent frames. Using a larger window results in a stronger +smoothing effect and thus in less gain variation, i.e. slower gain +adaptation. Conversely, using a smaller window results in a weaker smoothing +effect and thus in more gain variation, i.e. faster gain adaptation. +In other words, the more you increase this value, the more the Dynamic Audio +Normalizer will behave like a "traditional" normalization filter. On the +contrary, the more you decrease this value, the more the Dynamic Audio +Normalizer will behave like a dynamic range compressor. + +@item p +Set the target peak value. This specifies the highest permissible magnitude +level for the normalized audio input. This filter will try to approach the +target peak magnitude as closely as possible, but at the same time it also +makes sure that the normalized signal will never exceed the peak magnitude. +A frame's maximum local gain factor is imposed directly by the target peak +magnitude. The default value is 0.95 and thus leaves a headroom of 5%*. +It is not recommended to go above this value. + +@item m +Set the maximum gain factor. In range from 1.0 to 100.0. Default is 10.0. +The Dynamic Audio Normalizer determines the maximum possible (local) gain +factor for each input frame, i.e. the maximum gain factor that does not +result in clipping or distortion. The maximum gain factor is determined by +the frame's highest magnitude sample. However, the Dynamic Audio Normalizer +additionally bounds the frame's maximum gain factor by a predetermined +(global) maximum gain factor. This is done in order to avoid excessive gain +factors in "silent" or almost silent frames. By default, the maximum gain +factor is 10.0, For most inputs the default value should be sufficient and +it usually is not recommended to increase this value. Though, for input +with an extremely low overall volume level, it may be necessary to allow even +higher gain factors. Note, however, that the Dynamic Audio Normalizer does +not simply apply a "hard" threshold (i.e. cut off values above the threshold). +Instead, a "sigmoid" threshold function will be applied. This way, the +gain factors will smoothly approach the threshold value, but never exceed that +value. + +@item r +Set the target RMS. In range from 0.0 to 1.0. Default is 0.0 - disabled. +By default, the Dynamic Audio Normalizer performs "peak" normalization. +This means that the maximum local gain factor for each frame is defined +(only) by the frame's highest magnitude sample. This way, the samples can +be amplified as much as possible without exceeding the maximum signal +level, i.e. without clipping. Optionally, however, the Dynamic Audio +Normalizer can also take into account the frame's root mean square, +abbreviated RMS. In electrical engineering, the RMS is commonly used to +determine the power of a time-varying signal. It is therefore considered +that the RMS is a better approximation of the "perceived loudness" than +just looking at the signal's peak magnitude. Consequently, by adjusting all +frames to a constant RMS value, a uniform "perceived loudness" can be +established. If a target RMS value has been specified, a frame's local gain +factor is defined as the factor that would result in exactly that RMS value. +Note, however, that the maximum local gain factor is still restricted by the +frame's highest magnitude sample, in order to prevent clipping. + +@item n +Enable channels coupling. By default is enabled. +By default, the Dynamic Audio Normalizer will amplify all channels by the same +amount. This means the same gain factor will be applied to all channels, i.e. +the maximum possible gain factor is determined by the "loudest" channel. +However, in some recordings, it may happen that the volume of the different +channels is uneven, e.g. one channel may be "quieter" than the other one(s). +In this case, this option can be used to disable the channel coupling. This way, +the gain factor will be determined independently for each channel, depending +only on the individual channel's highest magnitude sample. This allows for +harmonizing the volume of the different channels. + +@item c +Enable DC bias correction. By default is disabled. +An audio signal (in the time domain) is a sequence of sample values. +In the Dynamic Audio Normalizer these sample values are represented in the +-1.0 to 1.0 range, regardless of the original input format. Normally, the +audio signal, or "waveform", should be centered around the zero point. +That means if we calculate the mean value of all samples in a file, or in a +single frame, then the result should be 0.0 or at least very close to that +value. If, however, there is a significant deviation of the mean value from +0.0, in either positive or negative direction, this is referred to as a +DC bias or DC offset. Since a DC bias is clearly undesirable, the Dynamic +Audio Normalizer provides optional DC bias correction. +With DC bias correction enabled, the Dynamic Audio Normalizer will determine +the mean value, or "DC correction" offset, of each input frame and subtract +that value from all of the frame's sample values which ensures those samples +are centered around 0.0 again. Also, in order to avoid "gaps" at the frame +boundaries, the DC correction offset values will be interpolated smoothly +between neighbouring frames. + +@item b +Enable alternative boundary mode. By default is disabled. +The Dynamic Audio Normalizer takes into account a certain neighbourhood +around each frame. This includes the preceding frames as well as the +subsequent frames. However, for the "boundary" frames, located at the very +beginning and at the very end of the audio file, not all neighbouring +frames are available. In particular, for the first few frames in the audio +file, the preceding frames are not known. And, similarly, for the last few +frames in the audio file, the subsequent frames are not known. Thus, the +question arises which gain factors should be assumed for the missing frames +in the "boundary" region. The Dynamic Audio Normalizer implements two modes +to deal with this situation. The default boundary mode assumes a gain factor +of exactly 1.0 for the missing frames, resulting in a smooth "fade in" and +"fade out" at the beginning and at the end of the input, respectively. + +@item s +Set the compress factor. In range from 0.0 to 30.0. Default is 0.0. +By default, the Dynamic Audio Normalizer does not apply "traditional" +compression. This means that signal peaks will not be pruned and thus the +full dynamic range will be retained within each local neighbourhood. However, +in some cases it may be desirable to combine the Dynamic Audio Normalizer's +normalization algorithm with a more "traditional" compression. +For this purpose, the Dynamic Audio Normalizer provides an optional compression +(thresholding) function. If (and only if) the compression feature is enabled, +all input frames will be processed by a soft knee thresholding function prior +to the actual normalization process. Put simply, the thresholding function is +going to prune all samples whose magnitude exceeds a certain threshold value. +However, the Dynamic Audio Normalizer does not simply apply a fixed threshold +value. Instead, the threshold value will be adjusted for each individual +frame. +In general, smaller parameters result in stronger compression, and vice versa. +Values below 3.0 are not recommended, because audible distortion may appear. +@end table + +@section earwax + +Make audio easier to listen to on headphones. + +This filter adds `cues' to 44.1kHz stereo (i.e. audio CD format) audio +so that when listened to on headphones the stereo image is moved from +inside your head (standard for headphones) to outside and in front of +the listener (standard for speakers). + +Ported from SoX. + +@section equalizer + +Apply a two-pole peaking equalisation (EQ) filter. With this +filter, the signal-level at and around a selected frequency can +be increased or decreased, whilst (unlike bandpass and bandreject +filters) that at all other frequencies is unchanged. + +In order to produce complex equalisation curves, this filter can +be given several times, each with a different central frequency. + +The filter accepts the following options: + +@table @option +@item frequency, f +Set the filter's central frequency in Hz. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Specify the band-width of a filter in width_type units. + +@item gain, g +Set the required gain or attenuation in dB. +Beware of clipping when using a positive gain. +@end table + +@subsection Examples +@itemize +@item +Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz: +@example +equalizer=f=1000:width_type=h:width=200:g=-10 +@end example + +@item +Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2: +@example +equalizer=f=1000:width_type=q:width=1:g=2,equalizer=f=100:width_type=q:width=2:g=-5 +@end example +@end itemize + +@section extrastereo + +Linearly increases the difference between left and right channels which +adds some sort of "live" effect to playback. + +The filter accepts the following option: + +@table @option +@item m +Sets the difference coefficient (default: 2.5). 0.0 means mono sound +(average of both channels), with 1.0 sound will be unchanged, with +-1.0 left and right channels will be swapped. + +@item c +Enable clipping. By default is enabled. +@end table + +@section flanger +Apply a flanging effect to the audio. + +The filter accepts the following options: + +@table @option +@item delay +Set base delay in milliseconds. Range from 0 to 30. Default value is 0. + +@item depth +Set added swep delay in milliseconds. Range from 0 to 10. Default value is 2. + +@item regen +Set percentage regeneration (delayed signal feedback). Range from -95 to 95. +Default value is 0. + +@item width +Set percentage of delayed signal mixed with original. Range from 0 to 100. +Default value is 71. + +@item speed +Set sweeps per second (Hz). Range from 0.1 to 10. Default value is 0.5. + +@item shape +Set swept wave shape, can be @var{triangular} or @var{sinusoidal}. +Default value is @var{sinusoidal}. + +@item phase +Set swept wave percentage-shift for multi channel. Range from 0 to 100. +Default value is 25. + +@item interp +Set delay-line interpolation, @var{linear} or @var{quadratic}. +Default is @var{linear}. +@end table + +@section highpass + +Apply a high-pass filter with 3dB point frequency. +The filter can be either single-pole, or double-pole (the default). +The filter roll off at 6dB per pole per octave (20dB per pole per decade). + +The filter accepts the following options: + +@table @option +@item frequency, f +Set frequency in Hz. Default is 3000. + +@item poles, p +Set number of poles. Default is 2. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Specify the band-width of a filter in width_type units. +Applies only to double-pole filter. +The default is 0.707q and gives a Butterworth response. +@end table + +@section join + +Join multiple input streams into one multi-channel stream. + +It accepts the following parameters: +@table @option + +@item inputs +The number of input streams. It defaults to 2. + +@item channel_layout +The desired output channel layout. It defaults to stereo. + +@item map +Map channels from inputs to output. The argument is a '|'-separated list of +mappings, each in the @code{@var{input_idx}.@var{in_channel}-@var{out_channel}} +form. @var{input_idx} is the 0-based index of the input stream. @var{in_channel} +can be either the name of the input channel (e.g. FL for front left) or its +index in the specified input stream. @var{out_channel} is the name of the output +channel. +@end table + +The filter will attempt to guess the mappings when they are not specified +explicitly. It does so by first trying to find an unused matching input channel +and if that fails it picks the first unused input channel. + +Join 3 inputs (with properly set channel layouts): +@example +ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT +@end example + +Build a 5.1 output from 6 single-channel streams: +@example +ffmpeg -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex +'join=inputs=6:channel_layout=5.1:map=0.0-FL|1.0-FR|2.0-FC|3.0-SL|4.0-SR|5.0-LFE' +out +@end example + +@section ladspa + +Load a LADSPA (Linux Audio Developer's Simple Plugin API) plugin. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-ladspa}. + +@table @option +@item file, f +Specifies the name of LADSPA plugin library to load. If the environment +variable @env{LADSPA_PATH} is defined, the LADSPA plugin is searched in +each one of the directories specified by the colon separated list in +@env{LADSPA_PATH}, otherwise in the standard LADSPA paths, which are in +this order: @file{HOME/.ladspa/lib/}, @file{/usr/local/lib/ladspa/}, +@file{/usr/lib/ladspa/}. + +@item plugin, p +Specifies the plugin within the library. Some libraries contain only +one plugin, but others contain many of them. If this is not set filter +will list all available plugins within the specified library. + +@item controls, c +Set the '|' separated list of controls which are zero or more floating point +values that determine the behavior of the loaded plugin (for example delay, +threshold or gain). +Controls need to be defined using the following syntax: +c0=@var{value0}|c1=@var{value1}|c2=@var{value2}|..., where +@var{valuei} is the value set on the @var{i}-th control. +Alternatively they can be also defined using the following syntax: +@var{value0}|@var{value1}|@var{value2}|..., where +@var{valuei} is the value set on the @var{i}-th control. +If @option{controls} is set to @code{help}, all available controls and +their valid ranges are printed. + +@item sample_rate, s +Specify the sample rate, default to 44100. Only used if plugin have +zero inputs. + +@item nb_samples, n +Set the number of samples per channel per each output frame, default +is 1024. Only used if plugin have zero inputs. + +@item duration, d +Set the minimum duration of the sourced audio. See +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. +Note that the resulting duration may be greater than the specified duration, +as the generated audio is always cut at the end of a complete frame. +If not specified, or the expressed duration is negative, the audio is +supposed to be generated forever. +Only used if plugin have zero inputs. + +@end table + +@subsection Examples + +@itemize +@item +List all available plugins within amp (LADSPA example plugin) library: +@example +ladspa=file=amp +@end example + +@item +List all available controls and their valid ranges for @code{vcf_notch} +plugin from @code{VCF} library: +@example +ladspa=f=vcf:p=vcf_notch:c=help +@end example + +@item +Simulate low quality audio equipment using @code{Computer Music Toolkit} (CMT) +plugin library: +@example +ladspa=file=cmt:plugin=lofi:controls=c0=22|c1=12|c2=12 +@end example + +@item +Add reverberation to the audio using TAP-plugins +(Tom's Audio Processing plugins): +@example +ladspa=file=tap_reverb:tap_reverb +@end example + +@item +Generate white noise, with 0.2 amplitude: +@example +ladspa=file=cmt:noise_source_white:c=c0=.2 +@end example + +@item +Generate 20 bpm clicks using plugin @code{C* Click - Metronome} from the +@code{C* Audio Plugin Suite} (CAPS) library: +@example +ladspa=file=caps:Click:c=c1=20' +@end example + +@item +Apply @code{C* Eq10X2 - Stereo 10-band equaliser} effect: +@example +ladspa=caps:Eq10X2:c=c0=-48|c9=-24|c3=12|c4=2 +@end example + +@item +Increase volume by 20dB using fast lookahead limiter from Steve Harris +@code{SWH Plugins} collection: +@example +ladspa=fast_lookahead_limiter_1913:fastLookaheadLimiter:20|0|2 +@end example + +@item +Attenuate low frequencies using Multiband EQ from Steve Harris +@code{SWH Plugins} collection: +@example +ladspa=mbeq_1197:mbeq:-24|-24|-24|0|0|0|0|0|0|0|0|0|0|0|0 +@end example +@end itemize + +@subsection Commands + +This filter supports the following commands: +@table @option +@item cN +Modify the @var{N}-th control value. + +If the specified value is not valid, it is ignored and prior one is kept. +@end table + +@section lowpass + +Apply a low-pass filter with 3dB point frequency. +The filter can be either single-pole or double-pole (the default). +The filter roll off at 6dB per pole per octave (20dB per pole per decade). + +The filter accepts the following options: + +@table @option +@item frequency, f +Set frequency in Hz. Default is 500. + +@item poles, p +Set number of poles. Default is 2. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Specify the band-width of a filter in width_type units. +Applies only to double-pole filter. +The default is 0.707q and gives a Butterworth response. +@end table + +@anchor{pan} +@section pan + +Mix channels with specific gain levels. The filter accepts the output +channel layout followed by a set of channels definitions. + +This filter is also designed to efficiently remap the channels of an audio +stream. + +The filter accepts parameters of the form: +"@var{l}|@var{outdef}|@var{outdef}|..." + +@table @option +@item l +output channel layout or number of channels + +@item outdef +output channel specification, of the form: +"@var{out_name}=[@var{gain}*]@var{in_name}[+[@var{gain}*]@var{in_name}...]" + +@item out_name +output channel to define, either a channel name (FL, FR, etc.) or a channel +number (c0, c1, etc.) + +@item gain +multiplicative coefficient for the channel, 1 leaving the volume unchanged + +@item in_name +input channel to use, see out_name for details; it is not possible to mix +named and numbered input channels +@end table + +If the `=' in a channel specification is replaced by `<', then the gains for +that specification will be renormalized so that the total is 1, thus +avoiding clipping noise. + +@subsection Mixing examples + +For example, if you want to down-mix from stereo to mono, but with a bigger +factor for the left channel: +@example +pan=1c|c0=0.9*c0+0.1*c1 +@end example + +A customized down-mix to stereo that works automatically for 3-, 4-, 5- and +7-channels surround: +@example +pan=stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR +@end example + +Note that @command{ffmpeg} integrates a default down-mix (and up-mix) system +that should be preferred (see "-ac" option) unless you have very specific +needs. + +@subsection Remapping examples + +The channel remapping will be effective if, and only if: + +@itemize +@item gain coefficients are zeroes or ones, +@item only one input per channel output, +@end itemize + +If all these conditions are satisfied, the filter will notify the user ("Pure +channel mapping detected"), and use an optimized and lossless method to do the +remapping. + +For example, if you have a 5.1 source and want a stereo audio stream by +dropping the extra channels: +@example +pan="stereo| c0=FL | c1=FR" +@end example + +Given the same source, you can also switch front left and front right channels +and keep the input channel layout: +@example +pan="5.1| c0=c1 | c1=c0 | c2=c2 | c3=c3 | c4=c4 | c5=c5" +@end example + +If the input is a stereo audio stream, you can mute the front left channel (and +still keep the stereo channel layout) with: +@example +pan="stereo|c1=c1" +@end example + +Still with a stereo audio stream input, you can copy the right channel in both +front left and right: +@example +pan="stereo| c0=FR | c1=FR" +@end example + +@section replaygain + +ReplayGain scanner filter. This filter takes an audio stream as an input and +outputs it unchanged. +At end of filtering it displays @code{track_gain} and @code{track_peak}. + +@section resample + +Convert the audio sample format, sample rate and channel layout. It is +not meant to be used directly. + +@section rubberband +Apply time-stretching and pitch-shifting with librubberband. + +The filter accepts the following options: + +@table @option +@item tempo +Set tempo scale factor. + +@item pitch +Set pitch scale factor. + +@item transients +Set transients detector. +Possible values are: +@table @var +@item crisp +@item mixed +@item smooth +@end table + +@item detector +Set detector. +Possible values are: +@table @var +@item compound +@item percussive +@item soft +@end table + +@item phase +Set phase. +Possible values are: +@table @var +@item laminar +@item independent +@end table + +@item window +Set processing window size. +Possible values are: +@table @var +@item standard +@item short +@item long +@end table + +@item smoothing +Set smoothing. +Possible values are: +@table @var +@item off +@item on +@end table + +@item formant +Enable formant preservation when shift pitching. +Possible values are: +@table @var +@item shifted +@item preserved +@end table + +@item pitchq +Set pitch quality. +Possible values are: +@table @var +@item quality +@item speed +@item consistency +@end table + +@item channels +Set channels. +Possible values are: +@table @var +@item apart +@item together +@end table +@end table + +@section sidechaincompress + +This filter acts like normal compressor but has the ability to compress +detected signal using second input signal. +It needs two input streams and returns one output stream. +First input stream will be processed depending on second stream signal. +The filtered signal then can be filtered with other filters in later stages of +processing. See @ref{pan} and @ref{amerge} filter. + +The filter accepts the following options: + +@table @option +@item level_in +Set input gain. Default is 1. Range is between 0.015625 and 64. + +@item threshold +If a signal of second stream raises above this level it will affect the gain +reduction of first stream. +By default is 0.125. Range is between 0.00097563 and 1. + +@item ratio +Set a ratio about which the signal is reduced. 1:2 means that if the level +raised 4dB above the threshold, it will be only 2dB above after the reduction. +Default is 2. Range is between 1 and 20. + +@item attack +Amount of milliseconds the signal has to rise above the threshold before gain +reduction starts. Default is 20. Range is between 0.01 and 2000. + +@item release +Amount of milliseconds the signal has to fall below the threshold before +reduction is decreased again. Default is 250. Range is between 0.01 and 9000. + +@item makeup +Set the amount by how much signal will be amplified after processing. +Default is 2. Range is from 1 and 64. + +@item knee +Curve the sharp knee around the threshold to enter gain reduction more softly. +Default is 2.82843. Range is between 1 and 8. + +@item link +Choose if the @code{average} level between all channels of side-chain stream +or the louder(@code{maximum}) channel of side-chain stream affects the +reduction. Default is @code{average}. + +@item detection +Should the exact signal be taken in case of @code{peak} or an RMS one in case +of @code{rms}. Default is @code{rms} which is mainly smoother. + +@item level_sc +Set sidechain gain. Default is 1. Range is between 0.015625 and 64. + +@item mix +How much to use compressed signal in output. Default is 1. +Range is between 0 and 1. +@end table + +@subsection Examples + +@itemize +@item +Full ffmpeg example taking 2 audio inputs, 1st input to be compressed +depending on the signal of 2nd input and later compressed signal to be +merged with 2nd input: +@example +ffmpeg -i main.flac -i sidechain.flac -filter_complex "[1:a]asplit=2[sc][mix];[0:a][sc]sidechaincompress[compr];[compr][mix]amerge" +@end example +@end itemize + +@section sidechaingate + +A sidechain gate acts like a normal (wideband) gate but has the ability to +filter the detected signal before sending it to the gain reduction stage. +Normally a gate uses the full range signal to detect a level above the +threshold. +For example: If you cut all lower frequencies from your sidechain signal +the gate will decrease the volume of your track only if not enough highs +appear. With this technique you are able to reduce the resonation of a +natural drum or remove "rumbling" of muted strokes from a heavily distorted +guitar. +It needs two input streams and returns one output stream. +First input stream will be processed depending on second stream signal. + +The filter accepts the following options: + +@table @option +@item level_in +Set input level before filtering. +Default is 1. Allowed range is from 0.015625 to 64. + +@item range +Set the level of gain reduction when the signal is below the threshold. +Default is 0.06125. Allowed range is from 0 to 1. + +@item threshold +If a signal rises above this level the gain reduction is released. +Default is 0.125. Allowed range is from 0 to 1. + +@item ratio +Set a ratio about which the signal is reduced. +Default is 2. Allowed range is from 1 to 9000. + +@item attack +Amount of milliseconds the signal has to rise above the threshold before gain +reduction stops. +Default is 20 milliseconds. Allowed range is from 0.01 to 9000. + +@item release +Amount of milliseconds the signal has to fall below the threshold before the +reduction is increased again. Default is 250 milliseconds. +Allowed range is from 0.01 to 9000. + +@item makeup +Set amount of amplification of signal after processing. +Default is 1. Allowed range is from 1 to 64. + +@item knee +Curve the sharp knee around the threshold to enter gain reduction more softly. +Default is 2.828427125. Allowed range is from 1 to 8. + +@item detection +Choose if exact signal should be taken for detection or an RMS like one. +Default is rms. Can be peak or rms. + +@item link +Choose if the average level between all channels or the louder channel affects +the reduction. +Default is average. Can be average or maximum. + +@item level_sc +Set sidechain gain. Default is 1. Range is from 0.015625 to 64. +@end table + +@section silencedetect + +Detect silence in an audio stream. + +This filter logs a message when it detects that the input audio volume is less +or equal to a noise tolerance value for a duration greater or equal to the +minimum detected noise duration. + +The printed times and duration are expressed in seconds. + +The filter accepts the following options: + +@table @option +@item duration, d +Set silence duration until notification (default is 2 seconds). + +@item noise, n +Set noise tolerance. Can be specified in dB (in case "dB" is appended to the +specified value) or amplitude ratio. Default is -60dB, or 0.001. +@end table + +@subsection Examples + +@itemize +@item +Detect 5 seconds of silence with -50dB noise tolerance: +@example +silencedetect=n=-50dB:d=5 +@end example + +@item +Complete example with @command{ffmpeg} to detect silence with 0.0001 noise +tolerance in @file{silence.mp3}: +@example +ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -f null - +@end example +@end itemize + +@section silenceremove + +Remove silence from the beginning, middle or end of the audio. + +The filter accepts the following options: + +@table @option +@item start_periods +This value is used to indicate if audio should be trimmed at beginning of +the audio. A value of zero indicates no silence should be trimmed from the +beginning. When specifying a non-zero value, it trims audio up until it +finds non-silence. Normally, when trimming silence from beginning of audio +the @var{start_periods} will be @code{1} but it can be increased to higher +values to trim all audio up to specific count of non-silence periods. +Default value is @code{0}. + +@item start_duration +Specify the amount of time that non-silence must be detected before it stops +trimming audio. By increasing the duration, bursts of noises can be treated +as silence and trimmed off. Default value is @code{0}. + +@item start_threshold +This indicates what sample value should be treated as silence. For digital +audio, a value of @code{0} may be fine but for audio recorded from analog, +you may wish to increase the value to account for background noise. +Can be specified in dB (in case "dB" is appended to the specified value) +or amplitude ratio. Default value is @code{0}. + +@item stop_periods +Set the count for trimming silence from the end of audio. +To remove silence from the middle of a file, specify a @var{stop_periods} +that is negative. This value is then treated as a positive value and is +used to indicate the effect should restart processing as specified by +@var{start_periods}, making it suitable for removing periods of silence +in the middle of the audio. +Default value is @code{0}. + +@item stop_duration +Specify a duration of silence that must exist before audio is not copied any +more. By specifying a higher duration, silence that is wanted can be left in +the audio. +Default value is @code{0}. + +@item stop_threshold +This is the same as @option{start_threshold} but for trimming silence from +the end of audio. +Can be specified in dB (in case "dB" is appended to the specified value) +or amplitude ratio. Default value is @code{0}. + +@item leave_silence +This indicate that @var{stop_duration} length of audio should be left intact +at the beginning of each period of silence. +For example, if you want to remove long pauses between words but do not want +to remove the pauses completely. Default value is @code{0}. + +@item detection +Set how is silence detected. Can be @code{rms} or @code{peak}. Second is faster +and works better with digital silence which is exactly 0. +Default value is @code{rms}. + +@item window +Set ratio used to calculate size of window for detecting silence. +Default value is @code{0.02}. Allowed range is from @code{0} to @code{10}. +@end table + +@subsection Examples + +@itemize +@item +The following example shows how this filter can be used to start a recording +that does not contain the delay at the start which usually occurs between +pressing the record button and the start of the performance: +@example +silenceremove=1:5:0.02 +@end example + +@item +Trim all silence encountered from begining to end where there is more than 1 +second of silence in audio: +@example +silenceremove=0:0:0:-1:1:-90dB +@end example +@end itemize + +@section sofalizer + +SOFAlizer uses head-related transfer functions (HRTFs) to create virtual +loudspeakers around the user for binaural listening via headphones (audio +formats up to 9 channels supported). +The HRTFs are stored in SOFA files (see @url{http://www.sofacoustics.org/} for a database). +SOFAlizer is developed at the Acoustics Research Institute (ARI) of the +Austrian Academy of Sciences. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-netcdf}. + +The filter accepts the following options: + +@table @option +@item sofa +Set the SOFA file used for rendering. + +@item gain +Set gain applied to audio. Value is in dB. Default is 0. + +@item rotation +Set rotation of virtual loudspeakers in deg. Default is 0. + +@item elevation +Set elevation of virtual speakers in deg. Default is 0. + +@item radius +Set distance in meters between loudspeakers and the listener with near-field +HRTFs. Default is 1. + +@item type +Set processing type. Can be @var{time} or @var{freq}. @var{time} is +processing audio in time domain which is slow but gives high quality output. +@var{freq} is processing audio in frequency domain which is fast but gives +mediocre output. Default is @var{freq}. +@end table + +@section stereotools + +This filter has some handy utilities to manage stereo signals, for converting +M/S stereo recordings to L/R signal while having control over the parameters +or spreading the stereo image of master track. + +The filter accepts the following options: + +@table @option +@item level_in +Set input level before filtering for both channels. Defaults is 1. +Allowed range is from 0.015625 to 64. + +@item level_out +Set output level after filtering for both channels. Defaults is 1. +Allowed range is from 0.015625 to 64. + +@item balance_in +Set input balance between both channels. Default is 0. +Allowed range is from -1 to 1. + +@item balance_out +Set output balance between both channels. Default is 0. +Allowed range is from -1 to 1. + +@item softclip +Enable softclipping. Results in analog distortion instead of harsh digital 0dB +clipping. Disabled by default. + +@item mutel +Mute the left channel. Disabled by default. + +@item muter +Mute the right channel. Disabled by default. + +@item phasel +Change the phase of the left channel. Disabled by default. + +@item phaser +Change the phase of the right channel. Disabled by default. + +@item mode +Set stereo mode. Available values are: + +@table @samp +@item lr>lr +Left/Right to Left/Right, this is default. + +@item lr>ms +Left/Right to Mid/Side. + +@item ms>lr +Mid/Side to Left/Right. + +@item lr>ll +Left/Right to Left/Left. + +@item lr>rr +Left/Right to Right/Right. + +@item lr>l+r +Left/Right to Left + Right. + +@item lr>rl +Left/Right to Right/Left. +@end table + +@item slev +Set level of side signal. Default is 1. +Allowed range is from 0.015625 to 64. + +@item sbal +Set balance of side signal. Default is 0. +Allowed range is from -1 to 1. + +@item mlev +Set level of the middle signal. Default is 1. +Allowed range is from 0.015625 to 64. + +@item mpan +Set middle signal pan. Default is 0. Allowed range is from -1 to 1. + +@item base +Set stereo base between mono and inversed channels. Default is 0. +Allowed range is from -1 to 1. + +@item delay +Set delay in milliseconds how much to delay left from right channel and +vice versa. Default is 0. Allowed range is from -20 to 20. + +@item sclevel +Set S/C level. Default is 1. Allowed range is from 1 to 100. + +@item phase +Set the stereo phase in degrees. Default is 0. Allowed range is from 0 to 360. +@end table + +@section stereowiden + +This filter enhance the stereo effect by suppressing signal common to both +channels and by delaying the signal of left into right and vice versa, +thereby widening the stereo effect. + +The filter accepts the following options: + +@table @option +@item delay +Time in milliseconds of the delay of left signal into right and vice versa. +Default is 20 milliseconds. + +@item feedback +Amount of gain in delayed signal into right and vice versa. Gives a delay +effect of left signal in right output and vice versa which gives widening +effect. Default is 0.3. + +@item crossfeed +Cross feed of left into right with inverted phase. This helps in suppressing +the mono. If the value is 1 it will cancel all the signal common to both +channels. Default is 0.3. + +@item drymix +Set level of input signal of original channel. Default is 0.8. +@end table + +@section treble + +Boost or cut treble (upper) frequencies of the audio using a two-pole +shelving filter with a response similar to that of a standard +hi-fi's tone-controls. This is also known as shelving equalisation (EQ). + +The filter accepts the following options: + +@table @option +@item gain, g +Give the gain at whichever is the lower of ~22 kHz and the +Nyquist frequency. Its useful range is about -20 (for a large cut) +to +20 (for a large boost). Beware of clipping when using a positive gain. + +@item frequency, f +Set the filter's central frequency and so can be used +to extend or reduce the frequency range to be boosted or cut. +The default value is @code{3000} Hz. + +@item width_type +Set method to specify band-width of filter. +@table @option +@item h +Hz +@item q +Q-Factor +@item o +octave +@item s +slope +@end table + +@item width, w +Determine how steep is the filter's shelf transition. +@end table + +@section tremolo + +Sinusoidal amplitude modulation. + +The filter accepts the following options: + +@table @option +@item f +Modulation frequency in Hertz. Modulation frequencies in the subharmonic range +(20 Hz or lower) will result in a tremolo effect. +This filter may also be used as a ring modulator by specifying +a modulation frequency higher than 20 Hz. +Range is 0.1 - 20000.0. Default value is 5.0 Hz. + +@item d +Depth of modulation as a percentage. Range is 0.0 - 1.0. +Default value is 0.5. +@end table + +@section vibrato + +Sinusoidal phase modulation. + +The filter accepts the following options: + +@table @option +@item f +Modulation frequency in Hertz. +Range is 0.1 - 20000.0. Default value is 5.0 Hz. + +@item d +Depth of modulation as a percentage. Range is 0.0 - 1.0. +Default value is 0.5. +@end table + +@section volume + +Adjust the input audio volume. + +It accepts the following parameters: +@table @option + +@item volume +Set audio volume expression. + +Output values are clipped to the maximum value. + +The output audio volume is given by the relation: +@example +@var{output_volume} = @var{volume} * @var{input_volume} +@end example + +The default value for @var{volume} is "1.0". + +@item precision +This parameter represents the mathematical precision. + +It determines which input sample formats will be allowed, which affects the +precision of the volume scaling. + +@table @option +@item fixed +8-bit fixed-point; this limits input sample format to U8, S16, and S32. +@item float +32-bit floating-point; this limits input sample format to FLT. (default) +@item double +64-bit floating-point; this limits input sample format to DBL. +@end table + +@item replaygain +Choose the behaviour on encountering ReplayGain side data in input frames. + +@table @option +@item drop +Remove ReplayGain side data, ignoring its contents (the default). + +@item ignore +Ignore ReplayGain side data, but leave it in the frame. + +@item track +Prefer the track gain, if present. + +@item album +Prefer the album gain, if present. +@end table + +@item replaygain_preamp +Pre-amplification gain in dB to apply to the selected replaygain gain. + +Default value for @var{replaygain_preamp} is 0.0. + +@item eval +Set when the volume expression is evaluated. + +It accepts the following values: +@table @samp +@item once +only evaluate expression once during the filter initialization, or +when the @samp{volume} command is sent + +@item frame +evaluate expression for each incoming frame +@end table + +Default value is @samp{once}. +@end table + +The volume expression can contain the following parameters. + +@table @option +@item n +frame number (starting at zero) +@item nb_channels +number of channels +@item nb_consumed_samples +number of samples consumed by the filter +@item nb_samples +number of samples in the current frame +@item pos +original frame position in the file +@item pts +frame PTS +@item sample_rate +sample rate +@item startpts +PTS at start of stream +@item startt +time at start of stream +@item t +frame time +@item tb +timestamp timebase +@item volume +last set volume value +@end table + +Note that when @option{eval} is set to @samp{once} only the +@var{sample_rate} and @var{tb} variables are available, all other +variables will evaluate to NAN. + +@subsection Commands + +This filter supports the following commands: +@table @option +@item volume +Modify the volume expression. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@item replaygain_noclip +Prevent clipping by limiting the gain applied. + +Default value for @var{replaygain_noclip} is 1. + +@end table + +@subsection Examples + +@itemize +@item +Halve the input audio volume: +@example +volume=volume=0.5 +volume=volume=1/2 +volume=volume=-6.0206dB +@end example + +In all the above example the named key for @option{volume} can be +omitted, for example like in: +@example +volume=0.5 +@end example + +@item +Increase input audio power by 6 decibels using fixed-point precision: +@example +volume=volume=6dB:precision=fixed +@end example + +@item +Fade volume after time 10 with an annihilation period of 5 seconds: +@example +volume='if(lt(t,10),1,max(1-(t-10)/5,0))':eval=frame +@end example +@end itemize + +@section volumedetect + +Detect the volume of the input video. + +The filter has no parameters. The input is not modified. Statistics about +the volume will be printed in the log when the input stream end is reached. + +In particular it will show the mean volume (root mean square), maximum +volume (on a per-sample basis), and the beginning of a histogram of the +registered volume values (from the maximum value to a cumulated 1/1000 of +the samples). + +All volumes are in decibels relative to the maximum PCM value. + +@subsection Examples + +Here is an excerpt of the output: +@example +[Parsed_volumedetect_0 @ 0xa23120] mean_volume: -27 dB +[Parsed_volumedetect_0 @ 0xa23120] max_volume: -4 dB +[Parsed_volumedetect_0 @ 0xa23120] histogram_4db: 6 +[Parsed_volumedetect_0 @ 0xa23120] histogram_5db: 62 +[Parsed_volumedetect_0 @ 0xa23120] histogram_6db: 286 +[Parsed_volumedetect_0 @ 0xa23120] histogram_7db: 1042 +[Parsed_volumedetect_0 @ 0xa23120] histogram_8db: 2551 +[Parsed_volumedetect_0 @ 0xa23120] histogram_9db: 4609 +[Parsed_volumedetect_0 @ 0xa23120] histogram_10db: 8409 +@end example + +It means that: +@itemize +@item +The mean square energy is approximately -27 dB, or 10^-2.7. +@item +The largest sample is at -4 dB, or more precisely between -4 dB and -5 dB. +@item +There are 6 samples at -4 dB, 62 at -5 dB, 286 at -6 dB, etc. +@end itemize + +In other words, raising the volume by +4 dB does not cause any clipping, +raising it by +5 dB causes clipping for 6 samples, etc. + +@c man end AUDIO FILTERS + +@chapter Audio Sources +@c man begin AUDIO SOURCES + +Below is a description of the currently available audio sources. + +@section abuffer + +Buffer audio frames, and make them available to the filter chain. + +This source is mainly intended for a programmatic use, in particular +through the interface defined in @file{libavfilter/asrc_abuffer.h}. + +It accepts the following parameters: +@table @option + +@item time_base +The timebase which will be used for timestamps of submitted frames. It must be +either a floating-point number or in @var{numerator}/@var{denominator} form. + +@item sample_rate +The sample rate of the incoming audio buffers. + +@item sample_fmt +The sample format of the incoming audio buffers. +Either a sample format name or its corresponding integer representation from +the enum AVSampleFormat in @file{libavutil/samplefmt.h} + +@item channel_layout +The channel layout of the incoming audio buffers. +Either a channel layout name from channel_layout_map in +@file{libavutil/channel_layout.c} or its corresponding integer representation +from the AV_CH_LAYOUT_* macros in @file{libavutil/channel_layout.h} + +@item channels +The number of channels of the incoming audio buffers. +If both @var{channels} and @var{channel_layout} are specified, then they +must be consistent. + +@end table + +@subsection Examples + +@example +abuffer=sample_rate=44100:sample_fmt=s16p:channel_layout=stereo +@end example + +will instruct the source to accept planar 16bit signed stereo at 44100Hz. +Since the sample format with name "s16p" corresponds to the number +6 and the "stereo" channel layout corresponds to the value 0x3, this is +equivalent to: +@example +abuffer=sample_rate=44100:sample_fmt=6:channel_layout=0x3 +@end example + +@section aevalsrc + +Generate an audio signal specified by an expression. + +This source accepts in input one or more expressions (one for each +channel), which are evaluated and used to generate a corresponding +audio signal. + +This source accepts the following options: + +@table @option +@item exprs +Set the '|'-separated expressions list for each separate channel. In case the +@option{channel_layout} option is not specified, the selected channel layout +depends on the number of provided expressions. Otherwise the last +specified expression is applied to the remaining output channels. + +@item channel_layout, c +Set the channel layout. The number of channels in the specified layout +must be equal to the number of specified expressions. + +@item duration, d +Set the minimum duration of the sourced audio. See +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. +Note that the resulting duration may be greater than the specified +duration, as the generated audio is always cut at the end of a +complete frame. + +If not specified, or the expressed duration is negative, the audio is +supposed to be generated forever. + +@item nb_samples, n +Set the number of samples per channel per each output frame, +default to 1024. + +@item sample_rate, s +Specify the sample rate, default to 44100. +@end table + +Each expression in @var{exprs} can contain the following constants: + +@table @option +@item n +number of the evaluated sample, starting from 0 + +@item t +time of the evaluated sample expressed in seconds, starting from 0 + +@item s +sample rate + +@end table + +@subsection Examples + +@itemize +@item +Generate silence: +@example +aevalsrc=0 +@end example + +@item +Generate a sin signal with frequency of 440 Hz, set sample rate to +8000 Hz: +@example +aevalsrc="sin(440*2*PI*t):s=8000" +@end example + +@item +Generate a two channels signal, specify the channel layout (Front +Center + Back Center) explicitly: +@example +aevalsrc="sin(420*2*PI*t)|cos(430*2*PI*t):c=FC|BC" +@end example + +@item +Generate white noise: +@example +aevalsrc="-2+random(0)" +@end example + +@item +Generate an amplitude modulated signal: +@example +aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)" +@end example + +@item +Generate 2.5 Hz binaural beats on a 360 Hz carrier: +@example +aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) | 0.1*sin(2*PI*(360+2.5/2)*t)" +@end example + +@end itemize + +@section anullsrc + +The null audio source, return unprocessed audio frames. It is mainly useful +as a template and to be employed in analysis / debugging tools, or as +the source for filters which ignore the input data (for example the sox +synth filter). + +This source accepts the following options: + +@table @option + +@item channel_layout, cl + +Specifies the channel layout, and can be either an integer or a string +representing a channel layout. The default value of @var{channel_layout} +is "stereo". + +Check the channel_layout_map definition in +@file{libavutil/channel_layout.c} for the mapping between strings and +channel layout values. + +@item sample_rate, r +Specifies the sample rate, and defaults to 44100. + +@item nb_samples, n +Set the number of samples per requested frames. + +@end table + +@subsection Examples + +@itemize +@item +Set the sample rate to 48000 Hz and the channel layout to AV_CH_LAYOUT_MONO. +@example +anullsrc=r=48000:cl=4 +@end example + +@item +Do the same operation with a more obvious syntax: +@example +anullsrc=r=48000:cl=mono +@end example +@end itemize + +All the parameters need to be explicitly defined. + +@section flite + +Synthesize a voice utterance using the libflite library. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-libflite}. + +Note that the flite library is not thread-safe. + +The filter accepts the following options: + +@table @option + +@item list_voices +If set to 1, list the names of the available voices and exit +immediately. Default value is 0. + +@item nb_samples, n +Set the maximum number of samples per frame. Default value is 512. + +@item textfile +Set the filename containing the text to speak. + +@item text +Set the text to speak. + +@item voice, v +Set the voice to use for the speech synthesis. Default value is +@code{kal}. See also the @var{list_voices} option. +@end table + +@subsection Examples + +@itemize +@item +Read from file @file{speech.txt}, and synthesize the text using the +standard flite voice: +@example +flite=textfile=speech.txt +@end example + +@item +Read the specified text selecting the @code{slt} voice: +@example +flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt +@end example + +@item +Input text to ffmpeg: +@example +ffmpeg -f lavfi -i flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt +@end example + +@item +Make @file{ffplay} speak the specified text, using @code{flite} and +the @code{lavfi} device: +@example +ffplay -f lavfi flite=text='No more be grieved for which that thou hast done.' +@end example +@end itemize + +For more information about libflite, check: +@url{http://www.speech.cs.cmu.edu/flite/} + +@section anoisesrc + +Generate a noise audio signal. + +The filter accepts the following options: + +@table @option +@item sample_rate, r +Specify the sample rate. Default value is 48000 Hz. + +@item amplitude, a +Specify the amplitude (0.0 - 1.0) of the generated audio stream. Default value +is 1.0. + +@item duration, d +Specify the duration of the generated audio stream. Not specifying this option +results in noise with an infinite length. + +@item color, colour, c +Specify the color of noise. Available noise colors are white, pink, and brown. +Default color is white. + +@item seed, s +Specify a value used to seed the PRNG. + +@item nb_samples, n +Set the number of samples per each output frame, default is 1024. +@end table + +@subsection Examples + +@itemize + +@item +Generate 60 seconds of pink noise, with a 44.1 kHz sampling rate and an amplitude of 0.5: +@example +anoisesrc=d=60:c=pink:r=44100:a=0.5 +@end example +@end itemize + +@section sine + +Generate an audio signal made of a sine wave with amplitude 1/8. + +The audio signal is bit-exact. + +The filter accepts the following options: + +@table @option + +@item frequency, f +Set the carrier frequency. Default is 440 Hz. + +@item beep_factor, b +Enable a periodic beep every second with frequency @var{beep_factor} times +the carrier frequency. Default is 0, meaning the beep is disabled. + +@item sample_rate, r +Specify the sample rate, default is 44100. + +@item duration, d +Specify the duration of the generated audio stream. + +@item samples_per_frame +Set the number of samples per output frame. + +The expression can contain the following constants: + +@table @option +@item n +The (sequential) number of the output audio frame, starting from 0. + +@item pts +The PTS (Presentation TimeStamp) of the output audio frame, +expressed in @var{TB} units. + +@item t +The PTS of the output audio frame, expressed in seconds. + +@item TB +The timebase of the output audio frames. +@end table + +Default is @code{1024}. +@end table + +@subsection Examples + +@itemize + +@item +Generate a simple 440 Hz sine wave: +@example +sine +@end example + +@item +Generate a 220 Hz sine wave with a 880 Hz beep each second, for 5 seconds: +@example +sine=220:4:d=5 +sine=f=220:b=4:d=5 +sine=frequency=220:beep_factor=4:duration=5 +@end example + +@item +Generate a 1 kHz sine wave following @code{1602,1601,1602,1601,1602} NTSC +pattern: +@example +sine=1000:samples_per_frame='st(0,mod(n,5)); 1602-not(not(eq(ld(0),1)+eq(ld(0),3)))' +@end example +@end itemize + +@c man end AUDIO SOURCES + +@chapter Audio Sinks +@c man begin AUDIO SINKS + +Below is a description of the currently available audio sinks. + +@section abuffersink + +Buffer audio frames, and make them available to the end of filter chain. + +This sink is mainly intended for programmatic use, in particular +through the interface defined in @file{libavfilter/buffersink.h} +or the options system. + +It accepts a pointer to an AVABufferSinkContext structure, which +defines the incoming buffers' formats, to be passed as the opaque +parameter to @code{avfilter_init_filter} for initialization. +@section anullsink + +Null audio sink; do absolutely nothing with the input audio. It is +mainly useful as a template and for use in analysis / debugging +tools. + +@c man end AUDIO SINKS + +@chapter Video Filters +@c man begin VIDEO FILTERS + +When you configure your FFmpeg build, you can disable any of the +existing filters using @code{--disable-filters}. +The configure output will show the video filters included in your +build. + +Below is a description of the currently available video filters. + +@section alphaextract + +Extract the alpha component from the input as a grayscale video. This +is especially useful with the @var{alphamerge} filter. + +@section alphamerge + +Add or replace the alpha component of the primary input with the +grayscale value of a second input. This is intended for use with +@var{alphaextract} to allow the transmission or storage of frame +sequences that have alpha in a format that doesn't support an alpha +channel. + +For example, to reconstruct full frames from a normal YUV-encoded video +and a separate video created with @var{alphaextract}, you might use: +@example +movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out] +@end example + +Since this filter is designed for reconstruction, it operates on frame +sequences without considering timestamps, and terminates when either +input reaches end of stream. This will cause problems if your encoding +pipeline drops frames. If you're trying to apply an image as an +overlay to a video stream, consider the @var{overlay} filter instead. + +@section ass + +Same as the @ref{subtitles} filter, except that it doesn't require libavcodec +and libavformat to work. On the other hand, it is limited to ASS (Advanced +Substation Alpha) subtitles files. + +This filter accepts the following option in addition to the common options from +the @ref{subtitles} filter: + +@table @option +@item shaping +Set the shaping engine + +Available values are: +@table @samp +@item auto +The default libass shaping engine, which is the best available. +@item simple +Fast, font-agnostic shaper that can do only substitutions +@item complex +Slower shaper using OpenType for substitutions and positioning +@end table + +The default is @code{auto}. +@end table + +@section atadenoise +Apply an Adaptive Temporal Averaging Denoiser to the video input. + +The filter accepts the following options: + +@table @option +@item 0a +Set threshold A for 1st plane. Default is 0.02. +Valid range is 0 to 0.3. + +@item 0b +Set threshold B for 1st plane. Default is 0.04. +Valid range is 0 to 5. + +@item 1a +Set threshold A for 2nd plane. Default is 0.02. +Valid range is 0 to 0.3. + +@item 1b +Set threshold B for 2nd plane. Default is 0.04. +Valid range is 0 to 5. + +@item 2a +Set threshold A for 3rd plane. Default is 0.02. +Valid range is 0 to 0.3. + +@item 2b +Set threshold B for 3rd plane. Default is 0.04. +Valid range is 0 to 5. + +Threshold A is designed to react on abrupt changes in the input signal and +threshold B is designed to react on continuous changes in the input signal. + +@item s +Set number of frames filter will use for averaging. Default is 33. Must be odd +number in range [5, 129]. +@end table + +@section bbox + +Compute the bounding box for the non-black pixels in the input frame +luminance plane. + +This filter computes the bounding box containing all the pixels with a +luminance value greater than the minimum allowed value. +The parameters describing the bounding box are printed on the filter +log. + +The filter accepts the following option: + +@table @option +@item min_val +Set the minimal luminance value. Default is @code{16}. +@end table + +@section blackdetect + +Detect video intervals that are (almost) completely black. Can be +useful to detect chapter transitions, commercials, or invalid +recordings. Output lines contains the time for the start, end and +duration of the detected black interval expressed in seconds. + +In order to display the output lines, you need to set the loglevel at +least to the AV_LOG_INFO value. + +The filter accepts the following options: + +@table @option +@item black_min_duration, d +Set the minimum detected black duration expressed in seconds. It must +be a non-negative floating point number. + +Default value is 2.0. + +@item picture_black_ratio_th, pic_th +Set the threshold for considering a picture "black". +Express the minimum value for the ratio: +@example +@var{nb_black_pixels} / @var{nb_pixels} +@end example + +for which a picture is considered black. +Default value is 0.98. + +@item pixel_black_th, pix_th +Set the threshold for considering a pixel "black". + +The threshold expresses the maximum pixel luminance value for which a +pixel is considered "black". The provided value is scaled according to +the following equation: +@example +@var{absolute_threshold} = @var{luminance_minimum_value} + @var{pixel_black_th} * @var{luminance_range_size} +@end example + +@var{luminance_range_size} and @var{luminance_minimum_value} depend on +the input video format, the range is [0-255] for YUV full-range +formats and [16-235] for YUV non full-range formats. + +Default value is 0.10. +@end table + +The following example sets the maximum pixel threshold to the minimum +value, and detects only black intervals of 2 or more seconds: +@example +blackdetect=d=2:pix_th=0.00 +@end example + +@section blackframe + +Detect frames that are (almost) completely black. Can be useful to +detect chapter transitions or commercials. Output lines consist of +the frame number of the detected frame, the percentage of blackness, +the position in the file if known or -1 and the timestamp in seconds. + +In order to display the output lines, you need to set the loglevel at +least to the AV_LOG_INFO value. + +It accepts the following parameters: + +@table @option + +@item amount +The percentage of the pixels that have to be below the threshold; it defaults to +@code{98}. + +@item threshold, thresh +The threshold below which a pixel value is considered black; it defaults to +@code{32}. + +@end table + +@section blend, tblend + +Blend two video frames into each other. + +The @code{blend} filter takes two input streams and outputs one +stream, the first input is the "top" layer and second input is +"bottom" layer. Output terminates when shortest input terminates. + +The @code{tblend} (time blend) filter takes two consecutive frames +from one single stream, and outputs the result obtained by blending +the new frame on top of the old frame. + +A description of the accepted options follows. + +@table @option +@item c0_mode +@item c1_mode +@item c2_mode +@item c3_mode +@item all_mode +Set blend mode for specific pixel component or all pixel components in case +of @var{all_mode}. Default value is @code{normal}. + +Available values for component modes are: +@table @samp +@item addition +@item addition128 +@item and +@item average +@item burn +@item darken +@item difference +@item difference128 +@item divide +@item dodge +@item exclusion +@item glow +@item hardlight +@item hardmix +@item lighten +@item linearlight +@item multiply +@item multiply128 +@item negation +@item normal +@item or +@item overlay +@item phoenix +@item pinlight +@item reflect +@item screen +@item softlight +@item subtract +@item vividlight +@item xor +@end table + +@item c0_opacity +@item c1_opacity +@item c2_opacity +@item c3_opacity +@item all_opacity +Set blend opacity for specific pixel component or all pixel components in case +of @var{all_opacity}. Only used in combination with pixel component blend modes. + +@item c0_expr +@item c1_expr +@item c2_expr +@item c3_expr +@item all_expr +Set blend expression for specific pixel component or all pixel components in case +of @var{all_expr}. Note that related mode options will be ignored if those are set. + +The expressions can use the following variables: + +@table @option +@item N +The sequential number of the filtered frame, starting from @code{0}. + +@item X +@item Y +the coordinates of the current sample + +@item W +@item H +the width and height of currently filtered plane + +@item SW +@item SH +Width and height scale depending on the currently filtered plane. It is the +ratio between the corresponding luma plane number of pixels and the current +plane ones. E.g. for YUV4:2:0 the values are @code{1,1} for the luma plane, and +@code{0.5,0.5} for chroma planes. + +@item T +Time of the current frame, expressed in seconds. + +@item TOP, A +Value of pixel component at current location for first video frame (top layer). + +@item BOTTOM, B +Value of pixel component at current location for second video frame (bottom layer). +@end table + +@item shortest +Force termination when the shortest input terminates. Default is +@code{0}. This option is only defined for the @code{blend} filter. + +@item repeatlast +Continue applying the last bottom frame after the end of the stream. A value of +@code{0} disable the filter after the last frame of the bottom layer is reached. +Default is @code{1}. This option is only defined for the @code{blend} filter. +@end table + +@subsection Examples + +@itemize +@item +Apply transition from bottom layer to top layer in first 10 seconds: +@example +blend=all_expr='A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))' +@end example + +@item +Apply 1x1 checkerboard effect: +@example +blend=all_expr='if(eq(mod(X,2),mod(Y,2)),A,B)' +@end example + +@item +Apply uncover left effect: +@example +blend=all_expr='if(gte(N*SW+X,W),A,B)' +@end example + +@item +Apply uncover down effect: +@example +blend=all_expr='if(gte(Y-N*SH,0),A,B)' +@end example + +@item +Apply uncover up-left effect: +@example +blend=all_expr='if(gte(T*SH*40+Y,H)*gte((T*40*SW+X)*W/H,W),A,B)' +@end example + +@item +Split diagonally video and shows top and bottom layer on each side: +@example +blend=all_expr=if(gt(X,Y*(W/H)),A,B) +@end example + +@item +Display differences between the current and the previous frame: +@example +tblend=all_mode=difference128 +@end example +@end itemize + +@section boxblur + +Apply a boxblur algorithm to the input video. + +It accepts the following parameters: + +@table @option + +@item luma_radius, lr +@item luma_power, lp +@item chroma_radius, cr +@item chroma_power, cp +@item alpha_radius, ar +@item alpha_power, ap + +@end table + +A description of the accepted options follows. + +@table @option +@item luma_radius, lr +@item chroma_radius, cr +@item alpha_radius, ar +Set an expression for the box radius in pixels used for blurring the +corresponding input plane. + +The radius value must be a non-negative number, and must not be +greater than the value of the expression @code{min(w,h)/2} for the +luma and alpha planes, and of @code{min(cw,ch)/2} for the chroma +planes. + +Default value for @option{luma_radius} is "2". If not specified, +@option{chroma_radius} and @option{alpha_radius} default to the +corresponding value set for @option{luma_radius}. + +The expressions can contain the following constants: +@table @option +@item w +@item h +The input width and height in pixels. + +@item cw +@item ch +The input chroma image width and height in pixels. + +@item hsub +@item vsub +The horizontal and vertical chroma subsample values. For example, for the +pixel format "yuv422p", @var{hsub} is 2 and @var{vsub} is 1. +@end table + +@item luma_power, lp +@item chroma_power, cp +@item alpha_power, ap +Specify how many times the boxblur filter is applied to the +corresponding plane. + +Default value for @option{luma_power} is 2. If not specified, +@option{chroma_power} and @option{alpha_power} default to the +corresponding value set for @option{luma_power}. + +A value of 0 will disable the effect. +@end table + +@subsection Examples + +@itemize +@item +Apply a boxblur filter with the luma, chroma, and alpha radii +set to 2: +@example +boxblur=luma_radius=2:luma_power=1 +boxblur=2:1 +@end example + +@item +Set the luma radius to 2, and alpha and chroma radius to 0: +@example +boxblur=2:1:cr=0:ar=0 +@end example + +@item +Set the luma and chroma radii to a fraction of the video dimension: +@example +boxblur=luma_radius=min(h\,w)/10:luma_power=1:chroma_radius=min(cw\,ch)/10:chroma_power=1 +@end example +@end itemize + +@section chromakey +YUV colorspace color/chroma keying. + +The filter accepts the following options: + +@table @option +@item color +The color which will be replaced with transparency. + +@item similarity +Similarity percentage with the key color. + +0.01 matches only the exact key color, while 1.0 matches everything. + +@item blend +Blend percentage. + +0.0 makes pixels either fully transparent, or not transparent at all. + +Higher values result in semi-transparent pixels, with a higher transparency +the more similar the pixels color is to the key color. + +@item yuv +Signals that the color passed is already in YUV instead of RGB. + +Litteral colors like "green" or "red" don't make sense with this enabled anymore. +This can be used to pass exact YUV values as hexadecimal numbers. +@end table + +@subsection Examples + +@itemize +@item +Make every green pixel in the input image transparent: +@example +ffmpeg -i input.png -vf chromakey=green out.png +@end example + +@item +Overlay a greenscreen-video on top of a static black background. +@example +ffmpeg -f lavfi -i color=c=black:s=1280x720 -i video.mp4 -shortest -filter_complex "[1:v]chromakey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mkv +@end example +@end itemize + +@section codecview + +Visualize information exported by some codecs. + +Some codecs can export information through frames using side-data or other +means. For example, some MPEG based codecs export motion vectors through the +@var{export_mvs} flag in the codec @option{flags2} option. + +The filter accepts the following option: + +@table @option +@item mv +Set motion vectors to visualize. + +Available flags for @var{mv} are: + +@table @samp +@item pf +forward predicted MVs of P-frames +@item bf +forward predicted MVs of B-frames +@item bb +backward predicted MVs of B-frames +@end table + +@item qp +Display quantization parameters using the chroma planes +@end table + +@subsection Examples + +@itemize +@item +Visualizes multi-directionals MVs from P and B-Frames using @command{ffplay}: +@example +ffplay -flags2 +export_mvs input.mpg -vf codecview=mv=pf+bf+bb +@end example +@end itemize + +@section colorbalance +Modify intensity of primary colors (red, green and blue) of input frames. + +The filter allows an input frame to be adjusted in the shadows, midtones or highlights +regions for the red-cyan, green-magenta or blue-yellow balance. + +A positive adjustment value shifts the balance towards the primary color, a negative +value towards the complementary color. + +The filter accepts the following options: + +@table @option +@item rs +@item gs +@item bs +Adjust red, green and blue shadows (darkest pixels). + +@item rm +@item gm +@item bm +Adjust red, green and blue midtones (medium pixels). + +@item rh +@item gh +@item bh +Adjust red, green and blue highlights (brightest pixels). + +Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{0}. +@end table + +@subsection Examples + +@itemize +@item +Add red color cast to shadows: +@example +colorbalance=rs=.3 +@end example +@end itemize + +@section colorkey +RGB colorspace color keying. + +The filter accepts the following options: + +@table @option +@item color +The color which will be replaced with transparency. + +@item similarity +Similarity percentage with the key color. + +0.01 matches only the exact key color, while 1.0 matches everything. + +@item blend +Blend percentage. + +0.0 makes pixels either fully transparent, or not transparent at all. + +Higher values result in semi-transparent pixels, with a higher transparency +the more similar the pixels color is to the key color. +@end table + +@subsection Examples + +@itemize +@item +Make every green pixel in the input image transparent: +@example +ffmpeg -i input.png -vf colorkey=green out.png +@end example + +@item +Overlay a greenscreen-video on top of a static background image. +@example +ffmpeg -i background.png -i video.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.3:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.flv +@end example +@end itemize + +@section colorlevels + +Adjust video input frames using levels. + +The filter accepts the following options: + +@table @option +@item rimin +@item gimin +@item bimin +@item aimin +Adjust red, green, blue and alpha input black point. +Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{0}. + +@item rimax +@item gimax +@item bimax +@item aimax +Adjust red, green, blue and alpha input white point. +Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{1}. + +Input levels are used to lighten highlights (bright tones), darken shadows +(dark tones), change the balance of bright and dark tones. + +@item romin +@item gomin +@item bomin +@item aomin +Adjust red, green, blue and alpha output black point. +Allowed ranges for options are @code{[0, 1.0]}. Defaults are @code{0}. + +@item romax +@item gomax +@item bomax +@item aomax +Adjust red, green, blue and alpha output white point. +Allowed ranges for options are @code{[0, 1.0]}. Defaults are @code{1}. + +Output levels allows manual selection of a constrained output level range. +@end table + +@subsection Examples + +@itemize +@item +Make video output darker: +@example +colorlevels=rimin=0.058:gimin=0.058:bimin=0.058 +@end example + +@item +Increase contrast: +@example +colorlevels=rimin=0.039:gimin=0.039:bimin=0.039:rimax=0.96:gimax=0.96:bimax=0.96 +@end example + +@item +Make video output lighter: +@example +colorlevels=rimax=0.902:gimax=0.902:bimax=0.902 +@end example + +@item +Increase brightness: +@example +colorlevels=romin=0.5:gomin=0.5:bomin=0.5 +@end example +@end itemize + +@section colorchannelmixer + +Adjust video input frames by re-mixing color channels. + +This filter modifies a color channel by adding the values associated to +the other channels of the same pixels. For example if the value to +modify is red, the output value will be: +@example +@var{red}=@var{red}*@var{rr} + @var{blue}*@var{rb} + @var{green}*@var{rg} + @var{alpha}*@var{ra} +@end example + +The filter accepts the following options: + +@table @option +@item rr +@item rg +@item rb +@item ra +Adjust contribution of input red, green, blue and alpha channels for output red channel. +Default is @code{1} for @var{rr}, and @code{0} for @var{rg}, @var{rb} and @var{ra}. + +@item gr +@item gg +@item gb +@item ga +Adjust contribution of input red, green, blue and alpha channels for output green channel. +Default is @code{1} for @var{gg}, and @code{0} for @var{gr}, @var{gb} and @var{ga}. + +@item br +@item bg +@item bb +@item ba +Adjust contribution of input red, green, blue and alpha channels for output blue channel. +Default is @code{1} for @var{bb}, and @code{0} for @var{br}, @var{bg} and @var{ba}. + +@item ar +@item ag +@item ab +@item aa +Adjust contribution of input red, green, blue and alpha channels for output alpha channel. +Default is @code{1} for @var{aa}, and @code{0} for @var{ar}, @var{ag} and @var{ab}. + +Allowed ranges for options are @code{[-2.0, 2.0]}. +@end table + +@subsection Examples + +@itemize +@item +Convert source to grayscale: +@example +colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 +@end example +@item +Simulate sepia tones: +@example +colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131 +@end example +@end itemize + +@section colormatrix + +Convert color matrix. + +The filter accepts the following options: + +@table @option +@item src +@item dst +Specify the source and destination color matrix. Both values must be +specified. + +The accepted values are: +@table @samp +@item bt709 +BT.709 + +@item bt601 +BT.601 + +@item smpte240m +SMPTE-240M + +@item fcc +FCC +@end table +@end table + +For example to convert from BT.601 to SMPTE-240M, use the command: +@example +colormatrix=bt601:smpte240m +@end example + +@section convolution + +Apply convolution 3x3 or 5x5 filter. + +The filter accepts the following options: + +@table @option +@item 0m +@item 1m +@item 2m +@item 3m +Set matrix for each plane. +Matrix is sequence of 9 or 25 signed integers. + +@item 0rdiv +@item 1rdiv +@item 2rdiv +@item 3rdiv +Set multiplier for calculated value for each plane. + +@item 0bias +@item 1bias +@item 2bias +@item 3bias +Set bias for each plane. This value is added to the result of the multiplication. +Useful for making the overall image brighter or darker. Default is 0.0. +@end table + +@subsection Examples + +@itemize +@item +Apply sharpen: +@example +convolution="0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0" +@end example + +@item +Apply blur: +@example +convolution="1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9" +@end example + +@item +Apply edge enhance: +@example +convolution="0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128" +@end example + +@item +Apply edge detect: +@example +convolution="0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128" +@end example + +@item +Apply emboss: +@example +convolution="-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2" +@end example +@end itemize + +@section copy + +Copy the input source unchanged to the output. This is mainly useful for +testing purposes. + +@section crop + +Crop the input video to given dimensions. + +It accepts the following parameters: + +@table @option +@item w, out_w +The width of the output video. It defaults to @code{iw}. +This expression is evaluated only once during the filter +configuration, or when the @samp{w} or @samp{out_w} command is sent. + +@item h, out_h +The height of the output video. It defaults to @code{ih}. +This expression is evaluated only once during the filter +configuration, or when the @samp{h} or @samp{out_h} command is sent. + +@item x +The horizontal position, in the input video, of the left edge of the output +video. It defaults to @code{(in_w-out_w)/2}. +This expression is evaluated per-frame. + +@item y +The vertical position, in the input video, of the top edge of the output video. +It defaults to @code{(in_h-out_h)/2}. +This expression is evaluated per-frame. + +@item keep_aspect +If set to 1 will force the output display aspect ratio +to be the same of the input, by changing the output sample aspect +ratio. It defaults to 0. +@end table + +The @var{out_w}, @var{out_h}, @var{x}, @var{y} parameters are +expressions containing the following constants: + +@table @option +@item x +@item y +The computed values for @var{x} and @var{y}. They are evaluated for +each new frame. + +@item in_w +@item in_h +The input width and height. + +@item iw +@item ih +These are the same as @var{in_w} and @var{in_h}. + +@item out_w +@item out_h +The output (cropped) width and height. + +@item ow +@item oh +These are the same as @var{out_w} and @var{out_h}. + +@item a +same as @var{iw} / @var{ih} + +@item sar +input sample aspect ratio + +@item dar +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar} + +@item hsub +@item vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item n +The number of the input frame, starting from 0. + +@item pos +the position in the file of the input frame, NAN if unknown + +@item t +The timestamp expressed in seconds. It's NAN if the input timestamp is unknown. + +@end table + +The expression for @var{out_w} may depend on the value of @var{out_h}, +and the expression for @var{out_h} may depend on @var{out_w}, but they +cannot depend on @var{x} and @var{y}, as @var{x} and @var{y} are +evaluated after @var{out_w} and @var{out_h}. + +The @var{x} and @var{y} parameters specify the expressions for the +position of the top-left corner of the output (non-cropped) area. They +are evaluated for each frame. If the evaluated value is not valid, it +is approximated to the nearest valid value. + +The expression for @var{x} may depend on @var{y}, and the expression +for @var{y} may depend on @var{x}. + +@subsection Examples + +@itemize +@item +Crop area with size 100x100 at position (12,34). +@example +crop=100:100:12:34 +@end example + +Using named options, the example above becomes: +@example +crop=w=100:h=100:x=12:y=34 +@end example + +@item +Crop the central input area with size 100x100: +@example +crop=100:100 +@end example + +@item +Crop the central input area with size 2/3 of the input video: +@example +crop=2/3*in_w:2/3*in_h +@end example + +@item +Crop the input video central square: +@example +crop=out_w=in_h +crop=in_h +@end example + +@item +Delimit the rectangle with the top-left corner placed at position +100:100 and the right-bottom corner corresponding to the right-bottom +corner of the input image. +@example +crop=in_w-100:in_h-100:100:100 +@end example + +@item +Crop 10 pixels from the left and right borders, and 20 pixels from +the top and bottom borders +@example +crop=in_w-2*10:in_h-2*20 +@end example + +@item +Keep only the bottom right quarter of the input image: +@example +crop=in_w/2:in_h/2:in_w/2:in_h/2 +@end example + +@item +Crop height for getting Greek harmony: +@example +crop=in_w:1/PHI*in_w +@end example + +@item +Apply trembling effect: +@example +crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7) +@end example + +@item +Apply erratic camera effect depending on timestamp: +@example +crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(t*10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(t*13)" +@end example + +@item +Set x depending on the value of y: +@example +crop=in_w/2:in_h/2:y:10+10*sin(n/10) +@end example +@end itemize + +@subsection Commands + +This filter supports the following commands: +@table @option +@item w, out_w +@item h, out_h +@item x +@item y +Set width/height of the output video and the horizontal/vertical position +in the input video. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@end table + +@section cropdetect + +Auto-detect the crop size. + +It calculates the necessary cropping parameters and prints the +recommended parameters via the logging system. The detected dimensions +correspond to the non-black area of the input video. + +It accepts the following parameters: + +@table @option + +@item limit +Set higher black value threshold, which can be optionally specified +from nothing (0) to everything (255 for 8bit based formats). An intensity +value greater to the set value is considered non-black. It defaults to 24. +You can also specify a value between 0.0 and 1.0 which will be scaled depending +on the bitdepth of the pixel format. + +@item round +The value which the width/height should be divisible by. It defaults to +16. The offset is automatically adjusted to center the video. Use 2 to +get only even dimensions (needed for 4:2:2 video). 16 is best when +encoding to most video codecs. + +@item reset_count, reset +Set the counter that determines after how many frames cropdetect will +reset the previously detected largest video area and start over to +detect the current optimal crop area. Default value is 0. + +This can be useful when channel logos distort the video area. 0 +indicates 'never reset', and returns the largest area encountered during +playback. +@end table + +@anchor{curves} +@section curves + +Apply color adjustments using curves. + +This filter is similar to the Adobe Photoshop and GIMP curves tools. Each +component (red, green and blue) has its values defined by @var{N} key points +tied from each other using a smooth curve. The x-axis represents the pixel +values from the input frame, and the y-axis the new pixel values to be set for +the output frame. + +By default, a component curve is defined by the two points @var{(0;0)} and +@var{(1;1)}. This creates a straight line where each original pixel value is +"adjusted" to its own value, which means no change to the image. + +The filter allows you to redefine these two points and add some more. A new +curve (using a natural cubic spline interpolation) will be define to pass +smoothly through all these new coordinates. The new defined points needs to be +strictly increasing over the x-axis, and their @var{x} and @var{y} values must +be in the @var{[0;1]} interval. If the computed curves happened to go outside +the vector spaces, the values will be clipped accordingly. + +If there is no key point defined in @code{x=0}, the filter will automatically +insert a @var{(0;0)} point. In the same way, if there is no key point defined +in @code{x=1}, the filter will automatically insert a @var{(1;1)} point. + +The filter accepts the following options: + +@table @option +@item preset +Select one of the available color presets. This option can be used in addition +to the @option{r}, @option{g}, @option{b} parameters; in this case, the later +options takes priority on the preset values. +Available presets are: +@table @samp +@item none +@item color_negative +@item cross_process +@item darker +@item increase_contrast +@item lighter +@item linear_contrast +@item medium_contrast +@item negative +@item strong_contrast +@item vintage +@end table +Default is @code{none}. +@item master, m +Set the master key points. These points will define a second pass mapping. It +is sometimes called a "luminance" or "value" mapping. It can be used with +@option{r}, @option{g}, @option{b} or @option{all} since it acts like a +post-processing LUT. +@item red, r +Set the key points for the red component. +@item green, g +Set the key points for the green component. +@item blue, b +Set the key points for the blue component. +@item all +Set the key points for all components (not including master). +Can be used in addition to the other key points component +options. In this case, the unset component(s) will fallback on this +@option{all} setting. +@item psfile +Specify a Photoshop curves file (@code{.acv}) to import the settings from. +@end table + +To avoid some filtergraph syntax conflicts, each key points list need to be +defined using the following syntax: @code{x0/y0 x1/y1 x2/y2 ...}. + +@subsection Examples + +@itemize +@item +Increase slightly the middle level of blue: +@example +curves=blue='0.5/0.58' +@end example + +@item +Vintage effect: +@example +curves=r='0/0.11 .42/.51 1/0.95':g='0.50/0.48':b='0/0.22 .49/.44 1/0.8' +@end example +Here we obtain the following coordinates for each components: +@table @var +@item red +@code{(0;0.11) (0.42;0.51) (1;0.95)} +@item green +@code{(0;0) (0.50;0.48) (1;1)} +@item blue +@code{(0;0.22) (0.49;0.44) (1;0.80)} +@end table + +@item +The previous example can also be achieved with the associated built-in preset: +@example +curves=preset=vintage +@end example + +@item +Or simply: +@example +curves=vintage +@end example + +@item +Use a Photoshop preset and redefine the points of the green component: +@example +curves=psfile='MyCurvesPresets/purple.acv':green='0.45/0.53' +@end example +@end itemize + +@section dctdnoiz + +Denoise frames using 2D DCT (frequency domain filtering). + +This filter is not designed for real time. + +The filter accepts the following options: + +@table @option +@item sigma, s +Set the noise sigma constant. + +This @var{sigma} defines a hard threshold of @code{3 * sigma}; every DCT +coefficient (absolute value) below this threshold with be dropped. + +If you need a more advanced filtering, see @option{expr}. + +Default is @code{0}. + +@item overlap +Set number overlapping pixels for each block. Since the filter can be slow, you +may want to reduce this value, at the cost of a less effective filter and the +risk of various artefacts. + +If the overlapping value doesn't permit processing the whole input width or +height, a warning will be displayed and according borders won't be denoised. + +Default value is @var{blocksize}-1, which is the best possible setting. + +@item expr, e +Set the coefficient factor expression. + +For each coefficient of a DCT block, this expression will be evaluated as a +multiplier value for the coefficient. + +If this is option is set, the @option{sigma} option will be ignored. + +The absolute value of the coefficient can be accessed through the @var{c} +variable. + +@item n +Set the @var{blocksize} using the number of bits. @code{1<<@var{n}} defines the +@var{blocksize}, which is the width and height of the processed blocks. + +The default value is @var{3} (8x8) and can be raised to @var{4} for a +@var{blocksize} of 16x16. Note that changing this setting has huge consequences +on the speed processing. Also, a larger block size does not necessarily means a +better de-noising. +@end table + +@subsection Examples + +Apply a denoise with a @option{sigma} of @code{4.5}: +@example +dctdnoiz=4.5 +@end example + +The same operation can be achieved using the expression system: +@example +dctdnoiz=e='gte(c, 4.5*3)' +@end example + +Violent denoise using a block size of @code{16x16}: +@example +dctdnoiz=15:n=4 +@end example + +@section deband + +Remove banding artifacts from input video. +It works by replacing banded pixels with average value of referenced pixels. + +The filter accepts the following options: + +@table @option +@item 1thr +@item 2thr +@item 3thr +@item 4thr +Set banding detection threshold for each plane. Default is 0.02. +Valid range is 0.00003 to 0.5. +If difference between current pixel and reference pixel is less than threshold, +it will be considered as banded. + +@item range, r +Banding detection range in pixels. Default is 16. If positive, random number +in range 0 to set value will be used. If negative, exact absolute value +will be used. +The range defines square of four pixels around current pixel. + +@item direction, d +Set direction in radians from which four pixel will be compared. If positive, +random direction from 0 to set direction will be picked. If negative, exact of +absolute value will be picked. For example direction 0, -PI or -2*PI radians +will pick only pixels on same row and -PI/2 will pick only pixels on same +column. + +@item blur +If enabled, current pixel is compared with average value of all four +surrounding pixels. The default is enabled. If disabled current pixel is +compared with all four surrounding pixels. The pixel is considered banded +if only all four differences with surrounding pixels are less than threshold. +@end table + +@anchor{decimate} +@section decimate + +Drop duplicated frames at regular intervals. + +The filter accepts the following options: + +@table @option +@item cycle +Set the number of frames from which one will be dropped. Setting this to +@var{N} means one frame in every batch of @var{N} frames will be dropped. +Default is @code{5}. + +@item dupthresh +Set the threshold for duplicate detection. If the difference metric for a frame +is less than or equal to this value, then it is declared as duplicate. Default +is @code{1.1} + +@item scthresh +Set scene change threshold. Default is @code{15}. + +@item blockx +@item blocky +Set the size of the x and y-axis blocks used during metric calculations. +Larger blocks give better noise suppression, but also give worse detection of +small movements. Must be a power of two. Default is @code{32}. + +@item ppsrc +Mark main input as a pre-processed input and activate clean source input +stream. This allows the input to be pre-processed with various filters to help +the metrics calculation while keeping the frame selection lossless. When set to +@code{1}, the first stream is for the pre-processed input, and the second +stream is the clean source from where the kept frames are chosen. Default is +@code{0}. + +@item chroma +Set whether or not chroma is considered in the metric calculations. Default is +@code{1}. +@end table + +@section deflate + +Apply deflate effect to the video. + +This filter replaces the pixel by the local(3x3) average by taking into account +only values lower than the pixel. + +It accepts the following options: + +@table @option +@item threshold0 +@item threshold1 +@item threshold2 +@item threshold3 +Limit the maximum change for each plane, default is 65535. +If 0, plane will remain unchanged. +@end table + +@section dejudder + +Remove judder produced by partially interlaced telecined content. + +Judder can be introduced, for instance, by @ref{pullup} filter. If the original +source was partially telecined content then the output of @code{pullup,dejudder} +will have a variable frame rate. May change the recorded frame rate of the +container. Aside from that change, this filter will not affect constant frame +rate video. + +The option available in this filter is: +@table @option + +@item cycle +Specify the length of the window over which the judder repeats. + +Accepts any integer greater than 1. Useful values are: +@table @samp + +@item 4 +If the original was telecined from 24 to 30 fps (Film to NTSC). + +@item 5 +If the original was telecined from 25 to 30 fps (PAL to NTSC). + +@item 20 +If a mixture of the two. +@end table + +The default is @samp{4}. +@end table + +@section delogo + +Suppress a TV station logo by a simple interpolation of the surrounding +pixels. Just set a rectangle covering the logo and watch it disappear +(and sometimes something even uglier appear - your mileage may vary). + +It accepts the following parameters: +@table @option + +@item x +@item y +Specify the top left corner coordinates of the logo. They must be +specified. + +@item w +@item h +Specify the width and height of the logo to clear. They must be +specified. + +@item band, t +Specify the thickness of the fuzzy edge of the rectangle (added to +@var{w} and @var{h}). The default value is 1. This option is +deprecated, setting higher values should no longer be necessary and +is not recommended. + +@item show +When set to 1, a green rectangle is drawn on the screen to simplify +finding the right @var{x}, @var{y}, @var{w}, and @var{h} parameters. +The default value is 0. + +The rectangle is drawn on the outermost pixels which will be (partly) +replaced with interpolated values. The values of the next pixels +immediately outside this rectangle in each direction will be used to +compute the interpolated pixel values inside the rectangle. + +@end table + +@subsection Examples + +@itemize +@item +Set a rectangle covering the area with top left corner coordinates 0,0 +and size 100x77, and a band of size 10: +@example +delogo=x=0:y=0:w=100:h=77:band=10 +@end example + +@end itemize + +@section deshake + +Attempt to fix small changes in horizontal and/or vertical shift. This +filter helps remove camera shake from hand-holding a camera, bumping a +tripod, moving on a vehicle, etc. + +The filter accepts the following options: + +@table @option + +@item x +@item y +@item w +@item h +Specify a rectangular area where to limit the search for motion +vectors. +If desired the search for motion vectors can be limited to a +rectangular area of the frame defined by its top left corner, width +and height. These parameters have the same meaning as the drawbox +filter which can be used to visualise the position of the bounding +box. + +This is useful when simultaneous movement of subjects within the frame +might be confused for camera motion by the motion vector search. + +If any or all of @var{x}, @var{y}, @var{w} and @var{h} are set to -1 +then the full frame is used. This allows later options to be set +without specifying the bounding box for the motion vector search. + +Default - search the whole frame. + +@item rx +@item ry +Specify the maximum extent of movement in x and y directions in the +range 0-64 pixels. Default 16. + +@item edge +Specify how to generate pixels to fill blanks at the edge of the +frame. Available values are: +@table @samp +@item blank, 0 +Fill zeroes at blank locations +@item original, 1 +Original image at blank locations +@item clamp, 2 +Extruded edge value at blank locations +@item mirror, 3 +Mirrored edge at blank locations +@end table +Default value is @samp{mirror}. + +@item blocksize +Specify the blocksize to use for motion search. Range 4-128 pixels, +default 8. + +@item contrast +Specify the contrast threshold for blocks. Only blocks with more than +the specified contrast (difference between darkest and lightest +pixels) will be considered. Range 1-255, default 125. + +@item search +Specify the search strategy. Available values are: +@table @samp +@item exhaustive, 0 +Set exhaustive search +@item less, 1 +Set less exhaustive search. +@end table +Default value is @samp{exhaustive}. + +@item filename +If set then a detailed log of the motion search is written to the +specified file. + +@item opencl +If set to 1, specify using OpenCL capabilities, only available if +FFmpeg was configured with @code{--enable-opencl}. Default value is 0. + +@end table + +@section detelecine + +Apply an exact inverse of the telecine operation. It requires a predefined +pattern specified using the pattern option which must be the same as that passed +to the telecine filter. + +This filter accepts the following options: + +@table @option +@item first_field +@table @samp +@item top, t +top field first +@item bottom, b +bottom field first +The default value is @code{top}. +@end table + +@item pattern +A string of numbers representing the pulldown pattern you wish to apply. +The default value is @code{23}. + +@item start_frame +A number representing position of the first frame with respect to the telecine +pattern. This is to be used if the stream is cut. The default value is @code{0}. +@end table + +@section dilation + +Apply dilation effect to the video. + +This filter replaces the pixel by the local(3x3) maximum. + +It accepts the following options: + +@table @option +@item threshold0 +@item threshold1 +@item threshold2 +@item threshold3 +Limit the maximum change for each plane, default is 65535. +If 0, plane will remain unchanged. + +@item coordinates +Flag which specifies the pixel to refer to. Default is 255 i.e. all eight +pixels are used. + +Flags to local 3x3 coordinates maps like this: + + 1 2 3 + 4 5 + 6 7 8 +@end table + +@section displace + +Displace pixels as indicated by second and third input stream. + +It takes three input streams and outputs one stream, the first input is the +source, and second and third input are displacement maps. + +The second input specifies how much to displace pixels along the +x-axis, while the third input specifies how much to displace pixels +along the y-axis. +If one of displacement map streams terminates, last frame from that +displacement map will be used. + +Note that once generated, displacements maps can be reused over and over again. + +A description of the accepted options follows. + +@table @option +@item edge +Set displace behavior for pixels that are out of range. + +Available values are: +@table @samp +@item blank +Missing pixels are replaced by black pixels. + +@item smear +Adjacent pixels will spread out to replace missing pixels. + +@item wrap +Out of range pixels are wrapped so they point to pixels of other side. +@end table +Default is @samp{smear}. + +@end table + +@subsection Examples + +@itemize +@item +Add ripple effect to rgb input of video size hd720: +@example +ffmpeg -i INPUT -f lavfi -i nullsrc=s=hd720,lutrgb=128:128:128 -f lavfi -i nullsrc=s=hd720,geq='r=128+30*sin(2*PI*X/400+T):g=128+30*sin(2*PI*X/400+T):b=128+30*sin(2*PI*X/400+T)' -lavfi '[0][1][2]displace' OUTPUT +@end example + +@item +Add wave effect to rgb input of video size hd720: +@example +ffmpeg -i INPUT -f lavfi -i nullsrc=hd720,geq='r=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):g=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):b=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T))' -lavfi '[1]split[x][y],[0][x][y]displace' OUTPUT +@end example +@end itemize + +@section drawbox + +Draw a colored box on the input image. + +It accepts the following parameters: + +@table @option +@item x +@item y +The expressions which specify the top left corner coordinates of the box. It defaults to 0. + +@item width, w +@item height, h +The expressions which specify the width and height of the box; if 0 they are interpreted as +the input width and height. It defaults to 0. + +@item color, c +Specify the color of the box to write. For the general syntax of this option, +check the "Color" section in the ffmpeg-utils manual. If the special +value @code{invert} is used, the box edge color is the same as the +video with inverted luma. + +@item thickness, t +The expression which sets the thickness of the box edge. Default value is @code{3}. + +See below for the list of accepted constants. +@end table + +The parameters for @var{x}, @var{y}, @var{w} and @var{h} and @var{t} are expressions containing the +following constants: + +@table @option +@item dar +The input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}. + +@item hsub +@item vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item in_h, ih +@item in_w, iw +The input width and height. + +@item sar +The input sample aspect ratio. + +@item x +@item y +The x and y offset coordinates where the box is drawn. + +@item w +@item h +The width and height of the drawn box. + +@item t +The thickness of the drawn box. + +These constants allow the @var{x}, @var{y}, @var{w}, @var{h} and @var{t} expressions to refer to +each other, so you may for example specify @code{y=x/dar} or @code{h=w/dar}. + +@end table + +@subsection Examples + +@itemize +@item +Draw a black box around the edge of the input image: +@example +drawbox +@end example + +@item +Draw a box with color red and an opacity of 50%: +@example +drawbox=10:20:200:60:red@@0.5 +@end example + +The previous example can be specified as: +@example +drawbox=x=10:y=20:w=200:h=60:color=red@@0.5 +@end example + +@item +Fill the box with pink color: +@example +drawbox=x=10:y=10:w=100:h=100:color=pink@@0.5:t=max +@end example + +@item +Draw a 2-pixel red 2.40:1 mask: +@example +drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red +@end example +@end itemize + +@section drawgraph, adrawgraph + +Draw a graph using input video or audio metadata. + +It accepts the following parameters: + +@table @option +@item m1 +Set 1st frame metadata key from which metadata values will be used to draw a graph. + +@item fg1 +Set 1st foreground color expression. + +@item m2 +Set 2nd frame metadata key from which metadata values will be used to draw a graph. + +@item fg2 +Set 2nd foreground color expression. + +@item m3 +Set 3rd frame metadata key from which metadata values will be used to draw a graph. + +@item fg3 +Set 3rd foreground color expression. + +@item m4 +Set 4th frame metadata key from which metadata values will be used to draw a graph. + +@item fg4 +Set 4th foreground color expression. + +@item min +Set minimal value of metadata value. + +@item max +Set maximal value of metadata value. + +@item bg +Set graph background color. Default is white. + +@item mode +Set graph mode. + +Available values for mode is: +@table @samp +@item bar +@item dot +@item line +@end table + +Default is @code{line}. + +@item slide +Set slide mode. + +Available values for slide is: +@table @samp +@item frame +Draw new frame when right border is reached. + +@item replace +Replace old columns with new ones. + +@item scroll +Scroll from right to left. + +@item rscroll +Scroll from left to right. +@end table + +Default is @code{frame}. + +@item size +Set size of graph video. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +The default value is @code{900x256}. + +The foreground color expressions can use the following variables: +@table @option +@item MIN +Minimal value of metadata value. + +@item MAX +Maximal value of metadata value. + +@item VAL +Current metadata key value. +@end table + +The color is defined as 0xAABBGGRR. +@end table + +Example using metadata from @ref{signalstats} filter: +@example +signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255 +@end example + +Example using metadata from @ref{ebur128} filter: +@example +ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-120:max=5 +@end example + +@section drawgrid + +Draw a grid on the input image. + +It accepts the following parameters: + +@table @option +@item x +@item y +The expressions which specify the coordinates of some point of grid intersection (meant to configure offset). Both default to 0. + +@item width, w +@item height, h +The expressions which specify the width and height of the grid cell, if 0 they are interpreted as the +input width and height, respectively, minus @code{thickness}, so image gets +framed. Default to 0. + +@item color, c +Specify the color of the grid. For the general syntax of this option, +check the "Color" section in the ffmpeg-utils manual. If the special +value @code{invert} is used, the grid color is the same as the +video with inverted luma. + +@item thickness, t +The expression which sets the thickness of the grid line. Default value is @code{1}. + +See below for the list of accepted constants. +@end table + +The parameters for @var{x}, @var{y}, @var{w} and @var{h} and @var{t} are expressions containing the +following constants: + +@table @option +@item dar +The input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}. + +@item hsub +@item vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item in_h, ih +@item in_w, iw +The input grid cell width and height. + +@item sar +The input sample aspect ratio. + +@item x +@item y +The x and y coordinates of some point of grid intersection (meant to configure offset). + +@item w +@item h +The width and height of the drawn cell. + +@item t +The thickness of the drawn cell. + +These constants allow the @var{x}, @var{y}, @var{w}, @var{h} and @var{t} expressions to refer to +each other, so you may for example specify @code{y=x/dar} or @code{h=w/dar}. + +@end table + +@subsection Examples + +@itemize +@item +Draw a grid with cell 100x100 pixels, thickness 2 pixels, with color red and an opacity of 50%: +@example +drawgrid=width=100:height=100:thickness=2:color=red@@0.5 +@end example + +@item +Draw a white 3x3 grid with an opacity of 50%: +@example +drawgrid=w=iw/3:h=ih/3:t=2:c=white@@0.5 +@end example +@end itemize + +@anchor{drawtext} +@section drawtext + +Draw a text string or text from a specified file on top of a video, using the +libfreetype library. + +To enable compilation of this filter, you need to configure FFmpeg with +@code{--enable-libfreetype}. +To enable default font fallback and the @var{font} option you need to +configure FFmpeg with @code{--enable-libfontconfig}. +To enable the @var{text_shaping} option, you need to configure FFmpeg with +@code{--enable-libfribidi}. + +@subsection Syntax + +It accepts the following parameters: + +@table @option + +@item box +Used to draw a box around text using the background color. +The value must be either 1 (enable) or 0 (disable). +The default value of @var{box} is 0. + +@item boxborderw +Set the width of the border to be drawn around the box using @var{boxcolor}. +The default value of @var{boxborderw} is 0. + +@item boxcolor +The color to be used for drawing box around text. For the syntax of this +option, check the "Color" section in the ffmpeg-utils manual. + +The default value of @var{boxcolor} is "white". + +@item borderw +Set the width of the border to be drawn around the text using @var{bordercolor}. +The default value of @var{borderw} is 0. + +@item bordercolor +Set the color to be used for drawing border around text. For the syntax of this +option, check the "Color" section in the ffmpeg-utils manual. + +The default value of @var{bordercolor} is "black". + +@item expansion +Select how the @var{text} is expanded. Can be either @code{none}, +@code{strftime} (deprecated) or +@code{normal} (default). See the @ref{drawtext_expansion, Text expansion} section +below for details. + +@item fix_bounds +If true, check and fix text coords to avoid clipping. + +@item fontcolor +The color to be used for drawing fonts. For the syntax of this option, check +the "Color" section in the ffmpeg-utils manual. + +The default value of @var{fontcolor} is "black". + +@item fontcolor_expr +String which is expanded the same way as @var{text} to obtain dynamic +@var{fontcolor} value. By default this option has empty value and is not +processed. When this option is set, it overrides @var{fontcolor} option. + +@item font +The font family to be used for drawing text. By default Sans. + +@item fontfile +The font file to be used for drawing text. The path must be included. +This parameter is mandatory if the fontconfig support is disabled. + +@item draw +This option does not exist, please see the timeline system + +@item alpha +Draw the text applying alpha blending. The value can +be either a number between 0.0 and 1.0 +The expression accepts the same variables @var{x, y} do. +The default value is 1. +Please see fontcolor_expr + +@item fontsize +The font size to be used for drawing text. +The default value of @var{fontsize} is 16. + +@item text_shaping +If set to 1, attempt to shape the text (for example, reverse the order of +right-to-left text and join Arabic characters) before drawing it. +Otherwise, just draw the text exactly as given. +By default 1 (if supported). + +@item ft_load_flags +The flags to be used for loading the fonts. + +The flags map the corresponding flags supported by libfreetype, and are +a combination of the following values: +@table @var +@item default +@item no_scale +@item no_hinting +@item render +@item no_bitmap +@item vertical_layout +@item force_autohint +@item crop_bitmap +@item pedantic +@item ignore_global_advance_width +@item no_recurse +@item ignore_transform +@item monochrome +@item linear_design +@item no_autohint +@end table + +Default value is "default". + +For more information consult the documentation for the FT_LOAD_* +libfreetype flags. + +@item shadowcolor +The color to be used for drawing a shadow behind the drawn text. For the +syntax of this option, check the "Color" section in the ffmpeg-utils manual. + +The default value of @var{shadowcolor} is "black". + +@item shadowx +@item shadowy +The x and y offsets for the text shadow position with respect to the +position of the text. They can be either positive or negative +values. The default value for both is "0". + +@item start_number +The starting frame number for the n/frame_num variable. The default value +is "0". + +@item tabsize +The size in number of spaces to use for rendering the tab. +Default value is 4. + +@item timecode +Set the initial timecode representation in "hh:mm:ss[:;.]ff" +format. It can be used with or without text parameter. @var{timecode_rate} +option must be specified. + +@item timecode_rate, rate, r +Set the timecode frame rate (timecode only). + +@item text +The text string to be drawn. The text must be a sequence of UTF-8 +encoded characters. +This parameter is mandatory if no file is specified with the parameter +@var{textfile}. + +@item textfile +A text file containing text to be drawn. The text must be a sequence +of UTF-8 encoded characters. + +This parameter is mandatory if no text string is specified with the +parameter @var{text}. + +If both @var{text} and @var{textfile} are specified, an error is thrown. + +@item reload +If set to 1, the @var{textfile} will be reloaded before each frame. +Be sure to update it atomically, or it may be read partially, or even fail. + +@item x +@item y +The expressions which specify the offsets where text will be drawn +within the video frame. They are relative to the top/left border of the +output image. + +The default value of @var{x} and @var{y} is "0". + +See below for the list of accepted constants and functions. +@end table + +The parameters for @var{x} and @var{y} are expressions containing the +following constants and functions: + +@table @option +@item dar +input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar} + +@item hsub +@item vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item line_h, lh +the height of each text line + +@item main_h, h, H +the input height + +@item main_w, w, W +the input width + +@item max_glyph_a, ascent +the maximum distance from the baseline to the highest/upper grid +coordinate used to place a glyph outline point, for all the rendered +glyphs. +It is a positive value, due to the grid's orientation with the Y axis +upwards. + +@item max_glyph_d, descent +the maximum distance from the baseline to the lowest grid coordinate +used to place a glyph outline point, for all the rendered glyphs. +This is a negative value, due to the grid's orientation, with the Y axis +upwards. + +@item max_glyph_h +maximum glyph height, that is the maximum height for all the glyphs +contained in the rendered text, it is equivalent to @var{ascent} - +@var{descent}. + +@item max_glyph_w +maximum glyph width, that is the maximum width for all the glyphs +contained in the rendered text + +@item n +the number of input frame, starting from 0 + +@item rand(min, max) +return a random number included between @var{min} and @var{max} + +@item sar +The input sample aspect ratio. + +@item t +timestamp expressed in seconds, NAN if the input timestamp is unknown + +@item text_h, th +the height of the rendered text + +@item text_w, tw +the width of the rendered text + +@item x +@item y +the x and y offset coordinates where the text is drawn. + +These parameters allow the @var{x} and @var{y} expressions to refer +each other, so you can for example specify @code{y=x/dar}. +@end table + +@anchor{drawtext_expansion} +@subsection Text expansion + +If @option{expansion} is set to @code{strftime}, +the filter recognizes strftime() sequences in the provided text and +expands them accordingly. Check the documentation of strftime(). This +feature is deprecated. + +If @option{expansion} is set to @code{none}, the text is printed verbatim. + +If @option{expansion} is set to @code{normal} (which is the default), +the following expansion mechanism is used. + +The backslash character @samp{\}, followed by any character, always expands to +the second character. + +Sequence of the form @code{%@{...@}} are expanded. The text between the +braces is a function name, possibly followed by arguments separated by ':'. +If the arguments contain special characters or delimiters (':' or '@}'), +they should be escaped. + +Note that they probably must also be escaped as the value for the +@option{text} option in the filter argument string and as the filter +argument in the filtergraph description, and possibly also for the shell, +that makes up to four levels of escaping; using a text file avoids these +problems. + +The following functions are available: + +@table @command + +@item expr, e +The expression evaluation result. + +It must take one argument specifying the expression to be evaluated, +which accepts the same constants and functions as the @var{x} and +@var{y} values. Note that not all constants should be used, for +example the text size is not known when evaluating the expression, so +the constants @var{text_w} and @var{text_h} will have an undefined +value. + +@item expr_int_format, eif +Evaluate the expression's value and output as formatted integer. + +The first argument is the expression to be evaluated, just as for the @var{expr} function. +The second argument specifies the output format. Allowed values are @samp{x}, +@samp{X}, @samp{d} and @samp{u}. They are treated exactly as in the +@code{printf} function. +The third parameter is optional and sets the number of positions taken by the output. +It can be used to add padding with zeros from the left. + +@item gmtime +The time at which the filter is running, expressed in UTC. +It can accept an argument: a strftime() format string. + +@item localtime +The time at which the filter is running, expressed in the local time zone. +It can accept an argument: a strftime() format string. + +@item metadata +Frame metadata. It must take one argument specifying metadata key. + +@item n, frame_num +The frame number, starting from 0. + +@item pict_type +A 1 character description of the current picture type. + +@item pts +The timestamp of the current frame. +It can take up to three arguments. + +The first argument is the format of the timestamp; it defaults to @code{flt} +for seconds as a decimal number with microsecond accuracy; @code{hms} stands +for a formatted @var{[-]HH:MM:SS.mmm} timestamp with millisecond accuracy. +@code{gmtime} stands for the timestamp of the frame formatted as UTC time; +@code{localtime} stands for the timestamp of the frame formatted as +local time zone time. + +The second argument is an offset added to the timestamp. + +If the format is set to @code{localtime} or @code{gmtime}, +a third argument may be supplied: a strftime() format string. +By default, @var{YYYY-MM-DD HH:MM:SS} format will be used. +@end table + +@subsection Examples + +@itemize +@item +Draw "Test Text" with font FreeSerif, using the default values for the +optional parameters. + +@example +drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'" +@end example + +@item +Draw 'Test Text' with font FreeSerif of size 24 at position x=100 +and y=50 (counting from the top-left corner of the screen), text is +yellow with a red box around it. Both the text and the box have an +opacity of 20%. + +@example +drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text':\ + x=100: y=50: fontsize=24: fontcolor=yellow@@0.2: box=1: boxcolor=red@@0.2" +@end example + +Note that the double quotes are not necessary if spaces are not used +within the parameter list. + +@item +Show the text at the center of the video frame: +@example +drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2" +@end example + +@item +Show a text line sliding from right to left in the last row of the video +frame. The file @file{LONG_LINE} is assumed to contain a single line +with no newlines. +@example +drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t" +@end example + +@item +Show the content of file @file{CREDITS} off the bottom of the frame and scroll up. +@example +drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t" +@end example + +@item +Draw a single green letter "g", at the center of the input video. +The glyph baseline is placed at half screen height. +@example +drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent" +@end example + +@item +Show text for 1 second every 3 seconds: +@example +drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t\,3)\,1):text='blink'" +@end example + +@item +Use fontconfig to set the font. Note that the colons need to be escaped. +@example +drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg' +@end example + +@item +Print the date of a real-time encoding (see strftime(3)): +@example +drawtext='fontfile=FreeSans.ttf:text=%@{localtime\:%a %b %d %Y@}' +@end example + +@item +Show text fading in and out (appearing/disappearing): +@example +#!/bin/sh +DS=1.0 # display start +DE=10.0 # display end +FID=1.5 # fade in duration +FOD=5 # fade out duration +ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%@{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 @}" +@end example + +@end itemize + +For more information about libfreetype, check: +@url{http://www.freetype.org/}. + +For more information about fontconfig, check: +@url{http://freedesktop.org/software/fontconfig/fontconfig-user.html}. + +For more information about libfribidi, check: +@url{http://fribidi.org/}. + +@section edgedetect + +Detect and draw edges. The filter uses the Canny Edge Detection algorithm. + +The filter accepts the following options: + +@table @option +@item low +@item high +Set low and high threshold values used by the Canny thresholding +algorithm. + +The high threshold selects the "strong" edge pixels, which are then +connected through 8-connectivity with the "weak" edge pixels selected +by the low threshold. + +@var{low} and @var{high} threshold values must be chosen in the range +[0,1], and @var{low} should be lesser or equal to @var{high}. + +Default value for @var{low} is @code{20/255}, and default value for @var{high} +is @code{50/255}. + +@item mode +Define the drawing mode. + +@table @samp +@item wires +Draw white/gray wires on black background. + +@item colormix +Mix the colors to create a paint/cartoon effect. +@end table + +Default value is @var{wires}. +@end table + +@subsection Examples + +@itemize +@item +Standard edge detection with custom values for the hysteresis thresholding: +@example +edgedetect=low=0.1:high=0.4 +@end example + +@item +Painting effect without thresholding: +@example +edgedetect=mode=colormix:high=0 +@end example +@end itemize + +@section eq +Set brightness, contrast, saturation and approximate gamma adjustment. + +The filter accepts the following options: + +@table @option +@item contrast +Set the contrast expression. The value must be a float value in range +@code{-2.0} to @code{2.0}. The default value is "1". + +@item brightness +Set the brightness expression. The value must be a float value in +range @code{-1.0} to @code{1.0}. The default value is "0". + +@item saturation +Set the saturation expression. The value must be a float in +range @code{0.0} to @code{3.0}. The default value is "1". + +@item gamma +Set the gamma expression. The value must be a float in range +@code{0.1} to @code{10.0}. The default value is "1". + +@item gamma_r +Set the gamma expression for red. The value must be a float in +range @code{0.1} to @code{10.0}. The default value is "1". + +@item gamma_g +Set the gamma expression for green. The value must be a float in range +@code{0.1} to @code{10.0}. The default value is "1". + +@item gamma_b +Set the gamma expression for blue. The value must be a float in range +@code{0.1} to @code{10.0}. The default value is "1". + +@item gamma_weight +Set the gamma weight expression. It can be used to reduce the effect +of a high gamma value on bright image areas, e.g. keep them from +getting overamplified and just plain white. The value must be a float +in range @code{0.0} to @code{1.0}. A value of @code{0.0} turns the +gamma correction all the way down while @code{1.0} leaves it at its +full strength. Default is "1". + +@item eval +Set when the expressions for brightness, contrast, saturation and +gamma expressions are evaluated. + +It accepts the following values: +@table @samp +@item init +only evaluate expressions once during the filter initialization or +when a command is processed + +@item frame +evaluate expressions for each incoming frame +@end table + +Default value is @samp{init}. +@end table + +The expressions accept the following parameters: +@table @option +@item n +frame count of the input frame starting from 0 + +@item pos +byte position of the corresponding packet in the input file, NAN if +unspecified + +@item r +frame rate of the input video, NAN if the input frame rate is unknown + +@item t +timestamp expressed in seconds, NAN if the input timestamp is unknown +@end table + +@subsection Commands +The filter supports the following commands: + +@table @option +@item contrast +Set the contrast expression. + +@item brightness +Set the brightness expression. + +@item saturation +Set the saturation expression. + +@item gamma +Set the gamma expression. + +@item gamma_r +Set the gamma_r expression. + +@item gamma_g +Set gamma_g expression. + +@item gamma_b +Set gamma_b expression. + +@item gamma_weight +Set gamma_weight expression. + +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. + +@end table + +@section erosion + +Apply erosion effect to the video. + +This filter replaces the pixel by the local(3x3) minimum. + +It accepts the following options: + +@table @option +@item threshold0 +@item threshold1 +@item threshold2 +@item threshold3 +Limit the maximum change for each plane, default is 65535. +If 0, plane will remain unchanged. + +@item coordinates +Flag which specifies the pixel to refer to. Default is 255 i.e. all eight +pixels are used. + +Flags to local 3x3 coordinates maps like this: + + 1 2 3 + 4 5 + 6 7 8 +@end table + +@section extractplanes + +Extract color channel components from input video stream into +separate grayscale video streams. + +The filter accepts the following option: + +@table @option +@item planes +Set plane(s) to extract. + +Available values for planes are: +@table @samp +@item y +@item u +@item v +@item a +@item r +@item g +@item b +@end table + +Choosing planes not available in the input will result in an error. +That means you cannot select @code{r}, @code{g}, @code{b} planes +with @code{y}, @code{u}, @code{v} planes at same time. +@end table + +@subsection Examples + +@itemize +@item +Extract luma, u and v color channel component from input video frame +into 3 grayscale outputs: +@example +ffmpeg -i video.avi -filter_complex 'extractplanes=y+u+v[y][u][v]' -map '[y]' y.avi -map '[u]' u.avi -map '[v]' v.avi +@end example +@end itemize + +@section elbg + +Apply a posterize effect using the ELBG (Enhanced LBG) algorithm. + +For each input image, the filter will compute the optimal mapping from +the input to the output given the codebook length, that is the number +of distinct output colors. + +This filter accepts the following options. + +@table @option +@item codebook_length, l +Set codebook length. The value must be a positive integer, and +represents the number of distinct output colors. Default value is 256. + +@item nb_steps, n +Set the maximum number of iterations to apply for computing the optimal +mapping. The higher the value the better the result and the higher the +computation time. Default value is 1. + +@item seed, s +Set a random seed, must be an integer included between 0 and +UINT32_MAX. If not specified, or if explicitly set to -1, the filter +will try to use a good random seed on a best effort basis. + +@item pal8 +Set pal8 output pixel format. This option does not work with codebook +length greater than 256. +@end table + +@section fade + +Apply a fade-in/out effect to the input video. + +It accepts the following parameters: + +@table @option +@item type, t +The effect type can be either "in" for a fade-in, or "out" for a fade-out +effect. +Default is @code{in}. + +@item start_frame, s +Specify the number of the frame to start applying the fade +effect at. Default is 0. + +@item nb_frames, n +The number of frames that the fade effect lasts. At the end of the +fade-in effect, the output video will have the same intensity as the input video. +At the end of the fade-out transition, the output video will be filled with the +selected @option{color}. +Default is 25. + +@item alpha +If set to 1, fade only alpha channel, if one exists on the input. +Default value is 0. + +@item start_time, st +Specify the timestamp (in seconds) of the frame to start to apply the fade +effect. If both start_frame and start_time are specified, the fade will start at +whichever comes last. Default is 0. + +@item duration, d +The number of seconds for which the fade effect has to last. At the end of the +fade-in effect the output video will have the same intensity as the input video, +at the end of the fade-out transition the output video will be filled with the +selected @option{color}. +If both duration and nb_frames are specified, duration is used. Default is 0 +(nb_frames is used by default). + +@item color, c +Specify the color of the fade. Default is "black". +@end table + +@subsection Examples + +@itemize +@item +Fade in the first 30 frames of video: +@example +fade=in:0:30 +@end example + +The command above is equivalent to: +@example +fade=t=in:s=0:n=30 +@end example + +@item +Fade out the last 45 frames of a 200-frame video: +@example +fade=out:155:45 +fade=type=out:start_frame=155:nb_frames=45 +@end example + +@item +Fade in the first 25 frames and fade out the last 25 frames of a 1000-frame video: +@example +fade=in:0:25, fade=out:975:25 +@end example + +@item +Make the first 5 frames yellow, then fade in from frame 5-24: +@example +fade=in:5:20:color=yellow +@end example + +@item +Fade in alpha over first 25 frames of video: +@example +fade=in:0:25:alpha=1 +@end example + +@item +Make the first 5.5 seconds black, then fade in for 0.5 seconds: +@example +fade=t=in:st=5.5:d=0.5 +@end example + +@end itemize + +@section fftfilt +Apply arbitrary expressions to samples in frequency domain + +@table @option +@item dc_Y +Adjust the dc value (gain) of the luma plane of the image. The filter +accepts an integer value in range @code{0} to @code{1000}. The default +value is set to @code{0}. + +@item dc_U +Adjust the dc value (gain) of the 1st chroma plane of the image. The +filter accepts an integer value in range @code{0} to @code{1000}. The +default value is set to @code{0}. + +@item dc_V +Adjust the dc value (gain) of the 2nd chroma plane of the image. The +filter accepts an integer value in range @code{0} to @code{1000}. The +default value is set to @code{0}. + +@item weight_Y +Set the frequency domain weight expression for the luma plane. + +@item weight_U +Set the frequency domain weight expression for the 1st chroma plane. + +@item weight_V +Set the frequency domain weight expression for the 2nd chroma plane. + +The filter accepts the following variables: +@item X +@item Y +The coordinates of the current sample. + +@item W +@item H +The width and height of the image. +@end table + +@subsection Examples + +@itemize +@item +High-pass: +@example +fftfilt=dc_Y=128:weight_Y='squish(1-(Y+X)/100)' +@end example + +@item +Low-pass: +@example +fftfilt=dc_Y=0:weight_Y='squish((Y+X)/100-1)' +@end example + +@item +Sharpen: +@example +fftfilt=dc_Y=0:weight_Y='1+squish(1-(Y+X)/100)' +@end example + +@item +Blur: +@example +fftfilt=dc_Y=0:weight_Y='exp(-4 * ((Y+X)/(W+H)))' +@end example + +@end itemize + +@section field + +Extract a single field from an interlaced image using stride +arithmetic to avoid wasting CPU time. The output frames are marked as +non-interlaced. + +The filter accepts the following options: + +@table @option +@item type +Specify whether to extract the top (if the value is @code{0} or +@code{top}) or the bottom field (if the value is @code{1} or +@code{bottom}). +@end table + +@section fieldmatch + +Field matching filter for inverse telecine. It is meant to reconstruct the +progressive frames from a telecined stream. The filter does not drop duplicated +frames, so to achieve a complete inverse telecine @code{fieldmatch} needs to be +followed by a decimation filter such as @ref{decimate} in the filtergraph. + +The separation of the field matching and the decimation is notably motivated by +the possibility of inserting a de-interlacing filter fallback between the two. +If the source has mixed telecined and real interlaced content, +@code{fieldmatch} will not be able to match fields for the interlaced parts. +But these remaining combed frames will be marked as interlaced, and thus can be +de-interlaced by a later filter such as @ref{yadif} before decimation. + +In addition to the various configuration options, @code{fieldmatch} can take an +optional second stream, activated through the @option{ppsrc} option. If +enabled, the frames reconstruction will be based on the fields and frames from +this second stream. This allows the first input to be pre-processed in order to +help the various algorithms of the filter, while keeping the output lossless +(assuming the fields are matched properly). Typically, a field-aware denoiser, +or brightness/contrast adjustments can help. + +Note that this filter uses the same algorithms as TIVTC/TFM (AviSynth project) +and VIVTC/VFM (VapourSynth project). The later is a light clone of TFM from +which @code{fieldmatch} is based on. While the semantic and usage are very +close, some behaviour and options names can differ. + +The @ref{decimate} filter currently only works for constant frame rate input. +If your input has mixed telecined (30fps) and progressive content with a lower +framerate like 24fps use the following filterchain to produce the necessary cfr +stream: @code{dejudder,fps=30000/1001,fieldmatch,decimate}. + +The filter accepts the following options: + +@table @option +@item order +Specify the assumed field order of the input stream. Available values are: + +@table @samp +@item auto +Auto detect parity (use FFmpeg's internal parity value). +@item bff +Assume bottom field first. +@item tff +Assume top field first. +@end table + +Note that it is sometimes recommended not to trust the parity announced by the +stream. + +Default value is @var{auto}. + +@item mode +Set the matching mode or strategy to use. @option{pc} mode is the safest in the +sense that it won't risk creating jerkiness due to duplicate frames when +possible, but if there are bad edits or blended fields it will end up +outputting combed frames when a good match might actually exist. On the other +hand, @option{pcn_ub} mode is the most risky in terms of creating jerkiness, +but will almost always find a good frame if there is one. The other values are +all somewhere in between @option{pc} and @option{pcn_ub} in terms of risking +jerkiness and creating duplicate frames versus finding good matches in sections +with bad edits, orphaned fields, blended fields, etc. + +More details about p/c/n/u/b are available in @ref{p/c/n/u/b meaning} section. + +Available values are: + +@table @samp +@item pc +2-way matching (p/c) +@item pc_n +2-way matching, and trying 3rd match if still combed (p/c + n) +@item pc_u +2-way matching, and trying 3rd match (same order) if still combed (p/c + u) +@item pc_n_ub +2-way matching, trying 3rd match if still combed, and trying 4th/5th matches if +still combed (p/c + n + u/b) +@item pcn +3-way matching (p/c/n) +@item pcn_ub +3-way matching, and trying 4th/5th matches if all 3 of the original matches are +detected as combed (p/c/n + u/b) +@end table + +The parenthesis at the end indicate the matches that would be used for that +mode assuming @option{order}=@var{tff} (and @option{field} on @var{auto} or +@var{top}). + +In terms of speed @option{pc} mode is by far the fastest and @option{pcn_ub} is +the slowest. + +Default value is @var{pc_n}. + +@item ppsrc +Mark the main input stream as a pre-processed input, and enable the secondary +input stream as the clean source to pick the fields from. See the filter +introduction for more details. It is similar to the @option{clip2} feature from +VFM/TFM. + +Default value is @code{0} (disabled). + +@item field +Set the field to match from. It is recommended to set this to the same value as +@option{order} unless you experience matching failures with that setting. In +certain circumstances changing the field that is used to match from can have a +large impact on matching performance. Available values are: + +@table @samp +@item auto +Automatic (same value as @option{order}). +@item bottom +Match from the bottom field. +@item top +Match from the top field. +@end table + +Default value is @var{auto}. + +@item mchroma +Set whether or not chroma is included during the match comparisons. In most +cases it is recommended to leave this enabled. You should set this to @code{0} +only if your clip has bad chroma problems such as heavy rainbowing or other +artifacts. Setting this to @code{0} could also be used to speed things up at +the cost of some accuracy. + +Default value is @code{1}. + +@item y0 +@item y1 +These define an exclusion band which excludes the lines between @option{y0} and +@option{y1} from being included in the field matching decision. An exclusion +band can be used to ignore subtitles, a logo, or other things that may +interfere with the matching. @option{y0} sets the starting scan line and +@option{y1} sets the ending line; all lines in between @option{y0} and +@option{y1} (including @option{y0} and @option{y1}) will be ignored. Setting +@option{y0} and @option{y1} to the same value will disable the feature. +@option{y0} and @option{y1} defaults to @code{0}. + +@item scthresh +Set the scene change detection threshold as a percentage of maximum change on +the luma plane. Good values are in the @code{[8.0, 14.0]} range. Scene change +detection is only relevant in case @option{combmatch}=@var{sc}. The range for +@option{scthresh} is @code{[0.0, 100.0]}. + +Default value is @code{12.0}. + +@item combmatch +When @option{combatch} is not @var{none}, @code{fieldmatch} will take into +account the combed scores of matches when deciding what match to use as the +final match. Available values are: + +@table @samp +@item none +No final matching based on combed scores. +@item sc +Combed scores are only used when a scene change is detected. +@item full +Use combed scores all the time. +@end table + +Default is @var{sc}. + +@item combdbg +Force @code{fieldmatch} to calculate the combed metrics for certain matches and +print them. This setting is known as @option{micout} in TFM/VFM vocabulary. +Available values are: + +@table @samp +@item none +No forced calculation. +@item pcn +Force p/c/n calculations. +@item pcnub +Force p/c/n/u/b calculations. +@end table + +Default value is @var{none}. + +@item cthresh +This is the area combing threshold used for combed frame detection. This +essentially controls how "strong" or "visible" combing must be to be detected. +Larger values mean combing must be more visible and smaller values mean combing +can be less visible or strong and still be detected. Valid settings are from +@code{-1} (every pixel will be detected as combed) to @code{255} (no pixel will +be detected as combed). This is basically a pixel difference value. A good +range is @code{[8, 12]}. + +Default value is @code{9}. + +@item chroma +Sets whether or not chroma is considered in the combed frame decision. Only +disable this if your source has chroma problems (rainbowing, etc.) that are +causing problems for the combed frame detection with chroma enabled. Actually, +using @option{chroma}=@var{0} is usually more reliable, except for the case +where there is chroma only combing in the source. + +Default value is @code{0}. + +@item blockx +@item blocky +Respectively set the x-axis and y-axis size of the window used during combed +frame detection. This has to do with the size of the area in which +@option{combpel} pixels are required to be detected as combed for a frame to be +declared combed. See the @option{combpel} parameter description for more info. +Possible values are any number that is a power of 2 starting at 4 and going up +to 512. + +Default value is @code{16}. + +@item combpel +The number of combed pixels inside any of the @option{blocky} by +@option{blockx} size blocks on the frame for the frame to be detected as +combed. While @option{cthresh} controls how "visible" the combing must be, this +setting controls "how much" combing there must be in any localized area (a +window defined by the @option{blockx} and @option{blocky} settings) on the +frame. Minimum value is @code{0} and maximum is @code{blocky x blockx} (at +which point no frames will ever be detected as combed). This setting is known +as @option{MI} in TFM/VFM vocabulary. + +Default value is @code{80}. +@end table + +@anchor{p/c/n/u/b meaning} +@subsection p/c/n/u/b meaning + +@subsubsection p/c/n + +We assume the following telecined stream: + +@example +Top fields: 1 2 2 3 4 +Bottom fields: 1 2 3 4 4 +@end example + +The numbers correspond to the progressive frame the fields relate to. Here, the +first two frames are progressive, the 3rd and 4th are combed, and so on. + +When @code{fieldmatch} is configured to run a matching from bottom +(@option{field}=@var{bottom}) this is how this input stream get transformed: + +@example +Input stream: + T 1 2 2 3 4 + B 1 2 3 4 4 <-- matching reference + +Matches: c c n n c + +Output stream: + T 1 2 3 4 4 + B 1 2 3 4 4 +@end example + +As a result of the field matching, we can see that some frames get duplicated. +To perform a complete inverse telecine, you need to rely on a decimation filter +after this operation. See for instance the @ref{decimate} filter. + +The same operation now matching from top fields (@option{field}=@var{top}) +looks like this: + +@example +Input stream: + T 1 2 2 3 4 <-- matching reference + B 1 2 3 4 4 + +Matches: c c p p c + +Output stream: + T 1 2 2 3 4 + B 1 2 2 3 4 +@end example + +In these examples, we can see what @var{p}, @var{c} and @var{n} mean; +basically, they refer to the frame and field of the opposite parity: + +@itemize +@item @var{p} matches the field of the opposite parity in the previous frame +@item @var{c} matches the field of the opposite parity in the current frame +@item @var{n} matches the field of the opposite parity in the next frame +@end itemize + +@subsubsection u/b + +The @var{u} and @var{b} matching are a bit special in the sense that they match +from the opposite parity flag. In the following examples, we assume that we are +currently matching the 2nd frame (Top:2, bottom:2). According to the match, a +'x' is placed above and below each matched fields. + +With bottom matching (@option{field}=@var{bottom}): +@example +Match: c p n b u + + x x x x x + Top 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 + Bottom 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 + x x x x x + +Output frames: + 2 1 2 2 2 + 2 2 2 1 3 +@end example + +With top matching (@option{field}=@var{top}): +@example +Match: c p n b u + + x x x x x + Top 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 + Bottom 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 + x x x x x + +Output frames: + 2 2 2 1 2 + 2 1 3 2 2 +@end example + +@subsection Examples + +Simple IVTC of a top field first telecined stream: +@example +fieldmatch=order=tff:combmatch=none, decimate +@end example + +Advanced IVTC, with fallback on @ref{yadif} for still combed frames: +@example +fieldmatch=order=tff:combmatch=full, yadif=deint=interlaced, decimate +@end example + +@section fieldorder + +Transform the field order of the input video. + +It accepts the following parameters: + +@table @option + +@item order +The output field order. Valid values are @var{tff} for top field first or @var{bff} +for bottom field first. +@end table + +The default value is @samp{tff}. + +The transformation is done by shifting the picture content up or down +by one line, and filling the remaining line with appropriate picture content. +This method is consistent with most broadcast field order converters. + +If the input video is not flagged as being interlaced, or it is already +flagged as being of the required output field order, then this filter does +not alter the incoming video. + +It is very useful when converting to or from PAL DV material, +which is bottom field first. + +For example: +@example +ffmpeg -i in.vob -vf "fieldorder=bff" out.dv +@end example + +@section fifo, afifo + +Buffer input images and send them when they are requested. + +It is mainly useful when auto-inserted by the libavfilter +framework. + +It does not take parameters. + +@section find_rect + +Find a rectangular object + +It accepts the following options: + +@table @option +@item object +Filepath of the object image, needs to be in gray8. + +@item threshold +Detection threshold, default is 0.5. + +@item mipmaps +Number of mipmaps, default is 3. + +@item xmin, ymin, xmax, ymax +Specifies the rectangle in which to search. +@end table + +@subsection Examples + +@itemize +@item +Generate a representative palette of a given video using @command{ffmpeg}: +@example +ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv +@end example +@end itemize + +@section cover_rect + +Cover a rectangular object + +It accepts the following options: + +@table @option +@item cover +Filepath of the optional cover image, needs to be in yuv420. + +@item mode +Set covering mode. + +It accepts the following values: +@table @samp +@item cover +cover it by the supplied image +@item blur +cover it by interpolating the surrounding pixels +@end table + +Default value is @var{blur}. +@end table + +@subsection Examples + +@itemize +@item +Generate a representative palette of a given video using @command{ffmpeg}: +@example +ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv +@end example +@end itemize + +@anchor{format} +@section format + +Convert the input video to one of the specified pixel formats. +Libavfilter will try to pick one that is suitable as input to +the next filter. + +It accepts the following parameters: +@table @option + +@item pix_fmts +A '|'-separated list of pixel format names, such as +"pix_fmts=yuv420p|monow|rgb24". + +@end table + +@subsection Examples + +@itemize +@item +Convert the input video to the @var{yuv420p} format +@example +format=pix_fmts=yuv420p +@end example + +Convert the input video to any of the formats in the list +@example +format=pix_fmts=yuv420p|yuv444p|yuv410p +@end example +@end itemize + +@anchor{fps} +@section fps + +Convert the video to specified constant frame rate by duplicating or dropping +frames as necessary. + +It accepts the following parameters: +@table @option + +@item fps +The desired output frame rate. The default is @code{25}. + +@item round +Rounding method. + +Possible values are: +@table @option +@item zero +zero round towards 0 +@item inf +round away from 0 +@item down +round towards -infinity +@item up +round towards +infinity +@item near +round to nearest +@end table +The default is @code{near}. + +@item start_time +Assume the first PTS should be the given value, in seconds. This allows for +padding/trimming at the start of stream. By default, no assumption is made +about the first frame's expected PTS, so no padding or trimming is done. +For example, this could be set to 0 to pad the beginning with duplicates of +the first frame if a video stream starts after the audio stream or to trim any +frames with a negative PTS. + +@end table + +Alternatively, the options can be specified as a flat string: +@var{fps}[:@var{round}]. + +See also the @ref{setpts} filter. + +@subsection Examples + +@itemize +@item +A typical usage in order to set the fps to 25: +@example +fps=fps=25 +@end example + +@item +Sets the fps to 24, using abbreviation and rounding method to round to nearest: +@example +fps=fps=film:round=near +@end example +@end itemize + +@section framepack + +Pack two different video streams into a stereoscopic video, setting proper +metadata on supported codecs. The two views should have the same size and +framerate and processing will stop when the shorter video ends. Please note +that you may conveniently adjust view properties with the @ref{scale} and +@ref{fps} filters. + +It accepts the following parameters: +@table @option + +@item format +The desired packing format. Supported values are: + +@table @option + +@item sbs +The views are next to each other (default). + +@item tab +The views are on top of each other. + +@item lines +The views are packed by line. + +@item columns +The views are packed by column. + +@item frameseq +The views are temporally interleaved. + +@end table + +@end table + +Some examples: + +@example +# Convert left and right views into a frame-sequential video +ffmpeg -i LEFT -i RIGHT -filter_complex framepack=frameseq OUTPUT + +# Convert views into a side-by-side video with the same output resolution as the input +ffmpeg -i LEFT -i RIGHT -filter_complex [0:v]scale=w=iw/2[left],[1:v]scale=w=iw/2[right],[left][right]framepack=sbs OUTPUT +@end example + +@section framerate + +Change the frame rate by interpolating new video output frames from the source +frames. + +This filter is not designed to function correctly with interlaced media. If +you wish to change the frame rate of interlaced media then you are required +to deinterlace before this filter and re-interlace after this filter. + +A description of the accepted options follows. + +@table @option +@item fps +Specify the output frames per second. This option can also be specified +as a value alone. The default is @code{50}. + +@item interp_start +Specify the start of a range where the output frame will be created as a +linear interpolation of two frames. The range is [@code{0}-@code{255}], +the default is @code{15}. + +@item interp_end +Specify the end of a range where the output frame will be created as a +linear interpolation of two frames. The range is [@code{0}-@code{255}], +the default is @code{240}. + +@item scene +Specify the level at which a scene change is detected as a value between +0 and 100 to indicate a new scene; a low value reflects a low +probability for the current frame to introduce a new scene, while a higher +value means the current frame is more likely to be one. +The default is @code{7}. + +@item flags +Specify flags influencing the filter process. + +Available value for @var{flags} is: + +@table @option +@item scene_change_detect, scd +Enable scene change detection using the value of the option @var{scene}. +This flag is enabled by default. +@end table +@end table + +@section framestep + +Select one frame every N-th frame. + +This filter accepts the following option: +@table @option +@item step +Select frame after every @code{step} frames. +Allowed values are positive integers higher than 0. Default value is @code{1}. +@end table + +@anchor{frei0r} +@section frei0r + +Apply a frei0r effect to the input video. + +To enable the compilation of this filter, you need to install the frei0r +header and configure FFmpeg with @code{--enable-frei0r}. + +It accepts the following parameters: + +@table @option + +@item filter_name +The name of the frei0r effect to load. If the environment variable +@env{FREI0R_PATH} is defined, the frei0r effect is searched for in each of the +directories specified by the colon-separated list in @env{FREIOR_PATH}. +Otherwise, the standard frei0r paths are searched, in this order: +@file{HOME/.frei0r-1/lib/}, @file{/usr/local/lib/frei0r-1/}, +@file{/usr/lib/frei0r-1/}. + +@item filter_params +A '|'-separated list of parameters to pass to the frei0r effect. + +@end table + +A frei0r effect parameter can be a boolean (its value is either +"y" or "n"), a double, a color (specified as +@var{R}/@var{G}/@var{B}, where @var{R}, @var{G}, and @var{B} are floating point +numbers between 0.0 and 1.0, inclusive) or by a color description specified in the "Color" +section in the ffmpeg-utils manual), a position (specified as @var{X}/@var{Y}, where +@var{X} and @var{Y} are floating point numbers) and/or a string. + +The number and types of parameters depend on the loaded effect. If an +effect parameter is not specified, the default value is set. + +@subsection Examples + +@itemize +@item +Apply the distort0r effect, setting the first two double parameters: +@example +frei0r=filter_name=distort0r:filter_params=0.5|0.01 +@end example + +@item +Apply the colordistance effect, taking a color as the first parameter: +@example +frei0r=colordistance:0.2/0.3/0.4 +frei0r=colordistance:violet +frei0r=colordistance:0x112233 +@end example + +@item +Apply the perspective effect, specifying the top left and top right image +positions: +@example +frei0r=perspective:0.2/0.2|0.8/0.2 +@end example +@end itemize + +For more information, see +@url{http://frei0r.dyne.org} + +@section fspp + +Apply fast and simple postprocessing. It is a faster version of @ref{spp}. + +It splits (I)DCT into horizontal/vertical passes. Unlike the simple post- +processing filter, one of them is performed once per block, not per pixel. +This allows for much higher speed. + +The filter accepts the following options: + +@table @option +@item quality +Set quality. This option defines the number of levels for averaging. It accepts +an integer in the range 4-5. Default value is @code{4}. + +@item qp +Force a constant quantization parameter. It accepts an integer in range 0-63. +If not set, the filter will use the QP from the video stream (if available). + +@item strength +Set filter strength. It accepts an integer in range -15 to 32. Lower values mean +more details but also more artifacts, while higher values make the image smoother +but also blurrier. Default value is @code{0} − PSNR optimal. + +@item use_bframe_qp +Enable the use of the QP from the B-Frames if set to @code{1}. Using this +option may cause flicker since the B-Frames have often larger QP. Default is +@code{0} (not enabled). + +@end table + +@section geq + +The filter accepts the following options: + +@table @option +@item lum_expr, lum +Set the luminance expression. +@item cb_expr, cb +Set the chrominance blue expression. +@item cr_expr, cr +Set the chrominance red expression. +@item alpha_expr, a +Set the alpha expression. +@item red_expr, r +Set the red expression. +@item green_expr, g +Set the green expression. +@item blue_expr, b +Set the blue expression. +@end table + +The colorspace is selected according to the specified options. If one +of the @option{lum_expr}, @option{cb_expr}, or @option{cr_expr} +options is specified, the filter will automatically select a YCbCr +colorspace. If one of the @option{red_expr}, @option{green_expr}, or +@option{blue_expr} options is specified, it will select an RGB +colorspace. + +If one of the chrominance expression is not defined, it falls back on the other +one. If no alpha expression is specified it will evaluate to opaque value. +If none of chrominance expressions are specified, they will evaluate +to the luminance expression. + +The expressions can use the following variables and functions: + +@table @option +@item N +The sequential number of the filtered frame, starting from @code{0}. + +@item X +@item Y +The coordinates of the current sample. + +@item W +@item H +The width and height of the image. + +@item SW +@item SH +Width and height scale depending on the currently filtered plane. It is the +ratio between the corresponding luma plane number of pixels and the current +plane ones. E.g. for YUV4:2:0 the values are @code{1,1} for the luma plane, and +@code{0.5,0.5} for chroma planes. + +@item T +Time of the current frame, expressed in seconds. + +@item p(x, y) +Return the value of the pixel at location (@var{x},@var{y}) of the current +plane. + +@item lum(x, y) +Return the value of the pixel at location (@var{x},@var{y}) of the luminance +plane. + +@item cb(x, y) +Return the value of the pixel at location (@var{x},@var{y}) of the +blue-difference chroma plane. Return 0 if there is no such plane. + +@item cr(x, y) +Return the value of the pixel at location (@var{x},@var{y}) of the +red-difference chroma plane. Return 0 if there is no such plane. + +@item r(x, y) +@item g(x, y) +@item b(x, y) +Return the value of the pixel at location (@var{x},@var{y}) of the +red/green/blue component. Return 0 if there is no such component. + +@item alpha(x, y) +Return the value of the pixel at location (@var{x},@var{y}) of the alpha +plane. Return 0 if there is no such plane. +@end table + +For functions, if @var{x} and @var{y} are outside the area, the value will be +automatically clipped to the closer edge. + +@subsection Examples + +@itemize +@item +Flip the image horizontally: +@example +geq=p(W-X\,Y) +@end example + +@item +Generate a bidimensional sine wave, with angle @code{PI/3} and a +wavelength of 100 pixels: +@example +geq=128 + 100*sin(2*(PI/100)*(cos(PI/3)*(X-50*T) + sin(PI/3)*Y)):128:128 +@end example + +@item +Generate a fancy enigmatic moving light: +@example +nullsrc=s=256x256,geq=random(1)/hypot(X-cos(N*0.07)*W/2-W/2\,Y-sin(N*0.09)*H/2-H/2)^2*1000000*sin(N*0.02):128:128 +@end example + +@item +Generate a quick emboss effect: +@example +format=gray,geq=lum_expr='(p(X,Y)+(256-p(X-4,Y-4)))/2' +@end example + +@item +Modify RGB components depending on pixel position: +@example +geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)' +@end example + +@item +Create a radial gradient that is the same size as the input (also see +the @ref{vignette} filter): +@example +geq=lum=255*gauss((X/W-0.5)*3)*gauss((Y/H-0.5)*3)/gauss(0)/gauss(0),format=gray +@end example + +@item +Diagonal split screen to compare filter effect: +@example +ffmpeg -i input -filter_complex "[0:v]geq=lum=if(gt(X\,Y*(W/H))\,255),format=gray[alpha];[0:v][alpha]alphamerge,curves=preset=color_negative[filtered];[0:v][filtered]overlay" output +@end example +@end itemize + +@section gradfun + +Fix the banding artifacts that are sometimes introduced into nearly flat +regions by truncation to 8bit color depth. +Interpolate the gradients that should go where the bands are, and +dither them. + +It is designed for playback only. Do not use it prior to +lossy compression, because compression tends to lose the dither and +bring back the bands. + +It accepts the following parameters: + +@table @option + +@item strength +The maximum amount by which the filter will change any one pixel. This is also +the threshold for detecting nearly flat regions. Acceptable values range from +.51 to 64; the default value is 1.2. Out-of-range values will be clipped to the +valid range. + +@item radius +The neighborhood to fit the gradient to. A larger radius makes for smoother +gradients, but also prevents the filter from modifying the pixels near detailed +regions. Acceptable values are 8-32; the default value is 16. Out-of-range +values will be clipped to the valid range. + +@end table + +Alternatively, the options can be specified as a flat string: +@var{strength}[:@var{radius}] + +@subsection Examples + +@itemize +@item +Apply the filter with a @code{3.5} strength and radius of @code{8}: +@example +gradfun=3.5:8 +@end example + +@item +Specify radius, omitting the strength (which will fall-back to the default +value): +@example +gradfun=radius=8 +@end example + +@end itemize + +@anchor{haldclut} +@section haldclut + +Apply a Hald CLUT to a video stream. + +First input is the video stream to process, and second one is the Hald CLUT. +The Hald CLUT input can be a simple picture or a complete video stream. + +The filter accepts the following options: + +@table @option +@item shortest +Force termination when the shortest input terminates. Default is @code{0}. +@item repeatlast +Continue applying the last CLUT after the end of the stream. A value of +@code{0} disable the filter after the last frame of the CLUT is reached. +Default is @code{1}. +@end table + +@code{haldclut} also has the same interpolation options as @ref{lut3d} (both +filters share the same internals). + +More information about the Hald CLUT can be found on Eskil Steenberg's website +(Hald CLUT author) at @url{http://www.quelsolaar.com/technology/clut.html}. + +@subsection Workflow examples + +@subsubsection Hald CLUT video stream + +Generate an identity Hald CLUT stream altered with various effects: +@example +ffmpeg -f lavfi -i @ref{haldclutsrc}=8 -vf "hue=H=2*PI*t:s=sin(2*PI*t)+1, curves=cross_process" -t 10 -c:v ffv1 clut.nut +@end example + +Note: make sure you use a lossless codec. + +Then use it with @code{haldclut} to apply it on some random stream: +@example +ffmpeg -f lavfi -i mandelbrot -i clut.nut -filter_complex '[0][1] haldclut' -t 20 mandelclut.mkv +@end example + +The Hald CLUT will be applied to the 10 first seconds (duration of +@file{clut.nut}), then the latest picture of that CLUT stream will be applied +to the remaining frames of the @code{mandelbrot} stream. + +@subsubsection Hald CLUT with preview + +A Hald CLUT is supposed to be a squared image of @code{Level*Level*Level} by +@code{Level*Level*Level} pixels. For a given Hald CLUT, FFmpeg will select the +biggest possible square starting at the top left of the picture. The remaining +padding pixels (bottom or right) will be ignored. This area can be used to add +a preview of the Hald CLUT. + +Typically, the following generated Hald CLUT will be supported by the +@code{haldclut} filter: + +@example +ffmpeg -f lavfi -i @ref{haldclutsrc}=8 -vf " + pad=iw+320 [padded_clut]; + smptebars=s=320x256, split [a][b]; + [padded_clut][a] overlay=W-320:h, curves=color_negative [main]; + [main][b] overlay=W-320" -frames:v 1 clut.png +@end example + +It contains the original and a preview of the effect of the CLUT: SMPTE color +bars are displayed on the right-top, and below the same color bars processed by +the color changes. + +Then, the effect of this Hald CLUT can be visualized with: +@example +ffplay input.mkv -vf "movie=clut.png, [in] haldclut" +@end example + +@section hflip + +Flip the input video horizontally. + +For example, to horizontally flip the input video with @command{ffmpeg}: +@example +ffmpeg -i in.avi -vf "hflip" out.avi +@end example + +@section histeq +This filter applies a global color histogram equalization on a +per-frame basis. + +It can be used to correct video that has a compressed range of pixel +intensities. The filter redistributes the pixel intensities to +equalize their distribution across the intensity range. It may be +viewed as an "automatically adjusting contrast filter". This filter is +useful only for correcting degraded or poorly captured source +video. + +The filter accepts the following options: + +@table @option +@item strength +Determine the amount of equalization to be applied. As the strength +is reduced, the distribution of pixel intensities more-and-more +approaches that of the input frame. The value must be a float number +in the range [0,1] and defaults to 0.200. + +@item intensity +Set the maximum intensity that can generated and scale the output +values appropriately. The strength should be set as desired and then +the intensity can be limited if needed to avoid washing-out. The value +must be a float number in the range [0,1] and defaults to 0.210. + +@item antibanding +Set the antibanding level. If enabled the filter will randomly vary +the luminance of output pixels by a small amount to avoid banding of +the histogram. Possible values are @code{none}, @code{weak} or +@code{strong}. It defaults to @code{none}. +@end table + +@section histogram + +Compute and draw a color distribution histogram for the input video. + +The computed histogram is a representation of the color component +distribution in an image. + +Standard histogram displays the color components distribution in an image. +Displays color graph for each color component. Shows distribution of +the Y, U, V, A or R, G, B components, depending on input format, in the +current frame. Below each graph a color component scale meter is shown. + +The filter accepts the following options: + +@table @option +@item level_height +Set height of level. Default value is @code{200}. +Allowed range is [50, 2048]. + +@item scale_height +Set height of color scale. Default value is @code{12}. +Allowed range is [0, 40]. + +@item display_mode +Set display mode. +It accepts the following values: +@table @samp +@item parade +Per color component graphs are placed below each other. + +@item overlay +Presents information identical to that in the @code{parade}, except +that the graphs representing color components are superimposed directly +over one another. +@end table +Default is @code{parade}. + +@item levels_mode +Set mode. Can be either @code{linear}, or @code{logarithmic}. +Default is @code{linear}. + +@item components +Set what color components to display. +Default is @code{7}. +@end table + +@subsection Examples + +@itemize + +@item +Calculate and draw histogram: +@example +ffplay -i input -vf histogram +@end example + +@end itemize + +@anchor{hqdn3d} +@section hqdn3d + +This is a high precision/quality 3d denoise filter. It aims to reduce +image noise, producing smooth images and making still images really +still. It should enhance compressibility. + +It accepts the following optional parameters: + +@table @option +@item luma_spatial +A non-negative floating point number which specifies spatial luma strength. +It defaults to 4.0. + +@item chroma_spatial +A non-negative floating point number which specifies spatial chroma strength. +It defaults to 3.0*@var{luma_spatial}/4.0. + +@item luma_tmp +A floating point number which specifies luma temporal strength. It defaults to +6.0*@var{luma_spatial}/4.0. + +@item chroma_tmp +A floating point number which specifies chroma temporal strength. It defaults to +@var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial}. +@end table + +@section hqx + +Apply a high-quality magnification filter designed for pixel art. This filter +was originally created by Maxim Stepin. + +It accepts the following option: + +@table @option +@item n +Set the scaling dimension: @code{2} for @code{hq2x}, @code{3} for +@code{hq3x} and @code{4} for @code{hq4x}. +Default is @code{3}. +@end table + +@section hstack +Stack input videos horizontally. + +All streams must be of same pixel format and of same height. + +Note that this filter is faster than using @ref{overlay} and @ref{pad} filter +to create same output. + +The filter accept the following option: + +@table @option +@item inputs +Set number of input streams. Default is 2. + +@item shortest +If set to 1, force the output to terminate when the shortest input +terminates. Default value is 0. +@end table + +@section hue + +Modify the hue and/or the saturation of the input. + +It accepts the following parameters: + +@table @option +@item h +Specify the hue angle as a number of degrees. It accepts an expression, +and defaults to "0". + +@item s +Specify the saturation in the [-10,10] range. It accepts an expression and +defaults to "1". + +@item H +Specify the hue angle as a number of radians. It accepts an +expression, and defaults to "0". + +@item b +Specify the brightness in the [-10,10] range. It accepts an expression and +defaults to "0". +@end table + +@option{h} and @option{H} are mutually exclusive, and can't be +specified at the same time. + +The @option{b}, @option{h}, @option{H} and @option{s} option values are +expressions containing the following constants: + +@table @option +@item n +frame count of the input frame starting from 0 + +@item pts +presentation timestamp of the input frame expressed in time base units + +@item r +frame rate of the input video, NAN if the input frame rate is unknown + +@item t +timestamp expressed in seconds, NAN if the input timestamp is unknown + +@item tb +time base of the input video +@end table + +@subsection Examples + +@itemize +@item +Set the hue to 90 degrees and the saturation to 1.0: +@example +hue=h=90:s=1 +@end example + +@item +Same command but expressing the hue in radians: +@example +hue=H=PI/2:s=1 +@end example + +@item +Rotate hue and make the saturation swing between 0 +and 2 over a period of 1 second: +@example +hue="H=2*PI*t: s=sin(2*PI*t)+1" +@end example + +@item +Apply a 3 seconds saturation fade-in effect starting at 0: +@example +hue="s=min(t/3\,1)" +@end example + +The general fade-in expression can be written as: +@example +hue="s=min(0\, max((t-START)/DURATION\, 1))" +@end example + +@item +Apply a 3 seconds saturation fade-out effect starting at 5 seconds: +@example +hue="s=max(0\, min(1\, (8-t)/3))" +@end example + +The general fade-out expression can be written as: +@example +hue="s=max(0\, min(1\, (START+DURATION-t)/DURATION))" +@end example + +@end itemize + +@subsection Commands + +This filter supports the following commands: +@table @option +@item b +@item s +@item h +@item H +Modify the hue and/or the saturation and/or brightness of the input video. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@end table + +@section idet + +Detect video interlacing type. + +This filter tries to detect if the input frames as interlaced, progressive, +top or bottom field first. It will also try and detect fields that are +repeated between adjacent frames (a sign of telecine). + +Single frame detection considers only immediately adjacent frames when classifying each frame. +Multiple frame detection incorporates the classification history of previous frames. + +The filter will log these metadata values: + +@table @option +@item single.current_frame +Detected type of current frame using single-frame detection. One of: +``tff'' (top field first), ``bff'' (bottom field first), +``progressive'', or ``undetermined'' + +@item single.tff +Cumulative number of frames detected as top field first using single-frame detection. + +@item multiple.tff +Cumulative number of frames detected as top field first using multiple-frame detection. + +@item single.bff +Cumulative number of frames detected as bottom field first using single-frame detection. + +@item multiple.current_frame +Detected type of current frame using multiple-frame detection. One of: +``tff'' (top field first), ``bff'' (bottom field first), +``progressive'', or ``undetermined'' + +@item multiple.bff +Cumulative number of frames detected as bottom field first using multiple-frame detection. + +@item single.progressive +Cumulative number of frames detected as progressive using single-frame detection. + +@item multiple.progressive +Cumulative number of frames detected as progressive using multiple-frame detection. + +@item single.undetermined +Cumulative number of frames that could not be classified using single-frame detection. + +@item multiple.undetermined +Cumulative number of frames that could not be classified using multiple-frame detection. + +@item repeated.current_frame +Which field in the current frame is repeated from the last. One of ``neither'', ``top'', or ``bottom''. + +@item repeated.neither +Cumulative number of frames with no repeated field. + +@item repeated.top +Cumulative number of frames with the top field repeated from the previous frame's top field. + +@item repeated.bottom +Cumulative number of frames with the bottom field repeated from the previous frame's bottom field. +@end table + +The filter accepts the following options: + +@table @option +@item intl_thres +Set interlacing threshold. +@item prog_thres +Set progressive threshold. +@item repeat_thres +Threshold for repeated field detection. +@item half_life +Number of frames after which a given frame's contribution to the +statistics is halved (i.e., it contributes only 0.5 to it's +classification). The default of 0 means that all frames seen are given +full weight of 1.0 forever. +@item analyze_interlaced_flag +When this is not 0 then idet will use the specified number of frames to determine +if the interlaced flag is accurate, it will not count undetermined frames. +If the flag is found to be accurate it will be used without any further +computations, if it is found to be inaccurate it will be cleared without any +further computations. This allows inserting the idet filter as a low computational +method to clean up the interlaced flag +@end table + +@section il + +Deinterleave or interleave fields. + +This filter allows one to process interlaced images fields without +deinterlacing them. Deinterleaving splits the input frame into 2 +fields (so called half pictures). Odd lines are moved to the top +half of the output image, even lines to the bottom half. +You can process (filter) them independently and then re-interleave them. + +The filter accepts the following options: + +@table @option +@item luma_mode, l +@item chroma_mode, c +@item alpha_mode, a +Available values for @var{luma_mode}, @var{chroma_mode} and +@var{alpha_mode} are: + +@table @samp +@item none +Do nothing. + +@item deinterleave, d +Deinterleave fields, placing one above the other. + +@item interleave, i +Interleave fields. Reverse the effect of deinterleaving. +@end table +Default value is @code{none}. + +@item luma_swap, ls +@item chroma_swap, cs +@item alpha_swap, as +Swap luma/chroma/alpha fields. Exchange even & odd lines. Default value is @code{0}. +@end table + +@section inflate + +Apply inflate effect to the video. + +This filter replaces the pixel by the local(3x3) average by taking into account +only values higher than the pixel. + +It accepts the following options: + +@table @option +@item threshold0 +@item threshold1 +@item threshold2 +@item threshold3 +Limit the maximum change for each plane, default is 65535. +If 0, plane will remain unchanged. +@end table + +@section interlace + +Simple interlacing filter from progressive contents. This interleaves upper (or +lower) lines from odd frames with lower (or upper) lines from even frames, +halving the frame rate and preserving image height. + +@example + Original Original New Frame + Frame 'j' Frame 'j+1' (tff) + ========== =========== ================== + Line 0 --------------------> Frame 'j' Line 0 + Line 1 Line 1 ----> Frame 'j+1' Line 1 + Line 2 ---------------------> Frame 'j' Line 2 + Line 3 Line 3 ----> Frame 'j+1' Line 3 + ... ... ... +New Frame + 1 will be generated by Frame 'j+2' and Frame 'j+3' and so on +@end example + +It accepts the following optional parameters: + +@table @option +@item scan +This determines whether the interlaced frame is taken from the even +(tff - default) or odd (bff) lines of the progressive frame. + +@item lowpass +Enable (default) or disable the vertical lowpass filter to avoid twitter +interlacing and reduce moire patterns. +@end table + +@section kerndeint + +Deinterlace input video by applying Donald Graft's adaptive kernel +deinterling. Work on interlaced parts of a video to produce +progressive frames. + +The description of the accepted parameters follows. + +@table @option +@item thresh +Set the threshold which affects the filter's tolerance when +determining if a pixel line must be processed. It must be an integer +in the range [0,255] and defaults to 10. A value of 0 will result in +applying the process on every pixels. + +@item map +Paint pixels exceeding the threshold value to white if set to 1. +Default is 0. + +@item order +Set the fields order. Swap fields if set to 1, leave fields alone if +0. Default is 0. + +@item sharp +Enable additional sharpening if set to 1. Default is 0. + +@item twoway +Enable twoway sharpening if set to 1. Default is 0. +@end table + +@subsection Examples + +@itemize +@item +Apply default values: +@example +kerndeint=thresh=10:map=0:order=0:sharp=0:twoway=0 +@end example + +@item +Enable additional sharpening: +@example +kerndeint=sharp=1 +@end example + +@item +Paint processed pixels in white: +@example +kerndeint=map=1 +@end example +@end itemize + +@section lenscorrection + +Correct radial lens distortion + +This filter can be used to correct for radial distortion as can result from the use +of wide angle lenses, and thereby re-rectify the image. To find the right parameters +one can use tools available for example as part of opencv or simply trial-and-error. +To use opencv use the calibration sample (under samples/cpp) from the opencv sources +and extract the k1 and k2 coefficients from the resulting matrix. + +Note that effectively the same filter is available in the open-source tools Krita and +Digikam from the KDE project. + +In contrast to the @ref{vignette} filter, which can also be used to compensate lens errors, +this filter corrects the distortion of the image, whereas @ref{vignette} corrects the +brightness distribution, so you may want to use both filters together in certain +cases, though you will have to take care of ordering, i.e. whether vignetting should +be applied before or after lens correction. + +@subsection Options + +The filter accepts the following options: + +@table @option +@item cx +Relative x-coordinate of the focal point of the image, and thereby the center of the +distortion. This value has a range [0,1] and is expressed as fractions of the image +width. +@item cy +Relative y-coordinate of the focal point of the image, and thereby the center of the +distortion. This value has a range [0,1] and is expressed as fractions of the image +height. +@item k1 +Coefficient of the quadratic correction term. 0.5 means no correction. +@item k2 +Coefficient of the double quadratic correction term. 0.5 means no correction. +@end table + +The formula that generates the correction is: + +@var{r_src} = @var{r_tgt} * (1 + @var{k1} * (@var{r_tgt} / @var{r_0})^2 + @var{k2} * (@var{r_tgt} / @var{r_0})^4) + +where @var{r_0} is halve of the image diagonal and @var{r_src} and @var{r_tgt} are the +distances from the focal point in the source and target images, respectively. + +@anchor{lut3d} +@section lut3d + +Apply a 3D LUT to an input video. + +The filter accepts the following options: + +@table @option +@item file +Set the 3D LUT file name. + +Currently supported formats: +@table @samp +@item 3dl +AfterEffects +@item cube +Iridas +@item dat +DaVinci +@item m3d +Pandora +@end table +@item interp +Select interpolation mode. + +Available values are: + +@table @samp +@item nearest +Use values from the nearest defined point. +@item trilinear +Interpolate values using the 8 points defining a cube. +@item tetrahedral +Interpolate values using a tetrahedron. +@end table +@end table + +@section lut, lutrgb, lutyuv + +Compute a look-up table for binding each pixel component input value +to an output value, and apply it to the input video. + +@var{lutyuv} applies a lookup table to a YUV input video, @var{lutrgb} +to an RGB input video. + +These filters accept the following parameters: +@table @option +@item c0 +set first pixel component expression +@item c1 +set second pixel component expression +@item c2 +set third pixel component expression +@item c3 +set fourth pixel component expression, corresponds to the alpha component + +@item r +set red component expression +@item g +set green component expression +@item b +set blue component expression +@item a +alpha component expression + +@item y +set Y/luminance component expression +@item u +set U/Cb component expression +@item v +set V/Cr component expression +@end table + +Each of them specifies the expression to use for computing the lookup table for +the corresponding pixel component values. + +The exact component associated to each of the @var{c*} options depends on the +format in input. + +The @var{lut} filter requires either YUV or RGB pixel formats in input, +@var{lutrgb} requires RGB pixel formats in input, and @var{lutyuv} requires YUV. + +The expressions can contain the following constants and functions: + +@table @option +@item w +@item h +The input width and height. + +@item val +The input value for the pixel component. + +@item clipval +The input value, clipped to the @var{minval}-@var{maxval} range. + +@item maxval +The maximum value for the pixel component. + +@item minval +The minimum value for the pixel component. + +@item negval +The negated value for the pixel component value, clipped to the +@var{minval}-@var{maxval} range; it corresponds to the expression +"maxval-clipval+minval". + +@item clip(val) +The computed value in @var{val}, clipped to the +@var{minval}-@var{maxval} range. + +@item gammaval(gamma) +The computed gamma correction value of the pixel component value, +clipped to the @var{minval}-@var{maxval} range. It corresponds to the +expression +"pow((clipval-minval)/(maxval-minval)\,@var{gamma})*(maxval-minval)+minval" + +@end table + +All expressions default to "val". + +@subsection Examples + +@itemize +@item +Negate input video: +@example +lutrgb="r=maxval+minval-val:g=maxval+minval-val:b=maxval+minval-val" +lutyuv="y=maxval+minval-val:u=maxval+minval-val:v=maxval+minval-val" +@end example + +The above is the same as: +@example +lutrgb="r=negval:g=negval:b=negval" +lutyuv="y=negval:u=negval:v=negval" +@end example + +@item +Negate luminance: +@example +lutyuv=y=negval +@end example + +@item +Remove chroma components, turning the video into a graytone image: +@example +lutyuv="u=128:v=128" +@end example + +@item +Apply a luma burning effect: +@example +lutyuv="y=2*val" +@end example + +@item +Remove green and blue components: +@example +lutrgb="g=0:b=0" +@end example + +@item +Set a constant alpha channel value on input: +@example +format=rgba,lutrgb=a="maxval-minval/2" +@end example + +@item +Correct luminance gamma by a factor of 0.5: +@example +lutyuv=y=gammaval(0.5) +@end example + +@item +Discard least significant bits of luma: +@example +lutyuv=y='bitand(val, 128+64+32)' +@end example +@end itemize + +@section maskedmerge + +Merge the first input stream with the second input stream using per pixel +weights in the third input stream. + +A value of 0 in the third stream pixel component means that pixel component +from first stream is returned unchanged, while maximum value (eg. 255 for +8-bit videos) means that pixel component from second stream is returned +unchanged. Intermediate values define the amount of merging between both +input stream's pixel components. + +This filter accepts the following options: +@table @option +@item planes +Set which planes will be processed as bitmap, unprocessed planes will be +copied from first stream. +By default value 0xf, all planes will be processed. +@end table + +@section mcdeint + +Apply motion-compensation deinterlacing. + +It needs one field per frame as input and must thus be used together +with yadif=1/3 or equivalent. + +This filter accepts the following options: +@table @option +@item mode +Set the deinterlacing mode. + +It accepts one of the following values: +@table @samp +@item fast +@item medium +@item slow +use iterative motion estimation +@item extra_slow +like @samp{slow}, but use multiple reference frames. +@end table +Default value is @samp{fast}. + +@item parity +Set the picture field parity assumed for the input video. It must be +one of the following values: + +@table @samp +@item 0, tff +assume top field first +@item 1, bff +assume bottom field first +@end table + +Default value is @samp{bff}. + +@item qp +Set per-block quantization parameter (QP) used by the internal +encoder. + +Higher values should result in a smoother motion vector field but less +optimal individual vectors. Default value is 1. +@end table + +@section mergeplanes + +Merge color channel components from several video streams. + +The filter accepts up to 4 input streams, and merge selected input +planes to the output video. + +This filter accepts the following options: +@table @option +@item mapping +Set input to output plane mapping. Default is @code{0}. + +The mappings is specified as a bitmap. It should be specified as a +hexadecimal number in the form 0xAa[Bb[Cc[Dd]]]. 'Aa' describes the +mapping for the first plane of the output stream. 'A' sets the number of +the input stream to use (from 0 to 3), and 'a' the plane number of the +corresponding input to use (from 0 to 3). The rest of the mappings is +similar, 'Bb' describes the mapping for the output stream second +plane, 'Cc' describes the mapping for the output stream third plane and +'Dd' describes the mapping for the output stream fourth plane. + +@item format +Set output pixel format. Default is @code{yuva444p}. +@end table + +@subsection Examples + +@itemize +@item +Merge three gray video streams of same width and height into single video stream: +@example +[a0][a1][a2]mergeplanes=0x001020:yuv444p +@end example + +@item +Merge 1st yuv444p stream and 2nd gray video stream into yuva444p video stream: +@example +[a0][a1]mergeplanes=0x00010210:yuva444p +@end example + +@item +Swap Y and A plane in yuva444p stream: +@example +format=yuva444p,mergeplanes=0x03010200:yuva444p +@end example + +@item +Swap U and V plane in yuv420p stream: +@example +format=yuv420p,mergeplanes=0x000201:yuv420p +@end example + +@item +Cast a rgb24 clip to yuv444p: +@example +format=rgb24,mergeplanes=0x000102:yuv444p +@end example +@end itemize + +@section metadata, ametadata + +Manipulate frame metadata. + +This filter accepts the following options: + +@table @option +@item mode +Set mode of operation of the filter. + +Can be one of the following: + +@table @samp +@item select +If both @code{value} and @code{key} is set, select frames +which have such metadata. If only @code{key} is set, select +every frame that has such key in metadata. + +@item add +Add new metadata @code{key} and @code{value}. If key is already available +do nothing. + +@item modify +Modify value of already present key. + +@item delete +If @code{value} is set, delete only keys that have such value. +Otherwise, delete key. + +@item print +Print key and its value if metadata was found. If @code{key} is not set print all +metadata values available in frame. +@end table + +@item key +Set key used with all modes. Must be set for all modes except @code{print}. + +@item value +Set metadata value which will be used. This option is mandatory for +@code{modify} and @code{add} mode. + +@item function +Which function to use when comparing metadata value and @code{value}. + +Can be one of following: + +@table @samp +@item same_str +Values are interpreted as strings, returns true if metadata value is same as @code{value}. + +@item starts_with +Values are interpreted as strings, returns true if metadata value starts with +the @code{value} option string. + +@item less +Values are interpreted as floats, returns true if metadata value is less than @code{value}. + +@item equal +Values are interpreted as floats, returns true if @code{value} is equal with metadata value. + +@item greater +Values are interpreted as floats, returns true if metadata value is greater than @code{value}. + +@item expr +Values are interpreted as floats, returns true if expression from option @code{expr} +evaluates to true. +@end table + +@item expr +Set expression which is used when @code{function} is set to @code{expr}. +The expression is evaluated through the eval API and can contain the following +constants: + +@table @option +@item VALUE1 +Float representation of @code{value} from metadata key. + +@item VALUE2 +Float representation of @code{value} as supplied by user in @code{value} option. +@end table + +@item file +If specified in @code{print} mode, output is written to the named file. When +filename equals "-" data is written to standard output. +If @code{file} option is not set, output is written to the log with AV_LOG_INFO +loglevel. +@end table + +@subsection Examples + +@itemize +@item +Print all metadata values for frames with key @code{lavfi.singnalstats.YDIF} with values +between 0 and 1. +@example +@end example +signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)' +@end itemize + +@section mpdecimate + +Drop frames that do not differ greatly from the previous frame in +order to reduce frame rate. + +The main use of this filter is for very-low-bitrate encoding +(e.g. streaming over dialup modem), but it could in theory be used for +fixing movies that were inverse-telecined incorrectly. + +A description of the accepted options follows. + +@table @option +@item max +Set the maximum number of consecutive frames which can be dropped (if +positive), or the minimum interval between dropped frames (if +negative). If the value is 0, the frame is dropped unregarding the +number of previous sequentially dropped frames. + +Default value is 0. + +@item hi +@item lo +@item frac +Set the dropping threshold values. + +Values for @option{hi} and @option{lo} are for 8x8 pixel blocks and +represent actual pixel value differences, so a threshold of 64 +corresponds to 1 unit of difference for each pixel, or the same spread +out differently over the block. + +A frame is a candidate for dropping if no 8x8 blocks differ by more +than a threshold of @option{hi}, and if no more than @option{frac} blocks (1 +meaning the whole image) differ by more than a threshold of @option{lo}. + +Default value for @option{hi} is 64*12, default value for @option{lo} is +64*5, and default value for @option{frac} is 0.33. +@end table + + +@section negate + +Negate input video. + +It accepts an integer in input; if non-zero it negates the +alpha component (if available). The default value in input is 0. + +@section nnedi + +Deinterlace video using neural network edge directed interpolation. + +This filter accepts the following options: + +@table @option +@item weights +Mandatory option, without binary file filter can not work. +Currently file can be found here: +https://github.com/dubhater/vapoursynth-nnedi3/blob/master/src/nnedi3_weights.bin + +@item deint +Set which frames to deinterlace, by default it is @code{all}. +Can be @code{all} or @code{interlaced}. + +@item field +Set mode of operation. + +Can be one of the following: + +@table @samp +@item af +Use frame flags, both fields. +@item a +Use frame flags, single field. +@item t +Use top field only. +@item b +Use bottom field only. +@item ft +Use both fields, top first. +@item fb +Use both fields, bottom first. +@end table + +@item planes +Set which planes to process, by default filter process all frames. + +@item nsize +Set size of local neighborhood around each pixel, used by the predictor neural +network. + +Can be one of the following: + +@table @samp +@item s8x6 +@item s16x6 +@item s32x6 +@item s48x6 +@item s8x4 +@item s16x4 +@item s32x4 +@end table + +@item nns +Set the number of neurons in predicctor neural network. +Can be one of the following: + +@table @samp +@item n16 +@item n32 +@item n64 +@item n128 +@item n256 +@end table + +@item qual +Controls the number of different neural network predictions that are blended +together to compute the final output value. Can be @code{fast}, default or +@code{slow}. + +@item etype +Set which set of weights to use in the predictor. +Can be one of the following: + +@table @samp +@item a +weights trained to minimize absolute error +@item s +weights trained to minimize squared error +@end table + +@item pscrn +Controls whether or not the prescreener neural network is used to decide +which pixels should be processed by the predictor neural network and which +can be handled by simple cubic interpolation. +The prescreener is trained to know whether cubic interpolation will be +sufficient for a pixel or whether it should be predicted by the predictor nn. +The computational complexity of the prescreener nn is much less than that of +the predictor nn. Since most pixels can be handled by cubic interpolation, +using the prescreener generally results in much faster processing. +The prescreener is pretty accurate, so the difference between using it and not +using it is almost always unnoticeable. + +Can be one of the following: + +@table @samp +@item none +@item original +@item new +@end table + +Default is @code{new}. + +@item fapprox +Set various debugging flags. +@end table + +@section noformat + +Force libavfilter not to use any of the specified pixel formats for the +input to the next filter. + +It accepts the following parameters: +@table @option + +@item pix_fmts +A '|'-separated list of pixel format names, such as +apix_fmts=yuv420p|monow|rgb24". + +@end table + +@subsection Examples + +@itemize +@item +Force libavfilter to use a format different from @var{yuv420p} for the +input to the vflip filter: +@example +noformat=pix_fmts=yuv420p,vflip +@end example + +@item +Convert the input video to any of the formats not contained in the list: +@example +noformat=yuv420p|yuv444p|yuv410p +@end example +@end itemize + +@section noise + +Add noise on video input frame. + +The filter accepts the following options: + +@table @option +@item all_seed +@item c0_seed +@item c1_seed +@item c2_seed +@item c3_seed +Set noise seed for specific pixel component or all pixel components in case +of @var{all_seed}. Default value is @code{123457}. + +@item all_strength, alls +@item c0_strength, c0s +@item c1_strength, c1s +@item c2_strength, c2s +@item c3_strength, c3s +Set noise strength for specific pixel component or all pixel components in case +@var{all_strength}. Default value is @code{0}. Allowed range is [0, 100]. + +@item all_flags, allf +@item c0_flags, c0f +@item c1_flags, c1f +@item c2_flags, c2f +@item c3_flags, c3f +Set pixel component flags or set flags for all components if @var{all_flags}. +Available values for component flags are: +@table @samp +@item a +averaged temporal noise (smoother) +@item p +mix random noise with a (semi)regular pattern +@item t +temporal noise (noise pattern changes between frames) +@item u +uniform noise (gaussian otherwise) +@end table +@end table + +@subsection Examples + +Add temporal and uniform noise to input video: +@example +noise=alls=20:allf=t+u +@end example + +@section null + +Pass the video source unchanged to the output. + +@section ocr +Optical Character Recognition + +This filter uses Tesseract for optical character recognition. + +It accepts the following options: + +@table @option +@item datapath +Set datapath to tesseract data. Default is to use whatever was +set at installation. + +@item language +Set language, default is "eng". + +@item whitelist +Set character whitelist. + +@item blacklist +Set character blacklist. +@end table + +The filter exports recognized text as the frame metadata @code{lavfi.ocr.text}. + +@section ocv + +Apply a video transform using libopencv. + +To enable this filter, install the libopencv library and headers and +configure FFmpeg with @code{--enable-libopencv}. + +It accepts the following parameters: + +@table @option + +@item filter_name +The name of the libopencv filter to apply. + +@item filter_params +The parameters to pass to the libopencv filter. If not specified, the default +values are assumed. + +@end table + +Refer to the official libopencv documentation for more precise +information: +@url{http://docs.opencv.org/master/modules/imgproc/doc/filtering.html} + +Several libopencv filters are supported; see the following subsections. + +@anchor{dilate} +@subsection dilate + +Dilate an image by using a specific structuring element. +It corresponds to the libopencv function @code{cvDilate}. + +It accepts the parameters: @var{struct_el}|@var{nb_iterations}. + +@var{struct_el} represents a structuring element, and has the syntax: +@var{cols}x@var{rows}+@var{anchor_x}x@var{anchor_y}/@var{shape} + +@var{cols} and @var{rows} represent the number of columns and rows of +the structuring element, @var{anchor_x} and @var{anchor_y} the anchor +point, and @var{shape} the shape for the structuring element. @var{shape} +must be "rect", "cross", "ellipse", or "custom". + +If the value for @var{shape} is "custom", it must be followed by a +string of the form "=@var{filename}". The file with name +@var{filename} is assumed to represent a binary image, with each +printable character corresponding to a bright pixel. When a custom +@var{shape} is used, @var{cols} and @var{rows} are ignored, the number +or columns and rows of the read file are assumed instead. + +The default value for @var{struct_el} is "3x3+0x0/rect". + +@var{nb_iterations} specifies the number of times the transform is +applied to the image, and defaults to 1. + +Some examples: +@example +# Use the default values +ocv=dilate + +# Dilate using a structuring element with a 5x5 cross, iterating two times +ocv=filter_name=dilate:filter_params=5x5+2x2/cross|2 + +# Read the shape from the file diamond.shape, iterating two times. +# The file diamond.shape may contain a pattern of characters like this +# * +# *** +# ***** +# *** +# * +# The specified columns and rows are ignored +# but the anchor point coordinates are not +ocv=dilate:0x0+2x2/custom=diamond.shape|2 +@end example + +@subsection erode + +Erode an image by using a specific structuring element. +It corresponds to the libopencv function @code{cvErode}. + +It accepts the parameters: @var{struct_el}:@var{nb_iterations}, +with the same syntax and semantics as the @ref{dilate} filter. + +@subsection smooth + +Smooth the input video. + +The filter takes the following parameters: +@var{type}|@var{param1}|@var{param2}|@var{param3}|@var{param4}. + +@var{type} is the type of smooth filter to apply, and must be one of +the following values: "blur", "blur_no_scale", "median", "gaussian", +or "bilateral". The default value is "gaussian". + +The meaning of @var{param1}, @var{param2}, @var{param3}, and @var{param4} +depend on the smooth type. @var{param1} and +@var{param2} accept integer positive values or 0. @var{param3} and +@var{param4} accept floating point values. + +The default value for @var{param1} is 3. The default value for the +other parameters is 0. + +These parameters correspond to the parameters assigned to the +libopencv function @code{cvSmooth}. + +@anchor{overlay} +@section overlay + +Overlay one video on top of another. + +It takes two inputs and has one output. The first input is the "main" +video on which the second input is overlaid. + +It accepts the following parameters: + +A description of the accepted options follows. + +@table @option +@item x +@item y +Set the expression for the x and y coordinates of the overlaid video +on the main video. Default value is "0" for both expressions. In case +the expression is invalid, it is set to a huge value (meaning that the +overlay will not be displayed within the output visible area). + +@item eof_action +The action to take when EOF is encountered on the secondary input; it accepts +one of the following values: + +@table @option +@item repeat +Repeat the last frame (the default). +@item endall +End both streams. +@item pass +Pass the main input through. +@end table + +@item eval +Set when the expressions for @option{x}, and @option{y} are evaluated. + +It accepts the following values: +@table @samp +@item init +only evaluate expressions once during the filter initialization or +when a command is processed + +@item frame +evaluate expressions for each incoming frame +@end table + +Default value is @samp{frame}. + +@item shortest +If set to 1, force the output to terminate when the shortest input +terminates. Default value is 0. + +@item format +Set the format for the output video. + +It accepts the following values: +@table @samp +@item yuv420 +force YUV420 output + +@item yuv422 +force YUV422 output + +@item yuv444 +force YUV444 output + +@item rgb +force RGB output +@end table + +Default value is @samp{yuv420}. + +@item rgb @emph{(deprecated)} +If set to 1, force the filter to accept inputs in the RGB +color space. Default value is 0. This option is deprecated, use +@option{format} instead. + +@item repeatlast +If set to 1, force the filter to draw the last overlay frame over the +main input until the end of the stream. A value of 0 disables this +behavior. Default value is 1. +@end table + +The @option{x}, and @option{y} expressions can contain the following +parameters. + +@table @option +@item main_w, W +@item main_h, H +The main input width and height. + +@item overlay_w, w +@item overlay_h, h +The overlay input width and height. + +@item x +@item y +The computed values for @var{x} and @var{y}. They are evaluated for +each new frame. + +@item hsub +@item vsub +horizontal and vertical chroma subsample values of the output +format. For example for the pixel format "yuv422p" @var{hsub} is 2 and +@var{vsub} is 1. + +@item n +the number of input frame, starting from 0 + +@item pos +the position in the file of the input frame, NAN if unknown + +@item t +The timestamp, expressed in seconds. It's NAN if the input timestamp is unknown. + +@end table + +Note that the @var{n}, @var{pos}, @var{t} variables are available only +when evaluation is done @emph{per frame}, and will evaluate to NAN +when @option{eval} is set to @samp{init}. + +Be aware that frames are taken from each input video in timestamp +order, hence, if their initial timestamps differ, it is a good idea +to pass the two inputs through a @var{setpts=PTS-STARTPTS} filter to +have them begin in the same zero timestamp, as the example for +the @var{movie} filter does. + +You can chain together more overlays but you should test the +efficiency of such approach. + +@subsection Commands + +This filter supports the following commands: +@table @option +@item x +@item y +Modify the x and y of the overlay input. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@end table + +@subsection Examples + +@itemize +@item +Draw the overlay at 10 pixels from the bottom right corner of the main +video: +@example +overlay=main_w-overlay_w-10:main_h-overlay_h-10 +@end example + +Using named options the example above becomes: +@example +overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10 +@end example + +@item +Insert a transparent PNG logo in the bottom left corner of the input, +using the @command{ffmpeg} tool with the @code{-filter_complex} option: +@example +ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output +@end example + +@item +Insert 2 different transparent PNG logos (second logo on bottom +right corner) using the @command{ffmpeg} tool: +@example +ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output +@end example + +@item +Add a transparent color layer on top of the main video; @code{WxH} +must specify the size of the main input to the overlay filter: +@example +color=color=red@@.3:size=WxH [over]; [in][over] overlay [out] +@end example + +@item +Play an original video and a filtered version (here with the deshake +filter) side by side using the @command{ffplay} tool: +@example +ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w' +@end example + +The above command is the same as: +@example +ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w' +@end example + +@item +Make a sliding overlay appearing from the left to the right top part of the +screen starting since time 2: +@example +overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0 +@end example + +@item +Compose output by putting two input videos side to side: +@example +ffmpeg -i left.avi -i right.avi -filter_complex " +nullsrc=size=200x100 [background]; +[0:v] setpts=PTS-STARTPTS, scale=100x100 [left]; +[1:v] setpts=PTS-STARTPTS, scale=100x100 [right]; +[background][left] overlay=shortest=1 [background+left]; +[background+left][right] overlay=shortest=1:x=100 [left+right] +" +@end example + +@item +Mask 10-20 seconds of a video by applying the delogo filter to a section +@example +ffmpeg -i test.avi -codec:v:0 wmv2 -ar 11025 -b:v 9000k +-vf '[in]split[split_main][split_delogo];[split_delogo]trim=start=360:end=371,delogo=0:0:640:480[delogoed];[split_main][delogoed]overlay=eof_action=pass[out]' +masked.avi +@end example + +@item +Chain several overlays in cascade: +@example +nullsrc=s=200x200 [bg]; +testsrc=s=100x100, split=4 [in0][in1][in2][in3]; +[in0] lutrgb=r=0, [bg] overlay=0:0 [mid0]; +[in1] lutrgb=g=0, [mid0] overlay=100:0 [mid1]; +[in2] lutrgb=b=0, [mid1] overlay=0:100 [mid2]; +[in3] null, [mid2] overlay=100:100 [out0] +@end example + +@end itemize + +@section owdenoise + +Apply Overcomplete Wavelet denoiser. + +The filter accepts the following options: + +@table @option +@item depth +Set depth. + +Larger depth values will denoise lower frequency components more, but +slow down filtering. + +Must be an int in the range 8-16, default is @code{8}. + +@item luma_strength, ls +Set luma strength. + +Must be a double value in the range 0-1000, default is @code{1.0}. + +@item chroma_strength, cs +Set chroma strength. + +Must be a double value in the range 0-1000, default is @code{1.0}. +@end table + +@anchor{pad} +@section pad + +Add paddings to the input image, and place the original input at the +provided @var{x}, @var{y} coordinates. + +It accepts the following parameters: + +@table @option +@item width, w +@item height, h +Specify an expression for the size of the output image with the +paddings added. If the value for @var{width} or @var{height} is 0, the +corresponding input size is used for the output. + +The @var{width} expression can reference the value set by the +@var{height} expression, and vice versa. + +The default value of @var{width} and @var{height} is 0. + +@item x +@item y +Specify the offsets to place the input image at within the padded area, +with respect to the top/left border of the output image. + +The @var{x} expression can reference the value set by the @var{y} +expression, and vice versa. + +The default value of @var{x} and @var{y} is 0. + +@item color +Specify the color of the padded area. For the syntax of this option, +check the "Color" section in the ffmpeg-utils manual. + +The default value of @var{color} is "black". +@end table + +The value for the @var{width}, @var{height}, @var{x}, and @var{y} +options are expressions containing the following constants: + +@table @option +@item in_w +@item in_h +The input video width and height. + +@item iw +@item ih +These are the same as @var{in_w} and @var{in_h}. + +@item out_w +@item out_h +The output width and height (the size of the padded area), as +specified by the @var{width} and @var{height} expressions. + +@item ow +@item oh +These are the same as @var{out_w} and @var{out_h}. + +@item x +@item y +The x and y offsets as specified by the @var{x} and @var{y} +expressions, or NAN if not yet specified. + +@item a +same as @var{iw} / @var{ih} + +@item sar +input sample aspect ratio + +@item dar +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar} + +@item hsub +@item vsub +The horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. +@end table + +@subsection Examples + +@itemize +@item +Add paddings with the color "violet" to the input video. The output video +size is 640x480, and the top-left corner of the input video is placed at +column 0, row 40 +@example +pad=640:480:0:40:violet +@end example + +The example above is equivalent to the following command: +@example +pad=width=640:height=480:x=0:y=40:color=violet +@end example + +@item +Pad the input to get an output with dimensions increased by 3/2, +and put the input video at the center of the padded area: +@example +pad="3/2*iw:3/2*ih:(ow-iw)/2:(oh-ih)/2" +@end example + +@item +Pad the input to get a squared output with size equal to the maximum +value between the input width and height, and put the input video at +the center of the padded area: +@example +pad="max(iw\,ih):ow:(ow-iw)/2:(oh-ih)/2" +@end example + +@item +Pad the input to get a final w/h ratio of 16:9: +@example +pad="ih*16/9:ih:(ow-iw)/2:(oh-ih)/2" +@end example + +@item +In case of anamorphic video, in order to set the output display aspect +correctly, it is necessary to use @var{sar} in the expression, +according to the relation: +@example +(ih * X / ih) * sar = output_dar +X = output_dar / sar +@end example + +Thus the previous example needs to be modified to: +@example +pad="ih*16/9/sar:ih:(ow-iw)/2:(oh-ih)/2" +@end example + +@item +Double the output size and put the input video in the bottom-right +corner of the output padded area: +@example +pad="2*iw:2*ih:ow-iw:oh-ih" +@end example +@end itemize + +@anchor{palettegen} +@section palettegen + +Generate one palette for a whole video stream. + +It accepts the following options: + +@table @option +@item max_colors +Set the maximum number of colors to quantize in the palette. +Note: the palette will still contain 256 colors; the unused palette entries +will be black. + +@item reserve_transparent +Create a palette of 255 colors maximum and reserve the last one for +transparency. Reserving the transparency color is useful for GIF optimization. +If not set, the maximum of colors in the palette will be 256. You probably want +to disable this option for a standalone image. +Set by default. + +@item stats_mode +Set statistics mode. + +It accepts the following values: +@table @samp +@item full +Compute full frame histograms. +@item diff +Compute histograms only for the part that differs from previous frame. This +might be relevant to give more importance to the moving part of your input if +the background is static. +@end table + +Default value is @var{full}. +@end table + +The filter also exports the frame metadata @code{lavfi.color_quant_ratio} +(@code{nb_color_in / nb_color_out}) which you can use to evaluate the degree of +color quantization of the palette. This information is also visible at +@var{info} logging level. + +@subsection Examples + +@itemize +@item +Generate a representative palette of a given video using @command{ffmpeg}: +@example +ffmpeg -i input.mkv -vf palettegen palette.png +@end example +@end itemize + +@section paletteuse + +Use a palette to downsample an input video stream. + +The filter takes two inputs: one video stream and a palette. The palette must +be a 256 pixels image. + +It accepts the following options: + +@table @option +@item dither +Select dithering mode. Available algorithms are: +@table @samp +@item bayer +Ordered 8x8 bayer dithering (deterministic) +@item heckbert +Dithering as defined by Paul Heckbert in 1982 (simple error diffusion). +Note: this dithering is sometimes considered "wrong" and is included as a +reference. +@item floyd_steinberg +Floyd and Steingberg dithering (error diffusion) +@item sierra2 +Frankie Sierra dithering v2 (error diffusion) +@item sierra2_4a +Frankie Sierra dithering v2 "Lite" (error diffusion) +@end table + +Default is @var{sierra2_4a}. + +@item bayer_scale +When @var{bayer} dithering is selected, this option defines the scale of the +pattern (how much the crosshatch pattern is visible). A low value means more +visible pattern for less banding, and higher value means less visible pattern +at the cost of more banding. + +The option must be an integer value in the range [0,5]. Default is @var{2}. + +@item diff_mode +If set, define the zone to process + +@table @samp +@item rectangle +Only the changing rectangle will be reprocessed. This is similar to GIF +cropping/offsetting compression mechanism. This option can be useful for speed +if only a part of the image is changing, and has use cases such as limiting the +scope of the error diffusal @option{dither} to the rectangle that bounds the +moving scene (it leads to more deterministic output if the scene doesn't change +much, and as a result less moving noise and better GIF compression). +@end table + +Default is @var{none}. +@end table + +@subsection Examples + +@itemize +@item +Use a palette (generated for example with @ref{palettegen}) to encode a GIF +using @command{ffmpeg}: +@example +ffmpeg -i input.mkv -i palette.png -lavfi paletteuse output.gif +@end example +@end itemize + +@section perspective + +Correct perspective of video not recorded perpendicular to the screen. + +A description of the accepted parameters follows. + +@table @option +@item x0 +@item y0 +@item x1 +@item y1 +@item x2 +@item y2 +@item x3 +@item y3 +Set coordinates expression for top left, top right, bottom left and bottom right corners. +Default values are @code{0:0:W:0:0:H:W:H} with which perspective will remain unchanged. +If the @code{sense} option is set to @code{source}, then the specified points will be sent +to the corners of the destination. If the @code{sense} option is set to @code{destination}, +then the corners of the source will be sent to the specified coordinates. + +The expressions can use the following variables: + +@table @option +@item W +@item H +the width and height of video frame. +@end table + +@item interpolation +Set interpolation for perspective correction. + +It accepts the following values: +@table @samp +@item linear +@item cubic +@end table + +Default value is @samp{linear}. + +@item sense +Set interpretation of coordinate options. + +It accepts the following values: +@table @samp +@item 0, source + +Send point in the source specified by the given coordinates to +the corners of the destination. + +@item 1, destination + +Send the corners of the source to the point in the destination specified +by the given coordinates. + +Default value is @samp{source}. +@end table +@end table + +@section phase + +Delay interlaced video by one field time so that the field order changes. + +The intended use is to fix PAL movies that have been captured with the +opposite field order to the film-to-video transfer. + +A description of the accepted parameters follows. + +@table @option +@item mode +Set phase mode. + +It accepts the following values: +@table @samp +@item t +Capture field order top-first, transfer bottom-first. +Filter will delay the bottom field. + +@item b +Capture field order bottom-first, transfer top-first. +Filter will delay the top field. + +@item p +Capture and transfer with the same field order. This mode only exists +for the documentation of the other options to refer to, but if you +actually select it, the filter will faithfully do nothing. + +@item a +Capture field order determined automatically by field flags, transfer +opposite. +Filter selects among @samp{t} and @samp{b} modes on a frame by frame +basis using field flags. If no field information is available, +then this works just like @samp{u}. + +@item u +Capture unknown or varying, transfer opposite. +Filter selects among @samp{t} and @samp{b} on a frame by frame basis by +analyzing the images and selecting the alternative that produces best +match between the fields. + +@item T +Capture top-first, transfer unknown or varying. +Filter selects among @samp{t} and @samp{p} using image analysis. + +@item B +Capture bottom-first, transfer unknown or varying. +Filter selects among @samp{b} and @samp{p} using image analysis. + +@item A +Capture determined by field flags, transfer unknown or varying. +Filter selects among @samp{t}, @samp{b} and @samp{p} using field flags and +image analysis. If no field information is available, then this works just +like @samp{U}. This is the default mode. + +@item U +Both capture and transfer unknown or varying. +Filter selects among @samp{t}, @samp{b} and @samp{p} using image analysis only. +@end table +@end table + +@section pixdesctest + +Pixel format descriptor test filter, mainly useful for internal +testing. The output video should be equal to the input video. + +For example: +@example +format=monow, pixdesctest +@end example + +can be used to test the monowhite pixel format descriptor definition. + +@section pp + +Enable the specified chain of postprocessing subfilters using libpostproc. This +library should be automatically selected with a GPL build (@code{--enable-gpl}). +Subfilters must be separated by '/' and can be disabled by prepending a '-'. +Each subfilter and some options have a short and a long name that can be used +interchangeably, i.e. dr/dering are the same. + +The filters accept the following options: + +@table @option +@item subfilters +Set postprocessing subfilters string. +@end table + +All subfilters share common options to determine their scope: + +@table @option +@item a/autoq +Honor the quality commands for this subfilter. + +@item c/chrom +Do chrominance filtering, too (default). + +@item y/nochrom +Do luminance filtering only (no chrominance). + +@item n/noluma +Do chrominance filtering only (no luminance). +@end table + +These options can be appended after the subfilter name, separated by a '|'. + +Available subfilters are: + +@table @option +@item hb/hdeblock[|difference[|flatness]] +Horizontal deblocking filter +@table @option +@item difference +Difference factor where higher values mean more deblocking (default: @code{32}). +@item flatness +Flatness threshold where lower values mean more deblocking (default: @code{39}). +@end table + +@item vb/vdeblock[|difference[|flatness]] +Vertical deblocking filter +@table @option +@item difference +Difference factor where higher values mean more deblocking (default: @code{32}). +@item flatness +Flatness threshold where lower values mean more deblocking (default: @code{39}). +@end table + +@item ha/hadeblock[|difference[|flatness]] +Accurate horizontal deblocking filter +@table @option +@item difference +Difference factor where higher values mean more deblocking (default: @code{32}). +@item flatness +Flatness threshold where lower values mean more deblocking (default: @code{39}). +@end table + +@item va/vadeblock[|difference[|flatness]] +Accurate vertical deblocking filter +@table @option +@item difference +Difference factor where higher values mean more deblocking (default: @code{32}). +@item flatness +Flatness threshold where lower values mean more deblocking (default: @code{39}). +@end table +@end table + +The horizontal and vertical deblocking filters share the difference and +flatness values so you cannot set different horizontal and vertical +thresholds. + +@table @option +@item h1/x1hdeblock +Experimental horizontal deblocking filter + +@item v1/x1vdeblock +Experimental vertical deblocking filter + +@item dr/dering +Deringing filter + +@item tn/tmpnoise[|threshold1[|threshold2[|threshold3]]], temporal noise reducer +@table @option +@item threshold1 +larger -> stronger filtering +@item threshold2 +larger -> stronger filtering +@item threshold3 +larger -> stronger filtering +@end table + +@item al/autolevels[:f/fullyrange], automatic brightness / contrast correction +@table @option +@item f/fullyrange +Stretch luminance to @code{0-255}. +@end table + +@item lb/linblenddeint +Linear blend deinterlacing filter that deinterlaces the given block by +filtering all lines with a @code{(1 2 1)} filter. + +@item li/linipoldeint +Linear interpolating deinterlacing filter that deinterlaces the given block by +linearly interpolating every second line. + +@item ci/cubicipoldeint +Cubic interpolating deinterlacing filter deinterlaces the given block by +cubically interpolating every second line. + +@item md/mediandeint +Median deinterlacing filter that deinterlaces the given block by applying a +median filter to every second line. + +@item fd/ffmpegdeint +FFmpeg deinterlacing filter that deinterlaces the given block by filtering every +second line with a @code{(-1 4 2 4 -1)} filter. + +@item l5/lowpass5 +Vertically applied FIR lowpass deinterlacing filter that deinterlaces the given +block by filtering all lines with a @code{(-1 2 6 2 -1)} filter. + +@item fq/forceQuant[|quantizer] +Overrides the quantizer table from the input with the constant quantizer you +specify. +@table @option +@item quantizer +Quantizer to use +@end table + +@item de/default +Default pp filter combination (@code{hb|a,vb|a,dr|a}) + +@item fa/fast +Fast pp filter combination (@code{h1|a,v1|a,dr|a}) + +@item ac +High quality pp filter combination (@code{ha|a|128|7,va|a,dr|a}) +@end table + +@subsection Examples + +@itemize +@item +Apply horizontal and vertical deblocking, deringing and automatic +brightness/contrast: +@example +pp=hb/vb/dr/al +@end example + +@item +Apply default filters without brightness/contrast correction: +@example +pp=de/-al +@end example + +@item +Apply default filters and temporal denoiser: +@example +pp=default/tmpnoise|1|2|3 +@end example + +@item +Apply deblocking on luminance only, and switch vertical deblocking on or off +automatically depending on available CPU time: +@example +pp=hb|y/vb|a +@end example +@end itemize + +@section pp7 +Apply Postprocessing filter 7. It is variant of the @ref{spp} filter, +similar to spp = 6 with 7 point DCT, where only the center sample is +used after IDCT. + +The filter accepts the following options: + +@table @option +@item qp +Force a constant quantization parameter. It accepts an integer in range +0 to 63. If not set, the filter will use the QP from the video stream +(if available). + +@item mode +Set thresholding mode. Available modes are: + +@table @samp +@item hard +Set hard thresholding. +@item soft +Set soft thresholding (better de-ringing effect, but likely blurrier). +@item medium +Set medium thresholding (good results, default). +@end table +@end table + +@section psnr + +Obtain the average, maximum and minimum PSNR (Peak Signal to Noise +Ratio) between two input videos. + +This filter takes in input two input videos, the first input is +considered the "main" source and is passed unchanged to the +output. The second input is used as a "reference" video for computing +the PSNR. + +Both video inputs must have the same resolution and pixel format for +this filter to work correctly. Also it assumes that both inputs +have the same number of frames, which are compared one by one. + +The obtained average PSNR is printed through the logging system. + +The filter stores the accumulated MSE (mean squared error) of each +frame, and at the end of the processing it is averaged across all frames +equally, and the following formula is applied to obtain the PSNR: + +@example +PSNR = 10*log10(MAX^2/MSE) +@end example + +Where MAX is the average of the maximum values of each component of the +image. + +The description of the accepted parameters follows. + +@table @option +@item stats_file, f +If specified the filter will use the named file to save the PSNR of +each individual frame. When filename equals "-" the data is sent to +standard output. +@end table + +The file printed if @var{stats_file} is selected, contains a sequence of +key/value pairs of the form @var{key}:@var{value} for each compared +couple of frames. + +A description of each shown parameter follows: + +@table @option +@item n +sequential number of the input frame, starting from 1 + +@item mse_avg +Mean Square Error pixel-by-pixel average difference of the compared +frames, averaged over all the image components. + +@item mse_y, mse_u, mse_v, mse_r, mse_g, mse_g, mse_a +Mean Square Error pixel-by-pixel average difference of the compared +frames for the component specified by the suffix. + +@item psnr_y, psnr_u, psnr_v, psnr_r, psnr_g, psnr_b, psnr_a +Peak Signal to Noise ratio of the compared frames for the component +specified by the suffix. +@end table + +For example: +@example +movie=ref_movie.mpg, setpts=PTS-STARTPTS [main]; +[main][ref] psnr="stats_file=stats.log" [out] +@end example + +On this example the input file being processed is compared with the +reference file @file{ref_movie.mpg}. The PSNR of each individual frame +is stored in @file{stats.log}. + +@anchor{pullup} +@section pullup + +Pulldown reversal (inverse telecine) filter, capable of handling mixed +hard-telecine, 24000/1001 fps progressive, and 30000/1001 fps progressive +content. + +The pullup filter is designed to take advantage of future context in making +its decisions. This filter is stateless in the sense that it does not lock +onto a pattern to follow, but it instead looks forward to the following +fields in order to identify matches and rebuild progressive frames. + +To produce content with an even framerate, insert the fps filter after +pullup, use @code{fps=24000/1001} if the input frame rate is 29.97fps, +@code{fps=24} for 30fps and the (rare) telecined 25fps input. + +The filter accepts the following options: + +@table @option +@item jl +@item jr +@item jt +@item jb +These options set the amount of "junk" to ignore at the left, right, top, and +bottom of the image, respectively. Left and right are in units of 8 pixels, +while top and bottom are in units of 2 lines. +The default is 8 pixels on each side. + +@item sb +Set the strict breaks. Setting this option to 1 will reduce the chances of +filter generating an occasional mismatched frame, but it may also cause an +excessive number of frames to be dropped during high motion sequences. +Conversely, setting it to -1 will make filter match fields more easily. +This may help processing of video where there is slight blurring between +the fields, but may also cause there to be interlaced frames in the output. +Default value is @code{0}. + +@item mp +Set the metric plane to use. It accepts the following values: +@table @samp +@item l +Use luma plane. + +@item u +Use chroma blue plane. + +@item v +Use chroma red plane. +@end table + +This option may be set to use chroma plane instead of the default luma plane +for doing filter's computations. This may improve accuracy on very clean +source material, but more likely will decrease accuracy, especially if there +is chroma noise (rainbow effect) or any grayscale video. +The main purpose of setting @option{mp} to a chroma plane is to reduce CPU +load and make pullup usable in realtime on slow machines. +@end table + +For best results (without duplicated frames in the output file) it is +necessary to change the output frame rate. For example, to inverse +telecine NTSC input: +@example +ffmpeg -i input -vf pullup -r 24000/1001 ... +@end example + +@section qp + +Change video quantization parameters (QP). + +The filter accepts the following option: + +@table @option +@item qp +Set expression for quantization parameter. +@end table + +The expression is evaluated through the eval API and can contain, among others, +the following constants: + +@table @var +@item known +1 if index is not 129, 0 otherwise. + +@item qp +Sequentional index starting from -129 to 128. +@end table + +@subsection Examples + +@itemize +@item +Some equation like: +@example +qp=2+2*sin(PI*qp) +@end example +@end itemize + +@section random + +Flush video frames from internal cache of frames into a random order. +No frame is discarded. +Inspired by @ref{frei0r} nervous filter. + +@table @option +@item frames +Set size in number of frames of internal cache, in range from @code{2} to +@code{512}. Default is @code{30}. + +@item seed +Set seed for random number generator, must be an integer included between +@code{0} and @code{UINT32_MAX}. If not specified, or if explicitly set to +less than @code{0}, the filter will try to use a good random seed on a +best effort basis. +@end table + +@section removegrain + +The removegrain filter is a spatial denoiser for progressive video. + +@table @option +@item m0 +Set mode for the first plane. + +@item m1 +Set mode for the second plane. + +@item m2 +Set mode for the third plane. + +@item m3 +Set mode for the fourth plane. +@end table + +Range of mode is from 0 to 24. Description of each mode follows: + +@table @var +@item 0 +Leave input plane unchanged. Default. + +@item 1 +Clips the pixel with the minimum and maximum of the 8 neighbour pixels. + +@item 2 +Clips the pixel with the second minimum and maximum of the 8 neighbour pixels. + +@item 3 +Clips the pixel with the third minimum and maximum of the 8 neighbour pixels. + +@item 4 +Clips the pixel with the fourth minimum and maximum of the 8 neighbour pixels. +This is equivalent to a median filter. + +@item 5 +Line-sensitive clipping giving the minimal change. + +@item 6 +Line-sensitive clipping, intermediate. + +@item 7 +Line-sensitive clipping, intermediate. + +@item 8 +Line-sensitive clipping, intermediate. + +@item 9 +Line-sensitive clipping on a line where the neighbours pixels are the closest. + +@item 10 +Replaces the target pixel with the closest neighbour. + +@item 11 +[1 2 1] horizontal and vertical kernel blur. + +@item 12 +Same as mode 11. + +@item 13 +Bob mode, interpolates top field from the line where the neighbours +pixels are the closest. + +@item 14 +Bob mode, interpolates bottom field from the line where the neighbours +pixels are the closest. + +@item 15 +Bob mode, interpolates top field. Same as 13 but with a more complicated +interpolation formula. + +@item 16 +Bob mode, interpolates bottom field. Same as 14 but with a more complicated +interpolation formula. + +@item 17 +Clips the pixel with the minimum and maximum of respectively the maximum and +minimum of each pair of opposite neighbour pixels. + +@item 18 +Line-sensitive clipping using opposite neighbours whose greatest distance from +the current pixel is minimal. + +@item 19 +Replaces the pixel with the average of its 8 neighbours. + +@item 20 +Averages the 9 pixels ([1 1 1] horizontal and vertical blur). + +@item 21 +Clips pixels using the averages of opposite neighbour. + +@item 22 +Same as mode 21 but simpler and faster. + +@item 23 +Small edge and halo removal, but reputed useless. + +@item 24 +Similar as 23. +@end table + +@section removelogo + +Suppress a TV station logo, using an image file to determine which +pixels comprise the logo. It works by filling in the pixels that +comprise the logo with neighboring pixels. + +The filter accepts the following options: + +@table @option +@item filename, f +Set the filter bitmap file, which can be any image format supported by +libavformat. The width and height of the image file must match those of the +video stream being processed. +@end table + +Pixels in the provided bitmap image with a value of zero are not +considered part of the logo, non-zero pixels are considered part of +the logo. If you use white (255) for the logo and black (0) for the +rest, you will be safe. For making the filter bitmap, it is +recommended to take a screen capture of a black frame with the logo +visible, and then using a threshold filter followed by the erode +filter once or twice. + +If needed, little splotches can be fixed manually. Remember that if +logo pixels are not covered, the filter quality will be much +reduced. Marking too many pixels as part of the logo does not hurt as +much, but it will increase the amount of blurring needed to cover over +the image and will destroy more information than necessary, and extra +pixels will slow things down on a large logo. + +@section repeatfields + +This filter uses the repeat_field flag from the Video ES headers and hard repeats +fields based on its value. + +@section reverse, areverse + +Reverse a clip. + +Warning: This filter requires memory to buffer the entire clip, so trimming +is suggested. + +@subsection Examples + +@itemize +@item +Take the first 5 seconds of a clip, and reverse it. +@example +trim=end=5,reverse +@end example +@end itemize + +@section rotate + +Rotate video by an arbitrary angle expressed in radians. + +The filter accepts the following options: + +A description of the optional parameters follows. +@table @option +@item angle, a +Set an expression for the angle by which to rotate the input video +clockwise, expressed as a number of radians. A negative value will +result in a counter-clockwise rotation. By default it is set to "0". + +This expression is evaluated for each frame. + +@item out_w, ow +Set the output width expression, default value is "iw". +This expression is evaluated just once during configuration. + +@item out_h, oh +Set the output height expression, default value is "ih". +This expression is evaluated just once during configuration. + +@item bilinear +Enable bilinear interpolation if set to 1, a value of 0 disables +it. Default value is 1. + +@item fillcolor, c +Set the color used to fill the output area not covered by the rotated +image. For the general syntax of this option, check the "Color" section in the +ffmpeg-utils manual. If the special value "none" is selected then no +background is printed (useful for example if the background is never shown). + +Default value is "black". +@end table + +The expressions for the angle and the output size can contain the +following constants and functions: + +@table @option +@item n +sequential number of the input frame, starting from 0. It is always NAN +before the first frame is filtered. + +@item t +time in seconds of the input frame, it is set to 0 when the filter is +configured. It is always NAN before the first frame is filtered. + +@item hsub +@item vsub +horizontal and vertical chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item in_w, iw +@item in_h, ih +the input video width and height + +@item out_w, ow +@item out_h, oh +the output width and height, that is the size of the padded area as +specified by the @var{width} and @var{height} expressions + +@item rotw(a) +@item roth(a) +the minimal width/height required for completely containing the input +video rotated by @var{a} radians. + +These are only available when computing the @option{out_w} and +@option{out_h} expressions. +@end table + +@subsection Examples + +@itemize +@item +Rotate the input by PI/6 radians clockwise: +@example +rotate=PI/6 +@end example + +@item +Rotate the input by PI/6 radians counter-clockwise: +@example +rotate=-PI/6 +@end example + +@item +Rotate the input by 45 degrees clockwise: +@example +rotate=45*PI/180 +@end example + +@item +Apply a constant rotation with period T, starting from an angle of PI/3: +@example +rotate=PI/3+2*PI*t/T +@end example + +@item +Make the input video rotation oscillating with a period of T +seconds and an amplitude of A radians: +@example +rotate=A*sin(2*PI/T*t) +@end example + +@item +Rotate the video, output size is chosen so that the whole rotating +input video is always completely contained in the output: +@example +rotate='2*PI*t:ow=hypot(iw,ih):oh=ow' +@end example + +@item +Rotate the video, reduce the output size so that no background is ever +shown: +@example +rotate=2*PI*t:ow='min(iw,ih)/sqrt(2)':oh=ow:c=none +@end example +@end itemize + +@subsection Commands + +The filter supports the following commands: + +@table @option +@item a, angle +Set the angle expression. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@end table + +@section sab + +Apply Shape Adaptive Blur. + +The filter accepts the following options: + +@table @option +@item luma_radius, lr +Set luma blur filter strength, must be a value in range 0.1-4.0, default +value is 1.0. A greater value will result in a more blurred image, and +in slower processing. + +@item luma_pre_filter_radius, lpfr +Set luma pre-filter radius, must be a value in the 0.1-2.0 range, default +value is 1.0. + +@item luma_strength, ls +Set luma maximum difference between pixels to still be considered, must +be a value in the 0.1-100.0 range, default value is 1.0. + +@item chroma_radius, cr +Set chroma blur filter strength, must be a value in range 0.1-4.0. A +greater value will result in a more blurred image, and in slower +processing. + +@item chroma_pre_filter_radius, cpfr +Set chroma pre-filter radius, must be a value in the 0.1-2.0 range. + +@item chroma_strength, cs +Set chroma maximum difference between pixels to still be considered, +must be a value in the 0.1-100.0 range. +@end table + +Each chroma option value, if not explicitly specified, is set to the +corresponding luma option value. + +@anchor{scale} +@section scale + +Scale (resize) the input video, using the libswscale library. + +The scale filter forces the output display aspect ratio to be the same +of the input, by changing the output sample aspect ratio. + +If the input image format is different from the format requested by +the next filter, the scale filter will convert the input to the +requested format. + +@subsection Options +The filter accepts the following options, or any of the options +supported by the libswscale scaler. + +See @ref{scaler_options,,the ffmpeg-scaler manual,ffmpeg-scaler} for +the complete list of scaler options. + +@table @option +@item width, w +@item height, h +Set the output video dimension expression. Default value is the input +dimension. + +If the value is 0, the input width is used for the output. + +If one of the values is -1, the scale filter will use a value that +maintains the aspect ratio of the input image, calculated from the +other specified dimension. If both of them are -1, the input size is +used + +If one of the values is -n with n > 1, the scale filter will also use a value +that maintains the aspect ratio of the input image, calculated from the other +specified dimension. After that it will, however, make sure that the calculated +dimension is divisible by n and adjust the value if necessary. + +See below for the list of accepted constants for use in the dimension +expression. + +@item eval +Specify when to evaluate @var{width} and @var{height} expression. It accepts the following values: + +@table @samp +@item init +Only evaluate expressions once during the filter initialization or when a command is processed. + +@item frame +Evaluate expressions for each incoming frame. + +@end table + +Default value is @samp{init}. + + +@item interl +Set the interlacing mode. It accepts the following values: + +@table @samp +@item 1 +Force interlaced aware scaling. + +@item 0 +Do not apply interlaced scaling. + +@item -1 +Select interlaced aware scaling depending on whether the source frames +are flagged as interlaced or not. +@end table + +Default value is @samp{0}. + +@item flags +Set libswscale scaling flags. See +@ref{sws_flags,,the ffmpeg-scaler manual,ffmpeg-scaler} for the +complete list of values. If not explicitly specified the filter applies +the default flags. + + +@item param0, param1 +Set libswscale input parameters for scaling algorithms that need them. See +@ref{sws_params,,the ffmpeg-scaler manual,ffmpeg-scaler} for the +complete documentation. If not explicitly specified the filter applies +empty parameters. + + + +@item size, s +Set the video size. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +@item in_color_matrix +@item out_color_matrix +Set in/output YCbCr color space type. + +This allows the autodetected value to be overridden as well as allows forcing +a specific value used for the output and encoder. + +If not specified, the color space type depends on the pixel format. + +Possible values: + +@table @samp +@item auto +Choose automatically. + +@item bt709 +Format conforming to International Telecommunication Union (ITU) +Recommendation BT.709. + +@item fcc +Set color space conforming to the United States Federal Communications +Commission (FCC) Code of Federal Regulations (CFR) Title 47 (2003) 73.682 (a). + +@item bt601 +Set color space conforming to: + +@itemize +@item +ITU Radiocommunication Sector (ITU-R) Recommendation BT.601 + +@item +ITU-R Rec. BT.470-6 (1998) Systems B, B1, and G + +@item +Society of Motion Picture and Television Engineers (SMPTE) ST 170:2004 + +@end itemize + +@item smpte240m +Set color space conforming to SMPTE ST 240:1999. +@end table + +@item in_range +@item out_range +Set in/output YCbCr sample range. + +This allows the autodetected value to be overridden as well as allows forcing +a specific value used for the output and encoder. If not specified, the +range depends on the pixel format. Possible values: + +@table @samp +@item auto +Choose automatically. + +@item jpeg/full/pc +Set full range (0-255 in case of 8-bit luma). + +@item mpeg/tv +Set "MPEG" range (16-235 in case of 8-bit luma). +@end table + +@item force_original_aspect_ratio +Enable decreasing or increasing output video width or height if necessary to +keep the original aspect ratio. Possible values: + +@table @samp +@item disable +Scale the video as specified and disable this feature. + +@item decrease +The output video dimensions will automatically be decreased if needed. + +@item increase +The output video dimensions will automatically be increased if needed. + +@end table + +One useful instance of this option is that when you know a specific device's +maximum allowed resolution, you can use this to limit the output video to +that, while retaining the aspect ratio. For example, device A allows +1280x720 playback, and your video is 1920x800. Using this option (set it to +decrease) and specifying 1280x720 to the command line makes the output +1280x533. + +Please note that this is a different thing than specifying -1 for @option{w} +or @option{h}, you still need to specify the output resolution for this option +to work. + +@end table + +The values of the @option{w} and @option{h} options are expressions +containing the following constants: + +@table @var +@item in_w +@item in_h +The input width and height + +@item iw +@item ih +These are the same as @var{in_w} and @var{in_h}. + +@item out_w +@item out_h +The output (scaled) width and height + +@item ow +@item oh +These are the same as @var{out_w} and @var{out_h} + +@item a +The same as @var{iw} / @var{ih} + +@item sar +input sample aspect ratio + +@item dar +The input display aspect ratio. Calculated from @code{(iw / ih) * sar}. + +@item hsub +@item vsub +horizontal and vertical input chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item ohsub +@item ovsub +horizontal and vertical output chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. +@end table + +@subsection Examples + +@itemize +@item +Scale the input video to a size of 200x100 +@example +scale=w=200:h=100 +@end example + +This is equivalent to: +@example +scale=200:100 +@end example + +or: +@example +scale=200x100 +@end example + +@item +Specify a size abbreviation for the output size: +@example +scale=qcif +@end example + +which can also be written as: +@example +scale=size=qcif +@end example + +@item +Scale the input to 2x: +@example +scale=w=2*iw:h=2*ih +@end example + +@item +The above is the same as: +@example +scale=2*in_w:2*in_h +@end example + +@item +Scale the input to 2x with forced interlaced scaling: +@example +scale=2*iw:2*ih:interl=1 +@end example + +@item +Scale the input to half size: +@example +scale=w=iw/2:h=ih/2 +@end example + +@item +Increase the width, and set the height to the same size: +@example +scale=3/2*iw:ow +@end example + +@item +Seek Greek harmony: +@example +scale=iw:1/PHI*iw +scale=ih*PHI:ih +@end example + +@item +Increase the height, and set the width to 3/2 of the height: +@example +scale=w=3/2*oh:h=3/5*ih +@end example + +@item +Increase the size, making the size a multiple of the chroma +subsample values: +@example +scale="trunc(3/2*iw/hsub)*hsub:trunc(3/2*ih/vsub)*vsub" +@end example + +@item +Increase the width to a maximum of 500 pixels, +keeping the same aspect ratio as the input: +@example +scale=w='min(500\, iw*3/2):h=-1' +@end example +@end itemize + +@subsection Commands + +This filter supports the following commands: +@table @option +@item width, w +@item height, h +Set the output video dimension expression. +The command accepts the same syntax of the corresponding option. + +If the specified expression is not valid, it is kept at its current +value. +@end table + +@section scale2ref + +Scale (resize) the input video, based on a reference video. + +See the scale filter for available options, scale2ref supports the same but +uses the reference video instead of the main input as basis. + +@subsection Examples + +@itemize +@item +Scale a subtitle stream to match the main video in size before overlaying +@example +'scale2ref[b][a];[a][b]overlay' +@end example +@end itemize + +@section selectivecolor + +Adjust cyan, magenta, yellow and black (CMYK) to certain ranges of colors (such +as "reds", "yellows", "greens", "cyans", ...). The adjustment range is defined +by the "purity" of the color (that is, how saturated it already is). + +This filter is similar to the Adobe Photoshop Selective Color tool. + +The filter accepts the following options: + +@table @option +@item correction_method +Select color correction method. + +Available values are: +@table @samp +@item absolute +Specified adjustments are applied "as-is" (added/subtracted to original pixel +component value). +@item relative +Specified adjustments are relative to the original component value. +@end table +Default is @code{absolute}. +@item reds +Adjustments for red pixels (pixels where the red component is the maximum) +@item yellows +Adjustments for yellow pixels (pixels where the blue component is the minimum) +@item greens +Adjustments for green pixels (pixels where the green component is the maximum) +@item cyans +Adjustments for cyan pixels (pixels where the red component is the minimum) +@item blues +Adjustments for blue pixels (pixels where the blue component is the maximum) +@item magentas +Adjustments for magenta pixels (pixels where the green component is the minimum) +@item whites +Adjustments for white pixels (pixels where all components are greater than 128) +@item neutrals +Adjustments for all pixels except pure black and pure white +@item blacks +Adjustments for black pixels (pixels where all components are lesser than 128) +@item psfile +Specify a Photoshop selective color file (@code{.asv}) to import the settings from. +@end table + +All the adjustment settings (@option{reds}, @option{yellows}, ...) accept up to +4 space separated floating point adjustment values in the [-1,1] range, +respectively to adjust the amount of cyan, magenta, yellow and black for the +pixels of its range. + +@subsection Examples + +@itemize +@item +Increase cyan by 50% and reduce yellow by 33% in every green areas, and +increase magenta by 27% in blue areas: +@example +selectivecolor=greens=.5 0 -.33 0:blues=0 .27 +@end example + +@item +Use a Photoshop selective color preset: +@example +selectivecolor=psfile=MySelectiveColorPresets/Misty.asv +@end example +@end itemize + +@section separatefields + +The @code{separatefields} takes a frame-based video input and splits +each frame into its components fields, producing a new half height clip +with twice the frame rate and twice the frame count. + +This filter use field-dominance information in frame to decide which +of each pair of fields to place first in the output. +If it gets it wrong use @ref{setfield} filter before @code{separatefields} filter. + +@section setdar, setsar + +The @code{setdar} filter sets the Display Aspect Ratio for the filter +output video. + +This is done by changing the specified Sample (aka Pixel) Aspect +Ratio, according to the following equation: +@example +@var{DAR} = @var{HORIZONTAL_RESOLUTION} / @var{VERTICAL_RESOLUTION} * @var{SAR} +@end example + +Keep in mind that the @code{setdar} filter does not modify the pixel +dimensions of the video frame. Also, the display aspect ratio set by +this filter may be changed by later filters in the filterchain, +e.g. in case of scaling or if another "setdar" or a "setsar" filter is +applied. + +The @code{setsar} filter sets the Sample (aka Pixel) Aspect Ratio for +the filter output video. + +Note that as a consequence of the application of this filter, the +output display aspect ratio will change according to the equation +above. + +Keep in mind that the sample aspect ratio set by the @code{setsar} +filter may be changed by later filters in the filterchain, e.g. if +another "setsar" or a "setdar" filter is applied. + +It accepts the following parameters: + +@table @option +@item r, ratio, dar (@code{setdar} only), sar (@code{setsar} only) +Set the aspect ratio used by the filter. + +The parameter can be a floating point number string, an expression, or +a string of the form @var{num}:@var{den}, where @var{num} and +@var{den} are the numerator and denominator of the aspect ratio. If +the parameter is not specified, it is assumed the value "0". +In case the form "@var{num}:@var{den}" is used, the @code{:} character +should be escaped. + +@item max +Set the maximum integer value to use for expressing numerator and +denominator when reducing the expressed aspect ratio to a rational. +Default value is @code{100}. + +@end table + +The parameter @var{sar} is an expression containing +the following constants: + +@table @option +@item E, PI, PHI +These are approximated values for the mathematical constants e +(Euler's number), pi (Greek pi), and phi (the golden ratio). + +@item w, h +The input width and height. + +@item a +These are the same as @var{w} / @var{h}. + +@item sar +The input sample aspect ratio. + +@item dar +The input display aspect ratio. It is the same as +(@var{w} / @var{h}) * @var{sar}. + +@item hsub, vsub +Horizontal and vertical chroma subsample values. For example, for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. +@end table + +@subsection Examples + +@itemize + +@item +To change the display aspect ratio to 16:9, specify one of the following: +@example +setdar=dar=1.77777 +setdar=dar=16/9 +setdar=dar=1.77777 +@end example + +@item +To change the sample aspect ratio to 10:11, specify: +@example +setsar=sar=10/11 +@end example + +@item +To set a display aspect ratio of 16:9, and specify a maximum integer value of +1000 in the aspect ratio reduction, use the command: +@example +setdar=ratio=16/9:max=1000 +@end example + +@end itemize + +@anchor{setfield} +@section setfield + +Force field for the output video frame. + +The @code{setfield} filter marks the interlace type field for the +output frames. It does not change the input frame, but only sets the +corresponding property, which affects how the frame is treated by +following filters (e.g. @code{fieldorder} or @code{yadif}). + +The filter accepts the following options: + +@table @option + +@item mode +Available values are: + +@table @samp +@item auto +Keep the same field property. + +@item bff +Mark the frame as bottom-field-first. + +@item tff +Mark the frame as top-field-first. + +@item prog +Mark the frame as progressive. +@end table +@end table + +@section showinfo + +Show a line containing various information for each input video frame. +The input video is not modified. + +The shown line contains a sequence of key/value pairs of the form +@var{key}:@var{value}. + +The following values are shown in the output: + +@table @option +@item n +The (sequential) number of the input frame, starting from 0. + +@item pts +The Presentation TimeStamp of the input frame, expressed as a number of +time base units. The time base unit depends on the filter input pad. + +@item pts_time +The Presentation TimeStamp of the input frame, expressed as a number of +seconds. + +@item pos +The position of the frame in the input stream, or -1 if this information is +unavailable and/or meaningless (for example in case of synthetic video). + +@item fmt +The pixel format name. + +@item sar +The sample aspect ratio of the input frame, expressed in the form +@var{num}/@var{den}. + +@item s +The size of the input frame. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +@item i +The type of interlaced mode ("P" for "progressive", "T" for top field first, "B" +for bottom field first). + +@item iskey +This is 1 if the frame is a key frame, 0 otherwise. + +@item type +The picture type of the input frame ("I" for an I-frame, "P" for a +P-frame, "B" for a B-frame, or "?" for an unknown type). +Also refer to the documentation of the @code{AVPictureType} enum and of +the @code{av_get_picture_type_char} function defined in +@file{libavutil/avutil.h}. + +@item checksum +The Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame. + +@item plane_checksum +The Adler-32 checksum (printed in hexadecimal) of each plane of the input frame, +expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3}]". +@end table + +@section showpalette + +Displays the 256 colors palette of each frame. This filter is only relevant for +@var{pal8} pixel format frames. + +It accepts the following option: + +@table @option +@item s +Set the size of the box used to represent one palette color entry. Default is +@code{30} (for a @code{30x30} pixel box). +@end table + +@section shuffleframes + +Reorder and/or duplicate video frames. + +It accepts the following parameters: + +@table @option +@item mapping +Set the destination indexes of input frames. +This is space or '|' separated list of indexes that maps input frames to output +frames. Number of indexes also sets maximal value that each index may have. +@end table + +The first frame has the index 0. The default is to keep the input unchanged. + +Swap second and third frame of every three frames of the input: +@example +ffmpeg -i INPUT -vf "shuffleframes=0 2 1" OUTPUT +@end example + +@section shuffleplanes + +Reorder and/or duplicate video planes. + +It accepts the following parameters: + +@table @option + +@item map0 +The index of the input plane to be used as the first output plane. + +@item map1 +The index of the input plane to be used as the second output plane. + +@item map2 +The index of the input plane to be used as the third output plane. + +@item map3 +The index of the input plane to be used as the fourth output plane. + +@end table + +The first plane has the index 0. The default is to keep the input unchanged. + +Swap the second and third planes of the input: +@example +ffmpeg -i INPUT -vf shuffleplanes=0:2:1:3 OUTPUT +@end example + +@anchor{signalstats} +@section signalstats +Evaluate various visual metrics that assist in determining issues associated +with the digitization of analog video media. + +By default the filter will log these metadata values: + +@table @option +@item YMIN +Display the minimal Y value contained within the input frame. Expressed in +range of [0-255]. + +@item YLOW +Display the Y value at the 10% percentile within the input frame. Expressed in +range of [0-255]. + +@item YAVG +Display the average Y value within the input frame. Expressed in range of +[0-255]. + +@item YHIGH +Display the Y value at the 90% percentile within the input frame. Expressed in +range of [0-255]. + +@item YMAX +Display the maximum Y value contained within the input frame. Expressed in +range of [0-255]. + +@item UMIN +Display the minimal U value contained within the input frame. Expressed in +range of [0-255]. + +@item ULOW +Display the U value at the 10% percentile within the input frame. Expressed in +range of [0-255]. + +@item UAVG +Display the average U value within the input frame. Expressed in range of +[0-255]. + +@item UHIGH +Display the U value at the 90% percentile within the input frame. Expressed in +range of [0-255]. + +@item UMAX +Display the maximum U value contained within the input frame. Expressed in +range of [0-255]. + +@item VMIN +Display the minimal V value contained within the input frame. Expressed in +range of [0-255]. + +@item VLOW +Display the V value at the 10% percentile within the input frame. Expressed in +range of [0-255]. + +@item VAVG +Display the average V value within the input frame. Expressed in range of +[0-255]. + +@item VHIGH +Display the V value at the 90% percentile within the input frame. Expressed in +range of [0-255]. + +@item VMAX +Display the maximum V value contained within the input frame. Expressed in +range of [0-255]. + +@item SATMIN +Display the minimal saturation value contained within the input frame. +Expressed in range of [0-~181.02]. + +@item SATLOW +Display the saturation value at the 10% percentile within the input frame. +Expressed in range of [0-~181.02]. + +@item SATAVG +Display the average saturation value within the input frame. Expressed in range +of [0-~181.02]. + +@item SATHIGH +Display the saturation value at the 90% percentile within the input frame. +Expressed in range of [0-~181.02]. + +@item SATMAX +Display the maximum saturation value contained within the input frame. +Expressed in range of [0-~181.02]. + +@item HUEMED +Display the median value for hue within the input frame. Expressed in range of +[0-360]. + +@item HUEAVG +Display the average value for hue within the input frame. Expressed in range of +[0-360]. + +@item YDIF +Display the average of sample value difference between all values of the Y +plane in the current frame and corresponding values of the previous input frame. +Expressed in range of [0-255]. + +@item UDIF +Display the average of sample value difference between all values of the U +plane in the current frame and corresponding values of the previous input frame. +Expressed in range of [0-255]. + +@item VDIF +Display the average of sample value difference between all values of the V +plane in the current frame and corresponding values of the previous input frame. +Expressed in range of [0-255]. +@end table + +The filter accepts the following options: + +@table @option +@item stat +@item out + +@option{stat} specify an additional form of image analysis. +@option{out} output video with the specified type of pixel highlighted. + +Both options accept the following values: + +@table @samp +@item tout +Identify @var{temporal outliers} pixels. A @var{temporal outlier} is a pixel +unlike the neighboring pixels of the same field. Examples of temporal outliers +include the results of video dropouts, head clogs, or tape tracking issues. + +@item vrep +Identify @var{vertical line repetition}. Vertical line repetition includes +similar rows of pixels within a frame. In born-digital video vertical line +repetition is common, but this pattern is uncommon in video digitized from an +analog source. When it occurs in video that results from the digitization of an +analog source it can indicate concealment from a dropout compensator. + +@item brng +Identify pixels that fall outside of legal broadcast range. +@end table + +@item color, c +Set the highlight color for the @option{out} option. The default color is +yellow. +@end table + +@subsection Examples + +@itemize +@item +Output data of various video metrics: +@example +ffprobe -f lavfi movie=example.mov,signalstats="stat=tout+vrep+brng" -show_frames +@end example + +@item +Output specific data about the minimum and maximum values of the Y plane per frame: +@example +ffprobe -f lavfi movie=example.mov,signalstats -show_entries frame_tags=lavfi.signalstats.YMAX,lavfi.signalstats.YMIN +@end example + +@item +Playback video while highlighting pixels that are outside of broadcast range in red. +@example +ffplay example.mov -vf signalstats="out=brng:color=red" +@end example + +@item +Playback video with signalstats metadata drawn over the frame. +@example +ffplay example.mov -vf signalstats=stat=brng+vrep+tout,drawtext=fontfile=FreeSerif.ttf:textfile=signalstat_drawtext.txt +@end example + +The contents of signalstat_drawtext.txt used in the command are: +@example +time %@{pts:hms@} +Y (%@{metadata:lavfi.signalstats.YMIN@}-%@{metadata:lavfi.signalstats.YMAX@}) +U (%@{metadata:lavfi.signalstats.UMIN@}-%@{metadata:lavfi.signalstats.UMAX@}) +V (%@{metadata:lavfi.signalstats.VMIN@}-%@{metadata:lavfi.signalstats.VMAX@}) +saturation maximum: %@{metadata:lavfi.signalstats.SATMAX@} + +@end example +@end itemize + +@anchor{smartblur} +@section smartblur + +Blur the input video without impacting the outlines. + +It accepts the following options: + +@table @option +@item luma_radius, lr +Set the luma radius. The option value must be a float number in +the range [0.1,5.0] that specifies the variance of the gaussian filter +used to blur the image (slower if larger). Default value is 1.0. + +@item luma_strength, ls +Set the luma strength. The option value must be a float number +in the range [-1.0,1.0] that configures the blurring. A value included +in [0.0,1.0] will blur the image whereas a value included in +[-1.0,0.0] will sharpen the image. Default value is 1.0. + +@item luma_threshold, lt +Set the luma threshold used as a coefficient to determine +whether a pixel should be blurred or not. The option value must be an +integer in the range [-30,30]. A value of 0 will filter all the image, +a value included in [0,30] will filter flat areas and a value included +in [-30,0] will filter edges. Default value is 0. + +@item chroma_radius, cr +Set the chroma radius. The option value must be a float number in +the range [0.1,5.0] that specifies the variance of the gaussian filter +used to blur the image (slower if larger). Default value is 1.0. + +@item chroma_strength, cs +Set the chroma strength. The option value must be a float number +in the range [-1.0,1.0] that configures the blurring. A value included +in [0.0,1.0] will blur the image whereas a value included in +[-1.0,0.0] will sharpen the image. Default value is 1.0. + +@item chroma_threshold, ct +Set the chroma threshold used as a coefficient to determine +whether a pixel should be blurred or not. The option value must be an +integer in the range [-30,30]. A value of 0 will filter all the image, +a value included in [0,30] will filter flat areas and a value included +in [-30,0] will filter edges. Default value is 0. +@end table + +If a chroma option is not explicitly set, the corresponding luma value +is set. + +@section ssim + +Obtain the SSIM (Structural SImilarity Metric) between two input videos. + +This filter takes in input two input videos, the first input is +considered the "main" source and is passed unchanged to the +output. The second input is used as a "reference" video for computing +the SSIM. + +Both video inputs must have the same resolution and pixel format for +this filter to work correctly. Also it assumes that both inputs +have the same number of frames, which are compared one by one. + +The filter stores the calculated SSIM of each frame. + +The description of the accepted parameters follows. + +@table @option +@item stats_file, f +If specified the filter will use the named file to save the SSIM of +each individual frame. When filename equals "-" the data is sent to +standard output. +@end table + +The file printed if @var{stats_file} is selected, contains a sequence of +key/value pairs of the form @var{key}:@var{value} for each compared +couple of frames. + +A description of each shown parameter follows: + +@table @option +@item n +sequential number of the input frame, starting from 1 + +@item Y, U, V, R, G, B +SSIM of the compared frames for the component specified by the suffix. + +@item All +SSIM of the compared frames for the whole frame. + +@item dB +Same as above but in dB representation. +@end table + +For example: +@example +movie=ref_movie.mpg, setpts=PTS-STARTPTS [main]; +[main][ref] ssim="stats_file=stats.log" [out] +@end example + +On this example the input file being processed is compared with the +reference file @file{ref_movie.mpg}. The SSIM of each individual frame +is stored in @file{stats.log}. + +Another example with both psnr and ssim at same time: +@example +ffmpeg -i main.mpg -i ref.mpg -lavfi "ssim;[0:v][1:v]psnr" -f null - +@end example + +@section stereo3d + +Convert between different stereoscopic image formats. + +The filters accept the following options: + +@table @option +@item in +Set stereoscopic image format of input. + +Available values for input image formats are: +@table @samp +@item sbsl +side by side parallel (left eye left, right eye right) + +@item sbsr +side by side crosseye (right eye left, left eye right) + +@item sbs2l +side by side parallel with half width resolution +(left eye left, right eye right) + +@item sbs2r +side by side crosseye with half width resolution +(right eye left, left eye right) + +@item abl +above-below (left eye above, right eye below) + +@item abr +above-below (right eye above, left eye below) + +@item ab2l +above-below with half height resolution +(left eye above, right eye below) + +@item ab2r +above-below with half height resolution +(right eye above, left eye below) + +@item al +alternating frames (left eye first, right eye second) + +@item ar +alternating frames (right eye first, left eye second) + +@item irl +interleaved rows (left eye has top row, right eye starts on next row) + +@item irr +interleaved rows (right eye has top row, left eye starts on next row) + +@item icl +interleaved columns, left eye first + +@item icr +interleaved columns, right eye first + +Default value is @samp{sbsl}. +@end table + +@item out +Set stereoscopic image format of output. + +@table @samp +@item sbsl +side by side parallel (left eye left, right eye right) + +@item sbsr +side by side crosseye (right eye left, left eye right) + +@item sbs2l +side by side parallel with half width resolution +(left eye left, right eye right) + +@item sbs2r +side by side crosseye with half width resolution +(right eye left, left eye right) + +@item abl +above-below (left eye above, right eye below) + +@item abr +above-below (right eye above, left eye below) + +@item ab2l +above-below with half height resolution +(left eye above, right eye below) + +@item ab2r +above-below with half height resolution +(right eye above, left eye below) + +@item al +alternating frames (left eye first, right eye second) + +@item ar +alternating frames (right eye first, left eye second) + +@item irl +interleaved rows (left eye has top row, right eye starts on next row) + +@item irr +interleaved rows (right eye has top row, left eye starts on next row) + +@item arbg +anaglyph red/blue gray +(red filter on left eye, blue filter on right eye) + +@item argg +anaglyph red/green gray +(red filter on left eye, green filter on right eye) + +@item arcg +anaglyph red/cyan gray +(red filter on left eye, cyan filter on right eye) + +@item arch +anaglyph red/cyan half colored +(red filter on left eye, cyan filter on right eye) + +@item arcc +anaglyph red/cyan color +(red filter on left eye, cyan filter on right eye) + +@item arcd +anaglyph red/cyan color optimized with the least squares projection of dubois +(red filter on left eye, cyan filter on right eye) + +@item agmg +anaglyph green/magenta gray +(green filter on left eye, magenta filter on right eye) + +@item agmh +anaglyph green/magenta half colored +(green filter on left eye, magenta filter on right eye) + +@item agmc +anaglyph green/magenta colored +(green filter on left eye, magenta filter on right eye) + +@item agmd +anaglyph green/magenta color optimized with the least squares projection of dubois +(green filter on left eye, magenta filter on right eye) + +@item aybg +anaglyph yellow/blue gray +(yellow filter on left eye, blue filter on right eye) + +@item aybh +anaglyph yellow/blue half colored +(yellow filter on left eye, blue filter on right eye) + +@item aybc +anaglyph yellow/blue colored +(yellow filter on left eye, blue filter on right eye) + +@item aybd +anaglyph yellow/blue color optimized with the least squares projection of dubois +(yellow filter on left eye, blue filter on right eye) + +@item ml +mono output (left eye only) + +@item mr +mono output (right eye only) + +@item chl +checkerboard, left eye first + +@item chr +checkerboard, right eye first + +@item icl +interleaved columns, left eye first + +@item icr +interleaved columns, right eye first +@end table + +Default value is @samp{arcd}. +@end table + +@subsection Examples + +@itemize +@item +Convert input video from side by side parallel to anaglyph yellow/blue dubois: +@example +stereo3d=sbsl:aybd +@end example + +@item +Convert input video from above below (left eye above, right eye below) to side by side crosseye. +@example +stereo3d=abl:sbsr +@end example +@end itemize + +@section streamselect, astreamselect +Select video or audio streams. + +The filter accepts the following options: + +@table @option +@item inputs +Set number of inputs. Default is 2. + +@item map +Set input indexes to remap to outputs. +@end table + +@subsection Commands + +The @code{streamselect} and @code{astreamselect} filter supports the following +commands: + +@table @option +@item map +Set input indexes to remap to outputs. +@end table + +@subsection Examples + +@itemize +@item +Select first 5 seconds 1st stream and rest of time 2nd stream: +@example +sendcmd='5.0 streamselect map 1',streamselect=inputs=2:map=0 +@end example + +@item +Same as above, but for audio: +@example +asendcmd='5.0 astreamselect map 1',astreamselect=inputs=2:map=0 +@end example +@end itemize + +@anchor{spp} +@section spp + +Apply a simple postprocessing filter that compresses and decompresses the image +at several (or - in the case of @option{quality} level @code{6} - all) shifts +and average the results. + +The filter accepts the following options: + +@table @option +@item quality +Set quality. This option defines the number of levels for averaging. It accepts +an integer in the range 0-6. If set to @code{0}, the filter will have no +effect. A value of @code{6} means the higher quality. For each increment of +that value the speed drops by a factor of approximately 2. Default value is +@code{3}. + +@item qp +Force a constant quantization parameter. If not set, the filter will use the QP +from the video stream (if available). + +@item mode +Set thresholding mode. Available modes are: + +@table @samp +@item hard +Set hard thresholding (default). +@item soft +Set soft thresholding (better de-ringing effect, but likely blurrier). +@end table + +@item use_bframe_qp +Enable the use of the QP from the B-Frames if set to @code{1}. Using this +option may cause flicker since the B-Frames have often larger QP. Default is +@code{0} (not enabled). +@end table + +@anchor{subtitles} +@section subtitles + +Draw subtitles on top of input video using the libass library. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-libass}. This filter also requires a build with libavcodec and +libavformat to convert the passed subtitles file to ASS (Advanced Substation +Alpha) subtitles format. + +The filter accepts the following options: + +@table @option +@item filename, f +Set the filename of the subtitle file to read. It must be specified. + +@item original_size +Specify the size of the original video, the video for which the ASS file +was composed. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Due to a misdesign in ASS aspect ratio arithmetic, this is necessary to +correctly scale the fonts if the aspect ratio has been changed. + +@item fontsdir +Set a directory path containing fonts that can be used by the filter. +These fonts will be used in addition to whatever the font provider uses. + +@item charenc +Set subtitles input character encoding. @code{subtitles} filter only. Only +useful if not UTF-8. + +@item stream_index, si +Set subtitles stream index. @code{subtitles} filter only. + +@item force_style +Override default style or script info parameters of the subtitles. It accepts a +string containing ASS style format @code{KEY=VALUE} couples separated by ",". +@end table + +If the first key is not specified, it is assumed that the first value +specifies the @option{filename}. + +For example, to render the file @file{sub.srt} on top of the input +video, use the command: +@example +subtitles=sub.srt +@end example + +which is equivalent to: +@example +subtitles=filename=sub.srt +@end example + +To render the default subtitles stream from file @file{video.mkv}, use: +@example +subtitles=video.mkv +@end example + +To render the second subtitles stream from that file, use: +@example +subtitles=video.mkv:si=1 +@end example + +To make the subtitles stream from @file{sub.srt} appear in transparent green +@code{DejaVu Serif}, use: +@example +subtitles=sub.srt:force_style='FontName=DejaVu Serif,PrimaryColour=&HAA00FF00' +@end example + +@section super2xsai + +Scale the input by 2x and smooth using the Super2xSaI (Scale and +Interpolate) pixel art scaling algorithm. + +Useful for enlarging pixel art images without reducing sharpness. + +@section swaprect + +Swap two rectangular objects in video. + +This filter accepts the following options: + +@table @option +@item w +Set object width. + +@item h +Set object height. + +@item x1 +Set 1st rect x coordinate. + +@item y1 +Set 1st rect y coordinate. + +@item x2 +Set 2nd rect x coordinate. + +@item y2 +Set 2nd rect y coordinate. + +All expressions are evaluated once for each frame. +@end table + +The all options are expressions containing the following constants: + +@table @option +@item w +@item h +The input width and height. + +@item a +same as @var{w} / @var{h} + +@item sar +input sample aspect ratio + +@item dar +input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar} + +@item n +The number of the input frame, starting from 0. + +@item t +The timestamp expressed in seconds. It's NAN if the input timestamp is unknown. + +@item pos +the position in the file of the input frame, NAN if unknown +@end table + +@section swapuv +Swap U & V plane. + +@section telecine + +Apply telecine process to the video. + +This filter accepts the following options: + +@table @option +@item first_field +@table @samp +@item top, t +top field first +@item bottom, b +bottom field first +The default value is @code{top}. +@end table + +@item pattern +A string of numbers representing the pulldown pattern you wish to apply. +The default value is @code{23}. +@end table + +@example +Some typical patterns: + +NTSC output (30i): +27.5p: 32222 +24p: 23 (classic) +24p: 2332 (preferred) +20p: 33 +18p: 334 +16p: 3444 + +PAL output (25i): +27.5p: 12222 +24p: 222222222223 ("Euro pulldown") +16.67p: 33 +16p: 33333334 +@end example + +@section thumbnail +Select the most representative frame in a given sequence of consecutive frames. + +The filter accepts the following options: + +@table @option +@item n +Set the frames batch size to analyze; in a set of @var{n} frames, the filter +will pick one of them, and then handle the next batch of @var{n} frames until +the end. Default is @code{100}. +@end table + +Since the filter keeps track of the whole frames sequence, a bigger @var{n} +value will result in a higher memory usage, so a high value is not recommended. + +@subsection Examples + +@itemize +@item +Extract one picture each 50 frames: +@example +thumbnail=50 +@end example + +@item +Complete example of a thumbnail creation with @command{ffmpeg}: +@example +ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png +@end example +@end itemize + +@section tile + +Tile several successive frames together. + +The filter accepts the following options: + +@table @option + +@item layout +Set the grid size (i.e. the number of lines and columns). For the syntax of +this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +@item nb_frames +Set the maximum number of frames to render in the given area. It must be less +than or equal to @var{w}x@var{h}. The default value is @code{0}, meaning all +the area will be used. + +@item margin +Set the outer border margin in pixels. + +@item padding +Set the inner border thickness (i.e. the number of pixels between frames). For +more advanced padding options (such as having different values for the edges), +refer to the pad video filter. + +@item color +Specify the color of the unused area. For the syntax of this option, check the +"Color" section in the ffmpeg-utils manual. The default value of @var{color} +is "black". +@end table + +@subsection Examples + +@itemize +@item +Produce 8x8 PNG tiles of all keyframes (@option{-skip_frame nokey}) in a movie: +@example +ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png +@end example +The @option{-vsync 0} is necessary to prevent @command{ffmpeg} from +duplicating each output frame to accommodate the originally detected frame +rate. + +@item +Display @code{5} pictures in an area of @code{3x2} frames, +with @code{7} pixels between them, and @code{2} pixels of initial margin, using +mixed flat and named options: +@example +tile=3x2:nb_frames=5:padding=7:margin=2 +@end example +@end itemize + +@section tinterlace + +Perform various types of temporal field interlacing. + +Frames are counted starting from 1, so the first input frame is +considered odd. + +The filter accepts the following options: + +@table @option + +@item mode +Specify the mode of the interlacing. This option can also be specified +as a value alone. See below for a list of values for this option. + +Available values are: + +@table @samp +@item merge, 0 +Move odd frames into the upper field, even into the lower field, +generating a double height frame at half frame rate. +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 + +Output: +11111 33333 +22222 44444 +11111 33333 +22222 44444 +11111 33333 +22222 44444 +11111 33333 +22222 44444 +@end example + +@item drop_odd, 1 +Only output even frames, odd frames are dropped, generating a frame with +unchanged height at half frame rate. + +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 + +Output: + 22222 44444 + 22222 44444 + 22222 44444 + 22222 44444 +@end example + +@item drop_even, 2 +Only output odd frames, even frames are dropped, generating a frame with +unchanged height at half frame rate. + +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 + +Output: +11111 33333 +11111 33333 +11111 33333 +11111 33333 +@end example + +@item pad, 3 +Expand each frame to full height, but pad alternate lines with black, +generating a frame with double height at the same input frame rate. + +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 + +Output: +11111 ..... 33333 ..... +..... 22222 ..... 44444 +11111 ..... 33333 ..... +..... 22222 ..... 44444 +11111 ..... 33333 ..... +..... 22222 ..... 44444 +11111 ..... 33333 ..... +..... 22222 ..... 44444 +@end example + + +@item interleave_top, 4 +Interleave the upper field from odd frames with the lower field from +even frames, generating a frame with unchanged height at half frame rate. + +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111<- 22222 33333<- 44444 +11111 22222<- 33333 44444<- +11111<- 22222 33333<- 44444 +11111 22222<- 33333 44444<- + +Output: +11111 33333 +22222 44444 +11111 33333 +22222 44444 +@end example + + +@item interleave_bottom, 5 +Interleave the lower field from odd frames with the upper field from +even frames, generating a frame with unchanged height at half frame rate. + +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222<- 33333 44444<- +11111<- 22222 33333<- 44444 +11111 22222<- 33333 44444<- +11111<- 22222 33333<- 44444 + +Output: +22222 44444 +11111 33333 +22222 44444 +11111 33333 +@end example + + +@item interlacex2, 6 +Double frame rate with unchanged height. Frames are inserted each +containing the second temporal field from the previous input frame and +the first temporal field from the next input frame. This mode relies on +the top_field_first flag. Useful for interlaced video displays with no +field synchronisation. + +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222 33333 44444 + 11111 22222 33333 44444 +11111 22222 33333 44444 + 11111 22222 33333 44444 + +Output: +11111 22222 22222 33333 33333 44444 44444 + 11111 11111 22222 22222 33333 33333 44444 +11111 22222 22222 33333 33333 44444 44444 + 11111 11111 22222 22222 33333 33333 44444 +@end example + +@item mergex2, 7 +Move odd frames into the upper field, even into the lower field, +generating a double height frame at same frame rate. +@example + ------> time +Input: +Frame 1 Frame 2 Frame 3 Frame 4 + +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 +11111 22222 33333 44444 + +Output: +11111 33333 33333 55555 +22222 22222 44444 44444 +11111 33333 33333 55555 +22222 22222 44444 44444 +11111 33333 33333 55555 +22222 22222 44444 44444 +11111 33333 33333 55555 +22222 22222 44444 44444 +@end example + +@end table + +Numeric values are deprecated but are accepted for backward +compatibility reasons. + +Default mode is @code{merge}. + +@item flags +Specify flags influencing the filter process. + +Available value for @var{flags} is: + +@table @option +@item low_pass_filter, vlfp +Enable vertical low-pass filtering in the filter. +Vertical low-pass filtering is required when creating an interlaced +destination from a progressive source which contains high-frequency +vertical detail. Filtering will reduce interlace 'twitter' and Moire +patterning. + +Vertical low-pass filtering can only be enabled for @option{mode} +@var{interleave_top} and @var{interleave_bottom}. + +@end table +@end table + +@section transpose + +Transpose rows with columns in the input video and optionally flip it. + +It accepts the following parameters: + +@table @option + +@item dir +Specify the transposition direction. + +Can assume the following values: +@table @samp +@item 0, 4, cclock_flip +Rotate by 90 degrees counterclockwise and vertically flip (default), that is: +@example +L.R L.l +. . -> . . +l.r R.r +@end example + +@item 1, 5, clock +Rotate by 90 degrees clockwise, that is: +@example +L.R l.L +. . -> . . +l.r r.R +@end example + +@item 2, 6, cclock +Rotate by 90 degrees counterclockwise, that is: +@example +L.R R.r +. . -> . . +l.r L.l +@end example + +@item 3, 7, clock_flip +Rotate by 90 degrees clockwise and vertically flip, that is: +@example +L.R r.R +. . -> . . +l.r l.L +@end example +@end table + +For values between 4-7, the transposition is only done if the input +video geometry is portrait and not landscape. These values are +deprecated, the @code{passthrough} option should be used instead. + +Numerical values are deprecated, and should be dropped in favor of +symbolic constants. + +@item passthrough +Do not apply the transposition if the input geometry matches the one +specified by the specified value. It accepts the following values: +@table @samp +@item none +Always apply transposition. +@item portrait +Preserve portrait geometry (when @var{height} >= @var{width}). +@item landscape +Preserve landscape geometry (when @var{width} >= @var{height}). +@end table + +Default value is @code{none}. +@end table + +For example to rotate by 90 degrees clockwise and preserve portrait +layout: +@example +transpose=dir=1:passthrough=portrait +@end example + +The command above can also be specified as: +@example +transpose=1:portrait +@end example + +@section trim +Trim the input so that the output contains one continuous subpart of the input. + +It accepts the following parameters: +@table @option +@item start +Specify the time of the start of the kept section, i.e. the frame with the +timestamp @var{start} will be the first frame in the output. + +@item end +Specify the time of the first frame that will be dropped, i.e. the frame +immediately preceding the one with the timestamp @var{end} will be the last +frame in the output. + +@item start_pts +This is the same as @var{start}, except this option sets the start timestamp +in timebase units instead of seconds. + +@item end_pts +This is the same as @var{end}, except this option sets the end timestamp +in timebase units instead of seconds. + +@item duration +The maximum duration of the output in seconds. + +@item start_frame +The number of the first frame that should be passed to the output. + +@item end_frame +The number of the first frame that should be dropped. +@end table + +@option{start}, @option{end}, and @option{duration} are expressed as time +duration specifications; see +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. + +Note that the first two sets of the start/end options and the @option{duration} +option look at the frame timestamp, while the _frame variants simply count the +frames that pass through the filter. Also note that this filter does not modify +the timestamps. If you wish for the output timestamps to start at zero, insert a +setpts filter after the trim filter. + +If multiple start or end options are set, this filter tries to be greedy and +keep all the frames that match at least one of the specified constraints. To keep +only the part that matches all the constraints at once, chain multiple trim +filters. + +The defaults are such that all the input is kept. So it is possible to set e.g. +just the end values to keep everything before the specified time. + +Examples: +@itemize +@item +Drop everything except the second minute of input: +@example +ffmpeg -i INPUT -vf trim=60:120 +@end example + +@item +Keep only the first second: +@example +ffmpeg -i INPUT -vf trim=duration=1 +@end example + +@end itemize + + +@anchor{unsharp} +@section unsharp + +Sharpen or blur the input video. + +It accepts the following parameters: + +@table @option +@item luma_msize_x, lx +Set the luma matrix horizontal size. It must be an odd integer between +3 and 63. The default value is 5. + +@item luma_msize_y, ly +Set the luma matrix vertical size. It must be an odd integer between 3 +and 63. The default value is 5. + +@item luma_amount, la +Set the luma effect strength. It must be a floating point number, reasonable +values lay between -1.5 and 1.5. + +Negative values will blur the input video, while positive values will +sharpen it, a value of zero will disable the effect. + +Default value is 1.0. + +@item chroma_msize_x, cx +Set the chroma matrix horizontal size. It must be an odd integer +between 3 and 63. The default value is 5. + +@item chroma_msize_y, cy +Set the chroma matrix vertical size. It must be an odd integer +between 3 and 63. The default value is 5. + +@item chroma_amount, ca +Set the chroma effect strength. It must be a floating point number, reasonable +values lay between -1.5 and 1.5. + +Negative values will blur the input video, while positive values will +sharpen it, a value of zero will disable the effect. + +Default value is 0.0. + +@item opencl +If set to 1, specify using OpenCL capabilities, only available if +FFmpeg was configured with @code{--enable-opencl}. Default value is 0. + +@end table + +All parameters are optional and default to the equivalent of the +string '5:5:1.0:5:5:0.0'. + +@subsection Examples + +@itemize +@item +Apply strong luma sharpen effect: +@example +unsharp=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5 +@end example + +@item +Apply a strong blur of both luma and chroma parameters: +@example +unsharp=7:7:-2:7:7:-2 +@end example +@end itemize + +@section uspp + +Apply ultra slow/simple postprocessing filter that compresses and decompresses +the image at several (or - in the case of @option{quality} level @code{8} - all) +shifts and average the results. + +The way this differs from the behavior of spp is that uspp actually encodes & +decodes each case with libavcodec Snow, whereas spp uses a simplified intra only 8x8 +DCT similar to MJPEG. + +The filter accepts the following options: + +@table @option +@item quality +Set quality. This option defines the number of levels for averaging. It accepts +an integer in the range 0-8. If set to @code{0}, the filter will have no +effect. A value of @code{8} means the higher quality. For each increment of +that value the speed drops by a factor of approximately 2. Default value is +@code{3}. + +@item qp +Force a constant quantization parameter. If not set, the filter will use the QP +from the video stream (if available). +@end table + +@section vectorscope + +Display 2 color component values in the two dimensional graph (which is called +a vectorscope). + +This filter accepts the following options: + +@table @option +@item mode, m +Set vectorscope mode. + +It accepts the following values: +@table @samp +@item gray +Gray values are displayed on graph, higher brightness means more pixels have +same component color value on location in graph. This is the default mode. + +@item color +Gray values are displayed on graph. Surrounding pixels values which are not +present in video frame are drawn in gradient of 2 color components which are +set by option @code{x} and @code{y}. + +@item color2 +Actual color components values present in video frame are displayed on graph. + +@item color3 +Similar as color2 but higher frequency of same values @code{x} and @code{y} +on graph increases value of another color component, which is luminance by +default values of @code{x} and @code{y}. + +@item color4 +Actual colors present in video frame are displayed on graph. If two different +colors map to same position on graph then color with higher value of component +not present in graph is picked. +@end table + +@item x +Set which color component will be represented on X-axis. Default is @code{1}. + +@item y +Set which color component will be represented on Y-axis. Default is @code{2}. + +@item intensity, i +Set intensity, used by modes: gray, color and color3 for increasing brightness +of color component which represents frequency of (X, Y) location in graph. + +@item envelope, e +@table @samp +@item none +No envelope, this is default. + +@item instant +Instant envelope, even darkest single pixel will be clearly highlighted. + +@item peak +Hold maximum and minimum values presented in graph over time. This way you +can still spot out of range values without constantly looking at vectorscope. + +@item peak+instant +Peak and instant envelope combined together. +@end table +@end table + +@anchor{vidstabdetect} +@section vidstabdetect + +Analyze video stabilization/deshaking. Perform pass 1 of 2, see +@ref{vidstabtransform} for pass 2. + +This filter generates a file with relative translation and rotation +transform information about subsequent frames, which is then used by +the @ref{vidstabtransform} filter. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-libvidstab}. + +This filter accepts the following options: + +@table @option +@item result +Set the path to the file used to write the transforms information. +Default value is @file{transforms.trf}. + +@item shakiness +Set how shaky the video is and how quick the camera is. It accepts an +integer in the range 1-10, a value of 1 means little shakiness, a +value of 10 means strong shakiness. Default value is 5. + +@item accuracy +Set the accuracy of the detection process. It must be a value in the +range 1-15. A value of 1 means low accuracy, a value of 15 means high +accuracy. Default value is 15. + +@item stepsize +Set stepsize of the search process. The region around minimum is +scanned with 1 pixel resolution. Default value is 6. + +@item mincontrast +Set minimum contrast. Below this value a local measurement field is +discarded. Must be a floating point value in the range 0-1. Default +value is 0.3. + +@item tripod +Set reference frame number for tripod mode. + +If enabled, the motion of the frames is compared to a reference frame +in the filtered stream, identified by the specified number. The idea +is to compensate all movements in a more-or-less static scene and keep +the camera view absolutely still. + +If set to 0, it is disabled. The frames are counted starting from 1. + +@item show +Show fields and transforms in the resulting frames. It accepts an +integer in the range 0-2. Default value is 0, which disables any +visualization. +@end table + +@subsection Examples + +@itemize +@item +Use default values: +@example +vidstabdetect +@end example + +@item +Analyze strongly shaky movie and put the results in file +@file{mytransforms.trf}: +@example +vidstabdetect=shakiness=10:accuracy=15:result="mytransforms.trf" +@end example + +@item +Visualize the result of internal transformations in the resulting +video: +@example +vidstabdetect=show=1 +@end example + +@item +Analyze a video with medium shakiness using @command{ffmpeg}: +@example +ffmpeg -i input -vf vidstabdetect=shakiness=5:show=1 dummy.avi +@end example +@end itemize + +@anchor{vidstabtransform} +@section vidstabtransform + +Video stabilization/deshaking: pass 2 of 2, +see @ref{vidstabdetect} for pass 1. + +Read a file with transform information for each frame and +apply/compensate them. Together with the @ref{vidstabdetect} +filter this can be used to deshake videos. See also +@url{http://public.hronopik.de/vid.stab}. It is important to also use +the @ref{unsharp} filter, see below. + +To enable compilation of this filter you need to configure FFmpeg with +@code{--enable-libvidstab}. + +@subsection Options + +@table @option +@item input +Set path to the file used to read the transforms. Default value is +@file{transforms.trf}. + +@item smoothing +Set the number of frames (value*2 + 1) used for lowpass filtering the +camera movements. Default value is 10. + +For example a number of 10 means that 21 frames are used (10 in the +past and 10 in the future) to smoothen the motion in the video. A +larger value leads to a smoother video, but limits the acceleration of +the camera (pan/tilt movements). 0 is a special case where a static +camera is simulated. + +@item optalgo +Set the camera path optimization algorithm. + +Accepted values are: +@table @samp +@item gauss +gaussian kernel low-pass filter on camera motion (default) +@item avg +averaging on transformations +@end table + +@item maxshift +Set maximal number of pixels to translate frames. Default value is -1, +meaning no limit. + +@item maxangle +Set maximal angle in radians (degree*PI/180) to rotate frames. Default +value is -1, meaning no limit. + +@item crop +Specify how to deal with borders that may be visible due to movement +compensation. + +Available values are: +@table @samp +@item keep +keep image information from previous frame (default) +@item black +fill the border black +@end table + +@item invert +Invert transforms if set to 1. Default value is 0. + +@item relative +Consider transforms as relative to previous frame if set to 1, +absolute if set to 0. Default value is 0. + +@item zoom +Set percentage to zoom. A positive value will result in a zoom-in +effect, a negative value in a zoom-out effect. Default value is 0 (no +zoom). + +@item optzoom +Set optimal zooming to avoid borders. + +Accepted values are: +@table @samp +@item 0 +disabled +@item 1 +optimal static zoom value is determined (only very strong movements +will lead to visible borders) (default) +@item 2 +optimal adaptive zoom value is determined (no borders will be +visible), see @option{zoomspeed} +@end table + +Note that the value given at zoom is added to the one calculated here. + +@item zoomspeed +Set percent to zoom maximally each frame (enabled when +@option{optzoom} is set to 2). Range is from 0 to 5, default value is +0.25. + +@item interpol +Specify type of interpolation. + +Available values are: +@table @samp +@item no +no interpolation +@item linear +linear only horizontal +@item bilinear +linear in both directions (default) +@item bicubic +cubic in both directions (slow) +@end table + +@item tripod +Enable virtual tripod mode if set to 1, which is equivalent to +@code{relative=0:smoothing=0}. Default value is 0. + +Use also @code{tripod} option of @ref{vidstabdetect}. + +@item debug +Increase log verbosity if set to 1. Also the detected global motions +are written to the temporary file @file{global_motions.trf}. Default +value is 0. +@end table + +@subsection Examples + +@itemize +@item +Use @command{ffmpeg} for a typical stabilization with default values: +@example +ffmpeg -i inp.mpeg -vf vidstabtransform,unsharp=5:5:0.8:3:3:0.4 inp_stabilized.mpeg +@end example + +Note the use of the @ref{unsharp} filter which is always recommended. + +@item +Zoom in a bit more and load transform data from a given file: +@example +vidstabtransform=zoom=5:input="mytransforms.trf" +@end example + +@item +Smoothen the video even more: +@example +vidstabtransform=smoothing=30 +@end example +@end itemize + +@section vflip + +Flip the input video vertically. + +For example, to vertically flip a video with @command{ffmpeg}: +@example +ffmpeg -i in.avi -vf "vflip" out.avi +@end example + +@anchor{vignette} +@section vignette + +Make or reverse a natural vignetting effect. + +The filter accepts the following options: + +@table @option +@item angle, a +Set lens angle expression as a number of radians. + +The value is clipped in the @code{[0,PI/2]} range. + +Default value: @code{"PI/5"} + +@item x0 +@item y0 +Set center coordinates expressions. Respectively @code{"w/2"} and @code{"h/2"} +by default. + +@item mode +Set forward/backward mode. + +Available modes are: +@table @samp +@item forward +The larger the distance from the central point, the darker the image becomes. + +@item backward +The larger the distance from the central point, the brighter the image becomes. +This can be used to reverse a vignette effect, though there is no automatic +detection to extract the lens @option{angle} and other settings (yet). It can +also be used to create a burning effect. +@end table + +Default value is @samp{forward}. + +@item eval +Set evaluation mode for the expressions (@option{angle}, @option{x0}, @option{y0}). + +It accepts the following values: +@table @samp +@item init +Evaluate expressions only once during the filter initialization. + +@item frame +Evaluate expressions for each incoming frame. This is way slower than the +@samp{init} mode since it requires all the scalers to be re-computed, but it +allows advanced dynamic expressions. +@end table + +Default value is @samp{init}. + +@item dither +Set dithering to reduce the circular banding effects. Default is @code{1} +(enabled). + +@item aspect +Set vignette aspect. This setting allows one to adjust the shape of the vignette. +Setting this value to the SAR of the input will make a rectangular vignetting +following the dimensions of the video. + +Default is @code{1/1}. +@end table + +@subsection Expressions + +The @option{alpha}, @option{x0} and @option{y0} expressions can contain the +following parameters. + +@table @option +@item w +@item h +input width and height + +@item n +the number of input frame, starting from 0 + +@item pts +the PTS (Presentation TimeStamp) time of the filtered video frame, expressed in +@var{TB} units, NAN if undefined + +@item r +frame rate of the input video, NAN if the input frame rate is unknown + +@item t +the PTS (Presentation TimeStamp) of the filtered video frame, +expressed in seconds, NAN if undefined + +@item tb +time base of the input video +@end table + + +@subsection Examples + +@itemize +@item +Apply simple strong vignetting effect: +@example +vignette=PI/4 +@end example + +@item +Make a flickering vignetting: +@example +vignette='PI/4+random(1)*PI/50':eval=frame +@end example + +@end itemize + +@section vstack +Stack input videos vertically. + +All streams must be of same pixel format and of same width. + +Note that this filter is faster than using @ref{overlay} and @ref{pad} filter +to create same output. + +The filter accept the following option: + +@table @option +@item inputs +Set number of input streams. Default is 2. + +@item shortest +If set to 1, force the output to terminate when the shortest input +terminates. Default value is 0. +@end table + +@section w3fdif + +Deinterlace the input video ("w3fdif" stands for "Weston 3 Field +Deinterlacing Filter"). + +Based on the process described by Martin Weston for BBC R&D, and +implemented based on the de-interlace algorithm written by Jim +Easterbrook for BBC R&D, the Weston 3 field deinterlacing filter +uses filter coefficients calculated by BBC R&D. + +There are two sets of filter coefficients, so called "simple": +and "complex". Which set of filter coefficients is used can +be set by passing an optional parameter: + +@table @option +@item filter +Set the interlacing filter coefficients. Accepts one of the following values: + +@table @samp +@item simple +Simple filter coefficient set. +@item complex +More-complex filter coefficient set. +@end table +Default value is @samp{complex}. + +@item deint +Specify which frames to deinterlace. Accept one of the following values: + +@table @samp +@item all +Deinterlace all frames, +@item interlaced +Only deinterlace frames marked as interlaced. +@end table + +Default value is @samp{all}. +@end table + +@section waveform +Video waveform monitor. + +The waveform monitor plots color component intensity. By default luminance +only. Each column of the waveform corresponds to a column of pixels in the +source video. + +It accepts the following options: + +@table @option +@item mode, m +Can be either @code{row}, or @code{column}. Default is @code{column}. +In row mode, the graph on the left side represents color component value 0 and +the right side represents value = 255. In column mode, the top side represents +color component value = 0 and bottom side represents value = 255. + +@item intensity, i +Set intensity. Smaller values are useful to find out how many values of the same +luminance are distributed across input rows/columns. +Default value is @code{0.04}. Allowed range is [0, 1]. + +@item mirror, r +Set mirroring mode. @code{0} means unmirrored, @code{1} means mirrored. +In mirrored mode, higher values will be represented on the left +side for @code{row} mode and at the top for @code{column} mode. Default is +@code{1} (mirrored). + +@item display, d +Set display mode. +It accepts the following values: +@table @samp +@item overlay +Presents information identical to that in the @code{parade}, except +that the graphs representing color components are superimposed directly +over one another. + +This display mode makes it easier to spot relative differences or similarities +in overlapping areas of the color components that are supposed to be identical, +such as neutral whites, grays, or blacks. + +@item parade +Display separate graph for the color components side by side in +@code{row} mode or one below the other in @code{column} mode. + +Using this display mode makes it easy to spot color casts in the highlights +and shadows of an image, by comparing the contours of the top and the bottom +graphs of each waveform. Since whites, grays, and blacks are characterized +by exactly equal amounts of red, green, and blue, neutral areas of the picture +should display three waveforms of roughly equal width/height. If not, the +correction is easy to perform by making level adjustments the three waveforms. +@end table +Default is @code{parade}. + +@item components, c +Set which color components to display. Default is 1, which means only luminance +or red color component if input is in RGB colorspace. If is set for example to +7 it will display all 3 (if) available color components. + +@item envelope, e +@table @samp +@item none +No envelope, this is default. + +@item instant +Instant envelope, minimum and maximum values presented in graph will be easily +visible even with small @code{step} value. + +@item peak +Hold minimum and maximum values presented in graph across time. This way you +can still spot out of range values without constantly looking at waveforms. + +@item peak+instant +Peak and instant envelope combined together. +@end table + +@item filter, f +@table @samp +@item lowpass +No filtering, this is default. + +@item flat +Luma and chroma combined together. + +@item aflat +Similar as above, but shows difference between blue and red chroma. + +@item chroma +Displays only chroma. + +@item achroma +Similar as above, but shows difference between blue and red chroma. + +@item color +Displays actual color value on waveform. +@end table +@end table + +@section xbr +Apply the xBR high-quality magnification filter which is designed for pixel +art. It follows a set of edge-detection rules, see +@url{http://www.libretro.com/forums/viewtopic.php?f=6&t=134}. + +It accepts the following option: + +@table @option +@item n +Set the scaling dimension: @code{2} for @code{2xBR}, @code{3} for +@code{3xBR} and @code{4} for @code{4xBR}. +Default is @code{3}. +@end table + +@anchor{yadif} +@section yadif + +Deinterlace the input video ("yadif" means "yet another deinterlacing +filter"). + +It accepts the following parameters: + + +@table @option + +@item mode +The interlacing mode to adopt. It accepts one of the following values: + +@table @option +@item 0, send_frame +Output one frame for each frame. +@item 1, send_field +Output one frame for each field. +@item 2, send_frame_nospatial +Like @code{send_frame}, but it skips the spatial interlacing check. +@item 3, send_field_nospatial +Like @code{send_field}, but it skips the spatial interlacing check. +@end table + +The default value is @code{send_frame}. + +@item parity +The picture field parity assumed for the input interlaced video. It accepts one +of the following values: + +@table @option +@item 0, tff +Assume the top field is first. +@item 1, bff +Assume the bottom field is first. +@item -1, auto +Enable automatic detection of field parity. +@end table + +The default value is @code{auto}. +If the interlacing is unknown or the decoder does not export this information, +top field first will be assumed. + +@item deint +Specify which frames to deinterlace. Accept one of the following +values: + +@table @option +@item 0, all +Deinterlace all frames. +@item 1, interlaced +Only deinterlace frames marked as interlaced. +@end table + +The default value is @code{all}. +@end table + +@section zoompan + +Apply Zoom & Pan effect. + +This filter accepts the following options: + +@table @option +@item zoom, z +Set the zoom expression. Default is 1. + +@item x +@item y +Set the x and y expression. Default is 0. + +@item d +Set the duration expression in number of frames. +This sets for how many number of frames effect will last for +single input image. + +@item s +Set the output image size, default is 'hd720'. + +@item fps +Set the output frame rate, default is '25'. +@end table + +Each expression can contain the following constants: + +@table @option +@item in_w, iw +Input width. + +@item in_h, ih +Input height. + +@item out_w, ow +Output width. + +@item out_h, oh +Output height. + +@item in +Input frame count. + +@item on +Output frame count. + +@item x +@item y +Last calculated 'x' and 'y' position from 'x' and 'y' expression +for current input frame. + +@item px +@item py +'x' and 'y' of last output frame of previous input frame or 0 when there was +not yet such frame (first input frame). + +@item zoom +Last calculated zoom from 'z' expression for current input frame. + +@item pzoom +Last calculated zoom of last output frame of previous input frame. + +@item duration +Number of output frames for current input frame. Calculated from 'd' expression +for each input frame. + +@item pduration +number of output frames created for previous input frame + +@item a +Rational number: input width / input height + +@item sar +sample aspect ratio + +@item dar +display aspect ratio + +@end table + +@subsection Examples + +@itemize +@item +Zoom-in up to 1.5 and pan at same time to some spot near center of picture: +@example +zoompan=z='min(zoom+0.0015,1.5)':d=700:x='if(gte(zoom,1.5),x,x+1/a)':y='if(gte(zoom,1.5),y,y+1)':s=640x360 +@end example + +@item +Zoom-in up to 1.5 and pan always at center of picture: +@example +zoompan=z='min(zoom+0.0015,1.5)':d=700:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)' +@end example +@end itemize + +@section zscale +Scale (resize) the input video, using the z.lib library: +https://github.com/sekrit-twc/zimg. + +The zscale filter forces the output display aspect ratio to be the same +as the input, by changing the output sample aspect ratio. + +If the input image format is different from the format requested by +the next filter, the zscale filter will convert the input to the +requested format. + +@subsection Options +The filter accepts the following options. + +@table @option +@item width, w +@item height, h +Set the output video dimension expression. Default value is the input +dimension. + +If the @var{width} or @var{w} is 0, the input width is used for the output. +If the @var{height} or @var{h} is 0, the input height is used for the output. + +If one of the values is -1, the zscale filter will use a value that +maintains the aspect ratio of the input image, calculated from the +other specified dimension. If both of them are -1, the input size is +used + +If one of the values is -n with n > 1, the zscale filter will also use a value +that maintains the aspect ratio of the input image, calculated from the other +specified dimension. After that it will, however, make sure that the calculated +dimension is divisible by n and adjust the value if necessary. + +See below for the list of accepted constants for use in the dimension +expression. + +@item size, s +Set the video size. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +@item dither, d +Set the dither type. + +Possible values are: +@table @var +@item none +@item ordered +@item random +@item error_diffusion +@end table + +Default is none. + +@item filter, f +Set the resize filter type. + +Possible values are: +@table @var +@item point +@item bilinear +@item bicubic +@item spline16 +@item spline36 +@item lanczos +@end table + +Default is bilinear. + +@item range, r +Set the color range. + +Possible values are: +@table @var +@item input +@item limited +@item full +@end table + +Default is same as input. + +@item primaries, p +Set the color primaries. + +Possible values are: +@table @var +@item input +@item 709 +@item unspecified +@item 170m +@item 240m +@item 2020 +@end table + +Default is same as input. + +@item transfer, t +Set the transfer characteristics. + +Possible values are: +@table @var +@item input +@item 709 +@item unspecified +@item 601 +@item linear +@item 2020_10 +@item 2020_12 +@end table + +Default is same as input. + +@item matrix, m +Set the colorspace matrix. + +Possible value are: +@table @var +@item input +@item 709 +@item unspecified +@item 470bg +@item 170m +@item 2020_ncl +@item 2020_cl +@end table + +Default is same as input. + +@item rangein, rin +Set the input color range. + +Possible values are: +@table @var +@item input +@item limited +@item full +@end table + +Default is same as input. + +@item primariesin, pin +Set the input color primaries. + +Possible values are: +@table @var +@item input +@item 709 +@item unspecified +@item 170m +@item 240m +@item 2020 +@end table + +Default is same as input. + +@item transferin, tin +Set the input transfer characteristics. + +Possible values are: +@table @var +@item input +@item 709 +@item unspecified +@item 601 +@item linear +@item 2020_10 +@item 2020_12 +@end table + +Default is same as input. + +@item matrixin, min +Set the input colorspace matrix. + +Possible value are: +@table @var +@item input +@item 709 +@item unspecified +@item 470bg +@item 170m +@item 2020_ncl +@item 2020_cl +@end table +@end table + +The values of the @option{w} and @option{h} options are expressions +containing the following constants: + +@table @var +@item in_w +@item in_h +The input width and height + +@item iw +@item ih +These are the same as @var{in_w} and @var{in_h}. + +@item out_w +@item out_h +The output (scaled) width and height + +@item ow +@item oh +These are the same as @var{out_w} and @var{out_h} + +@item a +The same as @var{iw} / @var{ih} + +@item sar +input sample aspect ratio + +@item dar +The input display aspect ratio. Calculated from @code{(iw / ih) * sar}. + +@item hsub +@item vsub +horizontal and vertical input chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. + +@item ohsub +@item ovsub +horizontal and vertical output chroma subsample values. For example for the +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1. +@end table + +@table @option +@end table + +@c man end VIDEO FILTERS + +@chapter Video Sources +@c man begin VIDEO SOURCES + +Below is a description of the currently available video sources. + +@section buffer + +Buffer video frames, and make them available to the filter chain. + +This source is mainly intended for a programmatic use, in particular +through the interface defined in @file{libavfilter/vsrc_buffer.h}. + +It accepts the following parameters: + +@table @option + +@item video_size +Specify the size (width and height) of the buffered video frames. For the +syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +@item width +The input video width. + +@item height +The input video height. + +@item pix_fmt +A string representing the pixel format of the buffered video frames. +It may be a number corresponding to a pixel format, or a pixel format +name. + +@item time_base +Specify the timebase assumed by the timestamps of the buffered frames. + +@item frame_rate +Specify the frame rate expected for the video stream. + +@item pixel_aspect, sar +The sample (pixel) aspect ratio of the input video. + +@item sws_param +Specify the optional parameters to be used for the scale filter which +is automatically inserted when an input change is detected in the +input size or format. +@end table + +For example: +@example +buffer=width=320:height=240:pix_fmt=yuv410p:time_base=1/24:sar=1 +@end example + +will instruct the source to accept video frames with size 320x240 and +with format "yuv410p", assuming 1/24 as the timestamps timebase and +square pixels (1:1 sample aspect ratio). +Since the pixel format with name "yuv410p" corresponds to the number 6 +(check the enum AVPixelFormat definition in @file{libavutil/pixfmt.h}), +this example corresponds to: +@example +buffer=size=320x240:pixfmt=6:time_base=1/24:pixel_aspect=1/1 +@end example + +Alternatively, the options can be specified as a flat string, but this +syntax is deprecated: + +@var{width}:@var{height}:@var{pix_fmt}:@var{time_base.num}:@var{time_base.den}:@var{pixel_aspect.num}:@var{pixel_aspect.den}[:@var{sws_param}] + +@section cellauto + +Create a pattern generated by an elementary cellular automaton. + +The initial state of the cellular automaton can be defined through the +@option{filename}, and @option{pattern} options. If such options are +not specified an initial state is created randomly. + +At each new frame a new row in the video is filled with the result of +the cellular automaton next generation. The behavior when the whole +frame is filled is defined by the @option{scroll} option. + +This source accepts the following options: + +@table @option +@item filename, f +Read the initial cellular automaton state, i.e. the starting row, from +the specified file. +In the file, each non-whitespace character is considered an alive +cell, a newline will terminate the row, and further characters in the +file will be ignored. + +@item pattern, p +Read the initial cellular automaton state, i.e. the starting row, from +the specified string. + +Each non-whitespace character in the string is considered an alive +cell, a newline will terminate the row, and further characters in the +string will be ignored. + +@item rate, r +Set the video rate, that is the number of frames generated per second. +Default is 25. + +@item random_fill_ratio, ratio +Set the random fill ratio for the initial cellular automaton row. It +is a floating point number value ranging from 0 to 1, defaults to +1/PHI. + +This option is ignored when a file or a pattern is specified. + +@item random_seed, seed +Set the seed for filling randomly the initial row, must be an integer +included between 0 and UINT32_MAX. If not specified, or if explicitly +set to -1, the filter will try to use a good random seed on a best +effort basis. + +@item rule +Set the cellular automaton rule, it is a number ranging from 0 to 255. +Default value is 110. + +@item size, s +Set the size of the output video. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +If @option{filename} or @option{pattern} is specified, the size is set +by default to the width of the specified initial state row, and the +height is set to @var{width} * PHI. + +If @option{size} is set, it must contain the width of the specified +pattern string, and the specified pattern will be centered in the +larger row. + +If a filename or a pattern string is not specified, the size value +defaults to "320x518" (used for a randomly generated initial state). + +@item scroll +If set to 1, scroll the output upward when all the rows in the output +have been already filled. If set to 0, the new generated row will be +written over the top row just after the bottom row is filled. +Defaults to 1. + +@item start_full, full +If set to 1, completely fill the output with generated rows before +outputting the first frame. +This is the default behavior, for disabling set the value to 0. + +@item stitch +If set to 1, stitch the left and right row edges together. +This is the default behavior, for disabling set the value to 0. +@end table + +@subsection Examples + +@itemize +@item +Read the initial state from @file{pattern}, and specify an output of +size 200x400. +@example +cellauto=f=pattern:s=200x400 +@end example + +@item +Generate a random initial row with a width of 200 cells, with a fill +ratio of 2/3: +@example +cellauto=ratio=2/3:s=200x200 +@end example + +@item +Create a pattern generated by rule 18 starting by a single alive cell +centered on an initial row with width 100: +@example +cellauto=p=@@:s=100x400:full=0:rule=18 +@end example + +@item +Specify a more elaborated initial pattern: +@example +cellauto=p='@@@@ @@ @@@@':s=100x400:full=0:rule=18 +@end example + +@end itemize + +@section mandelbrot + +Generate a Mandelbrot set fractal, and progressively zoom towards the +point specified with @var{start_x} and @var{start_y}. + +This source accepts the following options: + +@table @option + +@item end_pts +Set the terminal pts value. Default value is 400. + +@item end_scale +Set the terminal scale value. +Must be a floating point value. Default value is 0.3. + +@item inner +Set the inner coloring mode, that is the algorithm used to draw the +Mandelbrot fractal internal region. + +It shall assume one of the following values: +@table @option +@item black +Set black mode. +@item convergence +Show time until convergence. +@item mincol +Set color based on point closest to the origin of the iterations. +@item period +Set period mode. +@end table + +Default value is @var{mincol}. + +@item bailout +Set the bailout value. Default value is 10.0. + +@item maxiter +Set the maximum of iterations performed by the rendering +algorithm. Default value is 7189. + +@item outer +Set outer coloring mode. +It shall assume one of following values: +@table @option +@item iteration_count +Set iteration cound mode. +@item normalized_iteration_count +set normalized iteration count mode. +@end table +Default value is @var{normalized_iteration_count}. + +@item rate, r +Set frame rate, expressed as number of frames per second. Default +value is "25". + +@item size, s +Set frame size. For the syntax of this option, check the "Video +size" section in the ffmpeg-utils manual. Default value is "640x480". + +@item start_scale +Set the initial scale value. Default value is 3.0. + +@item start_x +Set the initial x position. Must be a floating point value between +-100 and 100. Default value is -0.743643887037158704752191506114774. + +@item start_y +Set the initial y position. Must be a floating point value between +-100 and 100. Default value is -0.131825904205311970493132056385139. +@end table + +@section mptestsrc + +Generate various test patterns, as generated by the MPlayer test filter. + +The size of the generated video is fixed, and is 256x256. +This source is useful in particular for testing encoding features. + +This source accepts the following options: + +@table @option + +@item rate, r +Specify the frame rate of the sourced video, as the number of frames +generated per second. It has to be a string in the format +@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a floating point +number or a valid video frame rate abbreviation. The default value is +"25". + +@item duration, d +Set the duration of the sourced video. See +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. + +If not specified, or the expressed duration is negative, the video is +supposed to be generated forever. + +@item test, t + +Set the number or the name of the test to perform. Supported tests are: +@table @option +@item dc_luma +@item dc_chroma +@item freq_luma +@item freq_chroma +@item amp_luma +@item amp_chroma +@item cbp +@item mv +@item ring1 +@item ring2 +@item all + +@end table + +Default value is "all", which will cycle through the list of all tests. +@end table + +Some examples: +@example +mptestsrc=t=dc_luma +@end example + +will generate a "dc_luma" test pattern. + +@section frei0r_src + +Provide a frei0r source. + +To enable compilation of this filter you need to install the frei0r +header and configure FFmpeg with @code{--enable-frei0r}. + +This source accepts the following parameters: + +@table @option + +@item size +The size of the video to generate. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +@item framerate +The framerate of the generated video. It may be a string of the form +@var{num}/@var{den} or a frame rate abbreviation. + +@item filter_name +The name to the frei0r source to load. For more information regarding frei0r and +how to set the parameters, read the @ref{frei0r} section in the video filters +documentation. + +@item filter_params +A '|'-separated list of parameters to pass to the frei0r source. + +@end table + +For example, to generate a frei0r partik0l source with size 200x200 +and frame rate 10 which is overlaid on the overlay filter main input: +@example +frei0r_src=size=200x200:framerate=10:filter_name=partik0l:filter_params=1234 [overlay]; [in][overlay] overlay +@end example + +@section life + +Generate a life pattern. + +This source is based on a generalization of John Conway's life game. + +The sourced input represents a life grid, each pixel represents a cell +which can be in one of two possible states, alive or dead. Every cell +interacts with its eight neighbours, which are the cells that are +horizontally, vertically, or diagonally adjacent. + +At each interaction the grid evolves according to the adopted rule, +which specifies the number of neighbor alive cells which will make a +cell stay alive or born. The @option{rule} option allows one to specify +the rule to adopt. + +This source accepts the following options: + +@table @option +@item filename, f +Set the file from which to read the initial grid state. In the file, +each non-whitespace character is considered an alive cell, and newline +is used to delimit the end of each row. + +If this option is not specified, the initial grid is generated +randomly. + +@item rate, r +Set the video rate, that is the number of frames generated per second. +Default is 25. + +@item random_fill_ratio, ratio +Set the random fill ratio for the initial random grid. It is a +floating point number value ranging from 0 to 1, defaults to 1/PHI. +It is ignored when a file is specified. + +@item random_seed, seed +Set the seed for filling the initial random grid, must be an integer +included between 0 and UINT32_MAX. If not specified, or if explicitly +set to -1, the filter will try to use a good random seed on a best +effort basis. + +@item rule +Set the life rule. + +A rule can be specified with a code of the kind "S@var{NS}/B@var{NB}", +where @var{NS} and @var{NB} are sequences of numbers in the range 0-8, +@var{NS} specifies the number of alive neighbor cells which make a +live cell stay alive, and @var{NB} the number of alive neighbor cells +which make a dead cell to become alive (i.e. to "born"). +"s" and "b" can be used in place of "S" and "B", respectively. + +Alternatively a rule can be specified by an 18-bits integer. The 9 +high order bits are used to encode the next cell state if it is alive +for each number of neighbor alive cells, the low order bits specify +the rule for "borning" new cells. Higher order bits encode for an +higher number of neighbor cells. +For example the number 6153 = @code{(12<<9)+9} specifies a stay alive +rule of 12 and a born rule of 9, which corresponds to "S23/B03". + +Default value is "S23/B3", which is the original Conway's game of life +rule, and will keep a cell alive if it has 2 or 3 neighbor alive +cells, and will born a new cell if there are three alive cells around +a dead cell. + +@item size, s +Set the size of the output video. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. + +If @option{filename} is specified, the size is set by default to the +same size of the input file. If @option{size} is set, it must contain +the size specified in the input file, and the initial grid defined in +that file is centered in the larger resulting area. + +If a filename is not specified, the size value defaults to "320x240" +(used for a randomly generated initial grid). + +@item stitch +If set to 1, stitch the left and right grid edges together, and the +top and bottom edges also. Defaults to 1. + +@item mold +Set cell mold speed. If set, a dead cell will go from @option{death_color} to +@option{mold_color} with a step of @option{mold}. @option{mold} can have a +value from 0 to 255. + +@item life_color +Set the color of living (or new born) cells. + +@item death_color +Set the color of dead cells. If @option{mold} is set, this is the first color +used to represent a dead cell. + +@item mold_color +Set mold color, for definitely dead and moldy cells. + +For the syntax of these 3 color options, check the "Color" section in the +ffmpeg-utils manual. +@end table + +@subsection Examples + +@itemize +@item +Read a grid from @file{pattern}, and center it on a grid of size +300x300 pixels: +@example +life=f=pattern:s=300x300 +@end example + +@item +Generate a random grid of size 200x200, with a fill ratio of 2/3: +@example +life=ratio=2/3:s=200x200 +@end example + +@item +Specify a custom rule for evolving a randomly generated grid: +@example +life=rule=S14/B34 +@end example + +@item +Full example with slow death effect (mold) using @command{ffplay}: +@example +ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16 +@end example +@end itemize + +@anchor{allrgb} +@anchor{allyuv} +@anchor{color} +@anchor{haldclutsrc} +@anchor{nullsrc} +@anchor{rgbtestsrc} +@anchor{smptebars} +@anchor{smptehdbars} +@anchor{testsrc} +@section allrgb, allyuv, color, haldclutsrc, nullsrc, rgbtestsrc, smptebars, smptehdbars, testsrc + +The @code{allrgb} source returns frames of size 4096x4096 of all rgb colors. + +The @code{allyuv} source returns frames of size 4096x4096 of all yuv colors. + +The @code{color} source provides an uniformly colored input. + +The @code{haldclutsrc} source provides an identity Hald CLUT. See also +@ref{haldclut} filter. + +The @code{nullsrc} source returns unprocessed video frames. It is +mainly useful to be employed in analysis / debugging tools, or as the +source for filters which ignore the input data. + +The @code{rgbtestsrc} source generates an RGB test pattern useful for +detecting RGB vs BGR issues. You should see a red, green and blue +stripe from top to bottom. + +The @code{smptebars} source generates a color bars pattern, based on +the SMPTE Engineering Guideline EG 1-1990. + +The @code{smptehdbars} source generates a color bars pattern, based on +the SMPTE RP 219-2002. + +The @code{testsrc} source generates a test video pattern, showing a +color pattern, a scrolling gradient and a timestamp. This is mainly +intended for testing purposes. + +The sources accept the following parameters: + +@table @option + +@item color, c +Specify the color of the source, only available in the @code{color} +source. For the syntax of this option, check the "Color" section in the +ffmpeg-utils manual. + +@item level +Specify the level of the Hald CLUT, only available in the @code{haldclutsrc} +source. A level of @code{N} generates a picture of @code{N*N*N} by @code{N*N*N} +pixels to be used as identity matrix for 3D lookup tables. Each component is +coded on a @code{1/(N*N)} scale. + +@item size, s +Specify the size of the sourced video. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +The default value is @code{320x240}. + +This option is not available with the @code{haldclutsrc} filter. + +@item rate, r +Specify the frame rate of the sourced video, as the number of frames +generated per second. It has to be a string in the format +@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a floating point +number or a valid video frame rate abbreviation. The default value is +"25". + +@item sar +Set the sample aspect ratio of the sourced video. + +@item duration, d +Set the duration of the sourced video. See +@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the accepted syntax. + +If not specified, or the expressed duration is negative, the video is +supposed to be generated forever. + +@item decimals, n +Set the number of decimals to show in the timestamp, only available in the +@code{testsrc} source. + +The displayed timestamp value will correspond to the original +timestamp value multiplied by the power of 10 of the specified +value. Default value is 0. +@end table + +For example the following: +@example +testsrc=duration=5.3:size=qcif:rate=10 +@end example + +will generate a video with a duration of 5.3 seconds, with size +176x144 and a frame rate of 10 frames per second. + +The following graph description will generate a red source +with an opacity of 0.2, with size "qcif" and a frame rate of 10 +frames per second. +@example +color=c=red@@0.2:s=qcif:r=10 +@end example + +If the input content is to be ignored, @code{nullsrc} can be used. The +following command generates noise in the luminance plane by employing +the @code{geq} filter: +@example +nullsrc=s=256x256, geq=random(1)*255:128:128 +@end example + +@subsection Commands + +The @code{color} source supports the following commands: + +@table @option +@item c, color +Set the color of the created image. Accepts the same syntax of the +corresponding @option{color} option. +@end table + +@c man end VIDEO SOURCES + +@chapter Video Sinks +@c man begin VIDEO SINKS + +Below is a description of the currently available video sinks. + +@section buffersink + +Buffer video frames, and make them available to the end of the filter +graph. + +This sink is mainly intended for programmatic use, in particular +through the interface defined in @file{libavfilter/buffersink.h} +or the options system. + +It accepts a pointer to an AVBufferSinkContext structure, which +defines the incoming buffers' formats, to be passed as the opaque +parameter to @code{avfilter_init_filter} for initialization. + +@section nullsink + +Null video sink: do absolutely nothing with the input video. It is +mainly useful as a template and for use in analysis / debugging +tools. + +@c man end VIDEO SINKS + +@chapter Multimedia Filters +@c man begin MULTIMEDIA FILTERS + +Below is a description of the currently available multimedia filters. + +@section ahistogram + +Convert input audio to a video output, displaying the volume histogram. + +The filter accepts the following options: + +@table @option +@item dmode +Specify how histogram is calculated. + +It accepts the following values: +@table @samp +@item single +Use single histogram for all channels. +@item separate +Use separate histogram for each channel. +@end table +Default is @code{single}. + +@item rate, r +Set frame rate, expressed as number of frames per second. Default +value is "25". + +@item size, s +Specify the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{hd720}. + +@item scale +Set display scale. + +It accepts the following values: +@table @samp +@item log +logarithmic +@item sqrt +square root +@item cbrt +cubic root +@item lin +linear +@item rlog +reverse logarithmic +@end table +Default is @code{log}. + +@item ascale +Set amplitude scale. + +It accepts the following values: +@table @samp +@item log +logarithmic +@item lin +linear +@end table +Default is @code{log}. + +@item acount +Set how much frames to accumulate in histogram. +Defauls is 1. Setting this to -1 accumulates all frames. + +@item rheight +Set histogram ratio of window height. + +@item slide +Set sonogram sliding. + +It accepts the following values: +@table @samp +@item replace +replace old rows with new ones. +@item scroll +scroll from top to bottom. +@end table +Default is @code{replace}. +@end table + +@section aphasemeter + +Convert input audio to a video output, displaying the audio phase. + +The filter accepts the following options: + +@table @option +@item rate, r +Set the output frame rate. Default value is @code{25}. + +@item size, s +Set the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{800x400}. + +@item rc +@item gc +@item bc +Specify the red, green, blue contrast. Default values are @code{2}, +@code{7} and @code{1}. +Allowed range is @code{[0, 255]}. + +@item mpc +Set color which will be used for drawing median phase. If color is +@code{none} which is default, no median phase value will be drawn. +@end table + +The filter also exports the frame metadata @code{lavfi.aphasemeter.phase} which +represents mean phase of current audio frame. Value is in range @code{[-1, 1]}. +The @code{-1} means left and right channels are completely out of phase and +@code{1} means channels are in phase. + +@section avectorscope + +Convert input audio to a video output, representing the audio vector +scope. + +The filter is used to measure the difference between channels of stereo +audio stream. A monoaural signal, consisting of identical left and right +signal, results in straight vertical line. Any stereo separation is visible +as a deviation from this line, creating a Lissajous figure. +If the straight (or deviation from it) but horizontal line appears this +indicates that the left and right channels are out of phase. + +The filter accepts the following options: + +@table @option +@item mode, m +Set the vectorscope mode. + +Available values are: +@table @samp +@item lissajous +Lissajous rotated by 45 degrees. + +@item lissajous_xy +Same as above but not rotated. + +@item polar +Shape resembling half of circle. +@end table + +Default value is @samp{lissajous}. + +@item size, s +Set the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{400x400}. + +@item rate, r +Set the output frame rate. Default value is @code{25}. + +@item rc +@item gc +@item bc +@item ac +Specify the red, green, blue and alpha contrast. Default values are @code{40}, +@code{160}, @code{80} and @code{255}. +Allowed range is @code{[0, 255]}. + +@item rf +@item gf +@item bf +@item af +Specify the red, green, blue and alpha fade. Default values are @code{15}, +@code{10}, @code{5} and @code{5}. +Allowed range is @code{[0, 255]}. + +@item zoom +Set the zoom factor. Default value is @code{1}. Allowed range is @code{[1, 10]}. + +@item draw +Set the vectorscope drawing mode. + +Available values are: +@table @samp +@item dot +Draw dot for each sample. + +@item line +Draw line between previous and current sample. +@end table + +Default value is @samp{dot}. +@end table + +@subsection Examples + +@itemize +@item +Complete example using @command{ffplay}: +@example +ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1]; + [a] avectorscope=zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7 [out0]' +@end example +@end itemize + +@section concat + +Concatenate audio and video streams, joining them together one after the +other. + +The filter works on segments of synchronized video and audio streams. All +segments must have the same number of streams of each type, and that will +also be the number of streams at output. + +The filter accepts the following options: + +@table @option + +@item n +Set the number of segments. Default is 2. + +@item v +Set the number of output video streams, that is also the number of video +streams in each segment. Default is 1. + +@item a +Set the number of output audio streams, that is also the number of audio +streams in each segment. Default is 0. + +@item unsafe +Activate unsafe mode: do not fail if segments have a different format. + +@end table + +The filter has @var{v}+@var{a} outputs: first @var{v} video outputs, then +@var{a} audio outputs. + +There are @var{n}x(@var{v}+@var{a}) inputs: first the inputs for the first +segment, in the same order as the outputs, then the inputs for the second +segment, etc. + +Related streams do not always have exactly the same duration, for various +reasons including codec frame size or sloppy authoring. For that reason, +related synchronized streams (e.g. a video and its audio track) should be +concatenated at once. The concat filter will use the duration of the longest +stream in each segment (except the last one), and if necessary pad shorter +audio streams with silence. + +For this filter to work correctly, all segments must start at timestamp 0. + +All corresponding streams must have the same parameters in all segments; the +filtering system will automatically select a common pixel format for video +streams, and a common sample format, sample rate and channel layout for +audio streams, but other settings, such as resolution, must be converted +explicitly by the user. + +Different frame rates are acceptable but will result in variable frame rate +at output; be sure to configure the output file to handle it. + +@subsection Examples + +@itemize +@item +Concatenate an opening, an episode and an ending, all in bilingual version +(video in stream 0, audio in streams 1 and 2): +@example +ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \ + '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2] + concat=n=3:v=1:a=2 [v] [a1] [a2]' \ + -map '[v]' -map '[a1]' -map '[a2]' output.mkv +@end example + +@item +Concatenate two parts, handling audio and video separately, using the +(a)movie sources, and adjusting the resolution: +@example +movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ; +movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ; +[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa] +@end example +Note that a desync will happen at the stitch if the audio and video streams +do not have exactly the same duration in the first file. + +@end itemize + +@anchor{ebur128} +@section ebur128 + +EBU R128 scanner filter. This filter takes an audio stream as input and outputs +it unchanged. By default, it logs a message at a frequency of 10Hz with the +Momentary loudness (identified by @code{M}), Short-term loudness (@code{S}), +Integrated loudness (@code{I}) and Loudness Range (@code{LRA}). + +The filter also has a video output (see the @var{video} option) with a real +time graph to observe the loudness evolution. The graphic contains the logged +message mentioned above, so it is not printed anymore when this option is set, +unless the verbose logging is set. The main graphing area contains the +short-term loudness (3 seconds of analysis), and the gauge on the right is for +the momentary loudness (400 milliseconds). + +More information about the Loudness Recommendation EBU R128 on +@url{http://tech.ebu.ch/loudness}. + +The filter accepts the following options: + +@table @option + +@item video +Activate the video output. The audio stream is passed unchanged whether this +option is set or no. The video stream will be the first output stream if +activated. Default is @code{0}. + +@item size +Set the video size. This option is for video only. For the syntax of this +option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default and minimum resolution is @code{640x480}. + +@item meter +Set the EBU scale meter. Default is @code{9}. Common values are @code{9} and +@code{18}, respectively for EBU scale meter +9 and EBU scale meter +18. Any +other integer value between this range is allowed. + +@item metadata +Set metadata injection. If set to @code{1}, the audio input will be segmented +into 100ms output frames, each of them containing various loudness information +in metadata. All the metadata keys are prefixed with @code{lavfi.r128.}. + +Default is @code{0}. + +@item framelog +Force the frame logging level. + +Available values are: +@table @samp +@item info +information logging level +@item verbose +verbose logging level +@end table + +By default, the logging level is set to @var{info}. If the @option{video} or +the @option{metadata} options are set, it switches to @var{verbose}. + +@item peak +Set peak mode(s). + +Available modes can be cumulated (the option is a @code{flag} type). Possible +values are: +@table @samp +@item none +Disable any peak mode (default). +@item sample +Enable sample-peak mode. + +Simple peak mode looking for the higher sample value. It logs a message +for sample-peak (identified by @code{SPK}). +@item true +Enable true-peak mode. + +If enabled, the peak lookup is done on an over-sampled version of the input +stream for better peak accuracy. It logs a message for true-peak. +(identified by @code{TPK}) and true-peak per frame (identified by @code{FTPK}). +This mode requires a build with @code{libswresample}. +@end table + +@item dualmono +Treat mono input files as "dual mono". If a mono file is intended for playback +on a stereo system, its EBU R128 measurement will be perceptually incorrect. +If set to @code{true}, this option will compensate for this effect. +Multi-channel input files are not affected by this option. + +@item panlaw +Set a specific pan law to be used for the measurement of dual mono files. +This parameter is optional, and has a default value of -3.01dB. +@end table + +@subsection Examples + +@itemize +@item +Real-time graph using @command{ffplay}, with a EBU scale meter +18: +@example +ffplay -f lavfi -i "amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]" +@end example + +@item +Run an analysis with @command{ffmpeg}: +@example +ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null - +@end example +@end itemize + +@section interleave, ainterleave + +Temporally interleave frames from several inputs. + +@code{interleave} works with video inputs, @code{ainterleave} with audio. + +These filters read frames from several inputs and send the oldest +queued frame to the output. + +Input streams must have a well defined, monotonically increasing frame +timestamp values. + +In order to submit one frame to output, these filters need to enqueue +at least one frame for each input, so they cannot work in case one +input is not yet terminated and will not receive incoming frames. + +For example consider the case when one input is a @code{select} filter +which always drop input frames. The @code{interleave} filter will keep +reading from that input, but it will never be able to send new frames +to output until the input will send an end-of-stream signal. + +Also, depending on inputs synchronization, the filters will drop +frames in case one input receives more frames than the other ones, and +the queue is already filled. + +These filters accept the following options: + +@table @option +@item nb_inputs, n +Set the number of different inputs, it is 2 by default. +@end table + +@subsection Examples + +@itemize +@item +Interleave frames belonging to different streams using @command{ffmpeg}: +@example +ffmpeg -i bambi.avi -i pr0n.mkv -filter_complex "[0:v][1:v] interleave" out.avi +@end example + +@item +Add flickering blur effect: +@example +select='if(gt(random(0), 0.2), 1, 2)':n=2 [tmp], boxblur=2:2, [tmp] interleave +@end example +@end itemize + +@section perms, aperms + +Set read/write permissions for the output frames. + +These filters are mainly aimed at developers to test direct path in the +following filter in the filtergraph. + +The filters accept the following options: + +@table @option +@item mode +Select the permissions mode. + +It accepts the following values: +@table @samp +@item none +Do nothing. This is the default. +@item ro +Set all the output frames read-only. +@item rw +Set all the output frames directly writable. +@item toggle +Make the frame read-only if writable, and writable if read-only. +@item random +Set each output frame read-only or writable randomly. +@end table + +@item seed +Set the seed for the @var{random} mode, must be an integer included between +@code{0} and @code{UINT32_MAX}. If not specified, or if explicitly set to +@code{-1}, the filter will try to use a good random seed on a best effort +basis. +@end table + +Note: in case of auto-inserted filter between the permission filter and the +following one, the permission might not be received as expected in that +following filter. Inserting a @ref{format} or @ref{aformat} filter before the +perms/aperms filter can avoid this problem. + +@section realtime, arealtime + +Slow down filtering to match real time approximatively. + +These filters will pause the filtering for a variable amount of time to +match the output rate with the input timestamps. +They are similar to the @option{re} option to @code{ffmpeg}. + +They accept the following options: + +@table @option +@item limit +Time limit for the pauses. Any pause longer than that will be considered +a timestamp discontinuity and reset the timer. Default is 2 seconds. +@end table + +@section select, aselect + +Select frames to pass in output. + +This filter accepts the following options: + +@table @option + +@item expr, e +Set expression, which is evaluated for each input frame. + +If the expression is evaluated to zero, the frame is discarded. + +If the evaluation result is negative or NaN, the frame is sent to the +first output; otherwise it is sent to the output with index +@code{ceil(val)-1}, assuming that the input index starts from 0. + +For example a value of @code{1.2} corresponds to the output with index +@code{ceil(1.2)-1 = 2-1 = 1}, that is the second output. + +@item outputs, n +Set the number of outputs. The output to which to send the selected +frame is based on the result of the evaluation. Default value is 1. +@end table + +The expression can contain the following constants: + +@table @option +@item n +The (sequential) number of the filtered frame, starting from 0. + +@item selected_n +The (sequential) number of the selected frame, starting from 0. + +@item prev_selected_n +The sequential number of the last selected frame. It's NAN if undefined. + +@item TB +The timebase of the input timestamps. + +@item pts +The PTS (Presentation TimeStamp) of the filtered video frame, +expressed in @var{TB} units. It's NAN if undefined. + +@item t +The PTS of the filtered video frame, +expressed in seconds. It's NAN if undefined. + +@item prev_pts +The PTS of the previously filtered video frame. It's NAN if undefined. + +@item prev_selected_pts +The PTS of the last previously filtered video frame. It's NAN if undefined. + +@item prev_selected_t +The PTS of the last previously selected video frame. It's NAN if undefined. + +@item start_pts +The PTS of the first video frame in the video. It's NAN if undefined. + +@item start_t +The time of the first video frame in the video. It's NAN if undefined. + +@item pict_type @emph{(video only)} +The type of the filtered frame. It can assume one of the following +values: +@table @option +@item I +@item P +@item B +@item S +@item SI +@item SP +@item BI +@end table + +@item interlace_type @emph{(video only)} +The frame interlace type. It can assume one of the following values: +@table @option +@item PROGRESSIVE +The frame is progressive (not interlaced). +@item TOPFIRST +The frame is top-field-first. +@item BOTTOMFIRST +The frame is bottom-field-first. +@end table + +@item consumed_sample_n @emph{(audio only)} +the number of selected samples before the current frame + +@item samples_n @emph{(audio only)} +the number of samples in the current frame + +@item sample_rate @emph{(audio only)} +the input sample rate + +@item key +This is 1 if the filtered frame is a key-frame, 0 otherwise. + +@item pos +the position in the file of the filtered frame, -1 if the information +is not available (e.g. for synthetic video) + +@item scene @emph{(video only)} +value between 0 and 1 to indicate a new scene; a low value reflects a low +probability for the current frame to introduce a new scene, while a higher +value means the current frame is more likely to be one (see the example below) + +@item concatdec_select +The concat demuxer can select only part of a concat input file by setting an +inpoint and an outpoint, but the output packets may not be entirely contained +in the selected interval. By using this variable, it is possible to skip frames +generated by the concat demuxer which are not exactly contained in the selected +interval. + +This works by comparing the frame pts against the @var{lavf.concat.start_time} +and the @var{lavf.concat.duration} packet metadata values which are also +present in the decoded frames. + +The @var{concatdec_select} variable is -1 if the frame pts is at least +start_time and either the duration metadata is missing or the frame pts is less +than start_time + duration, 0 otherwise, and NaN if the start_time metadata is +missing. + +That basically means that an input frame is selected if its pts is within the +interval set by the concat demuxer. + +@end table + +The default value of the select expression is "1". + +@subsection Examples + +@itemize +@item +Select all frames in input: +@example +select +@end example + +The example above is the same as: +@example +select=1 +@end example + +@item +Skip all frames: +@example +select=0 +@end example + +@item +Select only I-frames: +@example +select='eq(pict_type\,I)' +@end example + +@item +Select one frame every 100: +@example +select='not(mod(n\,100))' +@end example + +@item +Select only frames contained in the 10-20 time interval: +@example +select=between(t\,10\,20) +@end example + +@item +Select only I frames contained in the 10-20 time interval: +@example +select=between(t\,10\,20)*eq(pict_type\,I) +@end example + +@item +Select frames with a minimum distance of 10 seconds: +@example +select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)' +@end example + +@item +Use aselect to select only audio frames with samples number > 100: +@example +aselect='gt(samples_n\,100)' +@end example + +@item +Create a mosaic of the first scenes: +@example +ffmpeg -i video.avi -vf select='gt(scene\,0.4)',scale=160:120,tile -frames:v 1 preview.png +@end example + +Comparing @var{scene} against a value between 0.3 and 0.5 is generally a sane +choice. + +@item +Send even and odd frames to separate outputs, and compose them: +@example +select=n=2:e='mod(n, 2)+1' [odd][even]; [odd] pad=h=2*ih [tmp]; [tmp][even] overlay=y=h +@end example + +@item +Select useful frames from an ffconcat file which is using inpoints and +outpoints but where the source files are not intra frame only. +@example +ffmpeg -copyts -vsync 0 -segment_time_metadata 1 -i input.ffconcat -vf select=concatdec_select -af aselect=concatdec_select output.avi +@end example +@end itemize + +@section sendcmd, asendcmd + +Send commands to filters in the filtergraph. + +These filters read commands to be sent to other filters in the +filtergraph. + +@code{sendcmd} must be inserted between two video filters, +@code{asendcmd} must be inserted between two audio filters, but apart +from that they act the same way. + +The specification of commands can be provided in the filter arguments +with the @var{commands} option, or in a file specified by the +@var{filename} option. + +These filters accept the following options: +@table @option +@item commands, c +Set the commands to be read and sent to the other filters. +@item filename, f +Set the filename of the commands to be read and sent to the other +filters. +@end table + +@subsection Commands syntax + +A commands description consists of a sequence of interval +specifications, comprising a list of commands to be executed when a +particular event related to that interval occurs. The occurring event +is typically the current frame time entering or leaving a given time +interval. + +An interval is specified by the following syntax: +@example +@var{START}[-@var{END}] @var{COMMANDS}; +@end example + +The time interval is specified by the @var{START} and @var{END} times. +@var{END} is optional and defaults to the maximum time. + +The current frame time is considered within the specified interval if +it is included in the interval [@var{START}, @var{END}), that is when +the time is greater or equal to @var{START} and is lesser than +@var{END}. + +@var{COMMANDS} consists of a sequence of one or more command +specifications, separated by ",", relating to that interval. The +syntax of a command specification is given by: +@example +[@var{FLAGS}] @var{TARGET} @var{COMMAND} @var{ARG} +@end example + +@var{FLAGS} is optional and specifies the type of events relating to +the time interval which enable sending the specified command, and must +be a non-null sequence of identifier flags separated by "+" or "|" and +enclosed between "[" and "]". + +The following flags are recognized: +@table @option +@item enter +The command is sent when the current frame timestamp enters the +specified interval. In other words, the command is sent when the +previous frame timestamp was not in the given interval, and the +current is. + +@item leave +The command is sent when the current frame timestamp leaves the +specified interval. In other words, the command is sent when the +previous frame timestamp was in the given interval, and the +current is not. +@end table + +If @var{FLAGS} is not specified, a default value of @code{[enter]} is +assumed. + +@var{TARGET} specifies the target of the command, usually the name of +the filter class or a specific filter instance name. + +@var{COMMAND} specifies the name of the command for the target filter. + +@var{ARG} is optional and specifies the optional list of argument for +the given @var{COMMAND}. + +Between one interval specification and another, whitespaces, or +sequences of characters starting with @code{#} until the end of line, +are ignored and can be used to annotate comments. + +A simplified BNF description of the commands specification syntax +follows: +@example +@var{COMMAND_FLAG} ::= "enter" | "leave" +@var{COMMAND_FLAGS} ::= @var{COMMAND_FLAG} [(+|"|")@var{COMMAND_FLAG}] +@var{COMMAND} ::= ["[" @var{COMMAND_FLAGS} "]"] @var{TARGET} @var{COMMAND} [@var{ARG}] +@var{COMMANDS} ::= @var{COMMAND} [,@var{COMMANDS}] +@var{INTERVAL} ::= @var{START}[-@var{END}] @var{COMMANDS} +@var{INTERVALS} ::= @var{INTERVAL}[;@var{INTERVALS}] +@end example + +@subsection Examples + +@itemize +@item +Specify audio tempo change at second 4: +@example +asendcmd=c='4.0 atempo tempo 1.5',atempo +@end example + +@item +Specify a list of drawtext and hue commands in a file. +@example +# show text in the interval 5-10 +5.0-10.0 [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=hello world', + [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text='; + +# desaturate the image in the interval 15-20 +15.0-20.0 [enter] hue s 0, + [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=nocolor', + [leave] hue s 1, + [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=color'; + +# apply an exponential saturation fade-out effect, starting from time 25 +25 [enter] hue s exp(25-t) +@end example + +A filtergraph allowing to read and process the above command list +stored in a file @file{test.cmd}, can be specified with: +@example +sendcmd=f=test.cmd,drawtext=fontfile=FreeSerif.ttf:text='',hue +@end example +@end itemize + +@anchor{setpts} +@section setpts, asetpts + +Change the PTS (presentation timestamp) of the input frames. + +@code{setpts} works on video frames, @code{asetpts} on audio frames. + +This filter accepts the following options: + +@table @option + +@item expr +The expression which is evaluated for each frame to construct its timestamp. + +@end table + +The expression is evaluated through the eval API and can contain the following +constants: + +@table @option +@item FRAME_RATE +frame rate, only defined for constant frame-rate video + +@item PTS +The presentation timestamp in input + +@item N +The count of the input frame for video or the number of consumed samples, +not including the current frame for audio, starting from 0. + +@item NB_CONSUMED_SAMPLES +The number of consumed samples, not including the current frame (only +audio) + +@item NB_SAMPLES, S +The number of samples in the current frame (only audio) + +@item SAMPLE_RATE, SR +The audio sample rate. + +@item STARTPTS +The PTS of the first frame. + +@item STARTT +the time in seconds of the first frame + +@item INTERLACED +State whether the current frame is interlaced. + +@item T +the time in seconds of the current frame + +@item POS +original position in the file of the frame, or undefined if undefined +for the current frame + +@item PREV_INPTS +The previous input PTS. + +@item PREV_INT +previous input time in seconds + +@item PREV_OUTPTS +The previous output PTS. + +@item PREV_OUTT +previous output time in seconds + +@item RTCTIME +The wallclock (RTC) time in microseconds. This is deprecated, use time(0) +instead. + +@item RTCSTART +The wallclock (RTC) time at the start of the movie in microseconds. + +@item TB +The timebase of the input timestamps. + +@end table + +@subsection Examples + +@itemize +@item +Start counting PTS from zero +@example +setpts=PTS-STARTPTS +@end example + +@item +Apply fast motion effect: +@example +setpts=0.5*PTS +@end example + +@item +Apply slow motion effect: +@example +setpts=2.0*PTS +@end example + +@item +Set fixed rate of 25 frames per second: +@example +setpts=N/(25*TB) +@end example + +@item +Set fixed rate 25 fps with some jitter: +@example +setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))' +@end example + +@item +Apply an offset of 10 seconds to the input PTS: +@example +setpts=PTS+10/TB +@end example + +@item +Generate timestamps from a "live source" and rebase onto the current timebase: +@example +setpts='(RTCTIME - RTCSTART) / (TB * 1000000)' +@end example + +@item +Generate timestamps by counting samples: +@example +asetpts=N/SR/TB +@end example + +@end itemize + +@section settb, asettb + +Set the timebase to use for the output frames timestamps. +It is mainly useful for testing timebase configuration. + +It accepts the following parameters: + +@table @option + +@item expr, tb +The expression which is evaluated into the output timebase. + +@end table + +The value for @option{tb} is an arithmetic expression representing a +rational. The expression can contain the constants "AVTB" (the default +timebase), "intb" (the input timebase) and "sr" (the sample rate, +audio only). Default value is "intb". + +@subsection Examples + +@itemize +@item +Set the timebase to 1/25: +@example +settb=expr=1/25 +@end example + +@item +Set the timebase to 1/10: +@example +settb=expr=0.1 +@end example + +@item +Set the timebase to 1001/1000: +@example +settb=1+0.001 +@end example + +@item +Set the timebase to 2*intb: +@example +settb=2*intb +@end example + +@item +Set the default timebase value: +@example +settb=AVTB +@end example +@end itemize + +@section showcqt +Convert input audio to a video output representing frequency spectrum +logarithmically using Brown-Puckette constant Q transform algorithm with +direct frequency domain coefficient calculation (but the transform itself +is not really constant Q, instead the Q factor is actually variable/clamped), +with musical tone scale, from E0 to D#10. + +The filter accepts the following options: + +@table @option +@item size, s +Specify the video size for the output. It must be even. For the syntax of this option, +check the @ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{1920x1080}. + +@item fps, rate, r +Set the output frame rate. Default value is @code{25}. + +@item bar_h +Set the bargraph height. It must be even. Default value is @code{-1} which +computes the bargraph height automatically. + +@item axis_h +Set the axis height. It must be even. Default value is @code{-1} which computes +the axis height automatically. + +@item sono_h +Set the sonogram height. It must be even. Default value is @code{-1} which +computes the sonogram height automatically. + +@item fullhd +Set the fullhd resolution. This option is deprecated, use @var{size}, @var{s} +instead. Default value is @code{1}. + +@item sono_v, volume +Specify the sonogram volume expression. It can contain variables: +@table @option +@item bar_v +the @var{bar_v} evaluated expression +@item frequency, freq, f +the frequency where it is evaluated +@item timeclamp, tc +the value of @var{timeclamp} option +@end table +and functions: +@table @option +@item a_weighting(f) +A-weighting of equal loudness +@item b_weighting(f) +B-weighting of equal loudness +@item c_weighting(f) +C-weighting of equal loudness. +@end table +Default value is @code{16}. + +@item bar_v, volume2 +Specify the bargraph volume expression. It can contain variables: +@table @option +@item sono_v +the @var{sono_v} evaluated expression +@item frequency, freq, f +the frequency where it is evaluated +@item timeclamp, tc +the value of @var{timeclamp} option +@end table +and functions: +@table @option +@item a_weighting(f) +A-weighting of equal loudness +@item b_weighting(f) +B-weighting of equal loudness +@item c_weighting(f) +C-weighting of equal loudness. +@end table +Default value is @code{sono_v}. + +@item sono_g, gamma +Specify the sonogram gamma. Lower gamma makes the spectrum more contrast, +higher gamma makes the spectrum having more range. Default value is @code{3}. +Acceptable range is @code{[1, 7]}. + +@item bar_g, gamma2 +Specify the bargraph gamma. Default value is @code{1}. Acceptable range is +@code{[1, 7]}. + +@item timeclamp, tc +Specify the transform timeclamp. At low frequency, there is trade-off between +accuracy in time domain and frequency domain. If timeclamp is lower, +event in time domain is represented more accurately (such as fast bass drum), +otherwise event in frequency domain is represented more accurately +(such as bass guitar). Acceptable range is @code{[0.1, 1]}. Default value is @code{0.17}. + +@item basefreq +Specify the transform base frequency. Default value is @code{20.01523126408007475}, +which is frequency 50 cents below E0. Acceptable range is @code{[10, 100000]}. + +@item endfreq +Specify the transform end frequency. Default value is @code{20495.59681441799654}, +which is frequency 50 cents above D#10. Acceptable range is @code{[10, 100000]}. + +@item coeffclamp +This option is deprecated and ignored. + +@item tlength +Specify the transform length in time domain. Use this option to control accuracy +trade-off between time domain and frequency domain at every frequency sample. +It can contain variables: +@table @option +@item frequency, freq, f +the frequency where it is evaluated +@item timeclamp, tc +the value of @var{timeclamp} option. +@end table +Default value is @code{384*tc/(384+tc*f)}. + +@item count +Specify the transform count for every video frame. Default value is @code{6}. +Acceptable range is @code{[1, 30]}. + +@item fcount +Specify the transform count for every single pixel. Default value is @code{0}, +which makes it computed automatically. Acceptable range is @code{[0, 10]}. + +@item fontfile +Specify font file for use with freetype to draw the axis. If not specified, +use embedded font. Note that drawing with font file or embedded font is not +implemented with custom @var{basefreq} and @var{endfreq}, use @var{axisfile} +option instead. + +@item fontcolor +Specify font color expression. This is arithmetic expression that should return +integer value 0xRRGGBB. It can contain variables: +@table @option +@item frequency, freq, f +the frequency where it is evaluated +@item timeclamp, tc +the value of @var{timeclamp} option +@end table +and functions: +@table @option +@item midi(f) +midi number of frequency f, some midi numbers: E0(16), C1(24), C2(36), A4(69) +@item r(x), g(x), b(x) +red, green, and blue value of intensity x. +@end table +Default value is @code{st(0, (midi(f)-59.5)/12); +st(1, if(between(ld(0),0,1), 0.5-0.5*cos(2*PI*ld(0)), 0)); +r(1-ld(1)) + b(ld(1))}. + +@item axisfile +Specify image file to draw the axis. This option override @var{fontfile} and +@var{fontcolor} option. + +@item axis, text +Enable/disable drawing text to the axis. If it is set to @code{0}, drawing to +the axis is disabled, ignoring @var{fontfile} and @var{axisfile} option. +Default value is @code{1}. + +@end table + +@subsection Examples + +@itemize +@item +Playing audio while showing the spectrum: +@example +ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt [out0]' +@end example + +@item +Same as above, but with frame rate 30 fps: +@example +ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt=fps=30:count=5 [out0]' +@end example + +@item +Playing at 1280x720: +@example +ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt=s=1280x720:count=4 [out0]' +@end example + +@item +Disable sonogram display: +@example +sono_h=0 +@end example + +@item +A1 and its harmonics: A1, A2, (near)E3, A3: +@example +ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t), + asplit[a][out1]; [a] showcqt [out0]' +@end example + +@item +Same as above, but with more accuracy in frequency domain: +@example +ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t), + asplit[a][out1]; [a] showcqt=timeclamp=0.5 [out0]' +@end example + +@item +Custom volume: +@example +bar_v=10:sono_v=bar_v*a_weighting(f) +@end example + +@item +Custom gamma, now spectrum is linear to the amplitude. +@example +bar_g=2:sono_g=2 +@end example + +@item +Custom tlength equation: +@example +tc=0.33:tlength='st(0,0.17); 384*tc / (384 / ld(0) + tc*f /(1-ld(0))) + 384*tc / (tc*f / ld(0) + 384 /(1-ld(0)))' +@end example + +@item +Custom fontcolor and fontfile, C-note is colored green, others are colored blue: +@example +fontcolor='if(mod(floor(midi(f)+0.5),12), 0x0000FF, g(1))':fontfile=myfont.ttf +@end example + +@item +Custom frequency range with custom axis using image file: +@example +axisfile=myaxis.png:basefreq=40:endfreq=10000 +@end example +@end itemize + +@section showfreqs + +Convert input audio to video output representing the audio power spectrum. +Audio amplitude is on Y-axis while frequency is on X-axis. + +The filter accepts the following options: + +@table @option +@item size, s +Specify size of video. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default is @code{1024x512}. + +@item mode +Set display mode. +This set how each frequency bin will be represented. + +It accepts the following values: +@table @samp +@item line +@item bar +@item dot +@end table +Default is @code{bar}. + +@item ascale +Set amplitude scale. + +It accepts the following values: +@table @samp +@item lin +Linear scale. + +@item sqrt +Square root scale. + +@item cbrt +Cubic root scale. + +@item log +Logarithmic scale. +@end table +Default is @code{log}. + +@item fscale +Set frequency scale. + +It accepts the following values: +@table @samp +@item lin +Linear scale. + +@item log +Logarithmic scale. + +@item rlog +Reverse logarithmic scale. +@end table +Default is @code{lin}. + +@item win_size +Set window size. + +It accepts the following values: +@table @samp +@item w16 +@item w32 +@item w64 +@item w128 +@item w256 +@item w512 +@item w1024 +@item w2048 +@item w4096 +@item w8192 +@item w16384 +@item w32768 +@item w65536 +@end table +Default is @code{w2048} + +@item win_func +Set windowing function. + +It accepts the following values: +@table @samp +@item rect +@item bartlett +@item hanning +@item hamming +@item blackman +@item welch +@item flattop +@item bharris +@item bnuttall +@item bhann +@item sine +@item nuttall +@item lanczos +@item gauss +@item tukey +@end table +Default is @code{hanning}. + +@item overlap +Set window overlap. In range @code{[0, 1]}. Default is @code{1}, +which means optimal overlap for selected window function will be picked. + +@item averaging +Set time averaging. Setting this to 0 will display current maximal peaks. +Default is @code{1}, which means time averaging is disabled. + +@item colors +Specify list of colors separated by space or by '|' which will be used to +draw channel frequencies. Unrecognized or missing colors will be replaced +by white color. + +@item cmode +Set channel display mode. + +It accepts the following values: +@table @samp +@item combined +@item separate +@end table +Default is @code{combined}. + +@end table + +@anchor{showspectrum} +@section showspectrum + +Convert input audio to a video output, representing the audio frequency +spectrum. + +The filter accepts the following options: + +@table @option +@item size, s +Specify the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{640x512}. + +@item slide +Specify how the spectrum should slide along the window. + +It accepts the following values: +@table @samp +@item replace +the samples start again on the left when they reach the right +@item scroll +the samples scroll from right to left +@item rscroll +the samples scroll from left to right +@item fullframe +frames are only produced when the samples reach the right +@end table + +Default value is @code{replace}. + +@item mode +Specify display mode. + +It accepts the following values: +@table @samp +@item combined +all channels are displayed in the same row +@item separate +all channels are displayed in separate rows +@end table + +Default value is @samp{combined}. + +@item color +Specify display color mode. + +It accepts the following values: +@table @samp +@item channel +each channel is displayed in a separate color +@item intensity +each channel is displayed using the same color scheme +@item rainbow +each channel is displayed using the rainbow color scheme +@item moreland +each channel is displayed using the moreland color scheme +@item nebulae +each channel is displayed using the nebulae color scheme +@item fire +each channel is displayed using the fire color scheme +@item fiery +each channel is displayed using the fiery color scheme +@item fruit +each channel is displayed using the fruit color scheme +@item cool +each channel is displayed using the cool color scheme +@end table + +Default value is @samp{channel}. + +@item scale +Specify scale used for calculating intensity color values. + +It accepts the following values: +@table @samp +@item lin +linear +@item sqrt +square root, default +@item cbrt +cubic root +@item 4thrt +4th root +@item 5thrt +5th root +@item log +logarithmic +@end table + +Default value is @samp{sqrt}. + +@item saturation +Set saturation modifier for displayed colors. Negative values provide +alternative color scheme. @code{0} is no saturation at all. +Saturation must be in [-10.0, 10.0] range. +Default value is @code{1}. + +@item win_func +Set window function. + +It accepts the following values: +@table @samp +@item rect +@item bartlett +@item hann +@item hanning +@item hamming +@item blackman +@item welch +@item flattop +@item bharris +@item bnuttall +@item bhann +@item sine +@item nuttall +@item lanczos +@item gauss +@item tukey +@end table + +Default value is @code{hann}. + +@item orientation +Set orientation of time vs frequency axis. Can be @code{vertical} or +@code{horizontal}. Default is @code{vertical}. + +@item overlap +Set ratio of overlap window. Default value is @code{0}. +When value is @code{1} overlap is set to recommended size for specific +window function currently used. + +@item gain +Set scale gain for calculating intensity color values. +Default value is @code{1}. + +@item data +Set which data to display. Can be @code{magnitude}, default or @code{phase}. +@end table + +The usage is very similar to the showwaves filter; see the examples in that +section. + +@subsection Examples + +@itemize +@item +Large window with logarithmic color scaling: +@example +showspectrum=s=1280x480:scale=log +@end example + +@item +Complete example for a colored and sliding spectrum per channel using @command{ffplay}: +@example +ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1]; + [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]' +@end example +@end itemize + +@section showspectrumpic + +Convert input audio to a single video frame, representing the audio frequency +spectrum. + +The filter accepts the following options: + +@table @option +@item size, s +Specify the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{4096x2048}. + +@item mode +Specify display mode. + +It accepts the following values: +@table @samp +@item combined +all channels are displayed in the same row +@item separate +all channels are displayed in separate rows +@end table +Default value is @samp{combined}. + +@item color +Specify display color mode. + +It accepts the following values: +@table @samp +@item channel +each channel is displayed in a separate color +@item intensity +each channel is displayed using the same color scheme +@item rainbow +each channel is displayed using the rainbow color scheme +@item moreland +each channel is displayed using the moreland color scheme +@item nebulae +each channel is displayed using the nebulae color scheme +@item fire +each channel is displayed using the fire color scheme +@item fiery +each channel is displayed using the fiery color scheme +@item fruit +each channel is displayed using the fruit color scheme +@item cool +each channel is displayed using the cool color scheme +@end table +Default value is @samp{intensity}. + +@item scale +Specify scale used for calculating intensity color values. + +It accepts the following values: +@table @samp +@item lin +linear +@item sqrt +square root, default +@item cbrt +cubic root +@item 4thrt +4th root +@item 5thrt +5th root +@item log +logarithmic +@end table +Default value is @samp{log}. + +@item saturation +Set saturation modifier for displayed colors. Negative values provide +alternative color scheme. @code{0} is no saturation at all. +Saturation must be in [-10.0, 10.0] range. +Default value is @code{1}. + +@item win_func +Set window function. + +It accepts the following values: +@table @samp +@item rect +@item bartlett +@item hann +@item hanning +@item hamming +@item blackman +@item welch +@item flattop +@item bharris +@item bnuttall +@item bhann +@item sine +@item nuttall +@item lanczos +@item gauss +@item tukey +@end table +Default value is @code{hann}. + +@item orientation +Set orientation of time vs frequency axis. Can be @code{vertical} or +@code{horizontal}. Default is @code{vertical}. + +@item gain +Set scale gain for calculating intensity color values. +Default value is @code{1}. + +@item legend +Draw time and frequency axes and legends. Default is enabled. +@end table + +@subsection Examples + +@itemize +@item +Extract an audio spectrogram of a whole audio track +in a 1024x1024 picture using @command{ffmpeg}: +@example +ffmpeg -i audio.flac -lavfi showspectrumpic=s=1024x1024 spectrogram.png +@end example +@end itemize + +@section showvolume + +Convert input audio volume to a video output. + +The filter accepts the following options: + +@table @option +@item rate, r +Set video rate. + +@item b +Set border width, allowed range is [0, 5]. Default is 1. + +@item w +Set channel width, allowed range is [80, 1080]. Default is 400. + +@item h +Set channel height, allowed range is [1, 100]. Default is 20. + +@item f +Set fade, allowed range is [0.001, 1]. Default is 0.95. + +@item c +Set volume color expression. + +The expression can use the following variables: + +@table @option +@item VOLUME +Current max volume of channel in dB. + +@item CHANNEL +Current channel number, starting from 0. +@end table + +@item t +If set, displays channel names. Default is enabled. + +@item v +If set, displays volume values. Default is enabled. +@end table + +@section showwaves + +Convert input audio to a video output, representing the samples waves. + +The filter accepts the following options: + +@table @option +@item size, s +Specify the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{600x240}. + +@item mode +Set display mode. + +Available values are: +@table @samp +@item point +Draw a point for each sample. + +@item line +Draw a vertical line for each sample. + +@item p2p +Draw a point for each sample and a line between them. + +@item cline +Draw a centered vertical line for each sample. +@end table + +Default value is @code{point}. + +@item n +Set the number of samples which are printed on the same column. A +larger value will decrease the frame rate. Must be a positive +integer. This option can be set only if the value for @var{rate} +is not explicitly specified. + +@item rate, r +Set the (approximate) output frame rate. This is done by setting the +option @var{n}. Default value is "25". + +@item split_channels +Set if channels should be drawn separately or overlap. Default value is 0. + +@item colors +Set colors separated by '|' which are going to be used for drawing of each channel. + +@item scale +Set amplitude scale. Can be linear @code{lin} or logarithmic @code{log}. +Default is linear. + +@end table + +@subsection Examples + +@itemize +@item +Output the input file audio and the corresponding video representation +at the same time: +@example +amovie=a.mp3,asplit[out0],showwaves[out1] +@end example + +@item +Create a synthetic signal and show it with showwaves, forcing a +frame rate of 30 frames per second: +@example +aevalsrc=sin(1*2*PI*t)*sin(880*2*PI*t):cos(2*PI*200*t),asplit[out0],showwaves=r=30[out1] +@end example +@end itemize + +@section showwavespic + +Convert input audio to a single video frame, representing the samples waves. + +The filter accepts the following options: + +@table @option +@item size, s +Specify the video size for the output. For the syntax of this option, check the +@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}. +Default value is @code{600x240}. + +@item split_channels +Set if channels should be drawn separately or overlap. Default value is 0. + +@item colors +Set colors separated by '|' which are going to be used for drawing of each channel. + +@item scale +Set amplitude scale. Can be linear @code{lin} or logarithmic @code{log}. +Default is linear. +@end table + +@subsection Examples + +@itemize +@item +Extract a channel split representation of the wave form of a whole audio track +in a 1024x800 picture using @command{ffmpeg}: +@example +ffmpeg -i audio.flac -lavfi showwavespic=split_channels=1:s=1024x800 waveform.png +@end example + +@item +Colorize the waveform with colorchannelmixer. This example will make +the waveform a green color approximately RGB(66,217,150). Additional +channels will be shades of this color. +@example +ffmpeg -i audio.mp3 -filter_complex "showwavespic,colorchannelmixer=rr=66/255:gg=217/255:bb=150/255" waveform.png +@end example +@end itemize + +@section spectrumsynth + +Sythesize audio from 2 input video spectrums, first input stream represents +magnitude across time and second represents phase across time. +The filter will transform from frequency domain as displayed in videos back +to time domain as presented in audio output. + +This filter is primarly created for reversing processed @ref{showspectrum} +filter outputs, but can synthesize sound from other spectrograms too. +But in such case results are going to be poor if the phase data is not +available, because in such cases phase data need to be recreated, usually +its just recreated from random noise. +For best results use gray only output (@code{channel} color mode in +@ref{showspectrum} filter) and @code{log} scale for magnitude video and +@code{lin} scale for phase video. To produce phase, for 2nd video, use +@code{data} option. Inputs videos should generally use @code{fullframe} +slide mode as that saves resources needed for decoding video. + +The filter accepts the following options: + +@table @option +@item sample_rate +Specify sample rate of output audio, the sample rate of audio from which +spectrum was generated may differ. + +@item channels +Set number of channels represented in input video spectrums. + +@item scale +Set scale which was used when generating magnitude input spectrum. +Can be @code{lin} or @code{log}. Default is @code{log}. + +@item slide +Set slide which was used when generating inputs spectrums. +Can be @code{replace}, @code{scroll}, @code{fullframe} or @code{rscroll}. +Default is @code{fullframe}. + +@item win_func +Set window function used for resynthesis. + +@item overlap +Set window overlap. In range @code{[0, 1]}. Default is @code{1}, +which means optimal overlap for selected window function will be picked. + +@item orientation +Set orientation of input videos. Can be @code{vertical} or @code{horizontal}. +Default is @code{vertical}. +@end table + +@subsection Examples + +@itemize +@item +First create magnitude and phase videos from audio, assuming audio is stereo with 44100 sample rate, +then resynthesize videos back to audio with spectrumsynth: +@example +ffmpeg -i input.flac -lavfi showspectrum=mode=separate:scale=log:overlap=0.875:color=channel:slide=fullframe:data=magnitude -an -c:v rawvideo magnitude.nut +ffmpeg -i input.flac -lavfi showspectrum=mode=separate:scale=lin:overlap=0.875:color=channel:slide=fullframe:data=phase -an -c:v rawvideo phase.nut +ffmpeg -i magnitude.nut -i phase.nut -lavfi spectrumsynth=channels=2:sample_rate=44100:win_func=hann:overlap=0.875:slide=fullframe output.flac +@end example +@end itemize + +@section split, asplit + +Split input into several identical outputs. + +@code{asplit} works with audio input, @code{split} with video. + +The filter accepts a single parameter which specifies the number of outputs. If +unspecified, it defaults to 2. + +@subsection Examples + +@itemize +@item +Create two separate outputs from the same input: +@example +[in] split [out0][out1] +@end example + +@item +To create 3 or more outputs, you need to specify the number of +outputs, like in: +@example +[in] asplit=3 [out0][out1][out2] +@end example + +@item +Create two separate outputs from the same input, one cropped and +one padded: +@example +[in] split [splitout1][splitout2]; +[splitout1] crop=100:100:0:0 [cropout]; +[splitout2] pad=200:200:100:100 [padout]; +@end example + +@item +Create 5 copies of the input audio with @command{ffmpeg}: +@example +ffmpeg -i INPUT -filter_complex asplit=5 OUTPUT +@end example +@end itemize + +@section zmq, azmq + +Receive commands sent through a libzmq client, and forward them to +filters in the filtergraph. + +@code{zmq} and @code{azmq} work as a pass-through filters. @code{zmq} +must be inserted between two video filters, @code{azmq} between two +audio filters. + +To enable these filters you need to install the libzmq library and +headers and configure FFmpeg with @code{--enable-libzmq}. + +For more information about libzmq see: +@url{http://www.zeromq.org/} + +The @code{zmq} and @code{azmq} filters work as a libzmq server, which +receives messages sent through a network interface defined by the +@option{bind_address} option. + +The received message must be in the form: +@example +@var{TARGET} @var{COMMAND} [@var{ARG}] +@end example + +@var{TARGET} specifies the target of the command, usually the name of +the filter class or a specific filter instance name. + +@var{COMMAND} specifies the name of the command for the target filter. + +@var{ARG} is optional and specifies the optional argument list for the +given @var{COMMAND}. + +Upon reception, the message is processed and the corresponding command +is injected into the filtergraph. Depending on the result, the filter +will send a reply to the client, adopting the format: +@example +@var{ERROR_CODE} @var{ERROR_REASON} +@var{MESSAGE} +@end example + +@var{MESSAGE} is optional. + +@subsection Examples + +Look at @file{tools/zmqsend} for an example of a zmq client which can +be used to send commands processed by these filters. + +Consider the following filtergraph generated by @command{ffplay} +@example +ffplay -dumpgraph 1 -f lavfi " +color=s=100x100:c=red [l]; +color=s=100x100:c=blue [r]; +nullsrc=s=200x100, zmq [bg]; +[bg][l] overlay [bg+l]; +[bg+l][r] overlay=x=100 " +@end example + +To change the color of the left side of the video, the following +command can be used: +@example +echo Parsed_color_0 c yellow | tools/zmqsend +@end example + +To change the right side: +@example +echo Parsed_color_1 c pink | tools/zmqsend +@end example + +@c man end MULTIMEDIA FILTERS + +@chapter Multimedia Sources +@c man begin MULTIMEDIA SOURCES + +Below is a description of the currently available multimedia sources. + +@section amovie + +This is the same as @ref{movie} source, except it selects an audio +stream by default. + +@anchor{movie} +@section movie + +Read audio and/or video stream(s) from a movie container. + +It accepts the following parameters: + +@table @option +@item filename +The name of the resource to read (not necessarily a file; it can also be a +device or a stream accessed through some protocol). + +@item format_name, f +Specifies the format assumed for the movie to read, and can be either +the name of a container or an input device. If not specified, the +format is guessed from @var{movie_name} or by probing. + +@item seek_point, sp +Specifies the seek point in seconds. The frames will be output +starting from this seek point. The parameter is evaluated with +@code{av_strtod}, so the numerical value may be suffixed by an IS +postfix. The default value is "0". + +@item streams, s +Specifies the streams to read. Several streams can be specified, +separated by "+". The source will then have as many outputs, in the +same order. The syntax is explained in the ``Stream specifiers'' +section in the ffmpeg manual. Two special names, "dv" and "da" specify +respectively the default (best suited) video and audio stream. Default +is "dv", or "da" if the filter is called as "amovie". + +@item stream_index, si +Specifies the index of the video stream to read. If the value is -1, +the most suitable video stream will be automatically selected. The default +value is "-1". Deprecated. If the filter is called "amovie", it will select +audio instead of video. + +@item loop +Specifies how many times to read the stream in sequence. +If the value is less than 1, the stream will be read again and again. +Default value is "1". + +Note that when the movie is looped the source timestamps are not +changed, so it will generate non monotonically increasing timestamps. +@end table + +It allows overlaying a second video on top of the main input of +a filtergraph, as shown in this graph: +@example +input -----------> deltapts0 --> overlay --> output + ^ + | +movie --> scale--> deltapts1 -------+ +@end example +@subsection Examples + +@itemize +@item +Skip 3.2 seconds from the start of the AVI file in.avi, and overlay it +on top of the input labelled "in": +@example +movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [over]; +[in] setpts=PTS-STARTPTS [main]; +[main][over] overlay=16:16 [out] +@end example + +@item +Read from a video4linux2 device, and overlay it on top of the input +labelled "in": +@example +movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [over]; +[in] setpts=PTS-STARTPTS [main]; +[main][over] overlay=16:16 [out] +@end example + +@item +Read the first video stream and the audio stream with id 0x81 from +dvd.vob; the video is connected to the pad named "video" and the audio is +connected to the pad named "audio": +@example +movie=dvd.vob:s=v:0+#0x81 [video] [audio] +@end example +@end itemize + +@c man end MULTIMEDIA SOURCES
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/formats.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/formats.texi new file mode 100644 index 0000000..617cda5 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/formats.texi
@@ -0,0 +1,249 @@ +@chapter Format Options +@c man begin 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. + +Options may be set by specifying -@var{option} @var{value} in the +FFmpeg tools, or by setting the value explicitly in the +@code{AVFormatContext} options or using the @file{libavutil/opt.h} API +for programmatic use. + +The list of supported options follows: + +@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 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. + +@item packetsize @var{integer} (@emph{output}) +Set packet size. + +@item fflags @var{flags} (@emph{input/output}) +Set format flags. + +Possible values: +@table @samp +@item ignidx +Ignore index. +@item fastseek +Enable fast, but inaccurate seeks for some formats. +@item genpts +Generate PTS. +@item nofillin +Do not fill in missing values that can be exactly calculated. +@item noparse +Disable AVParsers, this needs @code{+nofillin} too. +@item igndts +Ignore DTS. +@item discardcorrupt +Discard corrupted frames. +@item sortdts +Try to interleave output packets by DTS. +@item keepside +Do not merge side data. +@item latm +Enable RTP MP4A-LATM payload. +@item nobuffer +Reduce the latency introduced by optional buffering +@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. +@end table + +@item seek2any @var{integer} (@emph{input}) +Allow seeking to non-keyframes on demuxer level when supported if set to 1. +Default is 0. + +@item analyzeduration @var{integer} (@emph{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. + +@item cryptokey @var{hexadecimal string} (@emph{input}) +Set decryption key. + +@item indexmem @var{integer} (@emph{input}) +Set max memory used for timestamp index (per stream). + +@item rtbufsize @var{integer} (@emph{input}) +Set 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}) +Set maximum muxing or demuxing delay in microseconds. + +@item fpsprobesize @var{integer} (@emph{input}) +Set number of frames used to probe fps. + +@item audio_preload @var{integer} (@emph{output}) +Set microseconds by which audio packets should be interleaved earlier. + +@item chunk_duration @var{integer} (@emph{output}) +Set microseconds for each chunk. + +@item chunk_size @var{integer} (@emph{output}) +Set size in bytes for each chunk. + +@item err_detect, f_err_detect @var{flags} (@emph{input}) +Set error detection flags. @code{f_err_detect} is deprecated and +should be used only via the @command{ffmpeg} tool. + +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 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 max_interleave_delta @var{integer} (@emph{output}) +Set maximum buffering duration for interleaving. The duration is +expressed in microseconds, and defaults to 1000000 (1 second). + +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 +"sparse" (i.e. there are large gaps between successive packets), this +can result in excessive buffering. + +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. + +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. + +@item use_wallclock_as_timestamps @var{integer} (@emph{input}) +Use wallclock as timestamps. + +@item avoid_negative_ts @var{integer} (@emph{output}) + +Possible values: +@table @samp +@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. +@item make_zero +Shift timestamps so that the first timestamp is 0. +@item auto (default) +Enables shifting when required by the target format. +@item disabled +Disables shifting of timestamp. +@end table + +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. + +@item skip_initial_bytes @var{integer} (@emph{input}) +Set number of bytes to skip before reading header and frames if set to 1. +Default is 0. + +@item correct_ts_overflow @var{integer} (@emph{input}) +Correct single timestamp overflows if set to 1. Default is 1. + +@item flush_packets @var{integer} (@emph{output}) +Flush the underlying I/O stream after each packet. Default 1 enables it, and +has the effect of reducing the latency; 0 disables it and may slightly +increase performance in some cases. + +@item output_ts_offset @var{offset} (@emph{output}) +Set the output time offset. + +@var{offset} must be a time duration specification, +see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}. + +The offset is added by the muxer to the output timestamps. + +Specifying a positive offset means that the corresponding streams are +delayed bt the time duration specified in @var{offset}. Default value +is @code{0} (meaning that no offset is applied). + +@item format_whitelist @var{list} (@emph{input}) +"," separated List of allowed demuxers. 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 indention: +@example +ffprobe -dump_separator " + " -i ~/videos/matrixbench_mpeg2.mpg +@end example +@end table + +@c man end FORMAT OPTIONS + +@anchor{Format stream specifiers} +@section Format stream specifiers + +Format stream specifiers allow selection of one or more streams that +match specific properties. + +Possible forms of stream specifiers are: +@table @option +@item @var{stream_index} +Matches the stream with this index. + +@item @var{stream_type}[:@var{stream_index}] +@var{stream_type} is one of following: 'v' for video, 'a' for audio, +'s' for subtitle, 'd' for data, and 't' for attachments. If +@var{stream_index} is given, then it matches the stream number +@var{stream_index} of this type. Otherwise, it matches all streams of +this type. + +@item p:@var{program_id}[:@var{stream_index}] +If @var{stream_index} is given, then it matches the stream with number +@var{stream_index} in the program with the id +@var{program_id}. Otherwise, it matches all streams in the program. + +@item #@var{stream_id} +Matches the stream by a format-specific ID. +@end table + +The exact semantics of stream specifiers is defined by the +@code{avformat_match_stream_specifier()} function declared in the +@file{libavformat/avformat.h} header. + +@ifclear config-writeonly +@include demuxers.texi +@end ifclear +@ifclear config-readonly +@include muxers.texi +@end ifclear +@include metadata.texi
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/general.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/general.texi new file mode 100644 index 0000000..59ea4f4 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/general.texi
@@ -0,0 +1,1185 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle General Documentation +@titlepage +@center @titlefont{General Documentation} +@end titlepage + +@top + +@contents + +@chapter External libraries + +FFmpeg can be hooked up with a number of external libraries to add support +for more formats. None of them are used by default, their use has to be +explicitly requested by passing the appropriate flags to +@command{./configure}. + +@section OpenJPEG + +FFmpeg can use the OpenJPEG libraries for encoding/decoding J2K videos. Go to +@url{http://www.openjpeg.org/} to get the libraries and follow the installation +instructions. To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjpeg} to +@file{./configure}. + + +@section OpenCORE, VisualOn, and Fraunhofer libraries + +Spun off Google Android sources, OpenCore, VisualOn and Fraunhofer +libraries provide encoders for a number of audio codecs. + +@float NOTE +OpenCORE and VisualOn libraries are under the Apache License 2.0 +(see @url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is +incompatible to the LGPL version 2.1 and GPL version 2. You have to +upgrade FFmpeg's license to LGPL version 3 (or if you have enabled +GPL components, GPL version 3) by passing @code{--enable-version3} to configure in +order to use it. + +The Fraunhofer AAC library is licensed under a license incompatible to the GPL +and is not known to be compatible to the LGPL. Therefore, you have to pass +@code{--enable-nonfree} to configure to use it. +@end float + +@subsection OpenCORE AMR + +FFmpeg can make use of the OpenCORE libraries for AMR-NB +decoding/encoding and AMR-WB decoding. + +Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the +instructions for installing the libraries. +Then pass @code{--enable-libopencore-amrnb} and/or +@code{--enable-libopencore-amrwb} to configure to enable them. + +@subsection VisualOn AMR-WB encoder library + +FFmpeg can make use of the VisualOn AMR-WBenc library for AMR-WB encoding. + +Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the +instructions for installing the library. +Then pass @code{--enable-libvo-amrwbenc} to configure to enable it. + +@subsection Fraunhofer AAC library + +FFmpeg can make use of the Fraunhofer AAC library for AAC encoding. + +Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the +instructions for installing the library. +Then pass @code{--enable-libfdk-aac} to configure to enable it. + +@section LAME + +FFmpeg can make use of the LAME library for MP3 encoding. + +Go to @url{http://lame.sourceforge.net/} and follow the +instructions for installing the library. +Then pass @code{--enable-libmp3lame} to configure to enable it. + +@section TwoLAME + +FFmpeg can make use of the TwoLAME library for MP2 encoding. + +Go to @url{http://www.twolame.org/} and follow the +instructions for installing the library. +Then pass @code{--enable-libtwolame} to configure to enable it. + +@section libvpx + +FFmpeg can make use of the libvpx library for VP8/VP9 encoding. + +Go to @url{http://www.webmproject.org/} and follow the instructions for +installing the library. Then pass @code{--enable-libvpx} to configure to +enable it. + +@section libwavpack + +FFmpeg can make use of the libwavpack library for WavPack encoding. + +Go to @url{http://www.wavpack.com/} and follow the instructions for +installing the library. Then pass @code{--enable-libwavpack} to configure to +enable it. + +@section OpenH264 + +FFmpeg can make use of the OpenH264 library for H.264 encoding. + +Go to @url{http://www.openh264.org/} and follow the instructions for +installing the library. Then pass @code{--enable-libopenh264} to configure to +enable it. + +@section x264 + +FFmpeg can make use of the x264 library for H.264 encoding. + +Go to @url{http://www.videolan.org/developers/x264.html} and follow the +instructions for installing the library. Then pass @code{--enable-libx264} to +configure to enable it. + +@float NOTE +x264 is under the GNU Public License Version 2 or later +(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for +details), you must upgrade FFmpeg's license to GPL in order to use it. +@end float + +@section x265 + +FFmpeg can make use of the x265 library for HEVC encoding. + +Go to @url{http://x265.org/developers.html} and follow the instructions +for installing the library. Then pass @code{--enable-libx265} to configure +to enable it. + +@float NOTE +x265 is under the GNU Public License Version 2 or later +(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for +details), you must upgrade FFmpeg's license to GPL in order to use it. +@end float + +@section kvazaar + +FFmpeg can make use of the kvazaar library for HEVC encoding. + +Go to @url{https://github.com/ultravideo/kvazaar} and follow the +instructions for installing the library. Then pass +@code{--enable-libkvazaar} to configure to enable it. + +@section libilbc + +iLBC is a narrowband speech codec that has been made freely available +by Google as part of the WebRTC project. libilbc is a packaging friendly +copy of the iLBC codec. FFmpeg can make use of the libilbc library for +iLBC encoding and decoding. + +Go to @url{https://github.com/TimothyGu/libilbc} and follow the instructions for +installing the library. Then pass @code{--enable-libilbc} to configure to +enable it. + +@section libzvbi + +libzvbi is a VBI decoding library which can be used by FFmpeg to decode DVB +teletext pages and DVB teletext subtitles. + +Go to @url{http://sourceforge.net/projects/zapping/} and follow the instructions for +installing the library. Then pass @code{--enable-libzvbi} to configure to +enable it. + +@section AviSynth + +FFmpeg can read AviSynth scripts as input. To enable support, pass +@code{--enable-avisynth} to configure. The correct headers are +included in compat/avisynth/, which allows the user to enable support +without needing to search for these headers themselves. + +For Windows, supported AviSynth variants are +@url{http://avisynth.nl, AviSynth 2.6 RC1 or higher} for 32-bit builds and +@url{http://avs-plus.net, AviSynth+ r1718 or higher} for 32-bit and 64-bit builds. + +For Linux and OS X, the supported AviSynth variant is +@url{https://github.com/avxsynth/avxsynth, AvxSynth}. + +@float NOTE +AviSynth and AvxSynth are loaded dynamically. Distributors can build FFmpeg +with @code{--enable-avisynth}, and the binaries will work regardless of the +end user having AviSynth or AvxSynth installed - they'll only need to be +installed to use AviSynth scripts (obviously). +@end float + +@section Intel QuickSync Video + +FFmpeg can use Intel QuickSync Video (QSV) for accelerated encoding and decoding +of multiple codecs. To use QSV, FFmpeg must be linked against the @code{libmfx} +dispatcher, which loads the actual decoding libraries. + +The dispatcher is open source and can be downloaded from +@url{https://github.com/lu-zero/mfx_dispatch.git}. FFmpeg needs to be configured +with the @code{--enable-libmfx} option and @code{pkg-config} needs to be able to +locate the dispatcher's @code{.pc} files. + + +@chapter Supported File Formats, Codecs or Features + +You can use the @code{-formats} and @code{-codecs} options to have an exhaustive list. + +@section File Formats + +FFmpeg supports the following file formats through the @code{libavformat} +library: + +@multitable @columnfractions .4 .1 .1 .4 +@item Name @tab Encoding @tab Decoding @tab Comments +@item 3dostr @tab @tab X +@item 4xm @tab @tab X + @tab 4X Technologies format, used in some games. +@item 8088flex TMV @tab @tab X +@item AAX @tab @tab X + @tab Audible Enhanced Audio format, used in audiobooks. +@item AA @tab @tab X + @tab Audible Format 2, 3, and 4, used in audiobooks. +@item ACT Voice @tab @tab X + @tab contains G.729 audio +@item Adobe Filmstrip @tab X @tab X +@item Audio IFF (AIFF) @tab X @tab X +@item American Laser Games MM @tab @tab X + @tab Multimedia format used in games like Mad Dog McCree. +@item 3GPP AMR @tab X @tab X +@item Amazing Studio Packed Animation File @tab @tab X + @tab Multimedia format used in game Heart Of Darkness. +@item Apple HTTP Live Streaming @tab @tab X +@item Artworx Data Format @tab @tab X +@item Interplay ACM @tab @tab X + @tab Audio only format used in some Interplay games. +@item ADP @tab @tab X + @tab Audio format used on the Nintendo Gamecube. +@item AFC @tab @tab X + @tab Audio format used on the Nintendo Gamecube. +@item ADS/SS2 @tab @tab X + @tab Audio format used on the PS2. +@item APNG @tab X @tab X +@item ASF @tab X @tab X +@item AST @tab X @tab X + @tab Audio format used on the Nintendo Wii. +@item AVI @tab X @tab X +@item AviSynth @tab @tab X +@item AVR @tab @tab X + @tab Audio format used on Mac. +@item AVS @tab @tab X + @tab Multimedia format used by the Creature Shock game. +@item Beam Software SIFF @tab @tab X + @tab Audio and video format used in some games by Beam Software. +@item Bethesda Softworks VID @tab @tab X + @tab Used in some games from Bethesda Softworks. +@item Binary text @tab @tab X +@item Bink @tab @tab X + @tab Multimedia format used by many games. +@item Bitmap Brothers JV @tab @tab X + @tab Used in Z and Z95 games. +@item Brute Force & Ignorance @tab @tab X + @tab Used in the game Flash Traffic: City of Angels. +@item BFSTM @tab @tab X + @tab Audio format used on the Nintendo WiiU (based on BRSTM). +@item BRSTM @tab @tab X + @tab Audio format used on the Nintendo Wii. +@item BWF @tab X @tab X +@item CRI ADX @tab X @tab X + @tab Audio-only format used in console video games. +@item Discworld II BMV @tab @tab X +@item Interplay C93 @tab @tab X + @tab Used in the game Cyberia from Interplay. +@item Delphine Software International CIN @tab @tab X + @tab Multimedia format used by Delphine Software games. +@item Digital Speech Standard (DSS) @tab @tab X +@item Canopus HQ @tab @tab X +@item Canopus HQA @tab @tab X +@item Canopus HQX @tab @tab X +@item CD+G @tab @tab X + @tab Video format used by CD+G karaoke disks +@item Phantom Cine @tab @tab X +@item Cineform HD @tab @tab X +@item Commodore CDXL @tab @tab X + @tab Amiga CD video format +@item Core Audio Format @tab X @tab X + @tab Apple Core Audio Format +@item CRC testing format @tab X @tab +@item Creative Voice @tab X @tab X + @tab Created for the Sound Blaster Pro. +@item CRYO APC @tab @tab X + @tab Audio format used in some games by CRYO Interactive Entertainment. +@item D-Cinema audio @tab X @tab X +@item Deluxe Paint Animation @tab @tab X +@item DCSTR @tab @tab X +@item DFA @tab @tab X + @tab This format is used in Chronomaster game +@item DirectDraw Surface @tab @tab X +@item DSD Stream File (DSF) @tab @tab X +@item DV video @tab X @tab X +@item DXA @tab @tab X + @tab This format is used in the non-Windows version of the Feeble Files + game and different game cutscenes repacked for use with ScummVM. +@item Electronic Arts cdata @tab @tab X +@item Electronic Arts Multimedia @tab @tab X + @tab Used in various EA games; files have extensions like WVE and UV2. +@item Ensoniq Paris Audio File @tab @tab X +@item FFM (FFserver live feed) @tab X @tab X +@item Flash (SWF) @tab X @tab X +@item Flash 9 (AVM2) @tab X @tab X + @tab Only embedded audio is decoded. +@item FLI/FLC/FLX animation @tab @tab X + @tab .fli/.flc files +@item Flash Video (FLV) @tab X @tab X + @tab Macromedia Flash video files +@item framecrc testing format @tab X @tab +@item FunCom ISS @tab @tab X + @tab Audio format used in various games from FunCom like The Longest Journey. +@item G.723.1 @tab X @tab X +@item G.729 BIT @tab X @tab X +@item G.729 raw @tab @tab X +@item GENH @tab @tab X + @tab Audio format for various games. +@item GIF Animation @tab X @tab X +@item GXF @tab X @tab X + @tab General eXchange Format SMPTE 360M, used by Thomson Grass Valley + playout servers. +@item HNM @tab @tab X + @tab Only version 4 supported, used in some games from Cryo Interactive +@item iCEDraw File @tab @tab X +@item ICO @tab X @tab X + @tab Microsoft Windows ICO +@item id Quake II CIN video @tab @tab X +@item id RoQ @tab X @tab X + @tab Used in Quake III, Jedi Knight 2 and other computer games. +@item IEC61937 encapsulation @tab X @tab X +@item IFF @tab @tab X + @tab Interchange File Format +@item iLBC @tab X @tab X +@item Interplay MVE @tab @tab X + @tab Format used in various Interplay computer games. +@item IV8 @tab @tab X + @tab A format generated by IndigoVision 8000 video server. +@item IVF (On2) @tab X @tab X + @tab A format used by libvpx +@item Internet Video Recording @tab @tab X +@item IRCAM @tab X @tab X +@item LATM @tab X @tab X +@item LMLM4 @tab @tab X + @tab Used by Linux Media Labs MPEG-4 PCI boards +@item LOAS @tab @tab X + @tab contains LATM multiplexed AAC audio +@item LRC @tab X @tab X +@item LVF @tab @tab X +@item LXF @tab @tab X + @tab VR native stream format, used by Leitch/Harris' video servers. +@item Magic Lantern Video (MLV) @tab @tab X +@item Matroska @tab X @tab X +@item Matroska audio @tab X @tab +@item FFmpeg metadata @tab X @tab X + @tab Metadata in text format. +@item MAXIS XA @tab @tab X + @tab Used in Sim City 3000; file extension .xa. +@item MD Studio @tab @tab X +@item Metal Gear Solid: The Twin Snakes @tab @tab X +@item Megalux Frame @tab @tab X + @tab Used by Megalux Ultimate Paint +@item Mobotix .mxg @tab @tab X +@item Monkey's Audio @tab @tab X +@item Motion Pixels MVI @tab @tab X +@item MOV/QuickTime/MP4 @tab X @tab X + @tab 3GP, 3GP2, PSP, iPod variants supported +@item MP2 @tab X @tab X +@item MP3 @tab X @tab X +@item MPEG-1 System @tab X @tab X + @tab muxed audio and video, VCD format supported +@item MPEG-PS (program stream) @tab X @tab X + @tab also known as @code{VOB} file, SVCD and DVD format supported +@item MPEG-TS (transport stream) @tab X @tab X + @tab also known as DVB Transport Stream +@item MPEG-4 @tab X @tab X + @tab MPEG-4 is a variant of QuickTime. +@item MSF @tab @tab X + @tab Audio format used on the PS3. +@item Mirillis FIC video @tab @tab X + @tab No cursor rendering. +@item MIME multipart JPEG @tab X @tab +@item MSN TCP webcam @tab @tab X + @tab Used by MSN Messenger webcam streams. +@item MTV @tab @tab X +@item Musepack @tab @tab X +@item Musepack SV8 @tab @tab X +@item Material eXchange Format (MXF) @tab X @tab X + @tab SMPTE 377M, used by D-Cinema, broadcast industry. +@item Material eXchange Format (MXF), D-10 Mapping @tab X @tab X + @tab SMPTE 386M, D-10/IMX Mapping. +@item NC camera feed @tab @tab X + @tab NC (AVIP NC4600) camera streams +@item NIST SPeech HEader REsources @tab @tab X +@item NTT TwinVQ (VQF) @tab @tab X + @tab Nippon Telegraph and Telephone Corporation TwinVQ. +@item Nullsoft Streaming Video @tab @tab X +@item NuppelVideo @tab @tab X +@item NUT @tab X @tab X + @tab NUT Open Container Format +@item Ogg @tab X @tab X +@item Playstation Portable PMP @tab @tab X +@item Portable Voice Format @tab @tab X +@item TechnoTrend PVA @tab @tab X + @tab Used by TechnoTrend DVB PCI boards. +@item QCP @tab @tab X +@item raw ADTS (AAC) @tab X @tab X +@item raw AC-3 @tab X @tab X +@item raw Chinese AVS video @tab X @tab X +@item raw CRI ADX @tab X @tab X +@item raw Dirac @tab X @tab X +@item raw DNxHD @tab X @tab X +@item raw DTS @tab X @tab X +@item raw DTS-HD @tab @tab X +@item raw E-AC-3 @tab X @tab X +@item raw FLAC @tab X @tab X +@item raw GSM @tab @tab X +@item raw H.261 @tab X @tab X +@item raw H.263 @tab X @tab X +@item raw H.264 @tab X @tab X +@item raw HEVC @tab X @tab X +@item raw Ingenient MJPEG @tab @tab X +@item raw MJPEG @tab X @tab X +@item raw MLP @tab @tab X +@item raw MPEG @tab @tab X +@item raw MPEG-1 @tab @tab X +@item raw MPEG-2 @tab @tab X +@item raw MPEG-4 @tab X @tab X +@item raw NULL @tab X @tab +@item raw video @tab X @tab X +@item raw id RoQ @tab X @tab +@item raw Shorten @tab @tab X +@item raw TAK @tab @tab X +@item raw TrueHD @tab X @tab X +@item raw VC-1 @tab X @tab X +@item raw PCM A-law @tab X @tab X +@item raw PCM mu-law @tab X @tab X +@item raw PCM signed 8 bit @tab X @tab X +@item raw PCM signed 16 bit big-endian @tab X @tab X +@item raw PCM signed 16 bit little-endian @tab X @tab X +@item raw PCM signed 24 bit big-endian @tab X @tab X +@item raw PCM signed 24 bit little-endian @tab X @tab X +@item raw PCM signed 32 bit big-endian @tab X @tab X +@item raw PCM signed 32 bit little-endian @tab X @tab X +@item raw PCM unsigned 8 bit @tab X @tab X +@item raw PCM unsigned 16 bit big-endian @tab X @tab X +@item raw PCM unsigned 16 bit little-endian @tab X @tab X +@item raw PCM unsigned 24 bit big-endian @tab X @tab X +@item raw PCM unsigned 24 bit little-endian @tab X @tab X +@item raw PCM unsigned 32 bit big-endian @tab X @tab X +@item raw PCM unsigned 32 bit little-endian @tab X @tab X +@item raw PCM floating-point 32 bit big-endian @tab X @tab X +@item raw PCM floating-point 32 bit little-endian @tab X @tab X +@item raw PCM floating-point 64 bit big-endian @tab X @tab X +@item raw PCM floating-point 64 bit little-endian @tab X @tab X +@item RDT @tab @tab X +@item REDCODE R3D @tab @tab X + @tab File format used by RED Digital cameras, contains JPEG 2000 frames and PCM audio. +@item RealMedia @tab X @tab X +@item Redirector @tab @tab X +@item RedSpark @tab @tab X +@item Renderware TeXture Dictionary @tab @tab X +@item Resolume DXV @tab @tab X +@item RL2 @tab @tab X + @tab Audio and video format used in some games by Entertainment Software Partners. +@item RPL/ARMovie @tab @tab X +@item Lego Mindstorms RSO @tab X @tab X +@item RSD @tab @tab X +@item RTMP @tab X @tab X + @tab Output is performed by publishing stream to RTMP server +@item RTP @tab X @tab X +@item RTSP @tab X @tab X +@item SAP @tab X @tab X +@item SBG @tab @tab X +@item SDP @tab @tab X +@item Sega FILM/CPK @tab @tab X + @tab Used in many Sega Saturn console games. +@item Silicon Graphics Movie @tab @tab X +@item Sierra SOL @tab @tab X + @tab .sol files used in Sierra Online games. +@item Sierra VMD @tab @tab X + @tab Used in Sierra CD-ROM games. +@item Smacker @tab @tab X + @tab Multimedia format used by many games. +@item SMJPEG @tab X @tab X + @tab Used in certain Loki game ports. +@item Smush @tab @tab X + @tab Multimedia format used in some LucasArts games. +@item Sony OpenMG (OMA) @tab X @tab X + @tab Audio format used in Sony Sonic Stage and Sony Vegas. +@item Sony PlayStation STR @tab @tab X +@item Sony Wave64 (W64) @tab X @tab X +@item SoX native format @tab X @tab X +@item SUN AU format @tab X @tab X +@item SUP raw PGS subtitles @tab @tab X +@item SVAG @tab @tab X + @tab Audio format used in Konami PS2 games. +@item TDSC @tab @tab X +@item Text files @tab @tab X +@item THP @tab @tab X + @tab Used on the Nintendo GameCube. +@item Tiertex Limited SEQ @tab @tab X + @tab Tiertex .seq files used in the DOS CD-ROM version of the game Flashback. +@item True Audio @tab @tab X +@item VAG @tab @tab X + @tab Audio format used in many Sony PS2 games. +@item VC-1 test bitstream @tab X @tab X +@item Vidvox Hap @tab X @tab X +@item Vivo @tab @tab X +@item VPK @tab @tab X + @tab Audio format used in Sony PS games. +@item WAV @tab X @tab X +@item WavPack @tab X @tab X +@item WebM @tab X @tab X +@item Windows Televison (WTV) @tab X @tab X +@item Wing Commander III movie @tab @tab X + @tab Multimedia format used in Origin's Wing Commander III computer game. +@item Westwood Studios audio @tab @tab X + @tab Multimedia format used in Westwood Studios games. +@item Westwood Studios VQA @tab @tab X + @tab Multimedia format used in Westwood Studios games. +@item WVE @tab @tab X +@item XMV @tab @tab X + @tab Microsoft video container used in Xbox games. +@item XVAG @tab @tab X + @tab Audio format used on the PS3. +@item xWMA @tab @tab X + @tab Microsoft audio container used by XAudio 2. +@item eXtended BINary text (XBIN) @tab @tab X +@item YUV4MPEG pipe @tab X @tab X +@item Psygnosis YOP @tab @tab X +@end multitable + +@code{X} means that encoding (resp. decoding) is supported. + +@section Image Formats + +FFmpeg can read and write images for each frame of a video sequence. The +following image formats are supported: + +@multitable @columnfractions .4 .1 .1 .4 +@item Name @tab Encoding @tab Decoding @tab Comments +@item .Y.U.V @tab X @tab X + @tab one raw file per component +@item Alias PIX @tab X @tab X + @tab Alias/Wavefront PIX image format +@item animated GIF @tab X @tab X +@item APNG @tab X @tab X +@item BMP @tab X @tab X + @tab Microsoft BMP image +@item BRender PIX @tab @tab X + @tab Argonaut BRender 3D engine image format. +@item DPX @tab X @tab X + @tab Digital Picture Exchange +@item EXR @tab @tab X + @tab OpenEXR +@item JPEG @tab X @tab X + @tab Progressive JPEG is not supported. +@item JPEG 2000 @tab X @tab X +@item JPEG-LS @tab X @tab X +@item LJPEG @tab X @tab + @tab Lossless JPEG +@item PAM @tab X @tab X + @tab PAM is a PNM extension with alpha support. +@item PBM @tab X @tab X + @tab Portable BitMap image +@item PCX @tab X @tab X + @tab PC Paintbrush +@item PGM @tab X @tab X + @tab Portable GrayMap image +@item PGMYUV @tab X @tab X + @tab PGM with U and V components in YUV 4:2:0 +@item PIC @tab @tab X + @tab Pictor/PC Paint +@item PNG @tab X @tab X +@item PPM @tab X @tab X + @tab Portable PixelMap image +@item PTX @tab @tab X + @tab V.Flash PTX format +@item SGI @tab X @tab X + @tab SGI RGB image format +@item Sun Rasterfile @tab X @tab X + @tab Sun RAS image format +@item TIFF @tab X @tab X + @tab YUV, JPEG and some extension is not supported yet. +@item Truevision Targa @tab X @tab X + @tab Targa (.TGA) image format +@item WebP @tab E @tab X + @tab WebP image format, encoding supported through external library libwebp +@item XBM @tab X @tab X + @tab X BitMap image format +@item XFace @tab X @tab X + @tab X-Face image format +@item XWD @tab X @tab X + @tab X Window Dump image format +@end multitable + +@code{X} means that encoding (resp. decoding) is supported. + +@code{E} means that support is provided through an external library. + +@section Video Codecs + +@multitable @columnfractions .4 .1 .1 .4 +@item Name @tab Encoding @tab Decoding @tab Comments +@item 4X Movie @tab @tab X + @tab Used in certain computer games. +@item 8088flex TMV @tab @tab X +@item A64 multicolor @tab X @tab + @tab Creates video suitable to be played on a commodore 64 (multicolor mode). +@item Amazing Studio PAF Video @tab @tab X +@item American Laser Games MM @tab @tab X + @tab Used in games like Mad Dog McCree. +@item AMV Video @tab X @tab X + @tab Used in Chinese MP3 players. +@item ANSI/ASCII art @tab @tab X +@item Apple Intermediate Codec @tab @tab X +@item Apple MJPEG-B @tab @tab X +@item Apple ProRes @tab X @tab X +@item Apple QuickDraw @tab @tab X + @tab fourcc: qdrw +@item Asus v1 @tab X @tab X + @tab fourcc: ASV1 +@item Asus v2 @tab X @tab X + @tab fourcc: ASV2 +@item ATI VCR1 @tab @tab X + @tab fourcc: VCR1 +@item ATI VCR2 @tab @tab X + @tab fourcc: VCR2 +@item Auravision Aura @tab @tab X +@item Auravision Aura 2 @tab @tab X +@item Autodesk Animator Flic video @tab @tab X +@item Autodesk RLE @tab @tab X + @tab fourcc: AASC +@item Avid 1:1 10-bit RGB Packer @tab X @tab X + @tab fourcc: AVrp +@item AVS (Audio Video Standard) video @tab @tab X + @tab Video encoding used by the Creature Shock game. +@item AYUV @tab X @tab X + @tab Microsoft uncompressed packed 4:4:4:4 +@item Beam Software VB @tab @tab X +@item Bethesda VID video @tab @tab X + @tab Used in some games from Bethesda Softworks. +@item Bink Video @tab @tab X +@item Bitmap Brothers JV video @tab @tab X +@item y41p Brooktree uncompressed 4:1:1 12-bit @tab X @tab X +@item Brute Force & Ignorance @tab @tab X + @tab Used in the game Flash Traffic: City of Angels. +@item C93 video @tab @tab X + @tab Codec used in Cyberia game. +@item CamStudio @tab @tab X + @tab fourcc: CSCD +@item CD+G @tab @tab X + @tab Video codec for CD+G karaoke disks +@item CDXL @tab @tab X + @tab Amiga CD video codec +@item Chinese AVS video @tab E @tab X + @tab AVS1-P2, JiZhun profile, encoding through external library libxavs +@item Delphine Software International CIN video @tab @tab X + @tab Codec used in Delphine Software International games. +@item Discworld II BMV Video @tab @tab X +@item Canopus Lossless Codec @tab @tab X +@item Cinepak @tab @tab X +@item Cirrus Logic AccuPak @tab X @tab X + @tab fourcc: CLJR +@item CPiA Video Format @tab @tab X +@item Creative YUV (CYUV) @tab @tab X +@item DFA @tab @tab X + @tab Codec used in Chronomaster game. +@item Dirac @tab E @tab X + @tab supported through external library libschroedinger +@item Deluxe Paint Animation @tab @tab X +@item DNxHD @tab X @tab X + @tab aka SMPTE VC3 +@item Duck TrueMotion 1.0 @tab @tab X + @tab fourcc: DUCK +@item Duck TrueMotion 2.0 @tab @tab X + @tab fourcc: TM20 +@item DV (Digital Video) @tab X @tab X +@item Dxtory capture format @tab @tab X +@item Feeble Files/ScummVM DXA @tab @tab X + @tab Codec originally used in Feeble Files game. +@item Electronic Arts CMV video @tab @tab X + @tab Used in NHL 95 game. +@item Electronic Arts Madcow video @tab @tab X +@item Electronic Arts TGV video @tab @tab X +@item Electronic Arts TGQ video @tab @tab X +@item Electronic Arts TQI video @tab @tab X +@item Escape 124 @tab @tab X +@item Escape 130 @tab @tab X +@item FFmpeg video codec #1 @tab X @tab X + @tab lossless codec (fourcc: FFV1) +@item Flash Screen Video v1 @tab X @tab X + @tab fourcc: FSV1 +@item Flash Screen Video v2 @tab X @tab X +@item Flash Video (FLV) @tab X @tab X + @tab Sorenson H.263 used in Flash +@item Forward Uncompressed @tab @tab X +@item Fraps @tab @tab X +@item Go2Meeting @tab @tab X + @tab fourcc: G2M2, G2M3 +@item Go2Webinar @tab @tab X + @tab fourcc: G2M4 +@item H.261 @tab X @tab X +@item H.263 / H.263-1996 @tab X @tab X +@item H.263+ / H.263-1998 / H.263 version 2 @tab X @tab X +@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 @tab E @tab X + @tab encoding supported through external library libx264 and OpenH264 +@item HEVC @tab X @tab X + @tab encoding supported through external library libx265 and libkvazaar +@item HNM version 4 @tab @tab X +@item HuffYUV @tab X @tab X +@item HuffYUV FFmpeg variant @tab X @tab X +@item IBM Ultimotion @tab @tab X + @tab fourcc: ULTI +@item id Cinematic video @tab @tab X + @tab Used in Quake II. +@item id RoQ video @tab X @tab X + @tab Used in Quake III, Jedi Knight 2, other computer games. +@item IFF ILBM @tab @tab X + @tab IFF interleaved bitmap +@item IFF ByteRun1 @tab @tab X + @tab IFF run length encoded bitmap +@item Intel H.263 @tab @tab X +@item Intel Indeo 2 @tab @tab X +@item Intel Indeo 3 @tab @tab X +@item Intel Indeo 4 @tab @tab X +@item Intel Indeo 5 @tab @tab X +@item Interplay C93 @tab @tab X + @tab Used in the game Cyberia from Interplay. +@item Interplay MVE video @tab @tab X + @tab Used in Interplay .MVE files. +@item J2K @tab X @tab X +@item Karl Morton's video codec @tab @tab X + @tab Codec used in Worms games. +@item Kega Game Video (KGV1) @tab @tab X + @tab Kega emulator screen capture codec. +@item Lagarith @tab @tab X +@item LCL (LossLess Codec Library) MSZH @tab @tab X +@item LCL (LossLess Codec Library) ZLIB @tab E @tab E +@item LOCO @tab @tab X +@item LucasArts SANM/Smush @tab @tab X + @tab Used in LucasArts games / SMUSH animations. +@item lossless MJPEG @tab X @tab X +@item Microsoft ATC Screen @tab @tab X + @tab Also known as Microsoft Screen 3. +@item Microsoft Expression Encoder Screen @tab @tab X + @tab Also known as Microsoft Titanium Screen 2. +@item Microsoft RLE @tab @tab X +@item Microsoft Screen 1 @tab @tab X + @tab Also known as Windows Media Video V7 Screen. +@item Microsoft Screen 2 @tab @tab X + @tab Also known as Windows Media Video V9 Screen. +@item Microsoft Video 1 @tab @tab X +@item Mimic @tab @tab X + @tab Used in MSN Messenger Webcam streams. +@item Miro VideoXL @tab @tab X + @tab fourcc: VIXL +@item MJPEG (Motion JPEG) @tab X @tab X +@item Mobotix MxPEG video @tab @tab X +@item Motion Pixels video @tab @tab X +@item MPEG-1 video @tab X @tab X +@item MPEG-2 video @tab X @tab X +@item MPEG-4 part 2 @tab X @tab X + @tab libxvidcore can be used alternatively for encoding. +@item MPEG-4 part 2 Microsoft variant version 1 @tab @tab X +@item MPEG-4 part 2 Microsoft variant version 2 @tab X @tab X +@item MPEG-4 part 2 Microsoft variant version 3 @tab X @tab X +@item Nintendo Gamecube THP video @tab @tab X +@item NuppelVideo/RTjpeg @tab @tab X + @tab Video encoding used in NuppelVideo files. +@item On2 VP3 @tab @tab X + @tab still experimental +@item On2 VP5 @tab @tab X + @tab fourcc: VP50 +@item On2 VP6 @tab @tab X + @tab fourcc: VP60,VP61,VP62 +@item On2 VP7 @tab @tab X + @tab fourcc: VP70,VP71 +@item VP8 @tab E @tab X + @tab fourcc: VP80, encoding supported through external library libvpx +@item VP9 @tab E @tab X + @tab encoding supported through external library libvpx +@item Pinnacle TARGA CineWave YUV16 @tab @tab X + @tab fourcc: Y216 +@item Prores @tab @tab X + @tab fourcc: apch,apcn,apcs,apco +@item Q-team QPEG @tab @tab X + @tab fourccs: QPEG, Q1.0, Q1.1 +@item QuickTime 8BPS video @tab @tab X +@item QuickTime Animation (RLE) video @tab X @tab X + @tab fourcc: 'rle ' +@item QuickTime Graphics (SMC) @tab @tab X + @tab fourcc: 'smc ' +@item QuickTime video (RPZA) @tab @tab X + @tab fourcc: rpza +@item R10K AJA Kona 10-bit RGB Codec @tab X @tab X +@item R210 Quicktime Uncompressed RGB 10-bit @tab X @tab X +@item Raw Video @tab X @tab X +@item RealVideo 1.0 @tab X @tab X +@item RealVideo 2.0 @tab X @tab X +@item RealVideo 3.0 @tab @tab X + @tab still far from ideal +@item RealVideo 4.0 @tab @tab X +@item Renderware TXD (TeXture Dictionary) @tab @tab X + @tab Texture dictionaries used by the Renderware Engine. +@item RL2 video @tab @tab X + @tab used in some games by Entertainment Software Partners +@item Screenpresso @tab @tab X +@item Sierra VMD video @tab @tab X + @tab Used in Sierra VMD files. +@item Silicon Graphics Motion Video Compressor 1 (MVC1) @tab @tab X +@item Silicon Graphics Motion Video Compressor 2 (MVC2) @tab @tab X +@item Silicon Graphics RLE 8-bit video @tab @tab X +@item Smacker video @tab @tab X + @tab Video encoding used in Smacker. +@item SMPTE VC-1 @tab @tab X +@item Snow @tab X @tab X + @tab experimental wavelet codec (fourcc: SNOW) +@item Sony PlayStation MDEC (Motion DECoder) @tab @tab X +@item Sorenson Vector Quantizer 1 @tab X @tab X + @tab fourcc: SVQ1 +@item Sorenson Vector Quantizer 3 @tab @tab X + @tab fourcc: SVQ3 +@item Sunplus JPEG (SP5X) @tab @tab X + @tab fourcc: SP5X +@item TechSmith Screen Capture Codec @tab @tab X + @tab fourcc: TSCC +@item TechSmith Screen Capture Codec 2 @tab @tab X + @tab fourcc: TSC2 +@item Theora @tab E @tab X + @tab encoding supported through external library libtheora +@item Tiertex Limited SEQ video @tab @tab X + @tab Codec used in DOS CD-ROM FlashBack game. +@item Ut Video @tab X @tab X +@item v210 QuickTime uncompressed 4:2:2 10-bit @tab X @tab X +@item v308 QuickTime uncompressed 4:4:4 @tab X @tab X +@item v408 QuickTime uncompressed 4:4:4:4 @tab X @tab X +@item v410 QuickTime uncompressed 4:4:4 10-bit @tab X @tab X +@item VBLE Lossless Codec @tab @tab X +@item VMware Screen Codec / VMware Video @tab @tab X + @tab Codec used in videos captured by VMware. +@item Westwood Studios VQA (Vector Quantized Animation) video @tab @tab X +@item Windows Media Image @tab @tab X +@item Windows Media Video 7 @tab X @tab X +@item Windows Media Video 8 @tab X @tab X +@item Windows Media Video 9 @tab @tab X + @tab not completely working +@item Wing Commander III / Xan @tab @tab X + @tab Used in Wing Commander III .MVE files. +@item Wing Commander IV / Xan @tab @tab X + @tab Used in Wing Commander IV. +@item Winnov WNV1 @tab @tab X +@item WMV7 @tab X @tab X +@item YAMAHA SMAF @tab X @tab X +@item Psygnosis YOP Video @tab @tab X +@item yuv4 @tab X @tab X + @tab libquicktime uncompressed packed 4:2:0 +@item ZeroCodec Lossless Video @tab @tab X +@item ZLIB @tab X @tab X + @tab part of LCL, encoder experimental +@item Zip Motion Blocks Video @tab X @tab X + @tab Encoder works only in PAL8. +@end multitable + +@code{X} means that encoding (resp. decoding) is supported. + +@code{E} means that support is provided through an external library. + +@section Audio Codecs + +@multitable @columnfractions .4 .1 .1 .4 +@item Name @tab Encoding @tab Decoding @tab Comments +@item 8SVX exponential @tab @tab X +@item 8SVX fibonacci @tab @tab X +@item AAC @tab EX @tab X + @tab encoding supported through internal encoder and external libraries libfaac and libfdk-aac +@item AAC+ @tab E @tab IX + @tab encoding supported through external library libfdk-aac +@item AC-3 @tab IX @tab IX +@item ADPCM 4X Movie @tab @tab X +@item APDCM Yamaha AICA @tab @tab X +@item ADPCM CDROM XA @tab @tab X +@item ADPCM Creative Technology @tab @tab X + @tab 16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2 +@item ADPCM Electronic Arts @tab @tab X + @tab Used in various EA titles. +@item ADPCM Electronic Arts Maxis CDROM XS @tab @tab X + @tab Used in Sim City 3000. +@item ADPCM Electronic Arts R1 @tab @tab X +@item ADPCM Electronic Arts R2 @tab @tab X +@item ADPCM Electronic Arts R3 @tab @tab X +@item ADPCM Electronic Arts XAS @tab @tab X +@item ADPCM G.722 @tab X @tab X +@item ADPCM G.726 @tab X @tab X +@item ADPCM IMA AMV @tab @tab X + @tab Used in AMV files +@item ADPCM IMA Electronic Arts EACS @tab @tab X +@item ADPCM IMA Electronic Arts SEAD @tab @tab X +@item ADPCM IMA Funcom @tab @tab X +@item ADPCM IMA QuickTime @tab X @tab X +@item ADPCM IMA Loki SDL MJPEG @tab @tab X +@item ADPCM IMA WAV @tab X @tab X +@item ADPCM IMA Westwood @tab @tab X +@item ADPCM ISS IMA @tab @tab X + @tab Used in FunCom games. +@item ADPCM IMA Dialogic @tab @tab X +@item ADPCM IMA Duck DK3 @tab @tab X + @tab Used in some Sega Saturn console games. +@item ADPCM IMA Duck DK4 @tab @tab X + @tab Used in some Sega Saturn console games. +@item ADPCM IMA Radical @tab @tab X +@item ADPCM Microsoft @tab X @tab X +@item ADPCM MS IMA @tab X @tab X +@item ADPCM Nintendo Gamecube AFC @tab @tab X +@item ADPCM Nintendo Gamecube DTK @tab @tab X +@item ADPCM Nintendo THP @tab @tab X +@item APDCM Playstation @tab @tab X +@item ADPCM QT IMA @tab X @tab X +@item ADPCM SEGA CRI ADX @tab X @tab X + @tab Used in Sega Dreamcast games. +@item ADPCM Shockwave Flash @tab X @tab X +@item ADPCM Sound Blaster Pro 2-bit @tab @tab X +@item ADPCM Sound Blaster Pro 2.6-bit @tab @tab X +@item ADPCM Sound Blaster Pro 4-bit @tab @tab X +@item ADPCM VIMA @tab @tab X + @tab Used in LucasArts SMUSH animations. +@item ADPCM Westwood Studios IMA @tab @tab X + @tab Used in Westwood Studios games like Command and Conquer. +@item ADPCM Yamaha @tab X @tab X +@item AMR-NB @tab E @tab X + @tab encoding supported through external library libopencore-amrnb +@item AMR-WB @tab E @tab X + @tab encoding supported through external library libvo-amrwbenc +@item Amazing Studio PAF Audio @tab @tab X +@item Apple lossless audio @tab X @tab X + @tab QuickTime fourcc 'alac' +@item ATRAC1 @tab @tab X +@item ATRAC3 @tab @tab X +@item ATRAC3+ @tab @tab X +@item Bink Audio @tab @tab X + @tab Used in Bink and Smacker files in many games. +@item CELT @tab @tab E + @tab decoding supported through external library libcelt +@item Delphine Software International CIN audio @tab @tab X + @tab Codec used in Delphine Software International games. +@item Digital Speech Standard - Standard Play mode (DSS SP) @tab @tab X +@item Discworld II BMV Audio @tab @tab X +@item COOK @tab @tab X + @tab All versions except 5.1 are supported. +@item DCA (DTS Coherent Acoustics) @tab X @tab X + @tab supported extensions: XCh, XLL (partially) +@item DPCM id RoQ @tab X @tab X + @tab Used in Quake III, Jedi Knight 2 and other computer games. +@item DPCM Interplay @tab @tab X + @tab Used in various Interplay computer games. +@item DPCM Squareroot-Delta-Exact @tab @tab X + @tab Used in various games. +@item DPCM Sierra Online @tab @tab X + @tab Used in Sierra Online game audio files. +@item DPCM Sol @tab @tab X +@item DPCM Xan @tab @tab X + @tab Used in Origin's Wing Commander IV AVI files. +@item DSD (Direct Stream Digitial), least significant bit first @tab @tab X +@item DSD (Direct Stream Digitial), most significant bit first @tab @tab X +@item DSD (Direct Stream Digitial), least significant bit first, planar @tab @tab X +@item DSD (Direct Stream Digitial), most significant bit first, planar @tab @tab X +@item DSP Group TrueSpeech @tab @tab X +@item DV audio @tab @tab X +@item Enhanced AC-3 @tab X @tab X +@item EVRC (Enhanced Variable Rate Codec) @tab @tab X +@item FLAC (Free Lossless Audio Codec) @tab X @tab IX +@item G.723.1 @tab X @tab X +@item G.729 @tab @tab X +@item GSM @tab E @tab X + @tab encoding supported through external library libgsm +@item GSM Microsoft variant @tab E @tab X + @tab encoding supported through external library libgsm +@item IAC (Indeo Audio Coder) @tab @tab X +@item iLBC (Internet Low Bitrate Codec) @tab E @tab E + @tab encoding and decoding supported through external library libilbc +@item IMC (Intel Music Coder) @tab @tab X +@item Interplay ACM @tab @tab X +@item MACE (Macintosh Audio Compression/Expansion) 3:1 @tab @tab X +@item MACE (Macintosh Audio Compression/Expansion) 6:1 @tab @tab X +@item MLP (Meridian Lossless Packing) @tab @tab X + @tab Used in DVD-Audio discs. +@item Monkey's Audio @tab @tab X +@item MP1 (MPEG audio layer 1) @tab @tab IX +@item MP2 (MPEG audio layer 2) @tab IX @tab IX + @tab encoding supported also through external library TwoLAME +@item MP3 (MPEG audio layer 3) @tab E @tab IX + @tab encoding supported through external library LAME, ADU MP3 and MP3onMP4 also supported +@item MPEG-4 Audio Lossless Coding (ALS) @tab @tab X +@item Musepack SV7 @tab @tab X +@item Musepack SV8 @tab @tab X +@item Nellymoser Asao @tab X @tab X +@item On2 AVC (Audio for Video Codec) @tab @tab X +@item Opus @tab E @tab X + @tab encoding supported through external library libopus +@item PCM A-law @tab X @tab X +@item PCM mu-law @tab X @tab X +@item PCM signed 8-bit planar @tab X @tab X +@item PCM signed 16-bit big-endian planar @tab X @tab X +@item PCM signed 16-bit little-endian planar @tab X @tab X +@item PCM signed 24-bit little-endian planar @tab X @tab X +@item PCM signed 32-bit little-endian planar @tab X @tab X +@item PCM 32-bit floating point big-endian @tab X @tab X +@item PCM 32-bit floating point little-endian @tab X @tab X +@item PCM 64-bit floating point big-endian @tab X @tab X +@item PCM 64-bit floating point little-endian @tab X @tab X +@item PCM D-Cinema audio signed 24-bit @tab X @tab X +@item PCM signed 8-bit @tab X @tab X +@item PCM signed 16-bit big-endian @tab X @tab X +@item PCM signed 16-bit little-endian @tab X @tab X +@item PCM signed 24-bit big-endian @tab X @tab X +@item PCM signed 24-bit little-endian @tab X @tab X +@item PCM signed 32-bit big-endian @tab X @tab X +@item PCM signed 32-bit little-endian @tab X @tab X +@item PCM signed 16/20/24-bit big-endian in MPEG-TS @tab @tab X +@item PCM unsigned 8-bit @tab X @tab X +@item PCM unsigned 16-bit big-endian @tab X @tab X +@item PCM unsigned 16-bit little-endian @tab X @tab X +@item PCM unsigned 24-bit big-endian @tab X @tab X +@item PCM unsigned 24-bit little-endian @tab X @tab X +@item PCM unsigned 32-bit big-endian @tab X @tab X +@item PCM unsigned 32-bit little-endian @tab X @tab X +@item PCM Zork @tab @tab X +@item QCELP / PureVoice @tab @tab X +@item QDesign Music Codec 2 @tab @tab X + @tab There are still some distortions. +@item RealAudio 1.0 (14.4K) @tab X @tab X + @tab Real 14400 bit/s codec +@item RealAudio 2.0 (28.8K) @tab @tab X + @tab Real 28800 bit/s codec +@item RealAudio 3.0 (dnet) @tab IX @tab X + @tab Real low bitrate AC-3 codec +@item RealAudio Lossless @tab @tab X +@item RealAudio SIPR / ACELP.NET @tab @tab X +@item Shorten @tab @tab X +@item Sierra VMD audio @tab @tab X + @tab Used in Sierra VMD files. +@item Smacker audio @tab @tab X +@item SMPTE 302M AES3 audio @tab X @tab X +@item Sonic @tab X @tab X + @tab experimental codec +@item Sonic lossless @tab X @tab X + @tab experimental codec +@item Speex @tab E @tab E + @tab supported through external library libspeex +@item TAK (Tom's lossless Audio Kompressor) @tab @tab X +@item True Audio (TTA) @tab X @tab X +@item TrueHD @tab @tab X + @tab Used in HD-DVD and Blu-Ray discs. +@item TwinVQ (VQF flavor) @tab @tab X +@item VIMA @tab @tab X + @tab Used in LucasArts SMUSH animations. +@item Vorbis @tab E @tab X + @tab A native but very primitive encoder exists. +@item Voxware MetaSound @tab @tab X +@item WavPack @tab X @tab X +@item Westwood Audio (SND1) @tab @tab X +@item Windows Media Audio 1 @tab X @tab X +@item Windows Media Audio 2 @tab X @tab X +@item Windows Media Audio Lossless @tab @tab X +@item Windows Media Audio Pro @tab @tab X +@item Windows Media Audio Voice @tab @tab X +@item Xbox Media Audio 1 @tab @tab X +@item Xbox Media Audio 2 @tab @tab X +@end multitable + +@code{X} means that encoding (resp. decoding) is supported. + +@code{E} means that support is provided through an external library. + +@code{I} means that an integer-only version is available, too (ensures high +performance on systems without hardware floating point support). + +@section Subtitle Formats + +@multitable @columnfractions .4 .1 .1 .1 .1 +@item Name @tab Muxing @tab Demuxing @tab Encoding @tab Decoding +@item 3GPP Timed Text @tab @tab @tab X @tab X +@item AQTitle @tab @tab X @tab @tab X +@item DVB @tab X @tab X @tab X @tab X +@item DVB teletext @tab @tab X @tab @tab E +@item DVD @tab X @tab X @tab X @tab X +@item JACOsub @tab X @tab X @tab @tab X +@item MicroDVD @tab X @tab X @tab @tab X +@item MPL2 @tab @tab X @tab @tab X +@item MPsub (MPlayer) @tab @tab X @tab @tab X +@item PGS @tab @tab @tab @tab X +@item PJS (Phoenix) @tab @tab X @tab @tab X +@item RealText @tab @tab X @tab @tab X +@item SAMI @tab @tab X @tab @tab X +@item Spruce format (STL) @tab @tab X @tab @tab X +@item SSA/ASS @tab X @tab X @tab X @tab X +@item SubRip (SRT) @tab X @tab X @tab X @tab X +@item SubViewer v1 @tab @tab X @tab @tab X +@item SubViewer @tab @tab X @tab @tab X +@item TED Talks captions @tab @tab X @tab @tab X +@item VobSub (IDX+SUB) @tab @tab X @tab @tab X +@item VPlayer @tab @tab X @tab @tab X +@item WebVTT @tab X @tab X @tab X @tab X +@item XSUB @tab @tab @tab X @tab X +@end multitable + +@code{X} means that the feature is supported. + +@code{E} means that support is provided through an external library. + +@section Network Protocols + +@multitable @columnfractions .4 .1 +@item Name @tab Support +@item file @tab X +@item FTP @tab X +@item Gopher @tab X +@item HLS @tab X +@item HTTP @tab X +@item HTTPS @tab X +@item Icecast @tab X +@item MMSH @tab X +@item MMST @tab X +@item pipe @tab X +@item RTMP @tab X +@item RTMPE @tab X +@item RTMPS @tab X +@item RTMPT @tab X +@item RTMPTE @tab X +@item RTMPTS @tab X +@item RTP @tab X +@item SAMBA @tab E +@item SCTP @tab X +@item SFTP @tab E +@item TCP @tab X +@item TLS @tab X +@item UDP @tab X +@end multitable + +@code{X} means that the protocol is supported. + +@code{E} means that support is provided through an external library. + + +@section Input/Output Devices + +@multitable @columnfractions .4 .1 .1 +@item Name @tab Input @tab Output +@item ALSA @tab X @tab X +@item BKTR @tab X @tab +@item caca @tab @tab X +@item DV1394 @tab X @tab +@item Lavfi virtual device @tab X @tab +@item Linux framebuffer @tab X @tab X +@item JACK @tab X @tab +@item LIBCDIO @tab X +@item LIBDC1394 @tab X @tab +@item OpenAL @tab X +@item OpenGL @tab @tab X +@item OSS @tab X @tab X +@item PulseAudio @tab X @tab X +@item SDL @tab @tab X +@item Video4Linux2 @tab X @tab X +@item VfW capture @tab X @tab +@item X11 grabbing @tab X @tab +@item Win32 grabbing @tab X @tab +@end multitable + +@code{X} means that input/output is supported. + +@section Timecode + +@multitable @columnfractions .4 .1 .1 +@item Codec/format @tab Read @tab Write +@item AVI @tab X @tab X +@item DV @tab X @tab X +@item GXF @tab X @tab X +@item MOV @tab X @tab X +@item MPEG1/2 @tab X @tab X +@item MXF @tab X @tab X +@end multitable + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/git-howto.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/git-howto.texi new file mode 100644 index 0000000..e5e3c81 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/git-howto.texi
@@ -0,0 +1,435 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Using Git to develop FFmpeg + +@titlepage +@center @titlefont{Using Git to develop FFmpeg} +@end titlepage + +@top + +@contents + +@chapter Introduction + +This document aims in giving some quick references on a set of useful Git +commands. You should always use the extensive and detailed documentation +provided directly by Git: + +@example +git --help +man git +@end example + +shows you the available subcommands, + +@example +git <command> --help +man git-<command> +@end example + +shows information about the subcommand <command>. + +Additional information could be found on the +@url{http://gitref.org, Git Reference} website. + +For more information about the Git project, visit the +@url{http://git-scm.com/, Git website}. + +Consult these resources whenever you have problems, they are quite exhaustive. + +What follows now is a basic introduction to Git and some FFmpeg-specific +guidelines to ease the contribution to the project. + +@chapter Basics Usage + +@section Get Git + +You can get Git from @url{http://git-scm.com/} +Most distribution and operating system provide a package for it. + + +@section Cloning the source tree + +@example +git clone git://source.ffmpeg.org/ffmpeg <target> +@end example + +This will put the FFmpeg sources into the directory @var{<target>}. + +@example +git clone git@@source.ffmpeg.org:ffmpeg <target> +@end example + +This will put the FFmpeg sources into the directory @var{<target>} and let +you push back your changes to the remote repository. + +@example +git clone gil@@ffmpeg.org:ffmpeg-web <target> +@end example + +This will put the source of the FFmpeg website into the directory +@var{<target>} and let you push back your changes to the remote repository. +(Note that @var{gil} stands for GItoLite and is not a typo of @var{git}.) + +If you don't have write-access to the ffmpeg-web repository, you can +create patches after making a read-only ffmpeg-web clone: + +@example +git clone git://ffmpeg.org/ffmpeg-web <target> +@end example + +Make sure that you do not have Windows line endings in your checkouts, +otherwise you may experience spurious compilation failures. One way to +achieve this is to run + +@example +git config --global core.autocrlf false +@end example + + +@anchor{Updating the source tree to the latest revision} +@section Updating the source tree to the latest revision + +@example +git pull (--rebase) +@end example + +pulls in the latest changes from the tracked branch. The tracked branch +can be remote. By default the master branch tracks the branch master in +the remote origin. + +@float IMPORTANT +@command{--rebase} (see below) is recommended. +@end float + +@section Rebasing your local branches + +@example +git pull --rebase +@end example + +fetches the changes from the main repository and replays your local commits +over it. This is required to keep all your local changes at the top of +FFmpeg's master tree. The master tree will reject pushes with merge commits. + + +@section Adding/removing files/directories + +@example +git add [-A] <filename/dirname> +git rm [-r] <filename/dirname> +@end example + +Git needs to get notified of all changes you make to your working +directory that makes files appear or disappear. +Line moves across files are automatically tracked. + + +@section Showing modifications + +@example +git diff <filename(s)> +@end example + +will show all local modifications in your working directory as unified diff. + + +@section Inspecting the changelog + +@example +git log <filename(s)> +@end example + +You may also use the graphical tools like @command{gitview} or @command{gitk} +or the web interface available at @url{http://source.ffmpeg.org/}. + +@section Checking source tree status + +@example +git status +@end example + +detects all the changes you made and lists what actions will be taken in case +of a commit (additions, modifications, deletions, etc.). + + +@section Committing + +@example +git diff --check +@end example + +to double check your changes before committing them to avoid trouble later +on. All experienced developers do this on each and every commit, no matter +how small. + +Every one of them has been saved from looking like a fool by this many times. +It's very easy for stray debug output or cosmetic modifications to slip in, +please avoid problems through this extra level of scrutiny. + +For cosmetics-only commits you should get (almost) empty output from + +@example +git diff -w -b <filename(s)> +@end example + +Also check the output of + +@example +git status +@end example + +to make sure you don't have untracked files or deletions. + +@example +git add [-i|-p|-A] <filenames/dirnames> +@end example + +Make sure you have told Git your name and email address + +@example +git config --global user.name "My Name" +git config --global user.email my@@email.invalid +@end example + +Use @option{--global} to set the global configuration for all your Git checkouts. + +Git will select the changes to the files for commit. Optionally you can use +the interactive or the patch mode to select hunk by hunk what should be +added to the commit. + + +@example +git commit +@end example + +Git will commit the selected changes to your current local branch. + +You will be prompted for a log message in an editor, which is either +set in your personal configuration file through + +@example +git config --global core.editor +@end example + +or set by one of the following environment variables: +@var{GIT_EDITOR}, @var{VISUAL} or @var{EDITOR}. + +Log messages should be concise but descriptive. Explain why you made a change, +what you did will be obvious from the changes themselves most of the time. +Saying just "bug fix" or "10l" is bad. Remember that people of varying skill +levels look at and educate themselves while reading through your code. Don't +include filenames in log messages, Git provides that information. + +Possibly make the commit message have a terse, descriptive first line, an +empty line and then a full description. The first line will be used to name +the patch by @command{git format-patch}. + +@section Preparing a patchset + +@example +git format-patch <commit> [-o directory] +@end example + +will generate a set of patches for each commit between @var{<commit>} and +current @var{HEAD}. E.g. + +@example +git format-patch origin/master +@end example + +will generate patches for all commits on current branch which are not +present in upstream. +A useful shortcut is also + +@example +git format-patch -n +@end example + +which will generate patches from last @var{n} commits. +By default the patches are created in the current directory. + +@section Sending patches for review + +@example +git send-email <commit list|directory> +@end example + +will send the patches created by @command{git format-patch} or directly +generates them. All the email fields can be configured in the global/local +configuration or overridden by command line. +Note that this tool must often be installed separately (e.g. @var{git-email} +package on Debian-based distros). + + +@section Renaming/moving/copying files or contents of files + +Git automatically tracks such changes, making those normal commits. + +@example +mv/cp path/file otherpath/otherfile +git add [-A] . +git commit +@end example + + +@chapter Git configuration + +In order to simplify a few workflows, it is advisable to configure both +your personal Git installation and your local FFmpeg repository. + +@section Personal Git installation + +Add the following to your @file{~/.gitconfig} to help @command{git send-email} +and @command{git format-patch} detect renames: + +@example +[diff] + renames = copy +@end example + +@section Repository configuration + +In order to have @command{git send-email} automatically send patches +to the ffmpeg-devel mailing list, add the following stanza +to @file{/path/to/ffmpeg/repository/.git/config}: + +@example +[sendemail] + to = ffmpeg-devel@@ffmpeg.org +@end example + +@chapter FFmpeg specific + +@section Reverting broken commits + +@example +git reset <commit> +@end example + +@command{git reset} will uncommit the changes till @var{<commit>} rewriting +the current branch history. + +@example +git commit --amend +@end example + +allows one to amend the last commit details quickly. + +@example +git rebase -i origin/master +@end example + +will replay local commits over the main repository allowing to edit, merge +or remove some of them in the process. + +@float NOTE +@command{git reset}, @command{git commit --amend} and @command{git rebase} +rewrite history, so you should use them ONLY on your local or topic branches. +The main repository will reject those changes. +@end float + +@example +git revert <commit> +@end example + +@command{git revert} will generate a revert commit. This will not make the +faulty commit disappear from the history. + +@section Pushing changes to remote trees + +@example +git push origin master --dry-run +@end example + +Will simulate a push of the local master branch to the default remote +(@var{origin}). And list which branches and ranges or commits would have been +pushed. +Git will prevent you from pushing changes if the local and remote trees are +out of sync. Refer to @ref{Updating the source tree to the latest revision}. + +@example +git remote add <name> <url> +@end example + +Will add additional remote with a name reference, it is useful if you want +to push your local branch for review on a remote host. + +@example +git push <remote> <refspec> +@end example + +Will push the changes to the @var{<remote>} repository. +Omitting @var{<refspec>} makes @command{git push} update all the remote +branches matching the local ones. + +@section Finding a specific svn revision + +Since version 1.7.1 Git supports @samp{:/foo} syntax for specifying commits +based on a regular expression. see man gitrevisions + +@example +git show :/'as revision 23456' +@end example + +will show the svn changeset @samp{r23456}. With older Git versions searching in +the @command{git log} output is the easiest option (especially if a pager with +search capabilities is used). + +This commit can be checked out with + +@example +git checkout -b svn_23456 :/'as revision 23456' +@end example + +or for Git < 1.7.1 with + +@example +git checkout -b svn_23456 $SHA1 +@end example + +where @var{$SHA1} is the commit hash from the @command{git log} output. + + +@chapter Pre-push checklist + +Once you have a set of commits that you feel are ready for pushing, +work through the following checklist to doublecheck everything is in +proper order. This list tries to be exhaustive. In case you are just +pushing a typo in a comment, some of the steps may be unnecessary. +Apply your common sense, but if in doubt, err on the side of caution. + +First, make sure that the commits and branches you are going to push +match what you want pushed and that nothing is missing, extraneous or +wrong. You can see what will be pushed by running the git push command +with @option{--dry-run} first. And then inspecting the commits listed with +@command{git log -p 1234567..987654}. The @command{git status} command +may help in finding local changes that have been forgotten to be added. + +Next let the code pass through a full run of our testsuite. + +@itemize +@item @command{make distclean} +@item @command{/path/to/ffmpeg/configure} +@item @command{make fate} +@item if fate fails due to missing samples run @command{make fate-rsync} and retry +@end itemize + +Make sure all your changes have been checked before pushing them, the +testsuite only checks against regressions and that only to some extend. It does +obviously not check newly added features/code to be working unless you have +added a test for that (which is recommended). + +Also note that every single commit should pass the test suite, not just +the result of a series of patches. + +Once everything passed, push the changes to your public ffmpeg clone and post a +merge request to ffmpeg-devel. You can also push them directly but this is not +recommended. + +@chapter Server Issues + +Contact the project admins at @email{root@@ffmpeg.org} if you have technical +problems with the Git server.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/indevs.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/indevs.texi new file mode 100644 index 0000000..3fb852b --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/indevs.texi
@@ -0,0 +1,1385 @@ +@chapter Input Devices +@c man begin INPUT DEVICES + +Input devices are configured elements in FFmpeg which enable accessing +the data coming from a multimedia device attached to your system. + +When you configure your FFmpeg build, all the supported input devices +are enabled by default. You can list all available ones using the +configure option "--list-indevs". + +You can disable all the input devices using the configure option +"--disable-indevs", and selectively enable an input device using the +option "--enable-indev=@var{INDEV}", or you can disable a particular +input device using the option "--disable-indev=@var{INDEV}". + +The option "-devices" of the ff* tools will display the list of +supported input devices. + +A description of the currently available input devices follows. + +@section alsa + +ALSA (Advanced Linux Sound Architecture) input device. + +To enable this input device during configuration you need libasound +installed on your system. + +This device allows capturing from an ALSA device. The name of the +device to capture has to be an ALSA card identifier. + +An ALSA identifier has the syntax: +@example +hw:@var{CARD}[,@var{DEV}[,@var{SUBDEV}]] +@end example + +where the @var{DEV} and @var{SUBDEV} components are optional. + +The three arguments (in order: @var{CARD},@var{DEV},@var{SUBDEV}) +specify card number or identifier, device number and subdevice number +(-1 means any). + +To see the list of cards currently recognized by your system check the +files @file{/proc/asound/cards} and @file{/proc/asound/devices}. + +For example to capture with @command{ffmpeg} from an ALSA device with +card id 0, you may run the command: +@example +ffmpeg -f alsa -i hw:0 alsaout.wav +@end example + +For more information see: +@url{http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html} + +@subsection Options + +@table @option + +@item sample_rate +Set the sample rate in Hz. Default is 48000. + +@item channels +Set the number of channels. Default is 2. + +@end table + +@section avfoundation + +AVFoundation input device. + +AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS. +The older QTKit framework has been marked deprecated since OSX version 10.7. + +The input filename has to be given in the following syntax: +@example +-i "[[VIDEO]:[AUDIO]]" +@end example +The first entry selects the video input while the latter selects the audio input. +The stream has to be specified by the device name or the device index as shown by the device list. +Alternatively, the video and/or audio input device can be chosen by index using the +@option{ + -video_device_index <INDEX> +} +and/or +@option{ + -audio_device_index <INDEX> +} +, overriding any +device name or index given in the input filename. + +All available devices can be enumerated by using @option{-list_devices true}, listing +all device names and corresponding indices. + +There are two device name aliases: +@table @code + +@item default +Select the AVFoundation default device of the corresponding type. + +@item none +Do not record the corresponding media type. +This is equivalent to specifying an empty device name or index. + +@end table + +@subsection Options + +AVFoundation supports the following options: + +@table @option + +@item -list_devices <TRUE|FALSE> +If set to true, a list of all available input devices is given showing all +device names and indices. + +@item -video_device_index <INDEX> +Specify the video device by its index. Overrides anything given in the input filename. + +@item -audio_device_index <INDEX> +Specify the audio device by its index. Overrides anything given in the input filename. + +@item -pixel_format <FORMAT> +Request the video device to use a specific pixel format. +If the specified format is not supported, a list of available formats is given +and the first one in this list is used instead. Available pixel formats are: +@code{monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0, + bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10, + yuv420p, nv12, yuyv422, gray} + +@item -framerate +Set the grabbing frame rate. Default is @code{ntsc}, corresponding to a +frame rate of @code{30000/1001}. + +@item -video_size +Set the video frame size. + +@item -capture_cursor +Capture the mouse pointer. Default is 0. + +@item -capture_mouse_clicks +Capture the screen mouse clicks. Default is 0. + +@end table + +@subsection Examples + +@itemize + +@item +Print the list of AVFoundation supported devices and exit: +@example +$ ffmpeg -f avfoundation -list_devices true -i "" +@end example + +@item +Record video from video device 0 and audio from audio device 0 into out.avi: +@example +$ ffmpeg -f avfoundation -i "0:0" out.avi +@end example + +@item +Record video from video device 2 and audio from audio device 1 into out.avi: +@example +$ ffmpeg -f avfoundation -video_device_index 2 -i ":1" out.avi +@end example + +@item +Record video from the system default video device using the pixel format bgr0 and do not record any audio into out.avi: +@example +$ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi +@end example + +@end itemize + +@section bktr + +BSD video input device. + +@subsection Options + +@table @option + +@item framerate +Set the frame rate. + +@item video_size +Set the video frame size. Default is @code{vga}. + +@item standard + +Available values are: +@table @samp +@item pal + +@item ntsc + +@item secam + +@item paln + +@item palm + +@item ntscj + +@end table + +@end table + +@section decklink + +The decklink input device provides capture capabilities for Blackmagic +DeckLink devices. + +To enable this input device, you need the Blackmagic DeckLink SDK and you +need to configure with the appropriate @code{--extra-cflags} +and @code{--extra-ldflags}. +On Windows, you need to run the IDL files through @command{widl}. + +DeckLink is very picky about the formats it supports. Pixel format is +uyvy422 or v210, framerate and video size must be determined for your device with +@command{-list_formats 1}. Audio sample rate is always 48 kHz and the number +of channels can be 2, 8 or 16. Note that all audio channels are bundled in one single +audio track. + +@subsection Options + +@table @option + +@item list_devices +If set to @option{true}, print a list of devices and exit. +Defaults to @option{false}. + +@item list_formats +If set to @option{true}, print a list of supported formats and exit. +Defaults to @option{false}. + +@item bm_v210 +If set to @samp{1}, video is captured in 10 bit v210 instead +of uyvy422. Not all Blackmagic devices support this option. + +@item teletext_lines +If set to nonzero, an additional teletext stream will be captured from the +vertical ancillary data. This option is a bitmask of the VBI lines checked, +specifically lines 6 to 22, and lines 318 to 335. Line 6 is the LSB in the mask. +Selected lines which do not contain teletext information will be ignored. You +can use the special @option{all} constant to select all possible lines, or +@option{standard} to skip lines 6, 318 and 319, which are not compatible with all +receivers. Capturing teletext only works for SD PAL sources in 8 bit mode. +To use this option, ffmpeg needs to be compiled with @code{--enable-libzvbi}. + +@item channels +Defines number of audio channels to capture. Must be @samp{2}, @samp{8} or @samp{16}. +Defaults to @samp{2}. + +@end table + +@subsection Examples + +@itemize + +@item +List input devices: +@example +ffmpeg -f decklink -list_devices 1 -i dummy +@end example + +@item +List supported formats: +@example +ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro' +@end example + +@item +Capture video clip at 1080i50 (format 11): +@example +ffmpeg -f decklink -i 'Intensity Pro@@11' -acodec copy -vcodec copy output.avi +@end example + +@item +Capture video clip at 1080i50 10 bit: +@example +ffmpeg -bm_v210 1 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi +@end example + +@item +Capture video clip at 1080i50 with 16 audio channels: +@example +ffmpeg -channels 16 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi +@end example + +@end itemize + +@section dshow + +Windows DirectShow input device. + +DirectShow support is enabled when FFmpeg is built with the mingw-w64 project. +Currently only audio and video devices are supported. + +Multiple devices may be opened as separate inputs, but they may also be +opened on the same input, which should improve synchronism between them. + +The input name should be in the format: + +@example +@var{TYPE}=@var{NAME}[:@var{TYPE}=@var{NAME}] +@end example + +where @var{TYPE} can be either @var{audio} or @var{video}, +and @var{NAME} is the device's name or alternative name.. + +@subsection Options + +If no options are specified, the device's defaults are used. +If the device does not support the requested options, it will +fail to open. + +@table @option + +@item video_size +Set the video size in the captured video. + +@item framerate +Set the frame rate in the captured video. + +@item sample_rate +Set the sample rate (in Hz) of the captured audio. + +@item sample_size +Set the sample size (in bits) of the captured audio. + +@item channels +Set the number of channels in the captured audio. + +@item list_devices +If set to @option{true}, print a list of devices and exit. + +@item list_options +If set to @option{true}, print a list of selected device's options +and exit. + +@item video_device_number +Set video device number for devices with the same name (starts at 0, +defaults to 0). + +@item audio_device_number +Set audio device number for devices with the same name (starts at 0, +defaults to 0). + +@item pixel_format +Select pixel format to be used by DirectShow. This may only be set when +the video codec is not set or set to rawvideo. + +@item audio_buffer_size +Set audio device buffer size in milliseconds (which can directly +impact latency, depending on the device). +Defaults to using the audio device's +default buffer size (typically some multiple of 500ms). +Setting this value too low can degrade performance. +See also +@url{http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx} + +@item video_pin_name +Select video capture pin to use by name or alternative name. + +@item audio_pin_name +Select audio capture pin to use by name or alternative name. + +@item crossbar_video_input_pin_number +Select video input pin number for crossbar device. This will be +routed to the crossbar device's Video Decoder output pin. +Note that changing this value can affect future invocations +(sets a new default) until system reboot occurs. + +@item crossbar_audio_input_pin_number +Select audio input pin number for crossbar device. This will be +routed to the crossbar device's Audio Decoder output pin. +Note that changing this value can affect future invocations +(sets a new default) until system reboot occurs. + +@item show_video_device_dialog +If set to @option{true}, before capture starts, popup a display dialog +to the end user, allowing them to change video filter properties +and configurations manually. +Note that for crossbar devices, adjusting values in this dialog +may be needed at times to toggle between PAL (25 fps) and NTSC (29.97) +input frame rates, sizes, interlacing, etc. Changing these values can +enable different scan rates/frame rates and avoiding green bars at +the bottom, flickering scan lines, etc. +Note that with some devices, changing these properties can also affect future +invocations (sets new defaults) until system reboot occurs. + +@item show_audio_device_dialog +If set to @option{true}, before capture starts, popup a display dialog +to the end user, allowing them to change audio filter properties +and configurations manually. + +@item show_video_crossbar_connection_dialog +If set to @option{true}, before capture starts, popup a display +dialog to the end user, allowing them to manually +modify crossbar pin routings, when it opens a video device. + +@item show_audio_crossbar_connection_dialog +If set to @option{true}, before capture starts, popup a display +dialog to the end user, allowing them to manually +modify crossbar pin routings, when it opens an audio device. + +@item show_analog_tv_tuner_dialog +If set to @option{true}, before capture starts, popup a display +dialog to the end user, allowing them to manually +modify TV channels and frequencies. + +@item show_analog_tv_tuner_audio_dialog +If set to @option{true}, before capture starts, popup a display +dialog to the end user, allowing them to manually +modify TV audio (like mono vs. stereo, Language A,B or C). + +@item audio_device_load +Load an audio capture filter device from file instead of searching +it by name. It may load additional parameters too, if the filter +supports the serialization of its properties to. +To use this an audio capture source has to be specified, but it can +be anything even fake one. + +@item audio_device_save +Save the currently used audio capture filter device and its +parameters (if the filter supports it) to a file. +If a file with the same name exists it will be overwritten. + +@item video_device_load +Load a video capture filter device from file instead of searching +it by name. It may load additional parameters too, if the filter +supports the serialization of its properties to. +To use this a video capture source has to be specified, but it can +be anything even fake one. + +@item video_device_save +Save the currently used video capture filter device and its +parameters (if the filter supports it) to a file. +If a file with the same name exists it will be overwritten. + +@end table + +@subsection Examples + +@itemize + +@item +Print the list of DirectShow supported devices and exit: +@example +$ ffmpeg -list_devices true -f dshow -i dummy +@end example + +@item +Open video device @var{Camera}: +@example +$ ffmpeg -f dshow -i video="Camera" +@end example + +@item +Open second video device with name @var{Camera}: +@example +$ ffmpeg -f dshow -video_device_number 1 -i video="Camera" +@end example + +@item +Open video device @var{Camera} and audio device @var{Microphone}: +@example +$ ffmpeg -f dshow -i video="Camera":audio="Microphone" +@end example + +@item +Print the list of supported options in selected device and exit: +@example +$ ffmpeg -list_options true -f dshow -i video="Camera" +@end example + +@item +Specify pin names to capture by name or alternative name, specify alternative device name: +@example +$ ffmpeg -f dshow -audio_pin_name "Audio Out" -video_pin_name 2 -i video=video="@@device_pnp_\\?\pci#ven_1a0a&dev_6200&subsys_62021461&rev_01#4&e2c7dd6&0&00e1#@{65e8773d-8f56-11d0-a3b9-00a0c9223196@}\@{ca465100-deb0-4d59-818f-8c477184adf6@}":audio="Microphone" +@end example + +@item +Configure a crossbar device, specifying crossbar pins, allow user to adjust video capture properties at startup: +@example +$ ffmpeg -f dshow -show_video_device_dialog true -crossbar_video_input_pin_number 0 + -crossbar_audio_input_pin_number 3 -i video="AVerMedia BDA Analog Capture":audio="AVerMedia BDA Analog Capture" +@end example + +@end itemize + +@section dv1394 + +Linux DV 1394 input device. + +@subsection Options + +@table @option + +@item framerate +Set the frame rate. Default is 25. + +@item standard + +Available values are: +@table @samp +@item pal + +@item ntsc + +@end table + +Default value is @code{ntsc}. + +@end table + +@section fbdev + +Linux framebuffer input device. + +The Linux framebuffer is a graphic hardware-independent abstraction +layer to show graphics on a computer monitor, typically on the +console. It is accessed through a file device node, usually +@file{/dev/fb0}. + +For more detailed information read the file +Documentation/fb/framebuffer.txt included in the Linux source tree. + +See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1). + +To record from the framebuffer device @file{/dev/fb0} with +@command{ffmpeg}: +@example +ffmpeg -f fbdev -framerate 10 -i /dev/fb0 out.avi +@end example + +You can take a single screenshot image with the command: +@example +ffmpeg -f fbdev -framerate 1 -i /dev/fb0 -frames:v 1 screenshot.jpeg +@end example + +@subsection Options + +@table @option + +@item framerate +Set the frame rate. Default is 25. + +@end table + +@section gdigrab + +Win32 GDI-based screen capture device. + +This device allows you to capture a region of the display on Windows. + +There are two options for the input filename: +@example +desktop +@end example +or +@example +title=@var{window_title} +@end example + +The first option will capture the entire desktop, or a fixed region of the +desktop. The second option will instead capture the contents of a single +window, regardless of its position on the screen. + +For example, to grab the entire desktop using @command{ffmpeg}: +@example +ffmpeg -f gdigrab -framerate 6 -i desktop out.mpg +@end example + +Grab a 640x480 region at position @code{10,20}: +@example +ffmpeg -f gdigrab -framerate 6 -offset_x 10 -offset_y 20 -video_size vga -i desktop out.mpg +@end example + +Grab the contents of the window named "Calculator" +@example +ffmpeg -f gdigrab -framerate 6 -i title=Calculator out.mpg +@end example + +@subsection Options + +@table @option +@item draw_mouse +Specify whether to draw the mouse pointer. Use the value @code{0} to +not draw the pointer. Default value is @code{1}. + +@item framerate +Set the grabbing frame rate. Default value is @code{ntsc}, +corresponding to a frame rate of @code{30000/1001}. + +@item show_region +Show grabbed region on screen. + +If @var{show_region} is specified with @code{1}, then the grabbing +region will be indicated on screen. With this option, it is easy to +know what is being grabbed if only a portion of the screen is grabbed. + +Note that @var{show_region} is incompatible with grabbing the contents +of a single window. + +For example: +@example +ffmpeg -f gdigrab -show_region 1 -framerate 6 -video_size cif -offset_x 10 -offset_y 20 -i desktop out.mpg +@end example + +@item video_size +Set the video frame size. The default is to capture the full screen if @file{desktop} is selected, or the full window size if @file{title=@var{window_title}} is selected. + +@item offset_x +When capturing a region with @var{video_size}, set the distance from the left edge of the screen or desktop. + +Note that the offset calculation is from the top left corner of the primary monitor on Windows. If you have a monitor positioned to the left of your primary monitor, you will need to use a negative @var{offset_x} value to move the region to that monitor. + +@item offset_y +When capturing a region with @var{video_size}, set the distance from the top edge of the screen or desktop. + +Note that the offset calculation is from the top left corner of the primary monitor on Windows. If you have a monitor positioned above your primary monitor, you will need to use a negative @var{offset_y} value to move the region to that monitor. + +@end table + +@section iec61883 + +FireWire DV/HDV input device using libiec61883. + +To enable this input device, you need libiec61883, libraw1394 and +libavc1394 installed on your system. Use the configure option +@code{--enable-libiec61883} to compile with the device enabled. + +The iec61883 capture device supports capturing from a video device +connected via IEEE1394 (FireWire), using libiec61883 and the new Linux +FireWire stack (juju). This is the default DV/HDV input method in Linux +Kernel 2.6.37 and later, since the old FireWire stack was removed. + +Specify the FireWire port to be used as input file, or "auto" +to choose the first port connected. + +@subsection Options + +@table @option + +@item dvtype +Override autodetection of DV/HDV. This should only be used if auto +detection does not work, or if usage of a different device type +should be prohibited. Treating a DV device as HDV (or vice versa) will +not work and result in undefined behavior. +The values @option{auto}, @option{dv} and @option{hdv} are supported. + +@item dvbuffer +Set maximum size of buffer for incoming data, in frames. For DV, this +is an exact value. For HDV, it is not frame exact, since HDV does +not have a fixed frame size. + +@item dvguid +Select the capture device by specifying it's GUID. Capturing will only +be performed from the specified device and fails if no device with the +given GUID is found. This is useful to select the input if multiple +devices are connected at the same time. +Look at /sys/bus/firewire/devices to find out the GUIDs. + +@end table + +@subsection Examples + +@itemize + +@item +Grab and show the input of a FireWire DV/HDV device. +@example +ffplay -f iec61883 -i auto +@end example + +@item +Grab and record the input of a FireWire DV/HDV device, +using a packet buffer of 100000 packets if the source is HDV. +@example +ffmpeg -f iec61883 -i auto -hdvbuffer 100000 out.mpg +@end example + +@end itemize + +@section jack + +JACK input device. + +To enable this input device during configuration you need libjack +installed on your system. + +A JACK input device creates one or more JACK writable clients, one for +each audio channel, with name @var{client_name}:input_@var{N}, where +@var{client_name} is the name provided by the application, and @var{N} +is a number which identifies the channel. +Each writable client will send the acquired data to the FFmpeg input +device. + +Once you have created one or more JACK readable clients, you need to +connect them to one or more JACK writable clients. + +To connect or disconnect JACK clients you can use the @command{jack_connect} +and @command{jack_disconnect} programs, or do it through a graphical interface, +for example with @command{qjackctl}. + +To list the JACK clients and their properties you can invoke the command +@command{jack_lsp}. + +Follows an example which shows how to capture a JACK readable client +with @command{ffmpeg}. +@example +# Create a JACK writable client with name "ffmpeg". +$ ffmpeg -f jack -i ffmpeg -y out.wav + +# Start the sample jack_metro readable client. +$ jack_metro -b 120 -d 0.2 -f 4000 + +# List the current JACK clients. +$ jack_lsp -c +system:capture_1 +system:capture_2 +system:playback_1 +system:playback_2 +ffmpeg:input_1 +metro:120_bpm + +# Connect metro to the ffmpeg writable client. +$ jack_connect metro:120_bpm ffmpeg:input_1 +@end example + +For more information read: +@url{http://jackaudio.org/} + +@subsection Options + +@table @option + +@item channels +Set the number of channels. Default is 2. + +@end table + +@section lavfi + +Libavfilter input virtual device. + +This input device reads data from the open output pads of a libavfilter +filtergraph. + +For each filtergraph open output, the input device will create a +corresponding stream which is mapped to the generated output. Currently +only video data is supported. The filtergraph is specified through the +option @option{graph}. + +@subsection Options + +@table @option + +@item graph +Specify the filtergraph to use as input. Each video open output must be +labelled by a unique string of the form "out@var{N}", where @var{N} is a +number starting from 0 corresponding to the mapped input stream +generated by the device. +The first unlabelled output is automatically assigned to the "out0" +label, but all the others need to be specified explicitly. + +The suffix "+subcc" can be appended to the output label to create an extra +stream with the closed captions packets attached to that output +(experimental; only for EIA-608 / CEA-708 for now). +The subcc streams are created after all the normal streams, in the order of +the corresponding stream. +For example, if there is "out19+subcc", "out7+subcc" and up to "out42", the +stream #43 is subcc for stream #7 and stream #44 is subcc for stream #19. + +If not specified defaults to the filename specified for the input +device. + +@item graph_file +Set the filename of the filtergraph to be read and sent to the other +filters. Syntax of the filtergraph is the same as the one specified by +the option @var{graph}. + +@item dumpgraph +Dump graph to stderr. + +@end table + +@subsection Examples + +@itemize +@item +Create a color video stream and play it back with @command{ffplay}: +@example +ffplay -f lavfi -graph "color=c=pink [out0]" dummy +@end example + +@item +As the previous example, but use filename for specifying the graph +description, and omit the "out0" label: +@example +ffplay -f lavfi color=c=pink +@end example + +@item +Create three different video test filtered sources and play them: +@example +ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3 +@end example + +@item +Read an audio stream from a file using the amovie source and play it +back with @command{ffplay}: +@example +ffplay -f lavfi "amovie=test.wav" +@end example + +@item +Read an audio stream and a video stream and play it back with +@command{ffplay}: +@example +ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]" +@end example + +@item +Dump decoded frames to images and closed captions to a file (experimental): +@example +ffmpeg -f lavfi -i "movie=test.ts[out0+subcc]" -map v frame%08d.png -map s -c copy -f rawvideo subcc.bin +@end example + +@end itemize + +@section libcdio + +Audio-CD input device based on libcdio. + +To enable this input device during configuration you need libcdio +installed on your system. It requires the configure option +@code{--enable-libcdio}. + +This device allows playing and grabbing from an Audio-CD. + +For example to copy with @command{ffmpeg} the entire Audio-CD in @file{/dev/sr0}, +you may run the command: +@example +ffmpeg -f libcdio -i /dev/sr0 cd.wav +@end example + +@subsection Options +@table @option +@item speed +Set drive reading speed. Default value is 0. + +The speed is specified CD-ROM speed units. The speed is set through +the libcdio @code{cdio_cddap_speed_set} function. On many CD-ROM +drives, specifying a value too large will result in using the fastest +speed. + +@item paranoia_mode +Set paranoia recovery mode flags. It accepts one of the following values: + +@table @samp +@item disable +@item verify +@item overlap +@item neverskip +@item full +@end table + +Default value is @samp{disable}. + +For more information about the available recovery modes, consult the +paranoia project documentation. +@end table + +@section libdc1394 + +IIDC1394 input device, based on libdc1394 and libraw1394. + +Requires the configure option @code{--enable-libdc1394}. + +@section openal + +The OpenAL input device provides audio capture on all systems with a +working OpenAL 1.1 implementation. + +To enable this input device during configuration, you need OpenAL +headers and libraries installed on your system, and need to configure +FFmpeg with @code{--enable-openal}. + +OpenAL headers and libraries should be provided as part of your OpenAL +implementation, or as an additional download (an SDK). Depending on your +installation you may need to specify additional flags via the +@code{--extra-cflags} and @code{--extra-ldflags} for allowing the build +system to locate the OpenAL headers and libraries. + +An incomplete list of OpenAL implementations follows: + +@table @strong +@item Creative +The official Windows implementation, providing hardware acceleration +with supported devices and software fallback. +See @url{http://openal.org/}. +@item OpenAL Soft +Portable, open source (LGPL) software implementation. Includes +backends for the most common sound APIs on the Windows, Linux, +Solaris, and BSD operating systems. +See @url{http://kcat.strangesoft.net/openal.html}. +@item Apple +OpenAL is part of Core Audio, the official Mac OS X Audio interface. +See @url{http://developer.apple.com/technologies/mac/audio-and-video.html} +@end table + +This device allows one to capture from an audio input device handled +through OpenAL. + +You need to specify the name of the device to capture in the provided +filename. If the empty string is provided, the device will +automatically select the default device. You can get the list of the +supported devices by using the option @var{list_devices}. + +@subsection Options + +@table @option + +@item channels +Set the number of channels in the captured audio. Only the values +@option{1} (monaural) and @option{2} (stereo) are currently supported. +Defaults to @option{2}. + +@item sample_size +Set the sample size (in bits) of the captured audio. Only the values +@option{8} and @option{16} are currently supported. Defaults to +@option{16}. + +@item sample_rate +Set the sample rate (in Hz) of the captured audio. +Defaults to @option{44.1k}. + +@item list_devices +If set to @option{true}, print a list of devices and exit. +Defaults to @option{false}. + +@end table + +@subsection Examples + +Print the list of OpenAL supported devices and exit: +@example +$ ffmpeg -list_devices true -f openal -i dummy out.ogg +@end example + +Capture from the OpenAL device @file{DR-BT101 via PulseAudio}: +@example +$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out.ogg +@end example + +Capture from the default device (note the empty string '' as filename): +@example +$ ffmpeg -f openal -i '' out.ogg +@end example + +Capture from two devices simultaneously, writing to two different files, +within the same @command{ffmpeg} command: +@example +$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out1.ogg -f openal -i 'ALSA Default' out2.ogg +@end example +Note: not all OpenAL implementations support multiple simultaneous capture - +try the latest OpenAL Soft if the above does not work. + +@section oss + +Open Sound System input device. + +The filename to provide to the input device is the device node +representing the OSS input device, and is usually set to +@file{/dev/dsp}. + +For example to grab from @file{/dev/dsp} using @command{ffmpeg} use the +command: +@example +ffmpeg -f oss -i /dev/dsp /tmp/oss.wav +@end example + +For more information about OSS see: +@url{http://manuals.opensound.com/usersguide/dsp.html} + +@subsection Options + +@table @option + +@item sample_rate +Set the sample rate in Hz. Default is 48000. + +@item channels +Set the number of channels. Default is 2. + +@end table + + +@section pulse + +PulseAudio input device. + +To enable this output device you need to configure FFmpeg with @code{--enable-libpulse}. + +The filename to provide to the input device is a source device or the +string "default" + +To list the PulseAudio source devices and their properties you can invoke +the command @command{pactl list sources}. + +More information about PulseAudio can be found on @url{http://www.pulseaudio.org}. + +@subsection Options +@table @option +@item server +Connect to a specific PulseAudio server, specified by an IP address. +Default server is used when not provided. + +@item name +Specify the application name PulseAudio will use when showing active clients, +by default it is the @code{LIBAVFORMAT_IDENT} string. + +@item stream_name +Specify the stream name PulseAudio will use when showing active streams, +by default it is "record". + +@item sample_rate +Specify the samplerate in Hz, by default 48kHz is used. + +@item channels +Specify the channels in use, by default 2 (stereo) is set. + +@item frame_size +Specify the number of bytes per frame, by default it is set to 1024. + +@item fragment_size +Specify the minimal buffering fragment in PulseAudio, it will affect the +audio latency. By default it is unset. + +@item wallclock +Set the initial PTS using the current time. Default is 1. + +@end table + +@subsection Examples +Record a stream from default device: +@example +ffmpeg -f pulse -i default /tmp/pulse.wav +@end example + +@section qtkit + +QTKit input device. + +The filename passed as input is parsed to contain either a device name or index. +The device index can also be given by using -video_device_index. +A given device index will override any given device name. +If the desired device consists of numbers only, use -video_device_index to identify it. +The default device will be chosen if an empty string or the device name "default" is given. +The available devices can be enumerated by using -list_devices. + +@example +ffmpeg -f qtkit -i "0" out.mpg +@end example + +@example +ffmpeg -f qtkit -video_device_index 0 -i "" out.mpg +@end example + +@example +ffmpeg -f qtkit -i "default" out.mpg +@end example + +@example +ffmpeg -f qtkit -list_devices true -i "" +@end example + +@subsection Options + +@table @option + +@item frame_rate +Set frame rate. Default is 30. + +@item list_devices +If set to @code{true}, print a list of devices and exit. Default is +@code{false}. + +@item video_device_index +Select the video device by index for devices with the same name (starts at 0). + +@end table + +@section sndio + +sndio input device. + +To enable this input device during configuration you need libsndio +installed on your system. + +The filename to provide to the input device is the device node +representing the sndio input device, and is usually set to +@file{/dev/audio0}. + +For example to grab from @file{/dev/audio0} using @command{ffmpeg} use the +command: +@example +ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav +@end example + +@subsection Options + +@table @option + +@item sample_rate +Set the sample rate in Hz. Default is 48000. + +@item channels +Set the number of channels. Default is 2. + +@end table + +@section video4linux2, v4l2 + +Video4Linux2 input video device. + +"v4l2" can be used as alias for "video4linux2". + +If FFmpeg is built with v4l-utils support (by using the +@code{--enable-libv4l2} configure option), it is possible to use it with the +@code{-use_libv4l2} input device option. + +The name of the device to grab is a file device node, usually Linux +systems tend to automatically create such nodes when the device +(e.g. an USB webcam) is plugged into the system, and has a name of the +kind @file{/dev/video@var{N}}, where @var{N} is a number associated to +the device. + +Video4Linux2 devices usually support a limited set of +@var{width}x@var{height} sizes and frame rates. You can check which are +supported using @command{-list_formats all} for Video4Linux2 devices. +Some devices, like TV cards, support one or more standards. It is possible +to list all the supported standards using @command{-list_standards all}. + +The time base for the timestamps is 1 microsecond. Depending on the kernel +version and configuration, the timestamps may be derived from the real time +clock (origin at the Unix Epoch) or the monotonic clock (origin usually at +boot time, unaffected by NTP or manual changes to the clock). The +@option{-timestamps abs} or @option{-ts abs} option can be used to force +conversion into the real time clock. + +Some usage examples of the video4linux2 device with @command{ffmpeg} +and @command{ffplay}: +@itemize +@item +List supported formats for a video4linux2 device: +@example +ffplay -f video4linux2 -list_formats all /dev/video0 +@end example + +@item +Grab and show the input of a video4linux2 device: +@example +ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0 +@end example + +@item +Grab and record the input of a video4linux2 device, leave the +frame rate and size as previously set: +@example +ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg +@end example +@end itemize + +For more information about Video4Linux, check @url{http://linuxtv.org/}. + +@subsection Options + +@table @option +@item standard +Set the standard. Must be the name of a supported standard. To get a +list of the supported standards, use the @option{list_standards} +option. + +@item channel +Set the input channel number. Default to -1, which means using the +previously selected channel. + +@item video_size +Set the video frame size. The argument must be a string in the form +@var{WIDTH}x@var{HEIGHT} or a valid size abbreviation. + +@item pixel_format +Select the pixel format (only valid for raw video input). + +@item input_format +Set the preferred pixel format (for raw video) or a codec name. +This option allows one to select the input format, when several are +available. + +@item framerate +Set the preferred video frame rate. + +@item list_formats +List available formats (supported pixel formats, codecs, and frame +sizes) and exit. + +Available values are: +@table @samp +@item all +Show all available (compressed and non-compressed) formats. + +@item raw +Show only raw video (non-compressed) formats. + +@item compressed +Show only compressed formats. +@end table + +@item list_standards +List supported standards and exit. + +Available values are: +@table @samp +@item all +Show all supported standards. +@end table + +@item timestamps, ts +Set type of timestamps for grabbed frames. + +Available values are: +@table @samp +@item default +Use timestamps from the kernel. + +@item abs +Use absolute timestamps (wall clock). + +@item mono2abs +Force conversion from monotonic to absolute timestamps. +@end table + +Default value is @code{default}. + +@item use_libv4l2 +Use libv4l2 (v4l-utils) conversion functions. Default is 0. + +@end table + +@section vfwcap + +VfW (Video for Windows) capture input device. + +The filename passed as input is the capture driver number, ranging from +0 to 9. You may use "list" as filename to print a list of drivers. Any +other filename will be interpreted as device number 0. + +@subsection Options + +@table @option + +@item video_size +Set the video frame size. + +@item framerate +Set the grabbing frame rate. Default value is @code{ntsc}, +corresponding to a frame rate of @code{30000/1001}. + +@end table + +@section x11grab + +X11 video input device. + +To enable this input device during configuration you need libxcb +installed on your system. It will be automatically detected during +configuration. + +Alternatively, the configure option @option{--enable-x11grab} exists +for legacy Xlib users. + +This device allows one to capture a region of an X11 display. + +The filename passed as input has the syntax: +@example +[@var{hostname}]:@var{display_number}.@var{screen_number}[+@var{x_offset},@var{y_offset}] +@end example + +@var{hostname}:@var{display_number}.@var{screen_number} specifies the +X11 display name of the screen to grab from. @var{hostname} can be +omitted, and defaults to "localhost". The environment variable +@env{DISPLAY} contains the default display name. + +@var{x_offset} and @var{y_offset} specify the offsets of the grabbed +area with respect to the top-left border of the X11 screen. They +default to 0. + +Check the X11 documentation (e.g. @command{man X}) for more detailed +information. + +Use the @command{xdpyinfo} program for getting basic information about +the properties of your X11 display (e.g. grep for "name" or +"dimensions"). + +For example to grab from @file{:0.0} using @command{ffmpeg}: +@example +ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0 out.mpg +@end example + +Grab at position @code{10,20}: +@example +ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0+10,20 out.mpg +@end example + +@subsection Options + +@table @option +@item draw_mouse +Specify whether to draw the mouse pointer. A value of @code{0} specify +not to draw the pointer. Default value is @code{1}. + +@item follow_mouse +Make the grabbed area follow the mouse. The argument can be +@code{centered} or a number of pixels @var{PIXELS}. + +When it is specified with "centered", the grabbing region follows the mouse +pointer and keeps the pointer at the center of region; otherwise, the region +follows only when the mouse pointer reaches within @var{PIXELS} (greater than +zero) to the edge of region. + +For example: +@example +ffmpeg -f x11grab -follow_mouse centered -framerate 25 -video_size cif -i :0.0 out.mpg +@end example + +To follow only when the mouse pointer reaches within 100 pixels to edge: +@example +ffmpeg -f x11grab -follow_mouse 100 -framerate 25 -video_size cif -i :0.0 out.mpg +@end example + +@item framerate +Set the grabbing frame rate. Default value is @code{ntsc}, +corresponding to a frame rate of @code{30000/1001}. + +@item show_region +Show grabbed region on screen. + +If @var{show_region} is specified with @code{1}, then the grabbing +region will be indicated on screen. With this option, it is easy to +know what is being grabbed if only a portion of the screen is grabbed. + +@item region_border +Set the region border thickness if @option{-show_region 1} is used. +Range is 1 to 128 and default is 3 (XCB-based x11grab only). + +For example: +@example +ffmpeg -f x11grab -show_region 1 -framerate 25 -video_size cif -i :0.0+10,20 out.mpg +@end example + +With @var{follow_mouse}: +@example +ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_size cif -i :0.0 out.mpg +@end example + +@item video_size +Set the video frame size. Default value is @code{vga}. + +@item use_shm +Use the MIT-SHM extension for shared memory. Default value is @code{1}. +It may be necessary to disable it for remote displays (legacy x11grab +only). + +@item grab_x +@item grab_y +Set the grabbing region coordinates. They are expressed as offset from +the top left corner of the X11 window and correspond to the +@var{x_offset} and @var{y_offset} parameters in the device name. The +default value for both options is 0. +@end table + +@c man end INPUT DEVICES
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/issue_tracker.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/issue_tracker.txt new file mode 100644 index 0000000..e8e8530 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/issue_tracker.txt
@@ -0,0 +1,218 @@ +FFmpeg's bug/feature request tracker manual +================================================= + +Overview: +--------- + +FFmpeg uses Trac for tracking issues, new issues and changes to +existing issues can be done through a web interface. + +Issues can be different kinds of things we want to keep track of +but that do not belong into the source tree itself. This includes +bug reports, feature requests and license violations. We +might add more items to this list in the future, so feel free to +propose a new `type of issue' on the ffmpeg-devel mailing list if +you feel it is worth tracking. + +It is possible to subscribe to individual issues by adding yourself to the +Cc list or to subscribe to the ffmpeg-trac mailing list which receives +a mail for every change to every issue. +(the above does all work already after light testing) + +The subscription URL for the ffmpeg-trac list is: +https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-trac +The URL of the webinterface of the tracker is: +https://trac.ffmpeg.org + +Type: +----- +art + Artwork such as photos, music, banners, and logos. + +bug / defect + An error, flaw, mistake, failure, or fault in FFmpeg or libav* that + prevents it from behaving as intended. + +feature request / enhancement + Request of support for encoding or decoding of a new codec, container + or variant. + Request of support for more, less or plain different output or behavior + where the current implementation cannot be considered wrong. + +license violation + Ticket to keep track of (L)GPL violations of ffmpeg by others. + +sponsoring request + Developer requests for hardware, software, specifications, money, + refunds, etc. + +task + A task/reminder such as setting up a FATE client, adding filters to + Trac, etc. + +Priority: +--------- +critical + Bugs about data loss and security issues. + No feature request can be critical. + +important + Bugs which make FFmpeg unusable for a significant number of users. + Examples here might be completely broken MPEG-4 decoding or a build issue + on Linux. + While broken 4xm decoding or a broken OS/2 build would not be important, + the separation to normal is somewhat fuzzy. + For feature requests this priority would be used for things many people + want. + Regressions also should be marked as important, regressions are bugs that + don't exist in a past revision or another branch. + +normal + Default setting. Use this if the bug does not match the other + priorities or if you are unsure of what priority to choose. + +minor + Bugs about things like spelling errors, "mp2" instead of + "mp3" being shown and such. + Feature requests about things few people want or which do not make a big + difference. + +wish + Something that is desirable to have but that there is no urgency at + all to implement, e.g. something completely cosmetic like a website + restyle or a personalized doxy template or the FFmpeg logo. + This priority is not valid for bugs. + + +Status: +------- +new + initial state + +open + intermediate states + +closed + final state + + +Analyzed flag: +-------------- +Bugs which have been analyzed and where it is understood what causes them +and which exact chain of events triggers them. This analysis should be +available as a message in the bug report. +Note, do not change the status to analyzed without also providing a clear +and understandable analysis. +This state implicates that the bug either has been reproduced or that +reproduction is not needed as the bug is already understood. + + +Type/Status: +---------- +*/new + Initial state of new bugs and feature requests submitted by + users. + +*/open + Issues which have been briefly looked at and which did not look outright + invalid. + This implicates that no real more detailed state applies yet. Conversely, + the more detailed states below implicate that the issue has been briefly + looked at. + +*/closed/duplicate + Bugs or feature requests which are duplicates. + Note, if you mark something as duplicate, do not forget setting the + superseder so bug reports are properly linked. + +*/closed/invalid + Bugs caused by user errors, random ineligible or otherwise nonsense stuff. + +*/closed/needs_more_info + Issues for which some information has been requested by the developers, + but which has not been provided by anyone within reasonable time. + + +bug/closed/fixed + Bugs which have to the best of our knowledge been fixed. + +bug/closed/wontfix + Bugs which we will not fix. Possible reasons include legality, high + complexity for the sake of supporting obscure corner cases, speed loss + for similarly esoteric purposes, et cetera. + This also means that we would reject a patch. + If we are just too lazy to fix a bug then the correct state is open + and unassigned. Closed means that the case is closed which is not + the case if we are just waiting for a patch. + +bug/closed/works_for_me + Bugs for which sufficient information was provided to reproduce but + reproduction failed - that is the code seems to work correctly to the + best of our knowledge. + +feature_request/closed/fixed + Feature requests which have been implemented. + +feature_request/closed/wontfix + Feature requests which will not be implemented. The reasons here could + be legal, philosophical or others. + +Note2, if you provide the requested info do not forget to remove the +needs_more_info resolution. + +Component: +---------- + +avcodec + issues in libavcodec/* + +avdevice + issues in libavdevice/* + +avfilter + issues in libavfilter/* + +avformat + issues in libavformat/* + +avutil + issues in libavutil/* + +build system + issues in or related to configure/Makefile + +documentation + issues in or related to doc/* + +ffmpeg + issues in or related to ffmpeg.c + +ffplay + issues in or related to ffplay.c + +ffprobe + issues in or related to ffprobe.c + +ffserver + issues in or related to ffserver.c + +postproc + issues in libpostproc/* + +swresample + issues in libswresample/* + +swscale + issues in libswscale/* + +trac + issues related to our issue tracker + +undetermined + default component; choose this if unsure + +website + issues related to the website + +wiki + issues related to the wiki
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavcodec.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavcodec.texi new file mode 100644 index 0000000..87b90db --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavcodec.texi
@@ -0,0 +1,49 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libavcodec Documentation +@titlepage +@center @titlefont{Libavcodec Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libavcodec library provides a generic encoding/decoding framework +and contains multiple decoders and encoders for audio, video and +subtitle streams, and several bitstream filters. + +The shared architecture provides various services ranging from bit +stream I/O to DSP optimizations, and makes it suitable for +implementing robust and fast codecs as well as for experimentation. + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-codecs.html,ffmpeg-codecs}, @url{ffmpeg-bitstream-filters.html,bitstream-filters}, +@url{libavutil.html,libavutil} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), +libavutil(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libavcodec +@settitle media streams decoding and encoding library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavdevice.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavdevice.texi new file mode 100644 index 0000000..9b10282 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavdevice.texi
@@ -0,0 +1,46 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libavdevice Documentation +@titlepage +@center @titlefont{Libavdevice Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libavdevice library provides a generic framework for grabbing from +and rendering to many common multimedia input/output devices, and +supports several input and output devices, including Video4Linux2, +VfW, DShow, and ALSA. + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-devices.html,ffmpeg-devices}, +@url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-devices(1), +libavutil(3), libavcodec(3), libavformat(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libavdevice +@settitle multimedia device handling library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavfilter.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavfilter.texi new file mode 100644 index 0000000..52e0753 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavfilter.texi
@@ -0,0 +1,45 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libavfilter Documentation +@titlepage +@center @titlefont{Libavfilter Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libavfilter library provides a generic audio/video filtering +framework containing several filters, sources and sinks. + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-filters.html,ffmpeg-filters}, +@url{libavutil.html,libavutil}, @url{libswscale.html,libswscale}, @url{libswresample.html,libswresample}, +@url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat}, @url{libavdevice.html,libavdevice} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-filters(1), +libavutil(3), libswscale(3), libswresample(3), libavcodec(3), libavformat(3), libavdevice(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libavfilter +@settitle multimedia filtering library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavformat.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavformat.texi new file mode 100644 index 0000000..d505d64 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavformat.texi
@@ -0,0 +1,49 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libavformat Documentation +@titlepage +@center @titlefont{Libavformat Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libavformat library provides a generic framework for multiplexing +and demultiplexing (muxing and demuxing) audio, video and subtitle +streams. It encompasses multiple muxers and demuxers for multimedia +container formats. + +It also supports several input and output protocols to access a media +resource. + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-formats.html,ffmpeg-formats}, @url{ffmpeg-protocols.html,ffmpeg-protocols}, +@url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-formats(1), ffmpeg-protocols(1), +libavutil(3), libavcodec(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libavformat +@settitle multimedia muxing and demuxing library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavutil.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavutil.texi new file mode 100644 index 0000000..7a1c332 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libavutil.texi
@@ -0,0 +1,63 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libavutil Documentation +@titlepage +@center @titlefont{Libavutil Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libavutil library is a utility library to aid portable +multimedia programming. It contains safe portable string functions, +random number generators, data structures, additional mathematics +functions, cryptography and multimedia related functionality (like +enumerations for pixel and sample formats). It is not a library for +code needed by both libavcodec and libavformat. + +The goals for this library is to be: + +@table @strong +@item Modular +It should have few interdependencies and the possibility of disabling individual +parts during @command{./configure}. + +@item Small +Both sources and objects should be small. + +@item Efficient +It should have low CPU and memory usage. + +@item Useful +It should avoid useless features that almost no one needs. +@end table + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-utils.html,ffmpeg-utils} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-utils(1) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libavutil +@settitle multimedia-biased utility library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libswresample.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libswresample.texi new file mode 100644 index 0000000..bb57278 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libswresample.texi
@@ -0,0 +1,71 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libswresample Documentation +@titlepage +@center @titlefont{Libswresample Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libswresample library performs highly optimized audio resampling, +rematrixing and sample format conversion operations. + +Specifically, this library performs the following conversions: + +@itemize +@item +@emph{Resampling}: is the process of changing the audio rate, for +example from a high sample rate of 44100Hz to 8000Hz. Audio +conversion from high to low sample rate is a lossy process. Several +resampling options and algorithms are available. + +@item +@emph{Format conversion}: is the process of converting the type of +samples, for example from 16-bit signed samples to unsigned 8-bit or +float samples. It also handles packing conversion, when passing from +packed layout (all samples belonging to distinct channels interleaved +in the same buffer), to planar layout (all samples belonging to the +same channel stored in a dedicated buffer or "plane"). + +@item +@emph{Rematrixing}: is the process of changing the channel layout, for +example from stereo to mono. When the input channels cannot be mapped +to the output streams, the process is lossy, since it involves +different gain factors and mixing. +@end itemize + +Various other audio conversions (e.g. stretching and padding) are +enabled through dedicated options. + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-resampler.html,ffmpeg-resampler}, +@url{libavutil.html,libavutil} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-resampler(1), +libavutil(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libswresample +@settitle audio resampling library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libswscale.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libswscale.texi new file mode 100644 index 0000000..757fd24 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/libswscale.texi
@@ -0,0 +1,64 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Libswscale Documentation +@titlepage +@center @titlefont{Libswscale Documentation} +@end titlepage + +@top + +@contents + +@chapter Description +@c man begin DESCRIPTION + +The libswscale library performs highly optimized image scaling and +colorspace and pixel format conversion operations. + +Specifically, this library performs the following conversions: + +@itemize +@item +@emph{Rescaling}: is the process of changing the video size. Several +rescaling options and algorithms are available. This is usually a +lossy process. + +@item +@emph{Pixel format conversion}: is the process of converting the image +format and colorspace of the image, for example from planar YUV420P to +RGB24 packed. It also handles packing conversion, that is converts +from packed layout (all pixels belonging to distinct planes +interleaved in the same buffer), to planar layout (all samples +belonging to the same plane stored in a dedicated buffer or "plane"). + +This is usually a lossy process in case the source and destination +colorspaces differ. +@end itemize + +@c man end DESCRIPTION + +@chapter See Also + +@ifhtml +@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, +@url{ffmpeg-scaler.html,ffmpeg-scaler}, +@url{libavutil.html,libavutil} +@end ifhtml + +@ifnothtml +ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), +ffmpeg-scaler(1), +libavutil(3) +@end ifnothtml + +@include authors.texi + +@ignore + +@setfilename libswscale +@settitle video scaling and pixel format conversion library + +@end ignore + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/metadata.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/metadata.texi new file mode 100644 index 0000000..bddcc99 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/metadata.texi
@@ -0,0 +1,88 @@ +@chapter Metadata +@c man begin 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. + +The file format is as follows: +@enumerate + +@item +A file consists of a header and a number of metadata tags divided into sections, +each on its own line. + +@item +The header is a @samp{;FFMETADATA} string, followed by a version number (now 1). + +@item +Metadata tags are of the form @samp{key=value} + +@item +Immediately after header follows global metadata + +@item +After global metadata there may be sections with per-stream/per-chapter +metadata. + +@item +A section starts with the section name in uppercase (i.e. STREAM or CHAPTER) in +brackets (@samp{[}, @samp{]}) and ends with next section or end of file. + +@item +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 +@samp{TIMEBASE=@var{num}/@var{den}}, where @var{num} and @var{den} are +integers. If the timebase is missing then start/end times are assumed to +be in milliseconds. + +Next a chapter section must contain chapter start and end times in form +@samp{START=@var{num}}, @samp{END=@var{num}}, where @var{num} is a positive +integer. + +@item +Empty lines and lines starting with @samp{;} or @samp{#} are ignored. + +@item +Metadata keys or values containing special characters (@samp{=}, @samp{;}, +@samp{#}, @samp{\} and a newline) must be escaped with a backslash @samp{\}. + +@item +Note that whitespace in metadata (e.g. @samp{foo = bar}) is considered to be +a part of the tag (in the example above key is @samp{foo }, value is +@samp{ bar}). +@end enumerate + +A ffmetadata file might look like this: +@example +;FFMETADATA1 +title=bike\\shed +;this is a comment +artist=FFmpeg troll team + +[CHAPTER] +TIMEBASE=1/1000 +START=0 +#chapter ends at 0:01:00 +END=60000 +title=chapter \#1 +[STREAM] +title=multi\ +line +@end example + +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. + +Extracting an ffmetadata file with @file{ffmpeg} goes as follows: +@example +ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE +@end example + +Reinserting edited metadata information from the FFMETADATAFILE file can +be done as: +@example +ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT +@end example + +@c man end METADATA
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/mips.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/mips.txt new file mode 100644 index 0000000..a84e89a --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/mips.txt
@@ -0,0 +1,79 @@ +MIPS optimizations info +=============================================== + +MIPS optimizations of codecs are targeting MIPS 74k family of +CPUs. Some of these optimizations are relying more on properties of +this architecture and some are relying less (and can be used on most +MIPS architectures without degradation in performance). + +Along with FFMPEG copyright notice, there is MIPS copyright notice in +all the files that are created by people from MIPS Technologies. + +Example of copyright notice: +=============================================== +/* + * Copyright (c) 2012 + * MIPS Technologies, Inc., California. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Author Name (author_name@@mips.com) + */ + +Files that have MIPS copyright notice in them: +=============================================== +* libavutil/mips/ + float_dsp_mips.c + libm_mips.h + softfloat_tables.h +* libavcodec/ + fft_fixed_32.c + fft_init_table.c + fft_table.h + mdct_fixed_32.c +* libavcodec/mips/ + aacdec_fixed.c + aacsbr_fixed.c + aacsbr_template.c + aaccoder_mips.c + aacpsy_mips.h + ac3dsp_mips.c + acelp_filters_mips.c + acelp_vectors_mips.c + amrwbdec_mips.c + amrwbdec_mips.h + celp_filters_mips.c + celp_math_mips.c + compute_antialias_fixed.h + compute_antialias_float.h + lsp_mips.h + dsputil_mips.c + fft_mips.c + fft_table.h + fft_init_table.c + fmtconvert_mips.c + iirfilter_mips.c + mpegaudiodsp_mips_fixed.c + mpegaudiodsp_mips_float.c
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/multithreading.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/multithreading.txt new file mode 100644 index 0000000..83849de --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/multithreading.txt
@@ -0,0 +1,70 @@ +FFmpeg multithreading methods +============================================== + +FFmpeg provides two methods for multithreading codecs. + +Slice threading decodes multiple parts of a frame at the same time, using +AVCodecContext execute() and execute2(). + +Frame threading decodes multiple frames at the same time. +It accepts N future frames and delays decoded pictures by N-1 frames. +The later frames are decoded in separate threads while the user is +displaying the current one. + +Restrictions on clients +============================================== + +Slice threading - +* The client's draw_horiz_band() must be thread-safe according to the comment + in avcodec.h. + +Frame threading - +* Restrictions with slice threading also apply. +* For best performance, the client should set thread_safe_callbacks if it + provides a thread-safe get_buffer() callback. +* There is one frame of delay added for every thread beyond the first one. + Clients must be able to handle this; the pkt_dts and pkt_pts fields in + AVFrame will work as usual. + +Restrictions on codec implementations +============================================== + +Slice threading - + None except that there must be something worth executing in parallel. + +Frame threading - +* Codecs can only accept entire pictures per packet. +* Codecs similar to ffv1, whose streams don't reset across frames, + will not work because their bitstreams cannot be decoded in parallel. + +* The contents of buffers must not be read before ff_thread_await_progress() + has been called on them. reget_buffer() and buffer age optimizations no longer work. +* The contents of buffers must not be written to after ff_thread_report_progress() + has been called on them. This includes draw_edges(). + +Porting codecs to frame threading +============================================== + +Find all context variables that are needed by the next frame. Move all +code changing them, as well as code calling get_buffer(), up to before +the decode process starts. Call ff_thread_finish_setup() afterwards. If +some code can't be moved, have update_thread_context() run it in the next +thread. + +If the codec allocates writable tables in its init(), add an init_thread_copy() +which re-allocates them for other threads. + +Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little +speed gain at this point but it should work. + +If there are inter-frame dependencies, so the codec calls +ff_thread_report/await_progress(), set AVCodecInternal.allocate_progress. The +frames must then be freed with ff_thread_release_buffer(). +Otherwise leave it at zero and decode directly into the user-supplied frames. + +Call ff_thread_report_progress() after some part of the current picture has decoded. +A good place to put this is where draw_horiz_band() is called - add this if it isn't +called anywhere, as it's useful too and the implementation is trivial when you're +doing this. Note that draw_edges() needs to be called before reporting progress. + +Before accessing a reference frame or its MVs, call ff_thread_await_progress().
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/muxers.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/muxers.texi new file mode 100644 index 0000000..2e6bb4c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/muxers.texi
@@ -0,0 +1,1484 @@ +@chapter Muxers +@c man begin MUXERS + +Muxers are configured elements in FFmpeg which allow writing +multimedia streams to a particular type of file. + +When you configure your FFmpeg build, all the supported muxers +are enabled by default. You can list all available muxers using the +configure option @code{--list-muxers}. + +You can disable all the muxers with the configure option +@code{--disable-muxers} and selectively enable / disable single muxers +with the options @code{--enable-muxer=@var{MUXER}} / +@code{--disable-muxer=@var{MUXER}}. + +The option @code{-formats} of the ff* tools will display the list of +enabled muxers. + +A description of some of the currently available muxers follows. + +@anchor{aiff} +@section aiff + +Audio Interchange File Format muxer. + +@subsection Options + +It accepts the following options: + +@table @option +@item write_id3v2 +Enable ID3v2 tags writing when set to 1. Default is 0 (disabled). + +@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. + +@end table + +@anchor{asf} +@section asf + +Advanced Systems Format muxer. + +Note that Windows Media Audio (wma) and Windows Media Video (wmv) use this +muxer too. + +@subsection Options + +It accepts the following options: + +@table @option +@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. + +@end table + +@anchor{chromaprint} +@section chromaprint + +Chromaprint fingerprinter + +This muxer feeds audio data to the Chromaprint library, which generates +a fingerprint for the provided audio data. It takes a single signed +native-endian 16-bit raw audio stream. + +@subsection Options + +@table @option +@item silence_threshold +Threshold for detecting silence, ranges from 0 to 32767. -1 for default +(required for use with the AcoustID service). + +@item algorithm +Algorithm index to fingerprint with. + +@item fp_format +Format to output the fingerprint as. Accepts the following options: +@table @samp +@item raw +Binary raw fingerprint + +@item compressed +Binary compressed fingerprint + +@item base64 +Base64 compressed fingerprint + +@end table + +@end table + +@anchor{crc} +@section crc + +CRC (Cyclic Redundancy Check) testing format. + +This muxer computes and prints the Adler-32 CRC 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 +CRC. + +The output of the muxer consists of a single line of the form: +CRC=0x@var{CRC}, where @var{CRC} is a hexadecimal number 0-padded to +8 digits containing the CRC for all the decoded input frames. + +See also the @ref{framecrc} muxer. + +@subsection Examples + +For example to compute the CRC of the input, and store it in the file +@file{out.crc}: +@example +ffmpeg -i INPUT -f crc out.crc +@end example + +You can print the CRC to stdout with the command: +@example +ffmpeg -i INPUT -f crc - +@end example + +You can select the output format of each frame with @command{ffmpeg} by +specifying the audio and video codec and format. For example to +compute the CRC of the input audio converted to PCM unsigned 8-bit +and the input video converted to MPEG-2 video, use the command: +@example +ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc - +@end example + +@anchor{framecrc} +@section framecrc + +Per-packet CRC (Cyclic Redundancy Check) testing format. + +This muxer computes and prints the Adler-32 CRC 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 +CRC. + +The output of the muxer consists of a line for each audio and video +packet of the form: +@example +@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, 0x@var{CRC} +@end example + +@var{CRC} is a hexadecimal number 0-padded to 8 digits containing the +CRC of the packet. + +@subsection Examples + +For example to compute the CRC of the audio and video frames in +@file{INPUT}, converted to raw audio and video packets, and store it +in the file @file{out.crc}: +@example +ffmpeg -i INPUT -f framecrc out.crc +@end example + +To print the information to stdout, use the command: +@example +ffmpeg -i INPUT -f framecrc - +@end example + +With @command{ffmpeg}, you can select the output format to which the +audio and video frames are encoded before computing the CRC for each +packet by specifying the audio and video codec. For example, to +compute the CRC of each decoded input audio frame converted to PCM +unsigned 8-bit and of each decoded input video frame converted to +MPEG-2 video, use the command: +@example +ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc - +@end example + +See also the @ref{crc} muxer. + +@anchor{framemd5} +@section framemd5 + +Per-packet MD5 testing format. + +This muxer computes and prints the MD5 hash 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 +hash. + +The output of the muxer consists of a line for each audio and video +packet of the form: +@example +@var{stream_index}, @var{packet_dts}, @var{packet_pts}, @var{packet_duration}, @var{packet_size}, @var{MD5} +@end example + +@var{MD5} is a hexadecimal number representing the computed MD5 hash +for the packet. + +@subsection Examples + +For example to compute the MD5 of the audio and video frames in +@file{INPUT}, converted to raw audio and video packets, and store it +in the file @file{out.md5}: +@example +ffmpeg -i INPUT -f framemd5 out.md5 +@end example + +To print the information to stdout, use the command: +@example +ffmpeg -i INPUT -f framemd5 - +@end example + +See also the @ref{md5} muxer. + +@anchor{gif} +@section gif + +Animated GIF muxer. + +It accepts the following options: + +@table @option +@item loop +Set the number of times to loop the output. Use @code{-1} for no loop, @code{0} +for looping indefinitely (default). + +@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 @code{-1}, 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. +@end table + +For example, to encode a gif looping 10 times, with a 5 seconds delay between +the loops: +@example +ffmpeg -i INPUT -loop 10 -final_delay 500 out.gif +@end example + +Note 1: if you wish to extract the frames in separate GIF files, you need to +force the @ref{image2} muxer: +@example +ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif" +@end example + +Note 2: the GIF format has a very small time base: the delay between two frames +can not be smaller than one centi second. + +@anchor{hls} +@section hls + +Apple HTTP Live Streaming muxer that segments MPEG-TS according to +the HTTP Live Streaming (HLS) specification. + +It creates a playlist file, and one or more segment files. The output filename +specifies the playlist filename. + +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. + +For example, to convert an input file with @command{ffmpeg}: +@example +ffmpeg -i in.nut out.m3u8 +@end example +This example will produce the playlist, @file{out.m3u8}, and segment files: +@file{out0.ts}, @file{out1.ts}, @file{out2.ts}, etc. + +See also the @ref{segment} muxer, which provides a more generic and +flexible implementation of a segmenter, and can be used to perform HLS +segmentation. + +@subsection Options + +This muxer supports the following options: + +@table @option +@item hls_time @var{seconds} +Set the segment length in seconds. Default value is 2. + +@item hls_list_size @var{size} +Set the maximum number of playlist entries. If set to 0 the list file +will contain all the segments. Default value is 5. + +@item hls_ts_options @var{options_list} +Set output format options using a :-separated list of key=value +parameters. Values containing @code{:} special characters must be +escaped. + +@item hls_wrap @var{wrap} +Set the number after which the segment filename number (the number +specified in each segment file) wraps. If set to 0 the number will be +never wrapped. Default value is 0. + +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 @var{wrap}. + +@item start_number @var{number} +Start the playlist sequence number from @var{number}. Default value is +0. + +@item hls_allow_cache @var{allowcache} +Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments. + +@item hls_base_url @var{baseurl} +Append @var{baseurl} to every entry in the playlist. +Useful to generate playlists with absolute paths. + +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 @option{wrap} option is +specified. + +@item hls_segment_filename @var{filename} +Set the segment filename. Unless hls_flags single_file is set @var{filename} +is used as a string format with the segment number: +@example +ffmpeg in.nut -hls_segment_filename 'file%03d.ts' out.m3u8 +@end example +This example will produce the playlist, @file{out.m3u8}, and segment files: +@file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc. + +@item hls_key_info_file @var{key_info_file} +Use the information in @var{key_info_file} for segment encryption. The first +line of @var{key_info_file} specifies the key URI written to the playlist. The +key URL 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 (IV) as a +hexadecimal string to be used instead of the segment sequence number (default) +for encryption. Changes to @var{key_info_file} will result in segment +encryption with the new key/IV and an entry in the playlist for the new key +URI/IV. + +Key info file format: +@example +@var{key URI} +@var{key file path} +@var{IV} (optional) +@end example + +Example key URIs: +@example +http://server/file.key +/path/to/file.key +file.key +@end example + +Example key file paths: +@example +file.key +/path/to/file.key +@end example + +Example IV: +@example +0123456789ABCDEF0123456789ABCDEF +@end example + +Key info file example: +@example +http://server/file.key +/path/to/file.key +0123456789ABCDEF0123456789ABCDEF +@end example + +Example shell script: +@example +#!/bin/sh +BASE_URL=$@{1:-'.'@} +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 \ + -hls_key_info_file file.keyinfo out.m3u8 +@end example + +@item hls_flags 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. HLS playlists generated with +this way will have the version number 4. +For example: +@example +ffmpeg -i in.nut -hls_flags single_file out.m3u8 +@end example +Will produce the playlist, @file{out.m3u8}, and a single segment file, +@file{out.ts}. + +@item hls_flags 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. +@end table + +@anchor{ico} +@section ico + +ICO file muxer. + +Microsoft's icon file format (ICO) has some strict limitations that should be noted: + +@itemize +@item +Size cannot exceed 256 pixels in any dimension + +@item +Only BMP and PNG images can be stored + +@item +If a BMP image is used, it must be one of the following pixel formats: +@example +BMP Bit Depth FFmpeg Pixel Format +1bit pal8 +4bit pal8 +8bit pal8 +16bit rgb555le +24bit bgr24 +32bit bgra +@end example + +@item +If a BMP image is used, it must use the BITMAPINFOHEADER DIB header + +@item +If a PNG image is used, it must use the rgba pixel format +@end itemize + +@anchor{image2} +@section image2 + +Image file muxer. + +The image file muxer writes video frames to image files. + +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 "%d" or "%0@var{N}d", this string +specifies the position of the characters representing a numbering in +the filenames. If the form "%0@var{N}d" is used, the string +representing the number in each filename is 0-padded to @var{N} +digits. The literal character '%' can be specified in the pattern with +the string "%%". + +If the pattern contains "%d" or "%0@var{N}d", the first filename of +the file list specified will contain the number 1, all the following +numbers will be sequential. + +The pattern may contain a suffix which is used to automatically +determine the format of the image files to write. + +For example the pattern "img-%03d.bmp" will specify a sequence of +filenames of the form @file{img-001.bmp}, @file{img-002.bmp}, ..., +@file{img-010.bmp}, etc. +The pattern "img%%-%d.jpg" will specify a sequence of filenames of the +form @file{img%-1.jpg}, @file{img%-2.jpg}, ..., @file{img%-10.jpg}, +etc. + +@subsection Examples + +The following example shows how to use @command{ffmpeg} for creating a +sequence of files @file{img-001.jpeg}, @file{img-002.jpeg}, ..., +taking one image every second from the input video: +@example +ffmpeg -i in.avi -vsync 1 -r 1 -f image2 'img-%03d.jpeg' +@end example + +Note that with @command{ffmpeg}, if the format is not specified with the +@code{-f} option and the output filename specifies an image file +format, the image2 muxer is automatically selected, so the previous +command can be written as: +@example +ffmpeg -i in.avi -vsync 1 -r 1 'img-%03d.jpeg' +@end example + +Note also that the pattern must not necessarily contain "%d" or +"%0@var{N}d", for example to create a single image file +@file{img.jpeg} from the input video you can employ the command: +@example +ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg +@end example + +The @option{strftime} option allows you to expand the filename with +date and time information. Check the documentation of +the @code{strftime()} function for the syntax. + +For example to generate image files from the @code{strftime()} +"%Y-%m-%d_%H-%M-%S" pattern, the following @command{ffmpeg} command +can be used: +@example +ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg" +@end example + +@subsection Options + +@table @option +@item start_number +Start the sequence from the specified number. Default value is 0. + +@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. + +@item strftime +If set to 1, expand the filename with date and time information from +@code{strftime()}. Default value is 0. +@end table + +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 YUV420P 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. + +@section matroska + +Matroska container muxer. + +This muxer implements the matroska and webm container specs. + +@subsection Metadata + +The recognized metadata settings in this muxer are: + +@table @option +@item title +Set title name provided to a single track. + +@item language +Specify the language of the track in the Matroska languages form. + +The language can be either the 3 letters bibliographic ISO-639-2 (ISO +639-2/B) form (like "fre" for French), or a language code mixed with a +country code for specialities in languages (like "fre-ca" for Canadian +French). + +@item stereo_mode +Set stereo 3D video layout of two views in a single video track. + +The following values are recognized: +@table @samp +@item mono +video is not stereo +@item left_right +Both views are arranged side by side, Left-eye view is on the left +@item bottom_top +Both views are arranged in top-bottom orientation, Left-eye view is at bottom +@item top_bottom +Both views are arranged in top-bottom orientation, Left-eye view is on top +@item checkerboard_rl +Each view is arranged in a checkerboard interleaved pattern, Left-eye view being first +@item checkerboard_lr +Each view is arranged in a checkerboard interleaved pattern, Right-eye view being first +@item row_interleaved_rl +Each view is constituted by a row based interleaving, Right-eye view is first row +@item row_interleaved_lr +Each view is constituted by a row based interleaving, Left-eye view is first row +@item col_interleaved_rl +Both views are arranged in a column based interleaving manner, Right-eye view is first column +@item col_interleaved_lr +Both views are arranged in a column based interleaving manner, Left-eye view is first column +@item anaglyph_cyan_red +All frames are in anaglyph format viewable through red-cyan filters +@item right_left +Both views are arranged side by side, Right-eye view is on the left +@item anaglyph_green_magenta +All frames are in anaglyph format viewable through green-magenta filters +@item block_lr +Both eyes laced in one Block, Left-eye view is first +@item block_rl +Both eyes laced in one Block, Right-eye view is first +@end table +@end table + +For example a 3D WebM clip can be created using the following command line: +@example +ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm +@end example + +@subsection Options + +This muxer supports the following options: + +@table @option +@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. + +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 available space does not suffice, muxing will fail. A safe size +for most use cases should be about 50kB per hour of video. + +Note that cues are only written if the output is seekable and this option will +have no effect if it is not. +@end table + +@anchor{md5} +@section md5 + +MD5 testing format. + +This muxer computes and prints the MD5 hash 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 +hash. Timestamps are ignored. + +The output of the muxer consists of a single line of the form: +MD5=@var{MD5}, where @var{MD5} is a hexadecimal number representing +the computed MD5 hash. + +For example to compute the MD5 hash of the input converted to raw +audio and video, and store it in the file @file{out.md5}: +@example +ffmpeg -i INPUT -f md5 out.md5 +@end example + +You can print the MD5 to stdout with the command: +@example +ffmpeg -i INPUT -f md5 - +@end example + +See also the @ref{framemd5} muxer. + +@section mov, mp4, ismv + +MOV/MP4/ISMV (Smooth Streaming) muxer. + +The mov/mp4/ismv muxer supports fragmentation. Normally, a MOV/MP4 +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 @var{faststart} to the @var{movflags}, or +using the @command{qt-faststart} 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 MOV/MP4 is undecodable if +it is not properly finished), and it requires less memory when writing +very long files (since writing normal MOV/MP4 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. + +@subsection Options + +Fragmentation is enabled by setting one of the AVOptions that define +how to cut the file into fragments: + +@table @option +@item -moov_size @var{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. +@item -movflags frag_keyframe +Start a new fragment at each video keyframe. +@item -frag_duration @var{duration} +Create fragments that are @var{duration} microseconds long. +@item -frag_size @var{size} +Create fragments that contain up to @var{size} bytes of payload data. +@item -movflags frag_custom +Allow the caller to manually choose when to cut fragments, by +calling @code{av_write_frame(ctx, NULL)} to write a fragment with +the packets written so far. (This is only useful with other +applications integrating libavformat, not from @command{ffmpeg}.) +@item -min_frag_duration @var{duration} +Don't create fragments that are shorter than @var{duration} microseconds long. +@end table + +If more than one condition is specified, fragments are cut when +one of the specified conditions is fulfilled. The exception to this is +@code{-min_frag_duration}, which has to be fulfilled for any of the other +conditions to apply. + +Additionally, the way the output file is written can be adjusted +through a few other options: + +@table @option +@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 MOV/MP4 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. + +This option is implicitly set when writing ismv (Smooth Streaming) files. +@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. + +This option is implicitly set when writing ismv (Smooth Streaming) files. +@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. +@item -movflags rtphint +Add RTP hinting tracks to the output file. +@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. +@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. +@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). +@end table + +@subsection Example + +Smooth Streaming content can be pushed in real time to a publishing +point on IIS with this muxer. Example: +@example +ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1) +@end example + +@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 mp3 + +The MP3 muxer writes a raw MP3 stream with the following optional features: +@itemize @bullet +@item +An ID3v2 metadata header at the beginning (enabled by default). Versions 2.3 and +2.4 are supported, the @code{id3v2_version} private option controls which one is +used (3 or 4). Setting @code{id3v2_version} to 0 disables the ID3v2 header +completely. + +The muxer supports writing attached pictures (APIC 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 APIC frame. The stream metadata tags @var{title} and @var{comment} map +to APIC @var{description} and @var{picture type} respectively. See +@url{http://id3.org/id3v2.4.0-frames} for allowed picture types. + +Note that the APIC 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. + +@item +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 +@code{write_xing} 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. + +@item +A legacy ID3v1 tag at the end of the file (disabled by default). It may be +enabled with the @code{write_id3v1} private option, but as its capabilities are +very limited, its usage is not recommended. +@end itemize + +Examples: + +Write an mp3 with an ID3v2.3 header and an ID3v1 footer: +@example +ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3 +@end example + +To attach a picture to an mp3 file select both the audio and the picture stream +with @code{map}: +@example +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 +@end example + +Write a "clean" MP3 without any extra features: +@example +ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3 +@end example + +@section mpegts + +MPEG transport stream muxer. + +This muxer implements ISO 13818-1 and part of ETSI EN 300 468. + +The recognized metadata settings in mpegts muxer are @code{service_provider} +and @code{service_name}. If they are not set the default for +@code{service_provider} is "FFmpeg" and the default for +@code{service_name} is "Service01". + +@subsection Options + +The muxer options are: + +@table @option +@item -mpegts_original_network_id @var{number} +Set the original_network_id (default 0x0001). This is unique identifier +of a network in DVB. Its main use is in the unique identification of a +service through the path Original_Network_ID, Transport_Stream_ID. +@item -mpegts_transport_stream_id @var{number} +Set the transport_stream_id (default 0x0001). This identifies a +transponder in DVB. +@item -mpegts_service_id @var{number} +Set the service_id (default 0x0001) also known as program in DVB. +@item -mpegts_service_type @var{number} +Set the program service_type (default @var{digital_tv}), see below +a list of pre defined values. +@item -mpegts_pmt_start_pid @var{number} +Set the first PID for PMT (default 0x1000, max 0x1f00). +@item -mpegts_start_pid @var{number} +Set the first PID for data packets (default 0x0100, max 0x0f00). +@item -mpegts_m2ts_mode @var{number} +Enable m2ts mode if set to 1. Default value is -1 which disables m2ts mode. +@item -muxrate @var{number} +Set a constant muxrate (default VBR). +@item -pcr_period @var{numer} +Override the default PCR retransmission time (default 20ms), ignored +if variable muxrate is selected. +@item pat_period @var{number} +Maximal time in seconds between PAT/PMT tables. +@item sdt_period @var{number} +Maximal time in seconds between SDT tables. +@item -pes_payload_size @var{number} +Set minimum PES packet payload in bytes. +@item -mpegts_flags @var{flags} +Set flags (see below). +@item -mpegts_copyts @var{number} +Preserve original timestamps, if value is set to 1. Default value is -1, which +results in shifting timestamps so that they start from 0. +@item -tables_version @var{number} +Set PAT, PMT and SDT version (default 0, 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 AVFormatContext (in case of API +usage) or restart ffmpeg instance, cyclically changing tables_version value: +@example +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 +... +@end example +@end table + +Option mpegts_service_type accepts the following values: + +@table @option +@item hex_value +Any hexdecimal value between 0x01 to 0xff as defined in ETSI 300 468. +@item digital_tv +Digital TV service. +@item digital_radio +Digital Radio service. +@item teletext +Teletext service. +@item advanced_codec_digital_radio +Advanced Codec Digital Radio service. +@item mpeg2_digital_hdtv +MPEG2 Digital HDTV service. +@item advanced_codec_digital_sdtv +Advanced Codec Digital SDTV service. +@item advanced_codec_digital_hdtv +Advanced Codec Digital HDTV service. +@end table + +Option mpegts_flags may take a set of such flags: + +@table @option +@item resend_headers +Reemit PAT/PMT before writing the next packet. +@item latm +Use LATM packetization for AAC. +@item pat_pmt_at_frames +Reemit PAT and PMT at each video frame. +@item system_b +Conform to System B (DVB) instead of System A (ATSC). +@end table + +@subsection Example + +@example +ffmpeg -i file.mpg -c copy \ + -mpegts_original_network_id 0x1122 \ + -mpegts_transport_stream_id 0x3344 \ + -mpegts_service_id 0x5566 \ + -mpegts_pmt_start_pid 0x1500 \ + -mpegts_start_pid 0x150 \ + -metadata service_provider="Some provider" \ + -metadata service_name="Some Channel" \ + -y out.ts +@end example + +@section mxf, mxf_d10 + +MXF muxer. + +@subsection Options + +The muxer options are: + +@table @option +@item store_user_comments @var{bool} +Set if user comments should be stored if available or never. +IRT D-10 does not allow user comments. The default is thus to write them for +mxf but not for mxf_d10 +@end table + +@section null + +Null muxer. + +This muxer does not generate any output file, it is mainly useful for +testing or benchmarking purposes. + +For example to benchmark decoding with @command{ffmpeg} you can use the +command: +@example +ffmpeg -benchmark -i INPUT -f null out.null +@end example + +Note that the above command does not read or write the @file{out.null} +file, but specifying the output file is required by the @command{ffmpeg} +syntax. + +Alternatively you can write the command as: +@example +ffmpeg -benchmark -i INPUT -f null - +@end example + +@section nut + +@table @option +@item -syncpoints @var{flags} +Change the syncpoint usage in nut: +@table @option +@item @var{default} use the normal low-overhead seeking aids. +@item @var{none} do not use the syncpoints at all, reducing the overhead but making the stream non-seekable; + 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, -@code{write_index} 0 can be used to disable + all growing data tables, allowing to mux endless streams with limited memory + and without these disadvantages. +@item @var{timestamped} extend the syncpoint with a wallclock field. +@end table +The @var{none} and @var{timestamped} flags are experimental. +@item -write_index @var{bool} +Write index at the end, the default is to write an index. +@end table + +@example +ffmpeg -i INPUT -f_strict experimental -syncpoints none - | processor +@end example + +@section ogg + +Ogg container muxer. + +@table @option +@item -page_duration @var{duration} +Preferred page duration, in microseconds. The muxer will attempt to create +pages that are approximately @var{duration} 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. +@item -serial_offset @var{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. + +@end table + +@anchor{segment} +@section segment, stream_segment, ssegment + +Basic stream segmenter. + +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 @ref{image2}, or by using a @code{strftime} template if +the @option{strftime} option is enabled. + +@code{stream_segment} 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 MPEG transport stream segments. +@code{ssegment} is a shorter alias for @code{stream_segment}. + +Every segment starts with a keyframe of the selected reference stream, +which is set through the @option{reference_stream} option. + +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. + +The segment muxer works best with a single constant frame rate video. + +Optionally it can generate a list of the created segments, by setting +the option @var{segment_list}. The list type is specified by the +@var{segment_list_type} option. The entry filenames in the segment +list are set by default to the basename of the corresponding segment +files. + +See also the @ref{hls} muxer, which provides a more specific +implementation for HLS segmentation. + +@subsection Options + +The segment muxer supports the following options: + +@table @option +@item reference_stream @var{specifier} +Set the reference stream, as specified by the string @var{specifier}. +If @var{specifier} is set to @code{auto}, 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 @code{auto}. + +@item segment_format @var{format} +Override the inner container format, by default it is guessed by the filename +extension. + +@item segment_format_options @var{options_list} +Set output format options using a :-separated list of key=value +parameters. Values containing the @code{:} special character must be +escaped. + +@item segment_list @var{name} +Generate also a listfile named @var{name}. If not specified no +listfile is generated. + +@item segment_list_flags @var{flags} +Set flags affecting the segment list generation. + +It currently supports the following flags: +@table @samp +@item cache +Allow caching (only affects M3U8 list files). + +@item live +Allow live-friendly file generation. +@end table + +@item segment_list_size @var{size} +Update the list file so that it contains at most @var{size} +segments. If 0 the list file will contain all the segments. Default +value is 0. + +@item segment_list_entry_prefix @var{prefix} +Prepend @var{prefix} to each entry. Useful to generate absolute paths. +By default no prefix is applied. + +@item segment_list_type @var{type} +Select the listing format. + +The following values are recognized: +@table @samp +@item flat +Generate a flat list for the created segments, one segment per line. + +@item csv, ext +Generate a list for the created segments, one segment per line, +each line matching the format (comma-separated values): +@example +@var{segment_filename},@var{segment_start_time},@var{segment_end_time} +@end example + +@var{segment_filename} is the name of the output file generated by the +muxer according to the provided pattern. CSV escaping (according to +RFC4180) is applied if required. + +@var{segment_start_time} and @var{segment_end_time} specify +the segment start and end time expressed in seconds. + +A list file with the suffix @code{".csv"} or @code{".ext"} will +auto-select this format. + +@samp{ext} is deprecated in favor or @samp{csv}. + +@item ffconcat +Generate an ffconcat file for the created segments. The resulting file +can be read using the FFmpeg @ref{concat} demuxer. + +A list file with the suffix @code{".ffcat"} or @code{".ffconcat"} will +auto-select this format. + +@item m3u8 +Generate an extended M3U8 file, version 3, compliant with +@url{http://tools.ietf.org/id/draft-pantos-http-live-streaming}. + +A list file with the suffix @code{".m3u8"} will auto-select this format. +@end table + +If not specified the type is guessed from the list file name suffix. + +@item segment_time @var{time} +Set segment duration to @var{time}, the value must be a duration +specification. Default value is "2". See also the +@option{segment_times} option. + +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. + +@item segment_atclocktime @var{1|0} +If set to "1" split at regular clock time intervals starting from 00:00 +o'clock. The @var{time} value specified in @option{segment_time} is +used for setting the length of the splitting interval. + +For example with @option{segment_time} set to "900" this makes it possible +to create files at 12:00 o'clock, 12:15, 12:30, etc. + +Default value is "0". + +@item segment_clocktime_offset @var{duration} +Delay the segment splitting times with the specified duration when using +@option{segment_atclocktime}. + +For example with @option{segment_time} set to "900" and +@option{segment_clocktime_offset} set to "300" this makes it possible to +create files at 12:05, 12:20, 12:35, etc. + +Default value is "0". + +@item segment_clocktime_wrap_duration @var{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. + +Assuming that the delay between the packets of your source is less than 0.5 +second you can detect a leap second by specifying 0.5 as the duration. + +Default is the maximum possible duration which means starting a new segment +regardless of the elapsed time since the last clock time. + +@item segment_time_delta @var{delta} +Specify the accuracy time when selecting the start time for a +segment, expressed as a duration specification. Default value is "0". + +When delta is specified a key-frame will start a new segment if its +PTS satisfies the relation: +@example +PTS >= start_time - time_delta +@end example + +This option is useful when splitting video content, which is always +split at GOP boundaries, in case a key frame is found just before the +specified split time. + +In particular may be used in combination with the @file{ffmpeg} option +@var{force_key_frames}. The key frame times specified by +@var{force_key_frames} 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*@var{frame_rate}) should address the worst case mismatch between +the specified time and the time set by @var{force_key_frames}. + +@item segment_times @var{times} +Specify a list of split points. @var{times} contains a list of comma +separated duration specifications, in increasing order. See also +the @option{segment_time} option. + +@item segment_frames @var{frames} +Specify a list of split video frame numbers. @var{frames} contains a +list of comma separated integer numbers, in increasing order. + +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. + +@item segment_wrap @var{limit} +Wrap around segment index once it reaches @var{limit}. + +@item segment_start_number @var{number} +Set the sequence number of the first segment. Defaults to @code{0}. + +@item strftime @var{1|0} +Use the @code{strftime} function to define the name of the new +segments to write. If this is selected, the output segment name must +contain a @code{strftime} function template. Default value is +@code{0}. + +@item break_non_keyframes @var{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 @code{0}. + +@item reset_timestamps @var{1|0} +Reset timestamps at the begin 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 @code{0} by default. + +@item initial_offset @var{offset} +Specify timestamp offset to apply to the output packet timestamps. The +argument must be a time duration specification, and defaults to 0. +@end table + +@subsection Examples + +@itemize +@item +Remux the content of file @file{in.mkv} to a list of segments +@file{out-000.nut}, @file{out-001.nut}, etc., and write the list of +generated segments to @file{out.list}: +@example +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nut +@end example + +@item +Segment input and set output format options for the output segments: +@example +ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4 +@end example + +@item +Segment the input file according to the split points specified by the +@var{segment_times} option: +@example +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 +@end example + +@item +Use the @command{ffmpeg} @option{force_key_frames} +option to force key frames in the input at the specified location, together +with the segment option @option{segment_time_delta} to account for +possible roundings operated when setting key frame times. +@example +ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -codec:v mpeg4 -codec:a pcm_s16le -map 0 \ +-f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut +@end example +In order to force key frames on the input file, transcoding is +required. + +@item +Segment the input file by splitting the input file according to the +frame numbers sequence specified with the @option{segment_frames} option: +@example +ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_frames 100,200,300,500,800 out%03d.nut +@end example + +@item +Convert the @file{in.mkv} to TS segments using the @code{libx264} +and @code{libfaac} encoders: +@example +ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts +@end example + +@item +Segment the input file, and create an M3U8 live playlist (can be used +as live HLS source): +@example +ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \ +-segment_list_flags +live -segment_time 10 out%03d.mkv +@end example +@end itemize + +@section smoothstreaming + +Smooth Streaming muxer generates a set of files (Manifest, chunks) suitable for serving with conventional web server. + +@table @option +@item window_size +Specify the number of fragments kept in the manifest. Default 0 (keep all). + +@item extra_window_size +Specify the number of fragments kept outside of the manifest before removing from disk. Default 5. + +@item lookahead_count +Specify the number of lookahead fragments. Default 2. + +@item min_frag_duration +Specify the minimum fragment duration (in microseconds). Default 5000000. + +@item remove_at_exit +Specify whether to remove all fragments when finished. Default 0 (do not remove). + +@end table + +@section tee + +The tee muxer can be used to write the same data to several files or any +other kind of muxer. It can be used, for example, to both stream a video to +the network and save it to disk at the same time. + +It is different from specifying several outputs to the @command{ffmpeg} +command-line tool because the audio and video data will be encoded only once +with the tee muxer; encoding can be a very expensive process. It is not +useful when using the libavformat API directly because it is then possible +to feed the same packets to several muxers directly. + +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, it must be +escaped (see @ref{quoting_and_escaping,,the "Quoting and escaping" +section in the ffmpeg-utils(1) manual,ffmpeg-utils}). + +Muxer options can be specified for each slave by prepending them as a list of +@var{key}=@var{value} 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. + +The following special options are also recognized: +@table @option +@item f +Specify the format name. Useful if it cannot be guessed from the +output name suffix. + +@item bsfs[/@var{spec}] +Specify a list of bitstream filters to apply to the specified +output. + +It is possible to specify to which streams a given bitstream filter +applies, by appending a stream specifier to the option separated by +@code{/}. @var{spec} must be a stream specifier (see @ref{Format +stream specifiers}). If the stream specifier is not specified, the +bitstream filters will be applied to all streams in the output. + +Several bitstream filters can be specified, separated by ",". + +@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 input streams. You may use multiple stream specifiers +separated by commas (@code{,}) e.g.: @code{a:0,v} +@end table + +@subsection Examples + +@itemize +@item +Encode something and both archive it in a WebM file and stream it +as MPEG-TS over UDP (the streams need to be explicitly mapped): +@example +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/" +@end example + +@item +Use @command{ffmpeg} to encode the input, and send the output +to three different destinations. The @code{dump_extra} 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 @file{out.aac} in order to make it contain only +audio packets. +@example +ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac -strict experimental + -f tee "[bsfs/v=dump_extra]out.ts|[movflags=+faststart]out.mp4|[select=a]out.aac" +@end example + +@item +As below, but select only stream @code{a:1} for the audio output. Note +that a second level escaping must be performed, as ":" is a special +character used to separate options. +@example +ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac -strict experimental + -f tee "[bsfs/v=dump_extra]out.ts|[movflags=+faststart]out.mp4|[select=\'a:1\']out.aac" +@end example +@end itemize + +Note: some codecs may need different options depending on the output format; +the auto-detection of this can not work with the tee muxer. The main example +is the @option{global_header} flag. + +@section webm_dash_manifest + +WebM DASH Manifest muxer. + +This muxer implements the WebM DASH Manifest specification to generate the DASH +manifest XML. It also supports manifest generation for DASH live streams. + +For more information see: + +@itemize @bullet +@item +WebM DASH Specification: @url{https://sites.google.com/a/webmproject.org/wiki/adaptive-streaming/webm-dash-specification} +@item +ISO DASH Specification: @url{http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip} +@end itemize + +@subsection Options + +This muxer supports the following options: + +@table @option +@item adaptation_sets +This option has the following syntax: "id=x,streams=a,b,c id=y,streams=d,e" 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. + +@item live +Set this to 1 to create a live stream DASH Manifest. Default: 0. + +@item chunk_start_index +Start index of the first chunk. This will go in the @samp{startNumber} attribute +of the @samp{SegmentTemplate} element in the manifest. Default: 0. + +@item chunk_duration_ms +Duration of each chunk in milliseconds. This will go in the @samp{duration} +attribute of the @samp{SegmentTemplate} element in the manifest. Default: 1000. + +@item utc_timing_url +URL of the page that will return the UTC timestamp in ISO format. This will go +in the @samp{value} attribute of the @samp{UTCTiming} element in the manifest. +Default: None. + +@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 @samp{timeShiftBufferDepth} +attribute of the @samp{MPD} element. Default: 60. + +@item minimum_update_period +Minimum update period (in seconds) of the manifest. This will go in the +@samp{minimumUpdatePeriod} attribute of the @samp{MPD} element. Default: 0. + +@end table + +@subsection Example +@example +ffmpeg -f webm_dash_manifest -i video1.webm \ + -f webm_dash_manifest -i video2.webm \ + -f webm_dash_manifest -i audio1.webm \ + -f webm_dash_manifest -i audio2.webm \ + -map 0 -map 1 -map 2 -map 3 \ + -c copy \ + -f webm_dash_manifest \ + -adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \ + manifest.xml +@end example + +@section webm_chunk + +WebM Live Chunk Muxer. + +This muxer writes out WebM headers and chunks as separate files which can be +consumed by clients that support WebM Live streams via DASH. + +@subsection Options + +This muxer supports the following options: + +@table @option +@item chunk_start_index +Index of the first chunk (defaults to 0). + +@item header +Filename of the header where the initialization data will be written. + +@item audio_chunk_duration +Duration of each audio chunk in milliseconds (defaults to 5000). +@end table + +@subsection Example +@example +ffmpeg -f v4l2 -i /dev/video0 \ + -f alsa -i hw:0 \ + -map 0:0 \ + -c:v libvpx-vp9 \ + -s 640x360 -keyint_min 30 -g 30 \ + -f webm_chunk \ + -header webm_live_video_360.hdr \ + -chunk_start_index 1 \ + webm_live_video_360_%d.chk \ + -map 1:0 \ + -c:a libvorbis \ + -b:a 128k \ + -f webm_chunk \ + -header webm_live_audio_128.hdr \ + -chunk_start_index 1 \ + -audio_chunk_duration 1000 \ + webm_live_audio_128_%d.chk +@end example + +@c man end MUXERS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/nut.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/nut.texi new file mode 100644 index 0000000..a02f86a --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/nut.texi
@@ -0,0 +1,160 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle NUT + +@titlepage +@center @titlefont{NUT} +@end titlepage + +@top + +@contents + +@chapter Description +NUT is a low overhead generic container format. It stores audio, video, +subtitle and user-defined streams in a simple, yet efficient, way. + +It was created by a group of FFmpeg and MPlayer developers in 2003 +and was finalized in 2008. + +The official nut specification is at svn://svn.mplayerhq.hu/nut +In case of any differences between this text and the official specification, +the official specification shall prevail. + +@chapter Modes +NUT has some variants signaled by using the flags field in its main header. + +@multitable @columnfractions .4 .4 +@item BROADCAST @tab Extend the syncpoint to report the sender wallclock +@item PIPE @tab Omit completely the syncpoint +@end multitable + +@section BROADCAST + +The BROADCAST variant provides a secondary time reference to facilitate +detecting endpoint latency and network delays. +It assumes all the endpoint clocks are syncronized. +To be used in real-time scenarios. + +@section PIPE + +The PIPE variant assumes NUT is used as non-seekable intermediate container, +by not using syncpoint removes unneeded overhead and reduces the overall +memory usage. + +@chapter Container-specific codec tags + +@section Generic raw YUVA formats + +Since many exotic planar YUVA pixel formats are not considered by +the AVI/QuickTime FourCC lists, the following scheme is adopted for +representing them. + +The first two bytes can contain the values: +Y1 = only Y +Y2 = Y+A +Y3 = YUV +Y4 = YUVA + +The third byte represents the width and height chroma subsampling +values for the UV planes, that is the amount to shift the luma +width/height right to find the chroma width/height. + +The fourth byte is the number of bits used (8, 16, ...). + +If the order of bytes is inverted, that means that each component has +to be read big-endian. + +@section Raw Audio + +@multitable @columnfractions .4 .4 +@item ALAW @tab A-LAW +@item ULAW @tab MU-LAW +@item P<type><interleaving><bits> @tab little-endian PCM +@item <bits><interleaving><type>P @tab big-endian PCM +@end multitable + +<type> is S for signed integer, U for unsigned integer, F for IEEE float +<interleaving> is D for default, P is for planar. +<bits> is 8/16/24/32 + +@example +PFD[32] would for example be signed 32 bit little-endian IEEE float +@end example + +@section Subtitles + +@multitable @columnfractions .4 .4 +@item UTF8 @tab Raw UTF-8 +@item SSA[0] @tab SubStation Alpha +@item DVDS @tab DVD subtitles +@item DVBS @tab DVB subtitles +@end multitable + +@section Raw Data + +@multitable @columnfractions .4 .4 +@item UTF8 @tab Raw UTF-8 +@end multitable + +@section Codecs + +@multitable @columnfractions .4 .4 +@item 3IV1 @tab non-compliant MPEG-4 generated by old 3ivx +@item ASV1 @tab Asus Video +@item ASV2 @tab Asus Video 2 +@item CVID @tab Cinepak +@item CYUV @tab Creative YUV +@item DIVX @tab non-compliant MPEG-4 generated by old DivX +@item DUCK @tab Truemotion 1 +@item FFV1 @tab FFmpeg video 1 +@item FFVH @tab FFmpeg Huffyuv +@item H261 @tab ITU H.261 +@item H262 @tab ITU H.262 +@item H263 @tab ITU H.263 +@item H264 @tab ITU H.264 +@item HFYU @tab Huffyuv +@item I263 @tab Intel H.263 +@item IV31 @tab Indeo 3.1 +@item IV32 @tab Indeo 3.2 +@item IV50 @tab Indeo 5.0 +@item LJPG @tab ITU JPEG (lossless) +@item MJLS @tab ITU JPEG-LS +@item MJPG @tab ITU JPEG +@item MPG4 @tab MS MPEG-4v1 (not ISO MPEG-4) +@item MP42 @tab MS MPEG-4v2 +@item MP43 @tab MS MPEG-4v3 +@item MP4V @tab ISO MPEG-4 Part 2 Video (from old encoders) +@item mpg1 @tab ISO MPEG-1 Video +@item mpg2 @tab ISO MPEG-2 Video +@item MRLE @tab MS RLE +@item MSVC @tab MS Video 1 +@item RT21 @tab Indeo 2.1 +@item RV10 @tab RealVideo 1.0 +@item RV20 @tab RealVideo 2.0 +@item RV30 @tab RealVideo 3.0 +@item RV40 @tab RealVideo 4.0 +@item SNOW @tab FFmpeg Snow +@item SVQ1 @tab Sorenson Video 1 +@item SVQ3 @tab Sorenson Video 3 +@item theo @tab Xiph Theora +@item TM20 @tab Truemotion 2.0 +@item UMP4 @tab non-compliant MPEG-4 generated by UB Video MPEG-4 +@item VCR1 @tab ATI VCR1 +@item VP30 @tab VP 3.0 +@item VP31 @tab VP 3.1 +@item VP50 @tab VP 5.0 +@item VP60 @tab VP 6.0 +@item VP61 @tab VP 6.1 +@item VP62 @tab VP 6.2 +@item VP70 @tab VP 7.0 +@item WMV1 @tab MS WMV7 +@item WMV2 @tab MS WMV8 +@item WMV3 @tab MS WMV9 +@item WV1F @tab non-compliant MPEG-4 generated by ? +@item WVC1 @tab VC-1 +@item XVID @tab non-compliant MPEG-4 generated by old Xvid +@item XVIX @tab non-compliant MPEG-4 generated by old Xvid with interlacing bug +@end multitable +
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/optimization.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/optimization.txt new file mode 100644 index 0000000..1a0b98c --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/optimization.txt
@@ -0,0 +1,276 @@ +optimization Tips (for libavcodec): +=================================== + +What to optimize: +----------------- +If you plan to do non-x86 architecture specific optimizations (SIMD normally), +then take a look in the x86/ directory, as most important functions are +already optimized for MMX. + +If you want to do x86 optimizations then you can either try to finetune the +stuff in the x86 directory or find some other functions in the C source to +optimize, but there aren't many left. + + +Understanding these overoptimized functions: +-------------------------------------------- +As many functions tend to be a bit difficult to understand because +of optimizations, it can be hard to optimize them further, or write +architecture-specific versions. It is recommended to look at older +revisions of the interesting files (web frontends for the various FFmpeg +branches are listed at http://ffmpeg.org/download.html). +Alternatively, look into the other architecture-specific versions in +the x86/, ppc/, alpha/ subdirectories. Even if you don't exactly +comprehend the instructions, it could help understanding the functions +and how they can be optimized. + +NOTE: If you still don't understand some function, ask at our mailing list!!! +(http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel) + + +When is an optimization justified? +---------------------------------- +Normally, clean and simple optimizations for widely used codecs are +justified even if they only achieve an overall speedup of 0.1%. These +speedups accumulate and can make a big difference after awhile. Also, if +none of the following factors get worse due to an optimization -- speed, +binary code size, source size, source readability -- and at least one +factor improves, then an optimization is always a good idea even if the +overall gain is less than 0.1%. For obscure codecs that are not often +used, the goal is more toward keeping the code clean, small, and +readable instead of making it 1% faster. + + +WTF is that function good for ....: +----------------------------------- +The primary purpose of this list is to avoid wasting time optimizing functions +which are rarely used. + +put(_no_rnd)_pixels{,_x2,_y2,_xy2} + Used in motion compensation (en/decoding). + +avg_pixels{,_x2,_y2,_xy2} + Used in motion compensation of B-frames. + These are less important than the put*pixels functions. + +avg_no_rnd_pixels* + unused + +pix_abs16x16{,_x2,_y2,_xy2} + Used in motion estimation (encoding) with SAD. + +pix_abs8x8{,_x2,_y2,_xy2} + Used in motion estimation (encoding) with SAD of MPEG-4 4MV only. + These are less important than the pix_abs16x16* functions. + +put_mspel8_mc* / wmv2_mspel8* + Used only in WMV2. + it is not recommended that you waste your time with these, as WMV2 + is an ugly and relatively useless codec. + +mpeg4_qpel* / *qpel_mc* + Used in MPEG-4 qpel motion compensation (encoding & decoding). + The qpel8 functions are used only for 4mv, + the avg_* functions are used only for B-frames. + Optimizing them should have a significant impact on qpel + encoding & decoding. + +qpel{8,16}_mc??_old_c / *pixels{8,16}_l4 + Just used to work around a bug in an old libavcodec encoder version. + Don't optimize them. + +add_bytes/diff_bytes + For huffyuv only, optimize if you want a faster ffhuffyuv codec. + +get_pixels / diff_pixels + Used for encoding, easy. + +clear_blocks + easiest to optimize + +gmc + Used for MPEG-4 gmc. + Optimizing this should have a significant effect on the gmc decoding + speed. + +gmc1 + Used for chroma blocks in MPEG-4 gmc with 1 warp point + (there are 4 luma & 2 chroma blocks per macroblock, so + only 1/3 of the gmc blocks use this, the other 2/3 + use the normal put_pixel* code, but only if there is + just 1 warp point). + Note: DivX5 gmc always uses just 1 warp point. + +pix_sum + Used for encoding. + +hadamard8_diff / sse / sad == pix_norm1 / dct_sad / quant_psnr / rd / bit + Specific compare functions used in encoding, it depends upon the + command line switches which of these are used. + Don't waste your time with dct_sad & quant_psnr, they aren't + really useful. + +put_pixels_clamped / add_pixels_clamped + Used for en/decoding in the IDCT, easy. + Note, some optimized IDCTs have the add/put clamped code included and + then put_pixels_clamped / add_pixels_clamped will be unused. + +idct/fdct + idct (encoding & decoding) + fdct (encoding) + difficult to optimize + +dct_quantize_trellis + Used for encoding with trellis quantization. + difficult to optimize + +dct_quantize + Used for encoding. + +dct_unquantize_mpeg1 + Used in MPEG-1 en/decoding. + +dct_unquantize_mpeg2 + Used in MPEG-2 en/decoding. + +dct_unquantize_h263 + Used in MPEG-4/H.263 en/decoding. + + + +Alignment: +Some instructions on some architectures have strict alignment restrictions, +for example most SSE/SSE2 instructions on x86. +The minimum guaranteed alignment is written in the .h files, for example: + void (*put_pixels_clamped)(const int16_t *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size); + + +General Tips: +------------- +Use asm loops like: +__asm__( + "1: .... + ... + "jump_instruction .... +Do not use C loops: +do{ + __asm__( + ... +}while() + +For x86, mark registers that are clobbered in your asm. This means both +general x86 registers (e.g. eax) as well as XMM registers. This last one is +particularly important on Win64, where xmm6-15 are callee-save, and not +restoring their contents leads to undefined results. In external asm (e.g. +yasm), you do this by using: +cglobal functon_name, num_args, num_regs, num_xmm_regs +In inline asm, you specify clobbered registers at the end of your asm: +__asm__(".." ::: "%eax"). +If gcc is not set to support sse (-msse) it will not accept xmm registers +in the clobber list. For that we use two macros to declare the clobbers. +XMM_CLOBBERS should be used when there are other clobbers, for example: +__asm__(".." ::: XMM_CLOBBERS("xmm0",) "eax"); +and XMM_CLOBBERS_ONLY should be used when the only clobbers are xmm registers: +__asm__(".." :: XMM_CLOBBERS_ONLY("xmm0")); + +Do not expect a compiler to maintain values in your registers between separate +(inline) asm code blocks. It is not required to. For example, this is bad: +__asm__("movdqa %0, %%xmm7" : src); +/* do something */ +__asm__("movdqa %%xmm7, %1" : dst); +- first of all, you're assuming that the compiler will not use xmm7 in + between the two asm blocks. It probably won't when you test it, but it's + a poor assumption that will break at some point for some --cpu compiler flag +- secondly, you didn't mark xmm7 as clobbered. If you did, the compiler would + have restored the original value of xmm7 after the first asm block, thus + rendering the combination of the two blocks of code invalid +Code that depends on data in registries being untouched, should be written as +a single __asm__() statement. Ideally, a single function contains only one +__asm__() block. + +Use external asm (nasm/yasm) or inline asm (__asm__()), do not use intrinsics. +The latter requires a good optimizing compiler which gcc is not. + +When debugging a x86 external asm compilation issue, if lost in the macro +expansions, add DBG=1 to your make command-line: the input file will be +preprocessed, stripped of the debug/empty lines, then compiled, showing the +actual lines causing issues. + +Inline asm vs. external asm +--------------------------- +Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc) +and external asm (.s or .asm files, handled by an assembler such as yasm/nasm) +are accepted in FFmpeg. Which one to use differs per specific case. + +- if your code is intended to be inlined in a C function, inline asm is always + better, because external asm cannot be inlined +- if your code calls external functions, yasm is always better +- if your code takes huge and complex structs as function arguments (e.g. + MpegEncContext; note that this is not ideal and is discouraged if there + are alternatives), then inline asm is always better, because predicting + member offsets in complex structs is almost impossible. It's safest to let + the compiler take care of that +- in many cases, both can be used and it just depends on the preference of the + person writing the asm. For new asm, the choice is up to you. For existing + asm, you'll likely want to maintain whatever form it is currently in unless + there is a good reason to change it. +- if, for some reason, you believe that a particular chunk of existing external + asm could be improved upon further if written in inline asm (or the other + way around), then please make the move from external asm <-> inline asm a + separate patch before your patches that actually improve the asm. + + +Links: +====== +http://www.aggregate.org/MAGIC/ + +x86-specific: +------------- +http://developer.intel.com/design/pentium4/manuals/248966.htm + +The IA-32 Intel Architecture Software Developer's Manual, Volume 2: +Instruction Set Reference +http://developer.intel.com/design/pentium4/manuals/245471.htm + +http://www.agner.org/assem/ + +AMD Athlon Processor x86 Code Optimization Guide: +http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22007.pdf + + +ARM-specific: +------------- +ARM Architecture Reference Manual (up to ARMv5TE): +http://www.arm.com/community/university/eulaarmarm.html + +Procedure Call Standard for the ARM Architecture: +http://www.arm.com/pdfs/aapcs.pdf + +Optimization guide for ARM9E (used in Nokia 770 Internet Tablet): +http://infocenter.arm.com/help/topic/com.arm.doc.ddi0240b/DDI0240A.pdf +Optimization guide for ARM11 (used in Nokia N800 Internet Tablet): +http://infocenter.arm.com/help/topic/com.arm.doc.ddi0211j/DDI0211J_arm1136_r1p5_trm.pdf +Optimization guide for Intel XScale (used in Sharp Zaurus PDA): +http://download.intel.com/design/intelxscale/27347302.pdf +Intel Wireless MMX 2 Coprocessor: Programmers Reference Manual +http://download.intel.com/design/intelxscale/31451001.pdf + +PowerPC-specific: +----------------- +PowerPC32/AltiVec PIM: +www.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf + +PowerPC32/AltiVec PEM: +www.freescale.com/files/32bit/doc/ref_manual/ALTIVECPIM.pdf + +CELL/SPU: +http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/30B3520C93F437AB87257060006FFE5E/$file/Language_Extensions_for_CBEA_2.4.pdf +http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/9F820A5FFA3ECE8C8725716A0062585F/$file/CBE_Handbook_v1.1_24APR2007_pub.pdf + +GCC asm links: +-------------- +official doc but quite ugly +http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html + +a bit old (note "+" is valid for input-output, even though the next disagrees) +http://www.cs.virginia.edu/~clc5q/gcc-inline-asm.pdf
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/outdevs.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/outdevs.texi new file mode 100644 index 0000000..e68653f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/outdevs.texi
@@ -0,0 +1,450 @@ +@chapter Output Devices +@c man begin OUTPUT DEVICES + +Output devices are configured elements in FFmpeg that can write +multimedia data to an output device attached to your system. + +When you configure your FFmpeg build, all the supported output devices +are enabled by default. You can list all available ones using the +configure option "--list-outdevs". + +You can disable all the output devices using the configure option +"--disable-outdevs", and selectively enable an output device using the +option "--enable-outdev=@var{OUTDEV}", or you can disable a particular +input device using the option "--disable-outdev=@var{OUTDEV}". + +The option "-devices" of the ff* tools will display the list of +enabled output devices. + +A description of the currently available output devices follows. + +@section alsa + +ALSA (Advanced Linux Sound Architecture) output device. + +@subsection Examples + +@itemize +@item +Play a file on default ALSA device: +@example +ffmpeg -i INPUT -f alsa default +@end example + +@item +Play a file on soundcard 1, audio device 7: +@example +ffmpeg -i INPUT -f alsa hw:1,7 +@end example +@end itemize + +@section caca + +CACA output device. + +This output device allows one to show a video stream in CACA window. +Only one CACA window is allowed per application, so you can +have only one instance of this output device in an application. + +To enable this output device you need to configure FFmpeg with +@code{--enable-libcaca}. +libcaca is a graphics library that outputs text instead of pixels. + +For more information about libcaca, check: +@url{http://caca.zoy.org/wiki/libcaca} + +@subsection Options + +@table @option + +@item window_title +Set the CACA window title, if not specified default to the filename +specified for the output device. + +@item window_size +Set the CACA window size, can be a string of the form +@var{width}x@var{height} or a video size abbreviation. +If not specified it defaults to the size of the input video. + +@item driver +Set display driver. + +@item algorithm +Set dithering algorithm. Dithering is necessary +because the picture being rendered has usually far more colours than +the available palette. +The accepted values are listed with @code{-list_dither algorithms}. + +@item antialias +Set antialias method. Antialiasing smoothens the rendered +image and avoids the commonly seen staircase effect. +The accepted values are listed with @code{-list_dither antialiases}. + +@item charset +Set which characters are going to be used when rendering text. +The accepted values are listed with @code{-list_dither charsets}. + +@item color +Set color to be used when rendering text. +The accepted values are listed with @code{-list_dither colors}. + +@item list_drivers +If set to @option{true}, print a list of available drivers and exit. + +@item list_dither +List available dither options related to the argument. +The argument must be one of @code{algorithms}, @code{antialiases}, +@code{charsets}, @code{colors}. +@end table + +@subsection Examples + +@itemize +@item +The following command shows the @command{ffmpeg} output is an +CACA window, forcing its size to 80x25: +@example +ffmpeg -i INPUT -vcodec rawvideo -pix_fmt rgb24 -window_size 80x25 -f caca - +@end example + +@item +Show the list of available drivers and exit: +@example +ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_drivers true - +@end example + +@item +Show the list of available dither colors and exit: +@example +ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_dither colors - +@end example +@end itemize + +@section decklink + +The decklink output device provides playback capabilities for Blackmagic +DeckLink devices. + +To enable this output device, you need the Blackmagic DeckLink SDK and you +need to configure with the appropriate @code{--extra-cflags} +and @code{--extra-ldflags}. +On Windows, you need to run the IDL files through @command{widl}. + +DeckLink is very picky about the formats it supports. Pixel format is always +uyvy422, framerate and video size must be determined for your device with +@command{-list_formats 1}. Audio sample rate is always 48 kHz. + +@subsection Options + +@table @option + +@item list_devices +If set to @option{true}, print a list of devices and exit. +Defaults to @option{false}. + +@item list_formats +If set to @option{true}, print a list of supported formats and exit. +Defaults to @option{false}. + +@item preroll +Amount of time to preroll video in seconds. +Defaults to @option{0.5}. + +@end table + +@subsection Examples + +@itemize + +@item +List output devices: +@example +ffmpeg -i test.avi -f decklink -list_devices 1 dummy +@end example + +@item +List supported formats: +@example +ffmpeg -i test.avi -f decklink -list_formats 1 'DeckLink Mini Monitor' +@end example + +@item +Play video clip: +@example +ffmpeg -i test.avi -f decklink -pix_fmt uyvy422 'DeckLink Mini Monitor' +@end example + +@item +Play video clip with non-standard framerate or video size: +@example +ffmpeg -i test.avi -f decklink -pix_fmt uyvy422 -s 720x486 -r 24000/1001 'DeckLink Mini Monitor' +@end example + +@end itemize + +@section fbdev + +Linux framebuffer output device. + +The Linux framebuffer is a graphic hardware-independent abstraction +layer to show graphics on a computer monitor, typically on the +console. It is accessed through a file device node, usually +@file{/dev/fb0}. + +For more detailed information read the file +@file{Documentation/fb/framebuffer.txt} included in the Linux source tree. + +@subsection Options +@table @option + +@item xoffset +@item yoffset +Set x/y coordinate of top left corner. Default is 0. +@end table + +@subsection Examples +Play a file on framebuffer device @file{/dev/fb0}. +Required pixel format depends on current framebuffer settings. +@example +ffmpeg -re -i INPUT -vcodec rawvideo -pix_fmt bgra -f fbdev /dev/fb0 +@end example + +See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1). + +@section opengl +OpenGL output device. + +To enable this output device you need to configure FFmpeg with @code{--enable-opengl}. + +This output device allows one to render to OpenGL context. +Context may be provided by application or default SDL window is created. + +When device renders to external context, application must implement handlers for following messages: +@code{AV_DEV_TO_APP_CREATE_WINDOW_BUFFER} - create OpenGL context on current thread. +@code{AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER} - make OpenGL context current. +@code{AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER} - swap buffers. +@code{AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER} - destroy OpenGL context. +Application is also required to inform a device about current resolution by sending @code{AV_APP_TO_DEV_WINDOW_SIZE} message. + +@subsection Options +@table @option + +@item background +Set background color. Black is a default. +@item no_window +Disables default SDL window when set to non-zero value. +Application must provide OpenGL context and both @code{window_size_cb} and @code{window_swap_buffers_cb} callbacks when set. +@item window_title +Set the SDL window title, if not specified default to the filename specified for the output device. +Ignored when @option{no_window} is set. +@item window_size +Set preferred window size, can be a string of the form widthxheight or a video size abbreviation. +If not specified it defaults to the size of the input video, downscaled according to the aspect ratio. +Mostly usable when @option{no_window} is not set. + +@end table + +@subsection Examples +Play a file on SDL window using OpenGL rendering: +@example +ffmpeg -i INPUT -f opengl "window title" +@end example + +@section oss + +OSS (Open Sound System) output device. + +@section pulse + +PulseAudio output device. + +To enable this output device you need to configure FFmpeg with @code{--enable-libpulse}. + +More information about PulseAudio can be found on @url{http://www.pulseaudio.org} + +@subsection Options +@table @option + +@item server +Connect to a specific PulseAudio server, specified by an IP address. +Default server is used when not provided. + +@item name +Specify the application name PulseAudio will use when showing active clients, +by default it is the @code{LIBAVFORMAT_IDENT} string. + +@item stream_name +Specify the stream name PulseAudio will use when showing active streams, +by default it is set to the specified output name. + +@item device +Specify the device to use. Default device is used when not provided. +List of output devices can be obtained with command @command{pactl list sinks}. + +@item buffer_size +@item buffer_duration +Control the size and duration of the PulseAudio buffer. A small buffer +gives more control, but requires more frequent updates. + +@option{buffer_size} specifies size in bytes while +@option{buffer_duration} specifies duration in milliseconds. + +When both options are provided then the highest value is used +(duration is recalculated to bytes using stream parameters). If they +are set to 0 (which is default), the device will use the default +PulseAudio duration value. By default PulseAudio set buffer duration +to around 2 seconds. + +@item prebuf +Specify pre-buffering size in bytes. The server does not start with +playback before at least @option{prebuf} bytes are available in the +buffer. By default this option is initialized to the same value as +@option{buffer_size} or @option{buffer_duration} (whichever is bigger). + +@item minreq +Specify minimum request size in bytes. The server does not request less +than @option{minreq} bytes from the client, instead waits until the buffer +is free enough to request more bytes at once. It is recommended to not set +this option, which will initialize this to a value that is deemed sensible +by the server. + +@end table + +@subsection Examples +Play a file on default device on default server: +@example +ffmpeg -i INPUT -f pulse "stream name" +@end example + +@section sdl + +SDL (Simple DirectMedia Layer) output device. + +This output device allows one to show a video stream in an SDL +window. Only one SDL window is allowed per application, so you can +have only one instance of this output device in an application. + +To enable this output device you need libsdl installed on your system +when configuring your build. + +For more information about SDL, check: +@url{http://www.libsdl.org/} + +@subsection Options + +@table @option + +@item window_title +Set the SDL window title, if not specified default to the filename +specified for the output device. + +@item icon_title +Set the name of the iconified SDL window, if not specified it is set +to the same value of @var{window_title}. + +@item window_size +Set the SDL window size, can be a string of the form +@var{width}x@var{height} or a video size abbreviation. +If not specified it defaults to the size of the input video, +downscaled according to the aspect ratio. + +@item window_fullscreen +Set fullscreen mode when non-zero value is provided. +Default value is zero. +@end table + +@subsection Interactive commands + +The window created by the device can be controlled through the +following interactive commands. + +@table @key +@item q, ESC +Quit the device immediately. +@end table + +@subsection Examples + +The following command shows the @command{ffmpeg} output is an +SDL window, forcing its size to the qcif format: +@example +ffmpeg -i INPUT -vcodec rawvideo -pix_fmt yuv420p -window_size qcif -f sdl "SDL output" +@end example + +@section sndio + +sndio audio output device. + +@section xv + +XV (XVideo) output device. + +This output device allows one to show a video stream in a X Window System +window. + +@subsection Options + +@table @option +@item display_name +Specify the hardware display name, which determines the display and +communications domain to be used. + +The display name or DISPLAY environment variable can be a string in +the format @var{hostname}[:@var{number}[.@var{screen_number}]]. + +@var{hostname} specifies the name of the host machine on which the +display is physically attached. @var{number} specifies the number of +the display server on that host machine. @var{screen_number} specifies +the screen to be used on that server. + +If unspecified, it defaults to the value of the DISPLAY environment +variable. + +For example, @code{dual-headed:0.1} would specify screen 1 of display +0 on the machine named ``dual-headed''. + +Check the X11 specification for more detailed information about the +display name format. + +@item window_id +When set to non-zero value then device doesn't create new window, +but uses existing one with provided @var{window_id}. By default +this options is set to zero and device creates its own window. + +@item window_size +Set the created window size, can be a string of the form +@var{width}x@var{height} or a video size abbreviation. If not +specified it defaults to the size of the input video. +Ignored when @var{window_id} is set. + +@item window_x +@item window_y +Set the X and Y window offsets for the created window. They are both +set to 0 by default. The values may be ignored by the window manager. +Ignored when @var{window_id} is set. + +@item window_title +Set the window title, if not specified default to the filename +specified for the output device. Ignored when @var{window_id} is set. +@end table + +For more information about XVideo see @url{http://www.x.org/}. + +@subsection Examples + +@itemize +@item +Decode, display and encode video input with @command{ffmpeg} at the +same time: +@example +ffmpeg -i INPUT OUTPUT -f xv display +@end example + +@item +Decode and display the input video to multiple X11 windows: +@example +ffmpeg -i INPUT -f xv normal -vf negate -f xv negated +@end example +@end itemize + +@c man end OUTPUT DEVICES
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/platform.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/platform.texi new file mode 100644 index 0000000..f7ee456 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/platform.texi
@@ -0,0 +1,409 @@ +\input texinfo @c -*- texinfo -*- +@documentencoding UTF-8 + +@settitle Platform Specific Information +@titlepage +@center @titlefont{Platform Specific Information} +@end titlepage + +@top + +@contents + +@chapter Unix-like + +Some parts of FFmpeg cannot be built with version 2.15 of the GNU +assembler which is still provided by a few AMD64 distributions. To +make sure your compiler really uses the required version of gas +after a binutils upgrade, run: + +@example +$(gcc -print-prog-name=as) --version +@end example + +If not, then you should install a different compiler that has no +hard-coded path to gas. In the worst case pass @code{--disable-asm} +to configure. + +@section Advanced linking configuration + +If you compiled FFmpeg libraries statically and you want to use them to +build your own shared library, you may need to force PIC support (with +@code{--enable-pic} during FFmpeg configure) and add the following option +to your project LDFLAGS: + +@example +-Wl,-Bsymbolic +@end example + +If your target platform requires position independent binaries, you should +pass the correct linking flag (e.g. @code{-pie}) to @code{--extra-ldexeflags}. + +@section BSD + +BSD make will not build FFmpeg, you need to install and use GNU Make +(@command{gmake}). + +@section (Open)Solaris + +GNU Make is required to build FFmpeg, so you have to invoke (@command{gmake}), +standard Solaris Make will not work. When building with a non-c99 front-end +(gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o} +or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options +since the libc is not c99-compliant by default. The probes performed by +configure may raise an exception leading to the death of configure itself +due to a bug in the system shell. Simply invoke a different shell such as +bash directly to work around this: + +@example +bash ./configure +@end example + +@anchor{Darwin} +@section Darwin (Mac OS X, iPhone) + +The toolchain provided with Xcode is sufficient to build the basic +unacelerated code. + +Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from +@url{https://github.com/FFmpeg/gas-preprocessor} or +@url{https://github.com/yuvi/gas-preprocessor}(currently outdated) to build the optimized +assembly functions. Put the Perl script somewhere +in your PATH, FFmpeg's configure will pick it up automatically. + +Mac OS X on amd64 and x86 requires @command{yasm} to build most of the +optimized assembly functions. @uref{http://www.finkproject.org/, Fink}, +@uref{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix}, +@uref{https://mxcl.github.com/homebrew/, Homebrew} +or @uref{http://www.macports.org, MacPorts} can easily provide it. + + +@chapter DOS + +Using a cross-compiler is preferred for various reasons. +@url{http://www.delorie.com/howto/djgpp/linux-x-djgpp.html} + + +@chapter OS/2 + +For information about compiling FFmpeg on OS/2 see +@url{http://www.edm2.com/index.php/FFmpeg}. + + +@chapter Windows + +To get help and instructions for building FFmpeg under Windows, check out +the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}. + +@section Native Windows compilation using MinGW or MinGW-w64 + +FFmpeg can be built to run natively on Windows using the MinGW-w64 +toolchain. Install the latest versions of MSYS2 and MinGW-w64 from +@url{http://msys2.github.io/} and/or @url{http://mingw-w64.sourceforge.net/}. +You can find detailed installation instructions in the download section and +the FAQ. + +Notes: + +@itemize + +@item Building for the MSYS environment is discouraged, MSYS2 provides a full +MinGW-w64 environment through @file{mingw64_shell.bat} or +@file{mingw32_shell.bat} that should be used instead of the environment +provided by @file{msys2_shell.bat}. + +@item Building using MSYS2 can be sped up by disabling implicit rules in the +Makefile by calling @code{make -r} instead of plain @code{make}. This +speed up is close to non-existent for normal one-off builds and is only +noticeable when running make for a second time (for example during +@code{make install}). + +@item In order to compile FFplay, you must have the MinGW development library +of @uref{http://www.libsdl.org/, SDL} and @code{pkg-config} installed. + +@item By using @code{./configure --enable-shared} when configuring FFmpeg, +you can build the FFmpeg libraries (e.g. libavutil, libavcodec, +libavformat) as DLLs. + +@end itemize + +@subsection Native Windows compilation using MSYS2 + +The MSYS2 MinGW-w64 environment provides ready to use toolchains and dependencies +through @command{pacman}. + +Make sure to use @file{mingw64_shell.bat} or @file{mingw32_shell.bat} to have +the correct MinGW-w64 environment. The default install provides shortcuts to +them under @command{MinGW-w64 Win64 Shell} and @command{MinGW-w64 Win32 Shell}. + +@example +# normal msys2 packages +pacman -S make pkgconf diffutils + +# mingw-w64 packages and toolchains +pacman -S mingw-w64-x86_64-yasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL +@end example + +To target 32bit replace the @code{x86_64} with @code{i686} in the command above. + +@section Microsoft Visual C++ or Intel C++ Compiler for Windows + +FFmpeg can be built with MSVC 2012 or earlier using a C99-to-C89 conversion utility +and wrapper, or with MSVC 2013 and ICL natively. + +You will need the following prerequisites: + +@itemize +@item @uref{https://github.com/libav/c99-to-c89/, C99-to-C89 Converter & Wrapper} +(if using MSVC 2012 or earlier) +@item @uref{http://code.google.com/p/msinttypes/, msinttypes} +(if using MSVC 2012 or earlier) +@item @uref{http://msys2.github.io/, MSYS2} +@item @uref{http://yasm.tortall.net/, YASM} +(Also available via MSYS2's package manager.) +@end itemize + +To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from +the Visual Studio or Intel Compiler command prompt. + +Place @code{yasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or +earlier, place @code{c99wrap.exe} and @code{c99conv.exe} somewhere in your +@code{PATH} as well. + +Next, make sure any other headers and libs you want to use, such as zlib, are +located in a spot that the compiler can see. Do so by modifying the @code{LIB} +and @code{INCLUDE} environment variables to include the @strong{Windows-style} +paths to these directories. Alternatively, you can try and use the +@code{--extra-cflags}/@code{--extra-ldflags} configure options. If using MSVC +2012 or earlier, place @code{inttypes.h} somewhere the compiler can see too. + +Finally, run: + +@example +For MSVC: +./configure --toolchain=msvc + +For ICL: +./configure --toolchain=icl + +make +make install +@end example + +If you wish to compile shared libraries, add @code{--enable-shared} to your +configure options. Note that due to the way MSVC and ICL handle DLL imports and +exports, you cannot compile static and shared libraries at the same time, and +enabling shared libraries will automatically disable the static ones. + +Notes: + +@itemize + +@item If you wish to build with zlib support, you will have to grab a compatible +zlib binary from somewhere, with an MSVC import lib, or if you wish to link +statically, you can follow the instructions below to build a compatible +@code{zlib.lib} with MSVC. Regardless of which method you use, you must still +follow step 3, or compilation will fail. +@enumerate +@item Grab the @uref{http://zlib.net/, zlib sources}. +@item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since +this is how FFmpeg is built as well. +@item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets +erroneously included when building FFmpeg. +@item Run @code{nmake -f win32/Makefile.msc}. +@item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC +can see. +@end enumerate + +@item FFmpeg has been tested with the following on i686 and x86_64: +@itemize +@item Visual Studio 2010 Pro and Express +@item Visual Studio 2012 Pro and Express +@item Visual Studio 2013 Pro and Express +@item Intel Composer XE 2013 +@item Intel Composer XE 2013 SP1 +@end itemize +Anything else is not officially supported. + +@end itemize + +@subsection Linking to FFmpeg with Microsoft Visual C++ + +If you plan to link with MSVC-built static libraries, you will need +to make sure you have @code{Runtime Library} set to +@code{Multi-threaded (/MT)} in your project's settings. + +You will need to define @code{inline} to something MSVC understands: +@example +#define inline __inline +@end example + +Also note, that as stated in @strong{Microsoft Visual C++}, you will need +an MSVC-compatible @uref{http://code.google.com/p/msinttypes/, inttypes.h}. + +If you plan on using import libraries created by dlltool, you must +set @code{References} to @code{No (/OPT:NOREF)} under the linker optimization +settings, otherwise the resulting binaries will fail during runtime. +This is not required when using import libraries generated by @code{lib.exe}. +This issue is reported upstream at +@url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}. + +To create import libraries that work with the @code{/OPT:REF} option +(which is enabled by default in Release mode), follow these steps: + +@enumerate + +@item Open the @emph{Visual Studio Command Prompt}. + +Alternatively, in a normal command line prompt, call @file{vcvars32.bat} +which sets up the environment variables for the Visual C++ tools +(the standard location for this file is something like +@file{C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat}). + +@item Enter the @file{bin} directory where the created LIB and DLL files +are stored. + +@item Generate new import libraries with @command{lib.exe}: + +@example +lib /machine:i386 /def:..\lib\foo-version.def /out:foo.lib +@end example + +Replace @code{foo-version} and @code{foo} with the respective library names. + +@end enumerate + +@anchor{Cross compilation for Windows with Linux} +@section Cross compilation for Windows with Linux + +You must use the MinGW cross compilation tools available at +@url{http://www.mingw.org/}. + +Then configure FFmpeg with the following options: +@example +./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc- +@end example +(you can change the cross-prefix according to the prefix chosen for the +MinGW tools). + +Then you can easily test FFmpeg with @uref{http://www.winehq.com/, Wine}. + +@section Compilation under Cygwin + +Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack +llrint() in its C library. + +Install your Cygwin with all the "Base" packages, plus the +following "Devel" ones: +@example +binutils, gcc4-core, make, git, mingw-runtime, texinfo +@end example + +In order to run FATE you will also need the following "Utils" packages: +@example +diffutils +@end example + +If you want to build FFmpeg with additional libraries, download Cygwin +"Devel" packages for Ogg and Vorbis from any Cygwin packages repository: +@example +libogg-devel, libvorbis-devel +@end example + +These library packages are only available from +@uref{http://sourceware.org/cygwinports/, Cygwin Ports}: + +@example +yasm, libSDL-devel, libfaac-devel, libgsm-devel, libmp3lame-devel, +libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel +@end example + +The recommendation for x264 is to build it from source, as it evolves too +quickly for Cygwin Ports to be up to date. + +@section Crosscompilation for Windows under Cygwin + +With Cygwin you can create Windows binaries that do not need the cygwin1.dll. + +Just install your Cygwin as explained before, plus these additional +"Devel" packages: +@example +gcc-mingw-core, mingw-runtime, mingw-zlib +@end example + +and add some special flags to your configure invocation. + +For a static build run +@example +./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin +@end example + +and for a build with shared libraries +@example +./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin +@end example + +@chapter Plan 9 + +The native @uref{http://plan9.bell-labs.com/plan9/, Plan 9} compiler +does not implement all the C99 features needed by FFmpeg so the gcc +port must be used. Furthermore, a few items missing from the C +library and shell environment need to be fixed. + +@itemize + +@item GNU awk, grep, make, and sed + +Working packages of these tools can be found at +@uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9}. +They can be installed with @uref{http://9front.org/, 9front's} @code{pkg} +utility by setting @code{pkgpath} to +@code{http://ports2plan9.googlecode.com/files/}. + +@item Missing/broken @code{head} and @code{printf} commands + +Replacements adequate for building FFmpeg can be found in the +@code{compat/plan9} directory. Place these somewhere they will be +found by the shell. These are not full implementations of the +commands and are @emph{not} suitable for general use. + +@item Missing C99 @code{stdint.h} and @code{inttypes.h} + +Replacement headers are available from +@url{http://code.google.com/p/plan9front/issues/detail?id=152}. + +@item Missing or non-standard library functions + +Some functions in the C library are missing or incomplete. The +@code{@uref{http://ports2plan9.googlecode.com/files/gcc-apelibs-1207.tbz, +gcc-apelibs-1207}} package from +@uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9} +includes an updated C library, but installing the full package gives +unusable executables. Instead, keep the files from @code{gccbin.tgz} +under @code{/386/lib/gnu}. From the @code{libc.a} archive in the +@code{gcc-apelibs-1207} package, extract the following object files and +turn them into a library: + +@itemize +@item @code{strerror.o} +@item @code{strtoll.o} +@item @code{snprintf.o} +@item @code{vsnprintf.o} +@item @code{vfprintf.o} +@item @code{_IO_getc.o} +@item @code{_IO_putc.o} +@end itemize + +Use the @code{--extra-libs} option of @code{configure} to inform the +build system of this library. + +@item FPU exceptions enabled by default + +Unlike most other systems, Plan 9 enables FPU exceptions by default. +These must be disabled before calling any FFmpeg functions. While the +included tools will do this automatically, other users of the +libraries must do it themselves. + +@end itemize + +@bye
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/print_options.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/print_options.c new file mode 100644 index 0000000..9fd66ca --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/print_options.c
@@ -0,0 +1,130 @@ +/* + * Copyright (c) 2012 Anton Khirnov + * + * 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 + */ + +/* + * generate texinfo manpages for avoptions + */ + +#include <stddef.h> +#include <string.h> +#include <float.h> + +// print_options is build for the host, os_support.h isn't needed and is setup +// for the target. without this build breaks on mingw +#define AVFORMAT_OS_SUPPORT_H + +#include "libavformat/avformat.h" +#include "libavformat/options_table.h" +#include "libavcodec/avcodec.h" +#include "libavcodec/options_table.h" +#include "libavutil/opt.h" + +static void print_usage(void) +{ + fprintf(stderr, "Usage: enum_options type\n" + "type: format codec\n"); + exit(1); +} + +static void print_option(const AVOption *opts, const AVOption *o, int per_stream) +{ + if (!(o->flags & (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM))) + return; + + printf("@item -%s%s @var{", o->name, per_stream ? "[:stream_specifier]" : ""); + switch (o->type) { + case AV_OPT_TYPE_BINARY: printf("hexadecimal string"); break; + case AV_OPT_TYPE_STRING: printf("string"); break; + case AV_OPT_TYPE_INT: + case AV_OPT_TYPE_INT64: printf("integer"); break; + case AV_OPT_TYPE_FLOAT: + case AV_OPT_TYPE_DOUBLE: printf("float"); break; + case AV_OPT_TYPE_RATIONAL: printf("rational number"); break; + case AV_OPT_TYPE_FLAGS: printf("flags"); break; + default: printf("value"); break; + } + printf("} (@emph{"); + + if (o->flags & AV_OPT_FLAG_DECODING_PARAM) { + printf("input"); + if (o->flags & AV_OPT_FLAG_ENCODING_PARAM) + printf("/"); + } + if (o->flags & AV_OPT_FLAG_ENCODING_PARAM) printf("output"); + if (o->flags & AV_OPT_FLAG_AUDIO_PARAM) printf(",audio"); + if (o->flags & AV_OPT_FLAG_VIDEO_PARAM) printf(",video"); + if (o->flags & AV_OPT_FLAG_SUBTITLE_PARAM) printf(",subtitles"); + + printf("})\n"); + if (o->help) + printf("%s\n", o->help); + + if (o->unit) { + const AVOption *u; + printf("\nPossible values:\n@table @samp\n"); + + for (u = opts; u->name; u++) { + if (u->type == AV_OPT_TYPE_CONST && u->unit && !strcmp(u->unit, o->unit)) + printf("@item %s\n%s\n", u->name, u->help ? u->help : ""); + } + printf("@end table\n"); + } +} + +static void show_opts(const AVOption *opts, int per_stream) +{ + const AVOption *o; + + printf("@table @option\n"); + for (o = opts; o->name; o++) { + if (o->type != AV_OPT_TYPE_CONST) + print_option(opts, o, per_stream); + } + printf("@end table\n"); +} + +static void show_format_opts(void) +{ + printf("@section Format AVOptions\n"); + show_opts(avformat_options, 0); +} + +static void show_codec_opts(void) +{ + printf("@section Codec AVOptions\n"); + show_opts(avcodec_options, 1); +} + +int main(int argc, char **argv) +{ + if (argc < 2) + print_usage(); + + printf("@c DO NOT EDIT THIS FILE!\n" + "@c It was generated by print_options.\n\n"); + if (!strcmp(argv[1], "format")) + show_format_opts(); + else if (!strcmp(argv[1], "codec")) + show_codec_opts(); + else + print_usage(); + + return 0; +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/protocols.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/protocols.texi new file mode 100644 index 0000000..375d042 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/protocols.texi
@@ -0,0 +1,1369 @@ +@chapter Protocol Options +@c man begin 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. + +The list of supported options follows: + +@table @option +@item protocol_whitelist @var{list} (@emph{input}) +Set a ","-separated list of allowed protocols. "ALL" matches all protocols. Protocols +prefixed by "-" are disabled. +All protocols are allowed by default but protocols used by an another +protocol (nested protocols) are restricted to a per protocol subset. +@end table + +@c man end PROTOCOL OPTIONS + +@chapter Protocols +@c man begin PROTOCOLS + +Protocols are configured elements in FFmpeg that enable access to +resources that require specific protocols. + +When you configure your FFmpeg build, all the supported protocols are +enabled by default. You can list all available ones using the +configure option "--list-protocols". + +You can disable all the protocols using the configure option +"--disable-protocols", and selectively enable a protocol using the +option "--enable-protocol=@var{PROTOCOL}", or you can disable a +particular protocol using the option +"--disable-protocol=@var{PROTOCOL}". + +The option "-protocols" of the ff* tools will display the list of +supported protocols. + +A description of the currently available protocols follows. + +@section async + +Asynchronous data filling wrapper for input stream. + +Fill data in a background thread, to decouple I/O operation from demux thread. + +@example +async:@var{URL} +async:http://host/resource +async:cache:http://host/resource +@end example + +@section bluray + +Read BluRay playlist. + +The accepted options are: +@table @option + +@item angle +BluRay angle + +@item chapter +Start chapter (1...N) + +@item playlist +Playlist to read (BDMV/PLAYLIST/?????.mpls) + +@end table + +Examples: + +Read longest playlist from BluRay mounted to /mnt/bluray: +@example +bluray:/mnt/bluray +@end example + +Read angle 2 of playlist 4 from BluRay mounted to /mnt/bluray, start from chapter 2: +@example +-playlist 4 -angle 2 -chapter 2 bluray:/mnt/bluray +@end example + +@section cache + +Caching wrapper for input stream. + +Cache the input stream to temporary file. It brings seeking capability to live streams. + +@example +cache:@var{URL} +@end example + +@section concat + +Physical concatenation protocol. + +Read and seek from many resources in sequence as if they were +a unique resource. + +A URL accepted by this protocol has the syntax: +@example +concat:@var{URL1}|@var{URL2}|...|@var{URLN} +@end example + +where @var{URL1}, @var{URL2}, ..., @var{URLN} are the urls of the +resource to be concatenated, each one possibly specifying a distinct +protocol. + +For example to read a sequence of files @file{split1.mpeg}, +@file{split2.mpeg}, @file{split3.mpeg} with @command{ffplay} use the +command: +@example +ffplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg +@end example + +Note that you may need to escape the character "|" which is special for +many shells. + +@section crypto + +AES-encrypted stream reading protocol. + +The accepted options are: +@table @option +@item key +Set the AES decryption key binary block from given hexadecimal representation. + +@item iv +Set the AES decryption initialization vector binary block from given hexadecimal representation. +@end table + +Accepted URL formats: +@example +crypto:@var{URL} +crypto+@var{URL} +@end example + +@section data + +Data in-line in the URI. See @url{http://en.wikipedia.org/wiki/Data_URI_scheme}. + +For example, to convert a GIF file given inline with @command{ffmpeg}: +@example +ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP///////////////ywAAAAACAAIAAADF0gEDLojDgdGiJdJqUX02iB4E8Q9jUMkADs=" smiley.png +@end example + +@section file + +File access protocol. + +Read from or write to a file. + +A file URL can have the form: +@example +file:@var{filename} +@end example + +where @var{filename} is the path of the file to read. + +An URL that does not have a protocol prefix will be assumed to be a +file URL. Depending on the build, an URL that looks like a Windows +path with the drive letter at the beginning will also be assumed to be +a file URL (usually not the case in builds for unix-like systems). + +For example to read from a file @file{input.mpeg} with @command{ffmpeg} +use the command: +@example +ffmpeg -i file:input.mpeg output.mpeg +@end example + +This protocol accepts the following options: + +@table @option +@item truncate +Truncate existing files on write, if set to 1. A value of 0 prevents +truncating. Default value is 1. + +@item blocksize +Set I/O operation maximum block size, in bytes. Default value is +@code{INT_MAX}, 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. +@end table + +@section ftp + +FTP (File Transfer Protocol). + +Read from or write to remote resources using FTP protocol. + +Following syntax is required. +@example +ftp://[user[:password]@@]server[:port]/path/to/remote/resource.mpeg +@end example + +This protocol accepts the following options. + +@table @option +@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. + +@item ftp-anonymous-password +Password used when login as anonymous user. Typically an e-mail address +should be used. + +@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. +@end table + +NOTE: 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 FTP servers behave in different way during seek +operation. ff* tools may produce incomplete content due to server limitations. + +@section gopher + +Gopher protocol. + +@section hls + +Read Apple HTTP Live Streaming compliant segmented stream as +a uniform one. The M3U8 playlists describing the segments can be +remote HTTP resources or local files, accessed using the standard +file protocol. +The nested protocol is declared by specifying +"+@var{proto}" after the hls URI scheme name, where @var{proto} +is either "file" or "http". + +@example +hls+http://host/path/to/remote/resource.m3u8 +hls+file://path/to/local/resource.m3u8 +@end example + +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. + +@section http + +HTTP (Hyper Text Transfer Protocol). + +This protocol accepts the following options: + +@table @option +@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. + +@item chunked_post +If set to 1 use chunked Transfer-Encoding for posts, default is 1. + +@item content_type +Set a specific content type for the POST messages. + +@item http_proxy +set HTTP proxy to tunnel through e.g. http://example.com:1234 + +@item headers +Set custom HTTP headers, can override built in default headers. The +value must be a string encoding the headers. + +@item multiple_requests +Use persistent connections if set to 1, default is 0. + +@item post_data +Set custom HTTP post data. + +@item user-agent +@item user_agent +Override the User-Agent header. If not specified the protocol will use a +string describing the libavformat build. ("Lavf/<version>") + +@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. + +@item reconnect_at_eof +If set then eof is treated like an error and causes reconnection, this is useful +for live / endless streams. + +@item reconnect_streamed +If set then even streamed/non seekable streams will be reconnected on errors. + +@item reconnect_delay_max +Sets the maximum delay in seconds after which to give up reconnecting + +@item mime_type +Export the MIME type. + +@item icy +If set to 1 request ICY (SHOUTcast) metadata from the server. If the server +supports this, the metadata has to be retrieved by the application by reading +the @option{icy_metadata_headers} and @option{icy_metadata_packet} options. +The default is 1. + +@item icy_metadata_headers +If the server supports ICY metadata, this contains the ICY-specific HTTP reply +headers, separated by newline characters. + +@item icy_metadata_packet +If the server supports ICY metadata, and @option{icy} 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. + +@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 HTTP response field. Multiple cookies can be +delimited by a newline character. + +@item offset +Set initial byte offset. + +@item end_offset +Try to limit the request to bytes preceding this offset. + +@item method +When used as a client option it sets the HTTP method for the request. + +When used as a server option it sets the HTTP method that is going to be +expected from the client(s). +If the expected and the received HTTP method do not match the client will +be given a Bad Request response. +When unset the HTTP method is not checked for now. This will be replaced by +autodetection in the future. + +@item listen +If set to 1 enables experimental HTTP server. This can be used to send data when +used as an output option, or read data from a client with HTTP POST when used as +an input option. +If set to 2 enables experimental mutli-client HTTP server. This is not yet implemented +in ffmpeg.c or ffserver.c and thus must not be used as a command line option. +@example +# Server side (sending): +ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://@var{server}:@var{port} + +# Client side (receiving): +ffmpeg -i http://@var{server}:@var{port} -c copy somefile.ogg + +# Client can also be done with wget: +wget http://@var{server}:@var{port} -O somefile.ogg + +# Server side (receiving): +ffmpeg -listen 1 -i http://@var{server}:@var{port} -c copy somefile.ogg + +# Client side (sending): +ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg http://@var{server}:@var{port} + +# Client can also be done with wget: +wget --post-file=somefile.ogg http://@var{server}:@var{port} +@end example + +@end table + +@subsection HTTP Cookies + +Some HTTP requests will be denied unless cookie values are passed in with the +request. The @option{cookies} option allows these cookies to be specified. At +the very least, each cookie must specify a value along with a path and domain. +HTTP requests that match both the domain and path will automatically include the +cookie value in the HTTP Cookie header field. Multiple cookies can be delimited +by a newline. + +The required syntax to play a stream specifying a cookie is: +@example +ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8 +@end example + +@section Icecast + +Icecast protocol (stream to Icecast servers) + +This protocol accepts the following options: + +@table @option +@item ice_genre +Set the stream genre. + +@item ice_name +Set the stream name. + +@item ice_description +Set the stream description. + +@item ice_url +Set the stream website URL. + +@item ice_public +Set if the stream should be public. +The default is 0 (not public). + +@item user_agent +Override the User-Agent header. If not specified a string of the form +"Lavf/<version>" will be used. + +@item password +Set the Icecast mountpoint password. + +@item content_type +Set the stream content type. This must be set if it is different from +audio/mpeg. + +@item legacy_icecast +This enables support for Icecast versions < 2.4.0, that do not support the +HTTP PUT method but the SOURCE method. + +@end table + +@example +icecast://[@var{username}[:@var{password}]@@]@var{server}:@var{port}/@var{mountpoint} +@end example + +@section mmst + +MMS (Microsoft Media Server) protocol over TCP. + +@section mmsh + +MMS (Microsoft Media Server) protocol over HTTP. + +The required syntax is: +@example +mmsh://@var{server}[:@var{port}][/@var{app}][/@var{playpath}] +@end example + +@section md5 + +MD5 output protocol. + +Computes the MD5 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. + +Some examples follow. +@example +# 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: +@end example + +Note that some formats (typically MOV) require the output protocol to +be seekable, so they will fail with the MD5 output protocol. + +@section pipe + +UNIX pipe access protocol. + +Read and write from UNIX pipes. + +The accepted syntax is: +@example +pipe:[@var{number}] +@end example + +@var{number} is the number corresponding to the file descriptor of the +pipe (e.g. 0 for stdin, 1 for stdout, 2 for stderr). If @var{number} +is not specified, by default the stdout file descriptor will be used +for writing, stdin for reading. + +For example to read from stdin with @command{ffmpeg}: +@example +cat test.wav | ffmpeg -i pipe:0 +# ...this is the same as... +cat test.wav | ffmpeg -i pipe: +@end example + +For writing to stdout with @command{ffmpeg}: +@example +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 +@end example + +This protocol accepts the following options: + +@table @option +@item blocksize +Set I/O operation maximum block size, in bytes. Default value is +@code{INT_MAX}, 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. +@end table + +Note that some formats (typically MOV), require the output protocol to +be seekable, so they will fail with the pipe output protocol. + +@section rtmp + +Real-Time Messaging Protocol. + +The Real-Time Messaging Protocol (RTMP) is used for streaming multimedia +content across a TCP/IP network. + +The required syntax is: +@example +rtmp://[@var{username}:@var{password}@@]@var{server}[:@var{port}][/@var{app}][/@var{instance}][/@var{playpath}] +@end example + +The accepted parameters are: +@table @option + +@item username +An optional username (mostly for publishing). + +@item password +An optional password (mostly for publishing). + +@item server +The address of the RTMP server. + +@item port +The number of the TCP port to use (by default is 1935). + +@item app +It is the name of the application to access. It usually corresponds to +the path where the application is installed on the RTMP server +(e.g. @file{/ondemand/}, @file{/flash/live/}, etc.). You can override +the value parsed from the URI through the @code{rtmp_app} option, too. + +@item playpath +It is the path or name of the resource to play with reference to the +application specified in @var{app}, may be prefixed by "mp4:". You +can override the value parsed from the URI through the @code{rtmp_playpath} +option, too. + +@item listen +Act as a server, listening for an incoming connection. + +@item timeout +Maximum time to wait for the incoming connection. Implies listen. +@end table + +Additionally, the following parameters can be set via command line options +(or in code via @code{AVOption}s): +@table @option + +@item rtmp_app +Name of application to connect on the RTMP server. This option +overrides the parameter specified in the URI. + +@item rtmp_buffer +Set the client buffer time in milliseconds. The default is 3000. + +@item rtmp_conn +Extra arbitrary AMF connection parameters, parsed from a string, +e.g. like @code{B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0}. +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 +FALSE or TRUE, 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. @code{NB:myFlag:1}). This option may be used multiple +times to construct arbitrary AMF sequences. + +@item rtmp_flashver +Version of the Flash plugin used to run the SWF player. The default +is LNX 9,0,124,2. (When publishing, the default is FMLE/3.0 (compatible; +<libavformat version>).) + +@item rtmp_flush_interval +Number of packets flushed in the same request (RTMPT only). The default +is 10. + +@item rtmp_live +Specify that the media is a live stream. No resuming or seeking in +live streams is possible. The default value is @code{any}, 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 @code{live} and +@code{recorded}. + +@item rtmp_pageurl +URL of the web page in which the media was embedded. By default no +value will be sent. + +@item rtmp_playpath +Stream identifier to play or to publish. This option overrides the +parameter specified in the URI. + +@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. + +@item rtmp_swfhash +SHA256 hash of the decompressed SWF file (32 bytes). + +@item rtmp_swfsize +Size of the decompressed SWF file, required for SWFVerification. + +@item rtmp_swfurl +URL of the SWF player for the media. By default no value will be sent. + +@item rtmp_swfverify +URL to player swf file, compute hash/size automatically. + +@item rtmp_tcurl +URL of the target stream. Defaults to proto://host[:port]/app. + +@end table + +For example to read with @command{ffplay} a multimedia resource named +"sample" from the application "vod" from an RTMP server "myserver": +@example +ffplay rtmp://myserver/vod/sample +@end example + +To publish to a password protected server, passing the playpath and +app names separately: +@example +ffmpeg -re -i <input> -f flv -rtmp_playpath some/long/path -rtmp_app long/app/name rtmp://username:password@@myserver/ +@end example + +@section rtmpe + +Encrypted Real-Time Messaging Protocol. + +The Encrypted Real-Time Messaging Protocol (RTMPE) is used for +streaming multimedia content within standard cryptographic primitives, +consisting of Diffie-Hellman key exchange and HMACSHA256, generating +a pair of RC4 keys. + +@section rtmps + +Real-Time Messaging Protocol over a secure SSL connection. + +The Real-Time Messaging Protocol (RTMPS) is used for streaming +multimedia content across an encrypted connection. + +@section rtmpt + +Real-Time Messaging Protocol tunneled through HTTP. + +The Real-Time Messaging Protocol tunneled through HTTP (RTMPT) is used +for streaming multimedia content within HTTP requests to traverse +firewalls. + +@section rtmpte + +Encrypted Real-Time Messaging Protocol tunneled through HTTP. + +The Encrypted Real-Time Messaging Protocol tunneled through HTTP (RTMPTE) +is used for streaming multimedia content within HTTP requests to traverse +firewalls. + +@section rtmpts + +Real-Time Messaging Protocol tunneled through HTTPS. + +The Real-Time Messaging Protocol tunneled through HTTPS (RTMPTS) is used +for streaming multimedia content within HTTPS requests to traverse +firewalls. + +@section libsmbclient + +libsmbclient permits one to manipulate CIFS/SMB network resources. + +Following syntax is required. + +@example +smb://[[domain:]user[:password@@]]server[/share[/path[/file]]] +@end example + +This protocol accepts the following options. + +@table @option +@item timeout +Set timeout in miliseconds 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. + +@item truncate +Truncate existing files on write, if set to 1. A value of 0 prevents +truncating. Default value is 1. + +@item workgroup +Set the workgroup used for making connections. By default workgroup is not specified. + +@end table + +For more information see: @url{http://www.samba.org/}. + +@section libssh + +Secure File Transfer Protocol via libssh + +Read from or write to remote resources using SFTP protocol. + +Following syntax is required. + +@example +sftp://[user[:password]@@]server[:port]/path/to/remote/resource.mpeg +@end example + +This protocol accepts the following options. + +@table @option +@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. + +@item truncate +Truncate existing files on write, if set to 1. A value of 0 prevents +truncating. Default value is 1. + +@item private_key +Specify the path of the file containing private key to use during authorization. +By default libssh searches for keys in the @file{~/.ssh/} directory. + +@end table + +Example: Play a file stored on remote server. + +@example +ffplay sftp://user:password@@server_address:22/home/user/resource.mpeg +@end example + +@section librtmp rtmp, rtmpe, rtmps, rtmpt, rtmpte + +Real-Time Messaging Protocol and its variants supported through +librtmp. + +Requires the presence of the librtmp headers and library during +configuration. You need to explicitly configure the build with +"--enable-librtmp". If enabled this will replace the native RTMP +protocol. + +This protocol provides most client functions and a few server +functions needed to support RTMP, RTMP tunneled in HTTP (RTMPT), +encrypted RTMP (RTMPE), RTMP over SSL/TLS (RTMPS) and tunneled +variants of these encrypted types (RTMPTE, RTMPTS). + +The required syntax is: +@example +@var{rtmp_proto}://@var{server}[:@var{port}][/@var{app}][/@var{playpath}] @var{options} +@end example + +where @var{rtmp_proto} is one of the strings "rtmp", "rtmpt", "rtmpe", +"rtmps", "rtmpte", "rtmpts" corresponding to each RTMP variant, and +@var{server}, @var{port}, @var{app} and @var{playpath} have the same +meaning as specified for the RTMP native protocol. +@var{options} contains a list of space-separated options of the form +@var{key}=@var{val}. + +See the librtmp manual page (man 3 librtmp) for more information. + +For example, to stream a file in real-time to an RTMP server using +@command{ffmpeg}: +@example +ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream +@end example + +To play the same stream using @command{ffplay}: +@example +ffplay "rtmp://myserver/live/mystream live=1" +@end example + +@section rtp + +Real-time Transport Protocol. + +The required syntax for an RTP URL is: +rtp://@var{hostname}[:@var{port}][?@var{option}=@var{val}...] + +@var{port} specifies the RTP port to use. + +The following URL options are supported: + +@table @option + +@item ttl=@var{n} +Set the TTL (Time-To-Live) value (for multicast only). + +@item rtcpport=@var{n} +Set the remote RTCP port to @var{n}. + +@item localrtpport=@var{n} +Set the local RTP port to @var{n}. + +@item localrtcpport=@var{n}' +Set the local RTCP port to @var{n}. + +@item pkt_size=@var{n} +Set max packet size (in bytes) to @var{n}. + +@item connect=0|1 +Do a @code{connect()} on the UDP socket (if set to 1) or not (if set +to 0). + +@item sources=@var{ip}[,@var{ip}] +List allowed source IP addresses. + +@item block=@var{ip}[,@var{ip}] +List disallowed (blocked) source IP addresses. + +@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). + +@item localport=@var{n} +Set the local RTP port to @var{n}. + +This is a deprecated option. Instead, @option{localrtpport} should be +used. + +@end table + +Important notes: + +@enumerate + +@item +If @option{rtcpport} is not set the RTCP port will be set to the RTP +port value plus 1. + +@item +If @option{localrtpport} (the local RTP port) is not set any available +port will be used for the local RTP and RTCP ports. + +@item +If @option{localrtcpport} (the local RTCP port) is not set it will be +set to the local RTP port value plus 1. +@end enumerate + +@section rtsp + +Real-Time Streaming Protocol. + +RTSP is not technically a protocol handler in libavformat, it is a demuxer +and muxer. The demuxer supports both normal RTSP (with data transferred +over RTP; this is used by e.g. Apple and Microsoft) and Real-RTSP (with +data transferred over RDT). + +The muxer can be used to send a stream using RTSP ANNOUNCE to a server +supporting it (currently Darwin Streaming Server and Mischa Spiegelmock's +@uref{https://github.com/revmischa/rtsp-server, RTSP server}). + +The required syntax for a RTSP url is: +@example +rtsp://@var{hostname}[:@var{port}]/@var{path} +@end example + +Options can be set on the @command{ffmpeg}/@command{ffplay} command +line, or set in code via @code{AVOption}s or in +@code{avformat_open_input}. + +The following options are supported. + +@table @option +@item initial_pause +Do not start playing the stream immediately if set to 1. Default value +is 0. + +@item rtsp_transport +Set RTSP transport protocols. + +It accepts the following values: +@table @samp +@item udp +Use UDP as lower transport protocol. + +@item tcp +Use TCP (interleaving within the RTSP control channel) as lower +transport protocol. + +@item udp_multicast +Use UDP multicast as lower transport protocol. + +@item http +Use HTTP tunneling as lower transport protocol, which is useful for +passing proxies. +@end table + +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 @samp{tcp} and @samp{udp} options are supported. + +@item rtsp_flags +Set RTSP flags. + +The following values are accepted: +@table @samp +@item filter_src +Accept packets only from negotiated peer address and port. +@item listen +Act as a server, listening for an incoming connection. +@item prefer_tcp +Try TCP for RTP transport first, if TCP is available as RTSP RTP transport. +@end table + +Default value is @samp{none}. + +@item allowed_media_types +Set media types to accept from the server. + +The following flags are accepted: +@table @samp +@item video +@item audio +@item data +@end table + +By default it accepts all media types. + +@item min_port +Set minimum local UDP port. Default value is 5000. + +@item max_port +Set maximum local UDP port. Default value is 65000. + +@item timeout +Set maximum timeout (in seconds) to wait for incoming connections. + +A value of -1 means infinite (default). This option implies the +@option{rtsp_flags} set to @samp{listen}. + +@item reorder_queue_size +Set number of packets to buffer for handling of reordered packets. + +@item stimeout +Set socket TCP I/O timeout in microseconds. + +@item user-agent +Override User-Agent header. If not specified, it defaults to the +libavformat identifier string. +@end table + +When receiving data over UDP, 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 @code{max_delay} field of AVFormatContext). + +When watching multi-bitrate Real-RTSP streams with @command{ffplay}, the +streams to display can be chosen with @code{-vst} @var{n} and +@code{-ast} @var{n} for video and audio respectively, and can be switched +on the fly by pressing @code{v} and @code{a}. + +@subsection Examples + +The following examples all make use of the @command{ffplay} and +@command{ffmpeg} tools. + +@itemize +@item +Watch a stream over UDP, with a max reordering delay of 0.5 seconds: +@example +ffplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4 +@end example + +@item +Watch a stream tunneled over HTTP: +@example +ffplay -rtsp_transport http rtsp://server/video.mp4 +@end example + +@item +Send a stream in realtime to a RTSP server, for others to watch: +@example +ffmpeg -re -i @var{input} -f rtsp -muxdelay 0.1 rtsp://server/live.sdp +@end example + +@item +Receive a stream in realtime: +@example +ffmpeg -rtsp_flags listen -i rtsp://ownaddress/live.sdp @var{output} +@end example +@end itemize + +@section sap + +Session Announcement Protocol (RFC 2974). This is not technically a +protocol handler in libavformat, it is a muxer and demuxer. +It is used for signalling of RTP streams, by announcing the SDP for the +streams regularly on a separate port. + +@subsection Muxer + +The syntax for a SAP url given to the muxer is: +@example +sap://@var{destination}[:@var{port}][?@var{options}] +@end example + +The RTP packets are sent to @var{destination} on port @var{port}, +or to port 5004 if no port is specified. +@var{options} is a @code{&}-separated list. The following options +are supported: + +@table @option + +@item announce_addr=@var{address} +Specify the destination IP address for sending the announcements to. +If omitted, the announcements are sent to the commonly used SAP +announcement multicast address 224.2.127.254 (sap.mcast.net), or +ff0e::2:7ffe if @var{destination} is an IPv6 address. + +@item announce_port=@var{port} +Specify the port to send the announcements on, defaults to +9875 if not specified. + +@item ttl=@var{ttl} +Specify the time to live value for the announcements and RTP packets, +defaults to 255. + +@item same_port=@var{0|1} +If set to 1, send all RTP streams on the same port pair. If zero (the +default), all streams are sent on unique ports, with each stream on a +port 2 numbers higher than the previous. +VLC/Live555 requires this to be set to 1, to be able to receive the stream. +The RTP stack in libavformat for receiving requires all streams to be sent +on unique ports. +@end table + +Example command lines follow. + +To broadcast a stream on the local subnet, for watching in VLC: + +@example +ffmpeg -re -i @var{input} -f sap sap://224.0.0.255?same_port=1 +@end example + +Similarly, for watching in @command{ffplay}: + +@example +ffmpeg -re -i @var{input} -f sap sap://224.0.0.255 +@end example + +And for watching in @command{ffplay}, over IPv6: + +@example +ffmpeg -re -i @var{input} -f sap sap://[ff0e::1:2:3:4] +@end example + +@subsection Demuxer + +The syntax for a SAP url given to the demuxer is: +@example +sap://[@var{address}][:@var{port}] +@end example + +@var{address} is the multicast address to listen for announcements on, +if omitted, the default 224.2.127.254 (sap.mcast.net) is used. @var{port} +is the port that is listened on, 9875 if omitted. + +The demuxers listens for announcements on the given address and port. +Once an announcement is received, it tries to receive that particular stream. + +Example command lines follow. + +To play back the first stream announced on the normal SAP multicast address: + +@example +ffplay sap:// +@end example + +To play back the first stream announced on one the default IPv6 SAP multicast address: + +@example +ffplay sap://[ff0e::2:7ffe] +@end example + +@section sctp + +Stream Control Transmission Protocol. + +The accepted URL syntax is: +@example +sctp://@var{host}:@var{port}[?@var{options}] +@end example + +The protocol accepts the following options: +@table @option +@item listen +If set to any value, listen for an incoming connection. Outgoing connection is done by default. + +@item max_streams +Set the maximum number of streams. By default no limit is set. +@end table + +@section srtp + +Secure Real-time Transport Protocol. + +The accepted options are: +@table @option +@item srtp_in_suite +@item srtp_out_suite +Select input and output encoding suites. + +Supported values: +@table @samp +@item AES_CM_128_HMAC_SHA1_80 +@item SRTP_AES128_CM_HMAC_SHA1_80 +@item AES_CM_128_HMAC_SHA1_32 +@item SRTP_AES128_CM_HMAC_SHA1_32 +@end table + +@item srtp_in_params +@item srtp_out_params +Set input and output encoding parameters, which are expressed by a +base64-encoded representation of a binary block. The first 16 bytes of +this binary block are used as master key, the following 14 bytes are +used as master salt. +@end table + +@section subfile + +Virtually extract a segment of a file or another stream. +The underlying stream must be seekable. + +Accepted options: +@table @option +@item start +Start offset of the extracted segment, in bytes. +@item end +End offset of the extracted segment, in bytes. +@end table + +Examples: + +Extract a chapter from a DVD VOB file (start and end sectors obtained +externally and multiplied by 2048): +@example +subfile,,start,153391104,end,268142592,,:/media/dvd/VIDEO_TS/VTS_08_1.VOB +@end example + +Play an AVI file directly from a TAR archive: +@example +subfile,,start,183241728,end,366490624,,:archive.tar +@end example + +@section tcp + +Transmission Control Protocol. + +The required syntax for a TCP url is: +@example +tcp://@var{hostname}:@var{port}[?@var{options}] +@end example + +@var{options} contains a list of &-separated options of the form +@var{key}=@var{val}. + +The list of supported options follows. + +@table @option +@item listen=@var{1|0} +Listen for an incoming connection. Default value is 0. + +@item timeout=@var{microseconds} +Set raise error timeout, expressed in microseconds. + +This option is only relevant in read mode: if no data arrived in more +than this time interval, raise error. + +@item listen_timeout=@var{milliseconds} +Set listen timeout, expressed in milliseconds. + +@item recv_buffer_size=@var{bytes} +Set receive buffer size, expressed bytes. + +@item send_buffer_size=@var{bytes} +Set send buffer size, expressed bytes. +@end table + +The following example shows how to setup a listening TCP connection +with @command{ffmpeg}, which is then accessed with @command{ffplay}: +@example +ffmpeg -i @var{input} -f @var{format} tcp://@var{hostname}:@var{port}?listen +ffplay tcp://@var{hostname}:@var{port} +@end example + +@section tls + +Transport Layer Security (TLS) / Secure Sockets Layer (SSL) + +The required syntax for a TLS/SSL url is: +@example +tls://@var{hostname}:@var{port}[?@var{options}] +@end example + +The following parameters can be set via command line options +(or in code via @code{AVOption}s): + +@table @option + +@item ca_file, cafile=@var{filename} +A file containing certificate authority (CA) root certificates to treat +as trusted. If the linked TLS library contains a default this might not +need to be specified for verification to work, but not all libraries and +setups have defaults built in. +The file must be in OpenSSL PEM format. + +@item tls_verify=@var{1|0} +If enabled, try to verify the peer that we are communicating with. +Note, if using OpenSSL, this currently only makes sure that the +peer certificate is signed by one of the root certificates in the CA +database, but it does not validate that the certificate actually +matches the host name we are trying to connect to. (With GnuTLS, +the host name is validated as well.) + +This is disabled by default since it requires a CA database to be +provided by the caller in many cases. + +@item cert_file, cert=@var{filename} +A file containing a certificate to use in the handshake with the peer. +(When operating as server, in listen mode, this is more often required +by the peer, while client certificates only are mandated in certain +setups.) + +@item key_file, key=@var{filename} +A file containing the private key for the certificate. + +@item listen=@var{1|0} +If enabled, listen for connections on the provided port, and assume +the server role in the handshake instead of the client role. + +@end table + +Example command lines: + +To create a TLS/SSL server that serves an input stream. + +@example +ffmpeg -i @var{input} -f @var{format} tls://@var{hostname}:@var{port}?listen&cert=@var{server.crt}&key=@var{server.key} +@end example + +To play back a stream from the TLS/SSL server using @command{ffplay}: + +@example +ffplay tls://@var{hostname}:@var{port} +@end example + +@section udp + +User Datagram Protocol. + +The required syntax for an UDP URL is: +@example +udp://@var{hostname}:@var{port}[?@var{options}] +@end example + +@var{options} contains a list of &-separated options of the form @var{key}=@var{val}. + +In case threading is enabled on the system, a circular buffer is used +to store the incoming data, which allows one to reduce loss of data due to +UDP socket buffer overruns. The @var{fifo_size} and +@var{overrun_nonfatal} options are related to this buffer. + +The list of supported options follows. + +@table @option +@item buffer_size=@var{size} +Set the UDP maximum socket buffer size in bytes. This is used to set either +the receive or send buffer size, depending on what the socket is used for. +Default is 64KB. See also @var{fifo_size}. + +@item localport=@var{port} +Override the local UDP port to bind with. + +@item localaddr=@var{addr} +Choose the local IP address. This is useful e.g. if sending multicast +and the host has multiple interfaces, where the user can choose +which interface to send on by specifying the IP address of that interface. + +@item pkt_size=@var{size} +Set the size in bytes of UDP packets. + +@item reuse=@var{1|0} +Explicitly allow or disallow reusing UDP sockets. + +@item ttl=@var{ttl} +Set the time to live value (for multicast only). + +@item connect=@var{1|0} +Initialize the UDP socket with @code{connect()}. In this case, the +destination address can't be changed with ff_udp_set_remote_url later. +If the destination address isn't known at the start, this option can +be specified in ff_udp_set_remote_url, too. +This allows finding out the source address for the packets with getsockname, +and makes writes return with AVERROR(ECONNREFUSED) if "destination +unreachable" is received. +For receiving, this gives the benefit of only receiving packets from +the specified peer address/port. + +@item sources=@var{address}[,@var{address}] +Only receive packets sent to the multicast group from one of the +specified sender IP addresses. + +@item block=@var{address}[,@var{address}] +Ignore packets sent to the multicast group from the specified +sender IP addresses. + +@item fifo_size=@var{units} +Set the UDP receiving circular buffer size, expressed as a number of +packets with size of 188 bytes. If not specified defaults to 7*4096. + +@item overrun_nonfatal=@var{1|0} +Survive in case of UDP receiving circular buffer overrun. Default +value is 0. + +@item timeout=@var{microseconds} +Set raise error timeout, expressed in microseconds. + +This option is only relevant in read mode: if no data arrived in more +than this time interval, raise error. + +@item broadcast=@var{1|0} +Explicitly allow or disallow UDP broadcasting. + +Note that broadcasting may not work properly on networks having +a broadcast storm protection. +@end table + +@subsection Examples + +@itemize +@item +Use @command{ffmpeg} to stream over UDP to a remote endpoint: +@example +ffmpeg -i @var{input} -f @var{format} udp://@var{hostname}:@var{port} +@end example + +@item +Use @command{ffmpeg} to stream in mpegts format over UDP using 188 +sized UDP packets, using a large input buffer: +@example +ffmpeg -i @var{input} -f mpegts udp://@var{hostname}:@var{port}?pkt_size=188&buffer_size=65535 +@end example + +@item +Use @command{ffmpeg} to receive over UDP from a remote endpoint: +@example +ffmpeg -i udp://[@var{multicast-address}]:@var{port} ... +@end example +@end itemize + +@section unix + +Unix local socket + +The required syntax for a Unix socket URL is: + +@example +unix://@var{filepath} +@end example + +The following parameters can be set via command line options +(or in code via @code{AVOption}s): + +@table @option +@item timeout +Timeout in ms. +@item listen +Create the Unix socket in listening mode. +@end table + +@c man end PROTOCOLS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/rate_distortion.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/rate_distortion.txt new file mode 100644 index 0000000..e9711c2 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/rate_distortion.txt
@@ -0,0 +1,61 @@ +A Quick Description Of Rate Distortion Theory. + +We want to encode a video, picture or piece of music optimally. What does +"optimally" really mean? It means that we want to get the best quality at a +given filesize OR we want to get the smallest filesize at a given quality +(in practice, these 2 goals are usually the same). + +Solving this directly is not practical; trying all byte sequences 1 +megabyte in length and selecting the "best looking" sequence will yield +256^1000000 cases to try. + +But first, a word about quality, which is also called distortion. +Distortion can be quantified by almost any quality measurement one chooses. +Commonly, the sum of squared differences is used but more complex methods +that consider psychovisual effects can be used as well. It makes no +difference in this discussion. + + +First step: that rate distortion factor called lambda... +Let's consider the problem of minimizing: + + distortion + lambda*rate + +rate is the filesize +distortion is the quality +lambda is a fixed value chosen as a tradeoff between quality and filesize +Is this equivalent to finding the best quality for a given max +filesize? The answer is yes. For each filesize limit there is some lambda +factor for which minimizing above will get you the best quality (using your +chosen quality measurement) at the desired (or lower) filesize. + + +Second step: splitting the problem. +Directly splitting the problem of finding the best quality at a given +filesize is hard because we do not know how many bits from the total +filesize should be allocated to each of the subproblems. But the formula +from above: + + distortion + lambda*rate + +can be trivially split. Consider: + + (distortion0 + distortion1) + lambda*(rate0 + rate1) + +This creates a problem made of 2 independent subproblems. The subproblems +might be 2 16x16 macroblocks in a frame of 32x16 size. To minimize: + + (distortion0 + distortion1) + lambda*(rate0 + rate1) + +we just have to minimize: + + distortion0 + lambda*rate0 + +and + + distortion1 + lambda*rate1 + +I.e, the 2 problems can be solved independently. + +Author: Michael Niedermayer +Copyright: LGPL
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/resampler.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/resampler.texi new file mode 100644 index 0000000..cb7d536 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/resampler.texi
@@ -0,0 +1,232 @@ +@chapter Resampler Options +@c man begin RESAMPLER OPTIONS + +The audio resampler supports the following named options. + +Options may be set by specifying -@var{option} @var{value} in the +FFmpeg tools, @var{option}=@var{value} for the aresample filter, +by setting the value explicitly in the +@code{SwrContext} options or using the @file{libavutil/opt.h} API for +programmatic use. + +@table @option + +@item ich, in_channel_count +Set the number of input channels. Default value is 0. Setting this +value is not mandatory if the corresponding channel layout +@option{in_channel_layout} is set. + +@item och, out_channel_count +Set the number of output channels. Default value is 0. Setting this +value is not mandatory if the corresponding channel layout +@option{out_channel_layout} is set. + +@item uch, used_channel_count +Set the number of used input channels. Default value is 0. This option is +only used for special remapping. + +@item isr, in_sample_rate +Set the input sample rate. Default value is 0. + +@item osr, out_sample_rate +Set the output sample rate. Default value is 0. + +@item isf, in_sample_fmt +Specify the input sample format. It is set by default to @code{none}. + +@item osf, out_sample_fmt +Specify the output sample format. It is set by default to @code{none}. + +@item tsf, internal_sample_fmt +Set the internal sample format. Default value is @code{none}. +This will automatically be chosen when it is not explicitly set. + +@item icl, in_channel_layout +@item ocl, out_channel_layout +Set the input/output channel layout. + +See @ref{channel layout syntax,,the Channel Layout section in the ffmpeg-utils(1) manual,ffmpeg-utils} +for the required syntax. + +@item clev, center_mix_level +Set the center mix level. It is a value expressed in deciBel, and must be +in the interval [-32,32]. + +@item slev, surround_mix_level +Set the surround mix level. It is a value expressed in deciBel, and must +be in the interval [-32,32]. + +@item lfe_mix_level +Set LFE mix into non LFE level. It is used when there is a LFE input but no +LFE output. It is a value expressed in deciBel, and must +be in the interval [-32,32]. + +@item rmvol, rematrix_volume +Set rematrix volume. Default value is 1.0. + +@item rematrix_maxval +Set maximum output value for rematrixing. +This can be used to prevent clipping vs. preventing volume reduction. +A value of 1.0 prevents clipping. + +@item flags, swr_flags +Set flags used by the converter. Default value is 0. + +It supports the following individual flags: +@table @option +@item res +force resampling, this flag forces resampling to be used even when the +input and output sample rates match. +@end table + +@item dither_scale +Set the dither scale. Default value is 1. + +@item dither_method +Set dither method. Default value is 0. + +Supported values: +@table @samp +@item rectangular +select rectangular dither +@item triangular +select triangular dither +@item triangular_hp +select triangular dither with high pass +@item lipshitz +select Lipshitz noise shaping dither. +@item shibata +select Shibata noise shaping dither. +@item low_shibata +select low Shibata noise shaping dither. +@item high_shibata +select high Shibata noise shaping dither. +@item f_weighted +select f-weighted noise shaping dither +@item modified_e_weighted +select modified-e-weighted noise shaping dither +@item improved_e_weighted +select improved-e-weighted noise shaping dither + +@end table + +@item resampler +Set resampling engine. Default value is swr. + +Supported values: +@table @samp +@item swr +select the native SW Resampler; filter options precision and cheby are not +applicable in this case. +@item soxr +select the SoX Resampler (where available); compensation, and filter options +filter_size, phase_shift, filter_type & kaiser_beta, are not applicable in this +case. +@end table + +@item filter_size +For swr only, set resampling filter size, default value is 32. + +@item phase_shift +For swr only, set resampling phase shift, default value is 10, and must be in +the interval [0,30]. + +@item linear_interp +Use linear interpolation if set to 1, default value is 0. + +@item cutoff +Set cutoff frequency (swr: 6dB point; soxr: 0dB point) ratio; must be a float +value between 0 and 1. Default value is 0.97 with swr, and 0.91 with soxr +(which, with a sample-rate of 44100, preserves the entire audio band to 20kHz). + +@item precision +For soxr only, the precision in bits to which the resampled signal will be +calculated. The default value of 20 (which, with suitable dithering, is +appropriate for a destination bit-depth of 16) gives SoX's 'High Quality'; a +value of 28 gives SoX's 'Very High Quality'. + +@item cheby +For soxr only, selects passband rolloff none (Chebyshev) & higher-precision +approximation for 'irrational' ratios. Default value is 0. + +@item async +For swr only, simple 1 parameter audio sync to timestamps using stretching, +squeezing, filling and trimming. Setting this to 1 will enable filling and +trimming, larger values represent the maximum amount in samples that the data +may be stretched or squeezed for each second. +Default value is 0, thus no compensation is applied to make the samples match +the audio timestamps. + +@item first_pts +For swr only, assume the first pts should be this value. The time unit is 1 / sample rate. +This allows for padding/trimming at the start of stream. By default, no +assumption is made about the first frame's expected pts, so no padding or +trimming is done. For example, this could be set to 0 to pad the beginning with +silence if an audio stream starts after the video stream or to trim any samples +with a negative pts due to encoder delay. + +@item min_comp +For swr only, set the minimum difference between timestamps and audio data (in +seconds) to trigger stretching/squeezing/filling or trimming of the +data to make it match the timestamps. The default is that +stretching/squeezing/filling and trimming is disabled +(@option{min_comp} = @code{FLT_MAX}). + +@item min_hard_comp +For swr only, 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 (trim/fill) and soft (squeeze/stretch) compensation. Note that +all compensation is by default disabled through @option{min_comp}. +The default is 0.1. + +@item comp_duration +For swr only, set duration (in seconds) over which data is stretched/squeezed +to make it match the timestamps. Must be a non-negative double float value, +default value is 1.0. + +@item max_soft_comp +For swr only, set maximum factor by which data is stretched/squeezed to make it +match the timestamps. Must be a non-negative double float value, default value +is 0. + +@item matrix_encoding +Select matrixed stereo encoding. + +It accepts the following values: +@table @samp +@item none +select none +@item dolby +select Dolby +@item dplii +select Dolby Pro Logic II +@end table + +Default value is @code{none}. + +@item filter_type +For swr only, select resampling filter type. This only affects resampling +operations. + +It accepts the following values: +@table @samp +@item cubic +select cubic +@item blackman_nuttall +select Blackman Nuttall windowed sinc +@item kaiser +select Kaiser windowed sinc +@end table + +@item kaiser_beta +For swr only, set Kaiser window beta value. Must be a double float value in the +interval [2,16], default value is 9. + +@item output_sample_bits +For swr only, set number of used output sample bits for dithering. Must be an integer in the +interval [0,64], default value is 0, which means it's not used. + +@end table + +@c man end RESAMPLER OPTIONS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/scaler.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/scaler.texi new file mode 100644 index 0000000..3e115cd --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/scaler.texi
@@ -0,0 +1,144 @@ +@anchor{scaler_options} +@chapter Scaler Options +@c man begin SCALER OPTIONS + +The video scaler supports the following named options. + +Options may be set by specifying -@var{option} @var{value} in the +FFmpeg tools. For programmatic use, they can be set explicitly in the +@code{SwsContext} options or through the @file{libavutil/opt.h} API. + +@table @option + +@anchor{sws_flags} +@item sws_flags +Set the scaler flags. This is also used to set the scaling +algorithm. Only a single algorithm should be selected. + +It accepts the following values: +@table @samp +@item fast_bilinear +Select fast bilinear scaling algorithm. + +@item bilinear +Select bilinear scaling algorithm. + +@item bicubic +Select bicubic scaling algorithm. + +@item experimental +Select experimental scaling algorithm. + +@item neighbor +Select nearest neighbor rescaling algorithm. + +@item area +Select averaging area rescaling algorithm. + +@item bicublin +Select bicubic scaling algorithm for the luma component, bilinear for +chroma components. + +@item gauss +Select Gaussian rescaling algorithm. + +@item sinc +Select sinc rescaling algorithm. + +@item lanczos +Select Lanczos rescaling algorithm. + +@item spline +Select natural bicubic spline rescaling algorithm. + +@item print_info +Enable printing/debug logging. + +@item accurate_rnd +Enable accurate rounding. + +@item full_chroma_int +Enable full chroma interpolation. + +@item full_chroma_inp +Select full chroma input. + +@item bitexact +Enable bitexact output. +@end table + +@item srcw +Set source width. + +@item srch +Set source height. + +@item dstw +Set destination width. + +@item dsth +Set destination height. + +@item src_format +Set source pixel format (must be expressed as an integer). + +@item dst_format +Set destination pixel format (must be expressed as an integer). + +@item src_range +Select source range. + +@item dst_range +Select destination range. + +@anchor{sws_params} +@item param0, param1 +Set scaling algorithm parameters. The specified values are specific of +some scaling algorithms and ignored by others. The specified values +are floating point number values. + +@item sws_dither +Set the dithering algorithm. Accepts one of the following +values. Default value is @samp{auto}. + +@table @samp +@item auto +automatic choice + +@item none +no dithering + +@item bayer +bayer dither + +@item ed +error diffusion dither + +@item a_dither +arithmetic dither, based using addition + +@item x_dither +arithmetic dither, based using xor (more random/less apparent patterning that +a_dither). + +@end table + +@item alphablend +Set the alpha blending to use when the input has alpha but the output does not. +Default value is @samp{none}. + +@table @samp +@item uniform_color +Blend onto a uniform background color + +@item checkerboard +Blend onto a checkerboard + +@item none +No blending + +@end table + +@end table + +@c man end SCALER OPTIONS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/snow.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/snow.txt new file mode 100644 index 0000000..9d5778d --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/snow.txt
@@ -0,0 +1,637 @@ +============================================= +Snow Video Codec Specification Draft 20080110 +============================================= + +Introduction: +============= +This specification describes the Snow bitstream syntax and semantics as +well as the formal Snow decoding process. + +The decoding process is described precisely and any compliant decoder +MUST produce the exact same output for a spec-conformant Snow stream. +For encoding, though, any process which generates a stream compliant to +the syntactical and semantic requirements and which is decodable by +the process described in this spec shall be considered a conformant +Snow encoder. + +Definitions: +============ + +MUST the specific part must be done to conform to this standard +SHOULD it is recommended to be done that way, but not strictly required + +ilog2(x) is the rounded down logarithm of x with basis 2 +ilog2(0) = 0 + +Type definitions: +================= + +b 1-bit range coded +u unsigned scalar value range coded +s signed scalar value range coded + + +Bitstream syntax: +================= + +frame: + header + prediction + residual + +header: + keyframe b MID_STATE + if(keyframe || always_reset) + reset_contexts + if(keyframe){ + version u header_state + always_reset b header_state + temporal_decomposition_type u header_state + temporal_decomposition_count u header_state + spatial_decomposition_count u header_state + colorspace_type u header_state + if (nb_planes > 2) { + chroma_h_shift u header_state + chroma_v_shift u header_state + } + spatial_scalability b header_state + max_ref_frames-1 u header_state + qlogs + } + if(!keyframe){ + update_mc b header_state + if(update_mc){ + for(plane=0; plane<nb_plane_types; plane++){ + diag_mc b header_state + htaps/2-1 u header_state + for(i= p->htaps/2; i; i--) + |hcoeff[i]| u header_state + } + } + update_qlogs b header_state + if(update_qlogs){ + spatial_decomposition_count u header_state + qlogs + } + } + + spatial_decomposition_type s header_state + qlog s header_state + mv_scale s header_state + qbias s header_state + block_max_depth s header_state + +qlogs: + for(plane=0; plane<nb_plane_types; plane++){ + quant_table[plane][0][0] s header_state + for(level=0; level < spatial_decomposition_count; level++){ + quant_table[plane][level][1]s header_state + quant_table[plane][level][3]s header_state + } + } + +reset_contexts + *_state[*]= MID_STATE + +prediction: + for(y=0; y<block_count_vertical; y++) + for(x=0; x<block_count_horizontal; x++) + block(0) + +block(level): + mvx_diff=mvy_diff=y_diff=cb_diff=cr_diff=0 + if(keyframe){ + intra=1 + }else{ + if(level!=max_block_depth){ + s_context= 2*left->level + 2*top->level + topleft->level + topright->level + leaf b block_state[4 + s_context] + } + if(level==max_block_depth || leaf){ + intra b block_state[1 + left->intra + top->intra] + if(intra){ + y_diff s block_state[32] + cb_diff s block_state[64] + cr_diff s block_state[96] + }else{ + ref_context= ilog2(2*left->ref) + ilog2(2*top->ref) + if(ref_frames > 1) + ref u block_state[128 + 1024 + 32*ref_context] + mx_context= ilog2(2*abs(left->mx - top->mx)) + my_context= ilog2(2*abs(left->my - top->my)) + mvx_diff s block_state[128 + 32*(mx_context + 16*!!ref)] + mvy_diff s block_state[128 + 32*(my_context + 16*!!ref)] + } + }else{ + block(level+1) + block(level+1) + block(level+1) + block(level+1) + } + } + + +residual: + residual2(luma) + if (nb_planes > 2) { + residual2(chroma_cr) + residual2(chroma_cb) + } + +residual2: + for(level=0; level<spatial_decomposition_count; level++){ + if(level==0) + subband(LL, 0) + subband(HL, level) + subband(LH, level) + subband(HH, level) + } + +subband: + FIXME + +nb_plane_types = gray ? 1 : 2; + +Tag description: +---------------- + +version + 0 + this MUST NOT change within a bitstream + +always_reset + if 1 then the range coder contexts will be reset after each frame + +temporal_decomposition_type + 0 + +temporal_decomposition_count + 0 + +spatial_decomposition_count + FIXME + +colorspace_type + 0 unspecified YcbCr + 1 Gray + 2 Gray + Alpha + 3 GBR + 4 GBRA + this MUST NOT change within a bitstream + +chroma_h_shift + log2(luma.width / chroma.width) + this MUST NOT change within a bitstream + +chroma_v_shift + log2(luma.height / chroma.height) + this MUST NOT change within a bitstream + +spatial_scalability + 0 + +max_ref_frames + maximum number of reference frames + this MUST NOT change within a bitstream + +update_mc + indicates that motion compensation filter parameters are stored in the + header + +diag_mc + flag to enable faster diagonal interpolation + this SHOULD be 1 unless it turns out to be covered by a valid patent + +htaps + number of half pel interpolation filter taps, MUST be even, >0 and <10 + +hcoeff + half pel interpolation filter coefficients, hcoeff[0] are the 2 middle + coefficients [1] are the next outer ones and so on, resulting in a filter + like: ...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... + the sign of the coefficients is not explicitly stored but alternates + after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... + hcoeff[0] is not explicitly stored but found by subtracting the sum + of all stored coefficients with signs from 32 + hcoeff[0]= 32 - hcoeff[1] - hcoeff[2] - ... + a good choice for hcoeff and htaps is + htaps= 6 + hcoeff={40,-10,2} + an alternative which requires more computations at both encoder and + decoder side and may or may not be better is + htaps= 8 + hcoeff={42,-14,6,-2} + + +ref_frames + minimum of the number of available reference frames and max_ref_frames + for example the first frame after a key frame always has ref_frames=1 + +spatial_decomposition_type + wavelet type + 0 is a 9/7 symmetric compact integer wavelet + 1 is a 5/3 symmetric compact integer wavelet + others are reserved + stored as delta from last, last is reset to 0 if always_reset || keyframe + +qlog + quality (logarthmic quantizer scale) + stored as delta from last, last is reset to 0 if always_reset || keyframe + +mv_scale + stored as delta from last, last is reset to 0 if always_reset || keyframe + FIXME check that everything works fine if this changes between frames + +qbias + dequantization bias + stored as delta from last, last is reset to 0 if always_reset || keyframe + +block_max_depth + maximum depth of the block tree + stored as delta from last, last is reset to 0 if always_reset || keyframe + +quant_table + quantiztation table + + +Highlevel bitstream structure: +============================= + -------------------------------------------- +| Header | + -------------------------------------------- +| ------------------------------------ | +| | Block0 | | +| | split? | | +| | yes no | | +| | ......... intra? | | +| | : Block01 : yes no | | +| | : Block02 : ....... .......... | | +| | : Block03 : : y DC : : ref index: | | +| | : Block04 : : cb DC : : motion x : | | +| | ......... : cr DC : : motion y : | | +| | ....... .......... | | +| ------------------------------------ | +| ------------------------------------ | +| | Block1 | | +| ... | + -------------------------------------------- +| ------------ ------------ ------------ | +|| Y subbands | | Cb subbands| | Cr subbands|| +|| --- --- | | --- --- | | --- --- || +|| |LL0||HL0| | | |LL0||HL0| | | |LL0||HL0| || +|| --- --- | | --- --- | | --- --- || +|| --- --- | | --- --- | | --- --- || +|| |LH0||HH0| | | |LH0||HH0| | | |LH0||HH0| || +|| --- --- | | --- --- | | --- --- || +|| --- --- | | --- --- | | --- --- || +|| |HL1||LH1| | | |HL1||LH1| | | |HL1||LH1| || +|| --- --- | | --- --- | | --- --- || +|| --- --- | | --- --- | | --- --- || +|| |HH1||HL2| | | |HH1||HL2| | | |HH1||HL2| || +|| ... | | ... | | ... || +| ------------ ------------ ------------ | + -------------------------------------------- + +Decoding process: +================= + + ------------ + | | + | Subbands | + ------------ | | + | | ------------ + | Intra DC | | + | | LL0 subband prediction + ------------ | + \ Dequantizaton + ------------------- \ | +| Reference frames | \ IDWT +| ------- ------- | Motion \ | +||Frame 0| |Frame 1|| Compensation . OBMC v ------- +| ------- ------- | --------------. \------> + --->|Frame n|-->output +| ------- ------- | ------- +||Frame 2| |Frame 3||<----------------------------------/ +| ... | + ------------------- + + +Range Coder: +============ + +Binary Range Coder: +------------------- +The implemented range coder is an adapted version based upon "Range encoding: +an algorithm for removing redundancy from a digitised message." by G. N. N. +Martin. +The symbols encoded by the Snow range coder are bits (0|1). The +associated probabilities are not fix but change depending on the symbol mix +seen so far. + + +bit seen | new state +---------+----------------------------------------------- + 0 | 256 - state_transition_table[256 - old_state]; + 1 | state_transition_table[ old_state]; + +state_transition_table = { + 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, +104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, +119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, +134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, +150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, +165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, +180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, +195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, +210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, +226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, +241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0}; + +FIXME + + +Range Coding of integers: +------------------------- +FIXME + + +Neighboring Blocks: +=================== +left and top are set to the respective blocks unless they are outside of +the image in which case they are set to the Null block + +top-left is set to the top left block unless it is outside of the image in +which case it is set to the left block + +if this block has no larger parent block or it is at the left side of its +parent block and the top right block is not outside of the image then the +top right block is used for top-right else the top-left block is used + +Null block +y,cb,cr are 128 +level, ref, mx and my are 0 + + +Motion Vector Prediction: +========================= +1. the motion vectors of all the neighboring blocks are scaled to +compensate for the difference of reference frames + +scaled_mv= (mv * (256 * (current_reference+1) / (mv.reference+1)) + 128)>>8 + +2. the median of the scaled left, top and top-right vectors is used as +motion vector prediction + +3. the used motion vector is the sum of the predictor and + (mvx_diff, mvy_diff)*mv_scale + + +Intra DC Predicton: +====================== +the luma and chroma values of the left block are used as predictors + +the used luma and chroma is the sum of the predictor and y_diff, cb_diff, cr_diff +to reverse this in the decoder apply the following: +block[y][x].dc[0] = block[y][x-1].dc[0] + y_diff; +block[y][x].dc[1] = block[y][x-1].dc[1] + cb_diff; +block[y][x].dc[2] = block[y][x-1].dc[2] + cr_diff; +block[*][-1].dc[*]= 128; + + +Motion Compensation: +==================== + +Halfpel interpolation: +---------------------- +halfpel interpolation is done by convolution with the halfpel filter stored +in the header: + +horizontal halfpel samples are found by +H1[y][x] = hcoeff[0]*(F[y][x ] + F[y][x+1]) + + hcoeff[1]*(F[y][x-1] + F[y][x+2]) + + hcoeff[2]*(F[y][x-2] + F[y][x+3]) + + ... +h1[y][x] = (H1[y][x] + 32)>>6; + +vertical halfpel samples are found by +H2[y][x] = hcoeff[0]*(F[y ][x] + F[y+1][x]) + + hcoeff[1]*(F[y-1][x] + F[y+2][x]) + + ... +h2[y][x] = (H2[y][x] + 32)>>6; + +vertical+horizontal halfpel samples are found by +H3[y][x] = hcoeff[0]*(H2[y][x ] + H2[y][x+1]) + + hcoeff[1]*(H2[y][x-1] + H2[y][x+2]) + + ... +H3[y][x] = hcoeff[0]*(H1[y ][x] + H1[y+1][x]) + + hcoeff[1]*(H1[y+1][x] + H1[y+2][x]) + + ... +h3[y][x] = (H3[y][x] + 2048)>>12; + + + F H1 F + | | | + | | | + | | | + F H1 F + | | | + | | | + | | | + F-------F-------F-> H1<-F-------F-------F + v v v + H2 H3 H2 + ^ ^ ^ + F-------F-------F-> H1<-F-------F-------F + | | | + | | | + | | | + F H1 F + | | | + | | | + | | | + F H1 F + + +unavailable fullpel samples (outside the picture for example) shall be equal +to the closest available fullpel sample + + +Smaller pel interpolation: +-------------------------- +if diag_mc is set then points which lie on a line between 2 vertically, +horiziontally or diagonally adjacent halfpel points shall be interpolated +linearls with rounding to nearest and halfway values rounded up. +points which lie on 2 diagonals at the same time should only use the one +diagonal not containing the fullpel point + + + + F-->O---q---O<--h1->O---q---O<--F + v \ / v \ / v + O O O O O O O + | / | \ | + q q q q q + | / | \ | + O O O O O O O + ^ / \ ^ / \ ^ + h2-->O---q---O<--h3->O---q---O<--h2 + v \ / v \ / v + O O O O O O O + | \ | / | + q q q q q + | \ | / | + O O O O O O O + ^ / \ ^ / \ ^ + F-->O---q---O<--h1->O---q---O<--F + + + +the remaining points shall be bilinearly interpolated from the +up to 4 surrounding halfpel and fullpel points, again rounding should be to +nearest and halfway values rounded up + +compliant Snow decoders MUST support 1-1/8 pel luma and 1/2-1/16 pel chroma +interpolation at least + + +Overlapped block motion compensation: +------------------------------------- +FIXME + +LL band prediction: +=================== +Each sample in the LL0 subband is predicted by the median of the left, top and +left+top-topleft samples, samples outside the subband shall be considered to +be 0. To reverse this prediction in the decoder apply the following. +for(y=0; y<height; y++){ + for(x=0; x<width; x++){ + sample[y][x] += median(sample[y-1][x], + sample[y][x-1], + sample[y-1][x]+sample[y][x-1]-sample[y-1][x-1]); + } +} +sample[-1][*]=sample[*][-1]= 0; +width,height here are the width and height of the LL0 subband not of the final +video + + +Dequantizaton: +============== +FIXME + +Wavelet Transform: +================== + +Snow supports 2 wavelet transforms, the symmetric biorthogonal 5/3 integer +transform and a integer approximation of the symmetric biorthogonal 9/7 +daubechies wavelet. + +2D IDWT (inverse discrete wavelet transform) +-------------------------------------------- +The 2D IDWT applies a 2D filter recursively, each time combining the +4 lowest frequency subbands into a single subband until only 1 subband +remains. +The 2D filter is done by first applying a 1D filter in the vertical direction +and then applying it in the horizontal one. + --------------- --------------- --------------- --------------- +|LL0|HL0| | | | | | | | | | | | +|---+---| HL1 | | L0|H0 | HL1 | | LL1 | HL1 | | | | +|LH0|HH0| | | | | | | | | | | | +|-------+-------|->|-------+-------|->|-------+-------|->| L1 | H1 |->... +| | | | | | | | | | | | +| LH1 | HH1 | | LH1 | HH1 | | LH1 | HH1 | | | | +| | | | | | | | | | | | + --------------- --------------- --------------- --------------- + + +1D Filter: +---------- +1. interleave the samples of the low and high frequency subbands like +s={L0, H0, L1, H1, L2, H2, L3, H3, ... } +note, this can end with a L or a H, the number of elements shall be w +s[-1] shall be considered equivalent to s[1 ] +s[w ] shall be considered equivalent to s[w-2] + +2. perform the lifting steps in order as described below + +5/3 Integer filter: +1. s[i] -= (s[i-1] + s[i+1] + 2)>>2; for all even i < w +2. s[i] += (s[i-1] + s[i+1] )>>1; for all odd i < w + +\ | /|\ | /|\ | /|\ | /|\ + \|/ | \|/ | \|/ | \|/ | + + | + | + | + | -1/4 + /|\ | /|\ | /|\ | /|\ | +/ | \|/ | \|/ | \|/ | \|/ + | + | + | + | + +1/2 + + +Snow's 9/7 Integer filter: +1. s[i] -= (3*(s[i-1] + s[i+1]) + 4)>>3; for all even i < w +2. s[i] -= s[i-1] + s[i+1] ; for all odd i < w +3. s[i] += ( s[i-1] + s[i+1] + 4*s[i] + 8)>>4; for all even i < w +4. s[i] += (3*(s[i-1] + s[i+1]) )>>1; for all odd i < w + +\ | /|\ | /|\ | /|\ | /|\ + \|/ | \|/ | \|/ | \|/ | + + | + | + | + | -3/8 + /|\ | /|\ | /|\ | /|\ | +/ | \|/ | \|/ | \|/ | \|/ + (| + (| + (| + (| + -1 +\ + /|\ + /|\ + /|\ + /|\ +1/4 + \|/ | \|/ | \|/ | \|/ | + + | + | + | + | +1/16 + /|\ | /|\ | /|\ | /|\ | +/ | \|/ | \|/ | \|/ | \|/ + | + | + | + | + +3/2 + +optimization tips: +following are exactly identical +(3a)>>1 == a + (a>>1) +(a + 4b + 8)>>4 == ((a>>2) + b + 2)>>2 + +16bit implementation note: +The IDWT can be implemented with 16bits, but this requires some care to +prevent overflows, the following list, lists the minimum number of bits needed +for some terms +1. lifting step +A= s[i-1] + s[i+1] 16bit +3*A + 4 18bit +A + (A>>1) + 2 17bit + +3. lifting step +s[i-1] + s[i+1] 17bit + +4. lifiting step +3*(s[i-1] + s[i+1]) 17bit + + +TODO: +===== +Important: +finetune initial contexts +flip wavelet? +try to use the wavelet transformed predicted image (motion compensated image) as context for coding the residual coefficients +try the MV length as context for coding the residual coefficients +use extradata for stuff which is in the keyframes now? +implement per picture halfpel interpolation +try different range coder state transition tables for different contexts + +Not Important: +compare the 6 tap and 8 tap hpel filters (psnr/bitrate and subjective quality) +spatial_scalability b vs u (!= 0 breaks syntax anyway so we can add a u later) + + +Credits: +======== +Michael Niedermayer +Loren Merritt + + +Copyright: +========== +GPL + GFDL + whatever is needed to make this a RFC
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/style.min.css b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/style.min.css new file mode 100644 index 0000000..6843fda --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/style.min.css
@@ -0,0 +1,23 @@ +/*! +The MIT License (MIT) + +Copyright (c) 2014 Barbara Lepage <db0company@gmail.com> + +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. + */body{background-color:#313131;color:#e6e6e6;text-align:justify}body, h1, h2, h3, h4, h5, h6{font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans","Helvetica Neue",Helvetica,Verdana,Tahoma,sans-serif}a{color:#4cae4c}a strong{color:#e6e6e6}a:hover{color:#7fc77f}a:hover strong{color:#4cae4c}main{width:100% ! important;min-height:600px;margin:auto}h1, h2, h3, h4{font-weight:bold;text-align:left}h1, h2, h3{color:#bebebe}h1 strong, h2 strong, h3 strong{color:#e6e6e6}h4, h5, h6{color:#3c8b3c}h1{border-bottom:4px #bebebe solid;padding:20px 2%}h3{border-bottom:2px #bebebe solid;padding:15px 1%}h4{border-bottom:1px solid #e6e6e6;padding:10px 0;margin:20px 0;color:#e6e6e6}.list-group .list-group-item{background-color:#3e3e3e;border-color:black}.list-group.list-group-big .list-group-item{padding:25px}.list-group a.list-group-item{color:#7fc77f}.list-group a.list-group-item:hover{background-color:#313131;color:#4cae4c}.well{background-color:#242424;border-color:black;color:#bebebe}.well strong{color:#e6e6e6}.well code{background-color:#313131}.well hr{border-color:#3c8b3c}.well h3{margin:5px 0 15px 0;border:0;padding:0}.well a{color:#4cae4c}.well a.btn{color:white}.well small{display:block;padding:0 10px;font-style:italic}.well.example{padding-top:40px;margin-bottom:130px}.well.example pre{margin:50px;margin-bottom:30px;font-size:1.5em}.well.example .btn{margin-right:50px;margin-bottom:20px}.well.well-with-icon{min-height:136px}.well.well-with-icon .pull-right,.well.well-with-icon .pull-left{background-color:#4cae4c;color:#e6e6e6;padding:10px;border-radius:5px;margin:5px}.well.well-with-icon .pull-right{margin-left:20px}.well.well-with-icon .pull-left{margin-right:20px}a.well{display:block}a.well:hover{text-decoration:none;opacity:0.8}.info, .warning{margin:10px;padding:10px;background-color:#3e3e3e;color:#e6e6e6}.info code, .warning code{background-color:#313131}.info{border-left:10px #4cae4c solid}.warning{border-left:10px #ae4c4c solid}.with-icon{padding:30px}.with-icon .pull-left{padding-right:30px}.with-icon .pull-right{padding-left:30px}dd{margin-left:20px}code{background-color:#242424;color:#7fc77f;display:inline-block;margin:5px}.table{margin:20px 0;border-radius:4px}.table th,.table td,.table tr{border:1px solid #171717}.table tr th{background-color:#3e3e3e;border-bottom:2px solid #e6e6e6}.table tr:nth-child(odd){background-color:#242424}#sidebar-wrapper, .navbar{background-color:#171717;overflow-x:hidden}#sidebar-wrapper .sidebar-brand img,#sidebar-wrapper .navbar-brand img, .navbar .sidebar-brand img, .navbar .navbar-brand img{opacity:0.6;margin-right:8px}#sidebar-wrapper .sidebar-brand:hover,#sidebar-wrapper .navbar-brand:hover, .navbar .sidebar-brand:hover, .navbar .navbar-brand:hover{color:#fff}#sidebar-wrapper .sidebar-brand:hover img,#sidebar-wrapper .navbar-brand:hover img, .navbar .sidebar-brand:hover img, .navbar .navbar-brand:hover img{opacity:1}#sidebar-wrapper .sidebar-nav li ul, .navbar .sidebar-nav li ul{list-style-type:none;padding:0}#sidebar-wrapper .sidebar-nav li ul li, .navbar .sidebar-nav li ul li{line-height:20px}#sidebar-wrapper .sidebar-nav li ul li a, .navbar .sidebar-nav li ul li a{padding-left:20px}.content-header{height:auto;background-color:#242424}.content-header h1{color:#e6e6e6;display:block;margin:0;margin-bottom:20px;line-height:normal;border-bottom:none}#download h4, #index h4{margin-top:180px}#download h4.first, #index h4.first{margin-top:20px}#download h4.first small, #index h4.first small{color:inherit;font-size:1em}#download .btn-download-wrapper, #index .btn-download-wrapper{text-align:center;margin:160px auto}#download .btn-download-wrapper .btn, #index .btn-download-wrapper .btn{font-size:3em;padding:3%;display:inline-block;margin-bottom:5px}#download .btn-download-wrapper small, #index .btn-download-wrapper small{display:block;font-size:0.4em}#download h2.description, #index h2.description{color:#e6e6e6;font-size:2em;font-weight:bold;margin:120px 50px;line-height:2em}#download h2.description .label, #index h2.description .label{font-size:0.5em}#download .btn-download-wrapper{margin:40px auto}#download .os-selector{text-align:center;color:#e6e6e6;margin:30px 0}#download .os-selector a.btn-build{color:#e6e6e6;display:block;padding:20px;border-radius:2px}#download .os-selector .btn-build[href="#build-linux"]{background-color:#e43}#download .os-selector .btn-build[href="#build-linux"]:hover{color:#e43;background-color:#e6e6e6}#download .os-selector .btn-build[href="#build-windows"]{background-color:#06a}#download .os-selector .btn-build[href="#build-windows"]:hover{color:#06a;background-color:#e6e6e6}#download .os-selector .btn-build[href="#build-mac"]{background-color:darkgrey}#download .os-selector .btn-build[href="#build-mac"]:hover{color:darkgrey;background-color:#e6e6e6}#download .os-selector .tab-content{margin-top:20px}#download .os-selector #build-linux h3{color:#e43}#download .os-selector #build-windows h3{color:#06a}#download .os-selector #build-mac h3{color:darkgrey}footer{background-color:#242424;border-top:1px #101010 solid;padding:20px 0%}footer a{display:block}footer img[alt="FFmpeg"]{width:50%;display:block;margin:auto}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/swresample.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/swresample.txt new file mode 100644 index 0000000..2d192a3 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/swresample.txt
@@ -0,0 +1,46 @@ + The official guide to swresample for confused developers. + ========================================================= + +Current (simplified) Architecture: +--------------------------------- + Input + v + __________________/|\___________ + / | \ + / input sample format convert v + / | ___________/ + | |/ + | v + | ___________/|\___________ _____________ + | / | \ | | + | Rematrix | resample <---->| Buffers | + | \___________ | ___________/ |_____________| + v \|/ +Special Converter v + v ___________/|\___________ _____________ + | / | \ | | + | Rematrix | resample <---->| Buffers | + | \___________ | ___________/ |_____________| + | \|/ + | v + | |\___________ + \ | \ + \ output sample format convert v + \_________________ | ___________/ + \|/ + v + Output + +Planar/Packed conversion is done when needed during sample format conversion. +Every step can be skipped without memcpy when it is not needed. +Either Resampling and Rematrixing can be performed first depending on which +way it is faster. +The Buffers are needed for resampling due to resamplng being a process that +requires future and past data, it thus also introduces inevitably a delay when +used. +Internally 32bit float and 16bit int is supported currently, other formats can +easily be added. +Externally all sample formats in packed and planar configuration are supported +It's also trivial to add special converters for common cases. +If only sample format and/or packed/planar conversion is needed, it +is performed from input to output directly in a single pass with no intermediates.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/swscale.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/swscale.txt new file mode 100644 index 0000000..2066009 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/swscale.txt
@@ -0,0 +1,98 @@ + The official guide to swscale for confused developers. + ======================================================== + +Current (simplified) Architecture: +--------------------------------- + Input + v + _______OR_________ + / \ + / \ + special converter [Input to YUV converter] + | | + | (8bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:0:0 ) + | | + | v + | Horizontal scaler + | | + | (15bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:1:1 / 4:0:0 ) + | | + | v + | Vertical scaler and output converter + | | + v v + output + + +Swscale has 2 scaler paths. Each side must be capable of handling +slices, that is, consecutive non-overlapping rectangles of dimension +(0,slice_top) - (picture_width, slice_bottom). + +special converter + These generally are unscaled converters of common + formats, like YUV 4:2:0/4:2:2 -> RGB12/15/16/24/32. Though it could also + in principle contain scalers optimized for specific common cases. + +Main path + The main path is used when no special converter can be used. The code + is designed as a destination line pull architecture. That is, for each + output line the vertical scaler pulls lines from a ring buffer. When + the ring buffer does not contain the wanted line, then it is pulled from + the input slice through the input converter and horizontal scaler. + The result is also stored in the ring buffer to serve future vertical + scaler requests. + When no more output can be generated because lines from a future slice + would be needed, then all remaining lines in the current slice are + converted, horizontally scaled and put in the ring buffer. + [This is done for luma and chroma, each with possibly different numbers + of lines per picture.] + +Input to YUV Converter + When the input to the main path is not planar 8 bits per component YUV or + 8-bit gray, it is converted to planar 8-bit YUV. Two sets of converters + exist for this currently: One performs horizontal downscaling by 2 + before the conversion, the other leaves the full chroma resolution, + but is slightly slower. The scaler will try to preserve full chroma + when the output uses it. It is possible to force full chroma with + SWS_FULL_CHR_H_INP even for cases where the scaler thinks it is useless. + +Horizontal scaler + There are several horizontal scalers. A special case worth mentioning is + the fast bilinear scaler that is made of runtime-generated MMXEXT code + using specially tuned pshufw instructions. + The remaining scalers are specially-tuned for various filter lengths. + They scale 8-bit unsigned planar data to 16-bit signed planar data. + Future >8 bits per component inputs will need to add a new horizontal + scaler that preserves the input precision. + +Vertical scaler and output converter + There is a large number of combined vertical scalers + output converters. + Some are: + * unscaled output converters + * unscaled output converters that average 2 chroma lines + * bilinear converters (C, MMX and accurate MMX) + * arbitrary filter length converters (C, MMX and accurate MMX) + And + * Plain C 8-bit 4:2:2 YUV -> RGB converters using LUTs + * Plain C 17-bit 4:4:4 YUV -> RGB converters using multiplies + * MMX 11-bit 4:2:2 YUV -> RGB converters + * Plain C 16-bit Y -> 16-bit gray + ... + + RGB with less than 8 bits per component uses dither to improve the + subjective quality and low-frequency accuracy. + + +Filter coefficients: +-------------------- +There are several different scalers (bilinear, bicubic, lanczos, area, +sinc, ...). Their coefficients are calculated in initFilter(). +Horizontal filter coefficients have a 1.0 point at 1 << 14, vertical ones at +1 << 12. The 1.0 points have been chosen to maximize precision while leaving +a little headroom for convolutional filters like sharpening filters and +minimizing SIMD instructions needed to apply them. +It would be trivial to use a different 1.0 point if some specific scaler +would benefit from it. +Also, as already hinted at, initFilter() accepts an optional convolutional +filter as input that can be used for contrast, saturation, blur, sharpening +shift, chroma vs. luma shift, ...
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/t2h.init b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/t2h.init new file mode 100644 index 0000000..c41be2e --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/t2h.init
@@ -0,0 +1,128 @@ +# Init file for texi2html. + +# This is deprecated, and the makeinfo/texi2any version is doc/t2h.pm + +# no horiz rules between sections +$end_section = \&FFmpeg_end_section; +sub FFmpeg_end_section($$) +{ +} + +my $TEMPLATE_HEADER1 = $ENV{"FFMPEG_HEADER1"} || <<EOT; +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <title>FFmpeg documentation</title> + <link rel="stylesheet" href="bootstrap.min.css" /> + <link rel="stylesheet" href="style.min.css" /> +EOT + +my $TEMPLATE_HEADER2 = $ENV{"FFMPEG_HEADER2"} || <<EOT; + </head> + <body> + <div style="width: 95%; margin: auto"> +EOT + +my $TEMPLATE_FOOTER = $ENV{"FFMPEG_FOOTER"} || <<EOT; + </div> + </body> +</html> +EOT + +$SMALL_RULE = ''; +$BODYTEXT = ''; + +$print_page_foot = \&FFmpeg_print_page_foot; +sub FFmpeg_print_page_foot($$) +{ + my $fh = shift; + my $program_string = defined &T2H_DEFAULT_program_string ? + T2H_DEFAULT_program_string() : program_string(); + print $fh '<footer class="footer pagination-right">' . "\n"; + print $fh '<span class="label label-info">' . $program_string; + print $fh "</span></footer></div></div></body>\n"; +} + +$float = \&FFmpeg_float; + +sub FFmpeg_float($$$$) +{ + my $text = shift; + my $float = shift; + my $caption = shift; + my $shortcaption = shift; + + my $label = ''; + if (exists($float->{'id'})) + { + $label = &$anchor($float->{'id'}); + } + my $class = ''; + my $subject = ''; + + if ($caption =~ /NOTE/) + { + $class = "alert alert-info"; + } + elsif ($caption =~ /IMPORTANT/) + { + $class = "alert alert-warning"; + } + + return '<div class="float ' . $class . '">' . "$label\n" . $text . '</div>'; +} + +$print_page_head = \&FFmpeg_print_page_head; +sub FFmpeg_print_page_head($$) +{ + my $fh = shift; + my $longtitle = "$Texi2HTML::THISDOC{'fulltitle_no_texi'}"; + $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'}; + my $description = $DOCUMENT_DESCRIPTION; + $description = $longtitle if (!defined($description)); + $description = "<meta name=\"description\" content=\"$description\">" if + ($description ne ''); + $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'})); + my $encoding = ''; + $encoding = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$ENCODING\">" if (defined($ENCODING) and ($ENCODING ne '')); + $longtitle =~ s/Documentation.*//g; + $longtitle = "FFmpeg documentation : " . $longtitle; + + print $fh <<EOT; +$TEMPLATE_HEADER1 +$description +<meta name="keywords" content="$longtitle"> +<meta name="Generator" content="$Texi2HTML::THISDOC{program}"> +$Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} --> +<!-- +$Texi2HTML::THISDOC{program_authors} +--> +$encoding +$TEMPLATE_HEADER2 +EOT +} + +$print_page_foot = \&FFmpeg_print_page_foot; +sub FFmpeg_print_page_foot($$) +{ + my $fh = shift; + print $fh <<EOT; +$TEMPLATE_FOOTER +EOT +} + +# declare encoding in header +$IN_ENCODING = $ENCODING = "utf-8"; + +# no navigation elements +$SECTION_NAVIGATION = 0; +# the same for texi2html 5.0 +$HEADERS = 0; + +# TOC and Chapter headings link +$TOC_LINKS = 1; + +# print the TOC where @contents is used +$INLINE_CONTENTS = 1;
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/t2h.pm b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/t2h.pm new file mode 100644 index 0000000..5efb2da --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/t2h.pm
@@ -0,0 +1,339 @@ +# makeinfo HTML output init file +# +# Copyright (c) 2011, 2012 Free Software Foundation, Inc. +# Copyright (c) 2014 Andreas Cadhalpun +# Copyright (c) 2014 Tiancheng "Timothy" Gu +# +# This file is part of FFmpeg. +# +# FFmpeg is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 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 +# General Public License for more details. +# +# You should have received a copy of the GNU 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 + +# no navigation elements +set_from_init_file('HEADERS', 0); + +sub ffmpeg_heading_command($$$$$) +{ + my $self = shift; + my $cmdname = shift; + my $command = shift; + my $args = shift; + my $content = shift; + + my $result = ''; + + # not clear that it may really happen + if ($self->in_string) { + $result .= $self->command_string($command) ."\n" if ($cmdname ne 'node'); + $result .= $content if (defined($content)); + return $result; + } + + my $element_id = $self->command_id($command); + $result .= "<a name=\"$element_id\"></a>\n" + if (defined($element_id) and $element_id ne ''); + + print STDERR "Process $command " + .Texinfo::Structuring::_print_root_command_texi($command)."\n" + if ($self->get_conf('DEBUG')); + my $element; + if ($Texinfo::Common::root_commands{$command->{'cmdname'}} + and $command->{'parent'} + and $command->{'parent'}->{'type'} + and $command->{'parent'}->{'type'} eq 'element') { + $element = $command->{'parent'}; + } + if ($element) { + $result .= &{$self->{'format_element_header'}}($self, $cmdname, + $command, $element); + } + + my $heading_level; + # node is used as heading if there is nothing else. + if ($cmdname eq 'node') { + if (!$element or (!$element->{'extra'}->{'section'} + and $element->{'extra'}->{'node'} + and $element->{'extra'}->{'node'} eq $command + # bogus node may not have been normalized + and defined($command->{'extra'}->{'normalized'}))) { + if ($command->{'extra'}->{'normalized'} eq 'Top') { + $heading_level = 0; + } else { + $heading_level = 3; + } + } + } else { + $heading_level = $command->{'level'}; + } + + my $heading = $self->command_text($command); + # $heading not defined may happen if the command is a @node, for example + # if there is an error in the node. + if (defined($heading) and $heading ne '' and defined($heading_level)) { + + if ($Texinfo::Common::root_commands{$cmdname} + and $Texinfo::Common::sectioning_commands{$cmdname}) { + my $content_href = $self->command_contents_href($command, 'contents', + $self->{'current_filename'}); + if ($content_href) { + my $this_href = $content_href =~ s/^\#toc-/\#/r; + $heading .= '<span class="pull-right">'. + '<a class="anchor hidden-xs" '. + "href=\"$this_href\" aria-hidden=\"true\">". + ($ENV{"FA_ICONS"} ? '<i class="fa fa-link"></i>' + : '#'). + '</a> '. + '<a class="anchor hidden-xs"'. + "href=\"$content_href\" aria-hidden=\"true\">". + ($ENV{"FA_ICONS"} ? '<i class="fa fa-navicon"></i>' + : 'TOC'). + '</a>'. + '</span>'; + } + } + + if ($self->in_preformatted()) { + $result .= $heading."\n"; + } else { + # if the level was changed, set the command name right + if ($cmdname ne 'node' + and $heading_level ne $Texinfo::Common::command_structuring_level{$cmdname}) { + $cmdname + = $Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level]; + } + $result .= &{$self->{'format_heading_text'}}( + $self, $cmdname, $heading, + $heading_level + + $self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command); + } + } + $result .= $content if (defined($content)); + return $result; +} + +foreach my $command (keys(%Texinfo::Common::sectioning_commands), 'node') { + texinfo_register_command_formatting($command, \&ffmpeg_heading_command); +} + +# print the TOC where @contents is used +set_from_init_file('INLINE_CONTENTS', 1); + +# make chapters <h2> +set_from_init_file('CHAPTER_HEADER_LEVEL', 2); + +# Do not add <hr> +set_from_init_file('DEFAULT_RULE', ''); +set_from_init_file('BIG_RULE', ''); + +# Customized file beginning +sub ffmpeg_begin_file($$$) +{ + my $self = shift; + my $filename = shift; + my $element = shift; + + my $command; + if ($element and $self->get_conf('SPLIT')) { + $command = $self->element_command($element); + } + + my ($title, $description, $encoding, $date, $css_lines, + $doctype, $bodytext, $copying_comment, $after_body_open, + $extra_head, $program_and_version, $program_homepage, + $program, $generator) = $self->_file_header_informations($command); + + my $links = $self->_get_links ($filename, $element); + + my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT; +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<!-- Created by $program_and_version, $program_homepage --> + <head> + <meta charset="utf-8"> + <title> +EOT + my $head_title = <<EOT; + $title +EOT + + my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT; + </title> + <meta name="viewport" content="width=device-width,initial-scale=1.0"> + <link rel="stylesheet" type="text/css" href="bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="style.min.css"> + </head> + <body> + <div style="width: 95%; margin: auto"> + <h1> +EOT + + my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT; + </h1> +EOT + + return $head1 . $head_title . $head2 . $head_title . $head3; +} +texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file); + +sub ffmpeg_program_string($) +{ + my $self = shift; + if (defined($self->get_conf('PROGRAM')) + and $self->get_conf('PROGRAM') ne '' + and defined($self->get_conf('PACKAGE_URL'))) { + return $self->convert_tree( + $self->gdt('This document was generated using @uref{{program_homepage}, @emph{{program}}}.', + { 'program_homepage' => $self->get_conf('PACKAGE_URL'), + 'program' => $self->get_conf('PROGRAM') })); + } else { + return $self->convert_tree( + $self->gdt('This document was generated automatically.')); + } +} +texinfo_register_formatting_function('program_string', \&ffmpeg_program_string); + +# Customized file ending +sub ffmpeg_end_file($) +{ + my $self = shift; + my $program_string = &{$self->{'format_program_string'}}($self); + my $program_text = <<EOT; + <p style="font-size: small;"> + $program_string + </p> +EOT + my $footer = $ENV{FFMPEG_FOOTER} || <<EOT; + </div> + </body> +</html> +EOT + return $program_text . $footer; +} +texinfo_register_formatting_function('end_file', \&ffmpeg_end_file); + +# Dummy title command +# Ignore title. Title is handled through ffmpeg_begin_file(). +set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1); +sub ffmpeg_title($$$$) +{ + return ''; +} + +texinfo_register_command_formatting('titlefont', + \&ffmpeg_title); + +# Customized float command. Part of code borrowed from GNU Texinfo. +sub ffmpeg_float($$$$$) +{ + my $self = shift; + my $cmdname = shift; + my $command = shift; + my $args = shift; + my $content = shift; + + my ($caption, $prepended) = Texinfo::Common::float_name_caption($self, + $command); + my $caption_text = ''; + my $prepended_text; + my $prepended_save = ''; + + if ($self->in_string()) { + if ($prepended) { + $prepended_text = $self->convert_tree_new_formatting_context( + $prepended, 'float prepended'); + } else { + $prepended_text = ''; + } + if ($caption) { + $caption_text = $self->convert_tree_new_formatting_context( + {'contents' => $caption->{'args'}->[0]->{'contents'}}, + 'float caption'); + } + return $prepended.$content.$caption_text; + } + + my $id = $self->command_id($command); + my $label; + if (defined($id) and $id ne '') { + $label = "<a name=\"$id\"></a>"; + } else { + $label = ''; + } + + if ($prepended) { + if ($caption) { + # prepend the prepended tree to the first paragraph + my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}}; + my @caption_contents; + my $new_paragraph; + while (@caption_original_contents) { + my $content = shift @caption_original_contents; + if ($content->{'type'} and $content->{'type'} eq 'paragraph') { + %{$new_paragraph} = %{$content}; + $new_paragraph->{'contents'} = [@{$content->{'contents'}}]; + unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong', + 'args' => [{'type' => 'brace_command_arg', + 'contents' => [$prepended]}]}); + push @caption_contents, $new_paragraph; + last; + } else { + push @caption_contents, $content; + } + } + push @caption_contents, @caption_original_contents; + if ($new_paragraph) { + $caption_text = $self->convert_tree_new_formatting_context( + {'contents' => \@caption_contents}, 'float caption'); + $prepended_text = ''; + } + } + if ($caption_text eq '') { + $prepended_text = $self->convert_tree_new_formatting_context( + $prepended, 'float prepended'); + if ($prepended_text ne '') { + $prepended_save = $prepended_text; + $prepended_text = '<p><strong>'.$prepended_text.'</strong></p>'; + } + } + } else { + $prepended_text = ''; + } + + if ($caption and $caption_text eq '') { + $caption_text = $self->convert_tree_new_formatting_context( + $caption->{'args'}->[0], 'float caption'); + } + if ($prepended_text.$caption_text ne '') { + $prepended_text = $self->_attribute_class('div','float-caption'). '>' + . $prepended_text; + $caption_text .= '</div>'; + } + my $html_class = ''; + if ($prepended_save =~ /NOTE/) { + $html_class = 'info'; + $prepended_text = ''; + $caption_text = ''; + } elsif ($prepended_save =~ /IMPORTANT/) { + $html_class = 'warning'; + $prepended_text = ''; + $caption_text = ''; + } + return $self->_attribute_class('div', $html_class). '>' . "\n" . + $prepended_text . $caption_text . $content . '</div>'; +} + +texinfo_register_command_formatting('float', + \&ffmpeg_float); + +1;
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/tablegen.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/tablegen.txt new file mode 100644 index 0000000..4c4f036 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/tablegen.txt
@@ -0,0 +1,70 @@ +Writing a table generator + +This documentation is preliminary. +Parts of the API are not good and should be changed. + +Basic concepts + +A table generator consists of two files, *_tablegen.c and *_tablegen.h. +The .h file will provide the variable declarations and initialization +code for the tables, the .c calls the initialization code and then prints +the tables as a header file using the tableprint.h helpers. +Both of these files will be compiled for the host system, so to avoid +breakage with cross-compilation neither of them may include, directly +or indirectly, config.h or avconfig.h. +This means that e.g. libavutil/mathematics.h is ok but libavutil/libm.h is not. +Due to this, the .c file or Makefile may have to provide additional defines +or stubs, though if possible this should be avoided. +In particular, CONFIG_HARDCODED_TABLES should always be defined to 0. + +The .c file + +This file should include the *_tablegen.h and tableprint.h files and +anything else it needs as long as it does not depend on config.h or +avconfig.h. +In addition to that it must contain a main() function which initializes +all tables by calling the init functions from the .h file and then prints +them. +The printing code typically looks like this: + write_fileheader(); + printf("static const uint8_t my_array[100] = {\n"); + write_uint8_t_array(my_array, 100); + printf("};\n"); + +This is the more generic form, in case you need to do something special. +Usually you should instead use the short form: + write_fileheader(); + WRITE_ARRAY("static const", uint8_t, my_array); + +write_fileheader() adds some minor things like a "this is a generated file" +comment and some standard includes. +tablegen.h defines some write functions for one- and two-dimensional arrays +for standard types - they print only the "core" parts so they are easier +to reuse for multi-dimensional arrays so the outermost {} must be printed +separately. +If there's no standard function for printing the type you need, the +WRITE_1D_FUNC_ARGV macro is a very quick way to create one. +See libavcodec/dv_tablegen.c for an example. + + +The .h file + +This file should contain: + - one or more initialization functions + - the table variable declarations +If CONFIG_HARDCODED_TABLES is set, the initialization functions should +not do anything, and instead of the variable declarations the +generated *_tables.h file should be included. +Since that will be generated in the build directory, the path must be +included, i.e. +#include "libavcodec/example_tables.h" +not +#include "example_tables.h" + +Makefile changes + +To make the automatic table creation work, you must manually declare the +new dependency. +For this add a line similar to this: +$(SUBDIR)example.o: $(SUBDIR)example_tables.h +under the "ifdef CONFIG_HARDCODED_TABLES" section in the Makefile.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/texi2pod.pl b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/texi2pod.pl new file mode 100644 index 0000000..9a9b34f --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/texi2pod.pl
@@ -0,0 +1,464 @@ +#!/usr/bin/env perl + +# Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + +# This file is part of GNU CC. + +# GNU CC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# GNU CC 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU CC; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301 USA + +# This does trivial (and I mean _trivial_) conversion of Texinfo +# markup to Perl POD format. It's intended to be used to extract +# something suitable for a manpage from a Texinfo document. + +use warnings; + +$output = 0; +$skipping = 0; +%chapters = (); +@chapters_sequence = (); +$chapter = ""; +@icstack = (); +@endwstack = (); +@skstack = (); +@instack = (); +$shift = ""; +%defs = (); +$fnno = 1; +$inf = ""; +@ibase = (); + +while ($_ = shift) { + if (/^-D(.*)$/) { + if ($1 ne "") { + $flag = $1; + } else { + $flag = shift; + } + $value = ""; + ($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/); + die "no flag specified for -D\n" + unless $flag ne ""; + die "flags may only contain letters, digits, hyphens, dashes and underscores\n" + unless $flag =~ /^[a-zA-Z0-9_-]+$/; + $defs{$flag} = $value; + } elsif (/^-I(.*)$/) { + push @ibase, $1 ne "" ? $1 : shift; + } elsif (/^-/) { + usage(); + } else { + $in = $_, next unless defined $in; + $out = $_, next unless defined $out; + usage(); + } +} + +push @ibase, "."; + +if (defined $in) { + $inf = gensym(); + open($inf, "<$in") or die "opening \"$in\": $!\n"; + push @ibase, $1 if $in =~ m|^(.+)/[^/]+$|; +} else { + $inf = \*STDIN; +} + +if (defined $out) { + open(STDOUT, ">$out") or die "opening \"$out\": $!\n"; +} + +while(defined $inf) { +INF: while(<$inf>) { + # Certain commands are discarded without further processing. + /^\@(?: + [a-z]+index # @*index: useful only in complete manual + |need # @need: useful only in printed manual + |(?:end\s+)?group # @group .. @end group: ditto + |page # @page: ditto + |node # @node: useful only in .info file + |(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents + )\b/x and next; + + chomp; + + # Look for filename and title markers. + /^\@setfilename\s+([^.]+)/ and $fn = $1, next; + /^\@settitle\s+([^.]+)/ and $tl = postprocess($1), next; + + # Identify a man title but keep only the one we are interested in. + /^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do { + if (exists $defs{$1}) { + $fn = $1; + $tl = postprocess($2); + } + next; + }; + + /^\@include\s+(.+)$/ and do { + push @instack, $inf; + $inf = gensym(); + + for (@ibase) { + open($inf, "<" . $_ . "/" . $1) and next INF; + } + die "cannot open $1: $!\n"; + }; + + /^\@chapter\s+([A-Za-z ]+)/ and do { + # close old chapter + $chapters{$chapter_name} .= postprocess($chapter) if ($chapter_name); + + # start new chapter + $chapter_name = $1, push (@chapters_sequence, $chapter_name) unless $skipping; + $chapters{$chapter_name} = "" unless exists $chapters{$chapter_name}; + $chapter = ""; + $output = 1; + next; + }; + + /^\@bye/ and do { + # close old chapter + $chapters{$chapter_name} .= postprocess($chapter) if ($chapter_name); + last INF; + }; + + # handle variables + /^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do { + $defs{$1} = $2; + next; + }; + /^\@clear\s+([a-zA-Z0-9_-]+)/ and do { + delete $defs{$1}; + next; + }; + + next unless $output; + + # Discard comments. (Can't do it above, because then we'd never see + # @c man lines.) + /^\@c\b/ and next; + + # End-block handler goes up here because it needs to operate even + # if we are skipping. + /^\@end\s+([a-z]+)/ and do { + # Ignore @end foo, where foo is not an operation which may + # cause us to skip, if we are presently skipping. + my $ended = $1; + next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/; + + die "\@end $ended without \@$ended at line $.\n" unless defined $endw; + die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw; + + $endw = pop @endwstack; + + if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/) { + $skipping = pop @skstack; + next; + } elsif ($ended =~ /^(?:example|smallexample|verbatim|display)$/) { + $shift = ""; + $_ = ""; # need a paragraph break + } elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) { + $_ = "\n=back\n"; + $ic = pop @icstack; + } else { + die "unknown command \@end $ended at line $.\n"; + } + }; + + # We must handle commands which can cause skipping even while we + # are skipping, otherwise we will not process nested conditionals + # correctly. + /^\@ifset\s+([a-zA-Z0-9_-]+)/ and do { + push @endwstack, $endw; + push @skstack, $skipping; + $endw = "ifset"; + $skipping = 1 unless exists $defs{$1}; + next; + }; + + /^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do { + push @endwstack, $endw; + push @skstack, $skipping; + $endw = "ifclear"; + $skipping = 1 if exists $defs{$1}; + next; + }; + + /^\@(ignore|menu|iftex|ifhtml|ifnothtml)\b/ and do { + push @endwstack, $endw; + push @skstack, $skipping; + $endw = $1; + $skipping = $endw !~ /ifnothtml/; + next; + }; + + next if $skipping; + + # Character entities. First the ones that can be replaced by raw text + # or discarded outright: + s/\@copyright\{\}/(c)/g; + s/\@dots\{\}/.../g; + s/\@enddots\{\}/..../g; + s/\@([.!? ])/$1/g; + s/\@[:-]//g; + s/\@bullet(?:\{\})?/*/g; + s/\@TeX\{\}/TeX/g; + s/\@pounds\{\}/\#/g; + s/\@minus(?:\{\})?/-/g; + + # Now the ones that have to be replaced by special escapes + # (which will be turned back into text by unmunge()) + s/&/&/g; + s/\@\{/{/g; + s/\@\}/}/g; + s/\@\@/&at;/g; + + # Inside a verbatim block, handle @var specially. + if ($shift ne "") { + s/\@var\{([^\}]*)\}/<$1>/g; + } + + # POD doesn't interpret E<> inside a verbatim block. + if ($shift eq "") { + s/</</g; + s/>/>/g; + } else { + s/</</g; + s/>/>/g; + } + + # Single line command handlers. + + /^\@(?:section|unnumbered|unnumberedsec|center|heading)\s+(.+)$/ + and $_ = "\n=head2 $1\n"; + /^\@(?:subsection|subheading)\s+(.+)$/ + and $_ = "\n=head3 $1\n"; + /^\@(?:subsubsection|subsubheading)\s+(.+)$/ + and $_ = "\n=head4 $1\n"; + + # Block command handlers: + /^\@itemize\s*(\@[a-z]+|\*|-)?/ and do { + push @endwstack, $endw; + push @icstack, $ic; + $ic = $1 ? $1 : "*"; + $_ = "\n=over 4\n"; + $endw = "itemize"; + }; + + /^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do { + push @endwstack, $endw; + push @icstack, $ic; + if (defined $1) { + $ic = $1 . "."; + } else { + $ic = "1."; + } + $_ = "\n=over 4\n"; + $endw = "enumerate"; + }; + + /^\@((?:multi|[fv])?table)\s+(\@[a-z]+)/ and do { + push @endwstack, $endw; + push @icstack, $ic; + $endw = $1; + $ic = $2; + $ic =~ s/\@(?:samp|strong|key|gcctabopt|option|env|command)/B/; + $ic =~ s/\@(?:code|kbd)/C/; + $ic =~ s/\@(?:dfn|var|emph|cite|i)/I/; + $ic =~ s/\@(?:file)/F/; + $ic =~ s/\@(?:columnfractions)//; + $_ = "\n=over 4\n"; + }; + + /^\@(multitable)\s+{.*/ and do { + push @endwstack, $endw; + push @icstack, $ic; + $endw = $1; + $ic = ""; + $_ = "\n=over 4\n"; + }; + + /^\@((?:small)?example|verbatim|display)/ and do { + push @endwstack, $endw; + $endw = $1; + $shift = "\t"; + $_ = ""; # need a paragraph break + }; + + /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do { + my $columns = $1; + $columns =~ s/\@tab/ : /; + + $_ = "\n=item B<". $columns .">\n"; + }; + + /^\@tab\s+(.*\S)\s*$/ and $endw eq "multitable" and do { + my $columns = $1; + $columns =~ s/\@tab//; + + $_ = $columns; + $chapter =~ s/$//; + }; + + /^\@itemx?\s*(.+)?$/ and do { + if (defined $1) { + # Entity escapes prevent munging by the <> processing below. + $_ = "\n=item $ic\<$1\>\n"; + } else { + $_ = "\n=item $ic\n"; + $ic =~ y/A-Ya-y/B-Zb-z/; + $ic =~ s/(\d+)/$1 + 1/eg; + } + }; + + $chapter .= $shift.$_."\n"; +} +# End of current file. +close($inf); +$inf = pop @instack; +} + +die "No filename or title\n" unless defined $fn && defined $tl; + +# always use utf8 +print "=encoding utf8\n\n"; + +$chapters{NAME} = "$fn \- $tl\n"; +$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES}; + +unshift @chapters_sequence, "NAME"; +for $chapter (@chapters_sequence) { + if (exists $chapters{$chapter}) { + $head = uc($chapter); + print "=head1 $head\n\n"; + print scalar unmunge ($chapters{$chapter}); + print "\n"; + } +} + +sub usage +{ + die "usage: $0 [-D toggle...] [infile [outfile]]\n"; +} + +sub postprocess +{ + local $_ = $_[0]; + + # @value{foo} is replaced by whatever 'foo' is defined as. + while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) { + if (! exists $defs{$2}) { + print STDERR "Option $2 not defined\n"; + s/\Q$1\E//; + } else { + $value = $defs{$2}; + s/\Q$1\E/$value/; + } + } + + # Formatting commands. + # Temporary escape for @r. + s/\@r\{([^\}]*)\}/R<$1>/g; + s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g; + s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g; + s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<$1>/g; + s/\@sc\{([^\}]*)\}/\U$1/g; + s/\@file\{([^\}]*)\}/F<$1>/g; + s/\@w\{([^\}]*)\}/S<$1>/g; + s/\@(?:dmn|math)\{([^\}]*)\}/$1/g; + + # Cross references are thrown away, as are @noindent and @refill. + # (@noindent is impossible in .pod, and @refill is unnecessary.) + # @* is also impossible in .pod; we discard it and any newline that + # follows it. Similarly, our macro @gol must be discarded. + + s/\@anchor\{(?:[^\}]*)\}//g; + s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g; + s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g; + s/;\s+\@pxref\{(?:[^\}]*)\}//g; + s/\@ref\{(?:[^,\}]*,)(?:[^,\}]*,)([^,\}]*).*\}/B<$1>/g; + s/\@ref\{([^\}]*)\}/B<$1>/g; + s/\@noindent\s*//g; + s/\@refill//g; + s/\@gol//g; + s/\@\*\s*\n?//g; + + # @uref can take one, two, or three arguments, with different + # semantics each time. @url and @email are just like @uref with + # one argument, for our purposes. + s/\@(?:uref|url|email)\{([^\},]*),?[^\}]*\}/<B<$1>>/g; + s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g; + s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g; + + # Turn B<blah I<blah> blah> into B<blah> I<blah> B<blah> to + # match Texinfo semantics of @emph inside @samp. Also handle @r + # inside bold. + s/</</g; + s/>/>/g; + 1 while s/B<((?:[^<>]|I<[^<>]*>)*)R<([^>]*)>/B<$1>${2}B</g; + 1 while (s/B<([^<>]*)I<([^>]+)>/B<$1>I<$2>B</g); + 1 while (s/I<([^<>]*)B<([^>]+)>/I<$1>B<$2>I</g); + s/[BI]<>//g; + s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g; + s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g; + + # Extract footnotes. This has to be done after all other + # processing because otherwise the regexp will choke on formatting + # inside @footnote. + while (/\@footnote/g) { + s/\@footnote\{([^\}]+)\}/[$fnno]/; + add_footnote($1, $fnno); + $fnno++; + } + + return $_; +} + +sub unmunge +{ + # Replace escaped symbols with their equivalents. + local $_ = $_[0]; + + s/</E<lt>/g; + s/>/E<gt>/g; + s/{/\{/g; + s/}/\}/g; + s/&at;/\@/g; + s/&/&/g; + return $_; +} + +sub add_footnote +{ + unless (exists $chapters{FOOTNOTES}) { + $chapters{FOOTNOTES} = "\n=over 4\n\n"; + } + + $chapters{FOOTNOTES} .= "=item $fnno.\n\n"; $fnno++; + $chapters{FOOTNOTES} .= $_[0]; + $chapters{FOOTNOTES} .= "\n\n"; +} + +# stolen from Symbol.pm +{ + my $genseq = 0; + sub gensym + { + my $name = "GEN" . $genseq++; + my $ref = \*{$name}; + delete $::{$name}; + return $ref; + } +}
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/texidep.pl b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/texidep.pl new file mode 100644 index 0000000..0996903 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/texidep.pl
@@ -0,0 +1,32 @@ +#! /usr/bin/env perl + +# This script will print the dependency of a Texinfo file to stdout. +# texidep.pl <src-path> <input.texi> <output.ext> + +use warnings; +use strict; + +die unless @ARGV == 3; + +my ($src_path, $root, $target) = @ARGV; + +sub print_deps { + my ($file, $deps) = @_; + $deps->{$file} = 1; + + open(my $fh, "<", "$file") or die "Cannot open file '$file': $!"; + while (<$fh>) { + if (my ($i) = /^\@(?:verbatim)?include\s+(\S+)/) { + die "Circular dependency found in file $root\n" if exists $deps->{"doc/$1"}; + print "$target: doc/$1\n"; + + # skip looking for config.texi dependencies, since it has + # none, and is not located in the source tree + if ("$1" ne "config.texi") { + print_deps("$src_path/doc/$1", {%$deps}); + } + } + } +} + +print_deps($root, {});
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/utils.texi b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/utils.texi new file mode 100644 index 0000000..756c609 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/utils.texi
@@ -0,0 +1,1075 @@ +@chapter Syntax +@c man begin SYNTAX + +This section documents the syntax and formats employed by the FFmpeg +libraries and tools. + +@anchor{quoting_and_escaping} +@section Quoting and escaping + +FFmpeg adopts the following quoting and escaping mechanism, unless +explicitly specified. The following rules are applied: + +@itemize +@item +@samp{'} and @samp{\} 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. + +@item +A special character is escaped by prefixing it with a @samp{\}. + +@item +All characters enclosed between @samp{''} are included literally in the +parsed string. The quote character @samp{'} itself cannot be quoted, +so you may need to close the quote and escape it. + +@item +Leading and trailing whitespaces, unless escaped or quoted, are +removed from the parsed string. +@end itemize + +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. + +The function @code{av_get_token} defined in +@file{libavutil/avstring.h} can be used to parse a token quoted or +escaped according to the rules defined above. + +The tool @file{tools/ffescape} in the FFmpeg source tree can be used +to automatically quote or escape a string in a script. + +@subsection Examples + +@itemize +@item +Escape the string @code{Crime d'Amour} containing the @code{'} special +character: +@example +Crime d\'Amour +@end example + +@item +The string above contains a quote, so the @code{'} needs to be escaped +when quoting it: +@example +'Crime d'\''Amour' +@end example + +@item +Include leading or trailing whitespaces using quoting: +@example +' this string starts and ends with whitespaces ' +@end example + +@item +Escaping and quoting can be mixed together: +@example +' The string '\'string\'' is a string ' +@end example + +@item +To include a literal @samp{\} you can use either escaping or quoting: +@example +'c:\foo' can be written as c:\\foo +@end example +@end itemize + +@anchor{date syntax} +@section Date + +The accepted syntax is: +@example +[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z] +now +@end example + +If the value is "now" it takes the current time. + +Time is local time unless Z is appended, in which case it is +interpreted as UTC. +If the year-month-day part is not specified it takes the current +year-month-day. + +@anchor{time duration syntax} +@section Time duration + +There are two accepted syntaxes for expressing time duration. + +@example +[-][@var{HH}:]@var{MM}:@var{SS}[.@var{m}...] +@end example + +@var{HH} expresses the number of hours, @var{MM} the number of minutes +for a maximum of 2 digits, and @var{SS} the number of seconds for a +maximum of 2 digits. The @var{m} at the end expresses decimal value for +@var{SS}. + +@emph{or} + +@example +[-]@var{S}+[.@var{m}...] +@end example + +@var{S} expresses the number of seconds, with the optional decimal part +@var{m}. + +In both expressions, the optional @samp{-} indicates negative duration. + +@subsection Examples + +The following examples are all valid time duration: + +@table @samp +@item 55 +55 seconds + +@item 12:03:45 +12 hours, 03 minutes and 45 seconds + +@item 23.189 +23.189 seconds +@end table + +@anchor{video size syntax} +@section Video size +Specify the size of the sourced video, it may be a string of the form +@var{width}x@var{height}, or the name of a size abbreviation. + +The following abbreviations are recognized: +@table @samp +@item ntsc +720x480 +@item pal +720x576 +@item qntsc +352x240 +@item qpal +352x288 +@item sntsc +640x480 +@item spal +768x576 +@item film +352x240 +@item ntsc-film +352x240 +@item sqcif +128x96 +@item qcif +176x144 +@item cif +352x288 +@item 4cif +704x576 +@item 16cif +1408x1152 +@item qqvga +160x120 +@item qvga +320x240 +@item vga +640x480 +@item svga +800x600 +@item xga +1024x768 +@item uxga +1600x1200 +@item qxga +2048x1536 +@item sxga +1280x1024 +@item qsxga +2560x2048 +@item hsxga +5120x4096 +@item wvga +852x480 +@item wxga +1366x768 +@item wsxga +1600x1024 +@item wuxga +1920x1200 +@item woxga +2560x1600 +@item wqsxga +3200x2048 +@item wquxga +3840x2400 +@item whsxga +6400x4096 +@item whuxga +7680x4800 +@item cga +320x200 +@item ega +640x350 +@item hd480 +852x480 +@item hd720 +1280x720 +@item hd1080 +1920x1080 +@item 2k +2048x1080 +@item 2kflat +1998x1080 +@item 2kscope +2048x858 +@item 4k +4096x2160 +@item 4kflat +3996x2160 +@item 4kscope +4096x1716 +@item nhd +640x360 +@item hqvga +240x160 +@item wqvga +400x240 +@item fwqvga +432x240 +@item hvga +480x320 +@item qhd +960x540 +@item 2kdci +2048x1080 +@item 4kdci +4096x2160 +@item uhd2160 +3840x2160 +@item uhd4320 +7680x4320 +@end table + +@anchor{video rate syntax} +@section 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 +@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a float +number or a valid video frame rate abbreviation. + +The following abbreviations are recognized: +@table @samp +@item ntsc +30000/1001 +@item pal +25/1 +@item qntsc +30000/1001 +@item qpal +25/1 +@item sntsc +30000/1001 +@item spal +25/1 +@item film +24/1 +@item ntsc-film +24000/1001 +@end table + +@anchor{ratio syntax} +@section Ratio + +A ratio can be expressed as an expression, or in the form +@var{numerator}:@var{denominator}. + +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. + +The undefined value can be expressed using the "0:0" string. + +@anchor{color syntax} +@section Color + +It can be the name of a color as defined below (case insensitive match) or a +@code{[0x|#]RRGGBB[AA]} sequence, possibly followed by @@ and a string +representing the alpha component. + +The alpha component may be a string composed by "0x" followed by an +hexadecimal number or a decimal number between 0.0 and 1.0, which +represents the opacity value (@samp{0x00} or @samp{0.0} means completely +transparent, @samp{0xff} or @samp{1.0} completely opaque). If the alpha +component is not specified then @samp{0xff} is assumed. + +The string @samp{random} will result in a random color. + +The following names of colors are recognized: +@table @samp +@item AliceBlue +0xF0F8FF +@item AntiqueWhite +0xFAEBD7 +@item Aqua +0x00FFFF +@item Aquamarine +0x7FFFD4 +@item Azure +0xF0FFFF +@item Beige +0xF5F5DC +@item Bisque +0xFFE4C4 +@item Black +0x000000 +@item BlanchedAlmond +0xFFEBCD +@item Blue +0x0000FF +@item BlueViolet +0x8A2BE2 +@item Brown +0xA52A2A +@item BurlyWood +0xDEB887 +@item CadetBlue +0x5F9EA0 +@item Chartreuse +0x7FFF00 +@item Chocolate +0xD2691E +@item Coral +0xFF7F50 +@item CornflowerBlue +0x6495ED +@item Cornsilk +0xFFF8DC +@item Crimson +0xDC143C +@item Cyan +0x00FFFF +@item DarkBlue +0x00008B +@item DarkCyan +0x008B8B +@item DarkGoldenRod +0xB8860B +@item DarkGray +0xA9A9A9 +@item DarkGreen +0x006400 +@item DarkKhaki +0xBDB76B +@item DarkMagenta +0x8B008B +@item DarkOliveGreen +0x556B2F +@item Darkorange +0xFF8C00 +@item DarkOrchid +0x9932CC +@item DarkRed +0x8B0000 +@item DarkSalmon +0xE9967A +@item DarkSeaGreen +0x8FBC8F +@item DarkSlateBlue +0x483D8B +@item DarkSlateGray +0x2F4F4F +@item DarkTurquoise +0x00CED1 +@item DarkViolet +0x9400D3 +@item DeepPink +0xFF1493 +@item DeepSkyBlue +0x00BFFF +@item DimGray +0x696969 +@item DodgerBlue +0x1E90FF +@item FireBrick +0xB22222 +@item FloralWhite +0xFFFAF0 +@item ForestGreen +0x228B22 +@item Fuchsia +0xFF00FF +@item Gainsboro +0xDCDCDC +@item GhostWhite +0xF8F8FF +@item Gold +0xFFD700 +@item GoldenRod +0xDAA520 +@item Gray +0x808080 +@item Green +0x008000 +@item GreenYellow +0xADFF2F +@item HoneyDew +0xF0FFF0 +@item HotPink +0xFF69B4 +@item IndianRed +0xCD5C5C +@item Indigo +0x4B0082 +@item Ivory +0xFFFFF0 +@item Khaki +0xF0E68C +@item Lavender +0xE6E6FA +@item LavenderBlush +0xFFF0F5 +@item LawnGreen +0x7CFC00 +@item LemonChiffon +0xFFFACD +@item LightBlue +0xADD8E6 +@item LightCoral +0xF08080 +@item LightCyan +0xE0FFFF +@item LightGoldenRodYellow +0xFAFAD2 +@item LightGreen +0x90EE90 +@item LightGrey +0xD3D3D3 +@item LightPink +0xFFB6C1 +@item LightSalmon +0xFFA07A +@item LightSeaGreen +0x20B2AA +@item LightSkyBlue +0x87CEFA +@item LightSlateGray +0x778899 +@item LightSteelBlue +0xB0C4DE +@item LightYellow +0xFFFFE0 +@item Lime +0x00FF00 +@item LimeGreen +0x32CD32 +@item Linen +0xFAF0E6 +@item Magenta +0xFF00FF +@item Maroon +0x800000 +@item MediumAquaMarine +0x66CDAA +@item MediumBlue +0x0000CD +@item MediumOrchid +0xBA55D3 +@item MediumPurple +0x9370D8 +@item MediumSeaGreen +0x3CB371 +@item MediumSlateBlue +0x7B68EE +@item MediumSpringGreen +0x00FA9A +@item MediumTurquoise +0x48D1CC +@item MediumVioletRed +0xC71585 +@item MidnightBlue +0x191970 +@item MintCream +0xF5FFFA +@item MistyRose +0xFFE4E1 +@item Moccasin +0xFFE4B5 +@item NavajoWhite +0xFFDEAD +@item Navy +0x000080 +@item OldLace +0xFDF5E6 +@item Olive +0x808000 +@item OliveDrab +0x6B8E23 +@item Orange +0xFFA500 +@item OrangeRed +0xFF4500 +@item Orchid +0xDA70D6 +@item PaleGoldenRod +0xEEE8AA +@item PaleGreen +0x98FB98 +@item PaleTurquoise +0xAFEEEE +@item PaleVioletRed +0xD87093 +@item PapayaWhip +0xFFEFD5 +@item PeachPuff +0xFFDAB9 +@item Peru +0xCD853F +@item Pink +0xFFC0CB +@item Plum +0xDDA0DD +@item PowderBlue +0xB0E0E6 +@item Purple +0x800080 +@item Red +0xFF0000 +@item RosyBrown +0xBC8F8F +@item RoyalBlue +0x4169E1 +@item SaddleBrown +0x8B4513 +@item Salmon +0xFA8072 +@item SandyBrown +0xF4A460 +@item SeaGreen +0x2E8B57 +@item SeaShell +0xFFF5EE +@item Sienna +0xA0522D +@item Silver +0xC0C0C0 +@item SkyBlue +0x87CEEB +@item SlateBlue +0x6A5ACD +@item SlateGray +0x708090 +@item Snow +0xFFFAFA +@item SpringGreen +0x00FF7F +@item SteelBlue +0x4682B4 +@item Tan +0xD2B48C +@item Teal +0x008080 +@item Thistle +0xD8BFD8 +@item Tomato +0xFF6347 +@item Turquoise +0x40E0D0 +@item Violet +0xEE82EE +@item Wheat +0xF5DEB3 +@item White +0xFFFFFF +@item WhiteSmoke +0xF5F5F5 +@item Yellow +0xFFFF00 +@item YellowGreen +0x9ACD32 +@end table + +@anchor{channel layout syntax} +@section 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. + +Individual channels are identified by an id, as given by the table +below: +@table @samp +@item FL +front left +@item FR +front right +@item FC +front center +@item LFE +low frequency +@item BL +back left +@item BR +back right +@item FLC +front left-of-center +@item FRC +front right-of-center +@item BC +back center +@item SL +side left +@item SR +side right +@item TC +top center +@item TFL +top front left +@item TFC +top front center +@item TFR +top front right +@item TBL +top back left +@item TBC +top back center +@item TBR +top back right +@item DL +downmix left +@item DR +downmix right +@item WL +wide left +@item WR +wide right +@item SDL +surround direct left +@item SDR +surround direct right +@item LFE2 +low frequency 2 +@end table + +Standard channel layout compositions can be specified by using the +following identifiers: +@table @samp +@item mono +FC +@item stereo +FL+FR +@item 2.1 +FL+FR+LFE +@item 3.0 +FL+FR+FC +@item 3.0(back) +FL+FR+BC +@item 4.0 +FL+FR+FC+BC +@item quad +FL+FR+BL+BR +@item quad(side) +FL+FR+SL+SR +@item 3.1 +FL+FR+FC+LFE +@item 5.0 +FL+FR+FC+BL+BR +@item 5.0(side) +FL+FR+FC+SL+SR +@item 4.1 +FL+FR+FC+LFE+BC +@item 5.1 +FL+FR+FC+LFE+BL+BR +@item 5.1(side) +FL+FR+FC+LFE+SL+SR +@item 6.0 +FL+FR+FC+BC+SL+SR +@item 6.0(front) +FL+FR+FLC+FRC+SL+SR +@item hexagonal +FL+FR+FC+BL+BR+BC +@item 6.1 +FL+FR+FC+LFE+BC+SL+SR +@item 6.1 +FL+FR+FC+LFE+BL+BR+BC +@item 6.1(front) +FL+FR+LFE+FLC+FRC+SL+SR +@item 7.0 +FL+FR+FC+BL+BR+SL+SR +@item 7.0(front) +FL+FR+FC+FLC+FRC+SL+SR +@item 7.1 +FL+FR+FC+LFE+BL+BR+SL+SR +@item 7.1(wide) +FL+FR+FC+LFE+BL+BR+FLC+FRC +@item 7.1(wide-side) +FL+FR+FC+LFE+FLC+FRC+SL+SR +@item octagonal +FL+FR+FC+BL+BR+BC+SL+SR +@item downmix +DL+DR +@end table + +A custom channel layout can be specified as a sequence of terms, separated by +'+' or '|'. Each term can be: +@itemize +@item +the name of a standard channel layout (e.g. @samp{mono}, +@samp{stereo}, @samp{4.0}, @samp{quad}, @samp{5.0}, etc.) + +@item +the name of a single channel (e.g. @samp{FL}, @samp{FR}, @samp{FC}, @samp{LFE}, etc.) + +@item +a number of channels, in decimal, optionally followed by 'c', yielding +the default channel layout for that number of channels (see the +function @code{av_get_default_channel_layout}) + +@item +a channel layout mask, in hexadecimal starting with "0x" (see the +@code{AV_CH_*} macros in @file{libavutil/channel_layout.h}. +@end itemize + +Starting from libavutil version 53 the trailing character "c" to +specify a number of channels will be required, while a channel layout +mask could also be specified as a decimal number (if and only if not +followed by "c"). + +See also the function @code{av_get_channel_layout} defined in +@file{libavutil/channel_layout.h}. +@c man end SYNTAX + +@chapter Expression Evaluation +@c man begin EXPRESSION EVALUATION + +When evaluating an arithmetic expression, FFmpeg uses an internal +formula evaluator, implemented through the @file{libavutil/eval.h} +interface. + +An expression may contain unary, binary operators, constants, and +functions. + +Two expressions @var{expr1} and @var{expr2} can be combined to form +another expression "@var{expr1};@var{expr2}". +@var{expr1} and @var{expr2} are evaluated in turn, and the new +expression evaluates to the value of @var{expr2}. + +The following binary operators are available: @code{+}, @code{-}, +@code{*}, @code{/}, @code{^}. + +The following unary operators are available: @code{+}, @code{-}. + +The following functions are available: +@table @option +@item abs(x) +Compute absolute value of @var{x}. + +@item acos(x) +Compute arccosine of @var{x}. + +@item asin(x) +Compute arcsine of @var{x}. + +@item atan(x) +Compute arctangent of @var{x}. + +@item between(x, min, max) +Return 1 if @var{x} is greater than or equal to @var{min} and lesser than or +equal to @var{max}, 0 otherwise. + +@item bitand(x, y) +@item bitor(x, y) +Compute bitwise and/or operation on @var{x} and @var{y}. + +The results of the evaluation of @var{x} and @var{y} are converted to +integers before executing the bitwise operation. + +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). + +@item ceil(expr) +Round the value of expression @var{expr} upwards to the nearest +integer. For example, "ceil(1.5)" is "2.0". + +@item clip(x, min, max) +Return the value of @var{x} clipped between @var{min} and @var{max}. + +@item cos(x) +Compute cosine of @var{x}. + +@item cosh(x) +Compute hyperbolic cosine of @var{x}. + +@item eq(x, y) +Return 1 if @var{x} and @var{y} are equivalent, 0 otherwise. + +@item exp(x) +Compute exponential of @var{x} (with base @code{e}, the Euler's number). + +@item floor(expr) +Round the value of expression @var{expr} downwards to the nearest +integer. For example, "floor(-1.5)" is "-2.0". + +@item gauss(x) +Compute Gauss function of @var{x}, corresponding to +@code{exp(-x*x/2) / sqrt(2*PI)}. + +@item gcd(x, y) +Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and +@var{y} are 0 or either or both are less than zero then behavior is undefined. + +@item gt(x, y) +Return 1 if @var{x} is greater than @var{y}, 0 otherwise. + +@item gte(x, y) +Return 1 if @var{x} is greater than or equal to @var{y}, 0 otherwise. + +@item hypot(x, y) +This function is similar to the C function with the same name; it returns +"sqrt(@var{x}*@var{x} + @var{y}*@var{y})", the length of the hypotenuse of a +right triangle with sides of length @var{x} and @var{y}, or the distance of the +point (@var{x}, @var{y}) from the origin. + +@item if(x, y) +Evaluate @var{x}, and if the result is non-zero return the result of +the evaluation of @var{y}, return 0 otherwise. + +@item if(x, y, z) +Evaluate @var{x}, and if the result is non-zero return the evaluation +result of @var{y}, otherwise the evaluation result of @var{z}. + +@item ifnot(x, y) +Evaluate @var{x}, and if the result is zero return the result of the +evaluation of @var{y}, return 0 otherwise. + +@item ifnot(x, y, z) +Evaluate @var{x}, and if the result is zero return the evaluation +result of @var{y}, otherwise the evaluation result of @var{z}. + +@item isinf(x) +Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise. + +@item isnan(x) +Return 1.0 if @var{x} is NAN, 0.0 otherwise. + +@item ld(var) +Load the value of the internal variable with number +@var{var}, which was previously stored with st(@var{var}, @var{expr}). +The function returns the loaded value. + +@item log(x) +Compute natural logarithm of @var{x}. + +@item lt(x, y) +Return 1 if @var{x} is lesser than @var{y}, 0 otherwise. + +@item lte(x, y) +Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise. + +@item max(x, y) +Return the maximum between @var{x} and @var{y}. + +@item min(x, y) +Return the maximum between @var{x} and @var{y}. + +@item mod(x, y) +Compute the remainder of division of @var{x} by @var{y}. + +@item not(expr) +Return 1.0 if @var{expr} is zero, 0.0 otherwise. + +@item pow(x, y) +Compute the power of @var{x} elevated @var{y}, it is equivalent to +"(@var{x})^(@var{y})". + +@item print(t) +@item print(t, l) +Print the value of expression @var{t} with loglevel @var{l}. If +@var{l} is not specified then a default log level is used. +Returns the value of the expression printed. + +Prints t with loglevel l + +@item random(x) +Return a pseudo random value between 0.0 and 1.0. @var{x} is the index of the +internal variable which will be used to save the seed/state. + +@item root(expr, max) +Find an input value for which the function represented by @var{expr} +with argument @var{ld(0)} is 0 in the interval 0..@var{max}. + +The expression in @var{expr} must denote a continuous function or the +result is undefined. + +@var{ld(0)} 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 +@code{ld(0)}. When the expression evaluates to 0 then the +corresponding input value will be returned. + +@item sin(x) +Compute sine of @var{x}. + +@item sinh(x) +Compute hyperbolic sine of @var{x}. + +@item sqrt(expr) +Compute the square root of @var{expr}. This is equivalent to +"(@var{expr})^.5". + +@item squish(x) +Compute expression @code{1/(1 + exp(4*x))}. + +@item st(var, expr) +Store the value of the expression @var{expr} in an internal +variable. @var{var} 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. + +@item tan(x) +Compute tangent of @var{x}. + +@item tanh(x) +Compute hyperbolic tangent of @var{x}. + +@item taylor(expr, x) +@item taylor(expr, x, id) +Evaluate a Taylor series at @var{x}, given an expression representing +the @code{ld(id)}-th derivative of a function at 0. + +When the series does not converge the result is undefined. + +@var{ld(id)} is used to represent the derivative order in @var{expr}, +which means that the given expression will be evaluated multiple times +with various input values that the expression can access through +@code{ld(id)}. If @var{id} is not specified then 0 is assumed. + +Note, when you have the derivatives at y instead of 0, +@code{taylor(expr, x-y)} can be used. + +@item time(0) +Return the current (wallclock) time in seconds. + +@item trunc(expr) +Round the value of expression @var{expr} towards zero to the nearest +integer. For example, "trunc(-1.5)" is "-1.0". + +@item while(cond, expr) +Evaluate expression @var{expr} while the expression @var{cond} is +non-zero, and returns the value of the last @var{expr} evaluation, or +NAN if @var{cond} was always false. +@end table + +The following constants are available: +@table @option +@item PI +area of the unit disc, approximately 3.14 +@item E +exp(1) (Euler's number), approximately 2.718 +@item PHI +golden ratio (1+sqrt(5))/2, approximately 1.618 +@end table + +Assuming that an expression is considered "true" if it has a non-zero +value, note that: + +@code{*} works like AND + +@code{+} works like OR + +For example the construct: +@example +if (A AND B) then C +@end example +is equivalent to: +@example +if(A*B, C) +@end example + +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. + +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 'KB', 'MiB', +'G' and 'B' as number postfix. + +The list of available International System prefixes follows, with +indication of the corresponding powers of 10 and of 2. +@table @option +@item y +10^-24 / 2^-80 +@item z +10^-21 / 2^-70 +@item a +10^-18 / 2^-60 +@item f +10^-15 / 2^-50 +@item p +10^-12 / 2^-40 +@item n +10^-9 / 2^-30 +@item u +10^-6 / 2^-20 +@item m +10^-3 / 2^-10 +@item c +10^-2 +@item d +10^-1 +@item h +10^2 +@item k +10^3 / 2^10 +@item K +10^3 / 2^10 +@item M +10^6 / 2^20 +@item G +10^9 / 2^30 +@item T +10^12 / 2^40 +@item P +10^15 / 2^40 +@item E +10^18 / 2^50 +@item Z +10^21 / 2^60 +@item Y +10^24 / 2^70 +@end table + +@c man end EXPRESSION EVALUATION + +@chapter OpenCL Options +@c man begin OPENCL OPTIONS + +When FFmpeg is configured with @code{--enable-opencl}, it is possible +to set the options for the global OpenCL context. + +The list of supported options follows: + +@table @option +@item build_options +Set build options used to compile the registered kernels. + +See reference "OpenCL Specification Version: 1.2 chapter 5.6.4". + +@item platform_idx +Select the index of the platform to run OpenCL code. + +The specified index must be one of the indexes in the device list +which can be obtained with @code{ffmpeg -opencl_bench} or @code{av_opencl_get_device_list()}. + +@item device_idx +Select the index of the device used to run OpenCL code. + +The specified index must be one of the indexes in the device list which +can be obtained with @code{ffmpeg -opencl_bench} or @code{av_opencl_get_device_list()}. + +@end table + +@c man end OPENCL OPTIONS
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/writing_filters.txt b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/writing_filters.txt new file mode 100644 index 0000000..66ebb53 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/doc/writing_filters.txt
@@ -0,0 +1,423 @@ +This document is a tutorial/initiation for writing simple filters in +libavfilter. + +Foreword: just like everything else in FFmpeg, libavfilter is monolithic, which +means that it is highly recommended that you submit your filters to the FFmpeg +development mailing-list and make sure that they are applied. Otherwise, your filters +are likely to have a very short lifetime due to more or less regular internal API +changes, and a limited distribution, review, and testing. + +Bootstrap +========= + +Let's say you want to write a new simple video filter called "foobar" which +takes one frame in input, changes the pixels in whatever fashion you fancy, and +outputs the modified frame. The most simple way of doing this is to take a +similar filter. We'll pick edgedetect, but any other should do. You can look +for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command. + + - sed 's/edgedetect/foobar/g;s/EdgeDetect/Foobar/g' libavfilter/vf_edgedetect.c > libavfilter/vf_foobar.c + - edit libavfilter/Makefile, and add an entry for "foobar" following the + pattern of the other filters. + - edit libavfilter/allfilters.c, and add an entry for "foobar" following the + pattern of the other filters. + - ./configure ... + - make -j<whatever> ffmpeg + - ./ffmpeg -i http://samples.ffmpeg.org/image-samples/lena.pnm -vf foobar foobar.png + Note here: you can obviously use a random local image instead of a remote URL. + +If everything went right, you should get a foobar.png with Lena edge-detected. + +That's it, your new playground is ready. + +Some little details about what's going on: +libavfilter/allfilters.c:avfilter_register_all() is called at runtime to create +a list of the available filters, but it's important to know that this file is +also parsed by the configure script, which in turn will define variables for +the build system and the C: + + --- after running configure --- + + $ grep FOOBAR config.mak + CONFIG_FOOBAR_FILTER=yes + $ grep FOOBAR config.h + #define CONFIG_FOOBAR_FILTER 1 + +CONFIG_FOOBAR_FILTER=yes from the config.mak is later used to enable the filter in +libavfilter/Makefile and CONFIG_FOOBAR_FILTER=1 from the config.h will be used +for registering the filter in libavfilter/allfilters.c. + +Filter code layout +================== + +You now need some theory about the general code layout of a filter. Open your +libavfilter/vf_foobar.c. This section will detail the important parts of the +code you need to understand before messing with it. + +Copyright +--------- + +First chunk is the copyright. Most filters are LGPL, and we are assuming +vf_foobar is as well. We are also assuming vf_foobar is not an edge detector +filter, so you can update the boilerplate with your credits. + +Doxy +---- + +Next chunk is the Doxygen about the file. See https://ffmpeg.org/doxygen/trunk/. +Detail here what the filter is, does, and add some references if you feel like +it. + +Context +------- + +Skip the headers and scroll down to the definition of FoobarContext. This is +your local state context. It is already filled with 0 when you get it so do not +worry about uninitialized reads into this context. This is where you put all +"global" information that you need; typically the variables storing the user options. +You'll notice the first field "const AVClass *class"; it's the only field you +need to keep assuming you have a context. There is some magic you don't need to +care about around this field, just let it be (in the first position) for now. + +Options +------- + +Then comes the options array. This is what will define the user accessible +options. For example, -vf foobar=mode=colormix:high=0.4:low=0.1. Most options +have the following pattern: + name, description, offset, type, default value, minimum value, maximum value, flags + + - name is the option name, keep it simple and lowercase + - description are short, in lowercase, without period, and describe what they + do, for example "set the foo of the bar" + - offset is the offset of the field in your local context, see the OFFSET() + macro; the option parser will use that information to fill the fields + according to the user input + - type is any of AV_OPT_TYPE_* defined in libavutil/opt.h + - default value is an union where you pick the appropriate type; "{.dbl=0.3}", + "{.i64=0x234}", "{.str=NULL}", ... + - min and max values define the range of available values, inclusive + - flags are AVOption generic flags. See AV_OPT_FLAG_* definitions + +When in doubt, just look at the other AVOption definitions all around the codebase, +there are tons of examples. + +Class +----- + +AVFILTER_DEFINE_CLASS(foobar) will define a unique foobar_class with some kind +of signature referencing the options, etc. which will be referenced in the +definition of the AVFilter. + +Filter definition +----------------- + +At the end of the file, you will find foobar_inputs, foobar_outputs and +the AVFilter ff_vf_foobar. Don't forget to update the AVFilter.description with +a description of what the filter does, starting with a capitalized letter and +ending with a period. You'd better drop the AVFilter.flags entry for now, and +re-add them later depending on the capabilities of your filter. + +Callbacks +--------- + +Let's now study the common callbacks. Before going into details, note that all +these callbacks are explained in details in libavfilter/avfilter.h, so in +doubt, refer to the doxy in that file. + +init() +~~~~~~ + +First one to be called is init(). It's flagged as cold because not called +often. Look for "cold" on +http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html for more +information. + +As the name suggests, init() is where you eventually initialize and allocate +your buffers, pre-compute your data, etc. Note that at this point, your local +context already has the user options initialized, but you still haven't any +clue about the kind of data input you will get, so this function is often +mainly used to sanitize the user options. + +Some init()s will also define the number of inputs or outputs dynamically +according to the user options. A good example of this is the split filter, but +we won't cover this here since vf_foobar is just a simple 1:1 filter. + +uninit() +~~~~~~~~ + +Similarly, there is the uninit() callback, doing what the name suggests. Free +everything you allocated here. + +query_formats() +~~~~~~~~~~~~~~~ + +This follows the init() and is used for the format negotiation. Basically +you specify here what pixel format(s) (gray, rgb 32, yuv 4:2:0, ...) you accept +for your inputs, and what you can output. All pixel formats are defined in +libavutil/pixfmt.h. If you don't change the pixel format between the input and +the output, you just have to define a pixel formats array and call +ff_set_common_formats(). For more complex negotiation, you can refer to other +filters such as vf_scale. + +config_props() +~~~~~~~~~~~~~~ + +This callback is not necessary, but you will probably have one or more +config_props() anyway. It's not a callback for the filter itself but for its +inputs or outputs (they're called "pads" - AVFilterPad - in libavfilter's +lexicon). + +Inside the input config_props(), you are at a point where you know which pixel +format has been picked after query_formats(), and more information such as the +video width and height (inlink->{w,h}). So if you need to update your internal +context state depending on your input you can do it here. In edgedetect you can +see that this callback is used to allocate buffers depending on these +information. They will be destroyed in uninit(). + +Inside the output config_props(), you can define what you want to change in the +output. Typically, if your filter is going to double the size of the video, you +will update outlink->w and outlink->h. + +filter_frame() +~~~~~~~~~~~~~~ + +This is the callback you are waiting for from the beginning: it is where you +process the received frames. Along with the frame, you get the input link from +where the frame comes from. + + static int filter_frame(AVFilterLink *inlink, AVFrame *in) { ... } + +You can get the filter context through that input link: + + AVFilterContext *ctx = inlink->dst; + +Then access your internal state context: + + FoobarContext *foobar = ctx->priv; + +And also the output link where you will send your frame when you are done: + + AVFilterLink *outlink = ctx->outputs[0]; + +Here, we are picking the first output. You can have several, but in our case we +only have one since we are in a 1:1 input-output situation. + +If you want to define a simple pass-through filter, you can just do: + + return ff_filter_frame(outlink, in); + +But of course, you probably want to change the data of that frame. + +This can be done by accessing frame->data[] and frame->linesize[]. Important +note here: the width does NOT match the linesize. The linesize is always +greater or equal to the width. The padding created should not be changed or +even read. Typically, keep in mind that a previous filter in your chain might +have altered the frame dimension but not the linesize. Imagine a crop filter +that halves the video size: the linesizes won't be changed, just the width. + + <-------------- linesize ------------------------> + +-------------------------------+----------------+ ^ + | | | | + | | | | + | picture | padding | | height + | | | | + | | | | + +-------------------------------+----------------+ v + <----------- width -------------> + +Before modifying the "in" frame, you have to make sure it is writable, or get a +new one. Multiple scenarios are possible here depending on the kind of +processing you are doing. + +Let's say you want to change one pixel depending on multiple pixels (typically +the surrounding ones) of the input. In that case, you can't do an in-place +processing of the input so you will need to allocate a new frame, with the same +properties as the input one, and send that new frame to the next filter: + + AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h); + if (!out) { + av_frame_free(&in); + return AVERROR(ENOMEM); + } + av_frame_copy_props(out, in); + + // out->data[...] = foobar(in->data[...]) + + av_frame_free(&in); + return ff_filter_frame(outlink, out); + +In-place processing +~~~~~~~~~~~~~~~~~~~ + +If you can just alter the input frame, you probably just want to do that +instead: + + av_frame_make_writable(in); + // in->data[...] = foobar(in->data[...]) + return ff_filter_frame(outlink, in); + +You may wonder why a frame might not be writable. The answer is that for +example a previous filter might still own the frame data: imagine a filter +prior to yours in the filtergraph that needs to cache the frame. You must not +alter that frame, otherwise it will make that previous filter buggy. This is +where av_frame_make_writable() helps (it won't have any effect if the frame +already is writable). + +The problem with using av_frame_make_writable() is that in the worst case it +will copy the whole input frame before you change it all over again with your +filter: if the frame is not writable, av_frame_make_writable() will allocate +new buffers, and copy the input frame data. You don't want that, and you can +avoid it by just allocating a new buffer if necessary, and process from in to +out in your filter, saving the memcpy. Generally, this is done following this +scheme: + + int direct = 0; + AVFrame *out; + + if (av_frame_is_writable(in)) { + direct = 1; + out = in; + } else { + out = ff_get_video_buffer(outlink, outlink->w, outlink->h); + if (!out) { + av_frame_free(&in); + return AVERROR(ENOMEM); + } + av_frame_copy_props(out, in); + } + + // out->data[...] = foobar(in->data[...]) + + if (!direct) + av_frame_free(&in); + return ff_filter_frame(outlink, out); + +Of course, this will only work if you can do in-place processing. To test if +your filter handles well the permissions, you can use the perms filter. For +example with: + + -vf perms=random,foobar + +Make sure no automatic pixel conversion is inserted between perms and foobar, +otherwise the frames permissions might change again and the test will be +meaningless: add av_log(0,0,"direct=%d\n",direct) in your code to check that. +You can avoid the issue with something like: + + -vf format=rgb24,perms=random,foobar + +...assuming your filter accepts rgb24 of course. This will make sure the +necessary conversion is inserted before the perms filter. + +Timeline +~~~~~~~~ + +Adding timeline support +(http://ffmpeg.org/ffmpeg-filters.html#Timeline-editing) is often an easy +feature to add. In the most simple case, you just have to add +AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC to the AVFilter.flags. You can typically +do this when your filter does not need to save the previous context frames, or +basically if your filter just alters whatever goes in and doesn't need +previous/future information. See for instance commit 86cb986ce that adds +timeline support to the fieldorder filter. + +In some cases, you might need to reset your context somehow. This is handled by +the AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL flag which is used if the filter +must not process the frames but still wants to keep track of the frames going +through (to keep them in cache for when it's enabled again). See for example +commit 69d72140a that adds timeline support to the phase filter. + +Threading +~~~~~~~~~ + +libavfilter does not yet support frame threading, but you can add slice +threading to your filters. + +Let's say the foobar filter has the following frame processing function: + + dst = out->data[0]; + src = in ->data[0]; + + for (y = 0; y < inlink->h; y++) { + for (x = 0; x < inlink->w; x++) + dst[x] = foobar(src[x]); + dst += out->linesize[0]; + src += in ->linesize[0]; + } + +The first thing is to make this function work into slices. The new code will +look like this: + + for (y = slice_start; y < slice_end; y++) { + for (x = 0; x < inlink->w; x++) + dst[x] = foobar(src[x]); + dst += out->linesize[0]; + src += in ->linesize[0]; + } + +The source and destination pointers, and slice_start/slice_end will be defined +according to the number of jobs. Generally, it looks like this: + + const int slice_start = (in->height * jobnr ) / nb_jobs; + const int slice_end = (in->height * (jobnr+1)) / nb_jobs; + uint8_t *dst = out->data[0] + slice_start * out->linesize[0]; + const uint8_t *src = in->data[0] + slice_start * in->linesize[0]; + +This new code will be isolated in a new filter_slice(): + + static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) { ... } + +Note that we need our input and output frame to define slice_{start,end} and +dst/src, which are not available in that callback. They will be transmitted +through the opaque void *arg. You have to define a structure which contains +everything you need: + + typedef struct ThreadData { + AVFrame *in, *out; + } ThreadData; + +If you need some more information from your local context, put them here. + +In you filter_slice function, you access it like that: + + const ThreadData *td = arg; + +Then in your filter_frame() callback, you need to call the threading +distributor with something like this: + + ThreadData td; + + // ... + + td.in = in; + td.out = out; + ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(outlink->h, ctx->graph->nb_threads)); + + // ... + + return ff_filter_frame(outlink, out); + +Last step is to add AVFILTER_FLAG_SLICE_THREADS flag to AVFilter.flags. + +For more example of slice threading additions, you can try to run git log -p +--grep 'slice threading' libavfilter/ + +Finalization +~~~~~~~~~~~~ + +When your awesome filter is finished, you have a few more steps before you're +done: + + - write its documentation in doc/filters.texi, and test the output with make + doc/ffmpeg-filters.html. + - add a FATE test, generally by adding an entry in + tests/fate/filter-video.mak, add running make fate-filter-foobar GEN=1 to + generate the data. + - add an entry in the Changelog + - edit libavfilter/version.h and increase LIBAVFILTER_VERSION_MINOR by one + (and reset LIBAVFILTER_VERSION_MICRO to 100) + - git add ... && git commit -m "avfilter: add foobar filter." && git format-patch -1 + +When all of this is done, you can submit your patch to the ffmpeg-devel +mailing-list for review. If you need any help, feel free to come on our IRC +channel, #ffmpeg-devel on irc.freenode.net.
diff --git a/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/ffmpeg.c b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/ffmpeg.c new file mode 100644 index 0000000..a5ec3c3 --- /dev/null +++ b/jaspertv_gpl_out/lib/ffmpeg/ffmpeg/ffmpeg.c
@@ -0,0 +1,4332 @@ +/* + * Copyright (c) 2000-2003 Fabrice Bellard + * + * 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 + * multimedia converter based on the FFmpeg libraries + */ + +#include "config.h" +#include <ctype.h> +#include <string.h> +#include <math.h> +#include <stdlib.h> +#include <errno.h> +#include <limits.h> +#include <stdint.h> + +#if HAVE_IO_H +#include <io.h> +#endif +#if HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include "libavformat/avformat.h" +#include "libavdevice/avdevice.h" +#include "libswresample/swresample.h" +#include "libavutil/opt.h" +#include "libavutil/channel_layout.h" +#include "libavutil/parseutils.h" +#include "libavutil/samplefmt.h" +#include "libavutil/fifo.h" +#include "libavutil/internal.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/dict.h" +#include "libavutil/mathematics.h" +#include "libavutil/pixdesc.h" +#include "libavutil/avstring.h" +#include "libavutil/libm.h" +#include "libavutil/imgutils.h" +#include "libavutil/timestamp.h" +#include "libavutil/bprint.h" +#include "libavutil/time.h" +#include "libavutil/threadmessage.h" +#include "libavcodec/mathops.h" +#include "libavformat/os_support.h" + +# include "libavfilter/avfilter.h" +# include "libavfilter/buffersrc.h" +# include "libavfilter/buffersink.h" + +#if HAVE_SYS_RESOURCE_H +#include <sys/time.h> +#include <sys/types.h> +#include <sys/resource.h> +#elif HAVE_GETPROCESSTIMES +#include <windows.h> +#endif +#if HAVE_GETPROCESSMEMORYINFO +#include <windows.h> +#include <psapi.h> +#endif +#if HAVE_SETCONSOLECTRLHANDLER +#include <windows.h> +#endif + + +#if HAVE_SYS_SELECT_H +#include <sys/select.h> +#endif + +#if HAVE_TERMIOS_H +#include <fcntl.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <termios.h> +#elif HAVE_KBHIT +#include <conio.h> +#endif + +#if HAVE_PTHREADS +#include <pthread.h> +#endif + +#include <time.h> + +#include "ffmpeg.h" +#include "cmdutils.h" + +#include "libavutil/avassert.h" + +const char program_name[] = "ffmpeg"; +const int program_birth_year = 2000; + +static FILE *vstats_file; + +const char *const forced_keyframes_const_names[] = { + "n", + "n_forced", + "prev_forced_n", + "prev_forced_t", + "t", + NULL +}; + +static void do_video_stats(OutputStream *ost, int frame_size); +static int64_t getutime(void); +static int64_t getmaxrss(void); + +static int run_as_daemon = 0; +static int nb_frames_dup = 0; +static int nb_frames_drop = 0; +static int64_t decode_error_stat[2]; + +static int current_time; +AVIOContext *progress_avio = NULL; + +static uint8_t *subtitle_out; + +InputStream **input_streams = NULL; +int nb_input_streams = 0; +InputFile **input_files = NULL; +int nb_input_files = 0; + +OutputStream **output_streams = NULL; +int nb_output_streams = 0; +OutputFile **output_files = NULL; +int nb_output_files = 0; + +FilterGraph **filtergraphs; +int nb_filtergraphs; + +#if HAVE_TERMIOS_H + +/* init terminal so that we can grab keys */ +static struct termios oldtty; +static int restore_tty; +#endif + +#if HAVE_PTHREADS +static void free_input_threads(void); +#endif + +/* sub2video hack: + Convert subtitles to video with alpha to insert them in filter graphs. + This is a temporary solution until libavfilter gets real subtitles support. + */ + +static int sub2video_get_blank_frame(InputStream *ist) +{ + int ret; + AVFrame *frame = ist->sub2video.frame; + + av_frame_unref(frame); + ist->sub2video.frame->width = ist->dec_ctx->width ? ist->dec_ctx->width : ist->sub2video.w; + ist->sub2video.frame->height = ist->dec_ctx->height ? ist->dec_ctx->height : ist->sub2video.h; + ist->sub2video.frame->format = AV_PIX_FMT_RGB32; + if ((ret = av_frame_get_buffer(frame, 32)) < 0) + return ret; + memset(frame->data[0], 0, frame->height * frame->linesize[0]); + return 0; +} + +static void sub2video_copy_rect(uint8_t *dst, int dst_linesize, int w, int h, + AVSubtitleRect *r) +{ + uint32_t *pal, *dst2; + uint8_t *src, *src2; + int x, y; + + if (r->type != SUBTITLE_BITMAP) { + av_log(NULL, AV_LOG_WARNING, "sub2video: non-bitmap subtitle\n"); + return; + } + if (r->x < 0 || r->x + r->w > w || r->y < 0 || r->y + r->h > h) { + av_log(NULL, AV_LOG_WARNING, "sub2video: rectangle (%d %d %d %d) overflowing %d %d\n", + r->x, r->y, r->w, r->h, w, h + ); + return; + } + + dst += r->y * dst_linesize + r->x * 4; + src = r->pict.data[0]; + pal = (uint32_t *)r->pict.data[1]; + for (y = 0; y < r->h; y++) { + dst2 = (uint32_t *)dst; + src2 = src; + for (x = 0; x < r->w; x++) + *(dst2++) = pal[*(src2++)]; + dst += dst_linesize; + src += r->pict.linesize[0]; + } +} + +static void sub2video_push_ref(InputStream *ist, int64_t pts) +{ + AVFrame *frame = ist->sub2video.frame; + int i; + + av_assert1(frame->data[0]); + ist->sub2video.last_pts = frame->pts = pts; + for (i = 0; i < ist->nb_filters; i++) + av_buffersrc_add_frame_flags(ist->filters[i]->filter, frame, + AV_BUFFERSRC_FLAG_KEEP_REF | + AV_BUFFERSRC_FLAG_PUSH); +} + +static void sub2video_update(InputStream *ist, AVSubtitle *sub) +{ + AVFrame *frame = ist->sub2video.frame; + int8_t *dst; + int dst_linesize; + int num_rects, i; + int64_t pts, end_pts; + + if (!frame) + return; + if (sub) { + pts = av_rescale_q(sub->pts + sub->start_display_time * 1000LL, + AV_TIME_BASE_Q, ist->st->time_base); + end_pts = av_rescale_q(sub->pts + sub->end_display_time * 1000LL, + AV_TIME_BASE_Q, ist->st->time_base); + num_rects = sub->num_rects; + } else { + pts = ist->sub2video.end_pts; + end_pts = INT64_MAX; + num_rects = 0; + } + if (sub2video_get_blank_frame(ist) < 0) { + av_log(ist->dec_ctx, AV_LOG_ERROR, + "Impossible to get a blank canvas.\n"); + return; + } + dst = frame->data [0]; + dst_linesize = frame->linesize[0]; + for (i = 0; i < num_rects; i++) + sub2video_copy_rect(dst, dst_linesize, frame->width, frame->height, sub->rects[i]); + sub2video_push_ref(ist, pts); + ist->sub2video.end_pts = end_pts; +} + +static void sub2video_heartbeat(InputStream *ist, int64_t pts) +{ + InputFile *infile = input_files[ist->file_index]; + int i, j, nb_reqs; + int64_t pts2; + + /* When a frame is read from a file, examine all sub2video streams in + the same file and send the sub2video frame again. Otherwise, decoded + video frames could be accumulating in the filter graph while a filter + (possibly overlay) is desperately waiting for a subtitle frame. */ + for (i = 0; i < infile->nb_streams; i++) { + InputStream *ist2 = input_streams[infile->ist_index + i]; + if (!ist2->sub2video.frame) + continue; + /* subtitles seem to be usually muxed ahead of other streams; + if not, subtracting a larger time here is necessary */ + pts2 = av_rescale_q(pts, ist->st->time_base, ist2->st->time_base) - 1; + /* do not send the heartbeat frame if the subtitle is already ahead */ + if (pts2 <= ist2->sub2video.last_pts) + continue; + if (pts2 >= ist2->sub2video.end_pts || !ist2->sub2video.frame->data[0]) + sub2video_update(ist2, NULL); + for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++) + nb_reqs += av_buffersrc_get_nb_failed_requests(ist2->filters[j]->filter); + if (nb_reqs) + sub2video_push_ref(ist2, pts2); + } +} + +static void sub2video_flush(InputStream *ist) +{ + int i; + + if (ist->sub2video.end_pts < INT64_MAX) + sub2video_update(ist, NULL); + for (i = 0; i < ist->nb_filters; i++) + av_buffersrc_add_frame(ist->filters[i]->filter, NULL); +} + +/* end of sub2video hack */ + +static void term_exit_sigsafe(void) +{ +#if HAVE_TERMIOS_H + if(restore_tty) + tcsetattr (0, TCSANOW, &oldtty); +#endif +} + +void term_exit(void) +{ + av_log(NULL, AV_LOG_QUIET, "%s", ""); + term_exit_sigsafe(); +} + +static volatile int received_sigterm = 0; +static volatile int received_nb_signals = 0; +static volatile int transcode_init_done = 0; +static volatile int ffmpeg_exited = 0; +static int main_return_code = 0; + +static void +sigterm_handler(int sig) +{ + received_sigterm = sig; + received_nb_signals++; + term_exit_sigsafe(); + if(received_nb_signals > 3) { + write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n", + strlen("Received > 3 system signals, hard exiting\n")); + + exit(123); + } +} + +#if HAVE_SETCONSOLECTRLHANDLER +static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) +{ + av_log(NULL, AV_LOG_DEBUG, "\nReceived windows signal %ld\n", fdwCtrlType); + + switch (fdwCtrlType) + { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + sigterm_handler(SIGINT); + return TRUE; + + case CTRL_CLOSE_EVENT: + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + sigterm_handler(SIGTERM); + /* Basically, with these 3 events, when we return from this method the + process is hard terminated, so stall as long as we need to + to try and let the main thread(s) clean up and gracefully terminate + (we have at most 5 seconds, but should be done far before that). */ + while (!ffmpeg_exited) { + Sleep(0); + } + return TRUE; + + default: + av_log(NULL, AV_LOG_ERROR, "Received unknown windows signal %ld\n", fdwCtrlType); + return FALSE; + } +} +#endif + +void term_init(void) +{ +#if HAVE_TERMIOS_H + if(!run_as_daemon){ + struct termios tty; + if (tcgetattr (0, &tty) == 0) { + oldtty = tty; + restore_tty = 1; + + tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP + |INLCR|IGNCR|ICRNL|IXON); + tty.c_oflag |= OPOST; + tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN); + tty.c_cflag &= ~(CSIZE|PARENB); + tty.c_cflag |= CS8; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 0; + + tcsetattr (0, TCSANOW, &tty); + } + signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */ + } +#endif + + signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */ + signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */ +#ifdef SIGXCPU + signal(SIGXCPU, sigterm_handler); +#endif +#if HAVE_SETCONSOLECTRLHANDLER + SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE); +#endif +} + +/* read a key without blocking */ +static int read_key(void) +{ + unsigned char ch; +#if HAVE_TERMIOS_H + int n = 1; + struct timeval tv; + fd_set rfds; + + FD_ZERO(&rfds); + FD_SET(0, &rfds); + tv.tv_sec = 0; + tv.tv_usec = 0; + n = select(1, &rfds, NULL, NULL, &tv); + if (n > 0) { + n = read(0, &ch, 1); + if (n == 1) + return ch; + + return n; + } +#elif HAVE_KBHIT +# if HAVE_PEEKNAMEDPIPE + static int is_pipe; + static HANDLE input_handle; + DWORD dw, nchars; + if(!input_handle){ + input_handle = GetStdHandle(STD_INPUT_HANDLE); + is_pipe = !GetConsoleMode(input_handle, &dw); + } + + if (is_pipe) { + /* When running under a GUI, you will end here. */ + if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL)) { + // input pipe may have been closed by the program that ran ffmpeg + return -1; + } + //Read it + if(nchars != 0) { + read(0, &ch, 1); + return ch; + }else{ + return -1; + } + } +# endif + if(kbhit()) + return(getch()); +#endif + return -1; +} + +static int decode_interrupt_cb(void *ctx) +{ + return received_nb_signals > transcode_init_done; +} + +const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL }; + +static void ffmpeg_cleanup(int ret) +{ + int i, j; + + if (do_benchmark) { + int maxrss = getmaxrss() / 1024; + av_log(NULL, AV_LOG_INFO, "bench: maxrss=%ikB\n", maxrss); + } + + for (i = 0; i < nb_filtergraphs; i++) { + FilterGraph *fg = filtergraphs[i]; + avfilter_graph_free(&fg->graph); + for (j = 0; j < fg->nb_inputs; j++) { + av_freep(&fg->inputs[j]->name); + av_freep(&fg->inputs[j]); + } + av_freep(&fg->inputs); + for (j = 0; j < fg->nb_outputs; j++) { + av_freep(&fg->outputs[j]->name); + av_freep(&fg->outputs[j]); + } + av_freep(&fg->outputs); + av_freep(&fg->graph_desc); + + av_freep(&filtergraphs[i]); + } + av_freep(&filtergraphs); + + av_freep(&subtitle_out); + + /* close files */ + for (i = 0; i < nb_output_files; i++) { + OutputFile *of = output_files[i]; + AVFormatContext *s; + if (!of) + continue; + s = of->ctx; + if (s && s->oformat && !(s->oformat->flags & AVFMT_NOFILE)) + avio_closep(&s->pb); + avformat_free_context(s); + av_dict_free(&of->opts); + + av_freep(&output_files[i]); + } + for (i = 0; i < nb_output_streams; i++) { + OutputStream *ost = output_streams[i]; + AVBitStreamFilterContext *bsfc; + + if (!ost) + continue; + + bsfc = ost->bitstream_filters; + while (bsfc) { + AVBitStreamFilterContext *next = bsfc->next; + av_bitstream_filter_close(bsfc); + bsfc = next; + } + ost->bitstream_filters = NULL; + av_frame_free(&ost->filtered_frame); + av_frame_free(&ost->last_frame); + + av_parser_close(ost->parser); + + av_freep(&ost->forced_keyframes); + av_expr_free(ost->forced_keyframes_pexpr); + av_freep(&ost->avfilter); + av_freep(&ost->logfile_prefix); + + av_freep(&ost->audio_channels_map); + ost->audio_channels_mapped = 0; + + av_dict_free(&ost->sws_dict); + + avcodec_free_context(&ost->enc_ctx); + + av_freep(&output_streams[i]); + } +#if HAVE_PTHREADS + free_input_threads(); +#endif + for (i = 0; i < nb_input_files; i++) { + avformat_close_input(&input_files[i]->ctx); + av_freep(&input_files[i]); + } + for (i = 0; i < nb_input_streams; i++) { + InputStream *ist = input_streams[i]; + + av_frame_free(&ist->decoded_frame); + av_frame_free(&ist->filter_frame); + av_dict_free(&ist->decoder_opts); + avsubtitle_free(&ist->prev_sub.subtitle); + av_frame_free(&ist->sub2video.frame); + av_freep(&ist->filters); + av_freep(&ist->hwaccel_device); + + avcodec_free_context(&ist->dec_ctx); + + av_freep(&input_streams[i]); + } + + if (vstats_file) { + if (fclose(vstats_file)) + av_log(NULL, AV_LOG_ERROR, + "Error closing vstats file, loss of information possible: %s\n", + av_err2str(AVERROR(errno))); + } + av_freep(&vstats_filename); + + av_freep(&input_streams); + av_freep(&input_files); + av_freep(&output_streams); + av_freep(&output_files); + + uninit_opts(); + + avformat_network_deinit(); + + if (received_sigterm) { + av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n", + (int) received_sigterm); + } else if (ret && transcode_init_done) { + av_log(NULL, AV_LOG_INFO, "Conversion failed!\n"); + } + term_exit(); + ffmpeg_exited = 1; +} + +void remove_avoptions(AVDictionary **a, AVDictionary *b) +{ + AVDictionaryEntry *t = NULL; + + while ((t = av_dict_get(b, "", t, AV_DICT_IGNORE_SUFFIX))) { + av_dict_set(a, t->key, NULL, AV_DICT_MATCH_CASE); + } +} + +void assert_avoptions(AVDictionary *m) +{ + AVDictionaryEntry *t; + if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) { + av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key); + exit_program(1); + } +} + +static void abort_codec_experimental(AVCodec *c, int encoder) +{ + exit_program(1); +} + +static void update_benchmark(const char *fmt, ...) +{ + if (do_benchmark_all) { + int64_t t = getutime(); + va_list va; + char buf[1024]; + + if (fmt) { + va_start(va, fmt); + vsnprintf(buf, sizeof(buf), fmt, va); + va_end(va); + av_log(NULL, AV_LOG_INFO, "bench: %8"PRIu64" %s \n", t - current_time, buf); + } + current_time = t; + } +} + +static void close_all_output_streams(OutputStream *ost, OSTFinished this_stream, OSTFinished others) +{ + int i; + for (i = 0; i < nb_output_streams; i++) { + OutputStream *ost2 = output_streams[i]; + ost2->finished |= ost == ost2 ? this_stream : others; + } +} + +static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) +{ + AVBitStreamFilterContext *bsfc = ost->bitstream_filters; + AVCodecContext *avctx = ost->encoding_needed ? ost->enc_ctx : ost->st->codec; + int ret; + + if (!ost->st->codec->extradata_size && ost->enc_ctx->extradata_size) { + ost->st->codec->extradata = av_mallocz(ost->enc_ctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (ost->st->codec->extradata) { + memcpy(ost->st->codec->extradata, ost->enc_ctx->extradata, ost->enc_ctx->extradata_size); + ost->st->codec->extradata_size = ost->enc_ctx->extradata_size; + } + } + + if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) || + (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0)) + pkt->pts = pkt->dts = AV_NOPTS_VALUE; + + /* + * Audio encoders may split the packets -- #frames in != #packets out. + * But there is no reordering, so we can limit the number of output packets + * by simply dropping them here. + * Counting encoded video frames needs to be done separately because of + * reordering, see do_video_out() + */ + if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) { + if (ost->frame_number >= ost->max_frames) { + av_packet_unref(pkt); + return; + } + ost->frame_number++; + } + if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) { + int i; + uint8_t *sd = av_packet_get_side_data(pkt, AV_PKT_DATA_QUALITY_STATS, + NULL); + ost->quality = sd ? AV_RL32(sd) : -1; + ost->pict_type = sd ? sd[4] : AV_PICTURE_TYPE_NONE; + + for (i = 0; i<FF_ARRAY_ELEMS(ost->error); i++) { + if (sd && i < sd[5]) + ost->error[i] = AV_RL64(sd + 8 + 8*i); + else + ost->error[i] = -1; + } + + if (ost->frame_rate.num && ost->is_cfr) { + if (pkt->duration > 0) + av_log(NULL, AV_LOG_WARNING, "Overriding packet duration by frame rate, this should not happen\n"); + pkt->duration = av_rescale_q(1, av_inv_q(ost->frame_rate), + ost->st->time_base); + } + } + + if (bsfc) + av_packet_split_side_data(pkt); + + if ((ret = av_apply_bitstream_filters(avctx, pkt, bsfc)) < 0) { + print_error("", ret); + if (exit_on_error) + exit_program(1); + } + + if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) { + if (pkt->dts != AV_NOPTS_VALUE && + pkt->pts != AV_NOPTS_VALUE && + pkt->dts > pkt->pts) { + av_log(s, AV_LOG_WARNING, "Invalid DTS: %"PRId64" PTS: %"PRId64" in output stream %d:%d, replacing by guess\n", + pkt->dts, pkt->pts, + ost->file_index, ost->st->index); + pkt->pts = + pkt->dts = pkt->pts + pkt->dts + ost->last_mux_dts + 1 + - FFMIN3(pkt->pts, pkt->dts, ost->last_mux_dts + 1) + - FFMAX3(pkt->pts, pkt->dts, ost->last_mux_dts + 1); + } + if( + (avctx->codec_type == AVMEDIA_TYPE_AUDIO || avctx->codec_type == AVMEDIA_TYPE_VIDEO) && + pkt->dts != AV_NOPTS_VALUE && + ost->last_mux_dts != AV_NOPTS_VALUE) { + int64_t max = ost->last_mux_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT); + if (pkt->dts < max) { + int loglevel = max - pkt->dts > 2 || avctx->codec_type == AVMEDIA_TYPE_VIDEO ? AV_LOG_WARNING : AV_LOG_DEBUG; + av_log(s, loglevel, "Non-monotonous DTS in output stream " + "%d:%d; previous: %"PRId64", current: %"PRId64"; ", + ost->file_index, ost->st->index, ost->last_mux_dts, pkt->dts); + if (exit_on_error) { + av_log(NULL, AV_LOG_FATAL, "aborting.\n"); + exit_program(1); + } + av_log(s, loglevel, "changing to %"PRId64". This may result " + "in incorrect timestamps in the output file.\n", + max); + if(pkt->pts >= pkt->dts) + pkt->pts = FFMAX(pkt->pts, max); + pkt->dts = max; + } + } + } + ost->last_mux_dts = pkt->dts; + + ost->data_size += pkt->size; + ost->packets_written++; + + pkt->stream_index = ost->index; + + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "muxer <- type:%s " + "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s size:%d\n", + av_get_media_type_string(ost->enc_ctx->codec_type), + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ost->st->time_base), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ost->st->time_base), + pkt->size + ); + } + + ret = av_interleaved_write_frame(s, pkt); + if (ret < 0) { + print_error("av_interleaved_write_frame()", ret); + main_return_code = 1; + close_all_output_streams(ost, MUXER_FINISHED | ENCODER_FINISHED, ENCODER_FINISHED); + } + av_packet_unref(pkt); +} + +static void close_output_stream(OutputStream *ost) +{ + OutputFile *of = output_files[ost->file_index]; + + ost->finished |= ENCODER_FINISHED; + if (of->shortest) { + int64_t end = av_rescale_q(ost->sync_opts - ost->first_pts, ost->enc_ctx->time_base, AV_TIME_BASE_Q); + of->recording_time = FFMIN(of->recording_time, end); + } +} + +static int check_recording_time(OutputStream *ost) +{ + OutputFile *of = output_files[ost->file_index]; + + if (of->recording_time != INT64_MAX && + av_compare_ts(ost->sync_opts - ost->first_pts, ost->enc_ctx->time_base, of->recording_time, + AV_TIME_BASE_Q) >= 0) { + close_output_stream(ost); + return 0; + } + return 1; +} + +static void do_audio_out(AVFormatContext *s, OutputStream *ost, + AVFrame *frame) +{ + AVCodecContext *enc = ost->enc_ctx; + AVPacket pkt; + int got_packet = 0; + + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + if (!check_recording_time(ost)) + return; + + if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0) + frame->pts = ost->sync_opts; + ost->sync_opts = frame->pts + frame->nb_samples; + ost->samples_encoded += frame->nb_samples; + ost->frames_encoded++; + + av_assert0(pkt.size || !pkt.data); + update_benchmark(NULL); + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "encoder <- type:audio " + "frame_pts:%s frame_pts_time:%s time_base:%d/%d\n", + av_ts2str(frame->pts), av_ts2timestr(frame->pts, &enc->time_base), + enc->time_base.num, enc->time_base.den); + } + + if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) { + av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n"); + exit_program(1); + } + update_benchmark("encode_audio %d.%d", ost->file_index, ost->index); + + if (got_packet) { + av_packet_rescale_ts(&pkt, enc->time_base, ost->st->time_base); + + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "encoder -> type:audio " + "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n", + av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base), + av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base)); + } + + write_frame(s, &pkt, ost); + } +} + +static void do_subtitle_out(AVFormatContext *s, + OutputStream *ost, + InputStream *ist, + AVSubtitle *sub) +{ + int subtitle_out_max_size = 1024 * 1024; + int subtitle_out_size, nb, i; + AVCodecContext *enc; + AVPacket pkt; + int64_t pts; + + if (sub->pts == AV_NOPTS_VALUE) { + av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n"); + if (exit_on_error) + exit_program(1); + return; + } + + enc = ost->enc_ctx; + + if (!subtitle_out) { + subtitle_out = av_malloc(subtitle_out_max_size); + if (!subtitle_out) { + av_log(NULL, AV_LOG_FATAL, "Failed to allocate subtitle_out\n"); + exit_program(1); + } + } + + /* Note: DVB subtitle need one packet to draw them and one other + packet to clear them */ + /* XXX: signal it in the codec context ? */ + if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) + nb = 2; + else + nb = 1; + + /* shift timestamp to honor -ss and make check_recording_time() work with -t */ + pts = sub->pts; + if (output_files[ost->file_index]->start_time != AV_NOPTS_VALUE) + pts -= output_files[ost->file_index]->start_time; + for (i = 0; i < nb; i++) { + unsigned save_num_rects = sub->num_rects; + + ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base); + if (!check_recording_time(ost)) + return; + + sub->pts = pts; + // start_display_time is required to be 0 + sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q); + sub->end_display_time -= sub->start_display_time; + sub->start_display_time = 0; + if (i == 1) + sub->num_rects = 0; + + ost->frames_encoded++; + + subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out, + subtitle_out_max_size, sub); + if (i == 1) + sub->num_rects = save_num_rects; + if (subtitle_out_size < 0) { + av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n"); + exit_program(1); + } + + av_init_packet(&pkt); + pkt.data = subtitle_out; + pkt.size = subtitle_out_size; + pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base); + pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base); + if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) { + /* XXX: the pts correction is handled here. Maybe handling + it in the codec would be better */ + if (i == 0) + pkt.pts += 90 * sub->start_display_time; + else + pkt.pts += 90 * sub->end_display_time; + } + pkt.dts = pkt.pts; + write_frame(s, &pkt, ost); + } +} + +static void do_video_out(AVFormatContext *s, + OutputStream *ost, + AVFrame *next_picture, + double sync_ipts) +{ + int ret, format_video_sync; + AVPacket pkt; + AVCodecContext *enc = ost->enc_ctx; + AVCodecContext *mux_enc = ost->st->codec; + int nb_frames, nb0_frames, i; + double delta, delta0; + double duration = 0; + int frame_size = 0; + InputStream *ist = NULL; + AVFilterContext *filter = ost->filter->filter; + + if (ost->source_index >= 0) + ist = input_streams[ost->source_index]; + + if (filter->inputs[0]->frame_rate.num > 0 && + filter->inputs[0]->frame_rate.den > 0) + duration = 1/(av_q2d(filter->inputs[0]->frame_rate) * av_q2d(enc->time_base)); + + if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num) + duration = FFMIN(duration, 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base))); + + if (!ost->filters_script && + !ost->filters && + next_picture && + ist && + lrintf(av_frame_get_pkt_duration(next_picture) * av_q2d(ist->st->time_base) / av_q2d(enc->time_base)) > 0) { + duration = lrintf(av_frame_get_pkt_duration(next_picture) * av_q2d(ist->st->time_base) / av_q2d(enc->time_base)); + } + + if (!next_picture) { + //end, flushing + nb0_frames = nb_frames = mid_pred(ost->last_nb0_frames[0], + ost->last_nb0_frames[1], + ost->last_nb0_frames[2]); + } else { + delta0 = sync_ipts - ost->sync_opts; // delta0 is the "drift" between the input frame (next_picture) and where it would fall in the output. + delta = delta0 + duration; + + /* by default, we output a single frame */ + nb0_frames = 0; // tracks the number of times the PREVIOUS frame should be duplicated, mostly for variable framerate (VFR) + nb_frames = 1; + + format_video_sync = video_sync_method; + if (format_video_sync == VSYNC_AUTO) { + if(!strcmp(s->oformat->name, "avi")) { + format_video_sync = VSYNC_VFR; + } else + format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : VSYNC_CFR; + if ( ist + && format_video_sync == VSYNC_CFR + && input_files[ist->file_index]->ctx->nb_streams == 1 + && input_files[ist->file_index]->input_ts_offset == 0) { + format_video_sync = VSYNC_VSCFR; + } + if (format_video_sync == VSYNC_CFR && copy_ts) { + format_video_sync = VSYNC_VSCFR; + } + } + ost->is_cfr = (format_video_sync == VSYNC_CFR || format_video_sync == VSYNC_VSCFR); + + if (delta0 < 0 && + delta > 0 && + format_video_sync != VSYNC_PASSTHROUGH && + format_video_sync != VSYNC_DROP) { + if (delta0 < -0.6) { + av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0); + } else + av_log(NULL, AV_LOG_DEBUG, "Clipping frame in rate conversion by %f\n", -delta0); + sync_ipts = ost->sync_opts; + duration += delta0; + delta0 = 0; + } + + switch (format_video_sync) { + case VSYNC_VSCFR: + if (ost->frame_number == 0 && delta0 >= 0.5) { + av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta0)); + delta = duration; + delta0 = 0; + ost->sync_opts = lrint(sync_ipts); + } + case VSYNC_CFR: + // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c + if (frame_drop_threshold && delta < frame_drop_threshold && ost->frame_number) { + nb_frames = 0; + } else if (delta < -1.1) + nb_frames = 0; + else if (delta > 1.1) { + nb_frames = lrintf(delta); + if (delta0 > 1.1) + nb0_frames = lrintf(delta0 - 0.6); + } + break; + case VSYNC_VFR: + if (delta <= -0.6) + nb_frames = 0; + else if (delta > 0.6) + ost->sync_opts = lrint(sync_ipts); + break; + case VSYNC_DROP: + case VSYNC_PASSTHROUGH: + ost->sync_opts = lrint(sync_ipts); + break; + default: + av_assert0(0); + } + } + + nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number); + nb0_frames = FFMIN(nb0_frames, nb_frames); + + memmove(ost->last_nb0_frames + 1, + ost->last_nb0_frames, + sizeof(ost->last_nb0_frames[0]) * (FF_ARRAY_ELEMS(ost->last_nb0_frames) - 1)); + ost->last_nb0_frames[0] = nb0_frames; + + if (nb0_frames == 0 && ost->last_dropped) { + nb_frames_drop++; + av_log(NULL, AV_LOG_VERBOSE, + "*** dropping frame %d from stream %d at ts %"PRId64"\n", + ost->frame_number, ost->st->index, ost->last_frame->pts); + } + if (nb_frames > (nb0_frames && ost->last_dropped) + (nb_frames > nb0_frames)) { + if (nb_frames > dts_error_threshold * 30) { + av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skipping\n", nb_frames - 1); + nb_frames_drop++; + return; + } + nb_frames_dup += nb_frames - (nb0_frames && ost->last_dropped) - (nb_frames > nb0_frames); + av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1); + } + ost->last_dropped = nb_frames == nb0_frames && next_picture; + + /* duplicates frame if needed */ + for (i = 0; i < nb_frames; i++) { + AVFrame *in_picture; + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + if (i < nb0_frames && ost->last_frame) { + in_picture = ost->last_frame; + } else + in_picture = next_picture; + + if (!in_picture) + return; + + in_picture->pts = ost->sync_opts; + +#if 1 + if (!check_recording_time(ost)) +#else + if (ost->frame_number >= ost->max_frames) +#endif + return; + +#if FF_API_LAVF_FMT_RAWPICTURE + if (s->oformat->flags & AVFMT_RAWPICTURE && + enc->codec->id == AV_CODEC_ID_RAWVIDEO) { + /* raw pictures are written as AVPicture structure to + avoid any copies. We support temporarily the older + method. */ + if (in_picture->interlaced_frame) + mux_enc->field_order = in_picture->top_field_first ? AV_FIELD_TB:AV_FIELD_BT; + else + mux_enc->field_order = AV_FIELD_PROGRESSIVE; + pkt.data = (uint8_t *)in_picture; + pkt.size = sizeof(AVPicture); + pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base); + pkt.flags |= AV_PKT_FLAG_KEY; + + write_frame(s, &pkt, ost); + } else +#endif + { + int got_packet, forced_keyframe = 0; + double pts_time; + + if (enc->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) && + ost->top_field_first >= 0) + in_picture->top_field_first = !!ost->top_field_first; + + if (in_picture->interlaced_frame) { + if (enc->codec->id == AV_CODEC_ID_MJPEG) + mux_enc->field_order = in_picture->top_field_first ? AV_FIELD_TT:AV_FIELD_BB; + else + mux_enc->field_order = in_picture->top_field_first ? AV_FIELD_TB:AV_FIELD_BT; + } else + mux_enc->field_order = AV_FIELD_PROGRESSIVE; + + in_picture->quality = enc->global_quality; + in_picture->pict_type = 0; + + pts_time = in_picture->pts != AV_NOPTS_VALUE ? + in_picture->pts * av_q2d(enc->time_base) : NAN; + if (ost->forced_kf_index < ost->forced_kf_count && + in_picture->pts >= ost->forced_kf_pts[ost->forced_kf_index]) { + ost->forced_kf_index++; + forced_keyframe = 1; + } else if (ost->forced_keyframes_pexpr) { + double res; + ost->forced_keyframes_expr_const_values[FKF_T] = pts_time; + res = av_expr_eval(ost->forced_keyframes_pexpr, + ost->forced_keyframes_expr_const_values, NULL); + ff_dlog(NULL, "force_key_frame: n:%f n_forced:%f prev_forced_n:%f t:%f prev_forced_t:%f -> res:%f\n", + ost->forced_keyframes_expr_const_values[FKF_N], + ost->forced_keyframes_expr_const_values[FKF_N_FORCED], + ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N], + ost->forced_keyframes_expr_const_values[FKF_T], + ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T], + res); + if (res) { + forced_keyframe = 1; + ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N] = + ost->forced_keyframes_expr_const_values[FKF_N]; + ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T] = + ost->forced_keyframes_expr_const_values[FKF_T]; + ost->forced_keyframes_expr_const_values[FKF_N_FORCED] += 1; + } + + ost->forced_keyframes_expr_const_values[FKF_N] += 1; + } else if ( ost->forced_keyframes + && !strncmp(ost->forced_keyframes, "source", 6) + && in_picture->key_frame==1) { + forced_keyframe = 1; + } + + if (forced_keyframe) { + in_picture->pict_type = AV_PICTURE_TYPE_I; + av_log(NULL, AV_LOG_DEBUG, "Forced keyframe at time %f\n", pts_time); + } + + update_benchmark(NULL); + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "encoder <- type:video " + "frame_pts:%s frame_pts_time:%s time_base:%d/%d\n", + av_ts2str(in_picture->pts), av_ts2timestr(in_picture->pts, &enc->time_base), + enc->time_base.num, enc->time_base.den); + } + + ost->frames_encoded++; + + ret = avcodec_encode_video2(enc, &pkt, in_picture, &got_packet); + update_benchmark("encode_video %d.%d", ost->file_index, ost->index); + if (ret < 0) { + av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); + exit_program(1); + } + + if (got_packet) { + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "encoder -> type:video " + "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n", + av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &enc->time_base), + av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &enc->time_base)); + } + + if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & AV_CODEC_CAP_DELAY)) + pkt.pts = ost->sync_opts; + + av_packet_rescale_ts(&pkt, enc->time_base, ost->st->time_base); + + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "encoder -> type:video " + "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n", + av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base), + av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base)); + } + + frame_size = pkt.size; + write_frame(s, &pkt, ost); + + /* if two pass, output log */ + if (ost->logfile && enc->stats_out) { + fprintf(ost->logfile, "%s", enc->stats_out); + } + } + } + ost->sync_opts++; + /* + * For video, number of frames in == number of packets out. + * But there may be reordering, so we can't throw away frames on encoder + * flush, we need to limit them here, before they go into encoder. + */ + ost->frame_number++; + + if (vstats_filename && frame_size) + do_video_stats(ost, frame_size); + } + + if (!ost->last_frame) + ost->last_frame = av_frame_alloc(); + av_frame_unref(ost->last_frame); + if (next_picture && ost->last_frame) + av_frame_ref(ost->last_frame, next_picture); + else + av_frame_free(&ost->last_frame); +} + +static double psnr(double d) +{ + return -10.0 * log10(d); +} + +static void do_video_stats(OutputStream *ost, int frame_size) +{ + AVCodecContext *enc; + int frame_number; + double ti1, bitrate, avg_bitrate; + + /* this is executed just the first time do_video_stats is called */ + if (!vstats_file) { + vstats_file = fopen(vstats_filename, "w"); + if (!vstats_file) { + perror("fopen"); + exit_program(1); + } + } + + enc = ost->enc_ctx; + if (enc->codec_type == AVMEDIA_TYPE_VIDEO) { + frame_number = ost->st->nb_frames; + fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, + ost->quality / (float)FF_QP2LAMBDA); + + if (ost->error[0]>=0 && (enc->flags & AV_CODEC_FLAG_PSNR)) + fprintf(vstats_file, "PSNR= %6.2f ", psnr(ost->error[0] / (enc->width * enc->height * 255.0 * 255.0))); + + fprintf(vstats_file,"f_size= %6d ", frame_size); + /* compute pts value */ + ti1 = av_stream_get_end_pts(ost->st) * av_q2d(ost->st->time_base); + if (ti1 < 0.01) + ti1 = 0.01; + + bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0; + avg_bitrate = (double)(ost->data_size * 8) / ti1 / 1000.0; + fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ", + (double)ost->data_size / 1024, ti1, bitrate, avg_bitrate); + fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(ost->pict_type)); + } +} + +static void finish_output_stream(OutputStream *ost) +{ + OutputFile *of = output_files[ost->file_index]; + int i; + + ost->finished = ENCODER_FINISHED | MUXER_FINISHED; + + if (of->shortest) { + for (i = 0; i < of->ctx->nb_streams; i++) + output_streams[of->ost_index + i]->finished = ENCODER_FINISHED | MUXER_FINISHED; + } +} + +/** + * Get and encode new output from any of the filtergraphs, without causing + * activity. + * + * @return 0 for success, <0 for severe errors + */ +static int reap_filters(int flush) +{ + AVFrame *filtered_frame = NULL; + int i; + + /* Reap all buffers present in the buffer sinks */ + for (i = 0; i < nb_output_streams; i++) { + OutputStream *ost = output_streams[i]; + OutputFile *of = output_files[ost->file_index]; + AVFilterContext *filter; + AVCodecContext *enc = ost->enc_ctx; + int ret = 0; + + if (!ost->filter) + continue; + filter = ost->filter->filter; + + if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) { + return AVERROR(ENOMEM); + } + filtered_frame = ost->filtered_frame; + + while (1) { + double float_pts = AV_NOPTS_VALUE; // this is identical to filtered_frame.pts but with higher precision + ret = av_buffersink_get_frame_flags(filter, filtered_frame, + AV_BUFFERSINK_FLAG_NO_REQUEST); + if (ret < 0) { + if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { + av_log(NULL, AV_LOG_WARNING, + "Error in av_buffersink_get_frame_flags(): %s\n", av_err2str(ret)); + } else if (flush && ret == AVERROR_EOF) { + if (filter->inputs[0]->type == AVMEDIA_TYPE_VIDEO) + do_video_out(of->ctx, ost, NULL, AV_NOPTS_VALUE); + } + break; + } + if (ost->finished) { + av_frame_unref(filtered_frame); + continue; + } + if (filtered_frame->pts != AV_NOPTS_VALUE) { + int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time; + AVRational tb = enc->time_base; + int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16); + + tb.den <<= extra_bits; + float_pts = + av_rescale_q(filtered_frame->pts, filter->inputs[0]->time_base, tb) - + av_rescale_q(start_time, AV_TIME_BASE_Q, tb); + float_pts /= 1 << extra_bits; + // avoid exact midoints to reduce the chance of rounding differences, this can be removed in case the fps code is changed to work with integers + float_pts += FFSIGN(float_pts) * 1.0 / (1<<17); + + filtered_frame->pts = + av_rescale_q(filtered_frame->pts, filter->inputs[0]->time_base, enc->time_base) - + av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base); + } + //if (ost->source_index >= 0) + // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold + + switch (filter->inputs[0]->type) { + case AVMEDIA_TYPE_VIDEO: + if (!ost->frame_aspect_ratio.num) + enc->sample_aspect_ratio = filtered_frame->sample_aspect_ratio; + + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s exact:%f time_base:%d/%d\n", + av_ts2str(filtered_frame->pts), av_ts2timestr(filtered_frame->pts, &enc->time_base), + float_pts, + enc->time_base.num, enc->time_base.den); + } + + do_video_out(of->ctx, ost, filtered_frame, float_pts); + break; + case AVMEDIA_TYPE_AUDIO: + if (!(enc->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE) && + enc->channels != av_frame_get_channels(filtered_frame)) { + av_log(NULL, AV_LOG_ERROR, + "Audio filter graph output is not normalized and encoder does not support parameter changes\n"); + break; + } + do_audio_out(of->ctx, ost, filtered_frame); + break; + default: + // TODO support subtitle filters + av_assert0(0); + } + + av_frame_unref(filtered_frame); + } + } + + return 0; +} + +static void print_final_stats(int64_t total_size) +{ + uint64_t video_size = 0, audio_size = 0, extra_size = 0, other_size = 0; + uint64_t subtitle_size = 0; + uint64_t data_size = 0; + float percent = -1.0; + int i, j; + int pass1_used = 1; + + for (i = 0; i < nb_output_streams; i++) { + OutputStream *ost = output_streams[i]; + switch (ost->enc_ctx->codec_type) { + case AVMEDIA_TYPE_VIDEO: video_size += ost->data_size; break; + case AVMEDIA_TYPE_AUDIO: audio_size += ost->data_size; break; + case AVMEDIA_TYPE_SUBTITLE: subtitle_size += ost->data_size; break; + default: other_size += ost->data_size; break; + } + extra_size += ost->enc_ctx->extradata_size; + data_size += ost->data_size; + if ( (ost->enc_ctx->flags & (AV_CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) + != AV_CODEC_FLAG_PASS1) + pass1_used = 0; + } + + if (data_size && total_size>0 && total_size >= data_size) + percent = 100.0 * (total_size - data_size) / data_size; + + av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0fkB other streams:%1.0fkB global headers:%1.0fkB muxing overhead: ", + video_size / 1024.0, + audio_size / 1024.0, + subtitle_size / 1024.0, + other_size / 1024.0, + extra_size / 1024.0); + if (percent >= 0.0) + av_log(NULL, AV_LOG_INFO, "%f%%", percent); + else + av_log(NULL, AV_LOG_INFO, "unknown"); + av_log(NULL, AV_LOG_INFO, "\n"); + + /* print verbose per-stream stats */ + for (i = 0; i < nb_input_files; i++) { + InputFile *f = input_files[i]; + uint64_t total_packets = 0, total_size = 0; + + av_log(NULL, AV_LOG_VERBOSE, "Input file #%d (%s):\n", + i, f->ctx->filename); + + for (j = 0; j < f->nb_streams; j++) { + InputStream *ist = input_streams[f->ist_index + j]; + enum AVMediaType type = ist->dec_ctx->codec_type; + + total_size += ist->data_size; + total_packets += ist->nb_packets; + + av_log(NULL, AV_LOG_VERBOSE, " Input stream #%d:%d (%s): ", + i, j, media_type_string(type)); + av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" packets read (%"PRIu64" bytes); ", + ist->nb_packets, ist->data_size); + + if (ist->decoding_needed) { + av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" frames decoded", + ist->frames_decoded); + if (type == AVMEDIA_TYPE_AUDIO) + av_log(NULL, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ist->samples_decoded); + av_log(NULL, AV_LOG_VERBOSE, "; "); + } + + av_log(NULL, AV_LOG_VERBOSE, "\n"); + } + + av_log(NULL, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) demuxed\n", + total_packets, total_size); + } + + for (i = 0; i < nb_output_files; i++) { + OutputFile *of = output_files[i]; + uint64_t total_packets = 0, total_size = 0; + + av_log(NULL, AV_LOG_VERBOSE, "Output file #%d (%s):\n", + i, of->ctx->filename); + + for (j = 0; j < of->ctx->nb_streams; j++) { + OutputStream *ost = output_streams[of->ost_index + j]; + enum AVMediaType type = ost->enc_ctx->codec_type; + + total_size += ost->data_size; + total_packets += ost->packets_written; + + av_log(NULL, AV_LOG_VERBOSE, " Output stream #%d:%d (%s): ", + i, j, media_type_string(type)); + if (ost->encoding_needed) { + av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" frames encoded", + ost->frames_encoded); + if (type == AVMEDIA_TYPE_AUDIO) + av_log(NULL, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ost->samples_encoded); + av_log(NULL, AV_LOG_VERBOSE, "; "); + } + + av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" packets muxed (%"PRIu64" bytes); ", + ost->packets_written, ost->data_size); + + av_log(NULL, AV_LOG_VERBOSE, "\n"); + } + + av_log(NULL, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) muxed\n", + total_packets, total_size); + } + if(video_size + data_size + audio_size + subtitle_size + extra_size == 0){ + av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded "); + if (pass1_used) { + av_log(NULL, AV_LOG_WARNING, "\n"); + } else { + av_log(NULL, AV_LOG_WARNING, "(check -ss / -t / -frames parameters if used)\n"); + } + } +} + +static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time) +{ + char buf[1024]; + AVBPrint buf_script; + OutputStream *ost; + AVFormatContext *oc; + int64_t total_size; + AVCodecContext *enc; + int frame_number, vid, i; + double bitrate; + double speed; + int64_t pts = INT64_MIN + 1; + static int64_t last_time = -1; + static int qp_histogram[52]; + int hours, mins, secs, us; + int ret; + float t; + + if (!print_stats && !is_last_report && !progress_avio) + return; + + if (!is_last_report) { + if (last_time == -1) { + last_time = cur_time; + return; + } + if ((cur_time - last_time) < 500000) + return; + last_time = cur_time; + } + + t = (cur_time-timer_start) / 1000000.0; + + + oc = output_files[0]->ctx; + + total_size = avio_size(oc->pb); + if (total_size <= 0) // FIXME improve avio_size() so it works with non seekable output too + total_size = avio_tell(oc->pb); + + buf[0] = '\0'; + vid = 0; + av_bprint_init(&buf_script, 0, 1); + for (i = 0; i < nb_output_streams; i++) { + float q = -1; + ost = output_streams[i]; + enc = ost->enc_ctx; + if (!ost->stream_copy) + q = ost->quality / (float) FF_QP2LAMBDA; + + if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) { + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q); + av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n", + ost->file_index, ost->index, q); + } + if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) { + float fps; + + frame_number = ost->frame_number; + fps = t > 1 ? frame_number / t : 0; + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ", + frame_number, fps < 9.95, fps, q); + av_bprintf(&buf_script, "frame=%d\n", frame_number); + av_bprintf(&buf_script, "fps=%.1f\n", fps); + av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n", + ost->file_index, ost->index, q); + if (is_last_report) + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L"); + if (qp_hist) { + int j; + int qp = lrintf(q); + if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram)) + qp_histogram[qp]++; + for (j = 0; j < 32; j++) + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", av_log2(qp_histogram[j] + 1)); + } + + if ((enc->flags & AV_CODEC_FLAG_PSNR) && (ost->pict_type != AV_PICTURE_TYPE_NONE || is_last_report)) { + int j; + double error, error_sum = 0; + double scale, scale_sum = 0; + double p; + char type[3] = { 'Y','U','V' }; + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR="); + for (j = 0; j < 3; j++) { + if (is_last_report) { + error = enc->error[j]; + scale = enc->width * enc->height * 255.0 * 255.0 * frame_number; + } else { + error = ost->error[j]; + scale = enc->width * enc->height * 255.0 * 255.0; + } + if (j) + scale /= 4; + error_sum += error; + scale_sum += scale; + p = psnr(error / scale); + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], p); + av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n", + ost->file_index, ost->index, type[j] | 32, p); + } + p = psnr(error_sum / scale_sum); + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum)); + av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n", + ost->file_index, ost->index, p); + } + vid = 1; + } + /* compute min output value */ + if (av_stream_get_end_pts(ost->st) != AV_NOPTS_VALUE) + pts = FFMAX(pts, av_rescale_q(av_stream_get_end_pts(ost->st), + ost->st->time_base, AV_TIME_BASE_Q)); + if (is_last_report) + nb_frames_drop += ost->last_dropped; + } + + secs = FFABS(pts) / AV_TIME_BASE; + us = FFABS(pts) % AV_TIME_BASE; + mins = secs / 60; + secs %= 60; + hours = mins / 60; + mins %= 60; + + bitrate = pts && total_size >= 0 ? total_size * 8 / (pts / 1000.0) : -1; + speed = t != 0.0 ? (double)pts / AV_TIME_BASE / t : -1; + + if (total_size < 0) snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + "size=N/A time="); + else snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + "size=%8.0fkB time=", total_size / 1024.0); + if (pts < 0) + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "-"); + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + "%02d:%02d:%02d.%02d ", hours, mins, secs, + (100 * us) / AV_TIME_BASE); + + if (bitrate < 0) { + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),"bitrate=N/A"); + av_bprintf(&buf_script, "bitrate=N/A\n"); + }else{ + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),"bitrate=%6.1fkbits/s", bitrate); + av_bprintf(&buf_script, "bitrate=%6.1fkbits/s\n", bitrate); + } + + if (total_size < 0) av_bprintf(&buf_script, "total_size=N/A\n"); + else av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size); + av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts); + av_bprintf(&buf_script, "out_time=%02d:%02d:%02d.%06d\n", + hours, mins, secs, us); + + if (nb_frames_dup || nb_frames_drop) + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d", + nb_frames_dup, nb_frames_drop); + av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup); + av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop); + + i