JackLee_CN
2 years ago
commit
ab4afbee5e
26 changed files with 17913 additions and 0 deletions
@ -0,0 +1,21 @@
|
||||
{ |
||||
"configurations": [ |
||||
{ |
||||
"name": "Win32", |
||||
"includePath": [ |
||||
"${workspaceFolder}/**" |
||||
], |
||||
"defines": [ |
||||
"_DEBUG", |
||||
"UNICODE", |
||||
"_UNICODE" |
||||
], |
||||
"compilerPath": "D:\\Dev\\Qt\\Tools\\mingw1120_64\\bin\\gcc.exe", |
||||
"cStandard": "gnu17", |
||||
"cppStandard": "gnu++17", |
||||
"intelliSenseMode": "windows-gcc-x64", |
||||
"configurationProvider": "ms-vscode.cmake-tools" |
||||
} |
||||
], |
||||
"version": 4 |
||||
} |
@ -0,0 +1,70 @@
|
||||
{ |
||||
"files.associations": { |
||||
"new": "cpp", |
||||
"array": "cpp", |
||||
"atomic": "cpp", |
||||
"bit": "cpp", |
||||
"*.tcc": "cpp", |
||||
"cctype": "cpp", |
||||
"chrono": "cpp", |
||||
"clocale": "cpp", |
||||
"cmath": "cpp", |
||||
"codecvt": "cpp", |
||||
"compare": "cpp", |
||||
"concepts": "cpp", |
||||
"condition_variable": "cpp", |
||||
"cstdarg": "cpp", |
||||
"cstddef": "cpp", |
||||
"cstdint": "cpp", |
||||
"cstdio": "cpp", |
||||
"cstdlib": "cpp", |
||||
"cstring": "cpp", |
||||
"ctime": "cpp", |
||||
"cwchar": "cpp", |
||||
"cwctype": "cpp", |
||||
"deque": "cpp", |
||||
"list": "cpp", |
||||
"map": "cpp", |
||||
"set": "cpp", |
||||
"string": "cpp", |
||||
"unordered_map": "cpp", |
||||
"unordered_set": "cpp", |
||||
"vector": "cpp", |
||||
"exception": "cpp", |
||||
"algorithm": "cpp", |
||||
"functional": "cpp", |
||||
"iterator": "cpp", |
||||
"memory": "cpp", |
||||
"memory_resource": "cpp", |
||||
"numeric": "cpp", |
||||
"optional": "cpp", |
||||
"random": "cpp", |
||||
"ratio": "cpp", |
||||
"source_location": "cpp", |
||||
"string_view": "cpp", |
||||
"system_error": "cpp", |
||||
"tuple": "cpp", |
||||
"type_traits": "cpp", |
||||
"utility": "cpp", |
||||
"fstream": "cpp", |
||||
"future": "cpp", |
||||
"initializer_list": "cpp", |
||||
"iomanip": "cpp", |
||||
"iosfwd": "cpp", |
||||
"iostream": "cpp", |
||||
"istream": "cpp", |
||||
"limits": "cpp", |
||||
"mutex": "cpp", |
||||
"numbers": "cpp", |
||||
"ostream": "cpp", |
||||
"semaphore": "cpp", |
||||
"sstream": "cpp", |
||||
"stdexcept": "cpp", |
||||
"stop_token": "cpp", |
||||
"streambuf": "cpp", |
||||
"thread": "cpp", |
||||
"cinttypes": "cpp", |
||||
"typeinfo": "cpp", |
||||
"variant": "cpp" |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,99 @@
|
||||
#cmake最低版本 |
||||
cmake_minimum_required(VERSION 3.16) |
||||
|
||||
#项目版本 |
||||
project(ZFFmpeg VERSION 1.0 LANGUAGES CXX) |
||||
|
||||
#设置moc ui rcc编译开关 |
||||
SET(CMAKE_AUTOMOC ON) |
||||
SET(CMAKE_AUTOUIC ON) |
||||
SET(CMAKE_AUTORCC ON) |
||||
|
||||
#设置C++版本 |
||||
set(CMAKE_CXX_STANDARD 17) |
||||
|
||||
#包含所有.h文件 |
||||
SET(CMAKE_INCLUDE_CURRENT_DIR ON) |
||||
|
||||
#release编译下依然输出符号和行号 |
||||
#ADD_DEFINITIONS(-DQT_MESSAGELOGCONTEXT) |
||||
|
||||
#debug和release输出路径 |
||||
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/build/debug) |
||||
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/build/release) |
||||
|
||||
#设置QT .cmake文件路径 |
||||
SET(QT_DIR "D:/Dev/Qt/6.3.1/mingw1120_static_x64/lib/cmake") |
||||
SET(MSYS2 "D:/Dev/msys64/mingw64") |
||||
SET(FFMPEG "D:/Dev/msys64/usr/local/ffmpeg_5_1") |
||||
|
||||
list(APPEND CMAKE_PREFIX_PATH ${QT_DIR} ${MSYS2} ${FFMPEG}) |
||||
|
||||
message("QT_DIR_PATH=${QT_DIR}") |
||||
message("MSYS2_DIR_PATH=${MSYS2}") |
||||
message("FFMPEG_DIR_PATH=${FFMPEG}") |
||||
|
||||
#查找QT模块 |
||||
find_package(Qt6Core REQUIRED) |
||||
find_package(Qt6Gui REQUIRED) |
||||
find_package(Qt6Widgets REQUIRED) |
||||
|
||||
#MSYS2 SDL库 |
||||
include(FindPackageHandleStandardArgs) |
||||
|
||||
find_library(SDL2_LIBRARY NAMES SDL2 PATHS ${MSYS2} PATH_SUFFIXES lib) |
||||
find_path(SDL2_INCLUDE_DIR NAMES SDL2/SDL.h PATHS ${MSYS2} PATH_SUFFIXES include) |
||||
|
||||
find_package_handle_standard_args(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) |
||||
|
||||
if (SDL2_FOUND) |
||||
mark_as_advanced(SDL2_INCLUDE_DIR) |
||||
mark_as_advanced(SDL2_LIBRARY) |
||||
endif() |
||||
|
||||
if (SDL2_FOUND AND NOT TARGET SDL2::SDL2) |
||||
add_library(SDL2::SDL2 STATIC IMPORTED) |
||||
set_property(TARGET SDL2::SDL2 PROPERTY IMPORTED_LOCATION ${SDL2_LIBRARY}) |
||||
target_include_directories(SDL2::SDL2 INTERFACE ${SDL2_INCLUDE_DIR}) |
||||
include_directories(${SDL2_INCLUDE_DIR}) |
||||
target_link_libraries(SDL2::SDL2 INTERFACE SDL2::SDL2 mingw32 glu32 opengl32 setupapi hid z) |
||||
endif() |
||||
|
||||
#MSYS2 FFMPEG |
||||
find_package(PkgConfig REQUIRED) |
||||
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET |
||||
libavdevice |
||||
libavfilter |
||||
libavformat |
||||
libavcodec |
||||
libswresample |
||||
libswscale |
||||
libavutil |
||||
libpostproc |
||||
) |
||||
include_directories(${FFMPEG}/include) |
||||
#增加项目第三方库 |
||||
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/stb) |
||||
|
||||
set(PROJECT_SOURCES |
||||
main.cpp |
||||
PlayThread.cpp |
||||
PlayThread.h |
||||
SDL2Player.cpp |
||||
SDL2Player.h |
||||
ZFFmpeg.cpp |
||||
ZFFmpeg.h |
||||
stb_impl.cpp |
||||
stb_ffmpeg.h |
||||
stb_ffmpeg.cpp |
||||
) |
||||
#资源文件 |
||||
qt6_add_resources(RCFILES res.qrc) |
||||
|
||||
add_executable(${PROJECT_NAME} WIN32 ${PROJECT_SOURCES} ${RCFILES}) |
||||
|
||||
target_link_libraries( |
||||
${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets |
||||
${SDL2_LIBRARY} |
||||
PkgConfig::FFMPEG |
||||
) |
@ -0,0 +1,153 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE QtCreatorProject> |
||||
<!-- Written by QtCreator 8.0.1, 2022-09-25T15:03:28. --> |
||||
<qtcreator> |
||||
<data> |
||||
<variable>EnvironmentId</variable> |
||||
<value type="QByteArray">{bd716bc2-53a5-45e0-976b-573eccb8e3a0}</value> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable> |
||||
<value type="qlonglong">0</value> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.EditorSettings</variable> |
||||
<valuemap type="QVariantMap"> |
||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value> |
||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> |
||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> |
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> |
||||
<value type="QString" key="language">Cpp</value> |
||||
<valuemap type="QVariantMap" key="value"> |
||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value> |
||||
</valuemap> |
||||
</valuemap> |
||||
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">1</value> |
||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> |
||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> |
||||
<value type="int" key="EditorConfiguration.IndentSize">4</value> |
||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> |
||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value> |
||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value> |
||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value> |
||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value> |
||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value> |
||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> |
||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value> |
||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> |
||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> |
||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> |
||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> |
||||
<value type="int" key="EditorConfiguration.TabSize">8</value> |
||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value> |
||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value> |
||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">2</value> |
||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> |
||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value> |
||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> |
||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value> |
||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value> |
||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value> |
||||
</valuemap> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.Target.0</variable> |
||||
<valuemap type="QVariantMap"> |
||||
<value type="QString" key="DeviceType">Desktop</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Imported Kit</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Imported Kit</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ddb406ba-b06f-4720-bf29-b36018b1f977}</value> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> |
||||
<value type="QString" key="CMake.Build.Type">Release</value> |
||||
<value type="QString" key="CMake.Initial.Parameters">-DCMAKE_GENERATOR:STRING=MinGW Makefiles |
||||
-DCMAKE_BUILD_TYPE:STRING=Release |
||||
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake |
||||
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} |
||||
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} |
||||
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} |
||||
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}</value> |
||||
<value type="QString" key="CMake.Source.Directory">F:\SourceCode\VTS\ZFFmpeg\zffmpeg</value> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\ZFFmpeg\zffmpeg\build</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> |
||||
<value type="QString">all</value> |
||||
</valuelist> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"> |
||||
<value type="QString">clean</value> |
||||
</valuelist> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
||||
</valuemap> |
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> |
||||
</valuemap> |
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/> |
||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> |
||||
<valuelist type="QVariantList" key="CustomOutputParsers"/> |
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value> |
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">ZFFmpeg</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.ZFFmpeg</value> |
||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">ZFFmpeg</value> |
||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> |
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> |
||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> |
||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> |
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> |
||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">F:/SourceCode/VTS/ZFFmpeg/zffmpeg/build/release</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value> |
||||
</valuemap> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.TargetCount</variable> |
||||
<value type="qlonglong">1</value> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable> |
||||
<value type="int">22</value> |
||||
</data> |
||||
<data> |
||||
<variable>Version</variable> |
||||
<value type="int">22</value> |
||||
</data> |
||||
</qtcreator> |
@ -0,0 +1,129 @@
|
||||
#include "FFmpeg.h" |
||||
#include<iostream> |
||||
FFmpeg::FFmpeg() |
||||
{ |
||||
|
||||
} |
||||
|
||||
FFmpeg::FFmpeg(std::string path) |
||||
{ |
||||
} |
||||
|
||||
INITERRO FFmpeg::initFFmpeg(const std::string& path) |
||||
{ |
||||
|
||||
if (path.empty() && this->filePath.empty()) { |
||||
return INITERRO::INIT_ERRO_OPEN_FAILED; |
||||
} |
||||
//优先选用传入的参数
|
||||
std::string pathTemp = path.empty() ? this->filePath : path; |
||||
//初始化
|
||||
av_register_all(); |
||||
avformat_network_init(); |
||||
this->pFormatCtx = avformat_alloc_context(); |
||||
//open_input
|
||||
if (avformat_open_input(&this->pFormatCtx, pathTemp.c_str(), NULL,NULL) != 0) { |
||||
return INITERRO::INIT_ERRO_OPEN_FAILED; |
||||
} |
||||
//find_stream_infomation
|
||||
if (avformat_find_stream_info(this->pFormatCtx, NULL) < 0) { |
||||
return INITERRO::INIT_ERRO_FIND_FAILED; |
||||
} |
||||
//find_decoder
|
||||
videoIndex = -1; |
||||
audioIndex = -1; |
||||
for (int i = 0; i < this->pFormatCtx->nb_streams; ++i) { |
||||
if (this->pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { |
||||
videoIndex = i; |
||||
} |
||||
if (this->pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
||||
audioIndex = i; |
||||
} |
||||
} |
||||
if (videoIndex != -1) { |
||||
pCodercCtxVideo = pFormatCtx->streams[videoIndex]->codec; |
||||
pCodercVideo = avcodec_find_decoder(pCodercCtxVideo->codec_id); |
||||
if (pCodercVideo == NULL) { |
||||
printf("Codec not found.\n"); |
||||
return INITERRO::INIT_ERRO_DECODE_FAILED; |
||||
} |
||||
} |
||||
if (audioIndex != -1) { |
||||
pCodercCtxAudio = pFormatCtx->streams[audioIndex]->codec; |
||||
//
|
||||
} |
||||
//open2
|
||||
if (avcodec_open2(pCodercCtxVideo, pCodercVideo, NULL) < 0) { |
||||
return INITERRO::INIT_ERRO_OPEN2_FAILED; |
||||
} |
||||
//init
|
||||
pFrame = av_frame_alloc(); |
||||
pFrameYUV = av_frame_alloc(); |
||||
uint8_t* outBuffer = (uint8_t*)av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, pCodercCtxVideo->width, pCodercCtxVideo->height)); |
||||
avpicture_fill((AVPicture*)pFrameYUV, outBuffer, AV_PIX_FMT_YUV420P, pCodercCtxVideo->width, pCodercCtxVideo->height); |
||||
pPacket = (AVPacket*)av_malloc(sizeof(AVPacket)); |
||||
|
||||
//Output Info-----------------------------
|
||||
/*printf("--------------- File Information ----------------\n");
|
||||
av_dump_format(pFormatCtx, 0, pathTemp.c_str(), 0); |
||||
printf("-------------------------------------------------\n");*/ |
||||
imgConvertCtx = sws_getContext(pCodercCtxVideo->width, pCodercCtxVideo->height, pCodercCtxVideo->pix_fmt, |
||||
pCodercCtxVideo->width, pCodercCtxVideo->height, AV_PIX_FMT_YUV420P, 4, NULL, NULL, NULL); |
||||
|
||||
return INITERRO::INIT_ERRO_NO_ERRO; |
||||
} |
||||
|
||||
std::shared_ptr<uint8_t> FFmpeg::getFrameYUV(int& isVideo) |
||||
{ |
||||
int y_size = pCodercCtxVideo->width * pCodercCtxVideo->height; |
||||
std::shared_ptr<uint8_t> bufferFram(new uint8_t[y_size * 3 / 2]); |
||||
|
||||
int ret = -1; |
||||
int gotPic = -1; |
||||
if (av_read_frame(pFormatCtx, pPacket) < 0) { |
||||
isVideo = -2; |
||||
return bufferFram; |
||||
} |
||||
if (pPacket->stream_index == videoIndex) { |
||||
ret = avcodec_decode_video2(pCodercCtxVideo, pFrame, &gotPic, pPacket); |
||||
if (gotPic) { |
||||
sws_scale(imgConvertCtx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodercCtxVideo->height, |
||||
pFrameYUV->data, pFrameYUV->linesize); |
||||
// U V 的数据分别是Y的1/4 宽高各减少一半
|
||||
memcpy(bufferFram.get(), pFrameYUV->data[0], y_size); |
||||
memcpy(bufferFram.get() + y_size, pFrameYUV->data[1], y_size / 4); |
||||
memcpy(bufferFram.get() + y_size + y_size / 4, pFrameYUV->data[2], y_size / 4); |
||||
isVideo = 1; |
||||
} |
||||
else { |
||||
isVideo = -1; |
||||
} |
||||
} |
||||
else { |
||||
isVideo = 0; |
||||
} |
||||
|
||||
av_free_packet(pPacket); |
||||
return bufferFram; |
||||
} |
||||
|
||||
int FFmpeg::getWidth() |
||||
{ |
||||
return this->pCodercCtxVideo->width; |
||||
} |
||||
|
||||
int FFmpeg::getHeight() |
||||
{ |
||||
return this->pCodercCtxVideo->height; |
||||
} |
||||
|
||||
FFmpeg::~FFmpeg() |
||||
{ |
||||
sws_freeContext(imgConvertCtx); |
||||
|
||||
av_frame_free(&pFrameYUV); |
||||
av_frame_free(&pFrame); |
||||
avcodec_close(pCodercCtxVideo); |
||||
avcodec_close(pCodercCtxAudio); |
||||
avformat_close_input(&pFormatCtx); |
||||
} |
@ -0,0 +1,54 @@
|
||||
#ifdef FFMPEG_H |
||||
#define FFMPEG_H |
||||
|
||||
#include<string> |
||||
#define __STDC_CONSTANT_MACROS |
||||
#ifdef __cplusplus |
||||
extern "C" |
||||
{ |
||||
#endif |
||||
#include "libavcodec/avcodec.h" |
||||
#include "libavformat/avformat.h" |
||||
#include "libswscale/swscale.h" |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
#include<memory> |
||||
enum class INITERRO { |
||||
INIT_ERRO_NO_ERRO, |
||||
INIT_ERRO_ALLOC_FAILED, |
||||
INIT_ERRO_OPEN_FAILED, |
||||
INIT_ERRO_FIND_FAILED, |
||||
INIT_ERRO_NO_VIDEO, |
||||
INIT_ERRO_NO_AUDIO, |
||||
INIT_ERRO_DECODE_FAILED, |
||||
INIT_ERRO_OPEN2_FAILED |
||||
}; |
||||
|
||||
class FFmpeg |
||||
{ |
||||
public: |
||||
FFmpeg(); |
||||
FFmpeg(std::string path); |
||||
INITERRO initFFmpeg(const std::string& path=""); |
||||
std::shared_ptr<uint8_t> getFrameYUV(int& isVideo); |
||||
int getWidth(); |
||||
int getHeight(); |
||||
~FFmpeg(); |
||||
|
||||
private: |
||||
std::string filePath; |
||||
int videoIndex; |
||||
int audioIndex; |
||||
AVFormatContext* pFormatCtx; |
||||
AVCodecContext* pCodercCtxVideo; |
||||
AVCodecContext* pCodercCtxAudio; |
||||
AVCodec* pCodercVideo; |
||||
AVFrame* pFrame; |
||||
AVFrame* pFrameYUV; |
||||
AVPacket* pPacket; |
||||
struct SwsContext* imgConvertCtx; |
||||
}; |
||||
|
||||
#endif |
@ -0,0 +1,102 @@
|
||||
#include "SDL2Player.h" |
||||
|
||||
SDL2Player::SDL2Player(void* t_winID): |
||||
d_width(640), |
||||
d_height(480), |
||||
d_Title("SDL player"), |
||||
st_exit(0), |
||||
st_pause(0), |
||||
sd_time(25), |
||||
stbffmpeg(new STB_FFmpeg()) |
||||
{ |
||||
winID=t_winID; |
||||
} |
||||
SDL2Player::~SDL2Player() |
||||
{ |
||||
SDL_DestroyTexture(sdl_texture); |
||||
//SDL_FreeSurface(pic);
|
||||
SDL_DestroyRenderer(sdl_rander); |
||||
SDL_DestroyWindow(sdl_window); |
||||
SDL_Quit(); |
||||
delete stbffmpeg; |
||||
stbffmpeg=nullptr; |
||||
} |
||||
|
||||
void SDL2Player::set_window_size(int t_width,int t_height){ |
||||
d_width=t_width; |
||||
d_height=t_height; |
||||
} |
||||
void SDL2Player::set_player_title(QString t_str){ |
||||
d_Title=t_str; |
||||
} |
||||
|
||||
int SDL2Player::initPlayer() |
||||
{ |
||||
if(!winID){ |
||||
return -1; |
||||
} |
||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { |
||||
printf("Could not initialize SDL - %s\n", SDL_GetError()); |
||||
return -1; |
||||
} |
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"); |
||||
if (winID != NULL) { |
||||
sdl_window = SDL_CreateWindowFrom(winID); |
||||
} |
||||
else { |
||||
sdl_window = SDL_CreateWindow(d_Title.toStdString().c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, |
||||
d_width, d_height, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE|SDL_WINDOW_ALLOW_HIGHDPI); |
||||
} |
||||
if (!sdl_window) { |
||||
printf("SDL: could not create window - exiting:%s\n", SDL_GetError()); |
||||
return -1; |
||||
} |
||||
sdl_rander = SDL_CreateRenderer(sdl_window, -1,SDL_RENDERER_TARGETTEXTURE); |
||||
SDL_SetRenderDrawBlendMode(sdl_rander, SDL_BLENDMODE_BLEND); |
||||
SDL_ShowWindow(sdl_window); |
||||
|
||||
sdl_surface=stbffmpeg->default_logo_surface(logoImageStr); |
||||
if(sdl_surface){ |
||||
sdl_texture = SDL_CreateTextureFromSurface(sdl_rander, sdl_surface); |
||||
} |
||||
stbffmpeg->setFontArgs(sdl_rander); |
||||
SDL_CreateThread(SDL2Player::refresh_video_thread, NULL, this); |
||||
return 1; |
||||
} |
||||
|
||||
void SDL2Player::default_logo_texture(){ |
||||
SDL_WaitEvent(&event); |
||||
int iW,iH,iWidth,iHeight; |
||||
SDL_QueryTexture(sdl_texture, NULL, NULL, &iW, &iH); |
||||
SDL_GetWindowSize(sdl_window, &iWidth, &iHeight); |
||||
sdlRect.x = iWidth/2-iW/2; |
||||
sdlRect.y = iHeight/2-iH/2; |
||||
sdlRect.w = iW; |
||||
sdlRect.h = iH; |
||||
|
||||
SDL_RenderClear(sdl_rander); |
||||
SDL_RenderCopy(sdl_rander, sdl_texture, NULL,&sdlRect); |
||||
|
||||
sdlFontRect.x=(iWidth/2-iW/2)-stbffmpeg->fc.faceSize; |
||||
sdlFontRect.y=iHeight-50; |
||||
|
||||
stbffmpeg->fc.drawText(sdlFontRect.x, sdlFontRect.y, logoStr); |
||||
SDL_RenderPresent(sdl_rander); |
||||
} |
||||
int SDL2Player::refresh_video_thread(void* opaque) |
||||
{ |
||||
SDL2Player* sdl = (SDL2Player*)opaque; |
||||
SDL_Event _event; |
||||
while (!sdl->st_exit) |
||||
{ |
||||
if (!sdl->st_pause) { |
||||
_event.type = REFRESH_EVENT; |
||||
SDL_PushEvent(&_event); |
||||
SDL_Delay(sdl->sd_time); |
||||
} |
||||
} |
||||
_event.type = BREAK_EVENT; |
||||
SDL_PushEvent(&_event); |
||||
return 0; |
||||
} |
||||
|
@ -0,0 +1,55 @@
|
||||
#ifndef SDL2PLAYER_H |
||||
#define SDL2PLAYER_H |
||||
|
||||
#include <iostream> |
||||
#include <fstream> |
||||
#include <QWidget> |
||||
#include <QDir> |
||||
|
||||
#define SDL_MAIN_HANDLED |
||||
|
||||
#include "SDL2/SDL.h" |
||||
|
||||
#include "stb_ffmpeg.h" |
||||
|
||||
//Refresh Event
|
||||
#define REFRESH_EVENT (SDL_USEREVENT + 1) |
||||
//Break
|
||||
#define BREAK_EVENT (SDL_USEREVENT + 2) |
||||
|
||||
class SDL2Player |
||||
{ |
||||
public: |
||||
SDL2Player(void* winId); |
||||
~SDL2Player(); |
||||
int initPlayer(); |
||||
void set_window_size(int t_width,int t_height); |
||||
void set_player_title(QString); |
||||
void default_logo_texture(); |
||||
private: |
||||
SDL_Surface* default_logo_surface(std::string image); |
||||
static int refresh_video_thread(void* opaque); |
||||
private: |
||||
void* winID; |
||||
int d_width; |
||||
int d_height; |
||||
QString d_Title; |
||||
|
||||
STB_FFmpeg* stbffmpeg; |
||||
//SDL WINDOW
|
||||
SDL_Window* sdl_window; |
||||
SDL_Texture* sdl_texture; |
||||
SDL_Renderer* sdl_rander; |
||||
SDL_Surface *sdl_surface; |
||||
SDL_Rect sdlRect,sdlFontRect;
|
||||
//事件
|
||||
SDL_Event event; |
||||
int st_exit; |
||||
int st_pause; |
||||
int sd_time; |
||||
//默认字符串
|
||||
std::string logoImageStr="F:/SourceCode/VTS/ZFFmpeg/ZFFmpeg/res/img/zvo.png"; |
||||
std::string logoStr="新时代社会主义中国"; |
||||
}; |
||||
|
||||
#endif // SDL2PLAYER_H
|
@ -0,0 +1,12 @@
|
||||
#include "ZFFmpeg.h" |
||||
#include <QApplication> |
||||
|
||||
//#undef main
|
||||
|
||||
int main(int argc, char* argv[]) |
||||
{ |
||||
QApplication a(argc, argv); |
||||
ZFFmpeg* wx = new ZFFmpeg; |
||||
wx->show(); |
||||
return a.exec(); |
||||
} |
@ -0,0 +1,63 @@
|
||||
#include "PlayThread.h" |
||||
|
||||
PlayThread::PlayThread(void* t_winID): |
||||
f_Path(tr(nullptr)) |
||||
{ |
||||
winID = t_winID; |
||||
sdl_Player=new SDL2Player(winID); |
||||
sdl_Player->set_player_title("SDL Player"); |
||||
|
||||
} |
||||
|
||||
PlayThread::~PlayThread() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void PlayThread::run() |
||||
{ |
||||
|
||||
//FFmpeg ffmpeg;
|
||||
//auto r = ffmpeg.initFFmpeg(f_Path.toStdString().c_str());
|
||||
//if (r != INITERRO::INIT_ERRO_NO_ERRO) {
|
||||
// return;
|
||||
//}
|
||||
//SDL 播放器
|
||||
sdl_Player->initPlayer(); |
||||
while(true){ |
||||
sdl_Player->default_logo_texture(); |
||||
SDL_Delay(25); |
||||
} |
||||
/*
|
||||
int isVideo = -2; |
||||
auto buffer = ffmpeg.getFrameYUV(isVideo); |
||||
|
||||
while (isVideo != -2) |
||||
{ |
||||
buffer = ffmpeg.getFrameYUV(isVideo); |
||||
if (isVideo == 1) { |
||||
|
||||
auto r = sdl_Player.playYUV(buffer.get()); |
||||
if (r == -1) { |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
*/ |
||||
|
||||
} |
||||
|
||||
void PlayThread::pause() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void PlayThread::stop() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void PlayThread::setPath(QString filePath) |
||||
{ |
||||
f_Path = filePath; |
||||
} |
@ -0,0 +1,24 @@
|
||||
#ifndef PLAYTHREAD_H |
||||
#define PLAYTHREAD_H |
||||
|
||||
#include <QThread> |
||||
#include "SDL2Player.h" |
||||
|
||||
class PlayThread:public QThread |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
PlayThread(void*); |
||||
~PlayThread(); |
||||
virtual void run(); |
||||
void pause(); |
||||
void stop(); |
||||
void setPath(QString f_Path); |
||||
int isStop = 0; |
||||
private: |
||||
QString f_Path; |
||||
void* winID; |
||||
SDL2Player* sdl_Player; |
||||
}; |
||||
|
||||
#endif // PLAYTHREAD_H
|
@ -0,0 +1,5 @@
|
||||
<RCC> |
||||
<qresource prefix="/"> |
||||
<file>res/img/zvo.png</file> |
||||
</qresource> |
||||
</RCC> |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 157 KiB |
@ -0,0 +1,75 @@
|
||||
#include "stb_ffmpeg.h" |
||||
|
||||
STB_FFmpeg::STB_FFmpeg(){ |
||||
|
||||
} |
||||
STB_FFmpeg::~STB_FFmpeg(){ |
||||
|
||||
} |
||||
SDL_Surface* STB_FFmpeg::default_logo_surface(std::string image){ |
||||
int req_format = STBI_rgb_alpha; |
||||
int width, height, orig_format; |
||||
unsigned char* data = stbi_load(image.c_str(), &width, &height, &orig_format, req_format); |
||||
if(data==NULL){ |
||||
return nullptr; |
||||
} |
||||
int depth, pitch; |
||||
Uint32 pixel_format; |
||||
if (req_format == STBI_rgb) { |
||||
depth = 24; |
||||
pitch = 3*width; |
||||
pixel_format = SDL_PIXELFORMAT_RGB24; |
||||
} else { |
||||
depth = 32; |
||||
pitch = 4*width; |
||||
pixel_format = SDL_PIXELFORMAT_RGBA32; |
||||
} |
||||
return SDL_CreateRGBSurfaceWithFormatFrom((void*)data, width, height,depth, pitch, pixel_format); |
||||
} |
||||
void STB_FFmpeg::readFileRaw (const std::string & fullPath, std::string & output) { |
||||
std::ifstream fs(fullPath.c_str(), std::ios::in | std::ios::binary); |
||||
|
||||
if (!fs.is_open()) { |
||||
std::cout << "readFileRaw: " << fullPath << " -- " << "WARNING: Could not open file." << std::endl; |
||||
return; |
||||
} |
||||
else { |
||||
std::cout << "Opened! " << fullPath << std::endl; |
||||
} |
||||
|
||||
fs.seekg (0, std::ios::end); |
||||
const size_t LEN = fs.tellg(); |
||||
fs.seekg (0, std::ios::beg); |
||||
|
||||
output.resize(LEN); |
||||
fs.read(&output[0], LEN); |
||||
fs.close(); |
||||
} |
||||
|
||||
void STB_FFmpeg::readFileRaw_toMemory (const std::string & fullPath, sttfont_memory & mem) { |
||||
std::ifstream fs(fullPath.c_str(), std::ios::in | std::ios::binary); |
||||
|
||||
if (!fs.is_open()) { |
||||
std::cout << "readFileRaw: " << fullPath << " -- " << "WARNING: Could not open file." << std::endl; |
||||
return; |
||||
} |
||||
else { |
||||
std::cout << "Opened! " << fullPath << std::endl; |
||||
} |
||||
|
||||
fs.seekg (0, std::ios::end); |
||||
const size_t LEN = fs.tellg(); |
||||
fs.seekg (0, std::ios::beg); |
||||
|
||||
mem.alloc(LEN); |
||||
fs.read(mem.data, LEN); |
||||
fs.close(); |
||||
} |
||||
void STB_FFmpeg::setFontArgs(SDL_Renderer* sdl_rander){ |
||||
fc.faceSize = 48; |
||||
fc.tabWidthInSpaces = 12; |
||||
sttfont_memory notoSans; |
||||
readFileRaw_toMemory((QDir::currentPath()+"/font/PingFang.ttf").toStdString(), notoSans); |
||||
fc.loadFontManaged(notoSans); |
||||
fc.bindRenderer(sdl_rander); |
||||
} |
@ -0,0 +1,23 @@
|
||||
#ifndef STBFFMPEG_H |
||||
#define STBFFMPEG_H |
||||
|
||||
#include "SDL2/SDL.h" |
||||
extern "C"{ |
||||
#include "stb_image.h" |
||||
} |
||||
|
||||
#include "stb_font.h" |
||||
#include <iostream> |
||||
#include <fstream> |
||||
#include <QDir> |
||||
class STB_FFmpeg{ |
||||
public: |
||||
STB_FFmpeg(); |
||||
~STB_FFmpeg(); |
||||
SDL_Surface* default_logo_surface(std::string image); |
||||
void readFileRaw (const std::string & fullPath, std::string & output); |
||||
void readFileRaw_toMemory (const std::string & fullPath, sttfont_memory & mem); |
||||
void setFontArgs(SDL_Renderer* sdl_rander); |
||||
sdl_stb_font_cache fc; |
||||
}; |
||||
#endif |
@ -0,0 +1,13 @@
|
||||
#ifdef STB_IMAGE_IMPLEMENTATION |
||||
#undef STB_IMAGE_IMPLEMENTATION |
||||
#endif |
||||
#define STB_IMAGE_IMPLEMENTATION |
||||
extern "C"{ |
||||
#include "stb_image.h" |
||||
} |
||||
|
||||
#ifdef SDL_STB_FONT_IMPL |
||||
#undef SDL_STB_FONT_IMPL |
||||
#endif |
||||
#define SDL_STB_FONT_IMPL |
||||
#include "stb_font.h" |
@ -0,0 +1,68 @@
|
||||
#include "ZFFmpeg.h" |
||||
|
||||
ZFFmpeg::ZFFmpeg(QWidget *parent) |
||||
: QWidget(parent), |
||||
mLayout(new QVBoxLayout), |
||||
cLayout(new QHBoxLayout), |
||||
vLayout(new QHBoxLayout), |
||||
l_path(new QLabel), |
||||
e_edit(new QLineEdit), |
||||
m_playerwidget(new QWidget), |
||||
t_play(new QPushButton), |
||||
t_pause(new QPushButton), |
||||
t_stop(new QPushButton), |
||||
t_exit(new QPushButton), |
||||
t_open_file(new QPushButton) |
||||
{ |
||||
l_path->setText(tr("播放地址:")); |
||||
t_play->setText(tr("播放")); |
||||
t_pause->setText(tr("暂停")); |
||||
t_stop->setText(tr("停止")); |
||||
t_exit->setText(tr("退出")); |
||||
t_open_file->setText(tr("打开文件")); |
||||
setMinimumSize(800,600); |
||||
m_playerwidget->setMinimumSize(640,480); |
||||
cLayout->addWidget(l_path); |
||||
cLayout->addWidget(e_edit); |
||||
cLayout->addWidget(t_open_file); |
||||
cLayout->addWidget(t_play); |
||||
cLayout->addWidget(t_pause); |
||||
cLayout->addWidget(t_stop);
|
||||
cLayout->addWidget(t_exit); |
||||
|
||||
vLayout->addWidget(m_playerwidget); |
||||
mLayout->addLayout(cLayout); |
||||
mLayout->addLayout(vLayout); |
||||
setLayout(mLayout); |
||||
e_edit->setText(QDir::currentPath()+tr("/Av7046974.mp4")); |
||||
m_playerthread=new PlayThread((void*)m_playerwidget->winId()); |
||||
connect(t_play, SIGNAL(clicked()), this, SLOT(play())); |
||||
connect(t_pause, SIGNAL(clicked()), this, SLOT(pause())); |
||||
connect(t_stop, SIGNAL(clicked()), this, SLOT(stop()),Qt::QueuedConnection);
|
||||
connect(t_open_file,SIGNAL(clicked()),this,SLOT(set_open_file())); |
||||
connect(t_exit, SIGNAL(clicked()), this, SIGNAL(QWidget::close())); |
||||
m_playerthread->start(); |
||||
} |
||||
|
||||
ZFFmpeg::~ZFFmpeg() |
||||
{ |
||||
|
||||
} |
||||
void ZFFmpeg::set_open_file(){ |
||||
QString ms_Path=QFileDialog::getOpenFileName(this,tr("选择要播放的文件"),tr("")); |
||||
if(ms_Path!=nullptr){ |
||||
e_edit->setText(ms_Path); |
||||
|
||||
} |
||||
} |
||||
void ZFFmpeg::play(){ |
||||
|
||||
} |
||||
|
||||
void ZFFmpeg::pause(){ |
||||
|
||||
} |
||||
|
||||
void ZFFmpeg::stop(){ |
||||
|
||||
} |
@ -0,0 +1,41 @@
|
||||
#ifndef ZFFMPEG_H |
||||
#define ZFFMPEG_H |
||||
|
||||
#include <QWidget> |
||||
#include <QLabel> |
||||
#include <QLineEdit> |
||||
#include <QDir> |
||||
#include <QPushButton> |
||||
#include <QVBoxLayout> |
||||
#include <QFileDialog> |
||||
#include <QtConcurrent/QtConcurrent> |
||||
#include "PlayThread.h" |
||||
class ZFFmpeg : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
ZFFmpeg(QWidget *parent = nullptr); |
||||
~ZFFmpeg(); |
||||
private: |
||||
QVBoxLayout* mLayout; |
||||
QHBoxLayout* cLayout; |
||||
QHBoxLayout* vLayout; |
||||
|
||||
QLabel* l_path; |
||||
QLineEdit* e_edit; |
||||
QWidget* m_playerwidget; |
||||
|
||||
QPushButton* t_play; |
||||
QPushButton* t_pause; |
||||
QPushButton* t_stop; |
||||
QPushButton* t_exit; |
||||
QPushButton* t_open_file; |
||||
|
||||
PlayThread* m_playerthread; |
||||
public slots: |
||||
void set_open_file(); |
||||
void play(); |
||||
void pause(); |
||||
void stop(); |
||||
}; |
||||
#endif // ZFFMPEG_H
|
@ -0,0 +1,38 @@
|
||||
QT += core gui |
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets |
||||
|
||||
CONFIG += console c++17 |
||||
|
||||
# You can make your code fail to compile if it uses deprecated APIs. |
||||
# In order to do so, uncomment the following line. |
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 |
||||
|
||||
SOURCES += \ |
||||
PlayThread.cpp \ |
||||
SDL2Player.cpp \ |
||||
ZFFmpeg.cpp \ |
||||
stb_impl.cpp \ |
||||
main.cpp |
||||
HEADERS += \ |
||||
PlayThread.h \ |
||||
SDL2Player.h \ |
||||
ZFFmpeg.h |
||||
|
||||
|
||||
# Default rules for deployment. |
||||
qnx: target.path = /tmp/$${TARGET}/bin |
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin |
||||
!isEmpty(target.path): INSTALLS += target |
||||
|
||||
|
||||
INCLUDEPATH += $$PWD/3rdparty/stb |
||||
|
||||
INCLUDEPATH += D:/Dev/msys64/usr/local/ffmpeg_5_1/include |
||||
LIBS += -LD:/Dev/msys64/usr/local/ffmpeg_5_1/lib -lavcodec.dll -lavdevice.dll -lavfilter.dll -lavformat.dll -lavutil.dll -lpostproc.dll -lswresample.dll -lswscale.dll |
||||
|
||||
INCLUDEPATH += D:/Dev/msys64/mingw64/include |
||||
LIBS += -LD:/Dev/msys64/mingw64/lib -lmingw32 -lSDL2main -lSDL2 -lglu32 -lopengl32 -lsetupapi -lhid -lz |
||||
|
||||
RESOURCES += \ |
||||
res.qrc |
@ -0,0 +1,261 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE QtCreatorProject> |
||||
<!-- Written by QtCreator 8.0.1, 2022-09-23T20:53:50. --> |
||||
<qtcreator> |
||||
<data> |
||||
<variable>EnvironmentId</variable> |
||||
<value type="QByteArray">{bd716bc2-53a5-45e0-976b-573eccb8e3a0}</value> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable> |
||||
<value type="qlonglong">0</value> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.EditorSettings</variable> |
||||
<valuemap type="QVariantMap"> |
||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value> |
||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> |
||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> |
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> |
||||
<value type="QString" key="language">Cpp</value> |
||||
<valuemap type="QVariantMap" key="value"> |
||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value> |
||||
</valuemap> |
||||
</valuemap> |
||||
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">1</value> |
||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> |
||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> |
||||
<value type="int" key="EditorConfiguration.IndentSize">4</value> |
||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> |
||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value> |
||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value> |
||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value> |
||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value> |
||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value> |
||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> |
||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value> |
||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> |
||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> |
||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> |
||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> |
||||
<value type="int" key="EditorConfiguration.TabSize">8</value> |
||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value> |
||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value> |
||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">2</value> |
||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> |
||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value> |
||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> |
||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value> |
||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value> |
||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value> |
||||
</valuemap> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.PluginSettings</variable> |
||||
<valuemap type="QVariantMap"> |
||||
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks"> |
||||
<value type="bool" key="AutoTest.Framework.Boost">true</value> |
||||
<value type="bool" key="AutoTest.Framework.CTest">false</value> |
||||
<value type="bool" key="AutoTest.Framework.Catch">true</value> |
||||
<value type="bool" key="AutoTest.Framework.GTest">true</value> |
||||
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value> |
||||
<value type="bool" key="AutoTest.Framework.QtTest">true</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/> |
||||
<value type="int" key="AutoTest.RunAfterBuild">0</value> |
||||
<value type="bool" key="AutoTest.UseGlobal">true</value> |
||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"> |
||||
<value type="QString">-fno-delayed-template-parsing</value> |
||||
</valuelist> |
||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value> |
||||
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.BuildSystem</value> |
||||
<valuemap type="QVariantMap" key="ClangTools"> |
||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value> |
||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value> |
||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value> |
||||
<value type="int" key="ClangTools.ParallelJobs">6</value> |
||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/> |
||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/> |
||||
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/> |
||||
<value type="bool" key="ClangTools.UseGlobalSettings">true</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="CppEditor.QuickFix"> |
||||
<value type="bool" key="UseGlobalSettings">true</value> |
||||
</valuemap> |
||||
</valuemap> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.Target.0</variable> |
||||
<valuemap type="QVariantMap"> |
||||
<value type="QString" key="DeviceType">Desktop</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.3.1 MinGW static 64-bit</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.3.1 MinGW static 64-bit</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{f1ff2937-c384-4857-8fb4-abdb53acc94f}</value> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> |
||||
<value type="int" key="EnableQmlDebugging">0</value> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\zffmpeg\build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Debug</value> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Debug</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
||||
</valuemap> |
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\zffmpeg\build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Release</value> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Release</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
||||
</valuemap> |
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> |
||||
<value type="int" key="QtQuickCompiler">0</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> |
||||
<value type="int" key="EnableQmlDebugging">0</value> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:\SourceCode\VTS\zffmpeg\build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Profile</value> |
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Profile</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
||||
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
||||
</valuemap> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
||||
</valuemap> |
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> |
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value> |
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> |
||||
<value type="int" key="QtQuickCompiler">0</value> |
||||
<value type="int" key="SeparateDebugInfo">0</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> |
||||
</valuemap> |
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/> |
||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> |
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> |
||||
<valuelist type="QVariantList" key="CustomOutputParsers"/> |
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value> |
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> |
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:F:/SourceCode/VTS/ZFFmpeg/zffmpeg/ZFFmpeg.pro</value> |
||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">F:/SourceCode/VTS/ZFFmpeg/zffmpeg/ZFFmpeg.pro</value> |
||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> |
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> |
||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> |
||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> |
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> |
||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">F:/SourceCode/VTS/zffmpeg/build-zffmpeg-Desktop_Qt_6_3_1_MinGW_static_64_bit-Release</value> |
||||
</valuemap> |
||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value> |
||||
</valuemap> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.TargetCount</variable> |
||||
<value type="qlonglong">1</value> |
||||
</data> |
||||
<data> |
||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable> |
||||
<value type="int">22</value> |
||||
</data> |
||||
<data> |
||||
<variable>Version</variable> |
||||
<value type="int">22</value> |
||||
</data> |
||||
</qtcreator> |
Loading…
Reference in new issue