blob: 51e85c074c0aa4c8359f76fa5d2685a61d43216b [file] [log] [blame]
#!/usr/bin/env python
## Copyright (c) 2019, Alliance for Open Media. All rights reserved
##
## This source code is subject to the terms of the BSD 2 Clause License and
## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
## was not distributed with this source code in the LICENSE file, you can
## obtain it at www.aomedia.org/license/software. If the Alliance for Open
## Media Patent License 1.0 was not distributed with this source code in the
## PATENTS file, you can obtain it at www.aomedia.org/license/patent.
##
__author__ = "maggie.sun@intel.com, ryan.lei@intel.com"
import os
import Utils
import logging
from Config import BinPath, LogCmdOnly, LoggerName, FFMPEG
from Utils import GetShortContentName, ExecuteCmd
subloggername = "VideoScaler"
loggername = LoggerName + '.' + '%s' % subloggername
logger = logging.getLogger(loggername)
def ValidAlgo_ffmpeg(algo):
if (algo == 'bicubic' or algo == 'lanczos' or algo == 'sinc' or
algo == 'bilinear' or algo == 'spline' or algo == 'gauss' or
algo == 'bicublin' or algo == 'neighbor'):
return True
else:
return False
#use ffmpeg to do image rescaling for yuv420 8bit
def RescaleWithFfmpeg(infile, inw, inh, outw, outh, algo, outfile, num, app_path):
args = " -y -s:v %dx%d -i %s -vf scale=%dx%d -c:v rawvideo -pix_fmt yuv420p" \
" -sws_flags %s+accurate_rnd+full_chroma_int+full_chroma_inp+bitexact"\
"+print_info -sws_dither none" \
% (inw, inh, infile, outw, outh, algo)
if (algo == 'lanczos'):
args += " -param0 5 "
args += " -frames %d %s" % (num, outfile)
cmd = FFMPEG + args
ExecuteCmd(cmd, LogCmdOnly)
def VideoRescaling(infile, num, inw, inh, outw, outh, outfile, algo):
if ValidAlgo_ffmpeg(algo):
RescaleWithFfmpeg(infile, inw, inh, outw, outh, algo, outfile, num, BinPath)
# add other tools for scaling here later
else:
logger.error("unsupported scaling algorithm.")
####################################################################################
##################### Major Functions ################################################
def GetDownScaledOutFile(input, inw, inh, dnw, dnh, path, algo):
contentBaseName = GetShortContentName(input)
actual_algo = 'None' if inw == dnw and inh == dnh else algo
filename = contentBaseName + ('_DnScaled_%s_%dx%d.yuv' % (actual_algo, dnw,
dnh))
dnscaledout = os.path.join(path, filename)
return dnscaledout
def GetUpScaledOutFile(infile, inw, inh, outw, outh, path, algo):
actual_algo = 'None' if inw == outw and inh == outh else algo
filename = GetShortContentName(infile, False) + ('_UpScaled_%s_%dx%d.yuv'
% (actual_algo, outw, outh))
upscaledout = os.path.join(path, filename)
return upscaledout
def DownScaling(input, num, inw, inh, outw, outh, path, algo):
dnScalOut = GetDownScaledOutFile(input, inw, inh, outw, outh, path, algo)
Utils.CmdLogger.write("::Downscaling\n")
if (inw == outw and inh == outh):
cmd = "copy %s %s" % (input, dnScalOut)
ExecuteCmd(cmd, LogCmdOnly)
else:
# call separate process to do the downscaling
VideoRescaling(input, num, inw, inh, outw, outh, dnScalOut, algo)
return dnScalOut
def UpScaling(infile, num, inw, inh, outw, outh, path, algo):
upScaleOut = GetUpScaledOutFile(infile, inw, inh, outw, outh, path, algo)
Utils.CmdLogger.write("::Upscaling\n")
if (inw == outw and inh == outh):
cmd = "copy %s %s" % (infile, upScaleOut)
ExecuteCmd(cmd, LogCmdOnly)
else:
# call separate process to do the upscaling
VideoRescaling(infile, num, inw, inh, outw, outh, upScaleOut, algo)
return upScaleOut