blob: 2b2c1c557548b30653468cb2c33820ce73d1f863 [file] [log] [blame]
/*
* Copyright (C) 2004-2021 Savoir-faire Linux Inc.
*
* Author: Denys VIDAL <denys.vidal@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "filter_transpose.h"
#include "logger.h"
namespace jami {
namespace video {
std::unique_ptr<MediaFilter>
getTransposeFilter(
int rotation, std::string inputName, int width, int height, int format, bool rescale)
{
JAMI_WARN("Rotation set to %d", rotation);
if (rotation == 0) {
return {};
}
std::stringstream ss;
ss << "[" << inputName << "] ";
switch (rotation) {
case 90:
case -270:
ss << "transpose=2";
if (rescale) {
if (width > height)
ss << ", scale=w=-1:h=" << height << ", pad=" << width << ":" << height
<< ":(ow-iw)/2";
else
ss << ", scale=w=" << width << ":h=-1"
<< ", pad=" << width << ":" << height << ":0:(oh-ih)/2";
}
break;
case 180:
case -180:
ss << "transpose=1, transpose=1";
break;
case 270:
case -90:
ss << "transpose=1";
if (rescale) {
if (width > height)
ss << ", scale=w=-1:h=" << height << ", pad=" << width << ":" << height
<< ":(ow-iw)/2";
else
ss << ", scale=w=" << width << ":h=-1"
<< ", pad=" << width << ":" << height << ":0:(oh-ih)/2";
}
break;
default:
return {};
}
constexpr auto one = rational<int>(1);
std::vector<MediaStream> msv;
msv.emplace_back(inputName, format, one, width, height, 0, one);
std::unique_ptr<MediaFilter> filter(new MediaFilter);
auto ret = filter->initialize(ss.str(), msv);
if (ret < 0) {
JAMI_ERR() << "filter init fail";
return {};
}
return filter;
}
} // namespace video
} // namespace jami