def _push_segment(self):
     # print "Pushing Segment with update=%r, rate=%r, format=%i, start=%i, stop=%i, position=%i" % (self.update,self.rate,self.format,self.start,self.stop,self.seg_position)
     new_segment_event = gst.event_new_new_segment(False, self.rate,
                                                   self.format, self.start,
                                                   self.stop,
                                                   self.seg_position)
     self.keyseeksrcpad.push_event(new_segment_event)
Beispiel #2
0
    def do_create(self, offset, size):
        #debug("Offset: %d, Size: %d" % (offset, size))
        try:
            while True:
                status, buffer = self._receiver.queue.get(True, 5)

                if self.seek_in_progress is not None:
                    if status != 1:  # change this
                        debug("Skipping prefetched junk ...")
                        self._receiver.queue.task_done()
                        continue

                    debug("Pushing seek'd buffer")
                    event = gst.event_new_new_segment(False, 1.0,
                                                      gst.FORMAT_TIME,
                                                      self.seek_in_progress,
                                                      -1,
                                                      self.seek_in_progress)
                    r = self.get_static_pad("src").push_event(event)
                    debug("New segment: %s" % r)

                    self.seek_in_progress = None
                    buffer.flag_set(gst.BUFFER_FLAG_DISCONT)

                self._receiver.queue.task_done()
                return gst.FLOW_OK, buffer
        except Queue.Empty:
            debug("No data avilable")
            return gst.FLOW_OK, gst.Buffer()
        except:
            traceback.print_exc()
            return gst.FLOW_ERROR, None
Beispiel #3
0
	def do_create(self, offset, size):
		#debug("Offset: %d, Size: %d" % (offset, size))
		try:
			while True:
				status, buffer = self._receiver.queue.get(True, 5)

				if self.seek_in_progress is not None:
					if status != 1: # change this
						debug("Skipping prefetched junk ...")
						self._receiver.queue.task_done()
						continue

					debug("Pushing seek'd buffer")
					event = gst.event_new_new_segment(False, 1.0, gst.FORMAT_TIME,
					                                  self.seek_in_progress, -1,
					                                  self.seek_in_progress)
					r = self.get_static_pad("src").push_event(event)
					debug("New segment: %s" % r)

					self.seek_in_progress = None
					buffer.flag_set(gst.BUFFER_FLAG_DISCONT)

				self._receiver.queue.task_done()
				return gst.FLOW_OK, buffer
		except Queue.Empty:
			debug("No data avilable")
			return gst.FLOW_OK, gst.Buffer()
		except:
			traceback.print_exc()
			return gst.FLOW_ERROR, None
    def _our_task(self, something):
        if self._buffer == None:
            self.warning("We were started without a buffer, exiting")
            self.srcpad.pause_task()
            return

        #this is where we repeatedly output our buffer
        self.debug("self:%r, something:%r" % (self, something))

        self.debug("needsegment: %r" % self._needsegment)
        if self._needsegment:
            self.debug("Need to output a new segment")
            segment = gst.event_new_new_segment(False, self._segment.rate,
                                                self._segment.format,
                                                self._segment.start,
                                                self._segment.stop,
                                                self._segment.start)
            self.srcpad.push_event(segment)
            # calculate offset
            # offset is int(segment.start / outputrate)
            self._offset = int(self._segment.start * self._outputrate.num /
                               self._outputrate.denom / gst.SECOND)
            self._needsegment = False
            self.debug("Newsegment event pushed")

        # new position
        position = self._offset * gst.SECOND * self._outputrate.denom / self._outputrate.num
        if self._segment.stop != -1 and position > self._segment.stop:
            self.debug(
                "end of configured segment (position:%s / segment_stop:%s)" %
                (gst.TIME_ARGS(position), gst.TIME_ARGS(self._segment.stop)))
            # end of stream/segment handling
            if self._segment.flags & gst.SEEK_FLAG_SEGMENT:
                # emit a gst.MESSAGE_SEGMENT_DONE
                self.post_message(
                    gst.message_new_segment_done(self, gst.FORMAT_TIME,
                                                 self._segment.stop))
            else:
                self.srcpad.push_event(gst.event_new_eos())
            self.last_return = gst.FLOW_WRONG_STATE
            self.srcpad.pause_task()

        # we need to update the caps here !
        obuf = self._buffer.make_metadata_writable()
        ok, nstart, nstop = self._segment.clip(gst.FORMAT_TIME, position,
                                               position + self._bufferduration)
        if ok:
            obuf.timestamp = nstart
            obuf.duration = nstop - nstart
            obuf.caps = self._srccaps
            self.debug("Pushing out buffer %s" % gst.TIME_ARGS(obuf.timestamp))
            self.last_return = self.srcpad.push(obuf)
        self._offset += 1

        if self.last_return != gst.FLOW_OK:
            self.debug("Pausing ourself, last_return : %s" %
                       gst.flow_get_name(self.last_return))
            self.srcpad.pause_task()
Beispiel #5
0
    def _our_task(self, something):
        if self._buffer == None:
            self.warning("We were started without a buffer, exiting")
            self.srcpad.pause_task()
            return

        #this is where we repeatedly output our buffer
        self.debug("self:%r, something:%r" % (self, something))

        self.debug("needsegment: %r" % self._needsegment)
        if self._needsegment:
            self.debug("Need to output a new segment")
            segment = gst.event_new_new_segment(False,
                                                self._segment.rate,
                                                self._segment.format,
                                                self._segment.start,
                                                self._segment.stop,
                                                self._segment.start)
            self.srcpad.push_event(segment)
            # calculate offset
            # offset is int(segment.start / outputrate)
            self._offset = int(self._segment.start * self._outputrate.num / self._outputrate.denom / gst.SECOND)
            self._needsegment = False
            self.debug("Newsegment event pushed")

        # new position
        position = self._offset * gst.SECOND * self._outputrate.denom / self._outputrate.num
        if self._segment.stop != -1 and position > self._segment.stop:
            self.debug("end of configured segment (position:%s / segment_stop:%s)" % (gst.TIME_ARGS(position),
                                                                                     gst.TIME_ARGS(self._segment.stop)))
            # end of stream/segment handling
            if self._segment.flags & gst.SEEK_FLAG_SEGMENT:
                # emit a gst.MESSAGE_SEGMENT_DONE
                self.post_message(gst.message_new_segment_done(self, gst.FORMAT_TIME, self._segment.stop))
            else:
                self.srcpad.push_event(gst.event_new_eos())
            self.last_return = gst.FLOW_WRONG_STATE
            self.srcpad.pause_task()

        # we need to update the caps here !
        obuf = self._buffer.make_metadata_writable()
        ok, nstart, nstop = self._segment.clip(gst.FORMAT_TIME,
                                               position, position + self._bufferduration)
        if ok:
            obuf.timestamp = nstart
            obuf.duration = nstop - nstart
            obuf.caps = self._srccaps
            self.debug("Pushing out buffer %s" % gst.TIME_ARGS(obuf.timestamp))
            self.last_return = self.srcpad.push(obuf)
        self._offset += 1

        if self.last_return != gst.FLOW_OK:
            self.debug("Pausing ourself, last_return : %s" % gst.flow_get_name(self.last_return))
            self.srcpad.pause_task()
Beispiel #6
0
 def _bufferProbe(self, pad, buffer):
     # called from GStreamer threads
     ts = buffer.timestamp
     if pad in self.newSegmentEvents:
         parsed = self.newSegmentEvents[pad].parse_new_segment()
         newEvent = gst.event_new_new_segment(parsed[0], parsed[1],
             parsed[2], ts, parsed[4], parsed[5])
         pad.push_event(newEvent)
         del self.newSegmentEvents[pad]
     if pad in self.bufferProbeIds:
         pad.remove_buffer_probe(self.bufferProbeIds[pad])
         del self.bufferProbeIds[pad]
     return True
Beispiel #7
0
 def _bufferProbe(self, pad, buffer):
     # called from GStreamer threads
     ts = buffer.timestamp
     if pad in self.newSegmentEvents:
         parsed = self.newSegmentEvents[pad].parse_new_segment()
         newEvent = gst.event_new_new_segment(parsed[0], parsed[1],
                                              parsed[2], ts, parsed[4],
                                              parsed[5])
         pad.push_event(newEvent)
         del self.newSegmentEvents[pad]
     if pad in self.bufferProbeIds:
         pad.remove_buffer_probe(self.bufferProbeIds[pad])
         del self.bufferProbeIds[pad]
     return True
Beispiel #8
0
    def do_create(self, offset, size):
        if self._no_locking:
            return gst.FLOW_WRONG_STATE, None

        #debug(self, "Offset: %d, Size: %d" % (offset, size))
        try:
            while True:
                try:
                    status, timestamp, buffer = self.depacketizer.queue.get(
                        True, 1)
                    #print "%d %d %d %s" % (buffer.timestamp, buffer.duration, buffer.flags, buffer.caps)
                except Queue.Empty:
                    if self._no_locking:
                        return gst.FLOW_WRONG_STATE, None
                    else:
                        debug(self, "Starving for data")
                        continue

                if self._no_locking:
                    self.depacketizer.queue.task_done()
                    return gst.FLOW_WRONG_STATE, None

                if self.seek_in_progress is not None:
                    if status != CMD_SEEK:
                        debug(self, "Skipping prefetched junk ...")
                        self.depacketizer.queue.task_done()
                        continue

                    debug(self, "Pushing seek'd buffer")
                    event = gst.event_new_new_segment(False, 1.0,
                                                      gst.FORMAT_TIME,
                                                      self.seek_in_progress,
                                                      -1,
                                                      self.seek_in_progress)
                    r = self.get_static_pad("src").push_event(event)
                    debug(self,
                          "Result of announcement of the new segment: %s" % r)

                    self.seek_in_progress = None
                    buffer.flag_set(gst.BUFFER_FLAG_DISCONT)

                self.depacketizer.queue.task_done()
                return gst.FLOW_OK, buffer
        except:
            traceback.print_exc()
            return gst.FLOW_ERROR, None
Beispiel #9
0
	def do_create(self, offset, size):
		if self._no_locking:
			return gst.FLOW_WRONG_STATE, None

		#debug(self, "Offset: %d, Size: %d" % (offset, size))
		try:
			while True:
				try:
					status, timestamp, buffer = self.depacketizer.queue.get(True, 1)
					#print "%d %d %d %s" % (buffer.timestamp, buffer.duration, buffer.flags, buffer.caps)
				except Queue.Empty:
					if self._no_locking:
						return gst.FLOW_WRONG_STATE, None
					else:
						debug(self, "Starving for data")
						continue

				if self._no_locking:
					self.depacketizer.queue.task_done()
					return gst.FLOW_WRONG_STATE, None

				if self.seek_in_progress is not None:
					if status != CMD_SEEK:
						debug(self, "Skipping prefetched junk ...")
						self.depacketizer.queue.task_done()
						continue

					debug(self, "Pushing seek'd buffer")
					event = gst.event_new_new_segment(False, 1.0, gst.FORMAT_TIME,
					                                  self.seek_in_progress, -1,
					                                  self.seek_in_progress)
					r = self.get_static_pad("src").push_event(event)
					debug(self, "Result of announcement of the new segment: %s" % r)

					self.seek_in_progress = None
					buffer.flag_set(gst.BUFFER_FLAG_DISCONT)

				self.depacketizer.queue.task_done()
				return gst.FLOW_OK, buffer
		except:
			traceback.print_exc()
			return gst.FLOW_ERROR, None
Beispiel #10
0
 def _send_new_segment(self):
     for pad in [self.videosrc, self.audiosrc]:
         pad.push_event(
             gst.event_new_new_segment(True, 1.0, gst.FORMAT_TIME,
                                       self._syncTimestamp, -1, 0))
     self._sendNewSegment = False
Beispiel #11
0
 def _send_new_segment(self):
     for pad in [self.videosrc, self.audiosrc]:
         pad.push_event(
             gst.event_new_new_segment(True, 1.0, gst.FORMAT_TIME,
                                       self._syncTimestamp, -1, 0))
     self._sendNewSegment = False
Beispiel #12
0
	def _push_segment(self):
		# print "Pushing Segment with update=%r, rate=%r, format=%i, start=%i, stop=%i, position=%i" % (self.update,self.rate,self.format,self.start,self.stop,self.seg_position)
		new_segment_event = gst.event_new_new_segment(False, self.rate, self.format, self.start, self.stop, self.seg_position)
		self.keyseeksrcpad.push_event(new_segment_event)
 def _push_new_segment(self, pad):
     pad.push_event(
         gst.event_new_new_segment(False, 1.0, gst.FORMAT_TIME, 0, -1, 0))