MpegImagePlugin.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. c = self.next()
  31. if c < 0:
  32. self.bits = 0
  33. continue
  34. self.bitbuffer = (self.bitbuffer << 8) + c
  35. self.bits += 8
  36. return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1
  37. def skip(self, bits: int) -> None:
  38. while self.bits < bits:
  39. self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1))
  40. self.bits += 8
  41. self.bits = self.bits - bits
  42. def read(self, bits: int) -> int:
  43. v = self.peek(bits)
  44. self.bits = self.bits - bits
  45. return v
  46. def _accept(prefix: bytes) -> bool:
  47. return prefix[:4] == b"\x00\x00\x01\xb3"
  48. ##
  49. # Image plugin for MPEG streams. This plugin can identify a stream,
  50. # but it cannot read it.
  51. class MpegImageFile(ImageFile.ImageFile):
  52. format = "MPEG"
  53. format_description = "MPEG"
  54. def _open(self) -> None:
  55. assert self.fp is not None
  56. s = BitStream(self.fp)
  57. if s.read(32) != 0x1B3:
  58. msg = "not an MPEG file"
  59. raise SyntaxError(msg)
  60. self._mode = "RGB"
  61. self._size = s.read(12), s.read(12)
  62. # --------------------------------------------------------------------
  63. # Registry stuff
  64. Image.register_open(MpegImageFile.format, MpegImageFile, _accept)
  65. Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"])
  66. Image.register_mime(MpegImageFile.format, "video/mpeg")