Line data Source code
1 : /* 2 : * Copyright (C) 2004-2025 Savoir-faire Linux Inc. 3 : * 4 : * This program is free software: you can redistribute it and/or modify 5 : * it under the terms of the GNU General Public License as published by 6 : * the Free Software Foundation, either version 3 of the License, or 7 : * (at your option) any later version. 8 : * 9 : * This program is distributed in the hope that it will be useful, 10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 : * GNU General Public License for more details. 13 : * 14 : * You should have received a copy of the GNU General Public License 15 : * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 : */ 17 : 18 : #include "filter_transpose.h" 19 : #include "logger.h" 20 : 21 : namespace jami { 22 : namespace video { 23 : 24 : std::unique_ptr<MediaFilter> 25 0 : getTransposeFilter(int rotation, std::string inputName, int width, int height, int format, bool rescale) 26 : { 27 0 : JAMI_WARN("Rotation set to %d", rotation); 28 0 : if (rotation == 0) { 29 0 : return {}; 30 : } 31 : 32 0 : std::stringstream ss; 33 0 : ss << "[" << inputName << "] "; 34 : 35 0 : switch (rotation) { 36 0 : case 90: 37 : case -270: 38 0 : ss << "transpose=2"; 39 0 : if (rescale) { 40 0 : if (width > height) 41 0 : ss << ", scale=w=-1:h=" << height << ", pad=" << width << ":" << height << ":(ow-iw)/2"; 42 : else 43 0 : ss << ", scale=w=" << width << ":h=-1" << ", pad=" << width << ":" << height << ":0:(oh-ih)/2"; 44 : } 45 0 : break; 46 0 : case 180: 47 : case -180: 48 0 : ss << "transpose=1, transpose=1"; 49 0 : break; 50 0 : case 270: 51 : case -90: 52 0 : ss << "transpose=1"; 53 0 : if (rescale) { 54 0 : if (width > height) 55 0 : ss << ", scale=w=-1:h=" << height << ", pad=" << width << ":" << height << ":(ow-iw)/2"; 56 : else 57 0 : ss << ", scale=w=" << width << ":h=-1" << ", pad=" << width << ":" << height << ":0:(oh-ih)/2"; 58 : } 59 0 : break; 60 0 : default: 61 0 : return {}; 62 : } 63 : 64 0 : constexpr auto one = rational<int>(1); 65 0 : std::vector<MediaStream> msv; 66 0 : msv.emplace_back(inputName, format, one, width, height, 0, one); 67 : 68 0 : std::unique_ptr<MediaFilter> filter(new MediaFilter); 69 0 : auto ret = filter->initialize(ss.str(), msv); 70 0 : if (ret < 0) { 71 0 : JAMI_ERR() << "filter init fail"; 72 0 : return {}; 73 : } 74 0 : return filter; 75 0 : } 76 : 77 : } // namespace video 78 : } // namespace jami