summaryrefslogtreecommitdiffstats
path: root/abs/core/mythtv/stable-30/mythplugins/mythburn.py-aspectratio.patch
blob: 377de95d7f05d2d6bd898cc88cc51e985cce98e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
--- mythburn.py.orig	2013-12-16 22:41:31.532703825 +0000
+++ mythburn.py	2013-12-16 22:40:52.191109409 +0000
@@ -98,6 +98,7 @@
 from fcntl import ioctl
 import CDROM
 from shutil import copy
+from subprocess import Popen, PIPE
 
 import MythTV
 from MythTV import datetime
@@ -440,7 +441,7 @@
                 os.remove(os.path.join(root, name))
 
 #############################################################
-# Romoves all the objects from a directory
+# Removes all the objects from a directory
 
 def deleteEverythingInFolder(folder):
     for root, dirs, files in os.walk(folder, topdown=False):
@@ -666,14 +667,14 @@
 # Gets the aspect ratio of a video file from its stream info file
 
 def getAspectRatioOfVideo(index):
-    """Returns the aspect ratio of the video file (1.333, 1.778, etc)"""
+    """Returns the aspect ratio of the original video file (1.333, 1.778, etc)"""
 
     #open the XML containing information about this file
-    infoDOM = xml.dom.minidom.parse(os.path.join(getItemTempPath(index), 'streaminfo.xml'))
+    infoDOM = xml.dom.minidom.parse(os.path.join(getItemTempPath(index), 'streaminfo_orig.xml'))
 
     #error out if its the wrong XML
     if infoDOM.documentElement.tagName != "file":
-        fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo.xml'))
+        fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo_orig.xml'))
     video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0]
     if video.attributes["aspectratio"].value != 'N/A':
         aspect_ratio = float(video.attributes["aspectratio"].value)
@@ -1695,6 +1696,37 @@
         fatalError("Failed while running mytharchivehelper to get stream information.\n"
                    "Result: %d, Command was %s" % (result, command))
 
+    #open the XML containing information about this file
+    infoDOM = xml.dom.minidom.parse(xmlFilename)
+    
+    #error out if its the wrong XML
+    if infoDOM.documentElement.tagName != "file":
+        fatalError("This info file doesn't look right (%s)." % xmlFilename)
+    
+    file = infoDOM.getElementsByTagName("file")[0]
+    video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0]
+    
+    #use ffmpeg to get display aspect ratio (DAR) of video
+    cmd = "mythffmpeg -i " + quoteCmdArg(file.attributes["filename"].value) + " 2>&1"
+    aspect_ratio = Popen(cmd, shell=True, stdout=PIPE).stdout.read()
+    if "DAR" in aspect_ratio:
+        #clean DAR string
+        aspect_ratio = aspect_ratio.split("DAR ")[-1].split(",")[0]
+        aspect_ratio = ''.join([c for c in aspect_ratio if c in '1234567890:']).split(":")
+    else:
+        #calculate aspect from video size
+        aspect_ratio = getVideoSize(xmlFilename)
+
+    #convert to decimal+
+    aspect_ratio = float(aspect_ratio[0]) / float(aspect_ratio[1])
+
+    write("Video %s aspect ratio is: %s" % (filename, aspect_ratio))
+
+    #set aspect ratio
+    video.setAttribute("aspectratio",str(aspect_ratio))
+    
+    WriteXMLToFile (infoDOM,xmlFilename)
+
     # print out the streaminfo.xml file to the log
     infoDOM = xml.dom.minidom.parse(xmlFilename)
     write(xmlFilename + ":-\n" + infoDOM.toprettyxml("    ", ""), False)
@@ -2010,7 +2042,7 @@
 #############################################################
 # Re-encodes a file to mpeg2
 
-def encodeVideoToMPEG2(source, destvideofile, video, audio1, audio2, aspectratio, profile):
+def encodeVideoToMPEG2(source, destvideofile, video, folder, audio1, audio2, aspectratio, profile):
     """Encodes an unknown video source file eg. AVI to MPEG2 video and AC3 audio, use mythffmpeg"""
 
     profileNode = findEncodingProfile(profile)
@@ -2035,6 +2067,35 @@
             value = quoteCmdArg(destvideofile)
         if value == "%aspect":
             value = aspectratio
+        if value == "720x480" or value == "720x576":
+            videores, fps, videoAR = getVideoParams(folder)
+            videoWidth = int(videores.split("x")[0])
+            videoHeight = int(videores.split("x")[1])
+            
+            #add padding to correct for aspects > than 1.9:1
+            if float(videoAR) >= 1.9:
+                #check which video type and set the correct height
+                if videomode == "ntsc":
+                    videoModeHeight = 480
+                else:
+                    videoModeHeight = 576
+ 
+                #calculate the video height based on the aspect ratio of the video
+                #multiply by 1.185 to compensate for dvds non-square pixels
+                calVideoHeight = int(round((720 / float(videoAR)) * 1.185))
+                if calVideoHeight % 2 == 1:
+                    calVideoHeight = calVideoHeight + 1
+                #write("calVideoHeight: %s" % calVideoHeight)
+                
+                #use original video height if the calculated video height is close
+                if (calVideoHeight + 20 < videoHeight) or (calVideoHeight - 20 > videoHeight):
+                     videoHeight = calVideoHeight
+
+                cropPixels = videoModeHeight - videoHeight
+
+                write("Crop Pixels Total: %s" % cropPixels)
+                name = "-vf"
+                value = "\"scale=720:%d, setsar=1:1, pad=720:%d:0:%d:black\"" % (videoModeHeight - cropPixels, videoModeHeight, cropPixels / 2)
 
         # only re-encode the audio if it is not already in AC3 format
         if audio1[AUDIO_CODEC] == "AC3":
@@ -4608,7 +4669,7 @@
 
             #do the re-encode 
             encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video,
-                            audio1, audio2, aspectratio, profile)
+                            folder, audio1, audio2, aspectratio, profile)
             mediafile = os.path.join(folder, 'newfile2.mpg')
 
             #remove the old mediafile that was run through mythtranscode
@@ -4762,7 +4823,7 @@
 
             #do the re-encode 
             encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video,
-                            audio1, audio2, aspectratio, profile)
+                            folder, audio1, audio2, aspectratio, profile)
             mediafile = os.path.join(folder, 'newfile2.mpg')
 
     #remove an intermediate file