1 Commits
dev ... vfr

Author SHA1 Message Date
e13c2d517e WIP 2020-11-14 21:02:26 +03:00
14 changed files with 229 additions and 397 deletions

View File

@ -1,44 +0,0 @@
# About VFR support:
I can get all information about each frame like this:
`ffprobe -v quiet -show_entries packet -select_streams <stream_index> <videofile>`
And here is a way to take something specific:
`ffprobe -v quiet -show_entries packet=pts_time,duration_time -select_streams <stream_index> <videofile>`
It is possible to concatenate all frames from variable times using ffmpeg concat.
Need to make a file with the following content:
```
ffconcat version 1.0
file './frames_upscaled/000001.png'
duration 0.042000
file './frames_upscaled/000002.png'
duration 0.042000
file './frames_upscaled/000003.png'
duration 0.042000
...
```
I should note that in the case of VFR there is more than just frame time. There are two parameters: pts and dts (and they may not match).
* pts is the presentation time stamp, that is, how the frames should be displayed.
* dts is a decoding time stamp, that is, in what order the frames should be decoded.
And apparently the frames are stored in dts order, which complicates things for me.
Then merge video like this:
```
ffmpeg \
-hide_banner \
-f "concat" \
-safe 0 \
-i "$FrameDurationList" \
-vsync vfr \
-r "42" \
-vcodec "$VideoCodec" \
-preset "$Preset" \
-pix_fmt "$PixelFormat" \
$(auto_bitrate) \
$(auto_x265params) \
"$VideoUpscaled"
```
This is the closest thing I could do (this option gives VFR video at the output, all other attempts continued to create CFR) but this is still a wrong option, since if you decompose it into frames again, you can see that their duration does not match the original video.
In addition, the -r parameter is specified here. In this case, it sets the maximum FPS (not average). I don't understand why it is needed, because all the information about the frame time is already exists in the concat file (!), but if you do not specify it, ffmpeg sets it to 25fps and this is definitely not what I need

View File

@ -15,65 +15,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
######## Filesystem ########
readonly DepsDir="$BaseDir/dependencies"
readonly ScriptsDir="$BaseDir/scripts"
readonly SettingsDir="$BaseDir/settings"
readonly OutputDir="$BaseDir/output"
DEF='\e[0m'; BLD='\e[1m'; RED='\e[31m'; GRN='\e[32m'; YLW='\e[33m'; WHT='\e[97m'
readonly FramesDir="$OutputDir/frames"
readonly AudioDir="$OutputDir/audio"
readonly VideoDir="$OutputDir/video"
readonly SubtitlesDir="$OutputDir/subtitles"
readonly ChaptersDir="$OutputDir/chapters"
readonly AttachmentsDir="$OutputDir/attachments"
readonly ReleaseDir="$OutputDir/release"
readonly PreviewDir="$OutputDir/preview"
readonly FramesUpscaledDir="${FramesDir}_upscaled"
readonly VideoUpscaledDir="${VideoDir}_upscaled"
readonly FormatJson="$OutputDir/format.json"
readonly StreamsJson="$OutputDir/streams.json"
readonly ChaptersJson="$OutputDir/chapters.json"
readonly RangesList="$OutputDir/ranges.list"
readonly DepsConf="$SettingsDir/deps.conf"
readonly Waifu2xConf="$SettingsDir/waifu2x-caffe.conf"
readonly PreviewConf="$SettingsDir/preview.conf"
readonly FfmpegConf="$SettingsDir/ffmpeg.conf"
readonly RangeGenConf="$SettingsDir/range-gen.conf"
######## Return codes ########
SUCCESS=0
OPTION_ERROR=1
PARAMETER_ERROR=2
EXTRACT_AUDIO_ERROR=3
EXTRACT_VIDEO_ERROR=4
EXTRACT_SUBTITLE_ERROR=5
EXTRACT_ATTACHMENT_ERROR=6
UNKNOWN_CODEC_TYPE_ERROR=7
NO_EXTENSION_FOR_CODEC=8
CONVERT_TO_FRAMES_ERROR=9
FILE_READ_ERROR=10
RANGES_LIST_SYNTAX_ERROR=11
SETTINGS_ERROR=12
WAIFU2X_ERROR=13
MERGE_RELEASE_ERROR=14
NO_INFO_ERROR=15
INTERRUPT=16
CREATE_UPSCALED_VIDEO_ERROR=17
######## Functions ########
function clean_line ()
function clean_line () # $1: Fill size
{
printf "\r%$(tput cols)s\r" ""
}
function model_path () # $1: model name
{
echo "$(dirname $(readlink -e $(which waifu2x-caffe-cui)))/models/$1"
printf "\r%$1s\r" ""
}
function framerate ()
@ -88,87 +34,3 @@ function framerate ()
fi
done
}
function png_num () # $1: String
{
echo "$1" | \
sed 's|.png||' | \
sed -r 's|0*([1-9][0-9]*)|\1|'
}
function check_ranges ()
{
local Errors=0
local ParamCount=0
local LineIndex=0
local LastEndFrame=""
while read Line
do
((LineIndex++))
local RangeInfo=($Line)
local ParamCount=${#RangeInfo[@]}
if [[ "$ParamCount" -eq 0 ]]; then
continue
elif [[ "$ParamCount" -eq 2 ]] || [[ "$ParamCount" -eq 3 ]]; then
local StartFrame=$(png_num ${RangeInfo[0]})
local EndFrame=$(png_num ${RangeInfo[1]})
local NoiseLevel=$(png_num ${RangeInfo[2]})
if [[ "$StartFrame" =~ ^[0-9]+$ ]]; then
if [[ -n "$LastEndFrame" ]] && [[ $(($LastEndFrame+1)) != $StartFrame ]]; then
echo "ERR [$LineIndex]: StartFrame ($StartFrame) doesn't follow the previous one ($LastEndFrame)"
((Errors++))
fi
else
echo "ERR [$LineIndex]: StartFrame $StartFrame is not valid integer"
((Errors++))
fi
if [[ "$EndFrame" =~ ^[0-9]+$ ]]; then
LastEndFrame="$EndFrame"
else
LastEndFrame=""
echo "ERR [$LineIndex]: EndFrame $EndFrame is not valid integer"
((Errors++))
fi
if [[ "$NoiseLevel" =~ ^[0-9]+$ ]]; then
if [[ "$NoiseLevel" -lt 0 ]] || [[ "$NoiseLevel" -gt 3 ]]; then
echo "ERR [$LineIndex]: NoiseLevel $NoiseLevel incorrect value (should be in the range 0-3)"
((Errors++))
fi
elif [[ -n "$NoiseLevel" ]]; then
echo "ERR [$LineIndex]: NoiseLevel $NoiseLevel is not valid integer"
((Errors++))
fi
else
echo "ERR [$LineIndex]: $ParamCount parameters received (2 or 3 expected)"
((Errors++))
fi
done < <(cat "$RangesList"; echo) # make bash not skip the last line (if there is no empty line at the end)
if [[ "$Errors" -gt 0 ]]; then
echo "Ranges list syntax: $Errors errors"
fi
return "$Errors"
}
######## Includes ########
source "$DepsConf"
######## Initialization ########
if [[ -n "$Waifu2xCaffeDir" ]]; then
PATH="$PATH:$(readlink -e $Waifu2xCaffeDir)"
fi
if [[ -n "$MkvToolNixDir" ]]; then
PATH="$PATH:$(readlink -e $MkvToolNixDir)"
fi
if [[ -n "$FfmpegDir" ]]; then
PATH="$PATH:$(readlink -e $FfmpegDir)"
fi
if [[ -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then
DEF='\e[0m'; BLD='\e[1m'; RED='\e[31m'; GRN='\e[32m'; YLW='\e[33m'; WHT='\e[97m'
else
DEF=''; BLD=''; RED=''; GRN=''; YLW=''; WHT=''
fi

View File

@ -36,13 +36,12 @@ function extract_attachments ()
{
pushd "$AttachmentsDir"
# Disable error checking
ffmpeg -hide_banner -dump_attachment:t "" -i "$InputFile"
# There is no error checking,
# because ffmpeg always throws an error:
# "At least one output file must be specified",
# although it successfully saves attachments.
set +e
ffmpeg -hide_banner -dump_attachment:t "" -i "$InputFile"
set -e
popd
}
@ -53,6 +52,22 @@ function extract_chapters ()
echo "DUMMY"
}
function extract_framedurations () # $1: stream index
{
local FileIndex=0
echo "ffconcat version 1.0" > "$FrameDurationList"
while read Line
do
if echo "$Line" | grep -qF 'pts_time='; then
((FileIndex++))
printf "file \'./$(basename $FramesUpscaledDir)/%06d.png\'\n" "$FileIndex" >> "$FrameDurationList"
echo "inpoint $(echo "$Line" | grep -Po '\d+\.\d+')" >> "$FrameDurationList"
elif echo "$Line" | grep -qF 'duration_time='; then
echo "duration $(echo "$Line" | grep -Po '\d+\.\d+')" >> "$FrameDurationList"
fi
done < <(ffprobe -v quiet -show_entries packet=pts_time,duration_time -select_streams "$Index" "$InputFile")
}
if [[ -z "$1" ]]; then
echo "You must specify the video file"
exit "$PARAMETER_ERROR"
@ -90,6 +105,7 @@ do
case "$Type" in
video )
extract_framedurations "$Index"
ffmpeg -hide_banner -i "$InputFile" -map "0:$Index" -c:v copy "$VideoDir/$Index.$Extension"
if [[ "$?" != 0 ]]; then exit "$EXTRACT_AUDIO_ERROR"; fi ;;
audio )

View File

@ -17,6 +17,15 @@
InputFile=$(find "$VideoDir" -mindepth 1 -maxdepth 1 -type f | head -n 1)
if ! [[ -r "$InputFile" ]]; then
echo "Read file error: \"$InputFile\""
exit "$FILE_READ_ERROR"
fi
rm -rf "$FramesDir"; mkdir -p "$FramesDir"
ffmpeg -hide_banner -i "$InputFile" -r "$(framerate)" -f image2 "$FramesDir/%06d.png"
# passthrough
ffmpeg -hide_banner -i "$InputFile" -r "$(framerate)" -f image2 -vsync vfr "$FramesDir/%06d.png"
if [[ "$?" != 0 ]]; then
exit "$CONVERT_TO_FRAMES_ERROR"
fi

View File

@ -1,135 +0,0 @@
#!/bin/bash
# This file is part of video2d-2x.
#
# video2d-2x is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
source "$Waifu2xConf"
source "$PreviewConf"
readonly TmpFramesSrcDir="${PreviewDir}_tmpsrc"
readonly TmpFramesOutDir="${PreviewDir}_tmpout"
if ! [[ -r "$RangesList" ]]; then
echo "Read file error: \"$RangesList\""
exit "$FILE_READ_ERROR"
fi
if ! check_ranges; then
exit "$RANGES_LIST_SYNTAX_ERROR"
fi
rm -rf "$PreviewDir" "$TmpFramesSrcDir" "$TmpFramesOutDir"
mkdir -p "$PreviewDir" "$TmpFramesSrcDir" "$TmpFramesOutDir"
# Prepare frames
CopyList=""
while read Line
do
if [[ -z "$Line" ]]; then
continue
fi
RangeInfo=($Line)
StartFrame=$(png_num ${RangeInfo[0]})
EndFrame=$(png_num ${RangeInfo[1]})
TargetFrame=$((StartFrame + (EndFrame - StartFrame)/2))
CopyList+="$(printf "%06d" $TargetFrame).png " # faster than copying one by one
done < <(cat "$RangesList"; echo) # make bash not skip the last line (if there is no empty line at the end)
pushd "$FramesDir" > /dev/null
cp -f $CopyList "$TmpFramesSrcDir"
popd > /dev/null
if echo "$UseRangeNumbers" | grep -qiF "True"; then
pushd "$TmpFramesSrcDir" > /dev/null
Index=0
while read File
do
((Index+=1))
mv "$File" "$(printf "%06d" $Index).png"
done < <(find "$TmpFramesSrcDir" -type f -name '*.png' -printf '%f\n')
popd > /dev/null
fi
# Upscale (scale)
if echo "$Waifu2xScalePreview" | grep -qiF "True" && [[ "$ScaleRatio" -ne 1 ]]; then
echo "waifu2x scale"
waifu2x-caffe-cui \
--mode "scale" \
--scale_ratio "$ScaleRatio" \
--output_depth "$OutputDepth" \
--tta "$TtaMode" \
--gpu "$GpuNum" \
--process "$Process" \
--crop_size "$CropSize" \
--batch_size "$BatchSize" \
--model_dir "$(model_path $Model)" \
--input_path "$TmpFramesSrcDir" \
--output_path "$TmpFramesOutDir" \
> /dev/null
pushd "$TmpFramesOutDir" > /dev/null
while read Filename
do
NewFilename=$(echo "$Filename" | sed "s|.png|_scale${ScaleRatio}.png|")
mv "$Filename" "$PreviewDir/$NewFilename"
done < <(find "$TmpFramesOutDir" -type f -name '*.png' -printf "%f\n")
popd > /dev/null
fi
# Upscale (noise_scale)
for NoiseLevel in $Waifu2xNoiseScaleList
do
if [[ "$ScaleRatio" -eq 1 ]]; then
UpscaleMode="noise"
else
UpscaleMode="noise_scale"
fi
echo "waifu2x $UpscaleMode $NoiseLevel"
waifu2x-caffe-cui \
--mode "$UpscaleMode" \
--scale_ratio "$ScaleRatio" \
--output_depth "$OutputDepth" \
--noise_level "$NoiseLevel" \
--tta "$TtaMode" \
--gpu "$GpuNum" \
--process "$Process" \
--crop_size "$CropSize" \
--batch_size "$BatchSize" \
--model_dir "$(model_path $Model)" \
--input_path "$TmpFramesSrcDir" \
--output_path "$TmpFramesOutDir" \
> /dev/null
pushd "$TmpFramesOutDir" > /dev/null
while read Filename
do
NewFilename=$(echo "$Filename" | sed "s|.png|_scale${ScaleRatio}_noise${NoiseLevel}.png|")
mv "$Filename" "$PreviewDir/$NewFilename"
done < <(find "$TmpFramesOutDir" -type f -name '*.png' -printf "%f\n")
popd > /dev/null
done
if echo "$ResizePreivew" | grep -qiF "True"; then
echo "scale original"
mogrify -scale $(echo "$ScaleRatio * 100" | bc)% "$TmpFramesSrcDir"/*.png
pushd "$TmpFramesSrcDir" > /dev/null
mv *.png "$PreviewDir"
popd > /dev/null
fi
rm -rf "$TmpFramesSrcDir" "$TmpFramesOutDir"

View File

@ -15,15 +15,19 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# TODO: auto-detect ranges
# compare adjacent frames using the duplicate image search algorithm
# frames that are unlike each other will be the boundaries of the ranges
# Range list format:
# START_FRAME END_FRAME NOISE_LEVEL
# (separate line for each range)
# (NOISE_LEVEL is optional)
function add_range () # $1: Start frame, $2: End frame, $3: Noise level
{
echo -e "$1\t$2\t$3" >> "$RangesList"
}
source "$RangeGenConf"
if [[ -n "$NoiseLevel" ]]; then
"$DepsDir/range-gen/range-gen.exe" -j "$Jobs" -n "$NoiseLevel" "$FramesDir" "$RangesList" "$Threshold"
else
"$DepsDir/range-gen/range-gen.exe" -j "$Jobs" "$FramesDir" "$RangesList" "$Threshold"
fi
"$DepsDir/range-gen/range-gen.exe" -j "$Jobs" -n "$NoiseLevel" "$FramesDir" "$RangesList" "$Threshold"

18
scripts/returncodes.lib Normal file
View File

@ -0,0 +1,18 @@
SUCCESS=0
OPTION_ERROR=1
PARAMETER_ERROR=2
EXTRACT_AUDIO_ERROR=3
EXTRACT_VIDEO_ERROR=4
EXTRACT_SUBTITLE_ERROR=5
EXTRACT_ATTACHMENT_ERROR=6
UNKNOWN_CODEC_TYPE_ERROR=7
NO_EXTENSION_FOR_CODEC=8
CONVERT_TO_FRAMES_ERROR=9
FILE_READ_ERROR=10
RANGES_LIST_SYNTAX_ERROR=11
SETTINGS_ERROR=12
WAIFU2X_ERROR=13
MERGE_RELEASE_ERROR=14
NO_INFO_ERROR=15
INTERRUPT=16
CREATE_UPSCALED_VIDEO_ERROR=17

View File

@ -15,38 +15,53 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
source "$Waifu2xConf"
readonly TmpFramesDir="${FramesDir}_tmp"
readonly RowTemplate="\r%-8s%-8s%-12s%-8s%-8s\n"
readonly ColumnWidth=8
readonly RowTemplate="\r%-${ColumnWidth}s%-${ColumnWidth}s%-${ColumnWidth}s%-${ColumnWidth}s\n"
function upscale_mode () # $1: ScaleRatio, $2: NoiseLevel
function create_default_conf ()
{
local ScaleRatio="$1"
local NoiseLevel="$2"
echo "\
Process=\"cudnn\"\
GpuNum=\"0\"\
ScaleRatio=\"3\"\
OutputDepth=\"16\"\
Mode=\"noise_scale\"\
CropSize=\"256\"\
BatchSize=\"1\"\
Model=\"upresnet10\"\
TtaMode=\"0\"\
" > "$Waifu2xConf"
}
function to_int () # $1: String
{
echo "$1" | \
sed 's|.png||' | \
sed -r 's|0*([1-9][0-9]*)|\1|'
}
function set_range () # $@: Line
{
StartFrame=$(to_int "$1")
EndFrame=$(to_int "$2")
NoiseLevel=$(to_int "$3")
if [[ "$ScaleRatio" -ne 1 ]] && [[ -n "$NoiseLevel" ]]; then
echo "noise_scale"
return 0
fi
if [[ "$ScaleRatio" -eq 1 ]] && [[ -n "$NoiseLevel" ]]; then
echo "noise"
return 0
fi
if [[ "$ScaleRatio" -ne 1 ]] && [[ -z "$NoiseLevel" ]]; then
echo "scale"
return 0
fi
return 1
return $#
}
function model_path () # $1: model name
{
echo "$(dirname $(readlink -e $(which waifu2x-caffe-cui)))/models/$1"
}
function upscale_images () # $1: InputDir, $2: OutputDir, $3: ProgressBarPID, $4: ParentPID
{
waifu2x-caffe-cui \
--mode "$UpscaleMode" \
--scale_ratio "$ScaleRatio" \
--output_depth "$OutputDepth" \
--noise_level "$NoiseLevel" \
--mode "$Mode" \
--tta "$TtaMode" \
--gpu "$GpuNum" \
--process "$Process" \
@ -63,16 +78,69 @@ function upscale_images () # $1: InputDir, $2: OutputDir, $3: ProgressBarPID, $4
fi
}
function check_ranges ()
{
local Errors=0
local ParamCount=0
local LineIndex=0
local LastEndFrame=""
while read Line
do
((LineIndex++))
set_range $Line
ParamCount=$?
if [[ "$ParamCount" -eq 0 ]]; then
continue
fi
if [[ "$ParamCount" -eq 3 ]]; then
if [[ "$StartFrame" =~ ^[0-9]+$ ]]; then
if [[ -n "$LastEndFrame" ]] && [[ $(($LastEndFrame+1)) != $StartFrame ]]; then
echo "ERR [$LineIndex]: StartFrame ($StartFrame) doesn't follow the previous one ($LastEndFrame)"
((Errors++))
fi
else
echo "ERR [$LineIndex]: StartFrame $StartFrame is not valid integer"
((Errors++))
fi
if [[ "$EndFrame" =~ ^[0-9]+$ ]]; then
LastEndFrame="$EndFrame"
else
LastEndFrame=""
echo "ERR [$LineIndex]: EndFrame $EndFrame is not valid integer"
((Errors++))
fi
if [[ "$NoiseLevel" =~ ^[0-9]+$ ]]; then
if [[ "$NoiseLevel" -lt 0 ]] || [[ "$NoiseLevel" -gt 3 ]]; then
echo "ERR [$LineIndex]: NoiseLevel $NoiseLevel incorrect value (should be in the range 0-3)"
((Errors++))
fi
else
echo "ERR [$LineIndex]: NoiseLevel $NoiseLevel is not valid integer"
((Errors++))
fi
else
echo "ERR [$LineIndex]: $ParamCount parameters received (3 expected)"
((Errors++))
fi
done < <(cat "$RangesList"; echo) # make bash not skip the last line (if there is no empty line at the end)
if [[ "$Errors" -gt 0 ]]; then
echo "Ranges list syntax: $Errors errors"
fi
return "$Errors"
}
function progress_bar ()
{
local PreviousUpscaledFrame=""
local LastUpscaledFrame=""
local Total=$(png_num $LastOriginalFrame)
local Total=$(to_int $LastOriginalFrame)
while [[ "$LastUpscaledFrame" != "$LastOriginalFrame" ]]
do
LastUpscaledFrame=$(ls "$FramesUpscaledDir" | sort | tail -n 1)
if [[ "$PreviousUpscaledFrame" != "$LastUpscaledFrame" ]]; then
local Done=$(png_num $LastUpscaledFrame)
local Done=$(to_int $LastUpscaledFrame)
printf "\r[%3d%%] %d/%d" "$(($Done*100/$Total))" "$Done" "$Total"
PreviousUpscaledFrame="$LastUpscaledFrame"
fi
@ -80,11 +148,12 @@ function progress_bar ()
done
}
if ! [[ -r "$RangesList" ]]; then
echo "Read file error: \"$RangesList\""
exit "$FILE_READ_ERROR"
if ! [[ -e "$Waifu2xConf" ]]; then
create_default_conf
fi
source "$Waifu2xConf"
if ! check_ranges; then
exit "$RANGES_LIST_SYNTAX_ERROR"
fi
@ -92,6 +161,11 @@ fi
rm -rf "$TmpFramesDir"
mkdir -p "$FramesUpscaledDir"
if ! [[ -r "$RangesList" ]]; then
echo "Read file error: \"$RangesList\""
exit "$FILE_READ_ERROR"
fi
LastOriginalFrame=$(ls "$FramesDir" | sort | tail -n 1)
LastUpscaledFrame=$(ls "$FramesUpscaledDir" | sort | tail -n 1)
@ -100,43 +174,30 @@ if [[ "$LastUpscaledFrame" == "$LastOriginalFrame" ]]; then
exit "$SUCCESS"
fi
LastUpscaledFrame=$(png_num "$LastUpscaledFrame")
printf "${BLD}$RowTemplate${DEF}" "START" "END" "MODE" "NOISE" "ACTION"
LastUpscaledFrame=$(to_int "$LastUpscaledFrame")
echo "$WIDTH"
printf "${BLD}$RowTemplate${DEF}" "START" "END" "NOISE" "ACTION"
while read Line
do
if [[ -z "$Line" ]]; then
continue
fi
RangeInfo=($Line)
StartFrame=$(png_num ${RangeInfo[0]})
EndFrame=$(png_num ${RangeInfo[1]})
NoiseLevel=$(png_num ${RangeInfo[2]})
UpscaleMode=$(upscale_mode "$ScaleRatio" "$NoiseLevel")
if [[ -z "$NoiseLevel" ]]; then
NoiseLevel="0"
NoiseLevelDisplay="-"
else
NoiseLevelDisplay="$NoiseLevel"
fi
clean_line
set_range $Line
clean_line "$COLUMNS"
if [[ -n "$LastUpscaledFrame" ]] && [[ "$LastUpscaledFrame" -ge "$EndFrame" ]]; then
printf "$RowTemplate" "$StartFrame" "$EndFrame" "$UpscaleMode" "$NoiseLevelDisplay" "SKIP"
printf "$RowTemplate" "$StartFrame" "$EndFrame" "$NoiseLevel" "SKIP"
continue
fi
if [[ -n "$LastUpscaledFrame" ]] && [[ "$StartFrame" -lt "$LastUpscaledFrame" ]]; then
printf "$RowTemplate" "$StartFrame" "$(($LastUpscaledFrame-1))" "$UpscaleMode" "$NoiseLevelDisplay" "SKIP"
printf "$RowTemplate" "$LastUpscaledFrame" "$EndFrame" "$UpscaleMode" "$NoiseLevelDisplay" "CONTINUE"
printf "$RowTemplate" "$StartFrame" "$(($LastUpscaledFrame-1))" "$NoiseLevel" "SKIP"
printf "$RowTemplate" "$LastUpscaledFrame" "$EndFrame" "$NoiseLevel" "CONTINUE"
# if waifu2x-caffe was interrupted while saving the file, a corrupted file is saved
# so it's better to start by overwriting the last upscaled file
StartFrame="$LastUpscaledFrame"
else
printf "$RowTemplate" "$StartFrame" "$EndFrame" "$UpscaleMode" "$NoiseLevelDisplay"
printf "$RowTemplate" "$StartFrame" "$EndFrame" "$NoiseLevel"
fi
rm -rf "$TmpFramesDir"
@ -153,7 +214,7 @@ do
cp $CopyList "$TmpFramesDir"
popd > /dev/null
clean_line
clean_line "$COLUMNS"
(progress_bar) &
ProgressBarPID=$!

View File

@ -41,6 +41,7 @@ function auto_bitrate ()
elif [[ -n "$VideoBitrate" ]]; then
echo '-b:v' "$VideoBitrate"
else
echo "You must set ConstantRateFactor or VideoBitrate in ffmpeg.conf"
exit "$SETTINGS_ERROR"
fi
}
@ -55,12 +56,20 @@ rm -rf "$VideoUpscaledDir"; mkdir -p "$VideoUpscaledDir"
VideoUpscaled="$VideoUpscaledDir/video.mp4"
# -f "image2" \
# -framerate "$(framerate)" \
# -i "$FramesUpscaledDir/%06d.png" \
# -r "$(framerate)" \
# -vf fps="$(framerate)" \
#
ffmpeg \
-hide_banner \
-f "image2" \
-framerate "$(framerate)" \
-i "$FramesUpscaledDir/%06d.png" \
-r "$(framerate)" \
-f "concat" \
-safe 0 \
-i "$FrameDurationList" \
-vsync vfr \
-r "42" \
-vcodec "$VideoCodec" \
-preset "$Preset" \
-pix_fmt "$PixelFormat" \

View File

@ -2,4 +2,5 @@ VideoCodec="libx265"
Preset="slow"
PixelFormat="yuv420p10le"
ConstantRateFactor="16"
VideoBitrate=""
x265params="limit-sao=1:bframes=8:psy-rd=1:aq-mode=3"

View File

@ -1,7 +0,0 @@
### Preview gen settings ###
UseRangeNumbers="True" # (Instead of frame numbers)
ResizePreivew="False" # Resize original frames with ImageMagisk
Waifu2xScalePreview="False" # Generate preview for Waifu2x scale mode
Waifu2xNoiseScaleList="0 1 3" # Preview for Waifu2x noise_scale mode. Specify noise reduction levels in the list.

View File

@ -7,6 +7,7 @@ Process="cudnn"
GpuNum="0"
ScaleRatio="3"
OutputDepth="16"
Mode="noise_scale"
CropSize="256"
BatchSize="1"
Model="upresnet10"

View File

@ -19,13 +19,42 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
set -Eeuo pipefail
readonly ScriptName=$(basename "$0")
readonly ScriptVersion="0.2"
readonly ScriptVersion="0.1"
readonly BaseDir=$(dirname $(readlink -e "$0"))
source "$BaseDir/scripts/common.lib"
readonly DepsDir="$BaseDir/dependencies"
readonly ScriptsDir="$BaseDir/scripts"
readonly SettingsDir="$BaseDir/settings"
readonly OutputDir="$BaseDir/output"
readonly FramesDir="$OutputDir/frames"
readonly AudioDir="$OutputDir/audio"
readonly VideoDir="$OutputDir/video"
readonly SubtitlesDir="$OutputDir/subtitles"
readonly ChaptersDir="$OutputDir/chapters"
readonly AttachmentsDir="$OutputDir/attachments"
readonly ReleaseDir="$OutputDir/release"
readonly FramesUpscaledDir="${FramesDir}_upscaled"
readonly VideoUpscaledDir="${VideoDir}_upscaled"
readonly FormatJson="$OutputDir/format.json"
readonly StreamsJson="$OutputDir/streams.json"
readonly ChaptersJson="$OutputDir/chapters.json"
readonly FrameDurationList="$OutputDir/frameduration.list"
readonly RangesList="$OutputDir/ranges.list"
readonly Video2d2xConf="$SettingsDir/video2d-2x.conf"
readonly Waifu2xConf="$SettingsDir/waifu2x-caffe.conf"
readonly FfmpegConf="$SettingsDir/ffmpeg.conf"
readonly RangeGenConf="$SettingsDir/range-gen.conf"
source "$ScriptsDir/returncodes.lib"
source "$ScriptsDir/common.lib"
source "$Video2d2xConf"
function show_version ()
{
@ -38,7 +67,6 @@ function show_help ()
echo " -e, --extract <FILE> extract all resources from (video) FILE"
echo " -f, --frames convert extracted video to frames"
echo " -r, --ranges generate range list for frames"
echo " -p, --preview generate preview images for each range"
echo " -u, --upscale upscale frames with range settings"
echo " -v, --video generate upscaled video from upscaled frames"
echo " -m, --merge merge upscaled video with all extracted resources"
@ -46,6 +74,16 @@ function show_help ()
echo " -h, --help show help"
}
if [[ -n "$Waifu2xCaffeDir" ]]; then
PATH="$PATH:$(readlink -e $Waifu2xCaffeDir)"
fi
if [[ -n "$MkvToolNixDir" ]]; then
PATH="$PATH:$(readlink -e $MkvToolNixDir)"
fi
if [[ -n "$FfmpegDir" ]]; then
PATH="$PATH:$(readlink -e $FfmpegDir)"
fi
if [[ $# -eq 0 ]]; then show_help; exit 0; fi
case $1 in
-h|--help ) show_help ;;
@ -53,7 +91,6 @@ case $1 in
-e|--extract ) shift; source "$ScriptsDir/extract.sh" ;;
-f|--frames ) shift; source "$ScriptsDir/frames.sh" ;;
-r|--ranges ) shift; source "$ScriptsDir/ranges.sh" ;;
-p|--preview ) shift; source "$ScriptsDir/preview.sh" ;;
-u|--upscale ) shift; source "$ScriptsDir/upscale.sh" ;;
-v|--video ) shift; source "$ScriptsDir/video.sh" ;;
-m|--merge ) shift; source "$ScriptsDir/merge.sh" ;;