Merge branch 'support_rotated_videos' into 'master'
Add support for rotated videos See merge request rastersoft/devedeng!82
This commit is contained in:
commit
d49a810443
7 changed files with 89 additions and 57 deletions
|
|
@ -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
|
||||
|
|
|
|||
2
setup.py
2
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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue