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,
+ * bu