[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25854] trunk/blender/release/scripts/io/ netrender: netrender: refactor thumbnail generation code.
Martin Poirier
theeth at yahoo.com
Sat Jan 9 19:21:28 CET 2010
Revision: 25854
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25854
Author: theeth
Date: 2010-01-09 19:21:27 +0100 (Sat, 09 Jan 2010)
Log Message:
-----------
netrender: refactor thumbnail generation code. New option to generate the thumbnail on the slaves (per slave option, default off). Missing thumbnails are still generated on demand by the master.
Modified Paths:
--------------
trunk/blender/release/scripts/io/netrender/master.py
trunk/blender/release/scripts/io/netrender/netrender.js
trunk/blender/release/scripts/io/netrender/slave.py
trunk/blender/release/scripts/io/netrender/ui.py
trunk/blender/release/scripts/io/netrender/utils.py
Modified: trunk/blender/release/scripts/io/netrender/master.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master.py 2010-01-09 18:17:40 UTC (rev 25853)
+++ trunk/blender/release/scripts/io/netrender/master.py 2010-01-09 18:21:27 UTC (rev 25854)
@@ -174,7 +174,8 @@
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
file_pattern = re.compile("/file_([a-zA-Z0-9]+)_([0-9]+)")
-render_pattern = re.compile("/render_([a-zA-Z0-9]+)_([0-9]+).(exr|jpg)")
+render_pattern = re.compile("/render_([a-zA-Z0-9]+)_([0-9]+).exr")
+thumb_pattern = re.compile("/thumb_([a-zA-Z0-9]+)_([0-9]+).jpg")
log_pattern = re.compile("/log_([a-zA-Z0-9]+)_([0-9]+).log")
reset_pattern = re.compile("/reset(all|)_([a-zA-Z0-9]+)_([0-9]+)")
cancel_pattern = re.compile("/cancel_([a-zA-Z0-9]+)")
@@ -231,8 +232,6 @@
job_id = match.groups()[0]
frame_number = int(match.groups()[1])
- exr = match.groups()[2] == "exr"
-
job = self.server.getJobID(job_id)
if job:
@@ -244,34 +243,52 @@
elif frame.status == DONE:
self.server.stats("", "Sending result to client")
- if exr:
- f = open(job.save_path + "%04d" % frame_number + ".exr", 'rb')
- self.send_head(content = "image/x-exr")
- else:
- filename = job.save_path + "%04d" % frame_number + ".jpg"
-
- if not os.path.exists(filename):
- import bpy
- sce = bpy.data.scenes[0]
- sce.render_data.file_format = "JPEG"
- sce.render_data.quality = 90
- bpy.ops.image.open(path = job.save_path + "%04d" % frame_number + ".exr")
- img = bpy.data.images["%04d" % frame_number + ".exr"]
- img.save(filename, scene = sce)
-
- try:
- process = subprocess.Popen(["convert", filename, "-resize", "300x300", filename])
- process.wait()
- except:
- pass
-
- f = open(filename, 'rb')
- self.send_head(content = "image/jpeg")
+ filename = job.save_path + "%04d" % frame_number + ".exr"
+
+ f = open(filename, 'rb')
+ self.send_head(content = "image/x-exr")
+ shutil.copyfileobj(f, self.wfile)
+ f.close()
+ elif frame.status == ERROR:
+ self.send_head(http.client.PARTIAL_CONTENT)
+ else:
+ # no such frame
+ self.send_head(http.client.NO_CONTENT)
+ else:
+ # no such job id
+ self.send_head(http.client.NO_CONTENT)
+ else:
+ # invalid url
+ self.send_head(http.client.NO_CONTENT)
+ # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ elif self.path.startswith("/thumb"):
+ match = thumb_pattern.match(self.path)
+ if match:
+ job_id = match.groups()[0]
+ frame_number = int(match.groups()[1])
- shutil.copyfileobj(f, self.wfile)
+ job = self.server.getJobID(job_id)
- f.close()
+ if job:
+ frame = job[frame_number]
+
+ if frame:
+ if frame.status in (QUEUED, DISPATCHED):
+ self.send_head(http.client.ACCEPTED)
+ elif frame.status == DONE:
+ filename = job.save_path + "%04d" % frame_number + ".exr"
+
+ thumbname = thumbnail(filename)
+
+ if thumbname:
+ f = open(thumbname, 'rb')
+ self.send_head(content = "image/jpeg")
+ shutil.copyfileobj(f, self.wfile)
+ f.close()
+ else: # thumbnail couldn't be generated
+ self.send_head(http.client.PARTIAL_CONTENT)
+ return
elif frame.status == ERROR:
self.send_head(http.client.PARTIAL_CONTENT)
else:
@@ -749,8 +766,6 @@
if not slave.id in job.blacklist:
job.blacklist.append(slave.id)
- self.server.stats("", "Receiving result")
-
slave.finishedFrame(job_frame)
frame.status = job_result
@@ -766,6 +781,44 @@
else: # invalid slave id
self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ elif self.path == "/thumb":
+ self.server.stats("", "Receiving thumbnail result")
+
+ # need some message content here or the slave doesn't like it
+ self.wfile.write(bytes("foo", encoding='utf8'))
+
+ slave_id = self.headers['slave-id']
+
+ slave = self.server.getSeenSlave(slave_id)
+
+ if slave: # only if slave id is valid
+ job_id = self.headers['job-id']
+
+ job = self.server.getJobID(job_id)
+
+ if job:
+ job_frame = int(self.headers['job-frame'])
+
+ frame = job[job_frame]
+
+ if frame:
+ if job.type == netrender.model.JOB_BLENDER:
+ length = int(self.headers['content-length'])
+ buf = self.rfile.read(length)
+ f = open(job.save_path + "%04d" % job_frame + ".jpg", 'wb')
+ f.write(buf)
+ f.close()
+
+ del buf
+
+ self.send_head()
+ else: # frame not found
+ self.send_head(http.client.NO_CONTENT)
+ else: # job not found
+ self.send_head(http.client.NO_CONTENT)
+ else: # invalid slave id
+ self.send_head(http.client.NO_CONTENT)
+ # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path.startswith("/log"):
self.server.stats("", "Receiving log file")
Modified: trunk/blender/release/scripts/io/netrender/netrender.js
===================================================================
--- trunk/blender/release/scripts/io/netrender/netrender.js 2010-01-09 18:17:40 UTC (rev 25853)
+++ trunk/blender/release/scripts/io/netrender/netrender.js 2010-01-09 18:21:27 UTC (rev 25854)
@@ -101,7 +101,7 @@
function toggleThumb(job, frame)
{
img = document.images["thumb" + frame];
- url = "/render_" + job + "_" + frame + ".jpg"
+ url = "/thumb_" + job + "_" + frame + ".jpg"
if (img.style.display == "block") {
img.style.display = "none";
Modified: trunk/blender/release/scripts/io/netrender/slave.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/slave.py 2010-01-09 18:17:40 UTC (rev 25853)
+++ trunk/blender/release/scripts/io/netrender/slave.py 2010-01-09 18:21:27 UTC (rev 25854)
@@ -213,14 +213,26 @@
headers["job-result"] = str(DONE)
for frame in job.frames:
headers["job-frame"] = str(frame.number)
-
if job.type == netrender.model.JOB_BLENDER:
# send image back to server
- f = open(JOB_PREFIX + "%06d" % frame.number + ".exr", 'rb')
+
+ filename = JOB_PREFIX + "%06d" % frame.number + ".exr"
+
+ # thumbnail first
+ if netsettings.slave_thumb:
+ thumbname = thumbnail(filename)
+
+ f = open(thumbname, 'rb')
+ conn.request("PUT", "/thumb", f, headers=headers)
+ f.close()
+ conn.getresponse()
+
+ f = open(filename, 'rb')
conn.request("PUT", "/render", f, headers=headers)
f.close()
if conn.getresponse().status == http.client.NO_CONTENT:
continue
+
elif job.type == netrender.model.JOB_PROCESS:
conn.request("PUT", "/render", headers=headers)
if conn.getresponse().status == http.client.NO_CONTENT:
Modified: trunk/blender/release/scripts/io/netrender/ui.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/ui.py 2010-01-09 18:17:40 UTC (rev 25853)
+++ trunk/blender/release/scripts/io/netrender/ui.py 2010-01-09 18:21:27 UTC (rev 25854)
@@ -140,6 +140,7 @@
netsettings = scene.network_render
layout.prop(netsettings, "slave_clear")
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list