mirror of
				https://github.com/rofafor/vdr-plugin-femon.git
				synced 2023-10-10 11:36:53 +00:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 1a98e97e8e | ||
|  | fe364e3568 | ||
|  | 66f79dd5bc | 
							
								
								
									
										24
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -526,28 +526,6 @@ VDR Plugin 'femon' Revision History | ||||
| - Added support for tracing modes. | ||||
| - Removed the 'femonclient' plugin. | ||||
|  | ||||
| 2015-xx-xx: Version 2.2.2 | ||||
|  | ||||
| =================================== | ||||
| VDR Plugin 'femon' Revision History | ||||
| =================================== | ||||
|  | ||||
| 2017-06-24: Version 2.3.0 | ||||
|  | ||||
| - Updated for vdr-2.3.7. | ||||
| - Added support for H.265 video codec. | ||||
| - Fixed frontend handling during a device switch. | ||||
| - Added Polish translation (Thanks to Tomasz Nowak). | ||||
| - Updated German translation (Thanks to Andreas Brachold). | ||||
|  | ||||
|  | ||||
| =================================== | ||||
| VDR Plugin 'femon' Revision History | ||||
| =================================== | ||||
|  | ||||
| 2018-04-15: Version 2.4.0 | ||||
|  | ||||
| - Updated for vdr-2.4.0. | ||||
|  | ||||
| 2019-xx-xx: Version 2.4.1 | ||||
|  | ||||
| - Added signal level units (Thanks to Winfried). | ||||
|   | ||||
							
								
								
									
										29
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								Makefile
									
									
									
									
									
								
							| @@ -61,7 +61,7 @@ all-redirect: all | ||||
|  | ||||
| ### The object files (add further files here): | ||||
|  | ||||
| OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o h265.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o | ||||
| OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o | ||||
|  | ||||
| ### The main target: | ||||
|  | ||||
| @@ -70,15 +70,14 @@ all: $(SOFILE) i18n | ||||
| ### Implicit rules: | ||||
|  | ||||
| %.o: %.c | ||||
| 	@echo CC $@ | ||||
| 	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< | ||||
| 	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< | ||||
|  | ||||
| ### Dependencies: | ||||
|  | ||||
| MAKEDEP = $(CXX) -MM -MG | ||||
| DEPFILE = .dependencies | ||||
| $(DEPFILE): Makefile | ||||
| 	$(Q)$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ | ||||
| 	@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ | ||||
|  | ||||
| -include $(DEPFILE) | ||||
|  | ||||
| @@ -91,21 +90,17 @@ I18Nmsgs  = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU | ||||
| I18Npot   = $(PODIR)/$(PLUGIN).pot | ||||
|  | ||||
| %.mo: %.po | ||||
| 	@echo MO $@ | ||||
| 	$(Q)msgfmt -c -o $@ $< | ||||
| 	msgfmt -c -o $@ $< | ||||
|  | ||||
| $(I18Npot): $(wildcard *.c) | ||||
| 	@echo GT $@ | ||||
| 	$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^` | ||||
| 	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^` | ||||
|  | ||||
| %.po: $(I18Npot) | ||||
| 	@echo PO $@ | ||||
| 	$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< | ||||
| 	msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< | ||||
| 	@touch $@ | ||||
|  | ||||
| $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo | ||||
| 	@echo IN $@ | ||||
| 	$(Q)install -D -m644 $< $@ | ||||
| 	install -D -m644 $< $@ | ||||
|  | ||||
| .PHONY: i18n | ||||
| i18n: $(I18Nmo) $(I18Npot) | ||||
| @@ -115,13 +110,11 @@ install-i18n: $(I18Nmsgs) | ||||
| ### Targets: | ||||
|  | ||||
| $(SOFILE): $(OBJS) | ||||
| 	@echo LD $@ | ||||
| 	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ | ||||
| 	$(Q)$(STRIP) $@ | ||||
| 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ | ||||
| 	@$(STRIP) $@ | ||||
|  | ||||
| install-lib: $(SOFILE) | ||||
| 	@echo IN $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | ||||
| 	$(Q)install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | ||||
| 	install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | ||||
|  | ||||
| install: install-lib install-i18n | ||||
|  | ||||
| @@ -139,4 +132,4 @@ clean: | ||||
|  | ||||
| .PHONY: cppcheck | ||||
| cppcheck: | ||||
| 	$(Q)cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c) | ||||
| 	@cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c) | ||||
|   | ||||
							
								
								
									
										11
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								README
									
									
									
									
									
								
							| @@ -34,14 +34,15 @@ Terminology: | ||||
| |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| | ||||
| |[=====Signal Strength ===================|=================]| | ||||
| |[=====Signal Quality ================|=====================]| | ||||
| |  STR: 0   CNR: 0   BER: 0   PER: 0   Video: 0   Audio: 0   | | ||||
| | STR: #0000 (0%)       BER: #00000000       Video: 0 Mbit/s | | ||||
| | SNR: #0000 (0%)       UNC: #00000000       Audio: 0 kbit/s | | ||||
| | [LOCK]     [SIGNAL]     [CARRIER]     [VITERBI]     [SYNC] | | ||||
| -------------------------------------------------------------- | ||||
|  | ||||
| STR     - Signal strength in dBm/dBuV/dbV | ||||
| CNR     - Signal-to-noise ratio of the main carrier in dB | ||||
| BER     - Bit error rate after the forward error correction (FEC) done by inner code block | ||||
| PER     - Block error rate after the outer forward error correction coding | ||||
| STR     - Signal strength from driver | ||||
| SNR     - Signal-to-noise ratio from driver | ||||
| BER     - Bit error rate | ||||
| UNC     - Uncorrected blocks | ||||
| Video   - Calculated video bitrate in Mbit/s | ||||
| Audio   - Calculated audio / AC-3 bitrate in kbit/s | ||||
|  | ||||
|   | ||||
							
								
								
									
										1
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								config.c
									
									
									
									
									
								
							| @@ -20,7 +20,6 @@ cFemonConfig::cFemonConfig() | ||||
|   themeM(0), | ||||
|   positionM(1), | ||||
|   downscaleM(0), | ||||
|   signalUnitM(0), | ||||
|   redLimitM(33), | ||||
|   greenLimitM(66), | ||||
|   updateIntervalM(5), | ||||
|   | ||||
							
								
								
									
										11
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								config.h
									
									
									
									
									
								
							| @@ -19,14 +19,6 @@ enum eFemonModes | ||||
|   eFemonModeMaxNumber | ||||
| }; | ||||
|  | ||||
| enum eFemonSignalUnit | ||||
| { | ||||
|   eFemonSignalUnitdBm, | ||||
|   eFemonSignalUnitdBuV, | ||||
|   eFemonSignalUnitdBV, | ||||
|   eFemonSignalUnitMaxNumber | ||||
| }; | ||||
|  | ||||
| class cFemonConfig | ||||
| { | ||||
| private: | ||||
| @@ -37,7 +29,6 @@ private: | ||||
|   int themeM; | ||||
|   int positionM; | ||||
|   int downscaleM; | ||||
|   int signalUnitM; | ||||
|   int redLimitM; | ||||
|   int greenLimitM; | ||||
|   int updateIntervalM; | ||||
| @@ -77,7 +68,6 @@ public: | ||||
|   int GetTheme(void) const { return themeM; } | ||||
|   int GetPosition(void) const { return positionM; } | ||||
|   int GetDownscale(void) const { return downscaleM; } | ||||
|   int GetSignalUnit(void) const { return signalUnitM; } | ||||
|   int GetRedLimit(void) const { return redLimitM; } | ||||
|   int GetGreenLimit(void) const { return greenLimitM; } | ||||
|   int GetUpdateInterval(void) const { return updateIntervalM; } | ||||
| @@ -94,7 +84,6 @@ public: | ||||
|   void SetTheme(int themeP) { themeM = themeP; } | ||||
|   void SetPosition(int positionP) { positionM = positionP; } | ||||
|   void SetDownscale(int downscaleP) { downscaleM = downscaleP; } | ||||
|   void SetSignalUnit(int signalUnitP) { signalUnitM = signalUnitP; } | ||||
|   void SetRedLimit(int redLimitP) { redLimitM = redLimitP; } | ||||
|   void SetGreenLimit(int greenLimitP) { greenLimitM = greenLimitP; } | ||||
|   void SetUpdateInterval(int updateIntervalP) { updateIntervalM = updateIntervalP; } | ||||
|   | ||||
							
								
								
									
										51
									
								
								femon.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								femon.c
									
									
									
									
									
								
							| @@ -17,15 +17,15 @@ | ||||
| #include "tools.h" | ||||
| #include "setup.h" | ||||
|  | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 20400 | ||||
| #error "VDR-2.4.0 API version or greater is required!" | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 20200 | ||||
| #error "VDR-2.2.0 API version or greater is required!" | ||||
| #endif | ||||
|  | ||||
| #ifndef GITVERSION | ||||
| #define GITVERSION "" | ||||
| #endif | ||||
|  | ||||
| static const char VERSION[]       = "2.4.1" GITVERSION; | ||||
| static const char VERSION[]       = "2.2.2" GITVERSION; | ||||
| static const char DESCRIPTION[]   = trNOOP("DVB Signal Information Monitor (OSD)"); | ||||
| static const char MAINMENUENTRY[] = trNOOP("Signal Information"); | ||||
|  | ||||
| @@ -120,8 +120,7 @@ cOsdObject *cPluginFemon::MainMenuAction(void) | ||||
| { | ||||
|   // Perform the action when selected from the main VDR menu. | ||||
|   debug1("%s", __PRETTY_FUNCTION__); | ||||
|   LOCK_CHANNELS_READ; | ||||
|   if (cControl::Control() || (Channels->Count() <= 0)) | ||||
|   if (cControl::Control() || (Channels.Count() <= 0)) | ||||
|      Skins.Message(mtInfo, tr("Femon not available")); | ||||
|   else | ||||
|      return cFemonOsd::Instance(true); | ||||
| @@ -165,8 +164,6 @@ bool cPluginFemon::SetupParse(const char *nameP, const char *valueP) | ||||
|      FemonConfig.SetSvdrpPort(atoi(valueP)); | ||||
|   else if (!strcasecmp(nameP, "ServerIp")) | ||||
|      FemonConfig.SetSvdrpIp(valueP); | ||||
|   else if (!strcasecmp(nameP, "SignalUnit")) | ||||
|      FemonConfig.SetSignalUnit(atoi(valueP)); | ||||
|   else | ||||
|     return false; | ||||
|  | ||||
| @@ -175,18 +172,18 @@ bool cPluginFemon::SetupParse(const char *nameP, const char *valueP) | ||||
|  | ||||
| bool cPluginFemon::Service(const char *idP, void *dataP) | ||||
| { | ||||
|   if (strcmp(idP, "FemonService-v1.1") == 0) { | ||||
|   if (strcmp(idP, "FemonService-v1.0") == 0) { | ||||
|      if (dataP) { | ||||
|         FemonService_v1_1 *data = reinterpret_cast<FemonService_v1_1*>(dataP); | ||||
|         cDevice *dev = cDevice::ActualDevice(); | ||||
|         if (!dev) | ||||
|         FemonService_v1_0 *data = reinterpret_cast<FemonService_v1_0*>(dataP); | ||||
|         if (!cDevice::ActualDevice()) | ||||
|            return false; | ||||
|         cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); | ||||
|         data->fe_name = getFrontendName(dev); | ||||
|         data->fe_status = getFrontendStatus(dev); | ||||
|         data->fe_cnr = getCNR(dev); | ||||
|         data->fe_snr = getSNR(dev); | ||||
|         data->fe_signal = getSignal(dev); | ||||
|         data->fe_ber = getBER(dev); | ||||
|         data->fe_per = getPER(dev); | ||||
|         data->fe_unc = getUNC(dev); | ||||
|         data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0; | ||||
|         data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0; | ||||
|         data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0; | ||||
| @@ -220,12 +217,12 @@ const char **cPluginFemon::SVDRPHelpPages(void) | ||||
|     "    Print the signal quality.", | ||||
|     "SGNL <card index>\n" | ||||
|     "    Print the signal strength from driver.", | ||||
|     "CNRA <card index>\n" | ||||
|     "    Print the carrier-to-noise ratio from driver.", | ||||
|     "SNRA <card index>\n" | ||||
|     "    Print the signal-to-noise ratio from driver.", | ||||
|     "BERA <card index>\n" | ||||
|     "    Print the bit error rate from driver.", | ||||
|     "PERA <card index>\n" | ||||
|     "    Print the packet error rate from driver.", | ||||
|     "    Print the bit error rate.", | ||||
|     "UNCB <card index>\n" | ||||
|     "    Print the uncorrected blocks rate.", | ||||
|     "VIBR\n" | ||||
|     "    Print the current video bitrate [Mbit/s].", | ||||
|     "AUBR\n" | ||||
| @@ -241,14 +238,14 @@ const char **cPluginFemon::SVDRPHelpPages(void) | ||||
|  | ||||
| cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP) | ||||
| { | ||||
|   cDevice *dev = cDevice::ActualDevice(); | ||||
|   cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); | ||||
|   if (strcasecmp(commandP, "TRAC") == 0) { | ||||
|      if (optionP && *optionP) | ||||
|         FemonConfig.SetTraceMode(strtol(optionP, NULL, 0)); | ||||
|      return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode()); | ||||
|      } | ||||
|   if (*optionP && isnumber(optionP)) { | ||||
|      cDevice *dev2 = cDevice::GetDevice(int(strtol(optionP, NULL, 10))); | ||||
|      cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(optionP, NULL, 10)))); | ||||
|      if (dev2) | ||||
|         dev = dev2; | ||||
|      } | ||||
| @@ -294,16 +291,18 @@ cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, in | ||||
|      return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(commandP, "SGNL") == 0) { | ||||
|      return cString::sprintf("%s on device #%d", *getSignalStrength(getSignal(dev)), dev->CardIndex()); | ||||
|      int value = getSignal(dev); | ||||
|      return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(commandP, "CNRA") == 0) { | ||||
|      return cString::sprintf("%.2f dB on device #%d", getCNR(dev), dev->CardIndex()); | ||||
|   else if (strcasecmp(commandP, "SNRA") == 0) { | ||||
|      int value = getSNR(dev); | ||||
|      return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(commandP, "BERA") == 0) { | ||||
|      return cString::sprintf("%.0f on device #%d", getBER(dev), dev->CardIndex()); | ||||
|      return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(commandP, "PERA") == 0) { | ||||
|      return cString::sprintf("%.0f on device #%d", getPER(dev), dev->CardIndex()); | ||||
|   else if (strcasecmp(commandP, "UNCB") == 0) { | ||||
|      return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(commandP, "VIBR") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|   | ||||
| @@ -8,13 +8,15 @@ | ||||
| #ifndef __FEMONSERVICE_H | ||||
| #define __FEMONSERVICE_H | ||||
|  | ||||
| struct FemonService_v1_1 { | ||||
| #include <linux/dvb/frontend.h> | ||||
|  | ||||
| struct FemonService_v1_0 { | ||||
|   cString fe_name; | ||||
|   cString fe_status; | ||||
|   double fe_cnr; | ||||
|   double fe_signal; | ||||
|   double fe_ber; | ||||
|   double fe_per; | ||||
|   uint16_t fe_snr; | ||||
|   uint16_t fe_signal; | ||||
|   uint32_t fe_ber; | ||||
|   uint32_t fe_unc; | ||||
|   double video_bitrate; | ||||
|   double audio_bitrate; | ||||
|   double dolby_bitrate; | ||||
|   | ||||
							
								
								
									
										24
									
								
								h264.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								h264.c
									
									
									
									
									
								
							| @@ -203,19 +203,21 @@ int cFemonH264::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP) | ||||
| { | ||||
|   int s = 0, d = 0; | ||||
|  | ||||
|   while (s < lenP - 3) { | ||||
|     if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) { | ||||
|        dstP[d++] = srcP[s++]; | ||||
|        dstP[d++] = srcP[s++]; | ||||
|        s++; // skip emulation_prevention_three_byte | ||||
|   while (s < lenP) { | ||||
|     if (!srcP[s] && !srcP[s + 1]) { | ||||
|        // hit 00 00 xx | ||||
|        dstP[d] = dstP[d + 1] = 0; | ||||
|        s += 2; | ||||
|        d += 2; | ||||
|        if (srcP[s] == 3) { | ||||
|           s++; // 00 00 03 xx --> 00 00 xx | ||||
|           if (s >= lenP) | ||||
|              return d; | ||||
|           } | ||||
|        } | ||||
|     else | ||||
|     dstP[d++] = srcP[s++]; | ||||
|     } | ||||
|  | ||||
|   while (s < lenP) | ||||
|     dstP[d++] = srcP[s++]; | ||||
|  | ||||
|   return d; | ||||
| } | ||||
|  | ||||
| @@ -551,7 +553,7 @@ int cFemonH264::parseSPS(const uint8_t *bufP, int lenP) | ||||
|      if (bs.GetBit()) {                     // video_signal_type_present_flag | ||||
|         uint32_t video_format; | ||||
|         video_format = bs.GetBits(3);       // video_format | ||||
|         if (video_format < ELEMENTS(videoFormatS)) { | ||||
|         if (video_format < sizeof(videoFormatS) / sizeof(videoFormatS[0])) { | ||||
|            format = videoFormatS[video_format]; | ||||
|            debug2("%s video_format=%d", __PRETTY_FUNCTION__, format); | ||||
|            } | ||||
| @@ -666,7 +668,7 @@ int cFemonH264::parseSEI(const uint8_t *bufP, int lenP) | ||||
|            if (picStructPresentFlagM) {                 // pic_struct_present_flag | ||||
|               uint32_t pic_struct, ct_type = 0, i = 0; | ||||
|               pic_struct = bs.GetBits(4);                // pic_struct | ||||
|               if (pic_struct >= ELEMENTS(seiNumClockTsTableS)) | ||||
|               if (pic_struct >= (sizeof(seiNumClockTsTableS)) / sizeof(seiNumClockTsTableS[0])) | ||||
|                  return 0; | ||||
|               if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM) | ||||
|                  scan = VIDEO_SCAN_PROGRESSIVE; | ||||
|   | ||||
							
								
								
									
										715
									
								
								h265.c
									
									
									
									
									
								
							
							
						
						
									
										715
									
								
								h265.c
									
									
									
									
									
								
							| @@ -1,715 +0,0 @@ | ||||
| /* | ||||
|  * h265.c: Frontend Status Monitor plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <math.h> | ||||
|  | ||||
| #include "log.h" | ||||
| #include "tools.h" | ||||
| #include "h265.h" | ||||
|  | ||||
| const cFemonH265::t_DAR cFemonH265::darS[] = | ||||
| { | ||||
|   {  VIDEO_ASPECT_RATIO_1_1,      100  }, | ||||
|   {  VIDEO_ASPECT_RATIO_4_3,      133  }, | ||||
|   {  VIDEO_ASPECT_RATIO_16_9,     177  }, | ||||
|   {  VIDEO_ASPECT_RATIO_2_21_1,   221  }, | ||||
|   {  VIDEO_ASPECT_RATIO_12_11,    109  }, | ||||
|   {  VIDEO_ASPECT_RATIO_10_11,    90   }, | ||||
|   {  VIDEO_ASPECT_RATIO_16_11,    145  }, | ||||
|   {  VIDEO_ASPECT_RATIO_40_33,    121  }, | ||||
|   {  VIDEO_ASPECT_RATIO_24_11,    218  }, | ||||
|   {  VIDEO_ASPECT_RATIO_20_11,    181  }, | ||||
|   {  VIDEO_ASPECT_RATIO_32_11,    290  }, | ||||
|   {  VIDEO_ASPECT_RATIO_80_33,    242  }, | ||||
|   {  VIDEO_ASPECT_RATIO_18_11,    163  }, | ||||
|   {  VIDEO_ASPECT_RATIO_15_11,    136  }, | ||||
|   {  VIDEO_ASPECT_RATIO_64_33,    193  }, | ||||
|   {  VIDEO_ASPECT_RATIO_160_99,   161  }, | ||||
|   {  VIDEO_ASPECT_RATIO_3_2,      150  }, | ||||
|   {  VIDEO_ASPECT_RATIO_2_1,      200  } | ||||
| }; | ||||
|  | ||||
| const cFemonH265::t_SAR cFemonH265::sarS[] = | ||||
| { | ||||
|   { 0,   0  }, // VIDEO_ASPECT_RATIO_INVALID | ||||
|   { 1,   1  }, // VIDEO_ASPECT_RATIO_1_1 | ||||
|   { 12,  11 }, // VIDEO_ASPECT_RATIO_12_11 | ||||
|   { 10,  11 }, // VIDEO_ASPECT_RATIO_10_11 | ||||
|   { 16,  11 }, // VIDEO_ASPECT_RATIO_16_11 | ||||
|   { 40,  33 }, // VIDEO_ASPECT_RATIO_40_33 | ||||
|   { 24,  11 }, // VIDEO_ASPECT_RATIO_24_11 | ||||
|   { 20,  11 }, // VIDEO_ASPECT_RATIO_20_11 | ||||
|   { 32,  11 }, // VIDEO_ASPECT_RATIO_32_11 | ||||
|   { 80,  33 }, // VIDEO_ASPECT_RATIO_80_33 | ||||
|   { 18,  11 }, // VIDEO_ASPECT_RATIO_18_11 | ||||
|   { 15,  11 }, // VIDEO_ASPECT_RATIO_15_11 | ||||
|   { 64,  33 }, // VIDEO_ASPECT_RATIO_64_33 | ||||
|   { 160, 99 }, // VIDEO_ASPECT_RATIO_160_99 | ||||
|   { 4,   3  }, // VIDEO_ASPECT_RATIO_4_3 | ||||
|   { 3,   2  }, // VIDEO_ASPECT_RATIO_3_2 | ||||
|   { 2,   1  }  // VIDEO_ASPECT_RATIO_2_1 | ||||
| }; | ||||
|  | ||||
| const eVideoFormat cFemonH265::videoFormatS[] = | ||||
| { | ||||
|   VIDEO_FORMAT_COMPONENT, | ||||
|   VIDEO_FORMAT_PAL, | ||||
|   VIDEO_FORMAT_NTSC, | ||||
|   VIDEO_FORMAT_SECAM, | ||||
|   VIDEO_FORMAT_MAC, | ||||
|   VIDEO_FORMAT_UNKNOWN, | ||||
|   VIDEO_FORMAT_RESERVED, | ||||
|   VIDEO_FORMAT_RESERVED | ||||
| }; | ||||
|  | ||||
| cFemonH265::cFemonH265(cFemonVideoIf *videoHandlerP) | ||||
| : videoHandlerM(videoHandlerP), | ||||
|   widthM(0), | ||||
|   heightM(0), | ||||
|   aspectRatioM(VIDEO_ASPECT_RATIO_INVALID), | ||||
|   formatM(VIDEO_FORMAT_INVALID), | ||||
|   frameRateM(0), | ||||
|   bitRateM(0), | ||||
|   scanM(VIDEO_SCAN_INVALID), | ||||
|   frameFieldInfoPresentFlagM(false) | ||||
| { | ||||
|   reset(); | ||||
| } | ||||
|  | ||||
| cFemonH265::~cFemonH265() | ||||
| { | ||||
| } | ||||
|  | ||||
| bool cFemonH265::processVideo(const uint8_t *bufP, int lenP) | ||||
| { | ||||
|   uint8_t nal_data[lenP]; | ||||
|   bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled! | ||||
|   const uint8_t *buf = bufP; | ||||
|   const uint8_t *start = buf; | ||||
|   const uint8_t *end = start + lenP; | ||||
|  | ||||
|   if (!videoHandlerM) | ||||
|      return false; | ||||
|  | ||||
|   // skip PES header | ||||
|   if (!PesLongEnough(lenP)) | ||||
|       return false; | ||||
|   buf += PesPayloadOffset(buf); | ||||
|   start = buf; | ||||
|  | ||||
|   reset(); | ||||
|  | ||||
|   for (;;) { | ||||
|       int consumed = 0; | ||||
|  | ||||
|       buf = nextStartCode(buf, end); | ||||
|       if (buf >= end) | ||||
|          break; | ||||
|  | ||||
|       switch ((buf[3] >> 1) & 0x3F) { | ||||
|         case NAL_AUD: | ||||
|              if (!aud_found) { | ||||
|                 debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP); | ||||
|                 aud_found = true; | ||||
|                 } | ||||
|              break; | ||||
|  | ||||
|         case NAL_SPS: | ||||
|              if (!sps_found) { | ||||
|                 debug2("%s Found NAL SPS at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP); | ||||
|                 int nal_len = nalUnescape(nal_data, buf + 5, int(end - buf - 5)); | ||||
|                 consumed = parseSPS(nal_data, nal_len); | ||||
|                 if (consumed > 0) | ||||
|                    sps_found = true; | ||||
|                 } | ||||
|              break; | ||||
|  | ||||
|         case NAL_SEI: | ||||
|              if (!sei_found) { | ||||
|                debug2("%s Found NAL SEI at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP); | ||||
|                int nal_len = nalUnescape(nal_data, buf + 5, int(end - buf - 5)); | ||||
|                consumed = parseSEI(nal_data, nal_len); | ||||
|                if (consumed > 0) | ||||
|                   sei_found = true; | ||||
|              } | ||||
|              break; | ||||
|  | ||||
|         default: | ||||
|              break; | ||||
|         } | ||||
|  | ||||
|       if (aud_found && sps_found && sei_found) | ||||
|          break; | ||||
|  | ||||
|       buf += consumed + 4; | ||||
|       } | ||||
|  | ||||
|      if (aud_found) { | ||||
|         videoHandlerM->SetVideoCodec(VIDEO_CODEC_H265); | ||||
|         if (sps_found) { | ||||
|            debug2("%s width=%d height=%d, aspect=%d format=%d bitrate=%.0f", __PRETTY_FUNCTION__, widthM, heightM, aspectRatioM, formatM, bitRateM); | ||||
|            videoHandlerM->SetVideoSize(widthM, heightM); | ||||
|            videoHandlerM->SetVideoFormat(formatM); | ||||
|            videoHandlerM->SetVideoAspectRatio(aspectRatioM); | ||||
|            videoHandlerM->SetVideoBitrate(bitRateM); | ||||
|            } | ||||
|         if (sps_found || sei_found) { | ||||
|            debug2("%s scan=%d framerate=%.2f", __PRETTY_FUNCTION__, scanM, frameRateM); | ||||
|            videoHandlerM->SetVideoScan(scanM); | ||||
|            videoHandlerM->SetVideoFramerate(frameRateM); | ||||
|            } | ||||
|         } | ||||
|  | ||||
|   return sps_found; | ||||
| } | ||||
|  | ||||
| void cFemonH265::reset() | ||||
| { | ||||
|   frameFieldInfoPresentFlagM = false; | ||||
| } | ||||
|  | ||||
| const uint8_t *cFemonH265::nextStartCode(const uint8_t *startP, const uint8_t *endP) | ||||
| { | ||||
|   for (endP -= 3; startP < endP; ++startP) { | ||||
|       if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01)) | ||||
|          return startP; | ||||
|       } | ||||
|   return (endP + 3); | ||||
| } | ||||
|  | ||||
| int cFemonH265::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP) | ||||
| { | ||||
|   int s = 0, d = 0; | ||||
|  | ||||
|   while (s < lenP - 3) { | ||||
|     if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) { | ||||
|        dstP[d++] = srcP[s++]; | ||||
|        dstP[d++] = srcP[s++]; | ||||
|        s++; // skip emulation_prevention_three_byte | ||||
|        } | ||||
|     else | ||||
|        dstP[d++] = srcP[s++]; | ||||
|     } | ||||
|  | ||||
|   while (s < lenP) | ||||
|     dstP[d++] = srcP[s++]; | ||||
|  | ||||
|   return d; | ||||
| } | ||||
|  | ||||
| int cFemonH265::parseSPS(const uint8_t *bufP, int lenP) | ||||
| { | ||||
|   cFemonBitStream bs(bufP, lenP); | ||||
|  | ||||
|   uint32_t width = widthM; | ||||
|   uint32_t height = heightM; | ||||
|   eVideoFormat format = formatM; | ||||
|   eVideoAspectRatio aspect_ratio = aspectRatioM; | ||||
|   eVideoScan scan = scanM; | ||||
|   double frame_rate = frameRateM; | ||||
|   double bit_rate = bitRateM; | ||||
|   bool frame_field_info_present_flag = frameFieldInfoPresentFlagM; | ||||
|  | ||||
|   const char *profile_name = NULL; | ||||
|   bool general_tier_flag, conformance_window_flag, sps_sub_layer_ordering_info_present_flag, profilePresentFlag = true; | ||||
|   bool general_max_12bit_constraint_flag = false, general_max_10bit_constraint_flag = false, general_max_8bit_constraint_flag = false; | ||||
|   bool general_max_422chroma_constraint_flag = false, general_max_420chroma_constraint_flag = false, general_max_monochrome_constraint_flag = false; | ||||
|   bool general_intra_constraint_flag = false, general_one_picture_only_constraint_flag = false, general_lower_bit_rate_constraint_flag = false; | ||||
|   bool general_progressive_source_flag, general_interlaced_source_flag, general_profile_compatibility_flag[32]; | ||||
|   uint32_t chroma_format_idc, log2_max_pic_order_cnt_lsb_minus4, num_short_term_ref_pic_sets, num_long_term_ref_pics_sps; | ||||
|   uint8_t sps_max_sub_layers_minus1, sub_layer_profile_present_flag[8], sub_layer_level_present_flag[8], general_profile_idc, general_level_idc; | ||||
|  | ||||
|   bs.SkipBits(4);                                                    // sps_video_parameter_set_id | ||||
|   sps_max_sub_layers_minus1 = bs.GetBits(3);                         // sps_max_sub_layers_minus1 | ||||
|   bs.SkipBit();                                                      // sps_temporal_id_nesting_flag | ||||
|   // start of profile_tier_level(1, sps_max_sub_layers_minus1) | ||||
|   if (profilePresentFlag) { | ||||
|      bs.SkipBits(2);                                                 // general_profile_space | ||||
|      general_tier_flag = bs.GetBit();                                // general_tier_flag | ||||
|      general_profile_idc = bs.GetBits(5);                            // general_profile_idc | ||||
|      for (int i = 0; i < 32; ++i) { | ||||
|          general_profile_compatibility_flag[i] = bs.GetBit();        // general_profile_compatibility_flag[i] | ||||
|          } | ||||
|      general_progressive_source_flag = bs.GetBit();                  // general_progressive_source_flag | ||||
|      general_interlaced_source_flag = bs.GetBit();                   // general_interlaced_source_flag | ||||
|      if (general_progressive_source_flag && !general_interlaced_source_flag) | ||||
|         scan = VIDEO_SCAN_PROGRESSIVE; | ||||
|      else if (!general_progressive_source_flag && general_interlaced_source_flag) | ||||
|         scan = VIDEO_SCAN_INTERLACED; | ||||
|      else if (!general_progressive_source_flag && !general_interlaced_source_flag) | ||||
|         scan = VIDEO_SCAN_UNKNOWN; | ||||
|      else | ||||
|         scan = VIDEO_SCAN_INVALID; | ||||
|      debug2("%s general_progressive_source_flag=%d general_interlaced_source_flag=%d scan_type=%d", __PRETTY_FUNCTION__, general_progressive_source_flag, general_interlaced_source_flag, scan); | ||||
|      bs.SkipBit();                                                   // general_non_packed_constraint_flag | ||||
|      bs.SkipBit();                                                   // general_frame_only_constraint_flag | ||||
|      if (general_profile_idc == 4 || general_profile_compatibility_flag[4] || | ||||
|          general_profile_idc == 5 || general_profile_compatibility_flag[5] || | ||||
|          general_profile_idc == 6 || general_profile_compatibility_flag[6] || | ||||
|          general_profile_idc == 7 || general_profile_compatibility_flag[7]) { | ||||
|         // the number of bits in this syntax structure is not affected by this condition | ||||
|         general_max_12bit_constraint_flag = bs.GetBit();             // general_max_12bit_constraint_flag | ||||
|         general_max_10bit_constraint_flag = bs.GetBit();             // general_max_10bit_constraint_flag | ||||
|         general_max_8bit_constraint_flag = bs.GetBit();              // general_max_8bit_constraint_flag | ||||
|         debug2("%s  general_max_12bit_constraint_flag=%d general_max_10bit_constraint_flag=%d general_max_8bit_constraint_flag=%d", __PRETTY_FUNCTION__, general_max_12bit_constraint_flag, general_max_10bit_constraint_flag, general_max_8bit_constraint_flag); | ||||
|         general_max_422chroma_constraint_flag = bs.GetBit();         // general_max_422chroma_constraint_flag | ||||
|         general_max_420chroma_constraint_flag = bs.GetBit();         // general_max_420chroma_constraint_flag | ||||
|         general_max_monochrome_constraint_flag = bs.GetBit();        // general_max_monochrome_constraint_flag | ||||
|         debug2("%s general_max_422chroma_constraint_flag=%d general_max_420chroma_constraint_flag=%d general_max_monochrome_constraint_flag=%d", __PRETTY_FUNCTION__, general_max_422chroma_constraint_flag, general_max_420chroma_constraint_flag, general_max_monochrome_constraint_flag); | ||||
|         general_intra_constraint_flag = bs.GetBit();                 // general_intra_constraint_flag | ||||
|         general_one_picture_only_constraint_flag = bs.GetBit();      // general_one_picture_only_constraint_flag | ||||
|         general_lower_bit_rate_constraint_flag = bs.GetBit();        // general_lower_bit_rate_constraint_flag | ||||
|         debug2("%s general_intra_constraint_flag=%d general_one_picture_only_constraint_flag=%d general_lower_bit_rate_constraint_flag=%d", __PRETTY_FUNCTION__, general_intra_constraint_flag, general_one_picture_only_constraint_flag, general_lower_bit_rate_constraint_flag); | ||||
|         bs.SkipBits(34);                                             // general_reserved_zero_34bits | ||||
|         } | ||||
|      else | ||||
|         bs.SkipBits(43);                                             // general_reserved_zero_43bits | ||||
|      // the number of bits in this syntax structure is not affected by this condition | ||||
|      bs.SkipBit();                                                   // general_reserved_zero_bit | ||||
|      } | ||||
|   general_level_idc = bs.GetBits(8);                                 // general_level_idc | ||||
|   debug2("%s general_profile_idc=%d general_tier_flag=%d general_level_idc=%d", __PRETTY_FUNCTION__, general_profile_idc, general_tier_flag, general_level_idc); | ||||
|   switch (general_profile_idc) { | ||||
|     default: | ||||
|     case 0: | ||||
|         profile_name = "None"; | ||||
|         break; | ||||
|     case 1: | ||||
|         profile_name = "Main"; | ||||
|         break; | ||||
|     case 2: | ||||
|         profile_name = "Main 10"; | ||||
|         break; | ||||
|     case 3: | ||||
|         profile_name = "Main Still Picture"; | ||||
|         break; | ||||
|     case 4: | ||||
|         profile_name = "Format Range Extensions"; | ||||
|         break; | ||||
|     case 5: | ||||
|         profile_name = "Format Range Extensions High Throughput"; | ||||
|         break; | ||||
|     } | ||||
|   if (general_profile_idc == 1 || general_profile_idc == 2) | ||||
|      switch (general_level_idc) { | ||||
|        case 30:  // level 1 | ||||
|             bit_rate = general_tier_flag ? 0 : 128000; | ||||
|             break; | ||||
|        case 60:  // level 2 | ||||
|             bit_rate = general_tier_flag ? 0 : 1500000; | ||||
|             break; | ||||
|        case 63:  // level 2.1 | ||||
|             bit_rate = general_tier_flag ? 0 : 3000000; | ||||
|             break; | ||||
|        case 90:  // level 3 | ||||
|             bit_rate = general_tier_flag ? 0 : 6000000; | ||||
|             break; | ||||
|        case 93:  // level 3 | ||||
|             bit_rate = general_tier_flag ? 0 : 10000000; | ||||
|             break; | ||||
|        case 120: // level 4 | ||||
|             bit_rate = general_tier_flag ? 30000000 : 12000000; | ||||
|             break; | ||||
|        case 123: // level 4.1 | ||||
|             bit_rate = general_tier_flag ? 50000000 : 20000000; | ||||
|             break; | ||||
|        case 150: // level 5 | ||||
|             bit_rate = general_tier_flag ? 100000000 : 25000000; | ||||
|             break; | ||||
|        case 153: // level 5.1 | ||||
|             bit_rate = general_tier_flag ? 160000000 : 40000000; | ||||
|             break; | ||||
|        case 156: // level 5.2 | ||||
|             bit_rate = general_tier_flag ? 240000000 : 60000000; | ||||
|             break; | ||||
|        case 180: // level 6 | ||||
|             bit_rate = general_tier_flag ? 240000000 : 60000000; | ||||
|             break; | ||||
|        case 183: // level 6.1 | ||||
|             bit_rate = general_tier_flag ? 480000000 : 120000000; | ||||
|             break; | ||||
|        case 186: // level 6.2 | ||||
|             bit_rate = general_tier_flag ? 800000000 : 240000000; | ||||
|             break; | ||||
|        default: | ||||
|             bit_rate = 0; | ||||
|             break; | ||||
|        } | ||||
|   else | ||||
|      bit_rate = 0; | ||||
|   debug2("%s profile=\"%s@L%.1f@%s\" bit_rate=%.f", __PRETTY_FUNCTION__, profile_name, (double)general_level_idc / 30, general_tier_flag ? "High" : "Main", bit_rate); | ||||
|   for (int i = 0; i < sps_max_sub_layers_minus1; ++i) { | ||||
|       sub_layer_profile_present_flag[i] = bs.GetBit();               // sub_layer_profile_present_flag[i] | ||||
|       sub_layer_level_present_flag[i] = bs.GetBit();                 // sub_layer_level_present_flag[i] | ||||
|       } | ||||
|   if (sps_max_sub_layers_minus1 > 0) { | ||||
|      for (int i = sps_max_sub_layers_minus1; i < 8; ++i) | ||||
|          bs.SkipBits(2);                                             // reserved_zero_2bits[i] | ||||
|      } | ||||
|   for (int i = 0; i < sps_max_sub_layers_minus1; ++i) { | ||||
|       if (sub_layer_profile_present_flag[i]) { | ||||
|          bs.SkipBits(2);                                             // sub_layer_profile_space[i] | ||||
|          bs.SkipBit();                                               // sub_layer_tier_flag[i] | ||||
|          bs.SkipBits(5);                                             // sub_layer_profile_idc[i] | ||||
|          bs.SkipBits(32);                                            // sub_layer_profile_compatibility_flag[i][0-31] | ||||
|          bs.SkipBit();                                               // sub_layer_progressive_source_flag[i] | ||||
|          bs.SkipBit();                                               // sub_layer_interlaced_source_flag[i] | ||||
|          bs.SkipBit();                                               // sub_layer_non_packed_constraint_flag[i] | ||||
|          bs.SkipBit();                                               // sub_layer_frame_only_constraint_flag[i] | ||||
|          // the number of bits in this syntax structure is not affected by this condition | ||||
|          bs.SkipBits(43);                                            // sub_layer_reserved_zero_43bits[i] | ||||
|          // the number of bits in this syntax structure is not affected by this condition | ||||
|          bs.SkipBit();                                               // sub_layer_reserved_zero_bit[i] | ||||
|          } | ||||
|       if (sub_layer_level_present_flag[i]) | ||||
|          bs.SkipBits(8);                                             // sub_layer_level_idc[i] | ||||
|       } | ||||
|   // end of profile_tier_level | ||||
|   bs.SkipUeGolomb();                                                 // sps_seq_parameter_set_id | ||||
|   chroma_format_idc = bs.GetUeGolomb();                              // chroma_format_idc | ||||
|   if (chroma_format_idc == 3) | ||||
|      bs.SkipBit();                                                   // separate_colour_plane_flag | ||||
|   width = bs.GetUeGolomb();                                          // pic_width_in_luma_samples | ||||
|   height = bs.GetUeGolomb();                                         // pic_height_in_luma_samples | ||||
|  | ||||
|   conformance_window_flag = bs.GetBit();                             // conformance_window_flag | ||||
|   if (conformance_window_flag) { | ||||
|      bs.SkipUeGolomb();                                              // conf_win_left_offset | ||||
|      bs.SkipUeGolomb();                                              // conf_win_right_offset | ||||
|      bs.SkipUeGolomb();                                              // conf_win_top_offset | ||||
|      bs.SkipUeGolomb();                                              // conf_win_bottom_offset | ||||
|      } | ||||
|   bs.SkipUeGolomb();                                                 // bit_depth_luma_minus8 | ||||
|   bs.SkipUeGolomb();                                                 // bit_depth_chroma_minus8 | ||||
|   log2_max_pic_order_cnt_lsb_minus4 = bs.GetUeGolomb();              // log2_max_pic_order_cnt_lsb_minus4 | ||||
|   sps_sub_layer_ordering_info_present_flag = bs.GetBit();            // sps_sub_layer_ordering_info_present_flag | ||||
|   for (int i = (sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1); i <= sps_max_sub_layers_minus1; ++i) { | ||||
|       bs.SkipUeGolomb();                                             // sps_max_dec_pic_buffering_minus1[i] | ||||
|       bs.SkipUeGolomb();                                             // sps_max_num_reorder_pics[i] | ||||
|       bs.SkipUeGolomb();                                             // sps_max_latency_increase_plus1[i] | ||||
|       } | ||||
|   bs.SkipUeGolomb();                                                 // log2_min_luma_coding_block_size_minus3 | ||||
|   bs.SkipUeGolomb();                                                 // log2_diff_max_min_luma_coding_block_size | ||||
|   bs.SkipUeGolomb();                                                 // log2_min_luma_transform_block_size_minus2 | ||||
|   bs.SkipUeGolomb();                                                 // log2_diff_max_min_luma_transform_block_size | ||||
|   bs.SkipUeGolomb();                                                 // max_transform_hierarchy_depth_inter | ||||
|   bs.SkipUeGolomb();                                                 // max_transform_hierarchy_depth_intra | ||||
|   if (bs.GetBit()) {                                                 // scaling_list_enabled_flag | ||||
|      if (bs.GetBit()) {                                              // sps_scaling_list_data_present_flag | ||||
|         // start of scaling_list_data() | ||||
|         for (int sizeId = 0; sizeId < 4; ++sizeId) { | ||||
|             for (int matrixId = 0; matrixId < 6; matrixId += (sizeId == 3) ? 3 : 1) { | ||||
|                 if (!bs.GetBit())                                    // scaling_list_pred_mode_flag[sizeId][matrixId] | ||||
|                    bs.SkipUeGolomb();                                // scaling_list_pred_matrix_id_delta[sizeId][matrixId] | ||||
|                 else { | ||||
|                    int coefNum = min(64, (1 << (4 + (sizeId << 1)))); | ||||
|                    if (sizeId > 1) | ||||
|                       bs.SkipSeGolomb();                             // scaling_list_dc_coef_minus8[sizeId−2][matrixId] | ||||
|                    for (int i = 0; i < coefNum; ++i) | ||||
|                        bs.SkipSeGolomb();                            // scaling_list_delta_coef | ||||
|                    } | ||||
|                 } | ||||
|             } | ||||
|         // end of scaling_list_data() | ||||
|         } | ||||
|      } | ||||
|   bs.SkipBit();                                                      // amp_enabled_flag | ||||
|   bs.SkipBit();                                                      // sample_adaptive_offset_enabled_flag | ||||
|   if (bs.GetBit()) {                                                 // pcm_enabled_flag | ||||
|      bs.SkipBits(4);                                                 // pcm_sample_bit_depth_luma_minus1 | ||||
|      bs.SkipBits(4);                                                 // pcm_sample_bit_depth_chroma_minus1 | ||||
|      bs.SkipUeGolomb();                                              // log2_min_pcm_luma_coding_block_size_minus3 | ||||
|      bs.SkipUeGolomb();                                              // log2_diff_max_min_pcm_luma_coding_block_size | ||||
|      bs.SkipBit();                                                   // pcm_loop_filter_disabled_flag | ||||
|      } | ||||
|   num_short_term_ref_pic_sets = bs.GetUeGolomb();                    // num_short_term_ref_pic_sets | ||||
|   uint32_t NumDeltaPocs[num_short_term_ref_pic_sets]; | ||||
|   for (uint32_t stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; ++stRpsIdx) { | ||||
|       // start of st_ref_pic_set(stRpsIdx) | ||||
|       bool inter_ref_pic_set_prediction_flag = false; | ||||
|       if (stRpsIdx != 0) | ||||
|          inter_ref_pic_set_prediction_flag = bs.GetBit();            // inter_ref_pic_set_prediction_flag | ||||
|       if (inter_ref_pic_set_prediction_flag) { | ||||
|          uint32_t RefRpsIdx, delta_idx_minus1 = 0; | ||||
|          if (stRpsIdx == num_short_term_ref_pic_sets) | ||||
|             delta_idx_minus1 = bs.GetUeGolomb();                     // delta_idx_minus1 | ||||
|          bs.SkipBit();                                               // delta_rps_sign | ||||
|          bs.SkipUeGolomb();                                          // abs_delta_rps_minus1 | ||||
|          RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1); | ||||
|          NumDeltaPocs[stRpsIdx] = 0; | ||||
|          for (uint32_t j = 0; j <= NumDeltaPocs[RefRpsIdx]; ++j) { | ||||
|              if (!bs.GetBit()) {                                     // used_by_curr_pic_flag[j] | ||||
|                 if (bs.GetBit())                                     // use_delta_flag[j] | ||||
|                    NumDeltaPocs[stRpsIdx]++; | ||||
|                 } | ||||
|              else | ||||
|                 NumDeltaPocs[stRpsIdx]++; | ||||
|              } | ||||
|          } | ||||
|       else { | ||||
|          uint32_t num_negative_pics = bs.GetUeGolomb();              // num_negative_pics | ||||
|          uint32_t num_positive_pics = bs.GetUeGolomb();              // num_positive_pics | ||||
|          for (uint32_t j = 0; j < num_negative_pics; ++j) { | ||||
|              bs.SkipUeGolomb();                                      // delta_poc_s0_minus1[i] | ||||
|              bs.SkipBit();                                           // used_by_curr_pic_s0_flag[i] | ||||
|              } | ||||
|          for (uint32_t j = 0; j < num_positive_pics; ++j) { | ||||
|              bs.SkipUeGolomb();                                      // delta_poc_s1_minus1[i] | ||||
|              bs.SkipBit();                                           // delta_poc_s1_minus1[i] | ||||
|              } | ||||
|          NumDeltaPocs[stRpsIdx] = num_negative_pics + num_positive_pics; | ||||
|          } | ||||
|       // end of st_ref_pic_set(stRpsIdx) | ||||
|       } | ||||
|   if (bs.GetBit()) {                                                 // long_term_ref_pics_present_flag | ||||
|      num_long_term_ref_pics_sps = bs.GetUeGolomb();                  // num_long_term_ref_pics_sps | ||||
|      for (uint32_t i = 0; i < num_long_term_ref_pics_sps; ++i) { | ||||
|          bs.SkipBits(log2_max_pic_order_cnt_lsb_minus4 + 4);         // lt_ref_pic_poc_lsb_sps[i] | ||||
|          bs.SkipBit();                                               // used_by_curr_pic_lt_sps_flag[i] | ||||
|          } | ||||
|      } | ||||
|   bs.SkipBit();                                                      // sps_temporal_mvp_enabled_flag | ||||
|   bs.SkipBit();                                                      // strong_intra_smoothing_enabled_flag | ||||
|   if (bs.GetBit()) {                                                 // vui_parameters_present_flag | ||||
|      // start of vui_parameters() | ||||
|      if (bs.GetBit()) {                                              // aspect_ratio_info_present_flag | ||||
|         uint32_t sar_width = 0, sar_height = 0; | ||||
|         uint8_t aspect_ratio_idc = bs.GetBits(8);                    // aspect_ratio_idc | ||||
|         debug2("%s aspect_ratio_idc=%d", __PRETTY_FUNCTION__, aspect_ratio_idc); | ||||
|         if (aspect_ratio_idc == 255) {                               // EXTENDED_SAR | ||||
|            sar_width  = bs.GetBits(16);                              // sar_width | ||||
|            sar_height = bs.GetBits(16);                              // sar_height | ||||
|            } | ||||
|         else if (aspect_ratio_idc < ELEMENTS(sarS)) { | ||||
|            sar_width  = sarS[aspect_ratio_idc].w; | ||||
|            sar_height = sarS[aspect_ratio_idc].h; | ||||
|            } | ||||
|         if (sar_width && sar_height) { | ||||
|            int index = -1, ratio = int(100.0L * sar_width * width / sar_height / height); | ||||
|            for (unsigned int i = 0; i < ELEMENTS(darS); ++i) { | ||||
|                if (darS[i].ratio == ratio) { | ||||
|                   index = i; | ||||
|                   break; | ||||
|                   } | ||||
|                } | ||||
|            if (index < 0) { | ||||
|               if (aspect_ratio_idc == 255) | ||||
|                  aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED; | ||||
|               else | ||||
|                  aspect_ratio = VIDEO_ASPECT_RATIO_INVALID; | ||||
|               } | ||||
|            else | ||||
|               aspect_ratio = darS[index].dar; | ||||
|            debug2("%s sar_width=%d sar_height=%d aspect_ratio=%d", __PRETTY_FUNCTION__, sar_width, sar_height, aspect_ratio); | ||||
|            } | ||||
|         } | ||||
|      if (bs.GetBit())                                                // overscan_info_present_flag | ||||
|         bs.SkipBit();                                                // overscan_appropriate_flag | ||||
|      if (bs.GetBit()) {                                              // video_signal_type_present_flag | ||||
|         uint32_t video_format = bs.GetBits(3);                       // video_format | ||||
|         if (video_format < ELEMENTS(videoFormatS)) { | ||||
|            format = videoFormatS[video_format]; | ||||
|            debug2("%s video_format=%d format=%d", __PRETTY_FUNCTION__, video_format, format); | ||||
|            } | ||||
|         bs.SkipBit();                                                // video_full_range_flag | ||||
|         if (bs.GetBit()) {                                           // colour_description_present_flag | ||||
|            bs.SkipBits(8);                                           // colour_primaries | ||||
|            bs.SkipBits(8);                                           // transfer_characteristics | ||||
|            bs.SkipBits(8);                                           // matrix_coeffs | ||||
|            } | ||||
|         } | ||||
|      if (bs.GetBit()) {                                              // chroma_loc_info_present_flag | ||||
|         bs.SkipUeGolomb();                                           // chroma_sample_loc_type_top_field | ||||
|         bs.SkipUeGolomb();                                           // chroma_sample_loc_type_bottom_field | ||||
|         } | ||||
|      bs.SkipBit();                                                   // neutral_chroma_indication_flag | ||||
|      bs.SkipBit();                                                   // field_seq_flag | ||||
|      frame_field_info_present_flag = bs.GetBit();                    // frame_field_info_present_flag | ||||
|      debug2("%s frame_field_info_present_flag=%d", __PRETTY_FUNCTION__, frame_field_info_present_flag); | ||||
|      if (bs.GetBit()) {                                              // default_display_window_flag | ||||
|         bs.SkipUeGolomb();                                           // def_disp_win_left_offset | ||||
|         bs.SkipUeGolomb();                                           // def_disp_win_right_offset | ||||
|         bs.SkipUeGolomb();                                           // def_disp_win_top_offset | ||||
|         bs.SkipUeGolomb();                                           // def_disp_win_bottom_offset | ||||
|         } | ||||
|      if (bs.GetBit()) {                                              // vui_timing_info_present_flag | ||||
|         uint32_t vui_num_units_in_tick = bs.GetBits(32);             // vui_num_units_in_tick | ||||
|         uint32_t vui_time_scale = bs.GetBits(32);                    // vui_time_scale | ||||
|         if (vui_num_units_in_tick > 0) { | ||||
|            frame_rate = (double)vui_time_scale / vui_num_units_in_tick; | ||||
|            debug2("%s frame_rate = vui_time_scale(%d) / vui_num_units_in_tick(%d) = %.f", __PRETTY_FUNCTION__, vui_time_scale, vui_num_units_in_tick, frame_rate); | ||||
|            } | ||||
|         if (bs.GetBit())                                             // vui_poc_proportional_to_timing_flag | ||||
|            bs.SkipUeGolomb();                                        // vui_num_ticks_poc_diff_one_minus1 | ||||
|         if (bs.GetBit()) {                                           // vui_hrd_parameters_present_flag | ||||
|            // start of hrd_parameters(1, sps_max_sub_layers_minus1) | ||||
|            uint32_t bit_rate_scale = 0; | ||||
|            bool commonInfPresentFlag = true, nal_hrd_parameters_present_flag = false, vcl_hrd_parameters_present_flag = false, sub_pic_hrd_params_present_flag = false; | ||||
|            if (commonInfPresentFlag) { | ||||
|               nal_hrd_parameters_present_flag = bs.GetBit();         // nal_hrd_parameters_present_flag | ||||
|               vcl_hrd_parameters_present_flag = bs.GetBit();         // vcl_hrd_parameters_present_flag | ||||
|               if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) { | ||||
|                  sub_pic_hrd_params_present_flag = bs.GetBit();      // sub_pic_hrd_params_present_flag | ||||
|                  if (sub_pic_hrd_params_present_flag) { | ||||
|                     bs.SkipBits(8);                                  // tick_divisor_minus2 | ||||
|                     bs.SkipBits(5);                                  // du_cpb_removal_delay_increment_length_minus1 | ||||
|                     bs.SkipBit();                                    // sub_pic_cpb_params_in_pic_timing_sei_flag | ||||
|                     bs.SkipBits(5);                                  // dpb_output_delay_du_length_minus1 | ||||
|                     } | ||||
|                  bit_rate_scale = bs.GetBits(4);                     // bit_rate_scale | ||||
|                  bs.SkipBits(4);                                     // cpb_size_scale | ||||
|                  if (sub_pic_hrd_params_present_flag) | ||||
|                     bs.SkipBits(4);                                  // cpb_size_du_scale | ||||
|                  bs.SkipBits(5);                                     // initial_cpb_removal_delay_length_minus1 | ||||
|                  bs.SkipBits(5);                                     // au_cpb_removal_delay_length_minus1 | ||||
|                  bs.SkipBits(5);                                     // dpb_output_delay_length_minus1 | ||||
|                  } | ||||
|               } | ||||
|            for (uint32_t i = 0; i <= sps_max_sub_layers_minus1; ++i) { | ||||
|                bool fixed_pic_rate_within_cvs_flag = false, low_delay_hrd_flag = false; | ||||
|                uint32_t cpb_cnt_minus1 = 0; | ||||
|                if (!bs.GetBit())                                     // fixed_pic_rate_general_flag[i] | ||||
|                   fixed_pic_rate_within_cvs_flag = bs.GetBit();      // fixed_pic_rate_within_cvs_flag[i] | ||||
|                if (fixed_pic_rate_within_cvs_flag) | ||||
|                   bs.SkipUeGolomb();                                 // elemental_duration_in_tc_minus1[i] | ||||
|                else | ||||
|                   low_delay_hrd_flag = bs.GetBit();                  // low_delay_hrd_flag[i] | ||||
|                if (!low_delay_hrd_flag) | ||||
|                   cpb_cnt_minus1 = bs.GetUeGolomb();                 // cpb_cnt_minus1[i] | ||||
|                if (nal_hrd_parameters_present_flag) { | ||||
|                   // start of sub_layer_hrd_parameters(i) | ||||
|                   for (uint32_t i = 0; i <= cpb_cnt_minus1; ++i) { | ||||
|                       uint32_t bit_rate_value_minus1; | ||||
|                       bit_rate_value_minus1 = bs.GetUeGolomb();      // bit_rate_value_minus1[i] | ||||
|                       bs.SkipUeGolomb();                             // cpb_size_value_minus1[i] | ||||
|                       if (sub_pic_hrd_params_present_flag) { | ||||
|                           bs.SkipUeGolomb();                         // cpb_size_du_value_minus1[i] | ||||
|                           bs.SkipUeGolomb();                         // bit_rate_du_value_minus1[i] | ||||
|                          } | ||||
|                       else { | ||||
|                          double bitrate = (double)((bit_rate_value_minus1 + 1) * pow(2.0, 6 + bit_rate_scale)); | ||||
|                          debug2("%s bit_rate_value_minus1(%u) + 1 * 2 ^ (6 + bit_rate_scale(%u)) = %.f",  __PRETTY_FUNCTION__, bit_rate_value_minus1, bit_rate_scale, bitrate); | ||||
|                          } | ||||
|                       bs.SkipBit();                                  // cbr_flag[i] | ||||
|                       } | ||||
|                   // end of sub_layer_hrd_parameters(i) | ||||
|                   } | ||||
|                if (vcl_hrd_parameters_present_flag) { | ||||
|                   // start of sub_layer_hrd_parameters(i) | ||||
|                   for (uint32_t i = 0; i <= cpb_cnt_minus1; ++i) { | ||||
|                       bs.SkipUeGolomb();                             // bit_rate_value_minus1[i] | ||||
|                       bs.SkipUeGolomb();                             // cpb_size_value_minus1[i] | ||||
|                       if (sub_pic_hrd_params_present_flag) { | ||||
|                           bs.SkipUeGolomb();                         // cpb_size_du_value_minus1[i] | ||||
|                           bs.SkipUeGolomb();                         // bit_rate_du_value_minus1[i] | ||||
|                          } | ||||
|                       bs.SkipBit();                                  // cbr_flag[i] | ||||
|                       } | ||||
|                   // end of sub_layer_hrd_parameters(i) | ||||
|                   } | ||||
|                } | ||||
|            // end of hrd_parameters(1, sps_max_sub_layers_minus1) | ||||
|            } | ||||
|         } | ||||
|      if (bs.GetBit()) {                                              // bitstream_restriction_flag | ||||
|         bs.SkipBit();                                                // tiles_fixed_structure_flag | ||||
|         bs.SkipBit();                                                // motion_vectors_over_pic_boundaries_flag | ||||
|         bs.SkipBit();                                                // restricted_ref_pic_lists_flag | ||||
|         bs.SkipUeGolomb();                                           // min_spatial_segmentation_idc | ||||
|         bs.SkipUeGolomb();                                           // max_bytes_per_pic_denom | ||||
|         bs.SkipUeGolomb();                                           // max_bits_per_min_cu_denom | ||||
|         bs.SkipUeGolomb();                                           // log2_max_mv_length_horizontal | ||||
|         bs.SkipUeGolomb();                                           // log2_max_mv_length_vertical | ||||
|         } | ||||
|      // end of vui_parameters() | ||||
|      } | ||||
|   if (bs.GetBit()) {                                                 // sps_extension_present_flag | ||||
|      bs.SkipBit();                                                   // sps_range_extension_flag | ||||
|      bs.SkipBit();                                                   // sps_multilayer_extension_flag | ||||
|      bs.SkipBit();                                                   // sps_3d_extension_flag | ||||
|      bs.SkipBits(5);                                                 // sps_extension_5bits | ||||
|      } | ||||
|  | ||||
|   widthM = width; | ||||
|   heightM = height; | ||||
|   formatM = format; | ||||
|   aspectRatioM = aspect_ratio; | ||||
|   scanM = scan; | ||||
|   frameRateM = frame_rate; | ||||
|   bitRateM = bit_rate; | ||||
|   frameFieldInfoPresentFlagM = frame_field_info_present_flag; | ||||
|  | ||||
|   return (bs.Index() / 8); | ||||
| } | ||||
|  | ||||
| int cFemonH265::parseSEI(const uint8_t *bufP, int lenP) | ||||
| { | ||||
|   cFemonBitStream bs(bufP, lenP); | ||||
|  | ||||
|   eVideoScan scan = scanM; | ||||
|  | ||||
|   while ((bs.Index() * 8 + 16) < lenP) {                             // sei_message | ||||
|     int len, lastByte, payloadSize = 0, payloadType = 0; | ||||
|  | ||||
|     do { | ||||
|        lastByte = bs.GetBits(8) & 0xFF; | ||||
|        payloadType += lastByte; | ||||
|     } while (lastByte == 0xFF);                                      // last_payload_type_byte | ||||
|  | ||||
|     do { | ||||
|        lastByte = bs.GetBits(8) & 0xFF; | ||||
|        payloadSize += lastByte; | ||||
|     } while (lastByte == 0xFF);                                      // last_payload_size_byte | ||||
|  | ||||
|     switch (payloadType) {                                           // sei_payload | ||||
|       case 1:                                                        // pic_timing | ||||
|            len = payloadSize * 8; | ||||
|            if (frameFieldInfoPresentFlagM) { | ||||
|               uint8_t pic_struct = bs.GetBits(4);                    // pic_struct | ||||
|               switch (pic_struct) { | ||||
|                  case 0:                                             // frame | ||||
|                  case 7:                                             // frame doubling | ||||
|                  case 8:                                             // frame tripling | ||||
|                       scan = VIDEO_SCAN_PROGRESSIVE; | ||||
|                       break; | ||||
|                  case 1:                                             // top | ||||
|                  case 2:                                             // bottom | ||||
|                  case 3:                                             // top bottom | ||||
|                  case 4:                                             // bottom top | ||||
|                  case 5:                                             // top bottom top | ||||
|                  case 6:                                             // bottom top bottom | ||||
|                  case 9:                                             // top paired with previous bottom | ||||
|                  case 10:                                            // bottom paired with previous top | ||||
|                  case 11:                                            // top paired with next bottom | ||||
|                  case 12:                                            // bottom paired with next top | ||||
|                       scan = VIDEO_SCAN_INTERLACED; | ||||
|                       break; | ||||
|                  default: | ||||
|                       scan = VIDEO_SCAN_RESERVED; | ||||
|                       break; | ||||
|                  } | ||||
|               debug2("%s pic_struct=%d scan_type=%d", __PRETTY_FUNCTION__, pic_struct, scan); | ||||
|               bs.SkipBits(2);                                        // source_scan_type | ||||
|               bs.SkipBit();                                          // duplicate_flag | ||||
|               len -= 7; | ||||
|               } | ||||
|            bs.SkipBits(len); | ||||
|            break; | ||||
|  | ||||
|       default: | ||||
|            bs.SkipBits(payloadSize * 8); | ||||
|            break; | ||||
|       } | ||||
|  | ||||
|     // force byte align | ||||
|     bs.ByteAlign(); | ||||
|     } | ||||
|  | ||||
|   scanM = scan; | ||||
|  | ||||
|   return (bs.Index() / 8); | ||||
| } | ||||
							
								
								
									
										62
									
								
								h265.h
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								h265.h
									
									
									
									
									
								
							| @@ -1,62 +0,0 @@ | ||||
| /* | ||||
|  * h265.h: Frontend Status Monitor plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef __FEMON_H265_H | ||||
| #define __FEMON_H265_H | ||||
|  | ||||
| #include "video.h" | ||||
|  | ||||
| class cFemonH265 { | ||||
| private: | ||||
|   enum { | ||||
|     NAL_VPS = 32, // Video Parameter Set | ||||
|     NAL_SPS = 33, // Sequence Parameter Set | ||||
|     NAL_PPS = 34, // Picture Parameter Set | ||||
|     NAL_AUD = 35, // Access Unit Delimiter | ||||
|     NAL_EOS = 36, // End of Sequence | ||||
|     NAL_EOB = 37, // End of Bitstream | ||||
|     NAL_SEI = 39, // Prefix Supplemental Enchancement Information | ||||
|   }; | ||||
|  | ||||
|   typedef struct DAR { | ||||
|     eVideoAspectRatio dar; | ||||
|     int               ratio; | ||||
|   } t_DAR; | ||||
|  | ||||
|   typedef struct SAR { | ||||
|     int               w; | ||||
|     int               h; | ||||
|   } t_SAR; | ||||
|  | ||||
|   cFemonVideoIf    *videoHandlerM; | ||||
|   uint32_t          widthM; | ||||
|   uint32_t          heightM; | ||||
|   eVideoAspectRatio aspectRatioM; | ||||
|   eVideoFormat      formatM; | ||||
|   double            frameRateM; | ||||
|   double            bitRateM; | ||||
|   eVideoScan        scanM; | ||||
|   bool              frameFieldInfoPresentFlagM; | ||||
|  | ||||
|   void           reset(); | ||||
|   const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end); | ||||
|   int            nalUnescape(uint8_t *dst, const uint8_t *src, int len); | ||||
|   int            parseSPS(const uint8_t *buf, int len); | ||||
|   int            parseSEI(const uint8_t *buf, int len); | ||||
|  | ||||
|   static const t_SAR        sarS[]; | ||||
|   static const t_DAR        darS[]; | ||||
|   static const eVideoFormat videoFormatS[]; | ||||
|  | ||||
| public: | ||||
|   cFemonH265(cFemonVideoIf *videoHandlerP); | ||||
|   virtual ~cFemonH265(); | ||||
|  | ||||
|   bool processVideo(const uint8_t *bufP, int lenP); | ||||
|   }; | ||||
|  | ||||
| #endif //__FEMON_H265_H | ||||
							
								
								
									
										246
									
								
								osd.c
									
									
									
									
									
								
							
							
						
						
									
										246
									
								
								osd.c
									
									
									
									
									
								
							| @@ -27,7 +27,7 @@ | ||||
| #define OSDHEIGHT                 osdHeightM             // in pixels | ||||
| #define OSDROWHEIGHT              fontM->Height()        // in pixels | ||||
| #define OSDINFOHEIGHT             (OSDROWHEIGHT * 14)     // in pixels (14 rows) | ||||
| #define OSDSTATUSHEIGHT           (OSDROWHEIGHT * 5)      // in pixels (5 rows) | ||||
| #define OSDSTATUSHEIGHT           (OSDROWHEIGHT * 6)      // in pixels (6 rows) | ||||
| #define OSDSYMBOL(id)             femonSymbols.Get(id) | ||||
| #define OSDSPACING                femonSymbols.GetSpacing() | ||||
| #define OSDROUNDING               femonSymbols.GetRounding() | ||||
| @@ -39,11 +39,12 @@ | ||||
|                                    (col == 2) ? int(round(OSDWIDTH * 0.26)) : \ | ||||
|                                                 int(round(OSDWIDTH * 0.025))) | ||||
| #define OSDSTATUSWIN_Y(offset)    (FemonConfig.GetPosition() ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) | ||||
| #define OSDSTATUSWIN_X(col)       ((col == 6) ? int(round(OSDWIDTH * 0.84)) : \ | ||||
|                                    (col == 5) ? int(round(OSDWIDTH * 0.66)) : \ | ||||
|                                    (col == 4) ? int(round(OSDWIDTH * 0.50)) : \ | ||||
|                                    (col == 3) ? int(round(OSDWIDTH * 0.35)) : \ | ||||
|                                    (col == 2) ? int(round(OSDWIDTH * 0.19)) : \ | ||||
| #define OSDSTATUSWIN_X(col)       ((col == 7) ? int(round(OSDWIDTH * 0.79)) : \ | ||||
|                                    (col == 6) ? int(round(OSDWIDTH * 0.68)) : \ | ||||
|                                    (col == 5) ? int(round(OSDWIDTH * 0.46)) : \ | ||||
|                                    (col == 4) ? int(round(OSDWIDTH * 0.37)) : \ | ||||
|                                    (col == 3) ? int(round(OSDWIDTH * 0.21)) : \ | ||||
|                                    (col == 2) ? int(round(OSDWIDTH * 0.12)) : \ | ||||
|                                                 int(round(OSDWIDTH * 0.025))) | ||||
| #define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w)) | ||||
| #define OSDBARWIDTH(x)            (OSDWIDTH * x / 100) | ||||
| @@ -59,13 +60,14 @@ | ||||
| #define OSDDRAWSTATUSFRONTEND(column, bitmap, status) \ | ||||
|         osdM->DrawBitmap(OSDSTATUSWIN_XSYMBOL(column, x), OSDSTATUSWIN_Y(offset) + y, bitmap, (frontendStatusM & status) ? FemonTheme[FemonConfig.GetTheme()].clrActiveText : FemonTheme[FemonConfig.GetTheme()].clrRed, FemonTheme[FemonConfig.GetTheme()].clrBackground) | ||||
|  | ||||
| #define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6) \ | ||||
| #define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6, label7) \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), label1, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), label2, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), label3, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), label4, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), label5, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), label6, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), label6, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ | ||||
|         osdM->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), label7, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM) | ||||
|  | ||||
| #define OSDDRAWSTATUSBAR(value) \ | ||||
|         if (value > 0) { \ | ||||
| @@ -142,7 +144,6 @@ | ||||
|  | ||||
| class cFemonDummyFont : public cFont { | ||||
| public: | ||||
|   virtual int Width(void) const { return 10; } | ||||
|   virtual int Width(uint cP) const { return 10; } | ||||
|   virtual int Width(const char *sP) const { return 50; } | ||||
|   virtual int Height(void) const { return 20; } | ||||
| @@ -166,6 +167,7 @@ cFemonOsd::cFemonOsd() | ||||
| : cOsdObject(true), cThread("femon osd"), | ||||
|   osdM(NULL), | ||||
|   receiverM(NULL), | ||||
|   frontendM(-1), | ||||
|   svdrpFrontendM(-1), | ||||
|   svdrpVideoBitRateM(-1), | ||||
|   svdrpAudioBitRateM(-1), | ||||
| @@ -176,17 +178,15 @@ cFemonOsd::cFemonOsd() | ||||
|   qualityValidM(false), | ||||
|   strengthM(0), | ||||
|   strengthValidM(false), | ||||
|   cnrM(0), | ||||
|   cnrValidM(false), | ||||
|   snrM(0), | ||||
|   snrValidM(false), | ||||
|   signalM(0), | ||||
|   signalValidM(false), | ||||
|   berM(0), | ||||
|   berValidM(false), | ||||
|   perM(0), | ||||
|   perValidM(false), | ||||
|   uncM(0), | ||||
|   uncValidM(false), | ||||
|   frontendNameM(""), | ||||
|   frontendTypeM(""), | ||||
|   frontendStatusM(DTV_STAT_HAS_NONE), | ||||
|   frontendStatusValidM(false), | ||||
|   deviceSourceM(DEVICESOURCE_DVBAPI), | ||||
|   displayModeM(FemonConfig.GetDisplayMode()), | ||||
| @@ -200,6 +200,8 @@ cFemonOsd::cFemonOsd() | ||||
| { | ||||
|   int tmp; | ||||
|   debug1("%s", __PRETTY_FUNCTION__); | ||||
|   memset(&frontendStatusM, 0, sizeof(frontendStatusM)); | ||||
|   memset(&frontendInfoM, 0, sizeof(frontendInfoM)); | ||||
|   svdrpConnectionM.handle = -1; | ||||
|   femonSymbols.Refresh(); | ||||
|   fontM = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE)); | ||||
| @@ -238,14 +240,17 @@ cFemonOsd::~cFemonOsd(void) | ||||
|      DELETENULL(osdM); | ||||
|   if (fontM) | ||||
|      DELETENULL(fontM); | ||||
|   if (frontendM >= 0) { | ||||
|      close(frontendM); | ||||
|      frontendM = -1; | ||||
|      } | ||||
|   pInstanceS = NULL; | ||||
| } | ||||
|  | ||||
| void cFemonOsd::DrawStatusWindow(void) | ||||
| { | ||||
|   cMutexLock lock(&mutexM); | ||||
|   LOCK_CHANNELS_READ; | ||||
|   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   if (osdM && channel) { | ||||
|      cBitmap *bm = NULL; | ||||
| @@ -300,14 +305,7 @@ void cFemonOsd::DrawStatusWindow(void) | ||||
|         OSDDRAWSTATUSBM(OSDSPACING); | ||||
|         } | ||||
|      if (receiverM) { | ||||
|         if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 2160)) { | ||||
|            switch (receiverM->VideoScan()) { | ||||
|               case VIDEO_SCAN_INTERLACED:  bm = &OSDSYMBOL(SYMBOL_FORMAT_2160i); break; | ||||
|               case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_2160p); break; | ||||
|               default:                     bm = &OSDSYMBOL(SYMBOL_FORMAT_2160);  break; | ||||
|               } | ||||
|            } | ||||
|         else if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 1080)) { | ||||
|         if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 1080)) { | ||||
|            switch (receiverM->VideoScan()) { | ||||
|               case VIDEO_SCAN_INTERLACED:  bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break; | ||||
|               case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break; | ||||
| @@ -341,7 +339,6 @@ void cFemonOsd::DrawStatusWindow(void) | ||||
|         switch (receiverM->VideoCodec()) { | ||||
|            case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break; | ||||
|            case VIDEO_CODEC_H264:  bm = &OSDSYMBOL(SYMBOL_H264);  break; | ||||
|            case VIDEO_CODEC_H265:  bm = &OSDSYMBOL(SYMBOL_H265);  break; | ||||
|            default:                bm = NULL;                     break; | ||||
|            } | ||||
|         OSDDRAWSTATUSBM(OSDSPACING); | ||||
| @@ -371,22 +368,23 @@ void cFemonOsd::DrawStatusWindow(void) | ||||
|      if (qualityValidM) | ||||
|         OSDDRAWSTATUSBAR(qualityM); | ||||
|      offset += OSDROWHEIGHT; | ||||
|      OSDDRAWSTATUSVALUES(signalValidM ? *cString::sprintf("STR: %s", *getSignalStrength(signalM)) : "STR: ---", | ||||
|                          cnrValidM ? *cString::sprintf("CNR: %.2f dB", cnrM) : "CNR: ---", | ||||
|                          berValidM ? *cString::sprintf("BER: %.0f", berM) : "BER: ---", | ||||
|                          perValidM ? *cString::sprintf("PER: %.0f", perM) : "PER: ---", | ||||
|                          *cString::sprintf("%s: %s", tr("Video"), *getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0))), | ||||
|                          *cString::sprintf("%s: %s", (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio"), *getBitrateKbits(receiverM ? ((receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? receiverM->AC3Bitrate() : receiverM->AudioBitrate()) : (svdrpFrontendM >= 0 ? svdrpAudioBitRateM : -1.0))) | ||||
|                         ); | ||||
|      OSDDRAWSTATUSVALUES("STR:", signalValidM ? *cString::sprintf("%04x", signalM) : "", signalValidM ? *cString::sprintf("(%2d%%)", signalM / 655) : "", | ||||
|                          "BER:", berValidM ? *cString::sprintf("%08x", berM) : "", *cString::sprintf("%s:", tr("Video")), | ||||
|                          *getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0))); | ||||
|      offset += OSDROWHEIGHT; | ||||
|      OSDDRAWSTATUSVALUES("SNR:", snrValidM ? *cString::sprintf("%04x", snrM) : "", snrValidM ? *cString::sprintf("(%2d%%)", snrM / 655) : "", | ||||
|                          "UNC:", uncValidM ? *cString::sprintf("%08x", uncM) : "", | ||||
|                          *cString::sprintf("%s:", (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")), | ||||
|                          *getBitrateKbits(receiverM ? ((receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? receiverM->AC3Bitrate() : receiverM->AudioBitrate()) : (svdrpFrontendM >= 0 ? svdrpAudioBitRateM : -1.0))); | ||||
|      offset += OSDROWHEIGHT; | ||||
|      x = OSDSYMBOL(SYMBOL_LOCK).Width(); | ||||
|      y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2; | ||||
|      if (frontendStatusValidM) { | ||||
|         OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK),    DTV_STAT_HAS_LOCK); | ||||
|         OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL),  DTV_STAT_HAS_SIGNAL); | ||||
|         OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), DTV_STAT_HAS_CARRIER); | ||||
|         OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), DTV_STAT_HAS_VITERBI); | ||||
|         OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC),    DTV_STAT_HAS_SYNC); | ||||
|         OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK),    FE_HAS_LOCK); | ||||
|         OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL),  FE_HAS_SIGNAL); | ||||
|         OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), FE_HAS_CARRIER); | ||||
|         OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), FE_HAS_VITERBI); | ||||
|         OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC),    FE_HAS_SYNC); | ||||
|         } | ||||
|      OSDDRAWSTATUSBOTTOMBAR(); | ||||
|      osdM->Flush(); | ||||
| @@ -396,8 +394,7 @@ void cFemonOsd::DrawStatusWindow(void) | ||||
| void cFemonOsd::DrawInfoWindow(void) | ||||
| { | ||||
|   cMutexLock lock(&mutexM); | ||||
|   LOCK_CHANNELS_READ; | ||||
|   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   if (osdM && channel) { | ||||
|      int offset = 0; | ||||
| @@ -593,16 +590,16 @@ void cFemonOsd::Action(void) | ||||
|            strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||
|            strengthValidM = (strengthM >= 0); | ||||
|            frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||
|            frontendStatusM = strengthValidM ? (DTV_STAT_HAS_SIGNAL | DTV_STAT_HAS_CARRIER | DTV_STAT_HAS_VITERBI | DTV_STAT_HAS_SYNC | DTV_STAT_HAS_LOCK) : DTV_STAT_HAS_NONE; | ||||
|            frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); | ||||
|            frontendStatusValidM = strengthValidM; | ||||
|            signalM = strengthM; | ||||
|            signalM = uint16_t(strengthM * 0xFFFF / 100); | ||||
|            signalValidM = strengthValidM; | ||||
|            cnrM = 0; | ||||
|            cnrValidM = false; | ||||
|            snrM = 0; | ||||
|            snrValidM = false; | ||||
|            berM = 0; | ||||
|            berValidM = false; | ||||
|            perM = 0; | ||||
|            perValidM = false; | ||||
|            uncM = 0; | ||||
|            uncValidM = false; | ||||
|            break; | ||||
|       case DEVICESOURCE_IPTV: | ||||
|            qualityM = cDevice::ActualDevice()->SignalQuality(); | ||||
| @@ -610,20 +607,49 @@ void cFemonOsd::Action(void) | ||||
|            strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||
|            strengthValidM = (strengthM >= 0); | ||||
|            frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||
|            frontendStatusM = strengthValidM ? (DTV_STAT_HAS_SIGNAL | DTV_STAT_HAS_CARRIER | DTV_STAT_HAS_VITERBI | DTV_STAT_HAS_SYNC | DTV_STAT_HAS_LOCK) : DTV_STAT_HAS_NONE; | ||||
|            frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); | ||||
|            frontendStatusValidM = strengthValidM; | ||||
|            signalM = strengthM; | ||||
|            signalM = uint16_t(strengthM * 0xFFFF / 100); | ||||
|            signalValidM = strengthValidM; | ||||
|            cnrM = qualityM; | ||||
|            cnrValidM = qualityValidM; | ||||
|            snrM = uint16_t(qualityM * 0xFFFF / 100); | ||||
|            snrValidM = qualityValidM; | ||||
|            berM = 0; | ||||
|            berValidM = false; | ||||
|            perM = 0; | ||||
|            perValidM = false; | ||||
|            uncM = 0; | ||||
|            uncValidM = false; | ||||
|            break; | ||||
|       default: | ||||
|       case DEVICESOURCE_DVBAPI: | ||||
|            if (svdrpConnectionM.handle >= 0) { | ||||
|            if (frontendM != -1) { | ||||
|               qualityM = cDevice::ActualDevice()->SignalQuality(); | ||||
|               qualityValidM = (qualityM >= 0); | ||||
|               strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||
|               strengthValidM = (strengthM >= 0); | ||||
|               frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||
|               frontendStatusValidM = (ioctl(frontendM, FE_READ_STATUS, &frontendStatusM) >= 0); | ||||
|               signalValidM = (ioctl(frontendM, FE_READ_SIGNAL_STRENGTH, &signalM) >= 0); | ||||
|               snrValidM = (ioctl(frontendM, FE_READ_SNR, &snrM) >= 0); | ||||
|               berValidM = (ioctl(frontendM, FE_READ_BER, &berM) >= 0); | ||||
|               uncValidM = (ioctl(frontendM, FE_READ_UNCORRECTED_BLOCKS, &uncM) >= 0); | ||||
|               } | ||||
|            else if (strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { | ||||
|               qualityM = cDevice::ActualDevice()->SignalQuality(); | ||||
|               qualityValidM = (qualityM >= 0); | ||||
|               strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||
|               strengthValidM = (strengthM >= 0); | ||||
|               frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||
|               frontendStatusM = (fe_status_t)(cDevice::ActualDevice()->HasLock() ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); | ||||
|               frontendStatusValidM = strengthValidM; | ||||
|               signalM = uint16_t(strengthM * 0xFFFF / 100); | ||||
|               signalValidM = strengthValidM; | ||||
|               snrM = uint16_t(qualityM * 0xFFFF / 100); | ||||
|               snrValidM = qualityValidM; | ||||
|               berM = 0; | ||||
|               berValidM = false; | ||||
|               uncM = 0; | ||||
|               uncValidM = false; | ||||
|               } | ||||
|            else if (svdrpConnectionM.handle >= 0) { | ||||
|               cmd.handle = svdrpConnectionM.handle; | ||||
|               svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd); | ||||
|               if (cmd.responseCode == 900) { | ||||
| @@ -631,9 +657,9 @@ void cFemonOsd::Action(void) | ||||
|                  qualityValidM = false; | ||||
|                  frontendStatusValidM = false; | ||||
|                  signalValidM = false; | ||||
|                  cnrValidM = false; | ||||
|                  snrValidM = false; | ||||
|                  berValidM = false; | ||||
|                  perValidM = false; | ||||
|                  uncValidM = false; | ||||
|                  for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { | ||||
|                      const char *s = line->Text(); | ||||
| 	             if (!strncasecmp(s, "CARD:", 5)) | ||||
| @@ -646,61 +672,38 @@ void cFemonOsd::Action(void) | ||||
|                         qualityM = (int)strtol(s + 5, NULL, 10); | ||||
|                         qualityValidM = (qualityM >= 0); | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "TYPE:", 5)) { | ||||
|                         frontendTypeM = s + 5; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "TYPE:", 5)) | ||||
|                         frontendInfoM.type = (fe_type_t)strtol(s + 5, NULL, 10); | ||||
|                      else if (!strncasecmp(s, "NAME:", 5)) { | ||||
|                         frontendNameM = s + 5; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "STAT:", 5)) { | ||||
|                         frontendStatusM = strtol(s + 5, NULL, 16); | ||||
|                         frontendStatusM = (fe_status_t)strtol(s + 5, NULL, 16); | ||||
|                         frontendStatusValidM = true; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "SGNL:", 5)) { | ||||
|                         signalM = atod(s + 5); | ||||
|                         signalM = (uint16_t)strtol(s + 5, NULL, 16); | ||||
|                         signalValidM = true; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "CNRA:", 5)) { | ||||
|                         cnrM = atod(s + 5); | ||||
|                         cnrValidM = true; | ||||
|                      else if (!strncasecmp(s, "SNRA:", 5)) { | ||||
|                         snrM = (uint16_t)strtol(s + 5, NULL, 16); | ||||
|                         snrValidM = true; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "BERA:", 5)) { | ||||
|                         berM = atod(s + 5); | ||||
|                         berM = (uint32_t)strtol(s + 5, NULL, 16); | ||||
|                         berValidM = true; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "PERA:", 5)) { | ||||
|                         perM = atod(s + 5); | ||||
|                         perValidM = true; | ||||
|                      else if (!strncasecmp(s, "UNCB:", 5)) { | ||||
|                         uncM = (uint32_t)strtol(s + 5, NULL, 16); | ||||
|                         uncValidM = true; | ||||
|                         } | ||||
|                      else if (!strncasecmp(s, "VIBR:", 5)) | ||||
|                         svdrpVideoBitRateM = atod(s + 5); | ||||
|                         svdrpVideoBitRateM = (double)strtol(s + 5, NULL, 10); | ||||
|                      else if (!strncasecmp(s, "AUBR:", 5)) | ||||
|                         svdrpAudioBitRateM = atod(s + 5); | ||||
|                         svdrpAudioBitRateM = (double)strtol(s + 5, NULL, 10); | ||||
|                      } | ||||
|                  } | ||||
|               } | ||||
|            else { | ||||
|               int valid; | ||||
|               qualityM = cDevice::ActualDevice()->SignalQuality(); | ||||
|               qualityValidM = (qualityM >= 0); | ||||
|               strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||
|               strengthValidM = (strengthM >= 0); | ||||
|               frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||
|               if (cDevice::ActualDevice()->SignalStats(valid, &signalM, &cnrM, NULL, &berM, &perM, &frontendStatusM)) { | ||||
|                  frontendStatusValidM = valid & DTV_STAT_VALID_STATUS; | ||||
|                  signalValidM = valid & DTV_STAT_VALID_STRENGTH; | ||||
|                  cnrValidM = valid & DTV_STAT_VALID_CNR; | ||||
|                  berValidM = valid & DTV_STAT_VALID_BERPOST; | ||||
|                  perValidM = valid & DTV_STAT_VALID_PER; | ||||
|                  } | ||||
|               else { | ||||
|                  frontendStatusValidM = false; | ||||
|                  signalValidM = false; | ||||
|                  cnrValidM = false; | ||||
|                  berValidM = false; | ||||
|                  perValidM = false; | ||||
|                  } | ||||
|               } | ||||
|            break; | ||||
|       } | ||||
|     DrawInfoWindow(); | ||||
| @@ -713,8 +716,7 @@ void cFemonOsd::Show(void) | ||||
| { | ||||
|   debug1("%s", __PRETTY_FUNCTION__); | ||||
|   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); | ||||
|   LOCK_CHANNELS_READ; | ||||
|   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|   const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   AttachFrontend(); | ||||
|  | ||||
| @@ -748,8 +750,12 @@ void cFemonOsd::Show(void) | ||||
| bool cFemonOsd::AttachFrontend(void) | ||||
| { | ||||
|   debug1("%s", __PRETTY_FUNCTION__); | ||||
|   LOCK_CHANNELS_READ; | ||||
|   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|   const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   if (frontendM >= 0) { | ||||
|      close(frontendM); | ||||
|      frontendM = -1; | ||||
|      } | ||||
|  | ||||
|   deviceSourceM = DEVICESOURCE_DVBAPI; | ||||
|   if (channel) { | ||||
| @@ -761,12 +767,30 @@ bool cFemonOsd::AttachFrontend(void) | ||||
|  | ||||
|   if (deviceSourceM == DEVICESOURCE_DVBAPI) { | ||||
|      if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { | ||||
|         if (FemonConfig.GetUseSvdrp()) { | ||||
|         cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); | ||||
|         frontendM = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1; | ||||
|         if (frontendM >= 0) { | ||||
|            if (ioctl(frontendM, FE_GET_INFO, &frontendInfoM) < 0) { | ||||
|               if (!FemonConfig.GetUseSvdrp()) | ||||
|                  error("%s Cannot read frontend info", __PRETTY_FUNCTION__); | ||||
|               close(frontendM); | ||||
|               frontendM = -1; | ||||
|               memset(&frontendInfoM, 0, sizeof(frontendInfoM)); | ||||
|               return false; | ||||
|               } | ||||
|            } | ||||
|         else if (FemonConfig.GetUseSvdrp()) { | ||||
|            if (!SvdrpConnect() || !SvdrpTune()) | ||||
|               return false; | ||||
|            } | ||||
|         else { | ||||
|            error("%s Cannot open frontend device", __PRETTY_FUNCTION__); | ||||
|            return false; | ||||
|            } | ||||
|         } | ||||
|      } | ||||
|   else | ||||
|      frontendM = -1; | ||||
|  | ||||
|   return true; | ||||
| } | ||||
| @@ -775,8 +799,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool | ||||
| { | ||||
|   debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP); | ||||
|   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); | ||||
|   LOCK_CHANNELS_READ; | ||||
|   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|   const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   if (!deviceP || !liveViewP) | ||||
|      return; | ||||
| @@ -808,8 +831,7 @@ void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP) | ||||
|      DELETENULL(receiverM); | ||||
|      } | ||||
|   if (FemonConfig.GetAnalyzeStream()) { | ||||
|      LOCK_CHANNELS_READ; | ||||
|      const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|      const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|      if (channel) { | ||||
|         receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); | ||||
|         cDevice::ActualDevice()->AttachReceiver(receiverM); | ||||
| @@ -823,8 +845,7 @@ bool cFemonOsd::DeviceSwitch(int directionP) | ||||
|   int device = cDevice::ActualDevice()->DeviceNumber(); | ||||
|   int direction = sgn(directionP); | ||||
|   if (device >= 0) { | ||||
|      LOCK_CHANNELS_READ; | ||||
|      const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|      cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|      if (channel) { | ||||
|         for (int i = 0; i < cDevice::NumDevices() - 1; i++) { | ||||
|             if (direction >= 0) { | ||||
| @@ -937,8 +958,7 @@ bool cFemonOsd::SvdrpConnect(void) | ||||
| bool cFemonOsd::SvdrpTune(void) | ||||
| { | ||||
|    if (svdrpPluginM && svdrpConnectionM.handle >= 0) { | ||||
|       LOCK_CHANNELS_READ; | ||||
|       const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|       cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|       if (channel) { | ||||
|          SvdrpCommand_v1_0 cmd; | ||||
|          cmd.handle = svdrpConnectionM.handle; | ||||
| @@ -998,8 +1018,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | ||||
|             if ((numberM == 0) && (oldNumberM != 0)) { | ||||
|                numberM = oldNumberM; | ||||
|                oldNumberM = cDevice::CurrentChannel(); | ||||
|                LOCK_CHANNELS_READ; | ||||
|                Channels->SwitchTo(numberM); | ||||
|                Channels.SwitchTo(numberM); | ||||
|                numberM = 0; | ||||
|                return osContinue; | ||||
|                } | ||||
| @@ -1008,12 +1027,11 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | ||||
|                numberM = numberM * 10 + keyP - k0; | ||||
|                if (numberM > 0) { | ||||
|                   DrawStatusWindow(); | ||||
|                   LOCK_CHANNELS_READ; | ||||
|                   const cChannel *ch = Channels->GetByNumber(numberM); | ||||
|                   cChannel *ch = Channels.GetByNumber(numberM); | ||||
|                   inputTimeM.Set(0); | ||||
|                   // Lets see if there can be any useful further input: | ||||
|                   int n = ch ? numberM * 10 : 0; | ||||
|                   while (ch && (ch = Channels->Next(ch)) != NULL) { | ||||
|                   while (ch && (ch = Channels.Next(ch)) != NULL) { | ||||
|                         if (!ch->GroupSep()) { | ||||
|                            if (n <= ch->Number() && ch->Number() <= n + 9) { | ||||
|                               n = 0; | ||||
| @@ -1026,7 +1044,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | ||||
|                   if (n > 0) { | ||||
|                      // This channel is the only one that fits the input, so let's take it right away: | ||||
|                      oldNumberM = cDevice::CurrentChannel(); | ||||
|                      Channels->SwitchTo(numberM); | ||||
|                      Channels.SwitchTo(numberM); | ||||
|                      numberM = 0; | ||||
|                      } | ||||
|                   } | ||||
| @@ -1086,10 +1104,9 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | ||||
|             break; | ||||
|        case kNone: | ||||
|             if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) { | ||||
|                LOCK_CHANNELS_READ; | ||||
|                if (Channels->GetByNumber(numberM)) { | ||||
|                if (Channels.GetByNumber(numberM)) { | ||||
|                   oldNumberM = cDevice::CurrentChannel(); | ||||
|                   Channels->SwitchTo(numberM); | ||||
|                   Channels.SwitchTo(numberM); | ||||
|                   numberM = 0; | ||||
|                   } | ||||
|                else { | ||||
| @@ -1101,8 +1118,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | ||||
|        case kOk: | ||||
|             { | ||||
|             // toggle between display modes | ||||
|             LOCK_CHANNELS_READ; | ||||
|             const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|             cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|             if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++; | ||||
|             if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0; | ||||
|             DrawInfoWindow(); | ||||
|   | ||||
							
								
								
									
										18
									
								
								osd.h
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								osd.h
									
									
									
									
									
								
							| @@ -8,7 +8,9 @@ | ||||
| #ifndef __FEMON_OSD_H | ||||
| #define __FEMON_OSD_H | ||||
|  | ||||
| #include <linux/dvb/frontend.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <vdr/osd.h> | ||||
| #include <vdr/thread.h> | ||||
| #include <vdr/status.h> | ||||
| @@ -35,6 +37,7 @@ private: | ||||
|  | ||||
|   cOsd             *osdM; | ||||
|   cFemonReceiver   *receiverM; | ||||
|   int               frontendM; | ||||
|   int               svdrpFrontendM; | ||||
|   double            svdrpVideoBitRateM; | ||||
|   double            svdrpAudioBitRateM; | ||||
| @@ -46,17 +49,16 @@ private: | ||||
|   bool              qualityValidM; | ||||
|   int               strengthM; | ||||
|   bool              strengthValidM; | ||||
|   double            cnrM; | ||||
|   bool              cnrValidM; | ||||
|   double            signalM; | ||||
|   uint16_t          snrM; | ||||
|   bool              snrValidM; | ||||
|   uint16_t          signalM; | ||||
|   bool              signalValidM; | ||||
|   double            berM; | ||||
|   uint32_t          berM; | ||||
|   bool              berValidM; | ||||
|   double            perM; | ||||
|   bool              perValidM; | ||||
|   uint32_t          uncM; | ||||
|   bool              uncValidM; | ||||
|   cString           frontendNameM; | ||||
|   cString           frontendTypeM; | ||||
|   int               frontendStatusM; | ||||
|   fe_status_t       frontendStatusM; | ||||
|   bool              frontendStatusValidM; | ||||
|   dvb_frontend_info frontendInfoM; | ||||
|   eDeviceSourceType deviceSourceM; | ||||
|   | ||||
							
								
								
									
										133
									
								
								po/de_DE.po
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								po/de_DE.po
									
									
									
									
									
								
							| @@ -1,22 +1,21 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Peter Marquardt | ||||
| # Andreas Brachold | ||||
| # Christian Wieninger  | ||||
| # Winfried | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Christian Wieninger\n" | ||||
| "Language-Team: German <vdr@linuxtv.org>\n" | ||||
| "Language: de\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=utf-8\n" | ||||
| "Content-Type: text/plain; charset=ISO-8859-15\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
|  | ||||
| msgid "DVB Signal Information Monitor (OSD)" | ||||
| @@ -26,7 +25,7 @@ msgid "Signal Information" | ||||
| msgstr "Signalinformationen" | ||||
|  | ||||
| msgid "Femon not available" | ||||
| msgstr "Femon nicht verfügbar" | ||||
| msgstr "Femon nicht verf<EFBFBD>gbar" | ||||
|  | ||||
| msgid "Video" | ||||
| msgstr "Video" | ||||
| @@ -62,7 +61,7 @@ msgid "Coderate" | ||||
| msgstr "Coderate" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protokoll" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Bitrate" | ||||
| msgstr "Bitrate" | ||||
| @@ -71,28 +70,28 @@ msgid "Stream Information" | ||||
| msgstr "Streaminformation" | ||||
|  | ||||
| msgid "Video Stream" | ||||
| msgstr "Videostream" | ||||
| msgstr "Video Stream" | ||||
|  | ||||
| msgid "Codec" | ||||
| msgstr "Codec" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Aspect Ratio" | ||||
| msgstr "Seitenverhältnis" | ||||
| msgstr "Seitenverh<EFBFBD>ltnis" | ||||
|  | ||||
| msgid "Frame Rate" | ||||
| msgstr "Bildrate" | ||||
|  | ||||
| msgid "Video Format" | ||||
| msgstr "Videoformat" | ||||
| msgstr "Bildformat" | ||||
|  | ||||
| msgid "Resolution" | ||||
| msgstr "Auflösung" | ||||
| msgstr "Aufl<EFBFBD>sung" | ||||
|  | ||||
| msgid "Audio Stream" | ||||
| msgstr "Audiostream" | ||||
| msgstr "Audio Stream" | ||||
|  | ||||
| msgid "Channel Mode" | ||||
| msgstr "Kanalmodus" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Sampling Frequency" | ||||
| msgstr "Abtastrate" | ||||
| @@ -116,7 +115,7 @@ msgid "Dolby Surround Mode" | ||||
| msgstr "Dolby Surround Modus" | ||||
|  | ||||
| msgid "Low Frequency Effects" | ||||
| msgstr "Tieftöner Effekte" | ||||
| msgstr "Tieft<EFBFBD>ner Effekte" | ||||
|  | ||||
| msgid "Dialogue Normalization" | ||||
| msgstr "Dialog Normalisierung" | ||||
| @@ -130,15 +129,6 @@ msgstr "Transponder" | ||||
| msgid "stream" | ||||
| msgstr "Stream" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Klassischer" | ||||
|  | ||||
| @@ -170,88 +160,82 @@ msgid "PearlHD" | ||||
| msgstr "PearlHD" | ||||
|  | ||||
| msgid "Hide main menu entry" | ||||
| msgstr "Hauptmenüeintrag verstecken" | ||||
| msgstr "Hauptmen<EFBFBD>eintrag verstecken" | ||||
|  | ||||
| msgid "Define whether the main menu entry is hidden." | ||||
| msgstr "Legt fest, ob der Hauptmenüeintrag ausgeblendet ist." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default display mode" | ||||
| msgstr "Standard Anzeigemodus" | ||||
|  | ||||
| msgid "Define the default display mode at startup." | ||||
| msgstr "Definiert den Standard-Anzeigemodus beim Start." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used OSD skin." | ||||
| msgstr "Definiert die verwendete OSD-Oberfläche." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used OSD theme." | ||||
| msgstr "Definiert das verwendete OSD-Theme." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Position" | ||||
| msgstr "Position" | ||||
|  | ||||
| msgid "Define the position of OSD." | ||||
| msgstr "Definiert die Position des OSD." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Downscale OSD size [%]" | ||||
| msgstr "OSD Größe verkleinern [%]" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Definiert den Verkleinerungsfaktor der OSD-Größe." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "Signalpegel Einheiten" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "Definiert der Einheit für Signalpegel." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Grenze Rot [%]" | ||||
|  | ||||
| msgid "Define a limit for red bar, which is used to indicate a bad signal." | ||||
| msgstr "Definiert einen Grenzwert für den roten Balken, um ein schlechtes Signal zu kennzeichnen." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Green limit [%]" | ||||
| msgstr "Grenze Grün [%]" | ||||
| msgstr "Grenze Gr<EFBFBD>n [%]" | ||||
|  | ||||
| msgid "Define a limit for green bar, which is used to indicate a good signal." | ||||
| msgstr "Definiert einen Grenzwert für den grünen Balken, um ein gutes Signal zu kennzeichnen." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "OSD update interval [0.1s]" | ||||
| msgstr "OSD Updateintervall [0.1s]" | ||||
|  | ||||
| msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." | ||||
| msgstr "Definiert den Intervall für OSD-Updates. Ein kleineres Intervall erzeugt eine höhere CPU-Last." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Analyze stream" | ||||
| msgstr "Stream analysieren" | ||||
|  | ||||
| msgid "Define whether the DVB stream is analyzed and bitrates calculated." | ||||
| msgstr "Definiert ob der DVB-Stream analysiert und die Bitraten berechnet werden." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Calculation interval [0.1s]" | ||||
| msgstr "Berechnungsintervall [0.1s]" | ||||
|  | ||||
| msgid "Define an interval for calculation. The bigger interval generates more stable values." | ||||
| msgstr "Definiert den Intervall für die Berechnung. Ein größerer Intervall erzeugt stabilere Werte." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Use SVDRP service" | ||||
| msgstr "SVDRP-Service verwenden" | ||||
| msgstr "SVDRP Service verwenden" | ||||
|  | ||||
| msgid "Define whether the SVDRP service is used in client/server setups." | ||||
| msgstr "Legt fest, ob der SVDRP-Service in Client/Server-Setups verwendet wird." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "SVDRP service port" | ||||
| msgstr "SVDRP-Service Port" | ||||
| msgstr "SVDRP Service Port" | ||||
|  | ||||
| msgid "Define the port number of SVDRP service." | ||||
| msgstr "Definiert die Portnummer des SVDRP-Service." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "SVDRP service IP" | ||||
| msgstr "SVDRP-Service IP" | ||||
| msgstr "SVDRP Service IP" | ||||
|  | ||||
| msgid "Define the IP address of SVDRP service." | ||||
| msgstr "Definiert die IP-Adresse des SVDRP-Service." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Hilfe" | ||||
| @@ -263,67 +247,64 @@ msgid "Analog" | ||||
| msgstr "Analog" | ||||
|  | ||||
| msgid "MPEG-2" | ||||
| msgstr "MPEG-2" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-1 Layer II" | ||||
| msgstr "MPEG-1 Layer II" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-1 Layer III" | ||||
| msgstr "MPEG-1 Layer III" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-2 Layer I" | ||||
| msgstr "MPEG-2 Layer I" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-2 Layer II" | ||||
| msgstr "MPEG-2 Layer II" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-2 Layer III" | ||||
| msgstr "MPEG-2 Layer III" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "HE-AAC" | ||||
| msgstr "HE-AAC" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "LATM" | ||||
| msgstr "LATM" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "stereo" | ||||
| msgstr "Stereo" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "joint Stereo" | ||||
| msgstr "Joint-Stereo" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "dual" | ||||
| msgstr "Dual" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "mono" | ||||
| msgstr "Mono" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "interlaced" | ||||
| msgstr "Interlaced" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "progressive" | ||||
| msgstr "Progressiv" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "reserved" | ||||
| msgstr "belegt" | ||||
|  | ||||
| msgid "extended" | ||||
| msgstr "erweitert" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "unknown" | ||||
| msgstr "unbekannt" | ||||
|  | ||||
| msgid "component" | ||||
| msgstr "Komponentenvideo" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "PAL" | ||||
| msgstr "PAL" | ||||
| @@ -332,10 +313,10 @@ msgid "NTSC" | ||||
| msgstr "NTSC" | ||||
|  | ||||
| msgid "SECAM" | ||||
| msgstr "SECAM" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MAC" | ||||
| msgstr "MAC" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Hz" | ||||
| msgstr "Hz" | ||||
| @@ -350,7 +331,7 @@ msgid "Visually Impaired (VI)" | ||||
| msgstr "Sehbehindert (VI)" | ||||
|  | ||||
| msgid "Hearing Impaired (HI)" | ||||
| msgstr "Hörbehindert (HI)" | ||||
| msgstr "H<EFBFBD>rbehindert (HI)" | ||||
|  | ||||
| msgid "Dialogue (D)" | ||||
| msgstr "Dialog (D)" | ||||
| @@ -362,7 +343,7 @@ msgid "Emergency (E)" | ||||
| msgstr "Notfall (E)" | ||||
|  | ||||
| msgid "Voice Over (VO)" | ||||
| msgstr "Überlagerte Stimme (VO)" | ||||
| msgstr "<EFBFBD>berlagerte Stimme (VO)" | ||||
|  | ||||
| msgid "Karaoke" | ||||
| msgstr "Karaoke" | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/es_ES.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/es_ES.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Luis Palacios | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Luis Palacios\n" | ||||
| "Language-Team: Spanish <vdr@linuxtv.org>\n" | ||||
| "Language: es\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "Transpondedor" | ||||
| msgid "stream" | ||||
| msgstr "Flujo" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Cl<43>sico" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "L<>mite de rojo [%s]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "" | ||||
| msgid "H.264" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/et_EE.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/et_EE.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Arthur Konovalov | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Arthur Konovalov\n" | ||||
| "Language-Team: Estonian <vdr@linuxtv.org>\n" | ||||
| "Language: et\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "transponder" | ||||
| msgid "stream" | ||||
| msgstr "voog" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Classic" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "Ekraanimen | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Ekraanimen<65><6E> suuruse v<>hendamise m<><6D>ritlemine" | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Punase limiit [%]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layet I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										31
									
								
								po/fi_FI.po
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								po/fi_FI.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Rolf Ahrenberg | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2019-10-27 16:29+0200\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Rolf Ahrenberg\n" | ||||
| "Language-Team: Finnish <vdr@linuxtv.org>\n" | ||||
| "Language: fi\n" | ||||
| @@ -127,17 +127,8 @@ msgstr "transponderi" | ||||
| msgid "stream" | ||||
| msgstr "lähete" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "" | ||||
| msgstr "Klassinen" | ||||
|  | ||||
| msgid "Elchi" | ||||
| msgstr "Elchi" | ||||
| @@ -196,12 +187,6 @@ msgstr "Pienennä näytön kokoa [%]" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Määrittele näytön pienennyssuhde." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "Signaalitason yksikkö" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "Määrittele yksikkö signaalin tasolle." | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Punaisen taso [%]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 kerros I" | ||||
|  | ||||
| @@ -405,6 +387,3 @@ msgstr "Mbit/s" | ||||
|  | ||||
| msgid "kbit/s" | ||||
| msgstr "kbit/s" | ||||
|  | ||||
| #~ msgid "Clasxsic" | ||||
| #~ msgstr "Klassinen" | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/fr_FR.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/fr_FR.po
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Nicolas Huillard | ||||
| # Michaël Nival <mnival@club-internet.fr>, 2010 | ||||
| @@ -7,10 +7,10 @@ | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n" | ||||
| "Language-Team: French <vdr@linuxtv.org>\n" | ||||
| "Language: fr\n" | ||||
| @@ -129,15 +129,6 @@ msgstr "transpondeur" | ||||
| msgid "stream" | ||||
| msgstr "flux" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Classique" | ||||
|  | ||||
| @@ -198,12 +189,6 @@ msgstr "Réduit la taille de l'OSD (%)" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Définit le ration de réduction de l'OSD." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Limite du rouge (%)" | ||||
|  | ||||
| @@ -267,9 +252,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/hu_HU.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/hu_HU.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # F<>ley Istv<74>n <ifuley at tigercomp dot ro>, 2011 | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: F<>ley Istv<74>n <ifuley at tigercomp dot ro>\n" | ||||
| "Language-Team: Hungarian <ifuley at tigercomp dot ro>\n" | ||||
| "Language: hu\n" | ||||
| @@ -130,15 +130,6 @@ msgstr "transponder" | ||||
| msgid "stream" | ||||
| msgstr "adatfolyam (stream)" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Klasszikus" | ||||
|  | ||||
| @@ -199,12 +190,6 @@ msgstr "Az OSD lem | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Az OSD m<>ret<65>nek lem<65>retez<65>se sz<73>zal<61>kban." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Piros sz<73>nt hat<61>ra [%]" | ||||
|  | ||||
| @@ -268,9 +253,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/it_IT.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/it_IT.po
									
									
									
									
									
								
							| @@ -1,15 +1,15 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Sean Carlos | ||||
| # Diego Pierotto <vdr-italian@tiscali.it> | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" | ||||
| "Language-Team: Italian <vdr@linuxtv.org>\n" | ||||
| "Language: it\n" | ||||
| @@ -131,15 +131,6 @@ msgstr "transponder" | ||||
| msgid "stream" | ||||
| msgstr "flusso" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Classico" | ||||
|  | ||||
| @@ -200,12 +191,6 @@ msgstr "Riduci dimensione OSD [%]" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Definisci il rapporto di riduzione della dimensione OSD." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Limite rosso [%]" | ||||
|  | ||||
| @@ -269,9 +254,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/lt_LT.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/lt_LT.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Valdemaras Pipiras | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" | ||||
| "Language-Team: Lithuanian <vdr@linuxtv.org>\n" | ||||
| "Language: lt\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "Siųstuvas" | ||||
| msgid "stream" | ||||
| msgstr "Srautas" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Klasikinis" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "Sumažinti ekrano užsklandos (OSD) dydį [%]" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Nustatyti ekrano užsklandos (OSD) mažinimo santykį." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Raudonoji ribą [%]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										408
									
								
								po/pl_PL.po
									
									
									
									
									
								
							
							
						
						
									
										408
									
								
								po/pl_PL.po
									
									
									
									
									
								
							| @@ -1,408 +0,0 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the vdr-femon package. | ||||
| # Tomasz Maciej Nowak, 2017. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "Last-Translator: Tomasz Maciej Nowak <tomek_n@o2.pl>\n" | ||||
| "Language-Team: Polish <vdr@linuxtv.org>\n" | ||||
| "Language: pl_PL\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "X-Generator: Poedit 1.8.11\n" | ||||
|  | ||||
| msgid "DVB Signal Information Monitor (OSD)" | ||||
| msgstr "Monitor sygnału DVB (OSD)" | ||||
|  | ||||
| msgid "Signal Information" | ||||
| msgstr "Informacja o sygnale" | ||||
|  | ||||
| msgid "Femon not available" | ||||
| msgstr "Femon niedostępny" | ||||
|  | ||||
| msgid "Video" | ||||
| msgstr "Obraz" | ||||
|  | ||||
| msgid "AC-3" | ||||
| msgstr "AC-3" | ||||
|  | ||||
| msgid "Audio" | ||||
| msgstr "Dźwięk" | ||||
|  | ||||
| msgid "Transponder Information" | ||||
| msgstr "Informacje o transponderze" | ||||
|  | ||||
| msgid "Apid" | ||||
| msgstr "Apid" | ||||
|  | ||||
| msgid "Dpid" | ||||
| msgstr "Dpid" | ||||
|  | ||||
| msgid "Spid" | ||||
| msgstr "Spid" | ||||
|  | ||||
| msgid "Nid" | ||||
| msgstr "Nid" | ||||
|  | ||||
| msgid "Tid" | ||||
| msgstr "Tid" | ||||
|  | ||||
| msgid "Rid" | ||||
| msgstr "Rid" | ||||
|  | ||||
| msgid "Coderate" | ||||
| msgstr "Sprawność kodowania" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protokół" | ||||
|  | ||||
| msgid "Bitrate" | ||||
| msgstr "Przepływność" | ||||
|  | ||||
| msgid "Stream Information" | ||||
| msgstr "Informacje o strumieniu" | ||||
|  | ||||
| msgid "Video Stream" | ||||
| msgstr "Strumień obrazu" | ||||
|  | ||||
| msgid "Codec" | ||||
| msgstr "Kodek" | ||||
|  | ||||
| msgid "Aspect Ratio" | ||||
| msgstr "Proporcje obrazu" | ||||
|  | ||||
| msgid "Frame Rate" | ||||
| msgstr "Tempo wyświetlania klatek" | ||||
|  | ||||
| msgid "Video Format" | ||||
| msgstr "Format obrazu" | ||||
|  | ||||
| msgid "Resolution" | ||||
| msgstr "Rozdzielczość" | ||||
|  | ||||
| msgid "Audio Stream" | ||||
| msgstr "Strumień dźwięku" | ||||
|  | ||||
| msgid "Channel Mode" | ||||
| msgstr "Tryb kanału" | ||||
|  | ||||
| msgid "Sampling Frequency" | ||||
| msgstr "Częstotliwość próbkowania" | ||||
|  | ||||
| msgid "AC-3 Stream" | ||||
| msgstr "Strumień AC-3" | ||||
|  | ||||
| msgid "Bit Stream Mode" | ||||
| msgstr "Tryb strumienia bitów" | ||||
|  | ||||
| msgid "Audio Coding Mode" | ||||
| msgstr "Tryb kodowania dźwięku" | ||||
|  | ||||
| msgid "Center Mix Level" | ||||
| msgstr "Poziom Center Mix" | ||||
|  | ||||
| msgid "Surround Mix Level" | ||||
| msgstr "Poziom Surround Mix" | ||||
|  | ||||
| msgid "Dolby Surround Mode" | ||||
| msgstr "Tryb Dolby Surround" | ||||
|  | ||||
| msgid "Low Frequency Effects" | ||||
| msgstr "Efekty niskich frekwencji" | ||||
|  | ||||
| msgid "Dialogue Normalization" | ||||
| msgstr "Normalizacja dialogów" | ||||
|  | ||||
| msgid "basic" | ||||
| msgstr "podstawowy" | ||||
|  | ||||
| msgid "transponder" | ||||
| msgstr "transponder" | ||||
|  | ||||
| msgid "stream" | ||||
| msgstr "strumień" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Klasyczna" | ||||
|  | ||||
| msgid "Elchi" | ||||
| msgstr "Elchi" | ||||
|  | ||||
| msgid "ST:TNG" | ||||
| msgstr "ST:TNG" | ||||
|  | ||||
| msgid "DeepBlue" | ||||
| msgstr "DeepBlue" | ||||
|  | ||||
| msgid "Moronimo" | ||||
| msgstr "Moronimo" | ||||
|  | ||||
| msgid "Enigma" | ||||
| msgstr "Enigma" | ||||
|  | ||||
| msgid "EgalsTry" | ||||
| msgstr "EgalsTry" | ||||
|  | ||||
| msgid "Duotone" | ||||
| msgstr "Duotone" | ||||
|  | ||||
| msgid "SilverGreen" | ||||
| msgstr "SilverGreen" | ||||
|  | ||||
| msgid "PearlHD" | ||||
| msgstr "PearlHD" | ||||
|  | ||||
| msgid "Hide main menu entry" | ||||
| msgstr "Ukryj pozycję w głównym menu" | ||||
|  | ||||
| msgid "Define whether the main menu entry is hidden." | ||||
| msgstr "Określa czy pozycja w głównym menu jest ukryta." | ||||
|  | ||||
| msgid "Default display mode" | ||||
| msgstr "Domyślny tryb wyświetlania" | ||||
|  | ||||
| msgid "Define the default display mode at startup." | ||||
| msgstr "Określa domyślny tryb wyświetlania przy uruchamianiu." | ||||
|  | ||||
| msgid "Define the used OSD skin." | ||||
| msgstr "Określa używaną skórkę OSD." | ||||
|  | ||||
| msgid "Define the used OSD theme." | ||||
| msgstr "Określa używany motyw OSD." | ||||
|  | ||||
| msgid "Position" | ||||
| msgstr "Pozycja" | ||||
|  | ||||
| msgid "Define the position of OSD." | ||||
| msgstr "Określa pozycję OSD." | ||||
|  | ||||
| msgid "Downscale OSD size [%]" | ||||
| msgstr "Zmniejsz rozmiar OSD [%]" | ||||
|  | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Określa procent zmniejszenia OSD." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Czerwony - zakres [%]" | ||||
|  | ||||
| msgid "Define a limit for red bar, which is used to indicate a bad signal." | ||||
| msgstr "Określa zakres czerwonego paska, pokazującego zły sygnał." | ||||
|  | ||||
| msgid "Green limit [%]" | ||||
| msgstr "Zielony - zakres [%]" | ||||
|  | ||||
| msgid "Define a limit for green bar, which is used to indicate a good signal." | ||||
| msgstr "Określa zakres zielonego paska, pokazującego dobry sygnał." | ||||
|  | ||||
| msgid "OSD update interval [0.1s]" | ||||
| msgstr "Interwał aktualizacji OSD [0,1s]" | ||||
|  | ||||
| msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." | ||||
| msgstr "Określa interwał aktualizacji danych w OSD. Mniejszy interwał generuje większe obciążenie CPU." | ||||
|  | ||||
| msgid "Analyze stream" | ||||
| msgstr "Analiza strumienia" | ||||
|  | ||||
| msgid "Define whether the DVB stream is analyzed and bitrates calculated." | ||||
| msgstr "Określa czy strumień DVB jest analizowany a przepływność obliczana." | ||||
|  | ||||
| msgid "Calculation interval [0.1s]" | ||||
| msgstr "Interwał obliczeń [0,1s]" | ||||
|  | ||||
| msgid "Define an interval for calculation. The bigger interval generates more stable values." | ||||
| msgstr "Określa interwał obliczeń. Większy interwał generuje stabilniejsze wartości." | ||||
|  | ||||
| msgid "Use SVDRP service" | ||||
| msgstr "Używaj usługi SVDRP" | ||||
|  | ||||
| msgid "Define whether the SVDRP service is used in client/server setups." | ||||
| msgstr "Określa czy używać usługi SVDRP w kownfiguracjach serwer/klient." | ||||
|  | ||||
| msgid "SVDRP service port" | ||||
| msgstr "Port usługi SVDRP" | ||||
|  | ||||
| msgid "Define the port number of SVDRP service." | ||||
| msgstr "Określa numer portu usługi SVDRP." | ||||
|  | ||||
| msgid "SVDRP service IP" | ||||
| msgstr "IP usługi SVDRP" | ||||
|  | ||||
| msgid "Define the IP address of SVDRP service." | ||||
| msgstr "Określa adres IP usługi SVDRP." | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Pomoc" | ||||
|  | ||||
| msgid "Fixed" | ||||
| msgstr "Stały" | ||||
|  | ||||
| msgid "Analog" | ||||
| msgstr "Analog" | ||||
|  | ||||
| msgid "MPEG-2" | ||||
| msgstr "MPEG-2" | ||||
|  | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
| msgid "MPEG-1 Layer II" | ||||
| msgstr "MPEG-1 Layer II" | ||||
|  | ||||
| msgid "MPEG-1 Layer III" | ||||
| msgstr "MPEG-1 Layer III" | ||||
|  | ||||
| msgid "MPEG-2 Layer I" | ||||
| msgstr "MPEG-2 Layer I" | ||||
|  | ||||
| msgid "MPEG-2 Layer II" | ||||
| msgstr "MPEG-2 Layer II" | ||||
|  | ||||
| msgid "MPEG-2 Layer III" | ||||
| msgstr "MPEG-2 Layer III" | ||||
|  | ||||
| msgid "HE-AAC" | ||||
| msgstr "HE-AAC" | ||||
|  | ||||
| msgid "LATM" | ||||
| msgstr "LATM" | ||||
|  | ||||
| msgid "stereo" | ||||
| msgstr "stereo" | ||||
|  | ||||
| msgid "joint Stereo" | ||||
| msgstr "połączone stereo" | ||||
|  | ||||
| msgid "dual" | ||||
| msgstr "podwójne" | ||||
|  | ||||
| msgid "mono" | ||||
| msgstr "mono" | ||||
|  | ||||
| msgid "interlaced" | ||||
| msgstr "z przeplotem" | ||||
|  | ||||
| msgid "progressive" | ||||
| msgstr "progresywne" | ||||
|  | ||||
| msgid "reserved" | ||||
| msgstr "zamknięte" | ||||
|  | ||||
| msgid "extended" | ||||
| msgstr "rozszerzone" | ||||
|  | ||||
| msgid "unknown" | ||||
| msgstr "nieznane" | ||||
|  | ||||
| msgid "component" | ||||
| msgstr "komponent" | ||||
|  | ||||
| msgid "PAL" | ||||
| msgstr "PAL" | ||||
|  | ||||
| msgid "NTSC" | ||||
| msgstr "NTSC" | ||||
|  | ||||
| msgid "SECAM" | ||||
| msgstr "SECAM" | ||||
|  | ||||
| msgid "MAC" | ||||
| msgstr "MAC" | ||||
|  | ||||
| msgid "Hz" | ||||
| msgstr "Hz" | ||||
|  | ||||
| msgid "Complete Main (CM)" | ||||
| msgstr "Complete Main (CM)" | ||||
|  | ||||
| msgid "Music and Effects (ME)" | ||||
| msgstr "Muzyka i efekty (ME)" | ||||
|  | ||||
| msgid "Visually Impaired (VI)" | ||||
| msgstr "Upośledzone wzrokowo (VI)" | ||||
|  | ||||
| msgid "Hearing Impaired (HI)" | ||||
| msgstr "Upośledzone słuchowo (HI)" | ||||
|  | ||||
| msgid "Dialogue (D)" | ||||
| msgstr "Dialog (D)" | ||||
|  | ||||
| msgid "Commentary (C)" | ||||
| msgstr "Komentarz (C)" | ||||
|  | ||||
| msgid "Emergency (E)" | ||||
| msgstr "Nagły wypadek (E)" | ||||
|  | ||||
| msgid "Voice Over (VO)" | ||||
| msgstr "Naniesiony głos (VO)" | ||||
|  | ||||
| msgid "Karaoke" | ||||
| msgstr "Karaoke" | ||||
|  | ||||
| msgid "Ch1" | ||||
| msgstr "Kan1" | ||||
|  | ||||
| msgid "Ch2" | ||||
| msgstr "Kan2" | ||||
|  | ||||
| msgid "C" | ||||
| msgstr "C" | ||||
|  | ||||
| msgid "L" | ||||
| msgstr "L" | ||||
|  | ||||
| msgid "R" | ||||
| msgstr "R" | ||||
|  | ||||
| msgid "S" | ||||
| msgstr "S" | ||||
|  | ||||
| msgid "SL" | ||||
| msgstr "SL" | ||||
|  | ||||
| msgid "SR" | ||||
| msgstr "SR" | ||||
|  | ||||
| msgid "dB" | ||||
| msgstr "dB" | ||||
|  | ||||
| msgid "not indicated" | ||||
| msgstr "nie podano" | ||||
|  | ||||
| msgid "MHz" | ||||
| msgstr "MHz" | ||||
|  | ||||
| msgid "free" | ||||
| msgstr "wolne" | ||||
|  | ||||
| msgid "Mbit/s" | ||||
| msgstr "Mbit/s" | ||||
|  | ||||
| msgid "kbit/s" | ||||
| msgstr "kbit/s" | ||||
							
								
								
									
										26
									
								
								po/ru_RU.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/ru_RU.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Vyacheslav Dikonov | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Vyacheslav Dikonov\n" | ||||
| "Language-Team: Russian <vdr@linuxtv.org>\n" | ||||
| "Language: ru\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "" | ||||
| msgid "stream" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "" | ||||
| msgid "H.264" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/sk_SK.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/sk_SK.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Milan Hrala | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" | ||||
| "Language-Team: Slovak <vdr@linuxtv.org>\n" | ||||
| "Language: sk\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "Transpond | ||||
| msgid "stream" | ||||
| msgstr "d<>tov<6F> tok" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Klasick<63>" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "Zmen | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Zadajte zmen<65>enie pomeru pre OSD ve<76>kosti." | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "<22>erven<65> limit [%]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 vrstva I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										24
									
								
								po/uk_UA.po
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								po/uk_UA.po
									
									
									
									
									
								
							| @@ -4,10 +4,10 @@ | ||||
| # Yarema aka Knedlyk <yupadmin@gmail.com>, 2010. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" | ||||
| "Language-Team: Ukrainian <translation@linux.org.ua>\n" | ||||
| "Language: uk\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "транспондер" | ||||
| msgid "stream" | ||||
| msgstr "потік" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "Класичний" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "Масштаб розміру повідомлень [%]" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "Визначити коефіцієнт масштабування розміру повідомлень" | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "Червона границя [%]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/zh_CN.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file. | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package. | ||||
| # Nan Feng VDR <nfgx@21cn.com>, 2009.2 | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: NanFeng <nfgx@21cn.com>\n" | ||||
| "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n" | ||||
| "Language: zh_CN\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "转发器" | ||||
| msgid "stream" | ||||
| msgstr "数据流" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "经典" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "红限制[ % ]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								po/zh_TW.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | ||||
| # VDR plugin language source file.  | ||||
| # Copyright (C) 2007-2019 Rolf Ahrenberg | ||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | ||||
| # This file is distributed under the same license as the femon package.  | ||||
| # Nan Feng VDR <nfgx@21cn.com>, 2009.2  | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: vdr-femon 2.4.0\n" | ||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | ||||
| "Report-Msgid-Bugs-To: <see README>\n" | ||||
| "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||
| "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | ||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | ||||
| "Last-Translator: NanFeng <nfgx@21cn.com>\n" | ||||
| "Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n" | ||||
| "Language: zh_TW\n" | ||||
| @@ -127,15 +127,6 @@ msgstr "轉發器" | ||||
| msgid "stream" | ||||
| msgstr "數據流" | ||||
|  | ||||
| msgid "dBm" | ||||
| msgstr "dBm" | ||||
|  | ||||
| msgid "dBuV" | ||||
| msgstr "dBuV" | ||||
|  | ||||
| msgid "dBV" | ||||
| msgstr "dBV" | ||||
|  | ||||
| msgid "Classic" | ||||
| msgstr "經典" | ||||
|  | ||||
| @@ -196,12 +187,6 @@ msgstr "" | ||||
| msgid "Define the downscale ratio for OSD size." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Signal level unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Define the used signal level unit." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Red limit [%]" | ||||
| msgstr "紅限制[ % ]" | ||||
|  | ||||
| @@ -265,9 +250,6 @@ msgstr "MPEG-2" | ||||
| msgid "H.264" | ||||
| msgstr "H.264" | ||||
|  | ||||
| msgid "H.265" | ||||
| msgstr "H.265" | ||||
|  | ||||
| msgid "MPEG-1 Layer I" | ||||
| msgstr "MPEG-1 Layer I" | ||||
|  | ||||
|   | ||||
							
								
								
									
										11
									
								
								receiver.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								receiver.c
									
									
									
									
									
								
							| @@ -19,7 +19,6 @@ cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrack | ||||
|   sleepM(), | ||||
|   activeM(false), | ||||
|   detectH264M(this), | ||||
|   detectH265M(this), | ||||
|   detectMpegM(this, this), | ||||
|   detectAacM(this), | ||||
|   detectLatmM(this), | ||||
| @@ -102,7 +101,7 @@ void cFemonReceiver::Activate(bool onP) | ||||
|      Deactivate(); | ||||
| } | ||||
|  | ||||
| void cFemonReceiver::Receive(const uchar *dataP, int lengthP) | ||||
| void cFemonReceiver::Receive(uchar *dataP, int lengthP) | ||||
| { | ||||
|   // TS packet length: TS_SIZE | ||||
|   if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) { | ||||
| @@ -164,18 +163,12 @@ void cFemonReceiver::Action(void) | ||||
|       processed = true; | ||||
|       if (TsPayloadStart(Data)) { | ||||
|          while (const uint8_t *p = videoAssemblerM.GetPes(len)) { | ||||
|            if (videoTypeM == 0x1B) { | ||||
|            if (videoTypeM == 0x1B) { // MPEG4 | ||||
|               if (detectH264M.processVideo(p, len)) { | ||||
|                  videoValidM = true; | ||||
|                  break; | ||||
|                  } | ||||
|               } | ||||
|            else if (videoTypeM == 0x24) { | ||||
|               if (detectH265M.processVideo(p, len)) { | ||||
|                  videoValidM = true; | ||||
|                  break; | ||||
|                  } | ||||
|               } | ||||
|            else { | ||||
|               if (detectMpegM.processVideo(p, len)) { | ||||
|                  videoValidM = true; | ||||
|   | ||||
| @@ -15,7 +15,6 @@ | ||||
| #include "ac3.h" | ||||
| #include "audio.h" | ||||
| #include "h264.h" | ||||
| #include "h265.h" | ||||
| #include "latm.h" | ||||
| #include "mpeg.h" | ||||
| #include "tools.h" | ||||
| @@ -28,7 +27,6 @@ private: | ||||
|   bool              activeM; | ||||
|  | ||||
|   cFemonH264        detectH264M; | ||||
|   cFemonH265        detectH265M; | ||||
|   cFemonMPEG        detectMpegM; | ||||
|   cFemonAAC         detectAacM; | ||||
|   cFemonLATM        detectLatmM; | ||||
| @@ -61,7 +59,7 @@ private: | ||||
|  | ||||
| protected: | ||||
|   virtual void Activate(bool onP); | ||||
|   virtual void Receive(const uchar *dataP, int lengthP); | ||||
|   virtual void Receive(uchar *dataP, int lengthP); | ||||
|   virtual void Action(void); | ||||
|  | ||||
| public: | ||||
|   | ||||
							
								
								
									
										10
									
								
								setup.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								setup.c
									
									
									
									
									
								
							| @@ -19,7 +19,6 @@ cMenuFemonSetup::cMenuFemonSetup() | ||||
|   themeM(FemonConfig.GetTheme()), | ||||
|   positionM(FemonConfig.GetPosition()), | ||||
|   downscaleM(FemonConfig.GetDownscale()), | ||||
|   signalUnitM(FemonConfig.GetSignalUnit()), | ||||
|   redLimitM(FemonConfig.GetRedLimit()), | ||||
|   greenLimitM(FemonConfig.GetGreenLimit()), | ||||
|   updateIntervalM(FemonConfig.GetUpdateInterval()), | ||||
| @@ -36,10 +35,6 @@ cMenuFemonSetup::cMenuFemonSetup() | ||||
|   dispModesM[eFemonModeStream]      = tr("stream"); | ||||
|   dispModesM[eFemonModeAC3]         = tr("AC-3"); | ||||
|  | ||||
|   signalUnitsM[eFemonSignalUnitdBm]  = tr("dBm"); | ||||
|   signalUnitsM[eFemonSignalUnitdBuV] = tr("dBuV"); | ||||
|   signalUnitsM[eFemonSignalUnitdBV]  = tr("dBV"); | ||||
|  | ||||
|   skinsM[eFemonSkinClassic]         = tr("Classic"); | ||||
|   skinsM[eFemonSkinElchi]           = tr("Elchi"); | ||||
|  | ||||
| @@ -83,9 +78,6 @@ void cMenuFemonSetup::Setup(void) | ||||
|   Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &downscaleM, 0, 20)); | ||||
|   helpM.Append(tr("Define the downscale ratio for OSD size.")); | ||||
|  | ||||
|   Add(new cMenuEditStraItem(tr("Signal level unit"), &signalUnitM, eFemonSignalUnitMaxNumber, signalUnitsM)); | ||||
|   helpM.Append(tr("Define the used signal level unit.")); | ||||
|  | ||||
|   Add(new cMenuEditIntItem(tr("Red limit [%]"), &redLimitM, 1, 50)); | ||||
|   helpM.Append(tr("Define a limit for red bar, which is used to indicate a bad signal.")); | ||||
|  | ||||
| @@ -128,7 +120,6 @@ void cMenuFemonSetup::Store(void) | ||||
|   SetupStore("Theme",          themeM); | ||||
|   SetupStore("Position",       positionM); | ||||
|   SetupStore("Downscale",      downscaleM); | ||||
|   SetupStore("SignalUnit",     signalUnitM); | ||||
|   SetupStore("RedLimit",       redLimitM); | ||||
|   SetupStore("GreenLimit",     greenLimitM); | ||||
|   SetupStore("UpdateInterval", updateIntervalM); | ||||
| @@ -144,7 +135,6 @@ void cMenuFemonSetup::Store(void) | ||||
|   FemonConfig.SetTheme(themeM); | ||||
|   FemonConfig.SetPosition(positionM); | ||||
|   FemonConfig.SetDownscale(downscaleM); | ||||
|   FemonConfig.SetSignalUnit(signalUnitM); | ||||
|   FemonConfig.SetRedLimit(redLimitM); | ||||
|   FemonConfig.SetGreenLimit(greenLimitM); | ||||
|   FemonConfig.SetUpdateInterval(updateIntervalM); | ||||
|   | ||||
							
								
								
									
										2
									
								
								setup.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								setup.h
									
									
									
									
									
								
							| @@ -11,7 +11,6 @@ | ||||
| class cMenuFemonSetup : public cMenuSetupPage { | ||||
| private: | ||||
|   const char *dispModesM[eFemonModeMaxNumber]; | ||||
|   const char *signalUnitsM[eFemonSignalUnitMaxNumber]; | ||||
|   const char *skinsM[eFemonSkinMaxNumber]; | ||||
|   const char *themesM[eFemonThemeMaxNumber]; | ||||
|   cVector<const char*> helpM; | ||||
| @@ -21,7 +20,6 @@ private: | ||||
|   int themeM; | ||||
|   int positionM; | ||||
|   int downscaleM; | ||||
|   int signalUnitM; | ||||
|   int redLimitM; | ||||
|   int greenLimitM; | ||||
|   int updateIntervalM; | ||||
|   | ||||
							
								
								
									
										12
									
								
								symbol.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								symbol.c
									
									
									
									
									
								
							| @@ -19,7 +19,6 @@ | ||||
| #include "symbols/dolbydigital51.xpm" | ||||
| #include "symbols/mpeg2.xpm" | ||||
| #include "symbols/h264.xpm" | ||||
| #include "symbols/h265.xpm" | ||||
| #include "symbols/ntsc.xpm" | ||||
| #include "symbols/pal.xpm" | ||||
| #include "symbols/encrypted.xpm" | ||||
| @@ -43,9 +42,6 @@ | ||||
| #include "symbols/six.xpm" | ||||
| #include "symbols/seven.xpm" | ||||
| #include "symbols/eight.xpm" | ||||
| #include "symbols/format2160.xpm" | ||||
| #include "symbols/format2160i.xpm" | ||||
| #include "symbols/format2160p.xpm" | ||||
| #include "symbols/format1080.xpm" | ||||
| #include "symbols/format1080i.xpm" | ||||
| #include "symbols/format1080p.xpm" | ||||
| @@ -68,7 +64,6 @@ static cBitmap bmDolbyDigital20(dolbydigital20_xpm); | ||||
| static cBitmap bmDolbyDigital51(dolbydigital51_xpm); | ||||
| static cBitmap bmMpeg2(mpeg2_xpm); | ||||
| static cBitmap bmH264(h264_xpm); | ||||
| static cBitmap bmH265(h265_xpm); | ||||
| static cBitmap bmPal(pal_xpm); | ||||
| static cBitmap bmNtsc(ntsc_xpm); | ||||
| static cBitmap bmEncrypted(encrypted_xpm); | ||||
| @@ -92,9 +87,6 @@ static cBitmap bmFive(five_xpm); | ||||
| static cBitmap bmSix(six_xpm); | ||||
| static cBitmap bmSeven(seven_xpm); | ||||
| static cBitmap bmEight(eight_xpm); | ||||
| static cBitmap bmFormat2160(format2160_xpm); | ||||
| static cBitmap bmFormat2160i(format2160i_xpm); | ||||
| static cBitmap bmFormat2160p(format2160p_xpm); | ||||
| static cBitmap bmFormat1080(format1080_xpm); | ||||
| static cBitmap bmFormat1080i(format1080i_xpm); | ||||
| static cBitmap bmFormat1080p(format1080p_xpm); | ||||
| @@ -154,7 +146,6 @@ bool cFemonSymbolCache::Populate(void) | ||||
|      cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM));  // SYMBOL_DD51 | ||||
|      cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_MPEG2 | ||||
|      cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_H264 | ||||
|      cacheM.Append(bmH265.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_H265 | ||||
|      cacheM.Append(bmPal.Scaled(yFactorM, yFactorM, antiAliasM));             // SYMBOL_PAL | ||||
|      cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_NTSC | ||||
|      cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM));       // SYMBOL_ENCRYPTED | ||||
| @@ -178,9 +169,6 @@ bool cFemonSymbolCache::Populate(void) | ||||
|      cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM));             // SYMBOL_SIX | ||||
|      cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_SEVEN | ||||
|      cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_EIGHT | ||||
|      cacheM.Append(bmFormat2160.Scaled(yFactorM, yFactorM, antiAliasM));      // SYMBOL_FORMAT_2160 | ||||
|      cacheM.Append(bmFormat2160i.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_2160i | ||||
|      cacheM.Append(bmFormat2160p.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_2160p | ||||
|      cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM));      // SYMBOL_FORMAT_1080 | ||||
|      cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_1080i | ||||
|      cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_1080p | ||||
|   | ||||
							
								
								
									
										4
									
								
								symbol.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								symbol.h
									
									
									
									
									
								
							| @@ -21,7 +21,6 @@ enum eSymbols { | ||||
|   SYMBOL_DD51, | ||||
|   SYMBOL_MPEG2, | ||||
|   SYMBOL_H264, | ||||
|   SYMBOL_H265, | ||||
|   SYMBOL_PAL, | ||||
|   SYMBOL_NTSC, | ||||
|   SYMBOL_ENCRYPTED, | ||||
| @@ -45,9 +44,6 @@ enum eSymbols { | ||||
|   SYMBOL_SIX, | ||||
|   SYMBOL_SEVEN, | ||||
|   SYMBOL_EIGHT, | ||||
|   SYMBOL_FORMAT_2160, | ||||
|   SYMBOL_FORMAT_2160i, | ||||
|   SYMBOL_FORMAT_2160p, | ||||
|   SYMBOL_FORMAT_1080, | ||||
|   SYMBOL_FORMAT_1080i, | ||||
|   SYMBOL_FORMAT_1080p, | ||||
|   | ||||
| @@ -1,23 +0,0 @@ | ||||
| /* XPM */ | ||||
| static const char *const format2160_xpm[] = { | ||||
| "40 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
| "++++++++++++++++++++++++++++++++++++++++", | ||||
| "+......................................+", | ||||
| "+.....++++......++..++++++....++++.....+", | ||||
| "+...+++++++..+++++.++++++++..++++++....+", | ||||
| "+...++....++.+++++.+++...++..++..++....+", | ||||
| "+.........++....++.++.......++....++...+", | ||||
| "+.........++....++.++.......++....++...+", | ||||
| "+.........++....++.++.+++...++....++...+", | ||||
| "+.......+++.....++.+++++++..++....++...+", | ||||
| "+......+++......++.+++..+++.++....++...+", | ||||
| "+.....+++.......++.++....++.++....++...+", | ||||
| "+.....+++.......++.++....++.++....++...+", | ||||
| "+....+++........++.++....++.++....++...+", | ||||
| "+....++.........++.+++..+++..++..++....+", | ||||
| "+....++++++++...++..+++++++..++++++....+", | ||||
| "+....++++++++...++...+++++....++++.....+", | ||||
| "+......................................+", | ||||
| "++++++++++++++++++++++++++++++++++++++++"}; | ||||
| @@ -1,23 +0,0 @@ | ||||
| /* XPM */ | ||||
| static const char *const format2160i_xpm[] = { | ||||
| "43 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
| "+++++++++++++++++++++++++++++++++++++++++++", | ||||
| "+.........................................+", | ||||
| "+.....++++......++..++++++....++++........+", | ||||
| "+...+++++++..+++++.++++++++..++++++.......+", | ||||
| "+...++....++.+++++.+++...++..++..++.......+", | ||||
| "+.........++....++.++.......++....++......+", | ||||
| "+.........++....++.++.......++....++.++...+", | ||||
| "+.........++....++.++.+++...++....++.++...+", | ||||
| "+.......+++.....++.+++++++..++....++......+", | ||||
| "+......+++......++.+++..+++.++....++.++...+", | ||||
| "+.....+++.......++.++....++.++....++.++...+", | ||||
| "+.....+++.......++.++....++.++....++.++...+", | ||||
| "+....+++........++.++....++.++....++.++...+", | ||||
| "+....++.........++.+++..+++..++..++..++...+", | ||||
| "+....++++++++...++..+++++++..++++++..++...+", | ||||
| "+....++++++++...++...+++++....++++...++...+", | ||||
| "+.........................................+", | ||||
| "+++++++++++++++++++++++++++++++++++++++++++"}; | ||||
| @@ -1,23 +0,0 @@ | ||||
| /* XPM */ | ||||
| static const char *const format2160p_xpm[] = { | ||||
| "47 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
| "+++++++++++++++++++++++++++++++++++++++++++++++", | ||||
| "+.............................................+", | ||||
| "+.....++++......++..++++++....++++............+", | ||||
| "+...+++++++..+++++.++++++++..++++++...........+", | ||||
| "+...++....++.+++++.+++...++..++..++...........+", | ||||
| "+.........++....++.++.......++....++..........+", | ||||
| "+.........++....++.++.......++....++..........+", | ||||
| "+.........++....++.++.+++...++....++.++++.....+", | ||||
| "+.......+++.....++.+++++++..++....++.+++++....+", | ||||
| "+......+++......++.+++..+++.++....++.++..++...+", | ||||
| "+.....+++.......++.++....++.++....++.++..++...+", | ||||
| "+.....+++.......++.++....++.++....++.+++++....+", | ||||
| "+....+++........++.++....++.++....++.++++.....+", | ||||
| "+....++.........++.+++..+++..++..++..++.......+", | ||||
| "+....++++++++...++..+++++++..++++++..++.......+", | ||||
| "+....++++++++...++...+++++....++++...++.......+", | ||||
| "+.............................................+", | ||||
| "+++++++++++++++++++++++++++++++++++++++++++++++"}; | ||||
| @@ -1,23 +0,0 @@ | ||||
| /* XPM */ | ||||
| static const char *const h265_xpm[] = { | ||||
| "40 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
| "++++++++++++++++++++++++++++++++++++++++", | ||||
| "+......................................+", | ||||
| "+..++...++.....+++++...+++++..+++++++..+", | ||||
| "+..++...++....+++++++.+++++++.+++++++..+", | ||||
| "+..++...++....++...++.++...++.++.......+", | ||||
| "+..++...++.........++.++......++.......+", | ||||
| "+..++...++.........++.++......++.......+", | ||||
| "+..++...++........+++.++......++.......+", | ||||
| "+..+++++++.......+++..++++++..++++++...+", | ||||
| "+..+++++++......+++...+++++++.+++++++..+", | ||||
| "+..++...++.....+++....++...++.....+++..+", | ||||
| "+..++...++....+++.....++...++......++..+", | ||||
| "+..++...++....++......++...++......++..+", | ||||
| "+..++...++....++...++.++...++.++...++..+", | ||||
| "+..++...++.++.+++++++.+++++++.++...++..+", | ||||
| "+..++...++.++.+++++++..+++++...+++++...+", | ||||
| "+......................................+", | ||||
| "++++++++++++++++++++++++++++++++++++++++"}; | ||||
							
								
								
									
										169
									
								
								tools.c
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								tools.c
									
									
									
									
									
								
							| @@ -13,8 +13,9 @@ | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <linux/dvb/frontend.h> | ||||
|  | ||||
| #include "config.h" | ||||
| #include "osd.h" | ||||
| #include "receiver.h" | ||||
| #include "tools.h" | ||||
| @@ -90,42 +91,60 @@ static const char *getUserString(int valueP, const tDvbParameterMap *mapP) | ||||
|   return "---"; | ||||
| } | ||||
|  | ||||
| cString getFrontendInfo(cDevice *deviceP) | ||||
| cDvbDevice *getDvbDevice(cDevice* deviceP) | ||||
| { | ||||
|   const cChannel *channel; | ||||
|   int status, valid = DTV_STAT_VALID_NONE; | ||||
|   cDvbDevice *dev = dynamic_cast<cDvbDevice*>(deviceP); | ||||
| #ifdef __DYNAMIC_DEVICE_PROBE | ||||
|   if (!dev && deviceP && deviceP->HasSubDevice()) | ||||
|      dev = dynamic_cast<cDvbDevice*>(deviceP->SubDevice()); | ||||
| #endif | ||||
|   return dev; | ||||
| } | ||||
|  | ||||
| cString getFrontendInfo(cDvbDevice *deviceP) | ||||
| { | ||||
|   struct dvb_frontend_info value; | ||||
|   fe_status_t status; | ||||
|   cString info = ""; | ||||
|   double signal = 0, cnr = 0, ber = 0, per = 0; | ||||
|   uint16_t signal = 0; | ||||
|   uint16_t snr = 0; | ||||
|   uint32_t ber = 0; | ||||
|   uint32_t unc = 0; | ||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   if (!deviceP) | ||||
|      return info; | ||||
|  | ||||
|   info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d\nTYPE:%s\nNAME:%s", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality(), *deviceP->DeviceType(), *deviceP->DeviceName()); | ||||
|   if (deviceP && deviceP->SignalStats(valid, &signal, &cnr, NULL, &ber, &per, &status)) { | ||||
|      if (valid & DTV_STAT_VALID_STATUS) | ||||
|         info = cString::sprintf("%s\nSTAT:%04X", *info, status); | ||||
|      if (valid & DTV_STAT_VALID_STRENGTH) | ||||
|         info = cString::sprintf("%s\nSGNL:%s", *info, *dtoa(signal, "%.2f")); | ||||
|      if (valid & DTV_STAT_VALID_CNR) | ||||
|         info = cString::sprintf("%s\nCNRA:%s", *info, *dtoa(cnr, "%.2f")); | ||||
|      if (valid & DTV_STAT_VALID_BERPOST) | ||||
|         info = cString::sprintf("%s\nBERA:%s", *info, *dtoa(ber, "%.0f")); | ||||
|      if (valid & DTV_STAT_VALID_PER) | ||||
|         info = cString::sprintf("%s\nPERA:%s", *info, *dtoa(per, "%.0f")); | ||||
|      } | ||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); | ||||
|   if (fe < 0) | ||||
|      return info; | ||||
|  | ||||
|   info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality()); | ||||
|  | ||||
|   if (ioctl(fe, FE_GET_INFO, &value) >= 0) | ||||
|      info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *deviceP->DeviceName()); | ||||
|   if (ioctl(fe, FE_READ_STATUS, &status) >= 0) | ||||
|      info = cString::sprintf("%s\nSTAT:%02X", *info, status); | ||||
|   if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0) | ||||
|      info = cString::sprintf("%s\nSGNL:%04X", *info, signal); | ||||
|   if (ioctl(fe, FE_READ_SNR, &snr) >= 0) | ||||
|      info = cString::sprintf("%s\nSNRA:%04X", *info, snr); | ||||
|   if (ioctl(fe, FE_READ_BER, &ber) >= 0) | ||||
|      info = cString::sprintf("%s\nBERA:%08X", *info, ber); | ||||
|   if (ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc) >= 0) | ||||
|      info = cString::sprintf("%s\nUNCB:%08X", *info, unc); | ||||
|   close(fe); | ||||
|  | ||||
|   if (cFemonOsd::Instance()) | ||||
|      info = cString::sprintf("%s\nVIBR:%s\nAUBR:%s\nDDBR:%s", *info, *dtoa(cFemonOsd::Instance()->GetVideoBitrate(), "%.0f"), *dtoa(cFemonOsd::Instance()->GetAudioBitrate(), "%.0f"), *dtoa(cFemonOsd::Instance()->GetDolbyBitrate(), "%.0f")); | ||||
|      info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate()); | ||||
|  | ||||
|   LOCK_CHANNELS_READ; | ||||
|   channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||
|   if (channel) | ||||
|      info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText()); | ||||
|  | ||||
|   return info; | ||||
| } | ||||
|  | ||||
| cString getFrontendName(cDevice *deviceP) | ||||
| cString getFrontendName(cDvbDevice *deviceP) | ||||
| { | ||||
|   if (!deviceP) | ||||
|      return NULL; | ||||
| @@ -133,80 +152,85 @@ cString getFrontendName(cDevice *deviceP) | ||||
|   return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex())); | ||||
| } | ||||
|  | ||||
| cString getFrontendStatus(cDevice *deviceP) | ||||
| cString getFrontendStatus(cDvbDevice *deviceP) | ||||
| { | ||||
|   int status; | ||||
|   int valid = DTV_STAT_VALID_NONE; | ||||
|  | ||||
|   if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, NULL, &status)) { | ||||
|      if (valid & DTV_STAT_VALID_STATUS) | ||||
|         return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (status & DTV_STAT_HAS_LOCK) ? "LOCKED" : "-", (status & DTV_STAT_HAS_SIGNAL) ? "SIGNAL" : "-", (status & DTV_STAT_HAS_CARRIER) ? "CARRIER" : "-", (status & DTV_STAT_HAS_VITERBI) ? "VITERBI" : "-", (status & DTV_STAT_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex())); | ||||
|      } | ||||
|   fe_status_t value; | ||||
|  | ||||
|   if (!deviceP) | ||||
|      return NULL; | ||||
|  | ||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); | ||||
|   if (fe < 0) | ||||
|      return NULL; | ||||
|   memset(&value, 0, sizeof(value)); | ||||
|   ioctl(fe, FE_READ_STATUS, &value); | ||||
|   close(fe); | ||||
|  | ||||
|   return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex())); | ||||
| } | ||||
|  | ||||
| double getSignal(cDevice *deviceP) | ||||
| uint16_t getSignal(cDvbDevice *deviceP) | ||||
| { | ||||
|   double strength; | ||||
|   int valid = DTV_STAT_VALID_NONE; | ||||
|   uint16_t value = 0; | ||||
|  | ||||
|   if (deviceP && deviceP->SignalStats(valid, &strength, NULL, NULL, NULL, NULL, NULL)) { | ||||
|      if (valid & DTV_STAT_VALID_STRENGTH) | ||||
|         return strength; | ||||
|      } | ||||
|   if (!deviceP) | ||||
|      return (value); | ||||
|  | ||||
|   return 0; | ||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double getCNR(cDevice *deviceP) | ||||
| uint16_t getSNR(cDvbDevice *deviceP) | ||||
| { | ||||
|   double cnr; | ||||
|   int valid = DTV_STAT_VALID_NONE; | ||||
|   uint16_t value = 0; | ||||
|  | ||||
|   if (deviceP && deviceP->SignalStats(valid, NULL, &cnr, NULL, NULL, NULL, NULL)) { | ||||
|      if (valid & DTV_STAT_VALID_CNR) | ||||
|         return cnr; | ||||
|      } | ||||
|   if (!deviceP) | ||||
|      return (value); | ||||
|  | ||||
|   return 0; | ||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   ioctl(fe, FE_READ_SNR, &value); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double getBER(cDevice *deviceP) | ||||
| uint32_t getBER(cDvbDevice *deviceP) | ||||
| { | ||||
|   double ber; | ||||
|   int valid = DTV_STAT_VALID_NONE; | ||||
|   uint32_t value = 0; | ||||
|  | ||||
|   if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, &ber, NULL, NULL)) { | ||||
|      if (valid & DTV_STAT_VALID_BERPOST) | ||||
|         return ber; | ||||
|      } | ||||
|   if (!deviceP) | ||||
|      return (value); | ||||
|  | ||||
|   return 0; | ||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   ioctl(fe, FE_READ_BER, &value); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double getPER(cDevice *deviceP) | ||||
| uint32_t getUNC(cDvbDevice *deviceP) | ||||
| { | ||||
|   double per; | ||||
|   int valid = DTV_STAT_VALID_NONE; | ||||
|   uint32_t value = 0; | ||||
|  | ||||
|   if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, &per, NULL)) { | ||||
|      if (valid & DTV_STAT_VALID_PER) | ||||
|         return per; | ||||
|      } | ||||
|   if (!deviceP) | ||||
|      return (value); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value); | ||||
|   close(fe); | ||||
|  | ||||
| cString getSignalStrength(double strengthP) | ||||
| { | ||||
|   switch (FemonConfig.GetSignalUnit()) { | ||||
|     case eFemonSignalUnitdBm:  return cString::sprintf("%.2f %s", strengthP, tr("dBm")); | ||||
|     case eFemonSignalUnitdBuV: return cString::sprintf("%.2f %s", strengthP + (120 - 11.25), tr("dBuV")); | ||||
|     case eFemonSignalUnitdBV:  return cString::sprintf("%.2f %s", strengthP - 11.25, tr("dBV")); | ||||
|     default:                   break; | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| cString getApids(const cChannel *channelP) | ||||
| @@ -285,7 +309,6 @@ cString getVideoCodec(int valueP) | ||||
|   switch (valueP) { | ||||
|     case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2")); | ||||
|     case VIDEO_CODEC_H264:  return cString::sprintf("%s", tr("H.264")); | ||||
|     case VIDEO_CODEC_H265:  return cString::sprintf("%s", tr("H.265")); | ||||
|     default:                break; | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
|   | ||||
							
								
								
									
										18
									
								
								tools.h
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								tools.h
									
									
									
									
									
								
							| @@ -20,16 +20,18 @@ | ||||
|  | ||||
| #define SATIP_DEVICE "SAT>IP" | ||||
|  | ||||
| cString getFrontendInfo(cDevice *deviceP); | ||||
| cString getFrontendName(cDevice *deviceP); | ||||
| cString getFrontendStatus(cDevice *deviceP); | ||||
| cDvbDevice *getDvbDevice(cDevice* deviceP); | ||||
|  | ||||
| double getCNR(cDevice *deviceP); | ||||
| double getSignal(cDevice *deviceP); | ||||
| double getBER(cDevice *deviceP); | ||||
| double getPER(cDevice *deviceP); | ||||
| cString getFrontendInfo(cDvbDevice *deviceP); | ||||
| cString getFrontendName(cDvbDevice *deviceP); | ||||
| cString getFrontendStatus(cDvbDevice *deviceP); | ||||
|  | ||||
| uint16_t getSNR(cDvbDevice *deviceP); | ||||
| uint16_t getSignal(cDvbDevice *deviceP); | ||||
|  | ||||
| uint32_t getBER(cDvbDevice *deviceP); | ||||
| uint32_t getUNC(cDvbDevice *deviceP); | ||||
|  | ||||
| cString getSignalStrength(double strengthP); | ||||
| cString getApids(const cChannel *channelP); | ||||
| cString getDpids(const cChannel *channelP); | ||||
| cString getSpids(const cChannel *channelP); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user