/Lib/plat-mac/Carbon/MediaDescr.py

http://unladen-swallow.googlecode.com/ · Python · 97 lines · 81 code · 13 blank · 3 comment · 8 complexity · 8934ed5aec262aef615fb0bb94fc9fea MD5 · raw file

  1. # Parsers/generators for QuickTime media descriptions
  2. import struct
  3. Error = 'MediaDescr.Error'
  4. class _MediaDescriptionCodec:
  5. def __init__(self, trunc, size, names, fmt):
  6. self.trunc = trunc
  7. self.size = size
  8. self.names = names
  9. self.fmt = fmt
  10. def decode(self, data):
  11. if self.trunc:
  12. data = data[:self.size]
  13. values = struct.unpack(self.fmt, data)
  14. if len(values) != len(self.names):
  15. raise Error, ('Format length does not match number of names', descr)
  16. rv = {}
  17. for i in range(len(values)):
  18. name = self.names[i]
  19. value = values[i]
  20. if type(name) == type(()):
  21. name, cod, dec = name
  22. value = dec(value)
  23. rv[name] = value
  24. return rv
  25. def encode(dict):
  26. list = [self.fmt]
  27. for name in self.names:
  28. if type(name) == type(()):
  29. name, cod, dec = name
  30. else:
  31. cod = dec = None
  32. value = dict[name]
  33. if cod:
  34. value = cod(value)
  35. list.append(value)
  36. rv = struct.pack(*list)
  37. return rv
  38. # Helper functions
  39. def _tofixed(float):
  40. hi = int(float)
  41. lo = int(float*0x10000) & 0xffff
  42. return (hi<<16)|lo
  43. def _fromfixed(fixed):
  44. hi = (fixed >> 16) & 0xffff
  45. lo = (fixed & 0xffff)
  46. return hi + (lo / float(0x10000))
  47. def _tostr31(str):
  48. return chr(len(str)) + str + '\0'*(31-len(str))
  49. def _fromstr31(str31):
  50. return str31[1:1+ord(str31[0])]
  51. SampleDescription = _MediaDescriptionCodec(
  52. 1, # May be longer, truncate
  53. 16, # size
  54. ('descSize', 'dataFormat', 'resvd1', 'resvd2', 'dataRefIndex'), # Attributes
  55. "l4slhh" # Format
  56. )
  57. SoundDescription = _MediaDescriptionCodec(
  58. 1,
  59. 36,
  60. ('descSize', 'dataFormat', 'resvd1', 'resvd2', 'dataRefIndex',
  61. 'version', 'revlevel', 'vendor', 'numChannels', 'sampleSize',
  62. 'compressionID', 'packetSize', ('sampleRate', _tofixed, _fromfixed)),
  63. "l4slhhhh4shhhhl" # Format
  64. )
  65. SoundDescriptionV1 = _MediaDescriptionCodec(
  66. 1,
  67. 52,
  68. ('descSize', 'dataFormat', 'resvd1', 'resvd2', 'dataRefIndex',
  69. 'version', 'revlevel', 'vendor', 'numChannels', 'sampleSize',
  70. 'compressionID', 'packetSize', ('sampleRate', _tofixed, _fromfixed), 'samplesPerPacket',
  71. 'bytesPerPacket', 'bytesPerFrame', 'bytesPerSample'),
  72. "l4slhhhh4shhhhlllll" # Format
  73. )
  74. ImageDescription = _MediaDescriptionCodec(
  75. 1, # May be longer, truncate
  76. 86, # size
  77. ('idSize', 'cType', 'resvd1', 'resvd2', 'dataRefIndex', 'version',
  78. 'revisionLevel', 'vendor', 'temporalQuality', 'spatialQuality',
  79. 'width', 'height', ('hRes', _tofixed, _fromfixed), ('vRes', _tofixed, _fromfixed),
  80. 'dataSize', 'frameCount', ('name', _tostr31, _fromstr31),
  81. 'depth', 'clutID'),
  82. 'l4slhhhh4sllhhlllh32shh',
  83. )
  84. # XXXX Others, like TextDescription and such, remain to be done.