diff --git a/.gitignore b/.gitignore index 9e9eef9..62c071d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea/ +.vs/ lib/ bin/ CMakeLists.txt.user diff --git a/CMakeLists.txt b/CMakeLists.txt index dae08a8..e43de80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,8 +6,12 @@ set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -O0 -pthread") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/lib) include_directories(include) link_directories(lib) diff --git a/cmake/modules/FindFFMPEG.cmake b/cmake/modules/FindFFMPEG.cmake index 6214539..94f6fd1 100644 --- a/cmake/modules/FindFFMPEG.cmake +++ b/cmake/modules/FindFFMPEG.cmake @@ -253,6 +253,41 @@ mark_as_advanced( _FFMPEG_z_LIBRARY_ ) +if(WIN32) + set(FFMPEG_WIN "ffmpeg-3.3.3-win64-dev") + set(FFMPEG_WIN_BINARIES "ffmpeg-3.3.3-win64-shared") + if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN}.zip") + file(DOWNLOAD "http://ffmpeg.zeranoe.com/builds/win64/dev/${FFMPEG_WIN}.zip" "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN}.zip") + file(DOWNLOAD "https://ffmpeg.zeranoe.com/builds/win64/shared/${FFMPEG_WIN_BINARIES}.zip" "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}.zip") + endif() + if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN}.zip" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}.zip" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif() + set(FFMPEG_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN}/include") + set(FFMPEG_LIBRARY_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN}/lib") + set(FFMPEG_DLLS_DIR "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin") + set(FFMPEG_LIBRARIES "${FFMPEG_LIBRARY_DIRS}/avcodec.lib" + "${FFMPEG_LIBRARY_DIRS}/avformat.lib" + "${FFMPEG_LIBRARY_DIRS}/avdevice.lib" + "${FFMPEG_LIBRARY_DIRS}/avfilter.lib" + "${FFMPEG_LIBRARY_DIRS}/avutil.lib" + "${FFMPEG_LIBRARY_DIRS}/postproc.lib" + "${FFMPEG_LIBRARY_DIRS}/swresample.lib" + "${FFMPEG_LIBRARY_DIRS}/swscale.lib") + + set(FFMPEG_AVCODEC_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/avcodec-57.dll") + set(FFMPEG_AVFORMAT_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/avformat-57.dll") + set(FFMPEG_AVDEVICE_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/avdevice-57.dll") + set(FFMPEG_AVFILTER_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/avfilter-6.dll") + set(FFMPEG_AVUTIL_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/avutil-55.dll") + set(FFMPEG_POSTPROC_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/postproc-54.dll") + set(FFMPEG_SWRESAMPLE_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/swresample-2.dll") + set(FFMPEG_SWSCALE_DLL "${CMAKE_CURRENT_BINARY_DIR}/${FFMPEG_WIN_BINARIES}/bin/swscale-4.dll") + + set(FFMPEG_FOUND "YES") +endif() + # 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") diff --git a/cmake/modules/FindSDL2.cmake b/cmake/modules/FindSDL2.cmake index 8e0858d..5390bfe 100644 --- a/cmake/modules/FindSDL2.cmake +++ b/cmake/modules/FindSDL2.cmake @@ -158,6 +158,21 @@ IF(SDL2_LIBRARY_TEMP) SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") ENDIF(SDL2_LIBRARY_TEMP) +if(WIN32) + set(SDL2_WIN "SDL2-2.0.5") + if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}.zip") + file(DOWNLOAD "http://www.libsdl.org/release/SDL2-devel-2.0.5-VC.zip" "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}.zip") + endif() + if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}.zip" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif() + set(SDL2_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}/include") + set(SDL2_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}/lib/x64/SDL2.lib" + "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}/lib/x64/SDL2main.lib") + set(SDL2_DLL "${CMAKE_CURRENT_BINARY_DIR}/${SDL2_WIN}/lib/x64/SDL2.dll") + set(SDL2_FOUND YES) +endif() + INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6038e81..0ababc5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -19,11 +19,28 @@ add_dependencies(ffPreview ffcpp) target_link_libraries(ffPreview ffcpp) project(ffPlayer) + +find_package(FFMPEG REQUIRED) +if(NOT FFMPEG_FOUND) + message(FATAL_ERROR "FFMpeg not found") +endif() +include_directories(${FFMPEG_INCLUDE_DIR}) + find_package(SDL2 REQUIRED) if(NOT SDL2_FOUND) message(FATAL_ERROR "SDL2 not found") endif() include_directories(${SDL2_INCLUDE_DIR}) + add_executable(ffPlayer ffPlayer.cpp) add_dependencies(ffPlayer ffcpp) -target_link_libraries(ffPlayer ffcpp ${SDL2_LIBRARY}) \ No newline at end of file +target_link_libraries(ffPlayer ffcpp ${SDL2_LIBRARY}) + +if(WIN32) + add_custom_command(TARGET ffPlayer POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_AVFORMAT_DLL} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + add_custom_command(TARGET ffPlayer POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_AVCODEC_DLL} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + add_custom_command(TARGET ffPlayer POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_AVUTIL_DLL} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + add_custom_command(TARGET ffPlayer POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_SWSCALE_DLL} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + add_custom_command(TARGET ffPlayer POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FFMPEG_SWRESAMPLE_DLL} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + add_custom_command(TARGET ffPlayer POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_DLL} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) +endif() \ No newline at end of file diff --git a/include/ffcpp/MediaFile.h b/include/ffcpp/MediaFile.h index 33e0266..e9b2e06 100644 --- a/include/ffcpp/MediaFile.h +++ b/include/ffcpp/MediaFile.h @@ -11,7 +11,10 @@ extern "C" { #include #include -#include + +#ifndef _MSC_VER + #include +#endif namespace ffcpp { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 728e8a1..a04caa8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ project(ffcpp) find_package(FFMPEG REQUIRED) # FIXME: FFMPEG_INCLUDE_DIR is incorrect and causes errors # http://stackoverflow.com/questions/35982639/ctime-std-namespace-conflict -#include_directories(${FFMPEG_INCLUDE_DIR}) +include_directories(${FFMPEG_INCLUDE_DIR}) link_directories(${FFMPEG_LIBRARY_DIRS}) if(NOT FFMPEG_FOUND)