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 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()
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()
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
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
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
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
def _push_new_segment(self, pad): pad.push_event( gst.event_new_new_segment(False, 1.0, gst.FORMAT_TIME, 0, -1, 0))