[autotest] config moved to .yaml file
:Release Notes: added PyYAML dep :Detailed Notes: - :Testing Performed: - :QA Notes: - :Issues Addressed: -
This commit is contained in:
parent
8bd19d4997
commit
7bff99a6c7
68
autotest-conf.yaml
Normal file
68
autotest-conf.yaml
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
repeats: 3
|
||||||
|
|
||||||
|
options:
|
||||||
|
x264enc:
|
||||||
|
bitrate: [ "10000", "20000", "5000" ]
|
||||||
|
speed-preset: [ "ultrafast", "fast", "medium" ]
|
||||||
|
tune: [ "zerolatency" ]
|
||||||
|
sliced-threads: [ "true", "false" ]
|
||||||
|
b-adapt: [ "true", "false" ]
|
||||||
|
rc-lookahead: [ "40", "0" ]
|
||||||
|
ref: [ "3", "0" ]
|
||||||
|
nvh264enc:
|
||||||
|
bitrate: [ "10000", "20000", "5000" ]
|
||||||
|
preset: [ "4", "5", "1" ]
|
||||||
|
rc-lookahead: [ "0" ]
|
||||||
|
rc-mode: [ "2", "0", "5" ]
|
||||||
|
zerolatency: [ "true", "false" ]
|
||||||
|
nvv4l2h264enc:
|
||||||
|
bitrate: [ "10000000", "20000000", "5000000" ]
|
||||||
|
profile: [ "0", "1", "2" ]
|
||||||
|
preset-id: [ "1", "2", "3" ]
|
||||||
|
control-rate: [ "1", "2" ]
|
||||||
|
idrinterval: [ "1", "256" ]
|
||||||
|
tuning-info-id: [ "4", "2", "3" ]
|
||||||
|
|
||||||
|
videos:
|
||||||
|
base-daVinci: "./test.yuv"
|
||||||
|
|
||||||
|
testsource: "videotestsrc pattern=smpte"
|
||||||
|
|
||||||
|
videosrc:
|
||||||
|
raw: ["filesrc location=", " ! rawvideoparse "]
|
||||||
|
h264: ["filesrc location=", " ! decodebin"]
|
||||||
|
|
||||||
|
psnr_check:
|
||||||
|
x264enc: "-pixel_format yuv420p -color_range pc"
|
||||||
|
nvh264enc: "-pixel_format nv12 -color_range tv"
|
||||||
|
nvv4l2h264enc: "-pixel_format nv12 -color_range tv"
|
||||||
|
|
||||||
|
with_docker:
|
||||||
|
- nvv4l2h264enc
|
||||||
|
|
||||||
|
formats:
|
||||||
|
x264enc: "I420"
|
||||||
|
nvh264enc: "NV12"
|
||||||
|
nvv4l2h264enc: "NV12"
|
||||||
|
|
||||||
|
profiles:
|
||||||
|
- baseline
|
||||||
|
- main
|
||||||
|
|
||||||
|
videoconvert:
|
||||||
|
nvv4l2h264enc: "nvvideoconvert"
|
||||||
|
nvh264enc: "videoconvert"
|
||||||
|
x264enc: "videoconvert"
|
||||||
|
|
||||||
|
video_info:
|
||||||
|
video1: "-video_size 1920x1080 -framerate 23.98"
|
||||||
|
sample-surgery: "-video_size 1280x720 -framerate 29.97"
|
||||||
|
base-daVinci: "-video_size 1280x720 -framerate 59.94"
|
||||||
|
|
||||||
|
gst_video_info:
|
||||||
|
video1: "format=I420,height=1080,width=1920,framerate=24000/1001"
|
||||||
|
base-daVinci: "format=2 height=720 width=1280 colorimetry=bt601 framerate=60000/1001"
|
||||||
|
|
||||||
|
latency_filename: "latency-traces-autotest.log"
|
||||||
|
|
||||||
|
docker_run_string: "sudo -S docker container exec deepstream-gst bash"
|
||||||
62
autotestConfig.py
Normal file
62
autotestConfig.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import yaml
|
||||||
|
|
||||||
|
class AutotestConfig:
|
||||||
|
def __init__(self, path='autotest-conf.yaml'):
|
||||||
|
with open(path, 'r') as file:
|
||||||
|
self.data = yaml.safe_load(file)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def options(self):
|
||||||
|
return self.data["options"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def videos(self):
|
||||||
|
return self.data["videos"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def testsource(self):
|
||||||
|
return self.data["testsource"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def videosrc(self):
|
||||||
|
return self.data["videosrc"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def psnr_check(self):
|
||||||
|
return self.data.get("psnr_check", {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def with_docker(self):
|
||||||
|
return self.data.get("with_docker", [])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def repeats(self):
|
||||||
|
return self.data.get("repeats")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def formats(self):
|
||||||
|
return self.data.get("formats", {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def profiles(self):
|
||||||
|
return self.data.get("profiles", [])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def videoconvert(self):
|
||||||
|
return self.data.get("videoconvert", {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def video_info(self):
|
||||||
|
return self.data.get("video_info", {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def gst_video_info(self):
|
||||||
|
return self.data.get("gst_video_info", {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def latency_filename(self):
|
||||||
|
return self.data.get("latency_filename")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def docker_run_string(self):
|
||||||
|
return self.data["docker_run_string"]
|
||||||
@ -5,80 +5,18 @@ from latencyParse import getLatencyTable
|
|||||||
import os, stat, subprocess
|
import os, stat, subprocess
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from extra import log_args_decorator
|
from extra import log_args_decorator
|
||||||
|
from autotestConfig import AutotestConfig
|
||||||
|
import logging
|
||||||
|
|
||||||
options = {
|
# Configure logging to show informational messages
|
||||||
"x264enc": {
|
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
"bitrate": ["10000", "20000", "5000"],
|
|
||||||
"speed-preset": ["ultrafast", "fast", "medium"],
|
|
||||||
"tune": ["zerolatency"],
|
|
||||||
"sliced-threads": ["true", "false"],
|
|
||||||
"b-adapt": ["true", "false"],
|
|
||||||
"rc-lookahead": ["40", "0"],
|
|
||||||
"ref": ["3", "0"]
|
|
||||||
},
|
|
||||||
"nvh264enc": {
|
|
||||||
"bitrate": ["10000", "20000", "5000"],
|
|
||||||
"preset": ["4", "5", "1"],
|
|
||||||
"rc-lookahead": ["0"],
|
|
||||||
"rc-mode": ["2", "0", "5"],
|
|
||||||
"zerolatency": ["true", "false"],
|
|
||||||
},
|
|
||||||
"nvv4l2h264enc": {
|
|
||||||
"bitrate": ["10000000", "20000000", "5000000"],
|
|
||||||
"profile": ["0", "1", "2"],
|
|
||||||
"preset-id": ["1", "2", "3"],
|
|
||||||
"control-rate": ["1", "2"],
|
|
||||||
"idrinterval": ["1", "256"],
|
|
||||||
"tuning-info-id": ["4", "2", "3"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
videos = {
|
config = None
|
||||||
"base-daVinci": "./test.yuv"
|
def get_config():
|
||||||
}
|
global config
|
||||||
|
if config is None:
|
||||||
testsource = "videotestsrc pattern=smpte"
|
config = AutotestConfig()
|
||||||
|
return config
|
||||||
videosrc = {
|
|
||||||
"raw":["filesrc location=", " ! rawvideoparse "],
|
|
||||||
"h264": ["filesrc location=", " ! decodebin"]
|
|
||||||
}
|
|
||||||
|
|
||||||
psnr_check = {
|
|
||||||
"x264enc": "-pixel_format yuv420p -color_range pc",
|
|
||||||
"nvh264enc": "-pixel_format nv12 -color_range tv",
|
|
||||||
"nvv4l2h264enc": "-pixel_format nv12 -color_range tv"
|
|
||||||
}
|
|
||||||
|
|
||||||
with_docker = [ "nvv4l2h264enc" ]
|
|
||||||
|
|
||||||
repeats = 3
|
|
||||||
|
|
||||||
formats = {
|
|
||||||
"x264enc": "I420",
|
|
||||||
"nvh264enc": "NV12",
|
|
||||||
"nvv4l2h264enc": "NV12"
|
|
||||||
}
|
|
||||||
|
|
||||||
profiles = ["baseline", "main"]
|
|
||||||
|
|
||||||
videoconvert = {
|
|
||||||
"nvv4l2h264enc": "nvvideoconvert",
|
|
||||||
"nvh264enc": "videoconvert",
|
|
||||||
"x264enc": "videoconvert"
|
|
||||||
}
|
|
||||||
|
|
||||||
video_info = {
|
|
||||||
"video1":"-video_size 1920x1080 -framerate 23.98",
|
|
||||||
"sample-surgery":"-video_size 1280x720 -framerate 29.97",
|
|
||||||
"base-daVinci": "-video_size 1280x720 -framerate 59.94"
|
|
||||||
}
|
|
||||||
gst_video_info = {
|
|
||||||
"video1":"format=I420,height=1080,width=1920,framerate=24000/1001",
|
|
||||||
"base-daVinci": "format=2 height=720 width=1280 colorimetry=bt601 framerate=60000/1001"
|
|
||||||
}
|
|
||||||
|
|
||||||
latency_filename = "latency-traces-autotest.log"
|
|
||||||
|
|
||||||
# Step-by-step:
|
# Step-by-step:
|
||||||
# 1. Generate all combinations for each encoder
|
# 1. Generate all combinations for each encoder
|
||||||
@ -98,7 +36,7 @@ class Pipeline:
|
|||||||
self.pipeline = (
|
self.pipeline = (
|
||||||
"GST_DEBUG_COLOR_MODE=off " +
|
"GST_DEBUG_COLOR_MODE=off " +
|
||||||
"GST_TRACERS=\"latency(flags=pipeline+element)\" " +
|
"GST_TRACERS=\"latency(flags=pipeline+element)\" " +
|
||||||
"GST_DEBUG=GST_TRACER:7 GST_DEBUG_FILE=" + latency_filename + " " +
|
"GST_DEBUG=GST_TRACER:7 GST_DEBUG_FILE=" + get_config().latency_filename + " " +
|
||||||
self.pipeline
|
self.pipeline
|
||||||
)
|
)
|
||||||
return self
|
return self
|
||||||
@ -112,8 +50,8 @@ class Pipeline:
|
|||||||
#self.pipeline += "tee name=t t. ! queue max-size-time=5000000000 max-size-bytes=100485760 max-size-buffers=1000 ! filesink location=\"base-autotest.yuv\" "
|
#self.pipeline += "tee name=t t. ! queue max-size-time=5000000000 max-size-bytes=100485760 max-size-buffers=1000 ! filesink location=\"base-autotest.yuv\" "
|
||||||
|
|
||||||
def add_encoder(self, encoder, params):
|
def add_encoder(self, encoder, params):
|
||||||
self.pipeline += videoconvert[encoder] + " ! "
|
self.pipeline += get_config().videoconvert[encoder] + " ! "
|
||||||
self.pipeline += "capsfilter caps=video/x-raw,format=" + formats[encoder] + " ! "
|
self.pipeline += "capsfilter caps=video/x-raw,format=" + get_config().formats[encoder] + " ! "
|
||||||
#self.__add_tee(encoder)
|
#self.__add_tee(encoder)
|
||||||
self.options += " ".join(params) + " "
|
self.options += " ".join(params) + " "
|
||||||
#self.pipeline += "t. ! queue max-size-time=5000000000 max-size-bytes=100485760 max-size-buffers=1000 ! "
|
#self.pipeline += "t. ! queue max-size-time=5000000000 max-size-bytes=100485760 max-size-buffers=1000 ! "
|
||||||
@ -132,11 +70,16 @@ class Pipeline:
|
|||||||
|
|
||||||
|
|
||||||
def makeVideoSrc(videoName):
|
def makeVideoSrc(videoName):
|
||||||
return videosrc["raw"][0] + videos[videoName] + videosrc["raw"][1] + gst_video_info[videoName]
|
return (
|
||||||
|
get_config().videosrc["raw"][0] +
|
||||||
|
get_config().videos[videoName] +
|
||||||
|
get_config().videosrc["raw"][1] +
|
||||||
|
get_config().gst_video_info[videoName]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def generateEncoderStrings():
|
def generateEncoderStrings():
|
||||||
global options
|
options = get_config().options
|
||||||
result = dict()
|
result = dict()
|
||||||
for encoder, value in options.items():
|
for encoder, value in options.items():
|
||||||
result[encoder] = generate_combinations(value)
|
result[encoder] = generate_combinations(value)
|
||||||
@ -169,7 +112,6 @@ def generate_combinations(config_dict):
|
|||||||
|
|
||||||
qualityDataframe = pd.DataFrame()
|
qualityDataframe = pd.DataFrame()
|
||||||
latencyDataframe = pd.DataFrame()
|
latencyDataframe = pd.DataFrame()
|
||||||
dockerRunString = "sudo -S docker container exec deepstream-gst bash"
|
|
||||||
|
|
||||||
def execPermissions(scriptFile = "to_exec.sh"):
|
def execPermissions(scriptFile = "to_exec.sh"):
|
||||||
current_permissions = os.stat(scriptFile).st_mode
|
current_permissions = os.stat(scriptFile).st_mode
|
||||||
@ -184,10 +126,10 @@ def writeToExecFile(contents, file):
|
|||||||
def is_docker(func):
|
def is_docker(func):
|
||||||
def wrapper(pipeline):
|
def wrapper(pipeline):
|
||||||
script_name = "to_exec.sh"
|
script_name = "to_exec.sh"
|
||||||
for encoder in with_docker:
|
for encoder in get_config().with_docker:
|
||||||
if encoder in pipeline:
|
if encoder in pipeline:
|
||||||
writeToExecFile(pipeline, script_name)
|
writeToExecFile(pipeline, script_name)
|
||||||
pipeline = dockerRunString + f" {script_name}"
|
pipeline = get_config().docker_run_string + f" {script_name}"
|
||||||
|
|
||||||
func(pipeline)
|
func(pipeline)
|
||||||
return wrapper
|
return wrapper
|
||||||
@ -239,9 +181,9 @@ def run_autotest():
|
|||||||
qualityDataframe = pd.DataFrame()
|
qualityDataframe = pd.DataFrame()
|
||||||
latencyDataframe = pd.DataFrame()
|
latencyDataframe = pd.DataFrame()
|
||||||
for params in combinations:
|
for params in combinations:
|
||||||
for profile in profiles:
|
for profile in get_config().profiles:
|
||||||
for videoName, videoPath in videos.items():
|
for videoName, videoPath in get_config().videos.items():
|
||||||
for _ in range(repeats):
|
for _ in range(get_config().repeats):
|
||||||
filename = "autotest-" + encoder + "-" + profile + "-test-" + videoName + ".mp4"
|
filename = "autotest-" + encoder + "-" + profile + "-test-" + videoName + ".mp4"
|
||||||
pipeline = Pipeline()
|
pipeline = Pipeline()
|
||||||
pipeline = (
|
pipeline = (
|
||||||
@ -260,11 +202,11 @@ def run_autotest():
|
|||||||
psnr_metrics, ssim_metrics = qa.run_quality_check(
|
psnr_metrics, ssim_metrics = qa.run_quality_check(
|
||||||
videoPath,
|
videoPath,
|
||||||
filename,
|
filename,
|
||||||
video_info[videoName] + " " + psnr_check[encoder]
|
get_config().video_info[videoName] + " " + get_config().psnr_check[encoder]
|
||||||
)
|
)
|
||||||
dfPsnr = qa.parse_quality_report(psnr_metrics, ssim_metrics)
|
dfPsnr = qa.parse_quality_report(psnr_metrics, ssim_metrics)
|
||||||
print("-----")
|
print("-----")
|
||||||
dfLatency = getLatencyTable(latency_filename)
|
dfLatency = getLatencyTable(get_config().latency_filename)
|
||||||
columnsQ = pd.MultiIndex.from_tuples(
|
columnsQ = pd.MultiIndex.from_tuples(
|
||||||
[(encoder, profile, videoName, params, col) for col in dfPsnr.columns]
|
[(encoder, profile, videoName, params, col) for col in dfPsnr.columns]
|
||||||
)
|
)
|
||||||
|
|||||||
@ -10,5 +10,6 @@ pillow==11.3.0
|
|||||||
pyparsing==3.2.5
|
pyparsing==3.2.5
|
||||||
python-dateutil==2.9.0.post0
|
python-dateutil==2.9.0.post0
|
||||||
pytz==2025.2
|
pytz==2025.2
|
||||||
|
PyYAML==6.0.3
|
||||||
six==1.17.0
|
six==1.17.0
|
||||||
tzdata==2025.2
|
tzdata==2025.2
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user