From 3f548f59e1b3c85de77d6f39e028d4f132d046de Mon Sep 17 00:00:00 2001 From: Eric <5846501+ericphanson@users.noreply.github.com> Date: Mon, 8 Jul 2019 19:28:26 -0500 Subject: [PATCH] Add BinaryProvider ffmpeg --- .gitignore | 3 ++ Project.toml | 4 ++- deps/build.jl | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ src/Plots.jl | 6 ++++ src/animation.jl | 8 +++--- src/init.jl | 6 ++++ 6 files changed, 94 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 1bac5f19..701c9955 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,7 @@ examples/meetup/.ipynb_checkpoints/* deps/plotly-latest.min.js deps/build.log deps/deps.jl +deps/binary_provider_deps.jl +deps/usr +deps/build_*.jl Manifest.toml diff --git a/Project.toml b/Project.toml index 0d611db2..284409fb 100644 --- a/Project.toml +++ b/Project.toml @@ -5,12 +5,14 @@ version = "0.25.3" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +BinaryProvider = "b99e7846-7c00-51b0-8f62-c81ae34c0232" Contour = "d38c429a-6771-53c6-b99e-75d170b6e991" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" GR = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" @@ -39,6 +41,7 @@ StatsBase = "≥ 0.14.0" julia = "≥ 1.0.0" [extras] +BinaryProvider = "b99e7846-7c00-51b0-8f62-c81ae34c0232" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" @@ -50,7 +53,6 @@ StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92" -BinaryProvider = "b99e7846-7c00-51b0-8f62-c81ae34c0232" [targets] test = ["BinaryProvider", "Pkg", "Test", "Random", "StatsPlots", "VisualRegressionTests", "LaTeXStrings", "Images", "ImageMagick", "RDatasets", "FileIO", "UnicodePlots"] diff --git a/deps/build.jl b/deps/build.jl index a8cf81ff..61c75f27 100644 --- a/deps/build.jl +++ b/deps/build.jl @@ -1,4 +1,76 @@ +using BinaryProvider # requires BinaryProvider 0.3.0 or later + +# If the environmental variable is set, obey that. +# Otherwise, use BinaryProvider `ffmpeg` if we cannot find +# a system version. +if get(ENV, "PLOTS_INSTALL_FFMPEG", "auto") == "true" + use_bp = true +elseif get(ENV, "PLOTS_INSTALL_FFMPEG", "auto") == "false" + use_bp = false +elseif get(ENV, "PLOTS_INSTALL_FFMPEG", "auto") == "auto" + if Sys.which("ffmpeg") === nothing + use_bp = true + else + use_bp = false + end +end + + +if use_bp + @info("Using BinaryProvider `ffmpeg`") + + # Parse some basic command-line arguments + const verbose = "--verbose" in ARGS + const prefix = Prefix(get([a for a in ARGS if a != "--verbose"], 1, joinpath(@__DIR__, "usr"))) + + products = Product[ + ExecutableProduct(prefix, "ffmpeg", :ffmpeg), + ] + + dependencies = [ + "https://github.com/JuliaPackaging/Yggdrasil/releases/download/Bzip2-v1.0.6-2/build_Bzip2.v1.0.6.jl", + + "https://github.com/ianshmean/ZlibBuilder/releases/download/v1.2.11/build_Zlib.v1.2.11.jl", + "https://github.com/SimonDanisch/FDKBuilder/releases/download/0.1.6/build_libfdk.v0.1.6.jl", + "https://github.com/SimonDanisch/FribidiBuilder/releases/download/0.14.0/build_fribidi.v0.14.0.jl", + "https://github.com/JuliaGraphics/FreeTypeBuilder/releases/download/v2.9.1-4/build_FreeType2.v2.10.0.jl", + "https://github.com/JuliaIO/LibassBuilder/releases/download/v0.14.0-2/build_libass.v0.14.0.jl", + + "https://github.com/JuliaIO/LAMEBuilder/releases/download/v3.100.0-2/build_liblame.v3.100.0.jl", + + "https://github.com/JuliaIO/OggBuilder/releases/download/v1.3.3-7/build_Ogg.v1.3.3.jl", + "https://github.com/JuliaIO/LibVorbisBuilder/releases/download/v1.3.6-2/build_libvorbis.v1.3.6.jl", + + "https://github.com/JuliaIO/LibVPXBuilder/releases/download/v1.8.0/build_LibVPX.v1.8.0.jl", + "https://github.com/JuliaIO/x264Builder/releases/download/v2019.5.25-static/build_x264Builder.v2019.5.25.jl", + "https://github.com/JuliaIO/x265Builder/releases/download/v3.0.0-static/build_x265Builder.v3.0.0.jl", + + "https://github.com/JuliaIO/FFMPEGBuilder/releases/download/v4.1.0/build_FFMPEG.v4.1.0.jl" + ] + + for dependency in dependencies + file = joinpath(@__DIR__, basename(dependency)) + isfile(file) || download(dependency, file) + # it's a bit faster to run the build in an anonymous module instead of + # starting a new julia process + + # Build the dependencies + Mod = @eval module Anon end + Mod.include(file) + end + + write_deps_file(joinpath(@__DIR__, "binary_provider_deps.jl"), products) + +else + @info("Using system `ffmpeg`. If you run into `ffmpeg`-related trouble, trying running `ENV[\"PLOTS_INSTALL_FFMPEG\"]=\"true\"; using Pkg; Pkg.build(\"Plots\")` to use `BinaryProvider`-provided `ffmpeg` instead.") + + + if isfile("binary_provider_deps.jl") + rm("binary_provider_deps.jl") + end +end + #TODO: download https://cdn.plot.ly/plotly-latest.min.js to deps/ if it doesn't exist file_path = "" if get(ENV, "PLOTS_HOST_DEPENDENCY_LOCAL", "false") == "true" diff --git a/src/Plots.jl b/src/Plots.jl index 0849c20b..23cab0d5 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -30,6 +30,12 @@ else const plotly_local_file_path = "" end +if isfile(joinpath(@__DIR__, "..", "deps", "binary_provider_deps.jl")) + include(joinpath(@__DIR__, "..", "deps", "binary_provider_deps.jl")) +else + const ffmpeg = "ffmpeg" +end + export grid, bbox, diff --git a/src/animation.jl b/src/animation.jl index f4db54be..d58935e7 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -76,15 +76,15 @@ function buildanimation(animdir::AbstractString, fn::AbstractString, if variable_palette # generate a colorpalette for each frame for highest quality, but larger filesize palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" - run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) + run(`$ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) else # generate a colorpalette first so ffmpeg does not have to guess it - run(`ffmpeg -v 0 -i $(animdir)/%06d.png -vf "palettegen=stats_mode=diff" -y "$(animdir)/palette.bmp"`) + run(`$ffmpeg -v 0 -i $(animdir)/%06d.png -vf "palettegen=stats_mode=diff" -y "$(animdir)/palette.bmp"`) # then apply the palette to get better results - run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`) + run(`$ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`) end else - run(`ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) + run(`$ffmpeg -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) end show_msg && @info("Saved animation to ", fn) diff --git a/src/init.jl b/src/init.jl index bffc99f2..e89659fd 100644 --- a/src/init.jl +++ b/src/init.jl @@ -11,6 +11,12 @@ end function __init__() + + # for BinaryProvider + if isfile(joinpath(@__DIR__, "..", "deps", "binary_provider_deps.jl")) + check_deps() + end + user_defaults = _plots_defaults() if haskey(user_defaults, :theme) theme(user_defaults[:theme])