MpegImagePlugin.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # MPEG file handling
  6. #
  7. # History:
  8. # 95-09-09 fl Created
  9. #
  10. # Copyright (c) Secret Labs AB 1997.
  11. # Copyright (c) Fredrik Lundh 1995.
  12. #
  13. # See the README file for information on usage and redistribution.
  14. #
  15. from __future__ import annotations
  16. from . import Image, ImageFile
  17. from ._binary import i8
  18. from ._typing import SupportsRead
  19. #
  20. # Bitstream parser
  21. class BitStream:
  22. def __init__(self, fp: SupportsRead[bytes]) -> None:
  23. self.fp = fp
  24. self.bits = 0
  25. self.bitbuffer = 0
  26. def next(self) -> int:
  27. return i8(self.fp.read(1))
  28. def peek(self, bits: int) -> int:
  29. while self.bits < bits:
  30. self.bitbuffer = (self.bitbuffer << 8) + self.next()
  31. self.bits += 8
  32. return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1
  33. def skip(self, bits: int) -> None:
  34. while self.bits < bits:
  35. self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1))
  36. self.bits += 8
  37. self.bits = self.bits - bits
  38. def read(self, bits: int) -> int:
  39. v = self.peek(bits)
  40. self.bits = self.bits - bits
  41. return v
  42. def _accept(prefix: bytes) -> bool:
  43. return prefix.startswith(b"\x00\x00\x01\xb3")
  44. ##
  45. # Image plugin for MPEG streams. This plugin can identify a stream,
  46. # but it cannot read it.
  47. class MpegImageFile(ImageFile.ImageFile):
  48. format = "MPEG"
  49. format_description = "MPEG"
  50. def _open(self) -> None:
  51. assert self.fp is not None
  52. s = BitStream(self.fp)
  53. if s.read(32) != 0x1B3:
  54. msg = "not an MPEG file"
  55. raise SyntaxError(msg)
  56. self._mode = "RGB"
  57. self._size = s.read(12), s.read(12)
  58. # --------------------------------------------------------------------
  59. # Registry stuff
  60. Image.register_open(MpegImageFile.format, MpegImageFile, _accept)
  61. Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"])
  62. Image.register_mime(MpegImageFile.format, "video/mpeg")