def __init__(self, url): self.url = url self.input = urllib2.urlopen(url) self.process_data = threading.Event() self.server = SimpleThreadedHTTPServer('', 8080, self.process_data) # Use jpegtran to perform lossless fast transformations on the image. # You can pipe together as many commands as you'd like here. self.jpegtran_transform = "jpegtran -flip horizontal | jpegtran -flip vertical" # PIL transformation options. These are quite a bit slower - not to mention # lossy - compared to jpegtran. self.pil_transform = False self.pil_quality = 90 self.pil_size = (1024,768)
class Camera(object): def __init__(self, url): self.url = url self.input = urllib2.urlopen(url) self.process_data = threading.Event() self.server = SimpleThreadedHTTPServer('', 8080, self.process_data) # Use jpegtran to perform lossless fast transformations on the image. # You can pipe together as many commands as you'd like here. self.jpegtran_transform = "jpegtran -flip horizontal | jpegtran -flip vertical" # PIL transformation options. These are quite a bit slower - not to mention # lossy - compared to jpegtran. self.pil_transform = False self.pil_quality = 90 self.pil_size = (1024,768) def run(self): self.server.start() while True: # Block until the server indicates we have at least one client. self.process_data.wait() # Note: This exact sequence works for newiswh Vivotek cameras. # I'm sure there is a much better way of doing this. self.input.readline() self.input.readline() content_length = int(self.input.readline().split(": ")[1].strip()) self.input.readline() if self.jpegtran_transform: transformations = subprocess.Popen(self.jpegtran_transform, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) data, _ = transformations.communicate(self.input.read(content_length)) else: data = self.input.read(content_length) if self.pil_transform: output = StringIO.StringIO() im = Image.open(io.BytesIO(data)) if self.pil_size: im = im.resize(self.pil_size) im.save(output, format="jpeg", quality=self.pil_quality) self.server.add(output.getvalue()) else: self.server.add(data)