blob: dd6cdde1c06becc709dc072651ed8d1e2a1b5cbc [file] [log] [blame] [edit]
#!/usr/bin/env python
## Copyright (c) 2021, Alliance for Open Media. All rights reserved
##
## This source code is subject to the terms of the BSD 3-Clause Clear License and the
## Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear License was
## not distributed with this source code in the LICENSE file, you can obtain it
## at aomedia.org/license/software-license/bsd-3-c-c/. 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 aomedia.org/license/patent-license/.
##
__author__ = "maggie.sun@intel.com, ryanlei@meta.com"
import math
import os
import Utils
from Config import (
AOMENC,
AV1ENC,
CTC_VERSION,
EnableOpenGOP,
EnableTemporalFilter,
EnableTimingInfo,
EnableVerificationTestConfig,
GOP_SIZE,
HEVCCfgFile,
HMENC,
Platform,
SUB_GOP_SIZE,
SVTAV1,
UsePerfUtil,
)
from Utils import ConvertY4MToYUV, DeleteFile, ExecuteCmd, GetShortContentName
def get_qindex_from_QP(QP):
quantizer_to_qindex = [
0,
4,
8,
12,
16,
20,
24,
28,
32,
36,
40,
44,
48,
52,
56,
60,
64,
68,
72,
76,
80,
84,
88,
92,
96,
100,
104,
108,
112,
116,
120,
124,
128,
132,
136,
140,
144,
148,
152,
156,
160,
164,
168,
172,
176,
180,
184,
188,
192,
196,
200,
204,
208,
212,
216,
220,
224,
228,
232,
236,
240,
244,
249,
255,
]
if QP > 63:
print(" QP %d is out of range (0 to 63), clamp to 63", QP)
return quantizer_to_qindex[63]
return quantizer_to_qindex[QP]
def EncodeWithAOM_AV2(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame=0,
LogCmdOnly=False,
):
args = (
" --verbose --codec=av1 -v --psnr --obu --frame-parallel=0"
" --cpu-used=%s --limit=%d --skip=%d --passes=1 --end-usage=q --i%s "
" --use-fixed-qp-offsets=1 --deltaq-mode=0 "
" --enable-tpl-model=0 --fps=%d/%d -w %d -h %d"
% (
preset,
framenum,
start_frame,
clip.fmt,
clip.fps_num,
clip.fps_denom,
clip.width,
clip.height,
)
)
# config enoding bitdepth
if (CTC_VERSION in ["6.0", "7.0", "8.0"]) and (
clip.file_class in ["A2", "A4", "B1"]
):
# CWG-D088
args += " --input-bit-depth=%d --bit-depth=10" % (clip.bit_depth)
else:
args += " --input-bit-depth=%d --bit-depth=%d" % (
clip.bit_depth,
clip.bit_depth,
)
if CTC_VERSION in ["2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0"]:
args += " --qp=%d" % QP
else:
args += " --use-16bit-internal --cq-level=%d" % QP
# For 4K clip, encode with 2 tile columns using two threads.
# --tile-columns value is in log2.
if (
(CTC_VERSION in ["4.0"])
and (clip.file_class in ["A2", "B1"])
and (test_cfg == "LD")
):
args += " --tile-rows=1 --threads=2 --row-mt=0 "
elif (
(CTC_VERSION in ["5.0", "6.0"])
and (clip.file_class in ["A2", "B1"])
and (test_cfg == "LD")
):
args += " --tile-rows=1 --tile-columns=1 --threads=4 --row-mt=0 "
elif (
(CTC_VERSION in ["6.0"])
and (clip.file_class in ["E", "G1"])
and (test_cfg == "RA")
):
args += " --tile-rows=1 --tile-columns=1 --threads=4 --row-mt=0 "
elif CTC_VERSION in ["7.0", "8.0"]:
if EnableVerificationTestConfig:
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "RA":
if clip.file_class in ["A1", "E", "G1"]:
# 4 column tiles should be used
args += " --tile-rows=0 --tile-columns=2 --threads=4 --row-mt=0 "
elif clip.file_class in ["A2", "B1"]:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "AS":
# use the same configuration as RA
if (clip.width == 3840 and clip.height == 2160) or (
clip.width == 2560 and clip.height == 1440
):
# 4 column tiles should be used
args += " --tile-rows=0 --tile-columns=2 --threads=4 --row-mt=0 "
elif clip.width == 1920 and clip.height == 1080:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "LD":
if clip.file_class in ["A2", "B1"]:
# 8 tiles should be used
args += " --tile-rows=1 --tile-columns=2 --threads=8 --row-mt=0 "
elif clip.file_class in ["A3"]:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif (test_cfg in ["AI", "STILL"]) and (
clip.width >= 3840 and clip.height >= 2160
):
# 2 tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
elif clip.width >= 3840 and clip.height >= 2160:
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
if EnableOpenGOP:
args += " --enable-fwd-kf=1 "
else:
args += " --enable-fwd-kf=0 "
if EnableTemporalFilter:
args += " --enable-keyframe-filtering=1 "
else:
args += " --enable-keyframe-filtering=0 "
# CWG-D082, CWG-F222
if CTC_VERSION in ["8.0"]:
if clip.file_class in ["B2"]:
args += " --tune-content=screen --enable-intrabc-ext=1"
elif clip.file_class in ["A4", "A5"]:
args += " --enable-intrabc-ext=2"
else:
args += " --enable-intrabc-ext=1"
elif CTC_VERSION in ["6.0", "7.0"]:
if clip.file_class in ["B2"]:
args += " --tune-content=screen --enable-intrabc-ext=1"
else:
args += " --enable-intrabc-ext=2"
if test_cfg == "AI" or test_cfg == "STILL":
args += " --kf-min-dist=0 --kf-max-dist=0 "
elif test_cfg == "RA" or test_cfg == "AS":
args += (
" --min-gf-interval=%d --max-gf-interval=%d --gf-min-pyr-height=%d"
" --gf-max-pyr-height=%d --kf-min-dist=%d --kf-max-dist=%d"
" --lag-in-frames=%d --auto-alt-ref=1 "
% (
SUB_GOP_SIZE,
SUB_GOP_SIZE,
math.log2(SUB_GOP_SIZE),
math.log2(SUB_GOP_SIZE),
GOP_SIZE,
GOP_SIZE,
SUB_GOP_SIZE + 3,
)
)
elif test_cfg == "LD":
args += (
" --kf-min-dist=9999 --kf-max-dist=9999 --lag-in-frames=0"
" --min-gf-interval=%d --max-gf-interval=%d --gf-min-pyr-height=%d "
" --gf-max-pyr-height=%d --subgop-config-str=ld "
% (
SUB_GOP_SIZE,
SUB_GOP_SIZE,
math.log2(SUB_GOP_SIZE),
math.log2(SUB_GOP_SIZE),
)
)
else:
print("Unsupported Test Configuration %s" % test_cfg)
if clip.file_class == "G1" or clip.file_class == "G2":
args += " --color-primaries=bt2020 --transfer-characteristics=smpte2084 --matrix-coefficients=bt2020ncl"
if CTC_VERSION in ["8.0"]:
args += " --chroma-sample-position=topleft "
else:
args += " --chroma-sample-position=colocated "
args += " -o %s %s" % (outfile, clip.file_path)
cmd = AOMENC + args + "> %s 2>&1" % enc_log
if EnableTimingInfo:
if Platform == "Windows":
cmd = "ptime " + cmd + " >%s" % enc_perf
elif Platform == "Darwin":
cmd = "gtime --verbose --output=%s " % enc_perf + cmd
else:
if UsePerfUtil:
cmd = "3>%s perf stat --log-fd 3 " % enc_perf + cmd
else:
cmd = "/usr/bin/time --verbose --output=%s " % enc_perf + cmd
ExecuteCmd(cmd, LogCmdOnly)
# encode with libaom to achieve highest coding gain
def EncodeWithAOM_AV1_Unconstrained(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame=0,
LogCmdOnly=False,
):
args = (
" --verbose --codec=av1 --profile=0 -v --psnr --obu --frame-parallel=0"
" --cpu-used=%s --limit=%d --skip=%d --passes=1 --end-usage=q --min-q=0 --max-q=63 --i%s "
" --cq-level=%d --enable-tpl-model=1 --fps=%d/%d -w %d -h %d"
% (
preset,
framenum,
start_frame,
clip.fmt,
QP,
clip.fps_num,
clip.fps_denom,
clip.width,
clip.height,
)
)
# config enoding bitdepth
if (CTC_VERSION in ["6.0", "7.0", "8.0"]) and (
clip.file_class in ["A2", "A4", "B1"]
):
# CWG-D088
args += " --input-bit-depth=%d --bit-depth=10" % (clip.bit_depth)
else:
args += " --input-bit-depth=%d --bit-depth=%d" % (
clip.bit_depth,
clip.bit_depth,
)
# For 4K clip, encode with 2 tile columns using two threads.
# --tile-columns value is in log2.
if (
(CTC_VERSION in ["4.0"])
and (clip.file_class in ["A2", "B1"])
and (test_cfg == "LD")
):
args += " --tile-rows=1 --threads=2 --row-mt=0 "
elif (
(CTC_VERSION in ["5.0", "6.0"])
and (clip.file_class in ["A2", "B1"])
and (test_cfg == "LD")
):
args += " --tile-rows=1 --tile-columns=1 --threads=4 --row-mt=0 "
elif (
(CTC_VERSION in ["6.0"])
and (clip.file_class in ["E", "G1"])
and (test_cfg == "RA")
):
args += " --tile-rows=1 --tile-columns=1 --threads=4 --row-mt=0 "
elif CTC_VERSION in ["7.0", "8.0"]:
if EnableVerificationTestConfig:
args += " --tile-rows=0 --tile-columns=0 --threads=0 --row-mt=0 "
args += " --drop-frame=0 --static-thresh=0 --minsection-pct=0 --maxsection-pct=200 --arnr-maxframes=7 --arnr-strength=5 --sharpness=0 "
elif test_cfg == "RA":
if clip.file_class in ["A1", "E", "G1"]:
# 4 column tiles should be used
args += " --tile-rows=0 --tile-columns=2 --threads=4 --row-mt=0 "
elif clip.file_class in ["A2", "B1"]:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "AS":
# use the same configuration as RA
if (clip.width == 3840 and clip.height == 2160) or (
clip.width == 2560 and clip.height == 1440
):
# 4 column tiles should be used
args += " --tile-rows=0 --tile-columns=2 --threads=4 --row-mt=0 "
elif clip.width == 1920 and clip.height == 1080:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "LD":
if clip.file_class in ["A2", "B1"]:
# 8 tiles should be used
args += " --tile-rows=1 --tile-columns=2 --threads=8 --row-mt=0 "
elif clip.file_class in ["A3"]:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif (test_cfg in ["AI", "STILL"]) and (
clip.width >= 3840 and clip.height >= 2160
):
# 2 tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
elif clip.width >= 3840 and clip.height >= 2160:
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
if EnableOpenGOP:
args += " --enable-fwd-kf=1 "
else:
args += " --enable-fwd-kf=0 "
if EnableTemporalFilter:
args += " --enable-keyframe-filtering=1 "
else:
args += " --enable-keyframe-filtering=0 "
if test_cfg == "AI" or test_cfg == "STILL":
args += " --kf-min-dist=0 --kf-max-dist=0 "
elif test_cfg == "RA" or test_cfg == "AS":
args += (
" --min-gf-interval=%d --max-gf-interval=%d --gf-min-pyr-height=%d"
" --gf-max-pyr-height=%d --kf-min-dist=%d --kf-max-dist=%d"
" --lag-in-frames=35 --auto-alt-ref=1 --passes=2 --undershoot-pct=100 --overshoot-pct=100 "
% (
SUB_GOP_SIZE,
SUB_GOP_SIZE,
math.log2(SUB_GOP_SIZE),
math.log2(SUB_GOP_SIZE),
GOP_SIZE,
GOP_SIZE,
)
)
elif test_cfg == "LD":
args += (
" --kf-min-dist=9999 --kf-max-dist=9999 --lag-in-frames=0"
" --min-gf-interval=%d --max-gf-interval=%d --gf-min-pyr-height=%d "
" --gf-max-pyr-height=%d --auto-alt-ref=1 --passes=1 --undershoot-pct=25 --overshoot-pct=25 "
% (
SUB_GOP_SIZE,
SUB_GOP_SIZE,
math.log2(SUB_GOP_SIZE),
math.log2(SUB_GOP_SIZE),
)
)
else:
print("Unsupported Test Configuration %s" % test_cfg)
if clip.file_class == "G1" or clip.file_class == "G2":
args += (
"--color-primaries=bt2020 --transfer-characteristics=smpte2084 "
"--matrix-coefficients=bt2020ncl --chroma-sample-position=colocated "
)
args += " -o %s %s" % (outfile, clip.file_path)
cmd = AV1ENC + args + "> %s 2>&1" % enc_log
if EnableTimingInfo:
if Platform == "Windows":
cmd = "ptime " + cmd + " >%s" % enc_perf
elif Platform == "Darwin":
cmd = "gtime --verbose --output=%s " % enc_perf + cmd
else:
if UsePerfUtil:
cmd = "3>%s perf stat --log-fd 3 " % enc_perf + cmd
else:
cmd = "/usr/bin/time --verbose --output=%s " % enc_perf + cmd
ExecuteCmd(cmd, LogCmdOnly)
# encode with libaom to compliant with CTC configuration
def EncodeWithAOM_AV1_Constrained(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame=0,
LogCmdOnly=False,
):
args = (
" --verbose --codec=av1 -v --psnr --obu --frame-parallel=0"
" --cpu-used=%s --limit=%d --skip=%d --passes=1 --end-usage=q --i%s "
" --use-fixed-qp-offsets=1 --deltaq-mode=0 --cq-level=%d"
" --enable-tpl-model=0 --fps=%d/%d -w %d -h %d"
% (
preset,
framenum,
start_frame,
clip.fmt,
QP,
clip.fps_num,
clip.fps_denom,
clip.width,
clip.height,
)
)
# config enoding bitdepth
if (CTC_VERSION in ["6.0", "7.0", "8.0"]) and (
clip.file_class in ["A2", "A4", "B1"]
):
# CWG-D088
args += " --input-bit-depth=%d --bit-depth=10" % (clip.bit_depth)
else:
args += " --input-bit-depth=%d --bit-depth=%d" % (
clip.bit_depth,
clip.bit_depth,
)
# For 4K clip, encode with 2 tile columns using two threads.
# --tile-columns value is in log2.
if (
(CTC_VERSION in ["4.0"])
and (clip.file_class in ["A2", "B1"])
and (test_cfg == "LD")
):
args += " --tile-rows=1 --threads=2 --row-mt=0 "
elif (
(CTC_VERSION in ["5.0", "6.0"])
and (clip.file_class in ["A2", "B1"])
and (test_cfg == "LD")
):
args += " --tile-rows=1 --tile-columns=1 --threads=4 --row-mt=0 "
elif (
(CTC_VERSION in ["6.0"])
and (clip.file_class in ["E", "G1"])
and (test_cfg == "RA")
):
args += " --tile-rows=1 --tile-columns=1 --threads=4 --row-mt=0 "
elif CTC_VERSION in ["7.0", "8.0"]:
if EnableVerificationTestConfig:
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "RA":
if clip.file_class in ["A1", "E", "G1"]:
# 4 column tiles should be used
args += " --tile-rows=0 --tile-columns=2 --threads=4 --row-mt=0 "
elif clip.file_class in ["A2", "B1"]:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "AS":
# use the same configuration as RA
if (clip.width == 3840 and clip.height == 2160) or (
clip.width == 2560 and clip.height == 1440
):
# 4 column tiles should be used
args += " --tile-rows=0 --tile-columns=2 --threads=4 --row-mt=0 "
elif clip.width == 1920 and clip.height == 1080:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif test_cfg == "LD":
if clip.file_class in ["A2", "B1"]:
# 8 tiles should be used
args += " --tile-rows=1 --tile-columns=2 --threads=8 --row-mt=0 "
elif clip.file_class in ["A3"]:
# 2 column tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
# 1 tile should be used
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
elif (test_cfg in ["AI", "STILL"]) and (
clip.width >= 3840 and clip.height >= 2160
):
# 2 tiles should be used
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
elif clip.width >= 3840 and clip.height >= 2160:
args += " --tile-rows=0 --tile-columns=1 --threads=2 --row-mt=0 "
else:
args += " --tile-rows=0 --tile-columns=0 --threads=1 --row-mt=0 "
if EnableOpenGOP:
args += " --enable-fwd-kf=1 "
else:
args += " --enable-fwd-kf=0 "
if EnableTemporalFilter:
args += " --enable-keyframe-filtering=1 "
else:
args += " --enable-keyframe-filtering=0 "
if test_cfg == "AI" or test_cfg == "STILL":
args += " --kf-min-dist=0 --kf-max-dist=0 "
elif test_cfg == "RA" or test_cfg == "AS":
args += (
" --min-gf-interval=%d --max-gf-interval=%d --gf-min-pyr-height=%d"
" --gf-max-pyr-height=%d --kf-min-dist=%d --kf-max-dist=%d"
" --lag-in-frames=%d --auto-alt-ref=1 "
% (
SUB_GOP_SIZE,
SUB_GOP_SIZE,
math.log2(SUB_GOP_SIZE),
math.log2(SUB_GOP_SIZE),
GOP_SIZE,
GOP_SIZE,
SUB_GOP_SIZE + 3,
)
)
elif test_cfg == "LD":
args += (
" --kf-min-dist=9999 --kf-max-dist=9999 --lag-in-frames=0"
" --min-gf-interval=%d --max-gf-interval=%d --gf-min-pyr-height=%d "
" --gf-max-pyr-height=%d "
% (
SUB_GOP_SIZE,
SUB_GOP_SIZE,
math.log2(SUB_GOP_SIZE),
math.log2(SUB_GOP_SIZE),
)
)
else:
print("Unsupported Test Configuration %s" % test_cfg)
if clip.file_class == "G1" or clip.file_class == "G2":
args += (
"--color-primaries=bt2020 --transfer-characteristics=smpte2084 "
"--matrix-coefficients=bt2020ncl --chroma-sample-position=colocated "
)
args += " -o %s %s" % (outfile, clip.file_path)
cmd = AV1ENC + args + "> %s 2>&1" % enc_log
if EnableTimingInfo:
if Platform == "Windows":
cmd = "ptime " + cmd + " >%s" % enc_perf
elif Platform == "Darwin":
cmd = "gtime --verbose --output=%s " % enc_perf + cmd
else:
if UsePerfUtil:
cmd = "3>%s perf stat --log-fd 3 " % enc_perf + cmd
else:
cmd = "/usr/bin/time --verbose --output=%s " % enc_perf + cmd
ExecuteCmd(cmd, LogCmdOnly)
def EncodeWithSVT_AV1(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame=0,
LogCmdOnly=False,
):
# encode with SVT-AV1 with the best possible quality without constraint
args = (
" --preset %s --lp 2 -n %d -q %d -w %d -h %d --fps-num %d --fps-denom %d --input-depth %d "
% (
str(preset),
framenum,
QP,
clip.width,
clip.height,
clip.fps_num,
clip.fps_denom,
clip.bit_depth,
)
)
# For 4K clip, encode with 2 tile columns using two threads.
# --tile-columns value is in log2.
if EnableVerificationTestConfig:
args += " "
elif clip.width >= 3840 and clip.height >= 2160:
args += " --tile-columns 1 "
else:
args += " "
if test_cfg == "AI" or test_cfg == "STILL":
args += " --keyint 255 "
elif test_cfg == "RA" or test_cfg == "AS":
args += " --keyint %d " % (GOP_SIZE)
elif test_cfg == "LD":
args += " --keyint -1 --pred-struct 1 "
else:
print("Unsupported Test Configuration %s" % test_cfg)
if clip.file_class == "G1" or clip.file_class == "G2":
args += "--enable-hdr 1 "
args += "-i %s -b %s" % (clip.file_path, outfile)
cmd = SVTAV1 + args + "> %s 2>&1" % enc_log
if EnableTimingInfo:
if Platform == "Windows":
cmd = "ptime " + cmd + " >%s" % enc_perf
elif Platform == "Darwin":
cmd = "gtime --verbose --output=%s " % enc_perf + cmd
else:
if UsePerfUtil:
cmd = "3>%s perf stat --log-fd 3 " % enc_perf + cmd
else:
cmd = "/usr/bin/time --verbose --output=%s " % enc_perf + cmd
ExecuteCmd(cmd, LogCmdOnly)
def EncodeWithHM_HEVC(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame=0,
LogCmdOnly=False,
):
input_yuv_file = GetShortContentName(outfile, False) + ".yuv"
bs_path = os.path.dirname(outfile)
input_yuv_file = os.path.join(bs_path, input_yuv_file)
ConvertY4MToYUV(clip, input_yuv_file, LogCmdOnly)
args = (
" -c %s -i %s -b %s --SourceWidth=%d --SourceHeight=%d --InputBitDepth=%d --InternalBitDepth=%d "
" --InputChromaFormat=420 --FrameRate=%d --GOPSize=%d --FramesToBeEncoded=%d --QP=%d "
% (
HEVCCfgFile,
input_yuv_file,
outfile,
clip.width,
clip.height,
clip.bit_depth,
clip.bit_depth,
clip.fps,
SUB_GOP_SIZE,
framenum,
QP,
)
)
args += " --ConformanceWindowMode=1 " # needed to support non multiple of 8 resolutions.
# enable open Gop
if EnableOpenGOP:
args += " --DecodingRefreshType=1 "
else:
args += " --DecodingRefreshType=2 "
if EnableTemporalFilter:
args += " --TemporalFilter=1 "
else:
args += " --TemporalFilter=0 "
if test_cfg == "AI" or test_cfg == "STILL":
args += " --IntraPeriod=1 "
elif test_cfg == "RA" or test_cfg == "AS":
args += " --IntraPeriod=%d " % GOP_SIZE
elif test_cfg == "LD":
args += " --IntraPeriod=-1 "
else:
print("Unsupported Test Configuration %s" % test_cfg)
cmd = HMENC + args + "> %s 2>&1" % enc_log
if EnableTimingInfo:
if Platform == "Windows":
cmd = "ptime " + cmd + " >%s" % enc_perf
elif Platform == "Darwin":
cmd = "gtime --verbose --output=%s " % enc_perf + cmd
else:
if UsePerfUtil:
cmd = "3>%s perf stat --log-fd 3 " % enc_perf + cmd
else:
cmd = "/usr/bin/time --verbose --output=%s " % enc_perf + cmd
ExecuteCmd(cmd, LogCmdOnly)
DeleteFile(input_yuv_file, LogCmdOnly)
def VideoEncode(
EncodeMethod,
CodecName,
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame=0,
LogCmdOnly=False,
):
Utils.CmdLogger.write("::Encode\n")
if CodecName == "av2":
if EncodeMethod == "aom":
EncodeWithAOM_AV2(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame,
LogCmdOnly,
)
elif CodecName == "av1":
if EncodeMethod == "aom":
EncodeWithAOM_AV1_Constrained(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame,
LogCmdOnly,
)
elif EncodeMethod == "svt":
EncodeWithSVT_AV1(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame,
LogCmdOnly,
)
else:
raise ValueError("invalid parameter for encode.")
elif CodecName == "hevc":
if EncodeMethod == "hm":
EncodeWithHM_HEVC(
clip,
test_cfg,
QP,
framenum,
outfile,
preset,
enc_perf,
enc_log,
start_frame,
LogCmdOnly,
)
else:
raise ValueError("invalid parameter for encode.")
else:
raise ValueError("invalid parameter for encode.")