#include <ftl/codecs/bitrates.hpp> #include <cmath> using ftl::codecs::CodecPreset; using ftl::codecs::bitrate_t; using ftl::codecs::preset_t; using ftl::codecs::definition_t; using ftl::codecs::codec_t; static const CodecPreset special_presets[] = { definition_t::HTC_VIVE, bitrate_t::High }; static const CodecPreset presets[] = { definition_t::HD1080, bitrate_t::High, definition_t::HD720, bitrate_t::High, definition_t::SD576, bitrate_t::High, definition_t::SD480, bitrate_t::High, definition_t::LD360, bitrate_t::Standard, definition_t::LD360, bitrate_t::Low }; static const float kAspectRatio = 1.777778f; struct Resolution { int width; int height; }; static const Resolution resolutions[] = { 7680, 4320, // UHD8k 3840, 2160, // UHD4k 1920, 1080, // HD1080 1280, 720, // HD720 1024, 576, // SD576 854, 480, // SD480 640, 360, // LD360 0, 0, // ANY 1852, 2056, // HTC_VIVE 0, 0 }; int ftl::codecs::getWidth(definition_t d) { return resolutions[static_cast<int>(d)].width; } int ftl::codecs::getHeight(definition_t d) { return resolutions[static_cast<int>(d)].height; } definition_t ftl::codecs::findDefinition(int width, int height) { int best = 0; bool smaller = true; for(const Resolution res : resolutions) { if ((res.width == width) && (res.height == height)) { return static_cast<definition_t>(best); } best++; } // TODO error! return definition_t::Any; } /* const CodecPreset &ftl::codecs::getPreset(preset_t p) { if (p < 0 && p >= -1) return special_presets[std::abs(p+1)]; if (p > kPresetWorst) return presets[kPresetWorst]; if (p < kPresetBest) return presets[kPresetBest]; return presets[p]; } preset_t ftl::codecs::findPreset(size_t width, size_t height) { int min_error = std::numeric_limits<int>::max(); // Find best definition int best_def = (int)definition_t::Invalid; for (int i=0; i<(int)definition_t::Invalid; ++i) { int dw = resolutions[i].width - width; int dh = resolutions[i].height - height; int error = dw*dw + dh*dh; if (error < min_error) { min_error = error; best_def = i; } } // Find preset that matches this best definition for (preset_t i=kPresetMinimum; i<=kPresetWorst; ++i) { const auto &preset = getPreset(i); if ((int)preset.res == best_def) { return i; } } return kPresetWorst; } */