mirror of
https://github.com/master-of-zen/Av1an.git
synced 2024-11-25 02:29:40 +00:00
117 lines
3.3 KiB
Python
Executable file
117 lines
3.3 KiB
Python
Executable file
#!/bin/env python
|
|
|
|
import atexit
|
|
import os
|
|
import shlex
|
|
import shutil
|
|
import sys
|
|
|
|
from pathlib import Path
|
|
|
|
from av1an.startup.validate_commands import validate_inputs
|
|
from av1an.encoder import ENCODERS
|
|
from av1an.project import Project
|
|
from av1an.utils import terminate, hash_path
|
|
from av1an.logger import log
|
|
from av1an.vapoursynth import is_vapoursynth
|
|
|
|
|
|
def set_target_quality(project):
|
|
"""
|
|
Av1an setup for target_quality
|
|
|
|
:param project: the Project
|
|
"""
|
|
if project.vmaf_path:
|
|
if not Path(project.vmaf_path).exists():
|
|
print(f"No model with this path: {Path(project.vmaf_path).as_posix()}")
|
|
terminate()
|
|
|
|
if project.probes < 4:
|
|
print('Target quality with less than 4 probes is experimental and not recommended')
|
|
terminate()
|
|
|
|
encoder = ENCODERS[project.encoder]
|
|
|
|
if project.encoder not in ('x265', 'svt_av1') and project.target_quality_method == 'per_frame':
|
|
print(f":: Per frame Target Quality is not supported for selected encoder\n:: Supported encoders: x265, svt_av1")
|
|
exit()
|
|
|
|
# setting range for q values
|
|
if project.min_q is None:
|
|
project.min_q, _ = encoder.default_q_range
|
|
assert project.min_q > 1
|
|
|
|
if project.max_q is None:
|
|
_, project.max_q = encoder.default_q_range
|
|
|
|
|
|
def setup_encoder(project: Project):
|
|
"""
|
|
Setup encoder params and passes
|
|
:param project: the Project
|
|
"""
|
|
encoder = ENCODERS[project.encoder]
|
|
|
|
# validate encoder settings
|
|
settings_valid, error_msg = encoder.is_valid(project)
|
|
if not settings_valid:
|
|
print(error_msg)
|
|
terminate()
|
|
|
|
if project.passes is None:
|
|
project.passes = encoder.default_passes
|
|
|
|
project.video_params = encoder.default_args if project.video_params is None \
|
|
else shlex.split(project.video_params)
|
|
|
|
validate_inputs(project)
|
|
|
|
|
|
def startup_check(project: Project):
|
|
"""
|
|
Performing essential checks at startup_check
|
|
Set constant values
|
|
"""
|
|
if sys.version_info < (3, 6):
|
|
print('Python 3.6+ required')
|
|
sys.exit()
|
|
if sys.platform == 'linux':
|
|
def restore_term():
|
|
os.system("stty sane")
|
|
|
|
atexit.register(restore_term)
|
|
|
|
if not project.chunk_method:
|
|
project.select_best_chunking_method()
|
|
|
|
# project.is_vs = is_vapoursynth(project.input)
|
|
|
|
if project.is_vs:
|
|
project.chunk_method = 'vs_ffms2'
|
|
|
|
project.check_exes()
|
|
|
|
set_target_quality(project)
|
|
|
|
if project.reuse_first_pass and project.encoder != 'aom' and project.split_method != 'aom_keyframes':
|
|
print('Reusing the first pass is only supported with \
|
|
the aom encoder and aom_keyframes split method.')
|
|
terminate()
|
|
|
|
setup_encoder(project)
|
|
|
|
# No check because vvc
|
|
if project.encoder == 'vvc':
|
|
project.no_check = True
|
|
|
|
if project.encoder == 'svt_vp9' and project.passes == 2:
|
|
print("Implicitly changing 2 pass svt-vp9 to 1 pass\n2 pass svt-vp9 isn't supported")
|
|
project.passes = 1
|
|
|
|
project.audio_params = shlex.split(project.audio_params)
|
|
project.ffmpeg = shlex.split(project.ffmpeg)
|
|
|
|
project.pix_format = ['-strict', '-1', '-pix_fmt', project.pix_format]
|
|
project.ffmpeg_pipe = [*project.ffmpeg, *project.pix_format,
|
|
'-bufsize', '50000K', '-f', 'yuv4mpegpipe', '-']
|