def sendData(self, data, timestamp): c = self.channel if timestamp < c.timestamp: relTimestamp = timestamp else: relTimestamp = timestamp - c.timestamp h = header.Header(c.channelId, relTimestamp, self.type, len(data), self.streamId) if self._lastHeader is None: h.full = True c.setHeader(h) c.append(data) header.encode(self.stream, h, self._lastHeader) self._lastHeader = h c.marshallOneFrame() while not c.complete(): self.stream.write(self._continuationHeader) c.marshallOneFrame() c.reset() self.output.write(self.stream.getvalue()) self.stream.consume()
def test_reassign(self): """ Ensure that when a channel is complete it can be repurposed via a relative header. """ full_header = header.Header(52, datatype=2, timestamp=55, bodyLength=256, streamId=4) # only change the bodyLength and timestamp relative_header = header.Header(52, datatype=2, streamId=4, bodyLength=256, timestamp=45) header.encode(self.stream, full_header) self.stream.write('a' * self.reader.frameSize) header.encode(self.stream, relative_header, full_header) self.stream.write('b' * self.reader.frameSize) self.stream.seek(0) bytes, complete, meta = self.reader.readFrame() self.assertEqual(bytes, 'a' * 128) self.assertFalse(complete) self.assertEqual(meta.timestamp, 55) bytes, complete, meta = self.reader.readFrame() self.assertEqual(bytes, 'b' * 128) self.assertTrue(complete) self.assertEqual(meta.timestamp, 100)
def sendData(self, data, timestamp): c = self.channel if timestamp < c.timestamp: relTimestamp = timestamp else: relTimestamp = timestamp - c.timestamp h = header.Header(c.channelId, relTimestamp, self.type, len(data), self.streamId) if self._lastHeader is None: h.full = True c.setHeader(h) c.append(data) header.encode(self.stream, h, self._lastHeader) self._lastHeader = h c.marshallOneFrame() while not c.complete(): self.stream.write(self._continuationHeader) c.marshallOneFrame() c.reset() s = self.stream.getvalue() self.output.write(s) self.encoder.bytes += len(s) self.stream.consume()
def __init__(self, encoder, streamId, output): self.encoder = encoder self.channel = self.encoder.acquireChannel() if self.channel is None: # todo: make this better raise RuntimeError('No streaming channel available') self.type = None self.streamId = streamId self.output = output self.stream = BufferedByteStream() self._lastHeader = None self._oldStream = self.channel.stream self.channel.stream = self.stream h = header.Header(self.channel.channelId) # encode a continuation header for speed header.encode(self.stream, h, h) self._continuationHeader = self.stream.getvalue() self.stream.consume()
def writeHeader(self, channel): """ Encodes the next header for C{channel}. """ h = self.nextHeaders.pop(channel, None) if h is not None: h = channel.setHeader(h) else: h = channel.header header.encode(self.stream, channel.header, h)
def test_reset(self): full = header.Header(3, datatype=2, bodyLength=2, streamId=1, timestamp=10) header.encode(self.stream, full) self.stream.write('a' * 2) self.stream.seek(0) self.reader.readFrame() channel = self.channels[3] self.assertEqual(channel.bytes, 0)
def test_extended_timestamp_compressed(self): """ A header with an extended timestamp must write out the complete timestamp if a compressed version is written. @see: #107 """ self.old = self.new self.new.timestamp = 0x1000000 header.encode(self.stream, self.new, self.old) self.assertEqual(self.stream.getvalue(), '\xc2\x01\x00\x00\x00')
def test_simple(self): """ Do a sanity check for a simple 4 frame 1 channel rtmp stream. """ def check_meta(meta, timestamp=10): self.assertEqual(meta.channelId, 3) self.assertEqual(meta.streamId, 1) self.assertEqual(meta.datatype, 2) self.assertEqual(meta.bodyLength, 500) self.assertEqual(meta.timestamp, timestamp) size = self.reader.frameSize full = header.Header(3, datatype=2, bodyLength=500, streamId=1, timestamp=10) header.encode(self.stream, full) self.stream.write('a' * size) header.encode(self.stream, full, full) self.stream.write('b' * size) header.encode(self.stream, full, full) self.stream.write('c' * size) header.encode(self.stream, full, full) self.stream.write('d' * (size - 12)) self.stream.seek(0) bytes, complete, meta = self.reader.readFrame() self.assertEqual(bytes, 'a' * self.reader.frameSize) self.assertFalse(complete) check_meta(meta) bytes, complete, meta = self.reader.readFrame() self.assertEqual(bytes, 'b' * self.reader.frameSize) self.assertFalse(complete) check_meta(meta, 10) bytes, complete, meta = self.reader.readFrame() self.assertEqual(bytes, 'c' * self.reader.frameSize) self.assertFalse(complete) check_meta(meta, 10) bytes, complete, meta = self.reader.readFrame() self.assertEqual(bytes, 'd' * (size - 12)) self.assertTrue(complete) check_meta(meta, 10) self.assertRaises(IOError, self.reader.readFrame)
def __init__(self, channel, streamId, output): self.type = None self.channel = channel self.streamId = streamId self.output = output self.stream = BufferedByteStream() self._lastHeader = None self._oldStream = channel.stream channel.stream = self.stream h = header.Header(channel.channelId) # encode a continuation header for speed header.encode(self.stream, h, h) self._continuationHeader = self.stream.getvalue() self.stream.consume()
def assertEncoded(self, bytes): self.stream.seek(0, 2) self.stream.truncate() header.encode(self.stream, self.new, self.old) self.assertEqual(self.stream.getvalue(), bytes)