From d432420a324843b47a04bd181efa88d56544d98c Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Sat, 1 Dec 2012 20:53:28 +0100
Subject: [PATCH] fix FindFFmpeg.cmake

---
 CMakeLists.txt                         |   5 +-
 apps/openmw/mwsound/ffmpeg_decoder.hpp |   4 +-
 cmake/FindFFMPEG.cmake                 | 105 ------------------
 cmake/FindFFmpeg.cmake                 | 148 +++++++++++++++++++++++++
 4 files changed, 153 insertions(+), 109 deletions(-)
 delete mode 100644 cmake/FindFFMPEG.cmake
 create mode 100644 cmake/FindFFmpeg.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 78388e20f..fcb5e9bbe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -140,8 +140,9 @@ set(SOUND_INPUT_INCLUDES "")
 set(SOUND_INPUT_LIBRARY "")
 set(SOUND_DEFINE "")
 if (USE_FFMPEG)
-    find_package(FFMPEG REQUIRED)
-    set(SOUND_INPUT_INCLUDES ${SOUND_INPUT_INCLUDES} ${FFMPEG_INCLUDE_DIR})
+    set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE)
+    find_package(FFmpeg REQUIRED)
+    set(SOUND_INPUT_INCLUDES ${SOUND_INPUT_INCLUDES} ${FFMPEG_INCLUDE_DIRS})
     set(SOUND_INPUT_LIBRARY ${SOUND_INPUT_LIBRARY} ${FFMPEG_LIBRARIES})
     set(SOUND_DEFINE ${SOUND_DEFINE} -DOPENMW_USE_FFMPEG)
 endif (USE_FFMPEG)
diff --git a/apps/openmw/mwsound/ffmpeg_decoder.hpp b/apps/openmw/mwsound/ffmpeg_decoder.hpp
index 7b028e1d0..a6e80fc9b 100644
--- a/apps/openmw/mwsound/ffmpeg_decoder.hpp
+++ b/apps/openmw/mwsound/ffmpeg_decoder.hpp
@@ -10,8 +10,8 @@
 #include <stdint.h>
 extern "C"
 {
-#include <avcodec.h>
-#include <avformat.h>
+#include <libavcodec/avcodec.h>
+#include <libavformat/avformat.h>
 }
 
 #include "sound_decoder.hpp"
diff --git a/cmake/FindFFMPEG.cmake b/cmake/FindFFMPEG.cmake
deleted file mode 100644
index 2e755d047..000000000
--- a/cmake/FindFFMPEG.cmake
+++ /dev/null
@@ -1,105 +0,0 @@
-# Find the FFmpeg library
-#
-# Sets
-#   FFMPEG_FOUND.  If false, don't try to use ffmpeg
-#   FFMPEG_INCLUDE_DIR
-#   FFMPEG_LIBRARIES
-#
-# Modified by Nicolay Korslund for OpenMW
-
-SET( FFMPEG_FOUND "NO" )
-
-FIND_PATH( FFMPEG_general_INCLUDE_DIR libavcodec/avcodec.h libavformat/avformat.h
-  HINTS
-  PATHS
-  /usr/include
-  /usr/local/include
-  /usr/include/ffmpeg
-  /usr/local/include/ffmpeg
-  /usr/include/ffmpeg/libavcodec
-  /usr/local/include/ffmpeg/libavcodec
-  /usr/include/libavcodec
-  /usr/local/include/libavcodec
-  )
-
-FIND_PATH( FFMPEG_avcodec_INCLUDE_DIR avcodec.h
-  HINTS
-  PATHS
-  ${FFMPEG_general_INCLUDE_DIR}/libavcodec
-  /usr/include
-  /usr/local/include
-  /usr/include/ffmpeg
-  /usr/local/include/ffmpeg
-  /usr/include/ffmpeg/libavcodec
-  /usr/local/include/ffmpeg/libavcodec
-  /usr/include/libavcodec
-  /usr/local/include/libavcodec
-)
-
-FIND_PATH( FFMPEG_avformat_INCLUDE_DIR avformat.h
-  HINTS
-  PATHS
-  ${FFMPEG_general_INCLUDE_DIR}/libavformat
-  /usr/include
-  /usr/local/include
-  /usr/include/ffmpeg
-  /usr/local/include/ffmpeg
-  /usr/include/ffmpeg/libavformat
-  /usr/local/include/ffmpeg/libavformat
-  /usr/include/libavformat
-  /usr/local/include/libavformat
-)
-
-set(FFMPEG_INCLUDE_DIR ${FFMPEG_general_INCLUDE_DIR} ${FFMPEG_avcodec_INCLUDE_DIR} ${FFMPEG_avformat_INCLUDE_DIR})
-
-IF( FFMPEG_INCLUDE_DIR )
-
-FIND_PROGRAM( FFMPEG_CONFIG ffmpeg-config
-  /usr/bin
-  /usr/local/bin
-  ${HOME}/bin
-)
-
-IF( FFMPEG_CONFIG )
-  EXEC_PROGRAM( ${FFMPEG_CONFIG} ARGS "--libs avformat" OUTPUT_VARIABLE FFMPEG_LIBS )
-  SET( FFMPEG_FOUND "YES" )
-  SET( FFMPEG_LIBRARIES "${FFMPEG_LIBS}" )
-  
-ELSE( FFMPEG_CONFIG )
-
-  FIND_LIBRARY( FFMPEG_avcodec_LIBRARY avcodec
-    /usr/lib
-    /usr/local/lib
-    /usr/lib64
-    /usr/local/lib64
-  )
-
-  FIND_LIBRARY( FFMPEG_avformat_LIBRARY avformat
-    /usr/lib
-    /usr/local/lib
-    /usr/lib64
-    /usr/local/lib64
-  )
-  
-  FIND_LIBRARY( FFMPEG_avutil_LIBRARY avutil
-    /usr/lib
-    /usr/local/lib
-    /usr/lib64
-    /usr/local/lib64
-  )
-  
-  IF( FFMPEG_avcodec_LIBRARY )
-  IF( FFMPEG_avformat_LIBRARY )
-
-    SET( FFMPEG_FOUND "YES" )
-    SET( FFMPEG_LIBRARIES ${FFMPEG_avformat_LIBRARY} ${FFMPEG_avcodec_LIBRARY} )
-    IF( FFMPEG_avutil_LIBRARY )
-       SET( FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${FFMPEG_avutil_LIBRARY} )
-    ENDIF( FFMPEG_avutil_LIBRARY )
-
-  ENDIF( FFMPEG_avformat_LIBRARY )
-  ENDIF( FFMPEG_avcodec_LIBRARY )
-
-ENDIF( FFMPEG_CONFIG )
-
-ENDIF( FFMPEG_INCLUDE_DIR )
diff --git a/cmake/FindFFmpeg.cmake b/cmake/FindFFmpeg.cmake
new file mode 100644
index 000000000..526be5f1b
--- /dev/null
+++ b/cmake/FindFFmpeg.cmake
@@ -0,0 +1,148 @@
+# vim: ts=2 sw=2
+# - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC)
+#
+# Once done this will define
+#  FFMPEG_FOUND         - System has the all required components.
+#  FFMPEG_INCLUDE_DIRS  - Include directory necessary for using the required components headers.
+#  FFMPEG_LIBRARIES     - Link these to use the required ffmpeg components.
+#  FFMPEG_DEFINITIONS   - Compiler switches required for using the required ffmpeg components.
+#
+# For each of the components it will additionaly set.
+#   - AVCODEC
+#   - AVDEVICE
+#   - AVFORMAT
+#   - AVUTIL
+#   - POSTPROCESS
+#   - SWSCALE
+# the following variables will be defined
+#  <component>_FOUND        - System has <component>
+#  <component>_INCLUDE_DIRS - Include directory necessary for using the <component> headers
+#  <component>_LIBRARIES    - Link these to use <component>
+#  <component>_DEFINITIONS  - Compiler switches required for using <component>
+#  <component>_VERSION      - The components version
+#
+# Copyright (c) 2006, Matthias Kretz, <kretz@kde.org>
+# Copyright (c) 2008, Alexander Neundorf, <neundorf@kde.org>
+# Copyright (c) 2011, Michael Jansen, <kde@michael-jansen.biz>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+include(FindPackageHandleStandardArgs)
+
+# The default components were taken from a survey over other FindFFMPEG.cmake files
+if (NOT FFmpeg_FIND_COMPONENTS)
+  set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL)
+endif ()
+
+#
+### Macro: set_component_found
+#
+# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present.
+#
+macro(set_component_found _component )
+  if (${_component}_LIBRARIES AND ${_component}_INCLUDE_DIRS)
+    # message(STATUS "  - ${_component} found.")
+    set(${_component}_FOUND TRUE)
+  else ()
+    # message(STATUS "  - ${_component} not found.")
+  endif ()
+endmacro()
+
+#
+### Macro: find_component
+#
+# Checks for the given component by invoking pkgconfig and then looking up the libraries and
+# include directories.
+#
+macro(find_component _component _pkgconfig _library _header)
+
+  if (NOT WIN32)
+     # use pkg-config to get the directories and then use these values
+     # in the FIND_PATH() and FIND_LIBRARY() calls
+     find_package(PkgConfig)
+     if (PKG_CONFIG_FOUND)
+       pkg_check_modules(PC_${_component} ${_pkgconfig})
+     endif ()
+  endif (NOT WIN32)
+
+  find_path(${_component}_INCLUDE_DIRS ${_header}
+    HINTS
+      ${PC_LIB${_component}_INCLUDEDIR}
+      ${PC_LIB${_component}_INCLUDE_DIRS}
+    PATH_SUFFIXES
+      ffmpeg
+  )
+
+  find_library(${_component}_LIBRARIES NAMES ${_library}
+      HINTS
+      ${PC_LIB${_component}_LIBDIR}
+      ${PC_LIB${_component}_LIBRARY_DIRS}
+  )
+
+  set(${_component}_DEFINITIONS  ${PC_${_component}_CFLAGS_OTHER} CACHE STRING "The ${_component} CFLAGS.")
+  set(${_component}_VERSION      ${PC_${_component}_VERSION}      CACHE STRING "The ${_component} version number.")
+
+  set_component_found(${_component})
+
+  mark_as_advanced(
+    ${_component}_INCLUDE_DIRS
+    ${_component}_LIBRARIES
+    ${_component}_DEFINITIONS
+    ${_component}_VERSION)
+
+endmacro()
+
+
+# Check for cached results. If there are skip the costly part.
+if (NOT FFMPEG_LIBRARIES)
+
+  # Check for all possible component.
+  find_component(AVCODEC  libavcodec  avcodec  libavcodec/avcodec.h)
+  find_component(AVFORMAT libavformat avformat libavformat/avformat.h)
+  find_component(AVDEVICE libavdevice avdevice libavdevice/avdevice.h)
+  find_component(AVUTIL   libavutil   avutil   libavutil/avutil.h)
+  find_component(SWSCALE  libswscale  swscale  libswscale/swscale.h)
+  find_component(POSTPROC libpostproc postproc libpostproc/postprocess.h)
+
+  # Check if the required components were found and add their stuff to the FFMPEG_* vars.
+  foreach (_component ${FFmpeg_FIND_COMPONENTS})
+    if (${_component}_FOUND)
+      # message(STATUS "Required component ${_component} present.")
+      set(FFMPEG_LIBRARIES   ${FFMPEG_LIBRARIES}   ${${_component}_LIBRARIES})
+      set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} ${${_component}_DEFINITIONS})
+      list(APPEND FFMPEG_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS})
+    else ()
+      # message(STATUS "Required component ${_component} missing.")
+    endif ()
+  endforeach ()
+
+  # Build the include path with duplicates removed.
+  if (FFMPEG_INCLUDE_DIRS)
+    list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS)
+  endif ()
+
+  # cache the vars.
+  set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "The FFmpeg include directories." FORCE)
+  set(FFMPEG_LIBRARIES    ${FFMPEG_LIBRARIES}    CACHE STRING "The FFmpeg libraries." FORCE)
+  set(FFMPEG_DEFINITIONS  ${FFMPEG_DEFINITIONS}  CACHE STRING "The FFmpeg cflags." FORCE)
+
+  mark_as_advanced(FFMPEG_INCLUDE_DIRS
+                   FFMPEG_LIBRARIES
+                   FFMPEG_DEFINITIONS)
+
+endif ()
+
+# Now set the noncached _FOUND vars for the components.
+foreach (_component AVCODEC AVDEVICE AVFORMAT AVUTIL POSTPROCESS SWSCALE)
+  set_component_found(${_component})
+endforeach ()
+
+# Compile the list of required vars
+set(_FFmpeg_REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_INCLUDE_DIRS)
+foreach (_component ${FFmpeg_FIND_COMPONENTS})
+  list(APPEND _FFmpeg_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS)
+endforeach ()
+
+# Give a nice error message if some of the required vars are missing.
+find_package_handle_standard_args(FFmpeg DEFAULT_MSG ${_FFmpeg_REQUIRED_VARS})