blob: eb765b6135f8a55d1f5724b43a08508ff0392118 [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, ryanlei@fb.com"
import re
import openpyxl
import shutil
import Config
from Config import QPs, DnScaleRatio, CTC_ASXLSTemplate, CTC_RegularXLSTemplate
import Utils
from Utils import ParseCSVFile, plot_rd_curve, Interpolate_Bilinear, convex_hull
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
csv_files = {
"v1.0.0":
{
"AI": "D:\\AV2-CTC-v1.0.0-Final\\analysis\\rdresult\\RDResults_aom_av2_AI_Preset_0.csv",
"LD": "D:\\AV2-CTC-v1.0.0-Final\\analysis\\rdresult\\RDResults_aom_av2_LD_Preset_0.csv",
"RA": "D:\\AV2-CTC-v1.0.0-Final\\analysis\\rdresult\\RDResults_aom_av2_RA_Preset_0.csv",
"Still": "D:\\AV2-CTC-v1.0.0-Final\\analysis\\rdresult\\RDResults_aom_av2_STILL_Preset_0.csv",
"AS": "D:\\AV2-CTC-v1.0.0-Final\\analysis\\rdresult\\RDResults_aom_av2_AS_Preset_0.csv",
},
"v1.0.1":
{
"AI": "D:\\AV2-CTC-v1.0.1\\analysis\\rdresult\\RDResults_aom_av2_AI_Preset_0.csv",
"LD": "D:\\AV2-CTC-v1.0.1\\analysis\\rdresult\\RDResults_aom_av2_LD_Preset_0.csv",
"RA": "D:\\AV2-CTC-v1.0.1\\analysis\\rdresult\\RDResults_aom_av2_RA_Preset_0.csv",
"Still": "D:\\AV2-CTC-v1.0.1\\analysis\\rdresult\\RDResults_aom_av2_STILL_Preset_0.csv",
"AS": "D:\\AV2-CTC-v1.0.1\\analysis\\rdresult\\RDResults_aom_av2_AS_Preset_0.csv",
},
}
start_row = {
"AI": 2,
"AS": 2,
"RA": 2,
"Still": 2,
"LD": 50,
}
formats = {
"v1.0.0": ['r', '-', 'o'],
"v1.0.1": ['g', '-', '*'],
}
AS_formats = {
"3840x2160": ['r', '-.', 'o'],
"2560x1440": ['g', '-.', '*'],
"1920x1080": ['b', '-.', '^'],
"1280x720": ['y', '-.', '+'],
"960x540": ['c', '-.', 'x'],
"640x360": ['k', '-.', '<'],
}
anchor = "v1.0.0"
rd_curve_pdf = "rdcurve.pdf"
def WriteSheet(csv_file, sht, start_row):
csv = open(csv_file, 'rt')
row = start_row
for line in csv:
if not line.startswith('TestCfg'):
words = re.split(',', line.strip())
col = 1
for word in words:
mycell = sht.cell(row=row, column=col)
if col >= 12 and word != "":
mycell.value = float(word)
else:
mycell.value = word
col += 1
row += 1
csv.close()
def FillXlsFile():
for tag in csv_files.keys():
if tag == anchor:
continue
else:
for cfg in csv_files[anchor].keys():
anchor_sht_name = "Anchor-%s" % cfg
test_sht_name = "Test-%s" % cfg
if cfg == "AS":
xls_template = CTC_ASXLSTemplate
xls_file = "CTC_AS_%s-%s.xlsm" % (anchor, tag)
shutil.copyfile(xls_template, xls_file)
anchor_sht_name = "Anchor"
test_sht_name = "Test"
elif cfg == "AI":
xls_template = CTC_RegularXLSTemplate
xls_file = "CTC_Regular_%s-%s.xlsm" % (anchor, tag)
shutil.copyfile(xls_template, xls_file)
wb = openpyxl.load_workbook(filename=xls_file, read_only=False, keep_vba=True)
anchor_sht = wb[anchor_sht_name]
anchor_csv = csv_files[anchor][cfg]
WriteSheet(anchor_csv, anchor_sht, start_row[cfg])
test_sht = wb[test_sht_name]
test_csv = csv_files[tag][cfg]
WriteSheet(test_csv, test_sht, start_row[cfg])
wb.save(xls_file)
def DrawRDCurve(records, anchor, pdf):
with PdfPages(pdf) as export_pdf:
for cfg in records[anchor].keys():
videos = records[anchor][cfg].keys()
for video in videos:
if cfg == "AS":
DnScaledRes = [(int(3840/ratio), int(2160/ratio)) for ratio in DnScaleRatio]
Int_RDPoints = {}
# draw individual rd curves
for tag in records.keys():
Int_RDPoints[tag] = []
record = records[tag][cfg][video]
plt.figure(figsize=(15, 10))
plt.suptitle("%s : %s: %s" % (cfg, video, tag))
for (w, h) in DnScaledRes:
br = []; apsnr = []; rdpnts = []; res = "%dx%d"%(w,h)
for qp in QPs["AS"]:
key = "%dx%d_%s"%(w, h, qp)
br.append(record[key].bitrate)
apsnr.append(record[key].overall_apsnr)
rdpnts = [(brt, qty) for brt, qty in zip(br, apsnr)]
int_rdpnts = Interpolate_Bilinear(rdpnts, QPs['AS'][:], True)
Int_RDPoints[tag] += int_rdpnts
plot_rd_curve(br, apsnr, "overall_apsnr", res, "bitrate(Kbps)",
AS_formats[res][0], AS_formats[res][1], AS_formats[res][2])
plt.legend()
plt.grid(True)
export_pdf.savefig()
plt.close()
#draw convex hull
plt.figure(figsize=(15, 10))
plt.suptitle("%s : %s: convex hull" % (cfg, video))
for tag in records.keys():
lower, upper = convex_hull(Int_RDPoints[tag])
br = [h[0] for h in upper]
apsnr = [h[1] for h in upper]
plot_rd_curve(br, apsnr, "overall_apsnr", tag, "bitrate(Kbps)",
formats[tag][0], formats[tag][1], formats[tag][2])
plt.legend()
plt.grid(True)
export_pdf.savefig()
plt.close()
else:
# bit rate to quality
plt.figure(figsize=(15, 10))
plt.suptitle("%s : %s" % (cfg, video))
for tag in records.keys():
record = records[tag][cfg][video]
br = [record[key].bitrate for key in record.keys()]
apsnr = [record[key].overall_apsnr for key in record.keys()]
plot_rd_curve(br, apsnr, "overall_apsnr", tag, "bitrate(Kbps)",
formats[tag][0], formats[tag][1], formats[tag][2])
plt.legend()
plt.grid(True)
export_pdf.savefig()
plt.close()
######################################
# main
######################################
if __name__ == "__main__":
records = {}
for tag in csv_files.keys():
records[tag] = {}
for test_cfg in csv_files[tag].keys():
records[tag][test_cfg] = ParseCSVFile(csv_files[tag][test_cfg])
FillXlsFile()
DrawRDCurve(records, anchor, rd_curve_pdf)