diff --git a/HISTORY.md b/HISTORY.md index 22601bc..3731c7c 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,8 @@ # History of versions # +* version 4.17.0 (2021-12-28) + * Added support for videos with "rotate" tag + * version 4.16.0 (2019-10-13) * Added support for creating HEVC video in Matroska files * Changed distribution permissions to GPLv3 only diff --git a/setup.py b/setup.py index 1fd63a6..6bf4706 100755 --- a/setup.py +++ b/setup.py @@ -85,7 +85,7 @@ except: setup( name='devedeng', - version='4.16.0', + version='4.17.0', description='A video DVD creator', long_description="A program that allows to create video DVDs", diff --git a/src/devedeng/avconv.py b/src/devedeng/avconv.py index a7bdd68..0f892be 100644 --- a/src/devedeng/avconv.py +++ b/src/devedeng/avconv.py @@ -178,6 +178,20 @@ class avconv(devedeng.avbase.avbase): vflip = False hflip = False + if (file_project.prerotation == 90): + if (cmd_line != ""): + cmd_line += ",fifo," + cmd_line += "transpose=1" + elif (file_project.prerotation == -90) or (file_project.prerotation == 270): + if (cmd_line != ""): + cmd_line += ",fifo," + cmd_line += "transpose=2" + elif (file_project.prerotation == 180): + if (cmd_line != ""): + cmd_line += ",fifo," + vflip = not vflip + hflip = not hflip + if (file_project.rotation == "rotation_90"): if (cmd_line != ""): cmd_line += ",fifo," @@ -187,8 +201,8 @@ class avconv(devedeng.avbase.avbase): cmd_line += ",fifo," cmd_line += "transpose=2" elif (file_project.rotation == "rotation_180"): - vflip = True - hflip = True + vflip = not vflip + hflip = not hflip if (file_project.mirror_vertical): vflip = not vflip diff --git a/src/devedeng/avprobe.py b/src/devedeng/avprobe.py index 132c5c4..2831111 100644 --- a/src/devedeng/avprobe.py +++ b/src/devedeng/avprobe.py @@ -88,7 +88,8 @@ class avprobe(devedeng.avbase.avbase): self.original_audiorate = 0 self.original_audiorate_uncompressed = 0 self.original_fps = 0 - self.original_aspect_ratio = 0 + self.original_aspect_ratio = None + self.prerotation = 0 self.config.append_static_log( "Getting data for {:s} with avprobe".format(file_name)) @@ -109,6 +110,10 @@ class avprobe(devedeng.avbase.avbase): self.original_length = -1 if (element["codec_type"] == "video"): + if "tags" in element: + tags = element["tags"] + if "rotate" in tags: + self.prerotation = int(tags["rotate"]) self.video_streams += 1 self.video_list.append(element["index"]) if (self.video_streams == 1): @@ -120,29 +125,25 @@ class avprobe(devedeng.avbase.avbase): self.original_fps = self.get_division( element["avg_frame_rate"]) if ("display_aspect_ratio" in element): - self.original_aspect_ratio = self.get_division( - element["display_aspect_ratio"]) + self.original_aspect_ratio = self.get_division(element["display_aspect_ratio"]) elif (element["codec_type"] == "audio"): self.audio_streams += 1 self.audio_list.append(element["index"]) if (self.audio_streams == 1): if ("bit_rate" in element): - self.original_audiorate = int( - float(element["bit_rate"])) / 1000 + self.original_audiorate = int(float(element["bit_rate"])) / 1000 self.original_audiorate_uncompressed = int( float(element["sample_rate"])) - self.original_size = str(self.original_width) + \ - "x" + str(self.original_height) - if (self.original_aspect_ratio is None) or (self.original_aspect_ratio <= 1.0): + self.original_size = str(self.original_width) + "x" + str(self.original_height) + if (self.original_aspect_ratio is None): if (self.original_height != 0): - self.original_aspect_ratio = ( - float(self.original_width)) / (float(self.original_height)) + self.original_aspect_ratio = (float(self.original_width)) / (float(self.original_height)) + else: + self.original_aspect_ratio = 1 - if (self.original_aspect_ratio is not None): - self.original_aspect_ratio = ( - float(int(self.original_aspect_ratio * 1000.0))) / 1000.0 + self.original_aspect_ratio = (float(int(self.original_aspect_ratio * 1000.0))) / 1000.0 if (len(self.video_list) == 0): return True # the file is not a video file; maybe an audio-only file or another thing diff --git a/src/devedeng/ffmpeg.py b/src/devedeng/ffmpeg.py index 5b14ec7..25b6e3f 100644 --- a/src/devedeng/ffmpeg.py +++ b/src/devedeng/ffmpeg.py @@ -178,6 +178,20 @@ class ffmpeg(devedeng.executor.executor): vflip = False hflip = False + if (file_project.prerotation == 90): + if (cmd_line != ""): + cmd_line += ",fifo," + cmd_line += "transpose=1" + elif (file_project.prerotation == -90) or (file_project.prerotation == 270): + if (cmd_line != ""): + cmd_line += ",fifo," + cmd_line += "transpose=2" + elif (file_project.prerotation == 180): + if (cmd_line != ""): + cmd_line += ",fifo," + vflip = not vflip + hflip = not hflip + if (file_project.rotation == "rotation_90"): if (cmd_line != ""): cmd_line += ",fifo," @@ -187,8 +201,8 @@ class ffmpeg(devedeng.executor.executor): cmd_line += ",fifo," cmd_line += "transpose=2" elif (file_project.rotation == "rotation_180"): - vflip = True - hflip = True + vflip = not vflip + hflip = not hflip if (file_project.mirror_vertical): vflip = not vflip @@ -207,16 +221,12 @@ class ffmpeg(devedeng.executor.executor): if (file_project.width_midle != file_project.original_width) or (file_project.height_midle != file_project.original_height): if (cmd_line != ""): cmd_line += ",fifo," - x = int((file_project.width_midle - - file_project.original_width) / 2) - y = int((file_project.height_midle - - file_project.original_height) / 2) + x = int((file_project.width_midle - file_project.original_width) / 2) + y = int((file_project.height_midle - file_project.original_height) / 2) if (x > 0) or (y > 0): - cmd_line += "pad=" + str(file_project.width_midle) + ":" + str( - file_project.height_midle) + ":" + str(x) + ":" + str(y) + ":0x000000" + cmd_line += "pad=" + str(file_project.width_midle) + ":" + str(file_project.height_midle) + ":" + str(x) + ":" + str(y) + ":0x000000" else: - cmd_line += "crop=" + str(file_project.width_midle) + ":" + str( - file_project.height_midle) + ":" + str(x) + ":" + str(y) + cmd_line += "crop=" + str(file_project.width_midle) + ":" + str(file_project.height_midle) + ":" + str(x) + ":" + str(y) if (file_project.width_final != file_project.width_midle) or (file_project.height_final != file_project.height_midle): if (cmd_line != ""): @@ -493,6 +503,7 @@ class ffmpeg(devedeng.executor.executor): self.command_var.append("1") self.command_var.append(output_file) + print(self.command_var) def _adjust_audio_bitrate(self, bitrate): br = [32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384] diff --git a/src/devedeng/ffprobe.py b/src/devedeng/ffprobe.py index 24f5615..29de50e 100644 --- a/src/devedeng/ffprobe.py +++ b/src/devedeng/ffprobe.py @@ -87,7 +87,8 @@ class ffprobe(devedeng.executor.executor): self.original_audiorate = 0 self.original_audiorate_uncompressed = 0 self.original_fps = 0 - self.original_aspect_ratio = 0 + self.original_aspect_ratio = None + self.prerotation = 0 self.config.append_static_log( "Getting data for {:s} with ffprobe".format(file_name)) @@ -108,6 +109,10 @@ class ffprobe(devedeng.executor.executor): self.original_length = -1 if (element["codec_type"] == "video"): + if "tags" in element: + tags = element["tags"] + if "rotate" in tags: + self.prerotation = int(tags["rotate"]) self.video_streams += 1 self.video_list.append(element["index"]) if (self.video_streams == 1): @@ -119,35 +124,32 @@ class ffprobe(devedeng.executor.executor): self.original_fps = self.get_division( element["avg_frame_rate"]) if ("display_aspect_ratio" in element): - self.original_aspect_ratio = self.get_division( - element["display_aspect_ratio"]) + self.original_aspect_ratio = self.get_division(element["display_aspect_ratio"]) elif (element["codec_type"] == "audio"): self.audio_streams += 1 self.audio_list.append(element["index"]) if (self.audio_streams == 1): if ("bit_rate" in element): - self.original_audiorate = int( - float(element["bit_rate"])) / 1000 + self.original_audiorate = int(float(element["bit_rate"])) / 1000 self.original_audiorate_uncompressed = int( float(element["sample_rate"])) - self.original_size = str(self.original_width) + \ - "x" + str(self.original_height) - if (self.original_aspect_ratio is None) or (self.original_aspect_ratio <= 1.0): + self.original_size = str(self.original_width) + "x" + str(self.original_height) + if (self.original_aspect_ratio is None): if (self.original_height != 0): - self.original_aspect_ratio = ( - float(self.original_width)) / (float(self.original_height)) + self.original_aspect_ratio = (float(self.original_width)) / (float(self.original_height)) + else: + self.original_aspect_ratio = 1 - if (self.original_aspect_ratio is not None): - self.original_aspect_ratio = ( - float(int(self.original_aspect_ratio * 1000.0))) / 1000.0 + self.original_aspect_ratio = (float(int(self.original_aspect_ratio * 1000.0))) / 1000.0 if (len(self.video_list) == 0): return True # the file is not a video file; maybe an audio-only file or another thing if self.original_length == -1: # if it was unable to detect the duration, try to use the human readable format command_line = ["ffprobe", file_name] + print(f"Launching {command_line}") (stdout, stderr) = self.launch_process(command_line, False) try: stdout2 = stdout.decode("utf-8") + \ @@ -155,14 +157,12 @@ class ffprobe(devedeng.executor.executor): except: stdout2 = stdout.decode("latin1") + \ "\n" + stderr.decode("latin1") - self.config.append_static_log( - "Using ffprobe human readable format: " + str(stdout2)) + self.config.append_static_log("Using ffprobe human readable format: " + str(stdout2)) for line in stdout2.split("\n"): line = line.strip() if line.startswith("Duration: "): self.original_length = self.get_time(line[10:]) break - self.config.append_static_log("Estimated length: {:d}; Resolution: {:s}".format( - self.original_length, self.original_size)) + self.config.append_static_log("Estimated length: {:d}; Resolution: {:s}".format(self.original_length, self.original_size)) return False # no error diff --git a/src/devedeng/file_movie.py b/src/devedeng/file_movie.py index 83f5947..89ee6ff 100644 --- a/src/devedeng/file_movie.py +++ b/src/devedeng/file_movie.py @@ -93,6 +93,7 @@ class file_movie(devedeng.interface_manager.interface_manager): self.add_group("actions", ["action_stop", "action_play_first", "action_play_previous", "action_play_again", "action_play_next", "action_play_last"], "action_stop") + self.prerotation = 0 self.add_integer_adjustment("volume", 100) if (self.disc_type == "dvd"): self.add_integer_adjustment("video_rate", 5000) @@ -174,6 +175,7 @@ class file_movie(devedeng.interface_manager.interface_manager): self.original_aspect_ratio = film_analizer.original_aspect_ratio self.original_videorate = film_analizer.original_videorate self.original_audiorate = film_analizer.original_audiorate + self.prerotation = film_analizer.prerotation self.original_audiorate_uncompressed = film_analizer.original_audiorate_uncompressed self.original_fps = film_analizer.original_fps @@ -399,33 +401,34 @@ class file_movie(devedeng.interface_manager.interface_manager): if (self.rotation == "rotation_90") or (self.rotation == "rotation_270"): midle_aspect_ratio = 1.0 / self.original_aspect_ratio + original_width = self.original_height + original_height = self.original_width else: + original_width = self.original_width + original_height = self.original_height midle_aspect_ratio = self.original_aspect_ratio if midle_aspect_ratio == 0: midle_aspect_ratio = 1 if self.scaling == "scale_picture": - self.width_midle = int(self.original_width) - self.height_midle = int(self.original_height) + self.width_midle = int(original_width) + self.height_midle = int(original_height) elif self.scaling == "add_black_bars": + print(f"Original width {original_width}x{original_height}; ratio original: {midle_aspect_ratio}; ratio nuevo: {self.aspect_ratio_final}") if midle_aspect_ratio > self.aspect_ratio_final: # add horizontal black bars, at top and bottom - self.width_midle = int(self.original_width) - self.height_midle = int( - self.original_height * midle_aspect_ratio / self.aspect_ratio_final) + self.width_midle = int(original_width) + self.height_midle = int(original_height * midle_aspect_ratio / self.aspect_ratio_final) else: # add vertical black bars, at left and right - self.width_midle = int( - self.original_width * self.aspect_ratio_final / midle_aspect_ratio) - self.height_midle = int(self.original_height) + self.width_midle = int(original_width * self.aspect_ratio_final / midle_aspect_ratio) + self.height_midle = int(original_height) else: # cut picture if midle_aspect_ratio > self.aspect_ratio_final: - self.width_midle = int( - self.original_width * self.aspect_ratio_final / midle_aspect_ratio) - self.height_midle = int(self.original_height) + self.width_midle = int(original_width * self.aspect_ratio_final / midle_aspect_ratio) + self.height_midle = int(original_height) else: - self.width_midle = int(self.original_width) - self.height_midle = int( - self.original_height * midle_aspect_ratio / self.aspect_ratio_final) + self.width_midle = int(original_width) + self.height_midle = int(original_height * midle_aspect_ratio / self.aspect_ratio_final) def set_type(self, obj=None, disc_type=None): if (disc_type is not None):