# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindMPEG2
---------

Finds the native MPEG2 library (libmpeg2).

.. note::

  Depending on how the native libmpeg2 library is built and installed, it may
  depend on the SDL (Simple DirectMedia Layer) library.  If SDL is found, this
  module includes it in its usage requirements when used.

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``MPEG2_FOUND``
  Boolean indicating whether the libmpeg2 library is found.
``MPEG2_LIBRARIES``
  Libraries needed to link against to use libmpeg2.

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may be also set:

``MPEG2_INCLUDE_DIR``
  The directory containing the ``mpeg2.h`` and related headers needed to use
  libmpeg2 library.
``MPEG2_mpeg2_LIBRARY``
  The path to the libmpeg2 library.
``MPEG2_vo_LIBRARY``
  The path to the vo (Video Out) library.

Examples
^^^^^^^^

Finding libmpeg2 library and creating an imported interface target for linking
it to a project target:

.. code-block:: cmake

  find_package(MPEG2)

  if(MPEG2_FOUND AND NOT TARGET MPEG2::MPEG2)
    add_library(MPEG2::MPEG2 INTERFACE IMPORTED)
    set_target_properties(
      MPEG2::MPEG2
      PROPERTIES
        INTERFACE_LINK_LIBRARIES "${MPEG2_LIBRARIES}"
        INTERFACE_INCLUDE_DIRECTORIES "${MPEG2_INCLUDE_DIR}"
    )
  endif()

  target_link_libraries(project_target PRIVATE MPEG2::MPEG2)
#]=======================================================================]

find_path(MPEG2_INCLUDE_DIR
  NAMES mpeg2.h mpeg2dec/mpeg2.h)

find_library(MPEG2_mpeg2_LIBRARY mpeg2)

find_library(MPEG2_vo_LIBRARY vo)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MPEG2 DEFAULT_MSG MPEG2_mpeg2_LIBRARY MPEG2_INCLUDE_DIR)

if(MPEG2_FOUND)
  set(MPEG2_LIBRARIES ${MPEG2_mpeg2_LIBRARY})
  if(MPEG2_vo_LIBRARY)
    list(APPEND MPEG2_LIBRARIES ${MPEG2_vo_LIBRARY})
  endif()

  # Some native mpeg2 installations will depend on libSDL. If found, add it in.
  find_package(SDL)
  if(SDL_FOUND)
    set( MPEG2_LIBRARIES ${MPEG2_LIBRARIES} ${SDL_LIBRARY})
  endif()
endif()

mark_as_advanced(MPEG2_INCLUDE_DIR MPEG2_mpeg2_LIBRARY MPEG2_vo_LIBRARY)
