Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
e13c2d517e | |||
0ad4d4771d | |||
ab46134e7b | |||
df579e6082 |
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
dependencies
|
||||||
|
input
|
||||||
|
output
|
36
scripts/common.lib
Normal file
36
scripts/common.lib
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
DEF='\e[0m'; BLD='\e[1m'; RED='\e[31m'; GRN='\e[32m'; YLW='\e[33m'; WHT='\e[97m'
|
||||||
|
|
||||||
|
function clean_line () # $1: Fill size
|
||||||
|
{
|
||||||
|
printf "\r%$1s\r" ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function framerate ()
|
||||||
|
{
|
||||||
|
local StreamCount=$(jq -r '.format.nb_streams' "$FormatJson")
|
||||||
|
|
||||||
|
for (( Index=0; Index < StreamCount; Index++ ))
|
||||||
|
do
|
||||||
|
if [[ $(jq -r ".streams[$Index].codec_type" "$StreamsJson") == "video" ]]; then
|
||||||
|
jq -r ".streams[$Index].r_frame_rate" "$StreamsJson"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
125
scripts/extract.sh
Normal file
125
scripts/extract.sh
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
function extension_by_codec () # $1: Codec
|
||||||
|
{
|
||||||
|
local Ext=""
|
||||||
|
for Mux in muxer demuxer
|
||||||
|
do
|
||||||
|
# Where is my json?!
|
||||||
|
Ext=$(
|
||||||
|
ffprobe -v quiet -h $Mux="$1" | \
|
||||||
|
grep 'Common extensions:' | \
|
||||||
|
sed -r 's|^.+: ([^,\.]+).+|\1|')
|
||||||
|
if [[ -n "$Ext" ]]; then
|
||||||
|
echo "$Ext"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function extract_attachments ()
|
||||||
|
{
|
||||||
|
pushd "$AttachmentsDir"
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
function extract_chapters ()
|
||||||
|
{
|
||||||
|
# TODO: Convert $ChaptersJson to mkv-compatible format?
|
||||||
|
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"
|
||||||
|
else
|
||||||
|
InputFile=$(readlink -e "$1")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [[ -r "$InputFile" ]]; then
|
||||||
|
echo "Read file error: \"$InputFile\""
|
||||||
|
exit "$FILE_READ_ERROR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$AudioDir"; mkdir -p "$AudioDir"
|
||||||
|
rm -rf "$VideoDir"; mkdir -p "$VideoDir"
|
||||||
|
rm -rf "$SubtitlesDir"; mkdir -p "$SubtitlesDir"
|
||||||
|
rm -rf "$ChaptersDir"; mkdir -p "$ChaptersDir"
|
||||||
|
rm -rf "$AttachmentsDir"; mkdir -p "$AttachmentsDir"
|
||||||
|
|
||||||
|
ffprobe -v quiet -print_format json -show_streams "$InputFile" > "$StreamsJson"
|
||||||
|
ffprobe -v quiet -print_format json -show_format "$InputFile" > "$FormatJson"
|
||||||
|
ffprobe -v quiet -print_format json -show_chapters "$InputFile" > "$ChaptersJson"
|
||||||
|
|
||||||
|
StreamCount=$(jq -r '.format.nb_streams' "$FormatJson")
|
||||||
|
|
||||||
|
for (( Index=0; Index < StreamCount; Index++ ))
|
||||||
|
do
|
||||||
|
Type=$(jq -r ".streams[$Index].codec_type" "$StreamsJson")
|
||||||
|
Codec=$(jq -r ".streams[$Index].codec_name" "$StreamsJson")
|
||||||
|
Extension=$(extension_by_codec "$Codec")
|
||||||
|
|
||||||
|
if [[ -z "$Extension" ]]; then
|
||||||
|
echo "No extension for codec \"$Codec\""
|
||||||
|
exit "$NO_EXTENSION_FOR_CODEC"
|
||||||
|
fi
|
||||||
|
|
||||||
|
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 )
|
||||||
|
ffmpeg -hide_banner -i "$InputFile" -map "0:$Index" -c:a copy "$AudioDir/$Index.$Extension"
|
||||||
|
if [[ "$?" != 0 ]]; then exit "$EXTRACT_VIDEO_ERROR"; fi ;;
|
||||||
|
subtitle )
|
||||||
|
ffmpeg -hide_banner -i "$InputFile" -map "0:$Index" "$SubtitlesDir/$Index.$Extension"
|
||||||
|
if [[ "$?" != 0 ]]; then exit "$EXTRACT_SUBTITLE_ERROR"; fi ;;
|
||||||
|
attachment )
|
||||||
|
continue ;;
|
||||||
|
* )
|
||||||
|
echo "Unknown codec type: \"$Type\""
|
||||||
|
exit "$UNKNOWN_CODEC_TYPE_ERROR" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
extract_attachments
|
31
scripts/frames.sh
Normal file
31
scripts/frames.sh
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
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"
|
||||||
|
# passthrough
|
||||||
|
ffmpeg -hide_banner -i "$InputFile" -r "$(framerate)" -f image2 -vsync vfr "$FramesDir/%06d.png"
|
||||||
|
|
||||||
|
if [[ "$?" != 0 ]]; then
|
||||||
|
exit "$CONVERT_TO_FRAMES_ERROR"
|
||||||
|
fi
|
35
scripts/merge.sh
Normal file
35
scripts/merge.sh
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
# temporary solution.
|
||||||
|
# TODO:
|
||||||
|
# Replace with creating mkv container
|
||||||
|
# with all resources using mkvmerge
|
||||||
|
|
||||||
|
rm -rf "$ReleaseDir"; mkdir -p "$ReleaseDir"
|
||||||
|
|
||||||
|
ffmpeg \
|
||||||
|
-hide_banner \
|
||||||
|
-i $(find "$VideoUpscaledDir" -type f | head -n 1) \
|
||||||
|
-i $(find "$AudioDir" -type f | head -n 1) \
|
||||||
|
-vcodec "copy" \
|
||||||
|
-acodec "copy" \
|
||||||
|
"$ReleaseDir/release.mp4"
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
exit "$MERGE_RELEASE_ERROR"
|
||||||
|
fi
|
33
scripts/ranges.sh
Normal file
33
scripts/ranges.sh
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
function add_range () # $1: Start frame, $2: End frame, $3: Noise level
|
||||||
|
{
|
||||||
|
echo -e "$1\t$2\t$3" >> "$RangesList"
|
||||||
|
}
|
||||||
|
|
||||||
|
source "$RangeGenConf"
|
||||||
|
|
||||||
|
"$DepsDir/range-gen/range-gen.exe" -j "$Jobs" -n "$NoiseLevel" "$FramesDir" "$RangesList" "$Threshold"
|
18
scripts/returncodes.lib
Normal file
18
scripts/returncodes.lib
Normal 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
|
32
scripts/test.sh
Normal file
32
scripts/test.sh
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
Symbols=16
|
||||||
|
|
||||||
|
function HammingDistance () # $1: Prev, $2: Current
|
||||||
|
{
|
||||||
|
local Dist=0
|
||||||
|
local PrevPart
|
||||||
|
local CurrentPart
|
||||||
|
for (( i=1; i<=$Symbols; i++ ))
|
||||||
|
do
|
||||||
|
PrevPart=$((16#$(echo "$1" | cut -c "$i")))
|
||||||
|
CurrentPart=$((16#$(echo "$2" | cut -c "$i")))
|
||||||
|
Offset=$(echo $((PrevPart-CurrentPart)) | sed 's|-||')
|
||||||
|
((Dist+=Offset))
|
||||||
|
done
|
||||||
|
echo "$Dist"
|
||||||
|
}
|
||||||
|
|
||||||
|
HashList="./hash.list"
|
||||||
|
PrevHash=$(printf "%0${Symbols}s" "")
|
||||||
|
:> "$HashList"
|
||||||
|
|
||||||
|
find "$FramesDir" -type f -printf "%f\n" | \
|
||||||
|
while read Image
|
||||||
|
do
|
||||||
|
Hash=$(./dependencies/go-perceptualhash/go-perceptualhash.exe --bits 8 --digest -f "$FramesDir/$Image")
|
||||||
|
Distance=$(HammingDistance "$PrevHash" "$Hash")
|
||||||
|
PrevHash="$Hash"
|
||||||
|
echo -e "$Image\t$Hash\t$Distance"
|
||||||
|
echo -e "$Image\t$Hash\t$Distance" >> "$HashList"
|
||||||
|
done
|
230
scripts/upscale.sh
Normal file
230
scripts/upscale.sh
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
readonly TmpFramesDir="${FramesDir}_tmp"
|
||||||
|
readonly ColumnWidth=8
|
||||||
|
readonly RowTemplate="\r%-${ColumnWidth}s%-${ColumnWidth}s%-${ColumnWidth}s%-${ColumnWidth}s\n"
|
||||||
|
|
||||||
|
function create_default_conf ()
|
||||||
|
{
|
||||||
|
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")
|
||||||
|
|
||||||
|
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 \
|
||||||
|
--scale_ratio "$ScaleRatio" \
|
||||||
|
--output_depth "$OutputDepth" \
|
||||||
|
--noise_level "$NoiseLevel" \
|
||||||
|
--mode "$Mode" \
|
||||||
|
--tta "$TtaMode" \
|
||||||
|
--gpu "$GpuNum" \
|
||||||
|
--process "$Process" \
|
||||||
|
--crop_size "$CropSize" \
|
||||||
|
--batch_size "$BatchSize" \
|
||||||
|
--model_dir "$(model_path $Model)" \
|
||||||
|
--input_path "$1" \
|
||||||
|
--output_path "$2" \
|
||||||
|
> /dev/null
|
||||||
|
local RT=$?
|
||||||
|
kill "$3" 2> /dev/null
|
||||||
|
if [[ "$RT" -ne 0 ]]; then
|
||||||
|
kill -1 "$4" 2> /dev/null
|
||||||
|
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=$(to_int $LastOriginalFrame)
|
||||||
|
while [[ "$LastUpscaledFrame" != "$LastOriginalFrame" ]]
|
||||||
|
do
|
||||||
|
LastUpscaledFrame=$(ls "$FramesUpscaledDir" | sort | tail -n 1)
|
||||||
|
if [[ "$PreviousUpscaledFrame" != "$LastUpscaledFrame" ]]; then
|
||||||
|
local Done=$(to_int $LastUpscaledFrame)
|
||||||
|
printf "\r[%3d%%] %d/%d" "$(($Done*100/$Total))" "$Done" "$Total"
|
||||||
|
PreviousUpscaledFrame="$LastUpscaledFrame"
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! [[ -e "$Waifu2xConf" ]]; then
|
||||||
|
create_default_conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
source "$Waifu2xConf"
|
||||||
|
|
||||||
|
if ! check_ranges; then
|
||||||
|
exit "$RANGES_LIST_SYNTAX_ERROR"
|
||||||
|
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)
|
||||||
|
|
||||||
|
if [[ "$LastUpscaledFrame" == "$LastOriginalFrame" ]]; then
|
||||||
|
echo "WARN: Upscaled frames already exists - skip."
|
||||||
|
exit "$SUCCESS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
LastUpscaledFrame=$(to_int "$LastUpscaledFrame")
|
||||||
|
echo "$WIDTH"
|
||||||
|
printf "${BLD}$RowTemplate${DEF}" "START" "END" "NOISE" "ACTION"
|
||||||
|
while read Line
|
||||||
|
do
|
||||||
|
if [[ -z "$Line" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
set_range $Line
|
||||||
|
clean_line "$COLUMNS"
|
||||||
|
if [[ -n "$LastUpscaledFrame" ]] && [[ "$LastUpscaledFrame" -ge "$EndFrame" ]]; then
|
||||||
|
printf "$RowTemplate" "$StartFrame" "$EndFrame" "$NoiseLevel" "SKIP"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "$LastUpscaledFrame" ]] && [[ "$StartFrame" -lt "$LastUpscaledFrame" ]]; then
|
||||||
|
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" "$NoiseLevel"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$TmpFramesDir"
|
||||||
|
mkdir "$TmpFramesDir"
|
||||||
|
|
||||||
|
echo -ne "\rCopying range..."
|
||||||
|
CopyList=""
|
||||||
|
for (( i=StartFrame; i <= EndFrame; i++))
|
||||||
|
do
|
||||||
|
CopyList+="$(printf "%06d" $i).png "
|
||||||
|
done
|
||||||
|
|
||||||
|
pushd "$FramesDir" > /dev/null
|
||||||
|
cp $CopyList "$TmpFramesDir"
|
||||||
|
popd > /dev/null
|
||||||
|
|
||||||
|
clean_line "$COLUMNS"
|
||||||
|
|
||||||
|
(progress_bar) &
|
||||||
|
ProgressBarPID=$!
|
||||||
|
|
||||||
|
(upscale_images "$TmpFramesDir" "$FramesUpscaledDir" "$ProgressBarPID" "$$") &
|
||||||
|
Waifu2xPID=$!
|
||||||
|
|
||||||
|
trap "kill $ProgressBarPID 2> /dev/null; exit $WAIFU2X_ERROR" HUP
|
||||||
|
trap "kill $Waifu2xPID $ProgressBarPID 2> /dev/null; echo -e '\nInterrupted'; exit $INTERRUPT" INT
|
||||||
|
wait 2> /dev/null
|
||||||
|
|
||||||
|
rm -rf "$TmpFramesDir"
|
||||||
|
done < <(cat "$RangesList"; echo) # make bash not skip the last line (if there is no empty line at the end)
|
82
scripts/video.sh
Normal file
82
scripts/video.sh
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#!/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/>.
|
||||||
|
|
||||||
|
function create_default_conf ()
|
||||||
|
{
|
||||||
|
echo "\
|
||||||
|
VideoCodec=\"libx265\"
|
||||||
|
Preset=\"slow\"
|
||||||
|
PixelFormat=\"yuv420p10le\"
|
||||||
|
ConstantRateFactor=\"16\"
|
||||||
|
VideoBitrate=\"\"
|
||||||
|
x265params=\"\"
|
||||||
|
" > "$FfmpegConf"
|
||||||
|
}
|
||||||
|
|
||||||
|
function auto_x265params ()
|
||||||
|
{
|
||||||
|
if [[ -n "$x265params" ]]; then
|
||||||
|
echo '-x265-params' "$x265params"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function auto_bitrate ()
|
||||||
|
{
|
||||||
|
if [[ -n "$ConstantRateFactor" ]]; then
|
||||||
|
echo '-crf' "$ConstantRateFactor"
|
||||||
|
elif [[ -n "$VideoBitrate" ]]; then
|
||||||
|
echo '-b:v' "$VideoBitrate"
|
||||||
|
else
|
||||||
|
echo "You must set ConstantRateFactor or VideoBitrate in ffmpeg.conf"
|
||||||
|
exit "$SETTINGS_ERROR"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! [[ -e "$FfmpegConf" ]]; then
|
||||||
|
create_default_conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
source "$FfmpegConf"
|
||||||
|
|
||||||
|
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 "concat" \
|
||||||
|
-safe 0 \
|
||||||
|
-i "$FrameDurationList" \
|
||||||
|
-vsync vfr \
|
||||||
|
-r "42" \
|
||||||
|
-vcodec "$VideoCodec" \
|
||||||
|
-preset "$Preset" \
|
||||||
|
-pix_fmt "$PixelFormat" \
|
||||||
|
$(auto_bitrate) \
|
||||||
|
$(auto_x265params) \
|
||||||
|
"$VideoUpscaled"
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
exit "$CREATE_UPSCALED_VIDEO_ERROR"
|
||||||
|
fi
|
6
settings/ffmpeg.conf
Normal file
6
settings/ffmpeg.conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
VideoCodec="libx265"
|
||||||
|
Preset="slow"
|
||||||
|
PixelFormat="yuv420p10le"
|
||||||
|
ConstantRateFactor="16"
|
||||||
|
VideoBitrate=""
|
||||||
|
x265params="limit-sao=1:bframes=8:psy-rd=1:aq-mode=3"
|
3
settings/range-gen.conf
Normal file
3
settings/range-gen.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Jobs="$(nproc)"
|
||||||
|
Threshold="365"
|
||||||
|
NoiseLevel="1"
|
9
settings/video2d-2x.conf
Normal file
9
settings/video2d-2x.conf
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
### Dependencies settings ###
|
||||||
|
|
||||||
|
# By default, the script will look for utilities (ffmpeg, waifu2x-caffe-cui, etc) in the $PATH,
|
||||||
|
# specify directories here if they are not accessible via $PATH.
|
||||||
|
# You can also specify a relative path, the directory with the "video2d-2x" script is the base directory.
|
||||||
|
|
||||||
|
Waifu2xCaffeDir="dependencies/waifu2x-caffe"
|
||||||
|
MkvToolNixDir="dependencies/mkvtoolnix"
|
||||||
|
FfmpegDir=""
|
14
settings/waifu2x-caffe.conf
Normal file
14
settings/waifu2x-caffe.conf
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
### Waifu2x-caffe settings ###
|
||||||
|
|
||||||
|
# you can read about each parameter here:
|
||||||
|
# https://github.com/lltcggie/waifu2x-caffe/blob/master/README-EN.md#command-line-options-common
|
||||||
|
|
||||||
|
Process="cudnn"
|
||||||
|
GpuNum="0"
|
||||||
|
ScaleRatio="3"
|
||||||
|
OutputDepth="16"
|
||||||
|
Mode="noise_scale"
|
||||||
|
CropSize="256"
|
||||||
|
BatchSize="1"
|
||||||
|
Model="upresnet10"
|
||||||
|
TtaMode="0"
|
101
video2d-2x
Normal file
101
video2d-2x
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# video2d-2x is a command line tool for upscaling videos using waifu2x.
|
||||||
|
# Copyright (C) 2020 GenZmeY
|
||||||
|
# mailto: genzmey@gmail.com
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
readonly ScriptName=$(basename "$0")
|
||||||
|
readonly ScriptVersion="0.1"
|
||||||
|
readonly BaseDir=$(dirname $(readlink -e "$0"))
|
||||||
|
|
||||||
|
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 ()
|
||||||
|
{
|
||||||
|
echo "$ScriptName v$ScriptVersion"
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_help ()
|
||||||
|
{
|
||||||
|
echo "$ScriptName - command line tool for upscaling videos using waifu2x"
|
||||||
|
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 " -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"
|
||||||
|
echo " -V, --version show version"
|
||||||
|
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 ;;
|
||||||
|
-V|--version ) show_version ;;
|
||||||
|
-e|--extract ) shift; source "$ScriptsDir/extract.sh" ;;
|
||||||
|
-f|--frames ) shift; source "$ScriptsDir/frames.sh" ;;
|
||||||
|
-r|--ranges ) shift; source "$ScriptsDir/ranges.sh" ;;
|
||||||
|
-u|--upscale ) shift; source "$ScriptsDir/upscale.sh" ;;
|
||||||
|
-v|--video ) shift; source "$ScriptsDir/video.sh" ;;
|
||||||
|
-m|--merge ) shift; source "$ScriptsDir/merge.sh" ;;
|
||||||
|
-t|--test ) shift; source "$ScriptsDir/test.sh" ;;
|
||||||
|
* ) echo "Command not recognized: $1" ; exit "$OPTION_ERROR";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit "$SUCCESS"
|
Loading…
Reference in New Issue
Block a user