# 
 | 
# The Python Imaging Library. 
 | 
# $Id$ 
 | 
# 
 | 
# MPEG file handling 
 | 
# 
 | 
# History: 
 | 
#       95-09-09 fl     Created 
 | 
# 
 | 
# Copyright (c) Secret Labs AB 1997. 
 | 
# Copyright (c) Fredrik Lundh 1995. 
 | 
# 
 | 
# See the README file for information on usage and redistribution. 
 | 
# 
 | 
  
 | 
__version__ = "0.1" 
 | 
  
 | 
import Image, ImageFile 
 | 
  
 | 
# 
 | 
# Bitstream parser 
 | 
  
 | 
class BitStream: 
 | 
  
 | 
    def __init__(self, fp): 
 | 
        self.fp = fp 
 | 
        self.bits = 0 
 | 
        self.bitbuffer = 0 
 | 
  
 | 
    def next(self): 
 | 
        return ord(self.fp.read(1)) 
 | 
  
 | 
    def peek(self, bits): 
 | 
        while self.bits < bits: 
 | 
            c = self.next() 
 | 
            if c < 0: 
 | 
                self.bits = 0 
 | 
                continue 
 | 
            self.bitbuffer = (self.bitbuffer << 8) + c 
 | 
            self.bits = self.bits + 8 
 | 
        return self.bitbuffer >> (self.bits - bits) & (1L << bits) - 1 
 | 
  
 | 
    def skip(self, bits): 
 | 
        while self.bits < bits: 
 | 
            self.bitbuffer = (self.bitbuffer << 8) + ord(self.fp.read(1)) 
 | 
            self.bits = self.bits + 8 
 | 
        self.bits = self.bits - bits 
 | 
  
 | 
    def read(self, bits): 
 | 
        v = self.peek(bits) 
 | 
        self.bits = self.bits - bits 
 | 
        return v 
 | 
  
 | 
## 
 | 
# Image plugin for MPEG streams.  This plugin can identify a stream, 
 | 
# but it cannot read it. 
 | 
  
 | 
class MpegImageFile(ImageFile.ImageFile): 
 | 
  
 | 
    format = "MPEG" 
 | 
    format_description = "MPEG" 
 | 
  
 | 
    def _open(self): 
 | 
  
 | 
        s = BitStream(self.fp) 
 | 
  
 | 
        if s.read(32) != 0x1B3: 
 | 
            raise SyntaxError, "not an MPEG file" 
 | 
  
 | 
        self.mode = "RGB" 
 | 
        self.size = s.read(12), s.read(12) 
 | 
  
 | 
  
 | 
# -------------------------------------------------------------------- 
 | 
# Registry stuff 
 | 
  
 | 
Image.register_open("MPEG", MpegImageFile) 
 | 
  
 | 
Image.register_extension("MPEG", ".mpg") 
 | 
Image.register_extension("MPEG", ".mpeg") 
 | 
  
 | 
Image.register_mime("MPEG", "video/mpeg") 
 |