/[escript]/trunk/tools/vizTools/make_movie.py
ViewVC logotype

Annotation of /trunk/tools/vizTools/make_movie.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 150 - (hide annotations)
Thu Sep 15 03:44:45 2005 UTC (15 years, 2 months ago) by jgs
Original Path: trunk/esys2/tools/vizTools/make_movie.py
File MIME type: text/x-python
File size: 4233 byte(s)
Merge of development branch dev-02 back to main trunk on 2005-09-15

1 jgs 123 #!/usr/bin/env python
2    
3 jgs 147 # $Id$
4    
5 jgs 123 """
6 jgs 149 Make an mpeg movie from the pnm files in the specified directory
7 jgs 123 """
8    
9     import os, sys, re
10     import getopt
11    
12     (opts, args) = getopt.getopt(sys.argv[1:],
13 jgs 149 "s:d:o:f:p:h",
14     ["framestem=", "dirname=", "output=", "format=", "pad=", "help"],
15 jgs 123 )
16    
17     def usage():
18     print "Usage:"
19 jgs 147 print " make_movie -s <framestem> -o <output filename> -f <format> -p <pad>\n"
20 jgs 123 print " Arguments:"
21     print " -s/--framestem: The frame filename stem (the stuff before .pnm) (required)"
22 jgs 149 print " -d/--dirname: The directory of frames (optional)"
23 jgs 123 print " -o/--output: Output mpeg filename (optional)"
24     print " -f/--format: Input frame image format (optional)"
25 jgs 147 print " -p/--pad: How many frames to pad the movie (optional)"
26 jgs 123
27 jgs 149 dirname = "./"
28 jgs 123 mpegName = None
29     fnameStem = None
30     format = "pnm" # if format not specified assume pnm
31 jgs 147 pad = 1
32 jgs 123
33     for option, arg in opts:
34     if option in ('-s', '--stem'):
35     fnameStem = arg
36 jgs 149 elif option in ('-d', '--dirname'):
37     dirname = arg
38 jgs 123 elif option in ('-o', '--output'):
39     mpegName = arg
40     elif option in ('-f', '--format'):
41     format = arg
42 jgs 147 elif option in ('-p', '--pad'):
43     pad = int(arg)
44 jgs 123 elif option in ('-h', '--help'):
45     usage()
46     sys.exit(0)
47    
48     if fnameStem is None:
49     print "You must supply the stem of the frame filenames\n"
50     usage()
51     sys.exit(0)
52     if mpegName is None:
53     mpegName = fnameStem + ".mpg"
54    
55     # determine the number of files to convert
56 jgs 149 dirList = os.listdir(dirname)
57 jgs 123 r = re.compile( "%s\\d+\\.%s"%(fnameStem,format) )
58     count = 0 # counter for the number of files found
59     fnames = []
60     for fname in dirList:
61     if r.match(fname):
62     fnames.append(fname)
63     count += 1
64    
65 jgs 147 if count == 0:
66     raise ValueError, "No matching files found"
67    
68 jgs 123 # do a conversion if necessary
69     if format != "pnm":
70     print "Converting frames to pnm"
71     r = re.compile("%s\\d+\\." % (fnameStem))
72     for fname in fnames:
73     # strip off the bit after the last dot
74     front = r.findall(fname)
75     front = front[0]
76     # make the conversion string to pass to 'convert'
77 jgs 150 convString = "convert %s/%s%s %s/%spnm" % \
78     (dirname, front, format, dirname, front)
79 jgs 123 retVal = os.system(convString)
80     if retVal != 0:
81     raise SystemError, "Conversion of %s%s failed" % (front, format)
82    
83     # use ppmtompeg to convert the pnms to a movie
84     print "Making movie"
85    
86     # now automatically generate the ppmtompeg params file
87     print "Generating params file..."
88    
89     # old pattern
90     # PATTERN IBBBPBBBPBBBPBBBPBBB
91    
92     paramsFileString = """REFERENCE_FRAME DECODED
93     FRAME_RATE 24
94     OUTPUT %s
95     PATTERN IBBPBBPBB
96     FORCE_ENCODE_LAST_FRAME
97     GOP_SIZE 20
98     BSEARCH_ALG CROSS2
99     PSEARCH_ALG TWOLEVEL
100     IQSCALE 10
101     PQSCALE 11
102     BQSCALE 16
103     RANGE 8
104     SLICES_PER_FRAME 1
105     BASE_FILE_FORMAT PNM
106     INPUT_DIR .
107     INPUT_CONVERT *
108     INPUT
109     """ % (mpegName)
110    
111     # need to determine the first number and last number of the list of files
112     # sort the files first just in case
113     fnames.sort()
114     firstFile = fnames[0]
115     lastFile = fnames[-1]
116    
117 jgs 147 r = re.compile("([a-zA-Z-_\.\d])(\\d+)(\\.\\w+)$")
118 jgs 123 firstNum = r.findall(firstFile)
119     firstNum = firstNum[0][1]
120     lastNum = r.findall(lastFile)
121     lastNum = lastNum[0][1]
122    
123 jgs 147
124 jgs 123 # finish off the params file string
125 jgs 147 if pad == 1:
126 jgs 149 paramsFileString += "%s/%s*.pnm [%s-%s]\n" % \
127     (dirname, fnameStem, firstNum, lastNum)
128 jgs 147 elif pad > 1:
129     # positive padding: add duplicate frames (slow the movie down)
130     for i in range(int(firstNum), int(lastNum)+1):
131     for j in range(pad):
132 jgs 149 paramsFileString += "%s/%s%04d.pnm\n" % (dirname, fnameStem, i)
133 jgs 147 elif pad < 1:
134     # negative padding: i.e. remove frames (speed the movie up)
135     for i in range(int(firstNum), int(lastNum)+1, abs(pad)):
136 jgs 149 paramsFileString += "%s/%s%04d.pnm\n" % (dirname, fnameStem, i)
137 jgs 123
138     paramsFileString += """END_INPUT
139     PIXEL HALF
140     ASPECT_RATIO 1
141     """
142    
143     # write the string to file
144 jgs 149 fp = open( "%s/%s.params" % (dirname,fnameStem,), "w" )
145 jgs 123 fp.write(paramsFileString + '\n')
146     fp.close()
147     print "Done params file generation"
148    
149     # now do the conversion to mpeg
150     print "Performing conversion to mpeg"
151 jgs 149 convertString = "ppmtompeg %s/%s.params" % (dirname, fnameStem)
152 jgs 123 result = os.system(convertString)
153     if result != 0:
154     print "An error occurred in mpeg conversion"
155    
156     # now clean up a bit
157     #for i in range(count):
158     # rmFname = "%s_%04d.ppm" % (fnameStem,i)
159     # os.unlink(rmFname)
160    
161     print "\nDone!"
162    

Properties

Name Value
svn:eol-style native
svn:executable *
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26