| #!/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, ryan.lei@intel.com" |
| |
| import Utils |
| from Config import BinPath, LogCmdOnly, FFMPEG, AOMENC, SVTAV1, SVTHEVC |
| from Utils import ExecuteCmd |
| |
| #use ffmpeg to encode video |
| def EncodeWithFfmpeg_HEVC(infile, QP, num,fr, width, height, outfile, preset): |
| EncodeProfile = 'main' |
| args = " -y -s %dx%d -pix_fmt yuv420p -r %s -i %s -frames:v %d -g %d -bf 7" \ |
| " -bsf:v hevc_mp4toannexb -c:v libx265 -preset %s -profile:v %s " \ |
| "-x265-params \"qp=%d:aq-mode=0:b-adapt=0:bframes=7:b-pyramid=1:" \ |
| "no-scenecut=1:no-open-gop=1:input-depth=8:output-depth=8\" %s" % ( |
| width, height, fr, infile, num, int(2 * fr), # gop size = 2 seconds |
| preset, EncodeProfile, (QP+3), outfile) |
| cmd = FFMPEG + args |
| ExecuteCmd(cmd, LogCmdOnly) |
| |
| def EncodeWithAOM_AV1(infile, QP, framenum, framerate, width, height, outfile, |
| preset): |
| args = " --verbose --codec=av1 -v --psnr --ivf --frame-parallel=0 --cpu-used=%s" \ |
| " --limit=%d --auto-alt-ref=1 --passes=1 --end-usage=q --i420" \ |
| " --min-gf-interval=16 --max-gf-interval=16 --gf-min-pyr-height=4 " \ |
| " --gf-max-pyr-height=4 --threads=1 --lag-in-frames=19 --end-usage=q " \ |
| " --kf-min-dist=65 --kf-max-dist=65 --use-fixed-qp-offsets=1 --deltaq-mode=0 " \ |
| " --enable-tpl-model=0 --enable-keyframe-filtering=0 " \ |
| " --fps=60/1 --input-bit-depth=8 --qp=%d -w %d -h %d -o %s %s"\ |
| % (preset, framenum, 4*QP, width, height, outfile, infile) |
| cmd = AOMENC + args |
| ExecuteCmd(cmd, LogCmdOnly) |
| |
| def EncodeWithSVT_AV1(infile, QP, framenum, framerate, width, height, outfile, |
| preset): |
| args = " --preset %s --scm 2 --lookahead 0 --hierarchical-levels 3 -n %d" \ |
| " --keyint 255 -rc 0 -q %d -w %d -h %d -b %s -i %s"\ |
| % (str(preset), framenum, QP, width, height, outfile, infile) |
| cmd = SVTAV1 + args |
| ExecuteCmd(cmd, LogCmdOnly) |
| |
| def EncodeWithSVT_HEVC(infile, QP, framenum, framerate, width, height, outfile, |
| preset): |
| args = " -i %s -w %d -h %d -encMode %s -hierarchical-levels 3" \ |
| " -intra-period 100 -scd 0 -rc 0 -q %d -n %d -b %s"\ |
| % (infile, width, height, preset, QP, framenum, outfile) |
| cmd = SVTHEVC + args |
| ExecuteCmd(cmd, LogCmdOnly) |
| |
| def VideoEncode(EncodeMethod, CodecName, infile, QP, framenum, framerate, width, |
| height, outfile, preset): |
| Utils.CmdLogger.write("::Encode\n") |
| if EncodeMethod == "ffmpeg": |
| if CodecName == 'hevc': |
| EncodeWithFfmpeg_HEVC(infile, QP, framenum, framerate, width, height, |
| outfile, preset) |
| else: |
| raise ValueError("invalid parameter for encode.") |
| elif EncodeMethod == "aom": |
| if CodecName == 'av1': |
| EncodeWithAOM_AV1(infile, QP, framenum, framerate, width, height, |
| outfile, preset) |
| else: |
| raise ValueError("invalid parameter for encode.") |
| elif EncodeMethod == "svt": |
| if CodecName == 'av1': |
| EncodeWithSVT_AV1(infile, QP, framenum, framerate, width, height, |
| outfile, preset) |
| elif CodecName == 'hevc': |
| EncodeWithSVT_HEVC(infile, QP, framenum, framerate, width, height, |
| outfile, preset) |
| else: |
| raise ValueError("invalid parameter for encode.") |
| else: |
| raise ValueError("invalid parameter for encode.") |