コード例 #1
0
ファイル: dvbevrec3.py プロジェクト: soralis-nem/ptx
	def check_ev_moved(self, eit, sid):
		events = eit.events
		if events is None or len(events) < 1:
			return
		# only EITp/f is fed to this func,
		# so just check if the (1st) event exists
		ev = events[0]
		if ev is None or ev.descriptors is None:
			return
		desc = GstMpegts.find_descriptor(ev.descriptors,
			GstMpegts.ISDBDescriptorType.EVENT_GROUP)
		if desc is None:
			return

		eg = desc.parse_event_group()
		if not eg[0]  or eg[1] is None or len(eg[1].events) < 1:
			return
		if eg[1].group_type != GstMpegts.EventGroupType.MOVED_FROM_INTERNAL:
			return

		for src in eg[1].events:
			if src.service_id == self.svc_id and src.event_id == self.ev_id:
				self.dprint("the evnet:{0}[svc:{1}] moved."
					" switching...".format(src.event_id, src.service_id))
				self.next_svcid = sid
				self.next_eid = ev.event_id
				self.next_tsid = None
				self.switch_ev(self)
				return
		return
コード例 #2
0
ファイル: dvbevrec3.py プロジェクト: soralis-nem/ptx
	def check_relay(self, eit):
		events = eit.events
		if events is None or len(events) < 1:
			return
		# only EITp/f is fed to this func,
		# so just check if the (1st) event exists
		ev = events[0]
		if ev is None or ev.descriptors is None:
			return
		desc = GstMpegts.find_descriptor(ev.descriptors,
			GstMpegts.ISDBDescriptorType.EVENT_GROUP)
		if desc is None:
			return

		eg = desc.parse_event_group()
		if not eg[0]  or eg[1] is None or len(eg[1].events) < 1:
			return
		if eg[1].group_type == GstMpegts.EventGroupType.RELAYED_TO_INTERNAL or \
		   eg[1].group_type == GstMpegts.EventGroupType.RELAYED_TO:
			if eg[1].events[0] is None:
				self.dprint("broken EIT(ev-grp desc. type:2/4) received.")
				return
			self.next_svcid = eg[1].events[0].service_id
			self.next_eid = eg[1].events[0].event_id
			if eg[1].group_type == GstMpegts.EventGroupType.RELAYED_TO and \
			   eg[1].events[0].transport_stream_id > 0:
				self.next_tsid = eg[1].events[0].transport_stream_id
			else:
				self.next_tsid = None
			self.dprint("will be relayed to ev:{0.next_eid}"
				    "(svc:{0.next_svcid}) ts:{0.next_tsid}".
				    format(self))
		return
コード例 #3
0
ファイル: rtp2hls.py プロジェクト: LjsOks1/ottstreamer
 def on_file_change(self, bus, msg):
     if msg.type == Gst.MessageType.ELEMENT:
         structure = msg.get_structure()
         logger.debug("Message received from:%s", msg.src.get_name())
         #logger.debug("Structure: %s",structure.to_string())
         #GST_LOG("structure is %" GST_PTR_FORMAT,structure)
         if msg.src.get_name() == "multifilesink":
             if structure.get_name() == "GstMultiFileSink":
                 filename = os.path.basename(
                     structure.get_string("filename"))
                 (result, index) = structure.get_int("index")
                 (result,
                  running_time) = structure.get_clock_time("duration")
                 logger.info(filename + " received. Dur:" +
                             str(convert_ns(running_time)))
                 self.playlist.append_segment({
                     "segment_name":
                     self.urlroot + '/' + self.channel + '/' + filename,
                     "seq_num":
                     index
                 })
                 self.playlist.renderPlaylist()
         if msg.src.get_name() == "tsparse":
             section = GstMpegts.message_parse_mpegts_section(msg)
             logger.debug("Section received:%s", section.section_type)
コード例 #4
0
ファイル: dvbevrec3.py プロジェクト: golddranks/dvb_apps
	def check_relay(self, eit):
		events = eit.events
		if events is None or len(events) < 1:
			return
		# only EITp/f is fed to this func,
		# so just check if the (1st) event exists
		ev = events[0]
		if ev is None or ev.descriptors is None:
			return
		desc = GstMpegts.find_descriptor(ev.descriptors,
			GstMpegts.ISDBDescriptorType.EVENT_GROUP)
		if desc is None:
			return

		eg = desc.parse_event_group()
		if not eg[0]  or eg[1] is None or eg[1].event_count < 1:
			return
		if eg[1].group_type == GstMpegts.EventGroupType.RELAYED_TO_INTERNAL or \
		   eg[1].group_type == GstMpegts.EventGroupType.RELAYED_TO:
			if eg[1].events[0] is None:
				self.dprint("broken EIT(ev-grp desc. type:2/4) received.")
				return
			self.next_svcid = eg[1].events[0].service_id
			self.next_eid = eg[1].events[0].event_id
			if eg[1].group_type == GstMpegts.EventGroupType.RELAED_TO and \
			   eg[1].events[0].transport_stream_id > 0:
				self.next_tsid = eg[1].events[0].transport_stream_id
			else:
				self.next_tsid = None
		return
コード例 #5
0
ファイル: dvbevrec3.py プロジェクト: golddranks/dvb_apps
	def check_ev_moved(self, eit, sid):
		events = eit.events
		if events is None or len(events) < 1:
			return
		# only EITp/f is fed to this func,
		# so just check if the (1st) event exists
		ev = events[0]
		if ev is None or ev.descriptors is None:
			return
		desc = GstMpegts.find_descriptor(ev.descriptors,
			GstMpegts.ISDBDescriptorType.EVENT_GROUP)
		if desc is None:
			return

		eg = desc.parse_event_group()
		if not eg[0]  or eg[1] is None or eg[1].event_count < 1:
			return
		if eg[1].group_type != GstMpegts.EventGroupType.MOVED_FROM_INTERNAL:
			return

		for i in range(eg.event_count):
			src = eg[1].events[i]
			if src.service_id == self.svc_id and src.event_id == self.ev_id:
				self.dprint("the evnet:{0}[0x{1:04x}] moved."
					" switching...".format(src.event_id, src.service_id))
				self.next_svcid = sid
				self.next_eid = ev.event_id
				self.next_tsid = None
				self.switch_ev(self)
				return
		return
コード例 #6
0
ファイル: testwatch.py プロジェクト: gbondriver/GBon
 def on_message(self, bus, msg):
     if msg.type == Gst.MessageType.ELEMENT:
         sec = GstMpegts.message_parse_mpegts_section(msg)
         if sec.section_type == GstMpegts.SectionType.PAT:
             pats = sec.get_pat()
             for pat in pats:
                 print("program number: %d, network_or_program_map_PID: 0x%04x" % (pat.program_number, pat.network_or_program_map_PID))
             self.add_program_number_combobox(pats)
コード例 #7
0
ファイル: capt_ev.py プロジェクト: soralis-nem/ptx
def proc_msg(message):
	st = message.get_structure()
	if st is None or not st.has_name('eit'):
		return

	try:
		sec = GstMpegts.message_parse_mpegts_section(message)
		eit = sec.get_eit()
		events = eit.events
		if verbose and eit.actual_stream and eit.present_following:
			print("EIT p/f:{} ver:{} eid:{} sid:{}".format(
			sec.section_number, sec.version_number,
			eit.events[0].event_id, sec.subtable_extension))
	except (AttributeError, KeyError):
		sys.stderr.write('******* no events included.\n')
		return

	for ev in events:
		d = GstMpegts.find_descriptor(ev.descriptors,
					      GstMpegts.DVBDescriptorType.SHORT_EVENT)
		try:
			(title, txt) = d.parse_dvb_short_event()[2:4]

			if eit.present_following and \
			   eit.actual_stream and \
			   sec.section_number == 0 and \
			   title is not None:
				print(title)
				print(txt)
				print()
		except (AttributeError, TypeError):
			pass

		d = GstMpegts.find_descriptor(ev.descriptors,
					      GstMpegts.DVBDescriptorType.EXTENDED_EVENT)
		try:
			for desc in d.parse_dvb_extended_event():
				for item in desc.items:
					print(item.item_descripton + ':')
					print(item.item)
					print()
		except AttributeError:
			pass
コード例 #8
0
def proc_msg(message):
	st = message.get_structure()
	if st is None or not st.has_name('eit'):
		return

	try:
		sec = GstMpegts.message_parse_mpegts_section(message)
		eit = sec.get_eit()
		events = eit.events
	except (AttributeError, KeyError):
		sys.stderr.write('******* no events included.\n')
		return

	for ev in events:
		d = GstMpegts.find_descriptor(ev.descriptors,
					      GstMpegts.DVBDescriptorType.SHORT_EVENT)
		try:
			(title, txt) = d.parse_dvb_short_event()[2:4]

			if eit.present_following and \
			   eit.actual_stream and \
			   sec.section_number == 0 and \
			   title is not None:
				print(title)
				print(txt)
				print()
		except (AttributeError, TypeError):
			pass

		d = GstMpegts.find_descriptor(ev.descriptors,
					      GstMpegts.DVBDescriptorType.EXTENDED_EVENT)
		try:
			for desc in d.parse_dvb_extended_event():
				for item in desc.items:
					print(item.item_descripton + ':')
					print(item.item)
					print()
		except AttributeError:
			pass
コード例 #9
0
 def on_message(self,bus,msg):
     if msg.type==Gst.MessageType.ELEMENT:
         structure=msg.get_structure()
         logger.debug("Message received from:%s with structure:%s" ,msg.src.get_name(),structure.get_name())
         if msg.src.get_name()=="tsparse" and structure.get_name()=='sit':
             section=GstMpegts.message_parse_mpegts_section(msg)
             if section:
                 spliceinfo=section.get_scte_splice_info()
                 logger.debug("PTS Offset:%i",spliceinfo.pts_adjustment)
                 logger.debug("Command type:%i",spliceinfo.splice_command_type)
                 if spliceinfo.splice_command_type==5:
                     logger.debug("EventID:%#5.8x",spliceinfo.splice_insert.splice_event_id)
                     logger.debug("In/Out flag:%s",spliceinfo.splice_insert.out_of_network_indicator)
                     logger.debug("PCR: %s (%i)",pts_time(spliceinfo.splice_insert.pts_time),spliceinfo.splice_insert.pts_time)
                     logger.debug("Program/~Component Splice:%s",spliceinfo.splice_insert.program_splice_flag)
         if msg.src.get_name()=="tsparse" and structure.get_name()=='pmt':
             section=GstMpegts.message_parse_mpegts_section(msg)
             if section:
                 pmt=section.get_pmt()
                 logger.debug("PMT streams:%i",pmt.streams[0].stream_type)
     if msg.type==Gst.MessageType.EOS:
         self.stop()
コード例 #10
0
ファイル: rtp2hls_scte35.py プロジェクト: LjsOks1/ottstreamer
    def on_file_change(self, bus, msg):
        if msg.type == Gst.MessageType.ELEMENT:
            structure = msg.get_structure()
            #logger.debug("Message received from:%s",msg.src.get_name())
            #logger.debug("Structure: %s",structure.to_string())
            #GST_LOG("structure is %" GST_PTR_FORMAT,structure)
            if msg.src.get_name() == "tsdemux":

                logger.debug("Structure:%s", structure.to_string())

            if msg.src.get_name() == "splitmuxsink":
                logger.debug("Structure:%s", structure.get_name())
                if structure.get_name() == "splitmuxsink-fragment-closed":
                    filename = os.path.basename(
                        structure.get_string("location"))
                    #(result,index)=structure.get_int("index")
                    index = 0
                    (result,
                     running_time) = structure.get_clock_time("running-time")
                    logger.debug(filename + " received. Running-time:" +
                                 str(convert_ns(running_time)))
                    self.playlist.append_segment({
                        "segment_name":
                        self.urlroot + '/' + self.channel + '/' + filename,
                        "seq_num":
                        index
                    })
                    self.playlist.renderPlaylist()
            if msg.src.get_name() == "tsparse" and structure.get_name(
            ) == "sit":
                section = GstMpegts.message_parse_mpegts_section(msg)
                if section:
                    spliceinfo = section.get_scte_splice_info()
                    if spliceinfo.splice_command_type == 5:
                        logger.info(
                            "Splice Insert received. EventID:%#5.8x, In/~Out:%s, PCR:%s",
                            spliceinfo.splice_insert.splice_event_id,
                            spliceinfo.splice_insert.out_of_network_indicator,
                            convert_ns(spliceinfo.splice_insert.pts_time,
                                       90000))
                        force_key_unit_event = GstVideo.video_event_new_upstream_force_key_unit(
                            spliceinfo.splice_insert.pts_time, True,
                            spliceinfo.splice_insert.splice_event_id)
                        result = self.splitmuxsink.get_property(
                            "sink").send_event(force_key_unit_event)
                        logger.info(
                            "GstForceKeyUnit event sent downstream with result:%s.",
                            result)
コード例 #11
0
ファイル: dvbevrec3.py プロジェクト: soralis-nem/ptx
	def proc_eit(self, message):
		sec = GstMpegts.message_parse_mpegts_section(message)
		if sec is None:
			return

		st = message.get_structure()
		if self.watch_pat and st.has_name("pat"):
			self.check_pat(sec)
			return

		if not st.has_name("eit"):
			return
		eit = sec.get_eit()
		if eit is None:
			return

		if not (eit.actual_stream and eit.present_following):
			return

		if sec.subtable_extension != self.svc_id:
			if self.ev_id is not None and not self.found_ev:
				self.check_ev_moved(eit, sec.subtable_extension)
			return

		try:
			event = eit.events[0]

			# NOTE: time in EIT message is adjusted to UTC,
			#       in accordance with the DVB standard.
			tm = event.start_time.to_g_date_time()
			dur = event.duration
			if sec.section_number > 1:
				self.dprint("broken EIT. no/bad section-number.");
				return;

			self.dprint("EIT. ID:%s sec:%s ver:%s" %
					(event.event_id,
					 sec.section_number,
					 sec.version_number))
			if self.ev_id is None and \
			   self.is_target(sec.section_number == 0, tm, dur):
				self.ev_id = event.event_id
				self.dprint("selected event:%s ..." % self.ev_id)

			if sec.section_number == 0:
				# "tsparse" filters out the same-versioned table
				self.eit_ver_present = sec.version_number
				self.eit_eid_present = event.event_id
				evname = None
				desc = GstMpegts.find_descriptor(event.descriptors,
				    GstMpegts.DVBDescriptorType.SHORT_EVENT)
				sh = desc.parse_dvb_short_event()
				if sh[0]:
					evname = sh[2]
				if evname is None or evname == "":
					self.eit_name_present = "???"
				else:
					self.eit_name_present = evname
			else:
				dur_undef = 165 * 3600 + 165 * 60 + 165 # FF:FF:FF as BCD
				if dur == dur_undef and tm.get_year() == 1900:
					return
				# "mpegtsparse" filters out the same-versioned table
				#if eit["version-number"] == self.eit_ver_following:
				#	return
				self.eit_ver_following = sec.version_number
				self.eit_eid_following = event.event_id
				evname = None
				desc = GstMpegts.find_descriptor(event.descriptors,
				    GstMpegts.DVBDescriptorType.SHORT_EVENT)
				sh = desc.parse_dvb_short_event()
				if sh[0]:
					evname = sh[2]
				if evname is None or evname == "":
					self.eit_name_following = "???"
				else:
					self.eit_name_following = evname

			# if event is still not identified, then return & wait subsequent EITs
			if self.ev_id is None:
				return

			if sec.section_number == 0 and \
			   self.ev_id == self.eit_eid_present:
				self.found_ev = True
				if self.ev_start is None and tm.get_year() != 1900:
					self.ev_start = tm.to_unix()
				self.valve(False)
				self.tsid = eit.transport_stream_id
				self.check_relay(eit)
				return
			elif sec.section_number == 1 and \
			     self.ev_id == self.eit_eid_following:
				self.found_ev = True
				if self.ev_start is None and tm.get_year() != 1900:
					self.ev_start = tm.to_unix()
				# check if the next event is close enough
				#  but exclude the case for the starting period of unplanned pause.
				#   in this case, the start time is set to the past.
				# (assert the updated EIT is the "following" one)
				now = time.time()
				if self.ev_start and \
				   self.ev_start >= now and self.ev_start - 5 <= now:
					self.valve(False)
				else:
					self.valve(True)
				self.tsid = eit.transport_stream_id
				self.check_relay(eit)
				return
			else:
				# check if in transient state for unplanned pause/break-ins

				# EITp has been updated first before EITf
				#     to a new event (!self.ev_id).
				# Wait for the EITf update and
				#   check if it == ev_id, i.e. pause/break-in.
				if self.recording and sec.section_number == 0 and \
				   self.eit_ver_present != self.eit_ver_following:
					self.valve(True)
					return

				# check if in state for initial waiting
				if not self.found_ev:
					return

				# EITf has been updated before EITp and
				#    self.ev_id != eid_following (new value) &
				#    self.ev_id != eid_present (old value).
				# Wait for the next EITp updated (to be ev_id).
				if sec.section_number == 1 and \
				   self.eit_ver_present != self.eit_ver_following and \
				   self.ev_id != self.eit_eid_present:
					return

				# wait until next EIT (section) update
				if self.ev_id == self.eit_eid_present or \
				   self.ev_id == self.eit_eid_following:
					return

				# check if a relayed-event exists
				if self.found_ev and self.next_eid:
					self.switch_ev()
					return

				self.valve(True)
				self.dprint("Finished recording.")
				self.quit()
				return
		except TypeError:
			self.dprint("broken EIT?. ignoring...");
			return;
コード例 #12
0
ファイル: dvbevrec3.py プロジェクト: golddranks/dvb_apps
	def proc_eit(self, message):
		sec = GstMpegts.message_parse_mpegts_section(message)
		if sec is None:
			return

		st = message.get_structure()
		if self.watch_pat and st.has_name("pat"):
			self.check_pat(sec)
			return

		if not st.has_name("eit"):
			return
		eit = sec.get_eit()
		if eit is None:
			return

		if not (eit.actual_stream and eit.present_following):
			return

		if sec.subtable_extension != self.svc_id:
			if self.ev_id is not None and not self.found_ev:
				self.check_ev_moved(eit, sec.subtable_extension)
			return

		try:
			event = eit.events[0]

			# NOTE: time in EIT message is adjusted to UTC,
			#       in accordance with the DVB standard.
			tm = event.start_time.to_g_date_time()
			dur = event.duration
			if sec.section_number > 1:
				self.dprint("broken EIT. no/bad section-number.");
				return;

			if self.ev_id is None and \
			   self.is_target(sec.section_number == 0, tm, dur):
				self.ev_id = event.event_id
				self.dprint("selected event:%s ..." % self.ev_id)

			if sec.section_number == 0:
				# "tsparse" filters out the same-versioned table
				self.eit_ver_present = sec.version_number
				self.eit_eid_present = event.event_id
				evname = None
				desc = GstMpegts.find_descriptor(event.descriptors,
				    GstMpegts.DVBDescriptorType.SHORT_EVENT)
				sh = desc.parse_dvb_short_event()
				if sh[0]:
					evname = sh[2]
				if evname is None or evname == "":
					self.eit_name_present = "???"
				else:
					self.eit_name_present = evname
			else:
				dur_undef = 165 * 3600 + 165 * 60 + 165 # FF:FF:FF as BCD
				if dur == dur_undef and tm.get_year() == 1900:
					return
				# "mpegtsparse" filters out the same-versioned table
				#if eit["version-number"] == self.eit_ver_following:
				#	return
				self.eit_ver_following = sec.version_number
				self.eit_eid_following = event.event_id
				evname = None
				desc = GstMpegts.find_descriptor(event.descriptors,
				    GstMpegts.DVBDescriptorType.SHORT_EVENT)
				sh = desc.parse_dvb_short_event()
				if sh[0]:
					evname = sh[2]
				if evname is None or evname == "":
					self.eit_name_following = "???"
				else:
					self.eit_name_following = evname

			if self.eit_eid_present and self.eit_eid_following and \
			   self.ev_id is None:
				self.ev_id = self.eit_eid_present
				self.dprint("selected event:%s ..." % self.ev_id)

			# if event is still not identified, then return & wait subsequent EITs
			if self.ev_id is None:
				return

			if self.ev_id == self.eit_eid_present:
				self.found_ev = True
				if self.ev_start is None and tm.get_year() != 1900:
					self.ev_start = tm.to_unix()
				self.valve(False)
				self.tsid = eit.transport_stream_id
				self.check_relay(eit)
				return
			elif self.ev_id == self.eit_eid_following:
				self.found_ev = True
				if self.ev_start is None and tm.get_year() != 1900:
					self.ev_start = tm.to_unix()
				# check if the next event is close enough
				#  but exclude the case for the starting period of unplanned pause.
				#   in this case, the start time is set to the past.
				# (assert the updated EIT is the "following" one)
				now = time.time()
				if sec.section_number == 1 and self.ev_start and \
				   self.ev_start >= now and self.ev_start - 5 <= now:
					self.valve(False)
				else:
					self.valve(True)
				self.tsid = eit.transport_stream_id
				self.check_relay(eit)
				return
			else:
				# check if in transient state for unplanned pause/break-ins
				if self.recording and sec.section_number == 0 and \
				   self.eit_ver_present != self.eit_ver_following:
					self.valve(True)
					return

				# check if in state for initial waiting
				if not self.found_ev:
					return

				# check if a relayed-event exists
				if self.recording and self.next_eid:
					self.switch_ev()
					return

				self.valve(True)
				self.dprint("Finished recording.")
				self.quit()
				return
		except TypeError:
			self.dprint("broken EIT?. ignoring...");
			return;