diff --git a/QtScrcpy/CMakeLists.txt b/QtScrcpy/CMakeLists.txt index 0252e33..71e6eb0 100755 --- a/QtScrcpy/CMakeLists.txt +++ b/QtScrcpy/CMakeLists.txt @@ -29,7 +29,7 @@ endif() message(STATUS "[${PROJECT_NAME}] CPU_ARCH:${QC_CPU_ARCH}") # CMake set -#set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -92,84 +92,6 @@ message(STATUS "[${PROJECT_NAME}] Qt version is: ${QT_VERSION_MAJOR}.${QT_VERSIO # Sources # -# adb -set(QC_ADB_SOURCES - QtScrcpyCore/src/adb/adbprocessimpl.h - QtScrcpyCore/src/adb/adbprocessimpl.cpp - QtScrcpyCore/src/adb/adbprocess.cpp -) -source_group(QtScrcpyCore/src/adb FILES ${QC_ADB_SOURCES}) - -# common -set(QC_COMMON_SOURCES - QtScrcpyCore/src/common/qscrcpyevent.h -) -source_group(QtScrcpyCore/src/common FILES ${QC_COMMON_SOURCES}) - -# include -set(QC_INCLUDE_SOURCES - QtScrcpyCore/include/QtScrcpyCore.h - QtScrcpyCore/include/QtScrcpyCoreDef.h - QtScrcpyCore/include/adbprocess.h -) -source_group(QtScrcpyCore/include FILES ${QC_INCLUDE_SOURCES}) - -# device -set(QC_DEVICE_SOURCES - QtScrcpyCore/src/device/device.h - QtScrcpyCore/src/device/device.cpp - QtScrcpyCore/src/device/android/input.h - QtScrcpyCore/src/device/android/keycodes.h - QtScrcpyCore/src/device/controller/controller.h - QtScrcpyCore/src/device/controller/controller.cpp - QtScrcpyCore/src/device/controller/bufferutil.h - QtScrcpyCore/src/device/controller/bufferutil.cpp - QtScrcpyCore/src/device/controller/inputconvert/inputconvertbase.h - QtScrcpyCore/src/device/controller/inputconvert/inputconvertbase.cpp - QtScrcpyCore/src/device/controller/inputconvert/inputconvertnormal.h - QtScrcpyCore/src/device/controller/inputconvert/inputconvertnormal.cpp - QtScrcpyCore/src/device/controller/inputconvert/inputconvertgame.h - QtScrcpyCore/src/device/controller/inputconvert/inputconvertgame.cpp - QtScrcpyCore/src/device/controller/inputconvert/controlmsg.h - QtScrcpyCore/src/device/controller/inputconvert/controlmsg.cpp - QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.h - QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.cpp - QtScrcpyCore/src/device/controller/receiver/devicemsg.h - QtScrcpyCore/src/device/controller/receiver/devicemsg.cpp - QtScrcpyCore/src/device/controller/receiver/receiver.h - QtScrcpyCore/src/device/controller/receiver/receiver.cpp - QtScrcpyCore/src/device/decoder/avframeconvert.h - QtScrcpyCore/src/device/decoder/avframeconvert.cpp - QtScrcpyCore/src/device/decoder/decoder.h - QtScrcpyCore/src/device/decoder/decoder.cpp - QtScrcpyCore/src/device/decoder/fpscounter.h - QtScrcpyCore/src/device/decoder/fpscounter.cpp - QtScrcpyCore/src/device/decoder/videobuffer.h - QtScrcpyCore/src/device/decoder/videobuffer.cpp - QtScrcpyCore/src/device/filehandler/filehandler.h - QtScrcpyCore/src/device/filehandler/filehandler.cpp - QtScrcpyCore/src/device/recorder/recorder.h - QtScrcpyCore/src/device/recorder/recorder.cpp - QtScrcpyCore/src/device/render/qyuvopenglwidget.h - QtScrcpyCore/src/device/render/qyuvopenglwidget.cpp - QtScrcpyCore/src/device/server/server.h - QtScrcpyCore/src/device/server/server.cpp - QtScrcpyCore/src/device/server/tcpserver.h - QtScrcpyCore/src/device/server/tcpserver.cpp - QtScrcpyCore/src/device/server/videosocket.h - QtScrcpyCore/src/device/server/videosocket.cpp - QtScrcpyCore/src/device/stream/stream.h - QtScrcpyCore/src/device/stream/stream.cpp -) -source_group(QtScrcpyCore/src/device FILES ${QC_DEVICE_SOURCES}) - -# devicemanage -set(QC_DEVICEMANAGE_SOURCES - QtScrcpyCore/src/devicemanage/devicemanage.h - QtScrcpyCore/src/devicemanage/devicemanage.cpp -) -source_group(QtScrcpyCore/src/devicemanage FILES ${QC_DEVICEMANAGE_SOURCES}) - # fontawesome set(QC_FONTAWESOME_SOURCES fontawesome/iconhelper.h @@ -197,12 +119,13 @@ set(QC_UI_SOURCES ui/dialog.cpp ui/dialog.h ui/dialog.ui + render/qyuvopenglwidget.h + render/qyuvopenglwidget.cpp ) source_group(ui FILES ${QC_UI_SOURCES}) # util set(QC_UTIL_SOURCES - util/compat.h util/config.h util/config.cpp util/mousetap/mousetap.h @@ -268,11 +191,6 @@ qt5_add_translation(QC_QM_FILES ${QC_TS_FILES}) # all sources set(QC_PROJECT_SOURCES - ${QC_INCLUDE_SOURCES} - ${QC_ADB_SOURCES} - ${QC_COMMON_SOURCES} - ${QC_DEVICE_SOURCES} - ${QC_DEVICEMANAGE_SOURCES} ${QC_FONTAWESOME_SOURCES} ${QC_UIBASE_SOURCES} ${QC_UI_SOURCES} @@ -295,37 +213,11 @@ add_executable(${PROJECT_NAME} ${QC_RUNTIME_TYPE} ${QC_PROJECT_SOURCES}) # Internal include path (todo: remove this, use absolute path include) # -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/include) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/adb) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/common) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/filehandler) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/android) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/decoder) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/controller) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/controller/receiver) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/controller/inputconvert) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/controller/inputconvert/keymap) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/server) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/stream) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/render) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/ui) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/device/recorder) -target_include_directories(${PROJECT_NAME} PRIVATE QtScrcpyCore/src/devicemanage) target_include_directories(${PROJECT_NAME} PRIVATE fontawesome) target_include_directories(${PROJECT_NAME} PRIVATE util) target_include_directories(${PROJECT_NAME} PRIVATE uibase) target_include_directories(${PROJECT_NAME} PRIVATE ui) - -# -# common deps -# - -# Qt -target_link_libraries(${PROJECT_NAME} PRIVATE - Qt${QT_VERSION_MAJOR}::Widgets - Qt${QT_VERSION_MAJOR}::Network -) +target_include_directories(${PROJECT_NAME} PRIVATE render) # output dir # https://cmake.org/cmake/help/latest/prop_gbl/GENERATOR_IS_MULTI_CONFIG.html @@ -346,58 +238,19 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # windows if(CMAKE_SYSTEM_NAME STREQUAL "Windows") - # ffmpeg - # include - target_include_directories(${PROJECT_NAME} PRIVATE ../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/include) - # link - set(FFMPEG_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib/${QC_CPU_ARCH}") - target_link_directories(${PROJECT_NAME} PRIVATE ${FFMPEG_LIB_PATH}) - target_link_libraries(${PROJECT_NAME} PRIVATE - avformat - avcodec - avutil - swscale - ) - # copy - set(FFMPEG_BIN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/bin/${QC_CPU_ARCH}") - get_target_property(FFMPEG_BIN_OUTPUT_PATH ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY) - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/avcodec-58.dll" "${FFMPEG_BIN_OUTPUT_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/avformat-58.dll" "${FFMPEG_BIN_OUTPUT_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/avutil-56.dll" "${FFMPEG_BIN_OUTPUT_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/swscale-5.dll" "${FFMPEG_BIN_OUTPUT_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/swresample-3.dll" "${FFMPEG_BIN_OUTPUT_PATH}" - ) + get_target_property(QSC_BIN_OUTPUT_PATH ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY) + set(QSC_DEPLOY_PATH ${QSC_BIN_OUTPUT_PATH}) endif() # MacOS if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - # ffmpeg - # include - target_include_directories(${PROJECT_NAME} PRIVATE ../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/include) - # link - set(FFMPEG_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib") - target_link_directories(${PROJECT_NAME} PRIVATE ${FFMPEG_LIB_PATH}) - target_link_libraries(${PROJECT_NAME} PRIVATE - avformat.58 - avcodec.58 - avutil.56 - swscale.5 - ) - # copy bundle file get_target_property(MACOS_BUNDLE_PATH ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY) - set(MACOS_BUNDLE_PATH ${MACOS_BUNDLE_PATH}/${PROJECT_NAME}.app/Contents) - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - # dylib,scrcpy-server,adb copy to Contents/MacOS - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib/libavcodec.58.dylib" "${MACOS_BUNDLE_PATH}/MacOS" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib/libavformat.58.dylib" "${MACOS_BUNDLE_PATH}/MacOS" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib/libavutil.56.dylib" "${MACOS_BUNDLE_PATH}/MacOS" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib/libswscale.5.dylib" "${MACOS_BUNDLE_PATH}/MacOS" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib/libswresample.3.dylib" "${MACOS_BUNDLE_PATH}/MacOS" + set(MACOS_BUNDLE_PATH ${MACOS_BUNDLE_PATH}/${QSC_PROJECT_NAME}.app/Contents) - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/scrcpy-server" "${MACOS_BUNDLE_PATH}/MacOS" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/adb/mac/adb" "${MACOS_BUNDLE_PATH}/MacOS" + set(QSC_DEPLOY_PATH ${MACOS_BUNDLE_PATH}) + + add_custom_command(TARGET ${QSC_PROJECT_NAME} POST_BUILD # config file copy to Contents/MacOS/config COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../config/config.ini" "${MACOS_BUNDLE_PATH}/MacOS/config" ) @@ -426,27 +279,19 @@ endif() # Linux if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads REQUIRED) - - # include - target_include_directories(${PROJECT_NAME} PRIVATE ../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/include) - # link - set(FFMPEG_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../QtScrcpy/QtScrcpyCore/src/third_party/ffmpeg/lib") - target_link_directories(${PROJECT_NAME} PRIVATE ${FFMPEG_LIB_PATH}) - target_link_libraries(${PROJECT_NAME} PRIVATE - # ffmpeg - avformat - avcodec - avutil - swscale - # qx11 - Qt${QT_VERSION_MAJOR}::X11Extras - # xcb https://doc.qt.io/qt-5/linux-requirements.html - xcb - # pthread - Threads::Threads - ) - + set(QSC_DEPLOY_PATH "") # linux set app icon: https://blog.csdn.net/MrNoboday/article/details/82870853 endif() + +# +# common deps +# + +add_subdirectory(QtScrcpyCore) + +# Qt +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Network + QtScrcpyCore +) diff --git a/QtScrcpy/QtScrcpyCore/CMakeLists.txt b/QtScrcpy/QtScrcpyCore/CMakeLists.txt new file mode 100644 index 0000000..e183007 --- /dev/null +++ b/QtScrcpy/QtScrcpyCore/CMakeLists.txt @@ -0,0 +1,219 @@ +set(QSC_PROJECT_NAME "QtScrcpyCore") + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network REQUIRED) + +# check arch +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(QSC_CPU_ARCH x64) +else() + set(QSC_CPU_ARCH x86) +endif() +message(STATUS "[${PROJECT_NAME}] QSC_CPU_ARCH:${QSC_CPU_ARCH}") + +if(NOT DEFINED QSC_DEPLOY_PATH) + message(FATAL_ERROR "QtScrcpyCore need QSC_DEPLOY_PATH") +endif() + +# +# Sources +# + +# adb +set(QSC_ADB_SOURCES + src/adb/adbprocessimpl.h + src/adb/adbprocessimpl.cpp + src/adb/adbprocess.cpp +) +source_group(src/adb FILES ${QSC_ADB_SOURCES}) + +# common +set(QSC_COMMON_SOURCES + src/common/qscrcpyevent.h +) +source_group(src/common FILES ${QSC_COMMON_SOURCES}) + +# include +set(QSC_INCLUDE_SOURCES + include/QtScrcpyCore.h + include/QtScrcpyCoreDef.h + include/adbprocess.h +) +source_group(include FILES ${QSC_INCLUDE_SOURCES}) + +# device +set(QSC_DEVICE_SOURCES + src/device/device.h + src/device/device.cpp + src/device/compat.h + src/device/android/input.h + src/device/android/keycodes.h + src/device/controller/controller.h + src/device/controller/controller.cpp + src/device/controller/bufferutil.h + src/device/controller/bufferutil.cpp + src/device/controller/inputconvert/inputconvertbase.h + src/device/controller/inputconvert/inputconvertbase.cpp + src/device/controller/inputconvert/inputconvertnormal.h + src/device/controller/inputconvert/inputconvertnormal.cpp + src/device/controller/inputconvert/inputconvertgame.h + src/device/controller/inputconvert/inputconvertgame.cpp + src/device/controller/inputconvert/controlmsg.h + src/device/controller/inputconvert/controlmsg.cpp + src/device/controller/inputconvert/keymap/keymap.h + src/device/controller/inputconvert/keymap/keymap.cpp + src/device/controller/receiver/devicemsg.h + src/device/controller/receiver/devicemsg.cpp + src/device/controller/receiver/receiver.h + src/device/controller/receiver/receiver.cpp + src/device/decoder/avframeconvert.h + src/device/decoder/avframeconvert.cpp + src/device/decoder/decoder.h + src/device/decoder/decoder.cpp + src/device/decoder/fpscounter.h + src/device/decoder/fpscounter.cpp + src/device/decoder/videobuffer.h + src/device/decoder/videobuffer.cpp + src/device/filehandler/filehandler.h + src/device/filehandler/filehandler.cpp + src/device/recorder/recorder.h + src/device/recorder/recorder.cpp + src/device/server/server.h + src/device/server/server.cpp + src/device/server/tcpserver.h + src/device/server/tcpserver.cpp + src/device/server/videosocket.h + src/device/server/videosocket.cpp + src/device/stream/stream.h + src/device/stream/stream.cpp +) +source_group(src/device FILES ${QSC_DEVICE_SOURCES}) + +# devicemanage +set(QSC_DEVICEMANAGE_SOURCES + src/devicemanage/devicemanage.h + src/devicemanage/devicemanage.cpp +) +source_group(src/devicemanage FILES ${QSC_DEVICEMANAGE_SOURCES}) + +add_library(QtScrcpyCore STATIC + ${QSC_ADB_SOURCES} + ${QSC_COMMON_SOURCES} + ${QSC_INCLUDE_SOURCES} + ${QSC_DEVICE_SOURCES} + ${QSC_DEVICEMANAGE_SOURCES} +) + +target_link_libraries(QtScrcpyCore PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Network +) + +target_include_directories(${QSC_PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/adb) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/common) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/filehandler) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/android) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/decoder) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/controller) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/controller/receiver) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/controller/inputconvert) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/controller/inputconvert/keymap) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/server) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/stream) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/ui) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/device/recorder) +target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/devicemanage) + + +# +# plantform deps +# + +# windows +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + # ffmpeg + # include + target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/include) + # link + set(FFMPEG_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib/${QSC_CPU_ARCH}") + target_link_directories(${QSC_PROJECT_NAME} PUBLIC ${FFMPEG_LIB_PATH}) + target_link_libraries(${QSC_PROJECT_NAME} PRIVATE + avformat + avcodec + avutil + swscale + ) + # copy + set(FFMPEG_BIN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/bin/${QSC_CPU_ARCH}") + add_custom_command(TARGET ${QSC_PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/avcodec-58.dll" "${QSC_DEPLOY_PATH}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/avformat-58.dll" "${QSC_DEPLOY_PATH}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/avutil-56.dll" "${QSC_DEPLOY_PATH}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/swscale-5.dll" "${QSC_DEPLOY_PATH}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FFMPEG_BIN_PATH}/swresample-3.dll" "${QSC_DEPLOY_PATH}" + ) +endif() + +# MacOS +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # ffmpeg + # include + target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/include) + # link + set(FFMPEG_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib") + target_link_directories(${QSC_PROJECT_NAME} PUBLIC ${FFMPEG_LIB_PATH}) + target_link_libraries(${QSC_PROJECT_NAME} PRIVATE + avformat.58 + avcodec.58 + avutil.56 + swscale.5 + ) + + # copy bundle file + add_custom_command(TARGET ${QSC_PROJECT_NAME} POST_BUILD + # dylib,scrcpy-server,adb copy to Contents/MacOS + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib/libavcodec.58.dylib" "${QSC_DEPLOY_PATH}/MacOS" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib/libavformat.58.dylib" "${QSC_DEPLOY_PATH}/MacOS" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib/libavutil.56.dylib" "${QSC_DEPLOY_PATH}/MacOS" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib/libswscale.5.dylib" "${QSC_DEPLOY_PATH}/MacOS" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib/libswresample.3.dylib" "${QSC_DEPLOY_PATH}/MacOS" + + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/scrcpy-server" "${QSC_DEPLOY_PATH}/MacOS" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/adb/mac/adb" "${QSC_DEPLOY_PATH}/MacOS" + ) +endif() + +# Linux +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + + # include + target_include_directories(${QSC_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/include) + # link + set(FFMPEG_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_CURRENT_SOURCE_DIR}/src/third_party/ffmpeg/lib") + target_link_directories(${QSC_PROJECT_NAME} PUBLIC ${FFMPEG_LIB_PATH}) + target_link_libraries(${QSC_PROJECT_NAME} PRIVATE + # ffmpeg + avformat + avcodec + avutil + swscale + # qx11 + Qt${QT_VERSION_MAJOR}::X11Extras + # xcb https://doc.qt.io/qt-5/linux-requirements.html + xcb + # pthread + Threads::Threads + ) + +endif() diff --git a/QtScrcpy/util/compat.h b/QtScrcpy/QtScrcpyCore/src/device/compat.h similarity index 100% rename from QtScrcpy/util/compat.h rename to QtScrcpy/QtScrcpyCore/src/device/compat.h diff --git a/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.cpp b/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.cpp index c33ee01..446096f 100644 --- a/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.cpp +++ b/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.cpp @@ -8,24 +8,10 @@ #include "keymap.h" -QString KeyMap::s_keyMapPath = ""; - KeyMap::KeyMap(QObject *parent) : QObject(parent) {} KeyMap::~KeyMap() {} -const QString &KeyMap::getKeyMapPath() -{ - if (s_keyMapPath.isEmpty()) { - s_keyMapPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_KEYMAP_PATH")); - QFileInfo fileInfo(s_keyMapPath); - if (s_keyMapPath.isEmpty() || !fileInfo.isDir()) { - s_keyMapPath = QCoreApplication::applicationDirPath() + "/keymap"; - } - } - return s_keyMapPath; -} - void KeyMap::loadKeyMap(const QString &json) { QString errorString; diff --git a/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.h b/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.h index 6b88732..87e9633 100644 --- a/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.h +++ b/QtScrcpy/QtScrcpyCore/src/device/controller/inputconvert/keymap/keymap.h @@ -117,8 +117,6 @@ public: bool isValidSteerWheelMap(); const KeyMap::KeyMapNode &getMouseMoveMap(); - static const QString &getKeyMapPath(); - private: // set up the reverse map from key/event event to keyMapNode void makeReverseMap(); diff --git a/QtScrcpy/QtScrcpyCore/src/device/device.cpp b/QtScrcpy/QtScrcpyCore/src/device/device.cpp index 9888e1d..bfcf87c 100644 --- a/QtScrcpy/QtScrcpyCore/src/device/device.cpp +++ b/QtScrcpy/QtScrcpyCore/src/device/device.cpp @@ -10,7 +10,6 @@ #include "recorder.h" #include "server.h" #include "stream.h" -#include "videoform.h" namespace qsc { diff --git a/QtScrcpy/QtScrcpyCore/src/devicemanage/devicemanage.cpp b/QtScrcpy/QtScrcpyCore/src/devicemanage/devicemanage.cpp index 93b1a7c..f4ff444 100644 --- a/QtScrcpy/QtScrcpyCore/src/devicemanage/devicemanage.cpp +++ b/QtScrcpy/QtScrcpyCore/src/devicemanage/devicemanage.cpp @@ -5,8 +5,8 @@ #include "devicemanage.h" #include "server.h" -#include "videoform.h" #include "device.h" +#include "stream.h" namespace qsc { @@ -17,9 +17,13 @@ IDeviceManage& IDeviceManage::getInstance() { return dm; } -DeviceManage::DeviceManage() {} +DeviceManage::DeviceManage() { + Stream::init(); +} -DeviceManage::~DeviceManage() {} +DeviceManage::~DeviceManage() { + Stream::deInit(); +} QPointer DeviceManage::getDevice(const QString &serial) { diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index 06a943d..7471877 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -9,7 +9,6 @@ #include "config.h" #include "dialog.h" #include "mousetap/mousetap.h" -#include "stream.h" static Dialog *g_mainDlg = Q_NULLPTR; static QtMessageHandler g_oldMessageHandler = Q_NULLPTR; @@ -73,7 +72,6 @@ int main(int argc, char *argv[]) QSurfaceFormat::setDefaultFormat(varFormat); g_oldMessageHandler = qInstallMessageHandler(myMessageOutput); - Stream::init(); QApplication a(argc, argv); // windows下通过qmake VERSION变量或者rc设置版本号和应用名称后,这里可以直接拿到 @@ -118,8 +116,6 @@ int main(int argc, char *argv[]) #if defined(Q_OS_WIN32) || defined(Q_OS_OSX) MouseTap::getInstance()->quitMouseEventTap(); #endif - - Stream::deInit(); return ret; } diff --git a/QtScrcpy/QtScrcpyCore/src/device/render/qyuvopenglwidget.cpp b/QtScrcpy/render/qyuvopenglwidget.cpp similarity index 100% rename from QtScrcpy/QtScrcpyCore/src/device/render/qyuvopenglwidget.cpp rename to QtScrcpy/render/qyuvopenglwidget.cpp diff --git a/QtScrcpy/QtScrcpyCore/src/device/render/qyuvopenglwidget.h b/QtScrcpy/render/qyuvopenglwidget.h similarity index 100% rename from QtScrcpy/QtScrcpyCore/src/device/render/qyuvopenglwidget.h rename to QtScrcpy/render/qyuvopenglwidget.h diff --git a/QtScrcpy/ui/dialog.cpp b/QtScrcpy/ui/dialog.cpp index 6649dd6..b780b8c 100644 --- a/QtScrcpy/ui/dialog.cpp +++ b/QtScrcpy/ui/dialog.cpp @@ -6,12 +6,24 @@ #include #include "config.h" -#include "device.h" #include "dialog.h" -#include "keymap.h" #include "ui_dialog.h" #include "videoform.h" +QString s_keyMapPath = ""; + +const QString &getKeyMapPath() +{ + if (s_keyMapPath.isEmpty()) { + s_keyMapPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_KEYMAP_PATH")); + QFileInfo fileInfo(s_keyMapPath); + if (s_keyMapPath.isEmpty() || !fileInfo.isDir()) { + s_keyMapPath = QCoreApplication::applicationDirPath() + "/keymap"; + } + } + return s_keyMapPath; +} + Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); @@ -214,7 +226,7 @@ void Dialog::delayMs(int ms) QString Dialog::getGameScript(const QString &fileName) { - QFile loadFile(KeyMap::getKeyMapPath() + "/" + fileName); + QFile loadFile(getKeyMapPath() + "/" + fileName); if (!loadFile.open(QIODevice::ReadOnly)) { outLog("open file failed:" + fileName, true); return ""; @@ -410,6 +422,7 @@ void Dialog::getIPbyIp() void Dialog::onDeviceConnected(bool success, const QString &serial, const QString &deviceName, const QSize &size) { + Q_UNUSED(deviceName); if (!success) { return; } @@ -506,7 +519,7 @@ void Dialog::on_stopAllServerBtn_clicked() void Dialog::on_refreshGameScriptBtn_clicked() { ui->gameBox->clear(); - QDir dir(KeyMap::getKeyMapPath()); + QDir dir(getKeyMapPath()); if (!dir.exists()) { outLog("keymap directory not find", true); return; diff --git a/QtScrcpy/ui/videoform.cpp b/QtScrcpy/ui/videoform.cpp index f76c93f..11eaf14 100644 --- a/QtScrcpy/ui/videoform.cpp +++ b/QtScrcpy/ui/videoform.cpp @@ -14,17 +14,12 @@ #include #include "config.h" -#include "controller.h" #include "iconhelper.h" #include "qyuvopenglwidget.h" #include "toolform.h" #include "mousetap/mousetap.h" #include "ui_videoform.h" #include "videoform.h" -extern "C" -{ -#include "libavutil/frame.h" -} VideoForm::VideoForm(bool framelessWindow, bool skin, QWidget *parent) : QWidget(parent), ui(new Ui::videoForm), m_skin(skin) { @@ -287,7 +282,6 @@ void VideoForm::installShortcut() emit device->postPower(); }); - // setScreenPowerMode(ControlMsg::SPM_OFF) shortcut = new QShortcut(QKeySequence("Ctrl+o"), this); shortcut->setAutoRepeat(false); connect(shortcut, &QShortcut::activated, this, [this]() { @@ -295,7 +289,7 @@ void VideoForm::installShortcut() if (!device) { return; } - emit device->setScreenPowerMode(ControlMsg::SPM_OFF); + emit device->setScreenPowerMode(false); }); // expandNotificationPanel