155 lines
4.4 KiB
Python
155 lines
4.4 KiB
Python
#!/usr/bin/python3
|
|
##
|
|
## Copyright (c) 2022, 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.
|
|
##
|
|
""" Analyze the log generated by experimental flag CONFIG_RATECTRL_LOG."""
|
|
|
|
import matplotlib.pyplot as plt
|
|
import os
|
|
|
|
|
|
def get_file_basename(filename):
|
|
return filename.split(".")[0]
|
|
|
|
|
|
def parse_log(log_file):
|
|
data_list = []
|
|
with open(log_file) as fp:
|
|
for line in fp:
|
|
dic = {}
|
|
word_ls = line.split()
|
|
i = 0
|
|
while i < len(word_ls):
|
|
dic[word_ls[i]] = float(word_ls[i + 1])
|
|
i += 2
|
|
data_list.append(dic)
|
|
fp.close()
|
|
return data_list
|
|
|
|
|
|
def extract_data(data_list, name):
|
|
arr = []
|
|
for data in data_list:
|
|
arr.append(data[name])
|
|
return arr
|
|
|
|
|
|
def visualize_q_indices(exp_summary, exp_list, fig_path=None):
|
|
for exp in exp_list:
|
|
data = parse_log(exp["log"])
|
|
q_indices = extract_data(data, "q")
|
|
plt.title(exp_summary)
|
|
plt.xlabel("frame_coding_idx")
|
|
plt.ylabel("q_index")
|
|
plt.plot(q_indices, marker=".", label=exp["label"])
|
|
plt.legend()
|
|
if fig_path:
|
|
plt.savefig(fig_path)
|
|
else:
|
|
plt.show()
|
|
plt.clf()
|
|
|
|
|
|
def get_rc_type_from_exp_type(exp_type):
|
|
if exp_type == "Q_3P":
|
|
return "q"
|
|
return "vbr"
|
|
|
|
|
|
def test_video(exe_name, input, exp_type, level, log=None, limit=150):
|
|
basic_cmd = ("--test-decode=warn --threads=0 --profile=0 --min-q=0 --max-q=63"
|
|
" --auto-alt-ref=1 --kf-max-dist=160 --kf-min-dist=0 "
|
|
"--drop-frame=0 --static-thresh=0 --minsection-pct=0 "
|
|
"--maxsection-pct=2000 --arnr-maxframes=7 --arnr-strength=5 "
|
|
"--sharpness=0 --undershoot-pct=100 --overshoot-pct=100 "
|
|
"--frame-parallel=0 --tile-columns=0 --cpu-used=3 "
|
|
"--lag-in-frames=48 --psnr")
|
|
rc_type = get_rc_type_from_exp_type(exp_type)
|
|
rc_cmd = "--end-usage=" + rc_type
|
|
level_cmd = ""
|
|
if rc_type == "q":
|
|
level_cmd += "--cq-level=" + str(level)
|
|
elif rc_type == "vbr":
|
|
level_cmd += "--target-bitrate=" + str(level)
|
|
limit_cmd = "--limit=" + str(limit)
|
|
passes_cmd = "--passes=3 --second-pass-log=second_pass_log"
|
|
output_cmd = "-o test.webm"
|
|
input_cmd = "~/data/" + input
|
|
log_cmd = ""
|
|
if log != None:
|
|
log_cmd = ">" + log
|
|
cmd_ls = [
|
|
exe_name, basic_cmd, rc_cmd, level_cmd, limit_cmd, passes_cmd, output_cmd,
|
|
input_cmd, log_cmd
|
|
]
|
|
cmd = " ".join(cmd_ls)
|
|
os.system(cmd)
|
|
|
|
|
|
def gen_ratectrl_log(test_case):
|
|
exe = test_case["exe"]
|
|
video = test_case["video"]
|
|
exp_type = test_case["exp_type"]
|
|
level = test_case["level"]
|
|
log = test_case["log"]
|
|
test_video(exe, video, exp_type, level, log=log, limit=150)
|
|
return log
|
|
|
|
|
|
def gen_test_case(exp_type, dataset, videoname, level, log_dir=None):
|
|
test_case = {}
|
|
exe = "./aomenc_bl"
|
|
if exp_type == "BA_3P":
|
|
exe = "./aomenc_ba"
|
|
test_case["exe"] = exe
|
|
|
|
video = os.path.join(dataset, videoname)
|
|
test_case["video"] = video
|
|
test_case["exp_type"] = exp_type
|
|
test_case["level"] = level
|
|
|
|
video_basename = get_file_basename(videoname)
|
|
log = ".".join([dataset, video_basename, exp_type, str(level)])
|
|
if log_dir != None:
|
|
log = os.path.join(log_dir, log)
|
|
test_case["log"] = log
|
|
return test_case
|
|
|
|
|
|
def run_ratectrl_exp(exp_config):
|
|
fp = open(exp_config)
|
|
log_dir = "./lowres_rc_log"
|
|
fig_dir = "./lowres_rc_fig"
|
|
dataset = "lowres"
|
|
for line in fp:
|
|
word_ls = line.split()
|
|
dataset = word_ls[0]
|
|
videoname = word_ls[1]
|
|
exp_type_ls = ["VBR_3P", "BA_3P"]
|
|
level_ls = [int(v) for v in word_ls[2:4]]
|
|
exp_ls = []
|
|
for i in range(len(exp_type_ls)):
|
|
exp_type = exp_type_ls[i]
|
|
test_case = gen_test_case(exp_type, dataset, videoname, level_ls[i],
|
|
log_dir)
|
|
log = gen_ratectrl_log(test_case)
|
|
exp = {}
|
|
exp["log"] = log
|
|
exp["label"] = exp_type
|
|
exp_ls.append(exp)
|
|
video_basename = get_file_basename(videoname)
|
|
fig_path = os.path.join(fig_dir, video_basename + ".png")
|
|
visualize_q_indices(video_basename, exp_ls, fig_path)
|
|
fp.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run_ratectrl_exp("exp_rc_config")
|