Files
o3de/Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin.cpp
T
Esteban Papp 1f9b284de2 Merge branch 'development' into cmake/SPEC-7179
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>

# Conflicts:
#	Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h
#	Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h
#	Code/Editor/Plugins/EditorCommon/stdafx.cpp
#	Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
#	Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h
#	Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h
#	Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h
#	Code/Tools/AssetProcessor/native/precompiled.h
#	Code/Tools/Standalone/StandaloneTools_precompiled.h
#	Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h
#	Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h
#	Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h
#	Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake
#	Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h
#	Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h
#	Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp
#	Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake
#	Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h
#	Gems/Blast/Code/Source/StdAfx.cpp
#	Gems/Camera/Code/Source/Camera_precompiled.h
#	Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h
#	Gems/FastNoise/Code/Source/FastNoise_precompiled.h
#	Gems/Gestures/Code/Source/Gestures_precompiled.h
#	Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h
#	Gems/GraphCanvas/Code/precompiled.h
#	Gems/ImGui/Code/Source/ImGui_precompiled.h
#	Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h
#	Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h
#	Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp
#	Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h
#	Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h
#	Gems/LyShine/Code/Source/LyShine_precompiled.h
#	Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h
#	Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h
#	Gems/Maestro/Code/Source/Maestro_precompiled.h
#	Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h
#	Gems/Metastream/Code/Source/Metastream_precompiled.h
#	Gems/Microphone/Code/Source/Microphone_precompiled.h
#	Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h
#	Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h
#	Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h
#	Gems/PhysX/Code/Source/PhysX_precompiled.h
#	Gems/PhysX/Code/physx_unsupported_files.cmake
#	Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h
#	Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h
#	Gems/ScriptCanvas/Code/Editor/precompiled.h
#	Gems/ScriptCanvas/Code/Source/precompiled.h
#	Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h
#	Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h
#	Gems/ScriptEvents/Code/Source/precompiled.h
#	Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp
#	Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h
#	Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h
#	Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h
#	Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h
#	Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h
#	Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h
#	Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h
#	Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h
#	Gems/Twitch/Code/Source/Twitch_precompiled.h
#	Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
2021-07-16 15:42:37 -07:00

141 lines
4.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include "FFMPEGPlugin.h"
#include "CryString.h"
typedef CryStringT<char> string;
#include "Include/ICommandManager.h"
#include "Util/PathUtil.h"
#include <QCoreApplication>
#include <QSettings>
#include <QProcess>
namespace PluginInfo
{
const char* kName = "FFMPEG Writer";
const char* kGUID = "{D2A3A44A-00FF-4341-90BA-89A473F44A65}";
const int kVersion = 1;
}
void CFFMPEGPlugin::Release()
{
GetIEditor()->GetICommandManager()->UnregisterCommand(COMMAND_MODULE, COMMAND_NAME);
delete this;
}
void CFFMPEGPlugin::ShowAbout()
{
}
const char* CFFMPEGPlugin::GetPluginGUID()
{
return PluginInfo::kGUID;
}
DWORD CFFMPEGPlugin::GetPluginVersion()
{
return PluginInfo::kVersion;
}
const char* CFFMPEGPlugin::GetPluginName()
{
return PluginInfo::kName;
}
bool CFFMPEGPlugin::CanExitNow()
{
return true;
}
static void Command_FFMPEGEncode(const char* input, const char* output, const char* codec, int bitRateinKb, int fps, const char* etc)
{
QString ffmpegExectablePath = CFFMPEGPlugin::GetFFMPEGExectablePath();
QString ffmpegCmdLine = QStringLiteral("\"%1\" -r %2 -i \"%3\" -vcodec %4 -b %5k -r %6 %7 -strict experimental -y \"%8\"")
.arg(ffmpegExectablePath, QString::number(fps), input, codec, QString::number(bitRateinKb), QString::number(fps), etc, output);
GetIEditor()->GetSystem()->GetILog()->Log("Executing \"%s\" from FFMPEGPlugin...", ffmpegCmdLine.toUtf8().data());
QString outTxt;
GetIEditor()->ExecuteConsoleApp(ffmpegCmdLine, outTxt, true, true);
GetIEditor()->GetSystem()->GetILog()->Log("FFMPEG execution done.");
}
QString CFFMPEGPlugin::GetFFMPEGExectablePath()
{
// the FFMPEG exe could be in a number of possible locations
// our preferred location is from the path in the registry @
// "Software\\Amazon\\Lumberyard\\Settings"
// in a value called "FFMPEG_PLUGIN"
// if its not there, try the current folder and a few others
// see what can be found!
QString ffmpegExectablePath;
QSettings settings("O3DE", "O3DE");
settings.beginGroup("Settings");
ffmpegExectablePath = settings.value("FFMPEG_PLUGIN").toString();
if (ffmpegExectablePath.isEmpty() || !QFile::exists(ffmpegExectablePath))
{
QString path = qApp->applicationDirPath();
QString checkPath;
const char* possibleLocations[] = {
"rc/ffmpeg",
"editorplugins/ffmpeg",
"../editor/plugins/ffmpeg",
};
for (int idx = 0; idx < 3; ++idx)
{
#if defined(AZ_PLATFORM_WINDOWS)
checkPath = QStringLiteral("%1/%2.exe").arg(path, possibleLocations[idx]);
#else
checkPath = QStringLiteral("%1/%2").arg(path, possibleLocations[idx]);
#endif
if (QFile::exists(checkPath))
{
ffmpegExectablePath = checkPath;
break;
}
}
if (ffmpegExectablePath.isEmpty())
{
#if defined(AZ_PLATFORM_WINDOWS)
ffmpegExectablePath = "ffmpeg.exe";
#else
ffmpegExectablePath = "ffmpeg";
#endif
// try the current folder if all else fails, this will also work if its in the PATH somehow.
}
}
return ffmpegExectablePath;
}
bool CFFMPEGPlugin::RuntimeTest()
{
QString ffmpegExectablePath = CFFMPEGPlugin::GetFFMPEGExectablePath();
return QProcess::startDetached(QStringLiteral("\"%1\" -version").arg(ffmpegExectablePath), {});
}
void CFFMPEGPlugin::RegisterTheCommand()
{
using namespace AZStd::placeholders;
CommandManagerHelper::RegisterCommand<const char*, const char*, const char*, int, int, const char*>(
GetIEditor()->GetICommandManager(),
COMMAND_MODULE, COMMAND_NAME, "Encodes a video using ffmpeg.",
"plugin.ffmpeg_encode 'input.avi' 'result.mov' 'libx264' 200 30",
AZStd::bind(Command_FFMPEGEncode, _1, _2, _3, _4, _5, _6));
}
void CFFMPEGPlugin::OnEditorNotify([[maybe_unused]] EEditorNotifyEvent aEventId)
{
}