Add support for rotated videos

This commit is contained in:
Sergio Costas 2022-03-02 15:03:12 +00:00
parent 568271ee80
commit 949684b55d
7 changed files with 89 additions and 57 deletions

View file

@ -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

View file

@ -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

View file

@ -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]

View file

@ -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

View file

@ -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):