2020-08-13 23:02:59 +00:00
|
|
|
import os
|
2020-08-21 13:31:09 +00:00
|
|
|
import re
|
2020-08-13 23:02:59 +00:00
|
|
|
|
2020-12-25 15:32:45 +00:00
|
|
|
from project import Project
|
2020-12-25 17:01:51 +00:00
|
|
|
from chunk import Chunk
|
2020-12-25 15:32:45 +00:00
|
|
|
from av1an.commandtypes import MPCommands, CommandPair, Command
|
|
|
|
from encoder.encoder import Encoder
|
|
|
|
from av1an.utils import list_index_of_regex
|
2020-08-13 23:02:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
class X265(Encoder):
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
super().__init__(
|
|
|
|
encoder_bin='x265',
|
2020-09-15 17:36:23 +00:00
|
|
|
encoder_help='x265 --fullhelp',
|
2020-11-25 07:46:37 +00:00
|
|
|
default_args=['-p', 'slow', '--crf', '25', '-D', '10'],
|
2020-08-19 19:50:31 +00:00
|
|
|
default_passes=1,
|
|
|
|
default_q_range=(20, 40),
|
2020-08-13 23:02:59 +00:00
|
|
|
output_extension='mkv'
|
|
|
|
)
|
|
|
|
|
2020-11-25 07:32:26 +00:00
|
|
|
def compose_1_pass(self, a: Project, c: Chunk, output: str) -> MPCommands:
|
2020-08-13 23:02:59 +00:00
|
|
|
return [
|
2020-08-19 07:06:42 +00:00
|
|
|
CommandPair(
|
|
|
|
Encoder.compose_ffmpeg_pipe(a),
|
2020-10-18 00:40:46 +00:00
|
|
|
['x265', '--y4m', '--frames', str(c.frames), *a.video_params, '-', '-o', output]
|
2020-08-19 07:06:42 +00:00
|
|
|
)
|
2020-08-13 23:02:59 +00:00
|
|
|
]
|
|
|
|
|
2020-11-25 07:32:26 +00:00
|
|
|
def compose_2_pass(self, a: Project, c: Chunk, output: str) -> MPCommands:
|
2020-08-13 23:02:59 +00:00
|
|
|
return [
|
2020-08-19 07:06:42 +00:00
|
|
|
CommandPair(
|
|
|
|
Encoder.compose_ffmpeg_pipe(a),
|
2020-11-25 07:46:37 +00:00
|
|
|
['x265', '--log-level', 'error', '--no-progress', '--pass', '1', '--y4m', '--frames', str(c.frames),
|
|
|
|
*a.video_params, '--stats', f'{c.fpf}.log', '-', '-o', os.devnull]
|
2020-08-19 07:06:42 +00:00
|
|
|
),
|
|
|
|
CommandPair(
|
|
|
|
Encoder.compose_ffmpeg_pipe(a),
|
2020-11-25 07:46:37 +00:00
|
|
|
['x265', '--log-level', 'error', '--pass', '2', '--y4m', '--frames', str(c.frames), *a.video_params,
|
|
|
|
'--stats', f'{c.fpf}.log', '-', '-o', output]
|
2020-08-19 07:06:42 +00:00
|
|
|
)
|
2020-08-13 23:02:59 +00:00
|
|
|
]
|
2020-08-19 22:10:29 +00:00
|
|
|
|
2020-08-22 19:24:09 +00:00
|
|
|
def man_q(self, command: Command, q: int) -> Command:
|
2020-08-19 22:10:29 +00:00
|
|
|
"""Return command with new cq value
|
|
|
|
|
|
|
|
:param command: old command
|
|
|
|
:param q: new cq value
|
|
|
|
:return: command with new cq value"""
|
|
|
|
|
|
|
|
adjusted_command = command.copy()
|
|
|
|
|
|
|
|
i = list_index_of_regex(adjusted_command, r"--crf")
|
|
|
|
adjusted_command[i + 1] = f'{q}'
|
|
|
|
|
|
|
|
return adjusted_command
|
2020-08-21 13:31:09 +00:00
|
|
|
|
2020-08-22 19:24:09 +00:00
|
|
|
def match_line(self, line: str):
|
2020-08-21 13:31:09 +00:00
|
|
|
"""Extract number of encoded frames from line.
|
|
|
|
|
|
|
|
:param line: one line of text output from the encoder
|
|
|
|
:return: match object from re.search matching the number of encoded frames"""
|
|
|
|
|
2020-10-18 00:40:46 +00:00
|
|
|
return re.search(r"^\[.*\]\s(\d+)\/\d+", line)
|