diff --git a/CMake/Modules/FindFFMPEG.cmake b/CMake/Modules/FindFFMPEG.cmake new file mode 100644 index 0000000000..af0ee70e28 --- /dev/null +++ b/CMake/Modules/FindFFMPEG.cmake @@ -0,0 +1,224 @@ +# This was copied from the robotology/ycm project. + +#.rst: +# FindFFMPEG +# ---------- +# +# Find the native FFMPEG includes and library +# +# This module defines:: +# +# FFMPEG_INCLUDE_DIR, where to find avcodec.h, avformat.h ... +# FFMPEG_LIBRARIES, the libraries to link against to use FFMPEG. +# FFMPEG_FOUND, If false, do not try to use FFMPEG. +# +# also defined, but not for general use are:: +# +# FFMPEG_avformat_LIBRARY, where to find the FFMPEG avformat library. +# FFMPEG_avcodec_LIBRARY, where to find the FFMPEG avcodec library. +# +# This is useful to do it this way so that we can always add more libraries +# if needed to ``FFMPEG_LIBRARIES`` if ffmpeg ever changes... + +#============================================================================= +# Copyright: 1993-2008 Ken Martin, Will Schroeder, Bill Lorensen +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of YCM, substitute the full +# License text for the above reference.) + +# Originally from VTK project + + +find_path(FFMPEG_INCLUDE_DIR1 avformat.h + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/ffmpeg + $ENV{FFMPEG_DIR}/libavformat + $ENV{FFMPEG_DIR}/include/libavformat + $ENV{FFMPEG_DIR}/include/ffmpeg + /usr/local/include/ffmpeg + /usr/include/ffmpeg + /usr/include/libavformat + /usr/include/ffmpeg/libavformat + /usr/local/include/libavformat +) + +find_path(FFMPEG_INCLUDE_DIR2 avutil.h + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/ffmpeg + $ENV{FFMPEG_DIR}/libavutil + $ENV{FFMPEG_DIR}/include/libavutil + $ENV{FFMPEG_DIR}/include/ffmpeg + /usr/local/include/ffmpeg + /usr/include/ffmpeg + /usr/include/libavutil + /usr/include/ffmpeg/libavutil + /usr/local/include/libavutil +) + +find_path(FFMPEG_INCLUDE_DIR3 avcodec.h + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/ffmpeg + $ENV{FFMPEG_DIR}/libavcodec + $ENV{FFMPEG_DIR}/include/libavcodec + $ENV{FFMPEG_DIR}/include/ffmpeg + /usr/local/include/ffmpeg + /usr/include/ffmpeg + /usr/include/libavcodec + /usr/include/ffmpeg/libavcodec + /usr/local/include/libavcodec +) + +find_path(FFMPEG_INCLUDE_DIR4 swscale.h + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/ffmpeg + $ENV{FFMPEG_DIR}/libswscale + $ENV{FFMPEG_DIR}/include/libswscale + $ENV{FFMPEG_DIR}/include/ffmpeg + /usr/local/include/ffmpeg + /usr/include/ffmpeg + /usr/include/libswscale + /usr/include/ffmpeg/libswscale + /usr/local/include/libswscale +) + +find_path(FFMPEG_INCLUDE_DIR5 avdevice.h + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/ffmpeg + $ENV{FFMPEG_DIR}/libavdevice + $ENV{FFMPEG_DIR}/include/libavdevice + $ENV{FFMPEG_DIR}/include/ffmpeg + /usr/local/include/ffmpeg + /usr/include/ffmpeg + /usr/include/libavdevice + /usr/include/ffmpeg/libavdevice + /usr/local/include/libavdevice +) + +if(FFMPEG_INCLUDE_DIR1) + if(FFMPEG_INCLUDE_DIR2) + if(FFMPEG_INCLUDE_DIR3) + set(FFMPEG_INCLUDE_DIR ${FFMPEG_INCLUDE_DIR1} + ${FFMPEG_INCLUDE_DIR2} + ${FFMPEG_INCLUDE_DIR3}) + endif() + endif() +endif() + +if(FFMPEG_INCLUDE_DIR4) + set(FFMPEG_INCLUDE_DIR ${FFMPEG_INCLUDE_DIR} + ${FFMPEG_INCLUDE_DIR4}) +endif() + +if(FFMPEG_INCLUDE_DIR5) + set(FFMPEG_INCLUDE_DIR ${FFMPEG_INCLUDE_DIR} + ${FFMPEG_INCLUDE_DIR5} + ${FFMPEG_INCLUDE_DIR5}/..) +endif() + +find_library(FFMPEG_avformat_LIBRARY avformat + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/lib + $ENV{FFMPEG_DIR}/libavformat + /usr/local/lib + /usr/lib +) + +find_library(FFMPEG_avcodec_LIBRARY avcodec + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/lib + $ENV{FFMPEG_DIR}/libavcodec + /usr/local/lib + /usr/lib +) + +find_library(FFMPEG_avutil_LIBRARY avutil + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/lib + $ENV{FFMPEG_DIR}/libavutil + /usr/local/lib + /usr/lib +) + +if(NOT DISABLE_SWSCALE) + find_library(FFMPEG_swscale_LIBRARY swscale + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/lib + $ENV{FFMPEG_DIR}/libswscale + /usr/local/lib + /usr/lib + ) +endif(NOT DISABLE_SWSCALE) + +find_library(FFMPEG_avdevice_LIBRARY avdevice + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/lib + $ENV{FFMPEG_DIR}/libavdevice + /usr/local/lib + /usr/lib +) + +find_library(_FFMPEG_z_LIBRARY_ z + $ENV{FFMPEG_DIR} + $ENV{FFMPEG_DIR}/lib + /usr/local/lib + /usr/lib +) + + + +if(FFMPEG_INCLUDE_DIR) + if(FFMPEG_avformat_LIBRARY) + if(FFMPEG_avcodec_LIBRARY) + if(FFMPEG_avutil_LIBRARY) + set(FFMPEG_FOUND "YES") + set(FFMPEG_LIBRARIES ${FFMPEG_avformat_LIBRARY} + ${FFMPEG_avcodec_LIBRARY} + ${FFMPEG_avutil_LIBRARY} + ) + if(FFMPEG_swscale_LIBRARY) + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} + ${FFMPEG_swscale_LIBRARY} + ) + endif() + if(FFMPEG_avdevice_LIBRARY) + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} + ${FFMPEG_avdevice_LIBRARY} + ) + endif() + if(_FFMPEG_z_LIBRARY_) + set( FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} + ${_FFMPEG_z_LIBRARY_} + ) + endif() + endif() + endif() + endif() +endif() + +mark_as_advanced( + FFMPEG_INCLUDE_DIR + FFMPEG_INCLUDE_DIR1 + FFMPEG_INCLUDE_DIR2 + FFMPEG_INCLUDE_DIR3 + FFMPEG_INCLUDE_DIR4 + FFMPEG_INCLUDE_DIR5 + FFMPEG_avformat_LIBRARY + FFMPEG_avcodec_LIBRARY + FFMPEG_avutil_LIBRARY + FFMPEG_swscale_LIBRARY + FFMPEG_avdevice_LIBRARY + _FFMPEG_z_LIBRARY_ + ) + +# Set package properties if FeatureSummary was included +if(COMMAND set_package_properties) + set_package_properties(FFMPEG PROPERTIES DESCRIPTION "A complete, cross-platform solution to record, convert and stream audio and video") + set_package_properties(FFMPEG PROPERTIES URL "http://ffmpeg.org/") +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index e6db967839..f80852bb13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,8 @@ if(WIN32) else() if(LINUX) option(WITH_FFMPEG "Build with FFMPEG." ON) + # Builder beware: later versions of ffmpeg may break! + option(WITH_SYSTEM_FFMPEG "Build with the system's FFMPEG." OFF) option(WITH_TTY "Build with Linux TTY Input Support." OFF) option(WITH_PROFILING "Build with Profiling Support." OFF) option(WITH_GLES2 "Build with OpenGL ES 2.0 Support." ON) @@ -287,36 +289,47 @@ elseif(LINUX) endif() if(WITH_FFMPEG) - list(APPEND FFMPEG_CONFIGURE - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg/configure" - "--disable-programs" - "--disable-doc" - "--disable-avdevice" - "--disable-swresample" - "--disable-postproc" - "--disable-avfilter" - "--disable-shared" - "--enable-static" - ) - if(WITH_GPL_LIBS) + if (WITH_SYSTEM_FFMPEG) + find_package("FFMPEG") + if(NOT FFMPEG_FOUND) + message(FATAL_ERROR "System ffmpeg not found! Either install the libraries or remove the argument, then try again.") + else() + + message(STATUS "-- Warning! Your version of ffmpeg may be too high! If you want to use the system ffmpeg, clear your cmake cache and do not include the system ffmpeg argument.") + set(HAS_FFMPEG TRUE) + endif() + else() list(APPEND FFMPEG_CONFIGURE - "--enable-gpl" + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg/configure" + "--disable-programs" + "--disable-doc" + "--disable-avdevice" + "--disable-swresample" + "--disable-postproc" + "--disable-avfilter" + "--disable-shared" + "--enable-static" ) + if(WITH_GPL_LIBS) + list(APPEND FFMPEG_CONFIGURE + "--enable-gpl" + ) + endif() + # NEVER use the system ffmpeg. Not worth the hassle. + # --shlibdir=$our_installdir/stepmania-$VERSION + externalproject_add("ffmpeg" + DOWNLOAD_DIR "${SM_EXTERN_DIR}/ffmpeg-linux" + PREFIX "${SM_EXTERN_DIR}/ffmpeg-linux" + GIT_REPOSITORY "git://source.ffmpeg.org/ffmpeg.git" + GIT_TAG "n2.1.3" + CONFIGURE_COMMAND ${FFMPEG_CONFIGURE} + BUILD_COMMAND "make" + UPDATE_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) + set(HAS_FFMPEG TRUE) endif() - # NEVER use the system ffmpeg. Not worth the hassle. - # --shlibdir=$our_installdir/stepmania-$VERSION - externalproject_add("ffmpeg" - DOWNLOAD_DIR "${SM_EXTERN_DIR}/ffmpeg-linux" - PREFIX "${SM_EXTERN_DIR}/ffmpeg-linux" - GIT_REPOSITORY "git://source.ffmpeg.org/ffmpeg.git" - GIT_TAG "n2.1.3" - CONFIGURE_COMMAND ${FFMPEG_CONFIGURE} - BUILD_COMMAND "make" - UPDATE_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) - set(HAS_FFMPEG TRUE) else() set(HAS_FFMPEG FALSE) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8aeb6a95e2..c9afa1ab61 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -383,11 +383,25 @@ elseif(APPLE) ) else() # Unix / Linux # TODO: Remember to find and locate the zip archive files. + if (HAS_FFMPEG) + if(WITH_SYSTEM_FFMPEG) + list(APPEND SMDATA_LINK_LIB + "${FFMPEG_avformat_LIBRARY}" + "${FFMPEG_avcodec_LIBRARY}" + "${FFMPEG_swscale_LIBRARY}" + "${FFMPEG_avutil_LIBRARY}" + ) + else() + list(APPEND SMDATA_LINK_LIB + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libavformat/libavformat.a" + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libavcodec/libavcodec.a" + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libswscale/libswscale.a" + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libavutil/libavutil.a" + ) + endif() + endif() + list(APPEND SMDATA_LINK_LIB - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libavformat/libavformat.a" - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libavcodec/libavcodec.a" - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libswscale/libswscale.a" - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build/libavutil/libavutil.a" "${DL_LIBRARY}" ) @@ -476,11 +490,15 @@ if(NOT APPLE) ) else() if (HAS_FFMPEG) - add_dependencies("${SM_EXE_NAME}" "ffmpeg") - list(APPEND SM_INCLUDE_DIRS - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg" - "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build" - ) + if (WITH_SYSTEM_FFMPEG) + list(APPEND SM_INCLUDE_DIRS "${FFMPEG_INCLUDE_DIR}") + else() + add_dependencies("${SM_EXE_NAME}" "ffmpeg") + list(APPEND SM_INCLUDE_DIRS + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg" + "${SM_EXTERN_DIR}/ffmpeg-linux/src/ffmpeg-build" + ) + endif() endif() if (HAS_GTK2) list(APPEND SM_INCLUDE_DIRS "${GTK2_INCLUDE_DIRS}")