// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include "libvideostitch/config.hpp"

#include <memory>

namespace VideoStitch {

namespace Core {
struct PanoDeviceDefinition;
class PanoDefinition;
class InputController;
}  // namespace Core

namespace Ptv {
class Parser;
class Value;
}  // namespace Ptv

namespace Cmd {

bool loadGPUBackend(const int deviceId, int& returnCode);

bool parseInputPath(int argc, char** argv, int index, char** ptvPath);
bool parseOutputPath(int argc, char** argv, int index, char** ptvPath);
bool parseFirstFrame(int argc, char** argv, int index, int* firstFrame);
bool parseLastFrame(int argc, char** argv, int index, int* lastFrame);

bool selectGPUDevice(int argc, char** argv, int& deviceId, int& returnCode);
bool checkGPUDevice(Core::PanoDeviceDefinition& dev);
const char* changeWorkingPathToPtvFolder(char* ptvPath);

std::unique_ptr<Core::PanoDefinition> parsePanoDef(const Ptv::Value& ptvRoot, const char* ptvFile);
bool parsePtvFile(Ptv::Parser& parser, const char* ptvFile);

std::unique_ptr<Core::PanoDefinition> parsePanoDef(Ptv::Parser& parser, const char* ptvFile);

bool normalizeFrameBoundaries(const Core::InputController& controller, const frameid_t firstFrame,
                              frameid_t& lastFrame);

}  // namespace Cmd
}  // namespace VideoStitch