From 69c08778fcaccd35959235d6f03e0599a7370739 Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 15 May 2023 17:07:13 +0200 Subject: [PATCH] not working yet with new scaler --- bin/__pycache__/handler.cpython-311.pyc | Bin 16746 -> 23830 bytes bin/handler.py | 88 ++++++++++-------------- bin/lib/realesrgan-ncnn-vulkan.exe | Bin 0 -> 6161408 bytes fsrimagevideoupscaler-cli.py | 17 +++-- 4 files changed, 50 insertions(+), 55 deletions(-) create mode 100644 bin/lib/realesrgan-ncnn-vulkan.exe diff --git a/bin/__pycache__/handler.cpython-311.pyc b/bin/__pycache__/handler.cpython-311.pyc index 3e91cc5f996a4d4992acabd5350bc2018c34ff76..6868065bb7f72069aa1b07d585d34fd62b79cc92 100644 GIT binary patch literal 23830 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 S=sv{(lH3DX;nz2U+W!G`1j=9l diff --git a/bin/handler.py b/bin/handler.py index 8c444ee..b166fd0 100644 --- a/bin/handler.py +++ b/bin/handler.py @@ -32,7 +32,7 @@ class Handler: self.tmppath = "" self.videometa = {} - def handler(self, fsrpath, filepath, quality_mode, quality_setting, output_path, sharpening, scaling, filetype, threads=4 ): + def handler(self, fsrpath, filepath, quality_mode, quality_setting, output_path, sharpening, scaling, filetype, scalerEngine, threads=4 ): # Function to be called when using this class as this function automatically determines if file is video or image print( '\n\nFSRImageVideoUpscalerFrontend - V1.1.0\n\nCopyright 2023 FSRImageVideoUpscalerFrontend contributors\n\n\n\n' ); @@ -61,7 +61,7 @@ class Handler: # Determining filetype if str(filepath)[len(filepath) - 4:] == ".mp4" or str(filepath)[len(filepath) - 4:] == ".mkv" or str(filepath)[len(filepath) - 4:] == ".MP4": print( '\n\n==> Upscaling video' ) - self.video_scaling( fsrpath, filepath, quality_mode, quality_setting, output_path, threads, sharpening, scaling, filetype ) + self.video_scaling( fsrpath, filepath, quality_mode, quality_setting, output_path, threads, sharpening, scaling, filetype, scalerEngine ) elif str(filepath)[len(filepath) - 4:] == ".JPG" or str(filepath)[len(filepath) - 4:] == ".png" or str(filepath)[len(filepath) - 4:] == ".jpg" or str(filepath)[len(filepath) - 5:] == ".jpeg": print( '\n==>upscaling image' ) self.photo_scaling(fsrpath, filepath, quality_mode, quality_setting, output_path) @@ -91,7 +91,7 @@ class Handler: os.system(self.command) print( '\n\n==>Photo upscaled' ); - def video_scaling( self, fsrpath, filepath, quality_mode, quality_setting, output_path, threads, sharpening, scaling, filetype ): + def video_scaling( self, fsrpath, filepath, quality_mode, quality_setting, output_path, threads, sharpening, scaling, filetype, scalerEngine ): # DO NOT CALL THIS! Use Handler().handler() instead! # Splitting video into frames @@ -107,9 +107,9 @@ class Handler: print( '\n==> Created directory' ) if self.os_type == "linux": - self.command = f"ffmpeg -i {str(self.filepath)} {self.tmppath}ex%08d.{ filetype }" + self.command = f"ffmpeg -i {str(self.filepath)} {self.tmppath}ig%08d.{ filetype }" elif self.os_type == "win32": - self.command = f"ffmpeg -i {str(self.filepath)} \"{self.tmppath}ex%08d.{ filetype }\"" + self.command = f"ffmpeg -i {str(self.filepath)} \"{self.tmppath}ig%08d.{ filetype }\"" else: print("OS CURRENTLY UNSUPPORTED!") return False @@ -117,10 +117,24 @@ class Handler: os.system( self.command ) print( '\n==> Video split ' ) - self.fsrScaler( self.tmppath, filepath, threads, quality_mode, fsrpath, quality_setting, sharpening, scaling ) + + if ( scalerEngine == 'fsr' ): + self.fsrScaler( self.tmppath, filepath, threads, quality_mode, fsrpath, quality_setting, sharpening, scaling, filetype ) + elif ( scalerEngine == 'SS' ): + self.superScaler( self.tmppath, threads, quality_setting, self.os_type ) + else: + raise Exception( 'ERROR upscaling. scalerEngine invalid' ); # get Video's audio print( '\n\n==>Finished Upscaling individual images. \n==>Retrieving Video audio to append\n\n' ) + + try: + self.framerate = round(float(self.frames) / float(self.duration), 1) + except TypeError: + print( '\n\n=> using fallback method to get framerate' ) + self.infos = str( self.videometa.get( 'r_frame_rate' ) ) + self.framerate = float( self.infos[:len(self.infos) - 2] ) + time.sleep( 2 ); try: os.remove(f"{self.tmppath}audio.aac") @@ -148,7 +162,16 @@ class Handler: os.system( self.command ) - def fsrScaler ( self, tmppath, filepath, threads, quality_mode, fsrpath, quality_setting, sharpening, scaling ): + def superScaler ( self, tmppath, threads, quality_setting, os_platform ): + print( tmppath ); + if ( os_platform == 'win32' ): + self.command = f'realesrgan-ncnn-vulkan -i {tmppath} -o {tmppath}\\us -s {quality_setting} -j {threads}:{threads}:{threads}' + elif ( os_platform == 'linux' ): + self.command = f'wine ./bin/lib/realesrgan-ncnn-vulkan.exe -i {tmppath} -o {tmppath}/us -s {quality_setting} -j {threads}:{threads}:{threads}' + os.system( self.command ); + + + def fsrScaler ( self, tmppath, filepath, threads, quality_mode, fsrpath, quality_setting, sharpening, scaling, filetype ): # Locate Images and assemble FSR-Command self.file_list = [] self.filelist = os.listdir(tmppath) @@ -158,9 +181,9 @@ class Handler: for self.file in self.filelist: self.number += 1 if ( self.os_type == 'win32' ): - self.file_list.append( f"{self.tmppath}{self.file} {self.tmppath}us\\ig{str(self.number).zfill(8)}.{ filetype } " ); + self.file_list.append( f"{tmppath}{self.file} {tmppath}us\\ig{str(self.number).zfill(8)}.{ filetype } " ); else: - self.file_list.append( f"{self.tmppath}{self.file} {self.tmppath}us/ig{str(self.number).zfill(8)}.{ filetype } " ); + self.file_list.append( f"{tmppath}{self.file} {tmppath}us/ig{str(self.number).zfill(8)}.{ filetype } " ); if ( self.os_type == 'win32' ): self.maxlength = 8000 @@ -189,7 +212,7 @@ class Handler: time.sleep( 2 ); try: - os.mkdir( f'{self.tmppath}us' ) + os.mkdir( f'{tmppath}us' ) except FileExistsError: pass @@ -228,14 +251,14 @@ class Handler: print( f'\n\n\n==> Sharpening using { self.threads } threads <==\n\n' ); time.sleep( 2 ); - self.pathSharpening = self.tmppath + self.pathSharpening = tmppath if ( not scaling ): self.pathSharpening += 'us' time.sleep( 2 ); try: - os.mkdir( f'{self.tmppath}sh' ) + os.mkdir( f'{tmppath}sh' ) except FileExistsError: pass # Locate Images and assemble FSR-Command @@ -247,9 +270,9 @@ class Handler: for self.file in self.filelist: self.number += 1 if ( self.os_type == 'win32' ): - self.file_list.append( f"{self.pathSharpening}\\{self.file} {self.tmppath}sh\\ig{str(self.number).zfill(8)}.{ filetype } " ); + self.file_list.append( f"{self.pathSharpening}\\{self.file} {tmppath}sh\\ig{str(self.number).zfill(8)}.{ filetype } " ); else: - self.file_list.append( f"{self.pathSharpening}/{self.file} {self.tmppath}sh/ig{str(self.number).zfill(8)}.{ filetype } " ); + self.file_list.append( f"{self.pathSharpening}/{self.file} {tmppath}sh/ig{str(self.number).zfill(8)}.{ filetype } " ); if ( self.os_type == 'win32' ): self.maxlength = 8000 @@ -275,43 +298,6 @@ class Handler: self.pool.close(); self.pool.join(); - - # get Video's audio - print( '\n\n==>Finished Upscaling individual images. \n==>Retrieving Video audio to append\n\n' ) - time.sleep( 2 ); - try: - os.remove(f"{self.tmppath}audio.aac") - os.remove(f"{output_path}") - except FileNotFoundError: - pass - if self.os_type == 'linux': - self.command = f'ffmpeg -i {self.filepath} -vn -acodec copy {self.tmppath}audio.aac' - elif self.os_type == 'win32': - self.command = f'ffmpeg -i {self.filepath} -vn -acodec copy {self.tmppath}audio.aac' - else: - print( 'OS CURRENTLY UNSUPPORTED!' ) - return False - os.system( self.command ) - - # reassemble Video - - self.outputPath = self.tmppath - if ( sharpening != '' ): - self.outputPath += 'sh' - else: - self.outputPath += 'us' - - - print( '\n\n==> Reassembling Video... with framerate @', self.framerate, ' <==\n\n' ) - if self.os_type == 'linux': - self.command = f'ffmpeg -framerate {self.framerate} -i {self.outputPath}/ig%08d.{ filetype } { output_path } -i {self.tmppath}audio.aac' - elif self.os_type == 'win32': - self.command = f'ffmpeg -framerate {self.framerate} -i \"{self.outputPath}\\ig%08d.{ filetype }\" { output_path } -i {self.tmppath}audio.aac' - else: - print( 'OS CURRENTLY UNSUPPORTED!' ); - return False - os.system( self.command ) - def upscalerEngine ( quality_mode, files, fsrpath, quality_setting, number, maxlength, os_type ): diff --git a/bin/lib/realesrgan-ncnn-vulkan.exe b/bin/lib/realesrgan-ncnn-vulkan.exe new file mode 100644 index 0000000000000000000000000000000000000000..e8d351cff390432c531b140c1ebe609bbec4684e GIT binary patch literal 6161408 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