mirror of
				https://github.com/rofafor/vdr-plugin-femon.git
				synced 2023-10-10 11:36:53 +00:00 
			
		
		
		
	Compare commits
	
		
			16 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | d366856c71 | ||
|  | 28e4fb8de8 | ||
|  | c8868748a8 | ||
|  | 0dec600842 | ||
|  | 6764e356e9 | ||
|  | c6546524cc | ||
|  | 6112484300 | ||
|  | b3808d9934 | ||
|  | cf47ee83b3 | ||
|  | 0ed9e37d52 | ||
|  | 3e78ac0987 | ||
|  | ba767e02bf | ||
|  | cc586c3eb4 | ||
|  | 6ea5108395 | ||
|  | 7bc2ff53bd | ||
|  | c13f98a622 | 
							
								
								
									
										22
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -525,3 +525,25 @@ VDR Plugin 'femon' Revision History | |||||||
| - Got rid of FEMON_DEBUG. | - Got rid of FEMON_DEBUG. | ||||||
| - Added support for tracing modes. | - Added support for tracing modes. | ||||||
| - Removed the 'femonclient' plugin. | - Removed the 'femonclient' plugin. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | =================================== | ||||||
|  | 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. | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								Makefile
									
									
									
									
									
								
							| @@ -61,7 +61,7 @@ all-redirect: all | |||||||
|  |  | ||||||
| ### The object files (add further files here): | ### The object files (add further files here): | ||||||
|  |  | ||||||
| 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 | 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 | ||||||
|  |  | ||||||
| ### The main target: | ### The main target: | ||||||
|  |  | ||||||
| @@ -70,14 +70,15 @@ all: $(SOFILE) i18n | |||||||
| ### Implicit rules: | ### Implicit rules: | ||||||
|  |  | ||||||
| %.o: %.c | %.o: %.c | ||||||
| 	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< | 	@echo CC $@ | ||||||
|  | 	$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< | ||||||
|  |  | ||||||
| ### Dependencies: | ### Dependencies: | ||||||
|  |  | ||||||
| MAKEDEP = $(CXX) -MM -MG | MAKEDEP = $(CXX) -MM -MG | ||||||
| DEPFILE = .dependencies | DEPFILE = .dependencies | ||||||
| $(DEPFILE): Makefile | $(DEPFILE): Makefile | ||||||
| 	@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ | 	$(Q)$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ | ||||||
|  |  | ||||||
| -include $(DEPFILE) | -include $(DEPFILE) | ||||||
|  |  | ||||||
| @@ -90,17 +91,21 @@ I18Nmsgs  = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU | |||||||
| I18Npot   = $(PODIR)/$(PLUGIN).pot | I18Npot   = $(PODIR)/$(PLUGIN).pot | ||||||
|  |  | ||||||
| %.mo: %.po | %.mo: %.po | ||||||
| 	msgfmt -c -o $@ $< | 	@echo MO $@ | ||||||
|  | 	$(Q)msgfmt -c -o $@ $< | ||||||
|  |  | ||||||
| $(I18Npot): $(wildcard *.c) | $(I18Npot): $(wildcard *.c) | ||||||
| 	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^` | 	@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 $^` | ||||||
|  |  | ||||||
| %.po: $(I18Npot) | %.po: $(I18Npot) | ||||||
| 	msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< | 	@echo PO $@ | ||||||
|  | 	$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< | ||||||
| 	@touch $@ | 	@touch $@ | ||||||
|  |  | ||||||
| $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo | $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo | ||||||
| 	install -D -m644 $< $@ | 	@echo IN $@ | ||||||
|  | 	$(Q)install -D -m644 $< $@ | ||||||
|  |  | ||||||
| .PHONY: i18n | .PHONY: i18n | ||||||
| i18n: $(I18Nmo) $(I18Npot) | i18n: $(I18Nmo) $(I18Npot) | ||||||
| @@ -110,11 +115,13 @@ install-i18n: $(I18Nmsgs) | |||||||
| ### Targets: | ### Targets: | ||||||
|  |  | ||||||
| $(SOFILE): $(OBJS) | $(SOFILE): $(OBJS) | ||||||
| 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ | 	@echo LD $@ | ||||||
| 	@$(STRIP) $@ | 	$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ | ||||||
|  | 	$(Q)$(STRIP) $@ | ||||||
|  |  | ||||||
| install-lib: $(SOFILE) | install-lib: $(SOFILE) | ||||||
| 	install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | 	@echo IN $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | ||||||
|  | 	$(Q)install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) | ||||||
|  |  | ||||||
| install: install-lib install-i18n | install: install-lib install-i18n | ||||||
|  |  | ||||||
| @@ -132,4 +139,4 @@ clean: | |||||||
|  |  | ||||||
| .PHONY: cppcheck | .PHONY: cppcheck | ||||||
| cppcheck: | cppcheck: | ||||||
| 	@cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c) | 	$(Q)cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c) | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								README
									
									
									
									
									
								
							| @@ -34,15 +34,14 @@ Terminology: | |||||||
| |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| | |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| | ||||||
| |[=====Signal Strength ===================|=================]| | |[=====Signal Strength ===================|=================]| | ||||||
| |[=====Signal Quality ================|=====================]| | |[=====Signal Quality ================|=====================]| | ||||||
| | STR: #0000 (0%)       BER: #00000000       Video: 0 Mbit/s | | |  STR: 0   CNR: 0   BER: 0   PER: 0   Video: 0   Audio: 0   | | ||||||
| | SNR: #0000 (0%)       UNC: #00000000       Audio: 0 kbit/s | |  | ||||||
| | [LOCK]     [SIGNAL]     [CARRIER]     [VITERBI]     [SYNC] | | | [LOCK]     [SIGNAL]     [CARRIER]     [VITERBI]     [SYNC] | | ||||||
| -------------------------------------------------------------- | -------------------------------------------------------------- | ||||||
|  |  | ||||||
| STR     - Signal strength from driver | STR     - Signal strength in dBm | ||||||
| SNR     - Signal-to-noise ratio from driver | CNR     - Signal-to-noise ratio of the main carrier in dB | ||||||
| BER     - Bit error rate | BER     - Bit error rate after the forward error correction (FEC) done by inner code block | ||||||
| UNC     - Uncorrected blocks | PER     - Block error rate after the outer forward error correction coding | ||||||
| Video   - Calculated video bitrate in Mbit/s | Video   - Calculated video bitrate in Mbit/s | ||||||
| Audio   - Calculated audio / AC-3 bitrate in kbit/s | Audio   - Calculated audio / AC-3 bitrate in kbit/s | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										49
									
								
								femon.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								femon.c
									
									
									
									
									
								
							| @@ -17,15 +17,15 @@ | |||||||
| #include "tools.h" | #include "tools.h" | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
| #if defined(APIVERSNUM) && APIVERSNUM < 20200 | #if defined(APIVERSNUM) && APIVERSNUM < 20400 | ||||||
| #error "VDR-2.2.0 API version or greater is required!" | #error "VDR-2.4.0 API version or greater is required!" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef GITVERSION | #ifndef GITVERSION | ||||||
| #define GITVERSION "" | #define GITVERSION "" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static const char VERSION[]       = "2.2.1" GITVERSION; | static const char VERSION[]       = "2.4.0" GITVERSION; | ||||||
| static const char DESCRIPTION[]   = trNOOP("DVB Signal Information Monitor (OSD)"); | static const char DESCRIPTION[]   = trNOOP("DVB Signal Information Monitor (OSD)"); | ||||||
| static const char MAINMENUENTRY[] = trNOOP("Signal Information"); | static const char MAINMENUENTRY[] = trNOOP("Signal Information"); | ||||||
|  |  | ||||||
| @@ -120,7 +120,8 @@ cOsdObject *cPluginFemon::MainMenuAction(void) | |||||||
| { | { | ||||||
|   // Perform the action when selected from the main VDR menu. |   // Perform the action when selected from the main VDR menu. | ||||||
|   debug1("%s", __PRETTY_FUNCTION__); |   debug1("%s", __PRETTY_FUNCTION__); | ||||||
|   if (cControl::Control() || (Channels.Count() <= 0)) |   LOCK_CHANNELS_READ; | ||||||
|  |   if (cControl::Control() || (Channels->Count() <= 0)) | ||||||
|      Skins.Message(mtInfo, tr("Femon not available")); |      Skins.Message(mtInfo, tr("Femon not available")); | ||||||
|   else |   else | ||||||
|      return cFemonOsd::Instance(true); |      return cFemonOsd::Instance(true); | ||||||
| @@ -172,18 +173,18 @@ bool cPluginFemon::SetupParse(const char *nameP, const char *valueP) | |||||||
|  |  | ||||||
| bool cPluginFemon::Service(const char *idP, void *dataP) | bool cPluginFemon::Service(const char *idP, void *dataP) | ||||||
| { | { | ||||||
|   if (strcmp(idP, "FemonService-v1.0") == 0) { |   if (strcmp(idP, "FemonService-v1.1") == 0) { | ||||||
|      if (dataP) { |      if (dataP) { | ||||||
|         FemonService_v1_0 *data = reinterpret_cast<FemonService_v1_0*>(dataP); |         FemonService_v1_1 *data = reinterpret_cast<FemonService_v1_1*>(dataP); | ||||||
|         if (!cDevice::ActualDevice()) |         cDevice *dev = cDevice::ActualDevice(); | ||||||
|  |         if (!dev) | ||||||
|            return false; |            return false; | ||||||
|         cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); |  | ||||||
|         data->fe_name = getFrontendName(dev); |         data->fe_name = getFrontendName(dev); | ||||||
|         data->fe_status = getFrontendStatus(dev); |         data->fe_status = getFrontendStatus(dev); | ||||||
|         data->fe_snr = getSNR(dev); |         data->fe_cnr = getCNR(dev); | ||||||
|         data->fe_signal = getSignal(dev); |         data->fe_signal = getSignal(dev); | ||||||
|         data->fe_ber = getBER(dev); |         data->fe_ber = getBER(dev); | ||||||
|         data->fe_unc = getUNC(dev); |         data->fe_per = getPER(dev); | ||||||
|         data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0; |         data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0; | ||||||
|         data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0; |         data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0; | ||||||
|         data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0; |         data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0; | ||||||
| @@ -217,12 +218,12 @@ const char **cPluginFemon::SVDRPHelpPages(void) | |||||||
|     "    Print the signal quality.", |     "    Print the signal quality.", | ||||||
|     "SGNL <card index>\n" |     "SGNL <card index>\n" | ||||||
|     "    Print the signal strength from driver.", |     "    Print the signal strength from driver.", | ||||||
|     "SNRA <card index>\n" |     "CNRA <card index>\n" | ||||||
|     "    Print the signal-to-noise ratio from driver.", |     "    Print the carrier-to-noise ratio from driver.", | ||||||
|     "BERA <card index>\n" |     "BERA <card index>\n" | ||||||
|     "    Print the bit error rate.", |     "    Print the bit error rate from driver.", | ||||||
|     "UNCB <card index>\n" |     "PERA <card index>\n" | ||||||
|     "    Print the uncorrected blocks rate.", |     "    Print the packet error rate from driver.", | ||||||
|     "VIBR\n" |     "VIBR\n" | ||||||
|     "    Print the current video bitrate [Mbit/s].", |     "    Print the current video bitrate [Mbit/s].", | ||||||
|     "AUBR\n" |     "AUBR\n" | ||||||
| @@ -238,14 +239,14 @@ const char **cPluginFemon::SVDRPHelpPages(void) | |||||||
|  |  | ||||||
| cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP) | cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP) | ||||||
| { | { | ||||||
|   cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); |   cDevice *dev = cDevice::ActualDevice(); | ||||||
|   if (strcasecmp(commandP, "TRAC") == 0) { |   if (strcasecmp(commandP, "TRAC") == 0) { | ||||||
|      if (optionP && *optionP) |      if (optionP && *optionP) | ||||||
|         FemonConfig.SetTraceMode(strtol(optionP, NULL, 0)); |         FemonConfig.SetTraceMode(strtol(optionP, NULL, 0)); | ||||||
|      return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode()); |      return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode()); | ||||||
|      } |      } | ||||||
|   if (*optionP && isnumber(optionP)) { |   if (*optionP && isnumber(optionP)) { | ||||||
|      cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(optionP, NULL, 10)))); |      cDevice *dev2 = cDevice::GetDevice(int(strtol(optionP, NULL, 10))); | ||||||
|      if (dev2) |      if (dev2) | ||||||
|         dev = dev2; |         dev = dev2; | ||||||
|      } |      } | ||||||
| @@ -291,18 +292,16 @@ cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, in | |||||||
|      return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex()); |      return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex()); | ||||||
|      } |      } | ||||||
|   else if (strcasecmp(commandP, "SGNL") == 0) { |   else if (strcasecmp(commandP, "SGNL") == 0) { | ||||||
|      int value = getSignal(dev); |      return cString::sprintf("%.2f dBm on device #%d", getSignal(dev), dev->CardIndex()); | ||||||
|      return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); |  | ||||||
|      } |      } | ||||||
|   else if (strcasecmp(commandP, "SNRA") == 0) { |   else if (strcasecmp(commandP, "CNRA") == 0) { | ||||||
|      int value = getSNR(dev); |      return cString::sprintf("%.2f dB on device #%d", getCNR(dev), dev->CardIndex()); | ||||||
|      return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); |  | ||||||
|      } |      } | ||||||
|   else if (strcasecmp(commandP, "BERA") == 0) { |   else if (strcasecmp(commandP, "BERA") == 0) { | ||||||
|      return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex()); |      return cString::sprintf("%.0f on device #%d", getBER(dev), dev->CardIndex()); | ||||||
|      } |      } | ||||||
|   else if (strcasecmp(commandP, "UNCB") == 0) { |   else if (strcasecmp(commandP, "PERA") == 0) { | ||||||
|      return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex()); |      return cString::sprintf("%.0f on device #%d", getPER(dev), dev->CardIndex()); | ||||||
|      } |      } | ||||||
|   else if (strcasecmp(commandP, "VIBR") == 0) { |   else if (strcasecmp(commandP, "VIBR") == 0) { | ||||||
|      if (cFemonOsd::Instance()) |      if (cFemonOsd::Instance()) | ||||||
|   | |||||||
| @@ -8,15 +8,13 @@ | |||||||
| #ifndef __FEMONSERVICE_H | #ifndef __FEMONSERVICE_H | ||||||
| #define __FEMONSERVICE_H | #define __FEMONSERVICE_H | ||||||
|  |  | ||||||
| #include <linux/dvb/frontend.h> | struct FemonService_v1_1 { | ||||||
|  |  | ||||||
| struct FemonService_v1_0 { |  | ||||||
|   cString fe_name; |   cString fe_name; | ||||||
|   cString fe_status; |   cString fe_status; | ||||||
|   uint16_t fe_snr; |   double fe_cnr; | ||||||
|   uint16_t fe_signal; |   double fe_signal; | ||||||
|   uint32_t fe_ber; |   double fe_ber; | ||||||
|   uint32_t fe_unc; |   double fe_per; | ||||||
|   double video_bitrate; |   double video_bitrate; | ||||||
|   double audio_bitrate; |   double audio_bitrate; | ||||||
|   double dolby_bitrate; |   double dolby_bitrate; | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								h264.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								h264.c
									
									
									
									
									
								
							| @@ -203,21 +203,19 @@ int cFemonH264::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP) | |||||||
| { | { | ||||||
|   int s = 0, d = 0; |   int s = 0, d = 0; | ||||||
|  |  | ||||||
|   while (s < lenP) { |   while (s < lenP - 3) { | ||||||
|     if (!srcP[s] && !srcP[s + 1]) { |     if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) { | ||||||
|        // hit 00 00 xx |        dstP[d++] = srcP[s++]; | ||||||
|        dstP[d] = dstP[d + 1] = 0; |        dstP[d++] = srcP[s++]; | ||||||
|        s += 2; |        s++; // skip emulation_prevention_three_byte | ||||||
|        d += 2; |  | ||||||
|        if (srcP[s] == 3) { |  | ||||||
|           s++; // 00 00 03 xx --> 00 00 xx |  | ||||||
|           if (s >= lenP) |  | ||||||
|              return d; |  | ||||||
|           } |  | ||||||
|        } |        } | ||||||
|  |     else | ||||||
|        dstP[d++] = srcP[s++]; |        dstP[d++] = srcP[s++]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |   while (s < lenP) | ||||||
|  |     dstP[d++] = srcP[s++]; | ||||||
|  |  | ||||||
|   return d; |   return d; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -553,7 +551,7 @@ int cFemonH264::parseSPS(const uint8_t *bufP, int lenP) | |||||||
|      if (bs.GetBit()) {                     // video_signal_type_present_flag |      if (bs.GetBit()) {                     // video_signal_type_present_flag | ||||||
|         uint32_t video_format; |         uint32_t video_format; | ||||||
|         video_format = bs.GetBits(3);       // video_format |         video_format = bs.GetBits(3);       // video_format | ||||||
|         if (video_format < sizeof(videoFormatS) / sizeof(videoFormatS[0])) { |         if (video_format < ELEMENTS(videoFormatS)) { | ||||||
|            format = videoFormatS[video_format]; |            format = videoFormatS[video_format]; | ||||||
|            debug2("%s video_format=%d", __PRETTY_FUNCTION__, format); |            debug2("%s video_format=%d", __PRETTY_FUNCTION__, format); | ||||||
|            } |            } | ||||||
| @@ -668,7 +666,7 @@ int cFemonH264::parseSEI(const uint8_t *bufP, int lenP) | |||||||
|            if (picStructPresentFlagM) {                  // pic_struct_present_flag |            if (picStructPresentFlagM) {                  // pic_struct_present_flag | ||||||
|               uint32_t pic_struct, ct_type = 0, i = 0; |               uint32_t pic_struct, ct_type = 0, i = 0; | ||||||
|               pic_struct = bs.GetBits(4);                // pic_struct |               pic_struct = bs.GetBits(4);                // pic_struct | ||||||
|               if (pic_struct >= (sizeof(seiNumClockTsTableS)) / sizeof(seiNumClockTsTableS[0])) |               if (pic_struct >= ELEMENTS(seiNumClockTsTableS)) | ||||||
|                  return 0; |                  return 0; | ||||||
|               if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM) |               if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM) | ||||||
|                  scan = VIDEO_SCAN_PROGRESSIVE; |                  scan = VIDEO_SCAN_PROGRESSIVE; | ||||||
|   | |||||||
							
								
								
									
										715
									
								
								h265.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										715
									
								
								h265.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,715 @@ | |||||||
|  | /* | ||||||
|  |  * 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
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								h265.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | /* | ||||||
|  |  * 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 | ||||||
							
								
								
									
										322
									
								
								osd.c
									
									
									
									
									
								
							
							
						
						
									
										322
									
								
								osd.c
									
									
									
									
									
								
							| @@ -27,7 +27,7 @@ | |||||||
| #define OSDHEIGHT                 osdHeightM             // in pixels | #define OSDHEIGHT                 osdHeightM             // in pixels | ||||||
| #define OSDROWHEIGHT              fontM->Height()        // in pixels | #define OSDROWHEIGHT              fontM->Height()        // in pixels | ||||||
| #define OSDINFOHEIGHT             (OSDROWHEIGHT * 14)     // in pixels (14 rows) | #define OSDINFOHEIGHT             (OSDROWHEIGHT * 14)     // in pixels (14 rows) | ||||||
| #define OSDSTATUSHEIGHT           (OSDROWHEIGHT * 6)      // in pixels (6 rows) | #define OSDSTATUSHEIGHT           (OSDROWHEIGHT * 5)      // in pixels (5 rows) | ||||||
| #define OSDSYMBOL(id)             femonSymbols.Get(id) | #define OSDSYMBOL(id)             femonSymbols.Get(id) | ||||||
| #define OSDSPACING                femonSymbols.GetSpacing() | #define OSDSPACING                femonSymbols.GetSpacing() | ||||||
| #define OSDROUNDING               femonSymbols.GetRounding() | #define OSDROUNDING               femonSymbols.GetRounding() | ||||||
| @@ -39,12 +39,11 @@ | |||||||
|                                    (col == 2) ? int(round(OSDWIDTH * 0.26)) : \ |                                    (col == 2) ? int(round(OSDWIDTH * 0.26)) : \ | ||||||
|                                                 int(round(OSDWIDTH * 0.025))) |                                                 int(round(OSDWIDTH * 0.025))) | ||||||
| #define OSDSTATUSWIN_Y(offset)    (FemonConfig.GetPosition() ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) | #define OSDSTATUSWIN_Y(offset)    (FemonConfig.GetPosition() ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) | ||||||
| #define OSDSTATUSWIN_X(col)       ((col == 7) ? int(round(OSDWIDTH * 0.79)) : \ | #define OSDSTATUSWIN_X(col)       ((col == 6) ? int(round(OSDWIDTH * 0.84)) : \ | ||||||
|                                    (col == 6) ? int(round(OSDWIDTH * 0.68)) : \ |                                    (col == 5) ? int(round(OSDWIDTH * 0.66)) : \ | ||||||
|                                    (col == 5) ? int(round(OSDWIDTH * 0.46)) : \ |                                    (col == 4) ? int(round(OSDWIDTH * 0.50)) : \ | ||||||
|                                    (col == 4) ? int(round(OSDWIDTH * 0.37)) : \ |                                    (col == 3) ? int(round(OSDWIDTH * 0.35)) : \ | ||||||
|                                    (col == 3) ? int(round(OSDWIDTH * 0.21)) : \ |                                    (col == 2) ? int(round(OSDWIDTH * 0.19)) : \ | ||||||
|                                    (col == 2) ? int(round(OSDWIDTH * 0.12)) : \ |  | ||||||
|                                                 int(round(OSDWIDTH * 0.025))) |                                                 int(round(OSDWIDTH * 0.025))) | ||||||
| #define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w)) | #define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w)) | ||||||
| #define OSDBARWIDTH(x)            (OSDWIDTH * x / 100) | #define OSDBARWIDTH(x)            (OSDWIDTH * x / 100) | ||||||
| @@ -60,14 +59,13 @@ | |||||||
| #define OSDDRAWSTATUSFRONTEND(column, bitmap, status) \ | #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) |         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, label7) \ | #define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6) \ | ||||||
|         osdM->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), label1, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \ |         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(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(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(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(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) \ | #define OSDDRAWSTATUSBAR(value) \ | ||||||
|         if (value > 0) { \ |         if (value > 0) { \ | ||||||
| @@ -144,6 +142,7 @@ | |||||||
|  |  | ||||||
| class cFemonDummyFont : public cFont { | class cFemonDummyFont : public cFont { | ||||||
| public: | public: | ||||||
|  |   virtual int Width(void) const { return 10; } | ||||||
|   virtual int Width(uint cP) const { return 10; } |   virtual int Width(uint cP) const { return 10; } | ||||||
|   virtual int Width(const char *sP) const { return 50; } |   virtual int Width(const char *sP) const { return 50; } | ||||||
|   virtual int Height(void) const { return 20; } |   virtual int Height(void) const { return 20; } | ||||||
| @@ -167,7 +166,6 @@ cFemonOsd::cFemonOsd() | |||||||
| : cOsdObject(true), cThread("femon osd"), | : cOsdObject(true), cThread("femon osd"), | ||||||
|   osdM(NULL), |   osdM(NULL), | ||||||
|   receiverM(NULL), |   receiverM(NULL), | ||||||
|   frontendM(-1), |  | ||||||
|   svdrpFrontendM(-1), |   svdrpFrontendM(-1), | ||||||
|   svdrpVideoBitRateM(-1), |   svdrpVideoBitRateM(-1), | ||||||
|   svdrpAudioBitRateM(-1), |   svdrpAudioBitRateM(-1), | ||||||
| @@ -178,15 +176,17 @@ cFemonOsd::cFemonOsd() | |||||||
|   qualityValidM(false), |   qualityValidM(false), | ||||||
|   strengthM(0), |   strengthM(0), | ||||||
|   strengthValidM(false), |   strengthValidM(false), | ||||||
|   snrM(0), |   cnrM(0), | ||||||
|   snrValidM(false), |   cnrValidM(false), | ||||||
|   signalM(0), |   signalM(0), | ||||||
|   signalValidM(false), |   signalValidM(false), | ||||||
|   berM(0), |   berM(0), | ||||||
|   berValidM(false), |   berValidM(false), | ||||||
|   uncM(0), |   perM(0), | ||||||
|   uncValidM(false), |   perValidM(false), | ||||||
|   frontendNameM(""), |   frontendNameM(""), | ||||||
|  |   frontendTypeM(""), | ||||||
|  |   frontendStatusM(DTV_STAT_HAS_NONE), | ||||||
|   frontendStatusValidM(false), |   frontendStatusValidM(false), | ||||||
|   deviceSourceM(DEVICESOURCE_DVBAPI), |   deviceSourceM(DEVICESOURCE_DVBAPI), | ||||||
|   displayModeM(FemonConfig.GetDisplayMode()), |   displayModeM(FemonConfig.GetDisplayMode()), | ||||||
| @@ -200,8 +200,6 @@ cFemonOsd::cFemonOsd() | |||||||
| { | { | ||||||
|   int tmp; |   int tmp; | ||||||
|   debug1("%s", __PRETTY_FUNCTION__); |   debug1("%s", __PRETTY_FUNCTION__); | ||||||
|   memset(&frontendStatusM, 0, sizeof(frontendStatusM)); |  | ||||||
|   memset(&frontendInfoM, 0, sizeof(frontendInfoM)); |  | ||||||
|   svdrpConnectionM.handle = -1; |   svdrpConnectionM.handle = -1; | ||||||
|   femonSymbols.Refresh(); |   femonSymbols.Refresh(); | ||||||
|   fontM = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE)); |   fontM = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE)); | ||||||
| @@ -240,17 +238,14 @@ cFemonOsd::~cFemonOsd(void) | |||||||
|      DELETENULL(osdM); |      DELETENULL(osdM); | ||||||
|   if (fontM) |   if (fontM) | ||||||
|      DELETENULL(fontM); |      DELETENULL(fontM); | ||||||
|   if (frontendM >= 0) { |  | ||||||
|      close(frontendM); |  | ||||||
|      frontendM = -1; |  | ||||||
|      } |  | ||||||
|   pInstanceS = NULL; |   pInstanceS = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| void cFemonOsd::DrawStatusWindow(void) | void cFemonOsd::DrawStatusWindow(void) | ||||||
| { | { | ||||||
|   cMutexLock lock(&mutexM); |   cMutexLock lock(&mutexM); | ||||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |   LOCK_CHANNELS_READ; | ||||||
|  |   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|  |  | ||||||
|   if (osdM && channel) { |   if (osdM && channel) { | ||||||
|      cBitmap *bm = NULL; |      cBitmap *bm = NULL; | ||||||
| @@ -305,7 +300,14 @@ void cFemonOsd::DrawStatusWindow(void) | |||||||
|         OSDDRAWSTATUSBM(OSDSPACING); |         OSDDRAWSTATUSBM(OSDSPACING); | ||||||
|         } |         } | ||||||
|      if (receiverM) { |      if (receiverM) { | ||||||
|         if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 1080)) { |         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)) { | ||||||
|            switch (receiverM->VideoScan()) { |            switch (receiverM->VideoScan()) { | ||||||
|               case VIDEO_SCAN_INTERLACED:  bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break; |               case VIDEO_SCAN_INTERLACED:  bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break; | ||||||
|               case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break; |               case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break; | ||||||
| @@ -339,6 +341,7 @@ void cFemonOsd::DrawStatusWindow(void) | |||||||
|         switch (receiverM->VideoCodec()) { |         switch (receiverM->VideoCodec()) { | ||||||
|            case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break; |            case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break; | ||||||
|            case VIDEO_CODEC_H264:  bm = &OSDSYMBOL(SYMBOL_H264);  break; |            case VIDEO_CODEC_H264:  bm = &OSDSYMBOL(SYMBOL_H264);  break; | ||||||
|  |            case VIDEO_CODEC_H265:  bm = &OSDSYMBOL(SYMBOL_H265);  break; | ||||||
|            default:                bm = NULL;                     break; |            default:                bm = NULL;                     break; | ||||||
|            } |            } | ||||||
|         OSDDRAWSTATUSBM(OSDSPACING); |         OSDDRAWSTATUSBM(OSDSPACING); | ||||||
| @@ -368,23 +371,22 @@ void cFemonOsd::DrawStatusWindow(void) | |||||||
|      if (qualityValidM) |      if (qualityValidM) | ||||||
|         OSDDRAWSTATUSBAR(qualityM); |         OSDDRAWSTATUSBAR(qualityM); | ||||||
|      offset += OSDROWHEIGHT; |      offset += OSDROWHEIGHT; | ||||||
|      OSDDRAWSTATUSVALUES("STR:", signalValidM ? *cString::sprintf("%04x", signalM) : "", signalValidM ? *cString::sprintf("(%2d%%)", signalM / 655) : "", |      OSDDRAWSTATUSVALUES(signalValidM ? *cString::sprintf("STR: %.2f dBm", signalM) : "STR: ---", | ||||||
|                          "BER:", berValidM ? *cString::sprintf("%08x", berM) : "", *cString::sprintf("%s:", tr("Video")), |                          cnrValidM ? *cString::sprintf("CNR: %.2f dB", cnrM) : "CNR: ---", | ||||||
|                          *getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0))); |                          berValidM ? *cString::sprintf("BER: %.0f", berM) : "BER: ---", | ||||||
|      offset += OSDROWHEIGHT; |                          perValidM ? *cString::sprintf("PER: %.0f", perM) : "PER: ---", | ||||||
|      OSDDRAWSTATUSVALUES("SNR:", snrValidM ? *cString::sprintf("%04x", snrM) : "", snrValidM ? *cString::sprintf("(%2d%%)", snrM / 655) : "", |                          *cString::sprintf("%s: %s", tr("Video"), *getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0))), | ||||||
|                          "UNC:", uncValidM ? *cString::sprintf("%08x", uncM) : "", |                          *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))) | ||||||
|                          *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; |      offset += OSDROWHEIGHT; | ||||||
|      x = OSDSYMBOL(SYMBOL_LOCK).Width(); |      x = OSDSYMBOL(SYMBOL_LOCK).Width(); | ||||||
|      y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2; |      y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2; | ||||||
|      if (frontendStatusValidM) { |      if (frontendStatusValidM) { | ||||||
|         OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK),    FE_HAS_LOCK); |         OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK),    DTV_STAT_HAS_LOCK); | ||||||
|         OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL),  FE_HAS_SIGNAL); |         OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL),  DTV_STAT_HAS_SIGNAL); | ||||||
|         OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), FE_HAS_CARRIER); |         OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), DTV_STAT_HAS_CARRIER); | ||||||
|         OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), FE_HAS_VITERBI); |         OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), DTV_STAT_HAS_VITERBI); | ||||||
|         OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC),    FE_HAS_SYNC); |         OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC),    DTV_STAT_HAS_SYNC); | ||||||
|         } |         } | ||||||
|      OSDDRAWSTATUSBOTTOMBAR(); |      OSDDRAWSTATUSBOTTOMBAR(); | ||||||
|      osdM->Flush(); |      osdM->Flush(); | ||||||
| @@ -394,7 +396,8 @@ void cFemonOsd::DrawStatusWindow(void) | |||||||
| void cFemonOsd::DrawInfoWindow(void) | void cFemonOsd::DrawInfoWindow(void) | ||||||
| { | { | ||||||
|   cMutexLock lock(&mutexM); |   cMutexLock lock(&mutexM); | ||||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |   LOCK_CHANNELS_READ; | ||||||
|  |   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|  |  | ||||||
|   if (osdM && channel) { |   if (osdM && channel) { | ||||||
|      int offset = 0; |      int offset = 0; | ||||||
| @@ -590,16 +593,16 @@ void cFemonOsd::Action(void) | |||||||
|            strengthM = cDevice::ActualDevice()->SignalStrength(); |            strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||||
|            strengthValidM = (strengthM >= 0); |            strengthValidM = (strengthM >= 0); | ||||||
|            frontendNameM = cDevice::ActualDevice()->DeviceName(); |            frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||||
|            frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); |            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; | ||||||
|            frontendStatusValidM = strengthValidM; |            frontendStatusValidM = strengthValidM; | ||||||
|            signalM = uint16_t(strengthM * 0xFFFF / 100); |            signalM = strengthM; | ||||||
|            signalValidM = strengthValidM; |            signalValidM = strengthValidM; | ||||||
|            snrM = 0; |            cnrM = 0; | ||||||
|            snrValidM = false; |            cnrValidM = false; | ||||||
|            berM = 0; |            berM = 0; | ||||||
|            berValidM = false; |            berValidM = false; | ||||||
|            uncM = 0; |            perM = 0; | ||||||
|            uncValidM = false; |            perValidM = false; | ||||||
|            break; |            break; | ||||||
|       case DEVICESOURCE_IPTV: |       case DEVICESOURCE_IPTV: | ||||||
|            qualityM = cDevice::ActualDevice()->SignalQuality(); |            qualityM = cDevice::ActualDevice()->SignalQuality(); | ||||||
| @@ -607,49 +610,20 @@ void cFemonOsd::Action(void) | |||||||
|            strengthM = cDevice::ActualDevice()->SignalStrength(); |            strengthM = cDevice::ActualDevice()->SignalStrength(); | ||||||
|            strengthValidM = (strengthM >= 0); |            strengthValidM = (strengthM >= 0); | ||||||
|            frontendNameM = cDevice::ActualDevice()->DeviceName(); |            frontendNameM = cDevice::ActualDevice()->DeviceName(); | ||||||
|            frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); |            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; | ||||||
|            frontendStatusValidM = strengthValidM; |            frontendStatusValidM = strengthValidM; | ||||||
|            signalM = uint16_t(strengthM * 0xFFFF / 100); |            signalM = strengthM; | ||||||
|            signalValidM = strengthValidM; |            signalValidM = strengthValidM; | ||||||
|            snrM = uint16_t(qualityM * 0xFFFF / 100); |            cnrM = qualityM; | ||||||
|            snrValidM = qualityValidM; |            cnrValidM = qualityValidM; | ||||||
|            berM = 0; |            berM = 0; | ||||||
|            berValidM = false; |            berValidM = false; | ||||||
|            uncM = 0; |            perM = 0; | ||||||
|            uncValidM = false; |            perValidM = false; | ||||||
|            break; |            break; | ||||||
|       default: |       default: | ||||||
|       case DEVICESOURCE_DVBAPI: |       case DEVICESOURCE_DVBAPI: | ||||||
|            if (frontendM != -1) { |            if (svdrpConnectionM.handle >= 0) { | ||||||
|               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; |               cmd.handle = svdrpConnectionM.handle; | ||||||
|               svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd); |               svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd); | ||||||
|               if (cmd.responseCode == 900) { |               if (cmd.responseCode == 900) { | ||||||
| @@ -657,9 +631,9 @@ void cFemonOsd::Action(void) | |||||||
|                  qualityValidM = false; |                  qualityValidM = false; | ||||||
|                  frontendStatusValidM = false; |                  frontendStatusValidM = false; | ||||||
|                  signalValidM = false; |                  signalValidM = false; | ||||||
|                  snrValidM = false; |                  cnrValidM = false; | ||||||
|                  berValidM = false; |                  berValidM = false; | ||||||
|                  uncValidM = false; |                  perValidM = false; | ||||||
|                  for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { |                  for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { | ||||||
|                      const char *s = line->Text(); |                      const char *s = line->Text(); | ||||||
| 	             if (!strncasecmp(s, "CARD:", 5)) | 	             if (!strncasecmp(s, "CARD:", 5)) | ||||||
| @@ -672,38 +646,61 @@ void cFemonOsd::Action(void) | |||||||
|                         qualityM = (int)strtol(s + 5, NULL, 10); |                         qualityM = (int)strtol(s + 5, NULL, 10); | ||||||
|                         qualityValidM = (qualityM >= 0); |                         qualityValidM = (qualityM >= 0); | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "TYPE:", 5)) |                      else if (!strncasecmp(s, "TYPE:", 5)) { | ||||||
|                         frontendInfoM.type = (fe_type_t)strtol(s + 5, NULL, 10); |                         frontendTypeM = s + 5; | ||||||
|  |                         } | ||||||
|                      else if (!strncasecmp(s, "NAME:", 5)) { |                      else if (!strncasecmp(s, "NAME:", 5)) { | ||||||
|                         frontendNameM = s + 5; |                         frontendNameM = s + 5; | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "STAT:", 5)) { |                      else if (!strncasecmp(s, "STAT:", 5)) { | ||||||
|                         frontendStatusM = (fe_status_t)strtol(s + 5, NULL, 16); |                         frontendStatusM = strtol(s + 5, NULL, 16); | ||||||
|                         frontendStatusValidM = true; |                         frontendStatusValidM = true; | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "SGNL:", 5)) { |                      else if (!strncasecmp(s, "SGNL:", 5)) { | ||||||
|                         signalM = (uint16_t)strtol(s + 5, NULL, 16); |                         signalM = atod(s + 5); | ||||||
|                         signalValidM = true; |                         signalValidM = true; | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "SNRA:", 5)) { |                      else if (!strncasecmp(s, "CNRA:", 5)) { | ||||||
|                         snrM = (uint16_t)strtol(s + 5, NULL, 16); |                         cnrM = atod(s + 5); | ||||||
|                         snrValidM = true; |                         cnrValidM = true; | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "BERA:", 5)) { |                      else if (!strncasecmp(s, "BERA:", 5)) { | ||||||
|                         berM = (uint32_t)strtol(s + 5, NULL, 16); |                         berM = atod(s + 5); | ||||||
|                         berValidM = true; |                         berValidM = true; | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "UNCB:", 5)) { |                      else if (!strncasecmp(s, "PERA:", 5)) { | ||||||
|                         uncM = (uint32_t)strtol(s + 5, NULL, 16); |                         perM = atod(s + 5); | ||||||
|                         uncValidM = true; |                         perValidM = true; | ||||||
|                         } |                         } | ||||||
|                      else if (!strncasecmp(s, "VIBR:", 5)) |                      else if (!strncasecmp(s, "VIBR:", 5)) | ||||||
|                         svdrpVideoBitRateM = (double)strtol(s + 5, NULL, 10); |                         svdrpVideoBitRateM = atod(s + 5); | ||||||
|                      else if (!strncasecmp(s, "AUBR:", 5)) |                      else if (!strncasecmp(s, "AUBR:", 5)) | ||||||
|                         svdrpAudioBitRateM = (double)strtol(s + 5, NULL, 10); |                         svdrpAudioBitRateM = atod(s + 5); | ||||||
|                      } |                      } | ||||||
|                  } |                  } | ||||||
|               } |               } | ||||||
|  |            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; |            break; | ||||||
|       } |       } | ||||||
|     DrawInfoWindow(); |     DrawInfoWindow(); | ||||||
| @@ -716,42 +713,10 @@ void cFemonOsd::Show(void) | |||||||
| { | { | ||||||
|   debug1("%s", __PRETTY_FUNCTION__); |   debug1("%s", __PRETTY_FUNCTION__); | ||||||
|   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); |   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); | ||||||
|   const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |   LOCK_CHANNELS_READ; | ||||||
|  |   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|  |  | ||||||
|   deviceSourceM = DEVICESOURCE_DVBAPI; |   AttachFrontend(); | ||||||
|   if (channel) { |  | ||||||
|      if (channel->IsSourceType('I')) |  | ||||||
|         deviceSourceM = DEVICESOURCE_IPTV; |  | ||||||
|      else if (channel->IsSourceType('V')) |  | ||||||
|         deviceSourceM = DEVICESOURCE_PVRINPUT; |  | ||||||
|      } |  | ||||||
|  |  | ||||||
|   if (deviceSourceM == DEVICESOURCE_DVBAPI) { |  | ||||||
|      if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { |  | ||||||
|         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; |  | ||||||
|               } |  | ||||||
|            } |  | ||||||
|         else if (FemonConfig.GetUseSvdrp()) { |  | ||||||
|            if (!SvdrpConnect() || !SvdrpTune()) |  | ||||||
|               return; |  | ||||||
|            } |  | ||||||
|         else { |  | ||||||
|            error("%s Cannot open frontend device", __PRETTY_FUNCTION__); |  | ||||||
|            return; |  | ||||||
|            } |  | ||||||
|         } |  | ||||||
|      } |  | ||||||
|   else |  | ||||||
|      frontendM = -1; |  | ||||||
|  |  | ||||||
|   osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM); |   osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM); | ||||||
|   if (osdM) { |   if (osdM) { | ||||||
| @@ -780,11 +745,38 @@ void cFemonOsd::Show(void) | |||||||
|      } |      } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool cFemonOsd::AttachFrontend(void) | ||||||
|  | { | ||||||
|  |   debug1("%s", __PRETTY_FUNCTION__); | ||||||
|  |   LOCK_CHANNELS_READ; | ||||||
|  |   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|  |  | ||||||
|  |   deviceSourceM = DEVICESOURCE_DVBAPI; | ||||||
|  |   if (channel) { | ||||||
|  |      if (channel->IsSourceType('I')) | ||||||
|  |         deviceSourceM = DEVICESOURCE_IPTV; | ||||||
|  |      else if (channel->IsSourceType('V')) | ||||||
|  |         deviceSourceM = DEVICESOURCE_PVRINPUT; | ||||||
|  |      } | ||||||
|  |  | ||||||
|  |   if (deviceSourceM == DEVICESOURCE_DVBAPI) { | ||||||
|  |      if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { | ||||||
|  |         if (FemonConfig.GetUseSvdrp()) { | ||||||
|  |            if (!SvdrpConnect() || !SvdrpTune()) | ||||||
|  |               return false; | ||||||
|  |            } | ||||||
|  |         } | ||||||
|  |      } | ||||||
|  |  | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  |  | ||||||
| void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool liveViewP) | void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool liveViewP) | ||||||
| { | { | ||||||
|   debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP); |   debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP); | ||||||
|   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); |   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); | ||||||
|   const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |   LOCK_CHANNELS_READ; | ||||||
|  |   const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|  |  | ||||||
|   if (!deviceP || !liveViewP) |   if (!deviceP || !liveViewP) | ||||||
|      return; |      return; | ||||||
| @@ -797,42 +789,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool | |||||||
|      return; |      return; | ||||||
|      } |      } | ||||||
|  |  | ||||||
|   if (channel && FemonConfig.GetAnalyzeStream()) { |   if (channel && FemonConfig.GetAnalyzeStream() && AttachFrontend()) { | ||||||
|      deviceSourceM = DEVICESOURCE_DVBAPI; |  | ||||||
|      if (channel->IsSourceType('I')) |  | ||||||
|         deviceSourceM = DEVICESOURCE_IPTV; |  | ||||||
|      else if (channel->IsSourceType('V')) |  | ||||||
|         deviceSourceM = DEVICESOURCE_PVRINPUT; |  | ||||||
|  |  | ||||||
|      if (frontendM >= 0) { |  | ||||||
|         close(frontendM); |  | ||||||
|         frontendM = -1; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|      if (deviceSourceM == DEVICESOURCE_DVBAPI) { |  | ||||||
|         if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) { |  | ||||||
|            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; |  | ||||||
|                  } |  | ||||||
|               } |  | ||||||
|            else if (FemonConfig.GetUseSvdrp()) { |  | ||||||
|               if (!SvdrpConnect() || !SvdrpTune()) |  | ||||||
|                  return; |  | ||||||
|               } |  | ||||||
|            else { |  | ||||||
|               error("%s Cannot open frontend device", __PRETTY_FUNCTION__); |  | ||||||
|               return; |  | ||||||
|               } |  | ||||||
|            } |  | ||||||
|  |  | ||||||
|      if (receiverM) { |      if (receiverM) { | ||||||
|         receiverM->Deactivate(); |         receiverM->Deactivate(); | ||||||
|         DELETENULL(receiverM); |         DELETENULL(receiverM); | ||||||
| @@ -841,7 +798,6 @@ void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool | |||||||
|      cDevice::ActualDevice()->AttachReceiver(receiverM); |      cDevice::ActualDevice()->AttachReceiver(receiverM); | ||||||
|      } |      } | ||||||
| } | } | ||||||
| } |  | ||||||
|  |  | ||||||
| void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP) | void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP) | ||||||
| { | { | ||||||
| @@ -852,7 +808,8 @@ void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP) | |||||||
|      DELETENULL(receiverM); |      DELETENULL(receiverM); | ||||||
|      } |      } | ||||||
|   if (FemonConfig.GetAnalyzeStream()) { |   if (FemonConfig.GetAnalyzeStream()) { | ||||||
|      const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |      LOCK_CHANNELS_READ; | ||||||
|  |      const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|      if (channel) { |      if (channel) { | ||||||
|         receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); |         receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); | ||||||
|         cDevice::ActualDevice()->AttachReceiver(receiverM); |         cDevice::ActualDevice()->AttachReceiver(receiverM); | ||||||
| @@ -866,7 +823,8 @@ bool cFemonOsd::DeviceSwitch(int directionP) | |||||||
|   int device = cDevice::ActualDevice()->DeviceNumber(); |   int device = cDevice::ActualDevice()->DeviceNumber(); | ||||||
|   int direction = sgn(directionP); |   int direction = sgn(directionP); | ||||||
|   if (device >= 0) { |   if (device >= 0) { | ||||||
|      cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |      LOCK_CHANNELS_READ; | ||||||
|  |      const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|      if (channel) { |      if (channel) { | ||||||
|         for (int i = 0; i < cDevice::NumDevices() - 1; i++) { |         for (int i = 0; i < cDevice::NumDevices() - 1; i++) { | ||||||
|             if (direction >= 0) { |             if (direction >= 0) { | ||||||
| @@ -939,12 +897,13 @@ bool cFemonOsd::DeviceSwitch(int directionP) | |||||||
|                   d->CamSlot()->Assign(NULL); |                   d->CamSlot()->Assign(NULL); | ||||||
|                d->SwitchChannel(channel, false); |                d->SwitchChannel(channel, false); | ||||||
|                cControl::Launch(new cTransferControl(d, channel)); |                cControl::Launch(new cTransferControl(d, channel)); | ||||||
|                return (true); |                AttachFrontend(); | ||||||
|  |                return true; | ||||||
|                } |                } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|      } |      } | ||||||
|    return (false); |    return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool cFemonOsd::SvdrpConnect(void) | bool cFemonOsd::SvdrpConnect(void) | ||||||
| @@ -978,7 +937,8 @@ bool cFemonOsd::SvdrpConnect(void) | |||||||
| bool cFemonOsd::SvdrpTune(void) | bool cFemonOsd::SvdrpTune(void) | ||||||
| { | { | ||||||
|    if (svdrpPluginM && svdrpConnectionM.handle >= 0) { |    if (svdrpPluginM && svdrpConnectionM.handle >= 0) { | ||||||
|       cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |       LOCK_CHANNELS_READ; | ||||||
|  |       const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|       if (channel) { |       if (channel) { | ||||||
|          SvdrpCommand_v1_0 cmd; |          SvdrpCommand_v1_0 cmd; | ||||||
|          cmd.handle = svdrpConnectionM.handle; |          cmd.handle = svdrpConnectionM.handle; | ||||||
| @@ -1038,7 +998,8 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | |||||||
|             if ((numberM == 0) && (oldNumberM != 0)) { |             if ((numberM == 0) && (oldNumberM != 0)) { | ||||||
|                numberM = oldNumberM; |                numberM = oldNumberM; | ||||||
|                oldNumberM = cDevice::CurrentChannel(); |                oldNumberM = cDevice::CurrentChannel(); | ||||||
|                Channels.SwitchTo(numberM); |                LOCK_CHANNELS_READ; | ||||||
|  |                Channels->SwitchTo(numberM); | ||||||
|                numberM = 0; |                numberM = 0; | ||||||
|                return osContinue; |                return osContinue; | ||||||
|                } |                } | ||||||
| @@ -1047,11 +1008,12 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | |||||||
|                numberM = numberM * 10 + keyP - k0; |                numberM = numberM * 10 + keyP - k0; | ||||||
|                if (numberM > 0) { |                if (numberM > 0) { | ||||||
|                   DrawStatusWindow(); |                   DrawStatusWindow(); | ||||||
|                   cChannel *ch = Channels.GetByNumber(numberM); |                   LOCK_CHANNELS_READ; | ||||||
|  |                   const cChannel *ch = Channels->GetByNumber(numberM); | ||||||
|                   inputTimeM.Set(0); |                   inputTimeM.Set(0); | ||||||
|                   // Lets see if there can be any useful further input: |                   // Lets see if there can be any useful further input: | ||||||
|                   int n = ch ? numberM * 10 : 0; |                   int n = ch ? numberM * 10 : 0; | ||||||
|                   while (ch && (ch = Channels.Next(ch)) != NULL) { |                   while (ch && (ch = Channels->Next(ch)) != NULL) { | ||||||
|                         if (!ch->GroupSep()) { |                         if (!ch->GroupSep()) { | ||||||
|                            if (n <= ch->Number() && ch->Number() <= n + 9) { |                            if (n <= ch->Number() && ch->Number() <= n + 9) { | ||||||
|                               n = 0; |                               n = 0; | ||||||
| @@ -1064,7 +1026,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | |||||||
|                   if (n > 0) { |                   if (n > 0) { | ||||||
|                      // This channel is the only one that fits the input, so let's take it right away: |                      // This channel is the only one that fits the input, so let's take it right away: | ||||||
|                      oldNumberM = cDevice::CurrentChannel(); |                      oldNumberM = cDevice::CurrentChannel(); | ||||||
|                      Channels.SwitchTo(numberM); |                      Channels->SwitchTo(numberM); | ||||||
|                      numberM = 0; |                      numberM = 0; | ||||||
|                      } |                      } | ||||||
|                   } |                   } | ||||||
| @@ -1124,9 +1086,10 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | |||||||
|             break; |             break; | ||||||
|        case kNone: |        case kNone: | ||||||
|             if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) { |             if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) { | ||||||
|                if (Channels.GetByNumber(numberM)) { |                LOCK_CHANNELS_READ; | ||||||
|  |                if (Channels->GetByNumber(numberM)) { | ||||||
|                   oldNumberM = cDevice::CurrentChannel(); |                   oldNumberM = cDevice::CurrentChannel(); | ||||||
|                   Channels.SwitchTo(numberM); |                   Channels->SwitchTo(numberM); | ||||||
|                   numberM = 0; |                   numberM = 0; | ||||||
|                   } |                   } | ||||||
|                else { |                else { | ||||||
| @@ -1138,7 +1101,8 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP) | |||||||
|        case kOk: |        case kOk: | ||||||
|             { |             { | ||||||
|             // toggle between display modes |             // toggle between display modes | ||||||
|             cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |             LOCK_CHANNELS_READ; | ||||||
|  |             const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|             if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++; |             if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++; | ||||||
|             if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0; |             if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0; | ||||||
|             DrawInfoWindow(); |             DrawInfoWindow(); | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								osd.h
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								osd.h
									
									
									
									
									
								
							| @@ -8,9 +8,7 @@ | |||||||
| #ifndef __FEMON_OSD_H | #ifndef __FEMON_OSD_H | ||||||
| #define __FEMON_OSD_H | #define __FEMON_OSD_H | ||||||
|  |  | ||||||
| #include <linux/dvb/frontend.h> |  | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
| #include <sys/ioctl.h> |  | ||||||
| #include <vdr/osd.h> | #include <vdr/osd.h> | ||||||
| #include <vdr/thread.h> | #include <vdr/thread.h> | ||||||
| #include <vdr/status.h> | #include <vdr/status.h> | ||||||
| @@ -37,7 +35,6 @@ private: | |||||||
|  |  | ||||||
|   cOsd             *osdM; |   cOsd             *osdM; | ||||||
|   cFemonReceiver   *receiverM; |   cFemonReceiver   *receiverM; | ||||||
|   int               frontendM; |  | ||||||
|   int               svdrpFrontendM; |   int               svdrpFrontendM; | ||||||
|   double            svdrpVideoBitRateM; |   double            svdrpVideoBitRateM; | ||||||
|   double            svdrpAudioBitRateM; |   double            svdrpAudioBitRateM; | ||||||
| @@ -49,16 +46,17 @@ private: | |||||||
|   bool              qualityValidM; |   bool              qualityValidM; | ||||||
|   int               strengthM; |   int               strengthM; | ||||||
|   bool              strengthValidM; |   bool              strengthValidM; | ||||||
|   uint16_t          snrM; |   double            cnrM; | ||||||
|   bool              snrValidM; |   bool              cnrValidM; | ||||||
|   uint16_t          signalM; |   double            signalM; | ||||||
|   bool              signalValidM; |   bool              signalValidM; | ||||||
|   uint32_t          berM; |   double            berM; | ||||||
|   bool              berValidM; |   bool              berValidM; | ||||||
|   uint32_t          uncM; |   double            perM; | ||||||
|   bool              uncValidM; |   bool              perValidM; | ||||||
|   cString           frontendNameM; |   cString           frontendNameM; | ||||||
|   fe_status_t       frontendStatusM; |   cString           frontendTypeM; | ||||||
|  |   int               frontendStatusM; | ||||||
|   bool              frontendStatusValidM; |   bool              frontendStatusValidM; | ||||||
|   dvb_frontend_info frontendInfoM; |   dvb_frontend_info frontendInfoM; | ||||||
|   eDeviceSourceType deviceSourceM; |   eDeviceSourceType deviceSourceM; | ||||||
| @@ -72,6 +70,7 @@ private: | |||||||
|   cCondWait         sleepM; |   cCondWait         sleepM; | ||||||
|   cMutex            mutexM; |   cMutex            mutexM; | ||||||
|  |  | ||||||
|  |   bool AttachFrontend(void); | ||||||
|   void DrawStatusWindow(void); |   void DrawStatusWindow(void); | ||||||
|   void DrawInfoWindow(void); |   void DrawInfoWindow(void); | ||||||
|   bool SvdrpConnect(void); |   bool SvdrpConnect(void); | ||||||
|   | |||||||
							
								
								
									
										117
									
								
								po/de_DE.po
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								po/de_DE.po
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Peter Marquardt | # Peter Marquardt | ||||||
| # Andreas Brachold | # Andreas Brachold | ||||||
| @@ -7,15 +7,15 @@ | |||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Christian Wieninger\n" | "Last-Translator: Christian Wieninger\n" | ||||||
| "Language-Team: German <vdr@linuxtv.org>\n" | "Language-Team: German <vdr@linuxtv.org>\n" | ||||||
| "Language: de\n" | "Language: de\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=ISO-8859-15\n" | "Content-Type: text/plain; charset=utf-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
|  |  | ||||||
| msgid "DVB Signal Information Monitor (OSD)" | msgid "DVB Signal Information Monitor (OSD)" | ||||||
| @@ -25,7 +25,7 @@ msgid "Signal Information" | |||||||
| msgstr "Signalinformationen" | msgstr "Signalinformationen" | ||||||
|  |  | ||||||
| msgid "Femon not available" | msgid "Femon not available" | ||||||
| msgstr "Femon nicht verf<EFBFBD>gbar" | msgstr "Femon nicht verfügbar" | ||||||
|  |  | ||||||
| msgid "Video" | msgid "Video" | ||||||
| msgstr "Video" | msgstr "Video" | ||||||
| @@ -61,7 +61,7 @@ msgid "Coderate" | |||||||
| msgstr "Coderate" | msgstr "Coderate" | ||||||
|  |  | ||||||
| msgid "Protocol" | msgid "Protocol" | ||||||
| msgstr "" | msgstr "Protokoll" | ||||||
|  |  | ||||||
| msgid "Bitrate" | msgid "Bitrate" | ||||||
| msgstr "Bitrate" | msgstr "Bitrate" | ||||||
| @@ -70,28 +70,28 @@ msgid "Stream Information" | |||||||
| msgstr "Streaminformation" | msgstr "Streaminformation" | ||||||
|  |  | ||||||
| msgid "Video Stream" | msgid "Video Stream" | ||||||
| msgstr "Video Stream" | msgstr "Videostream" | ||||||
|  |  | ||||||
| msgid "Codec" | msgid "Codec" | ||||||
| msgstr "" | msgstr "Codec" | ||||||
|  |  | ||||||
| msgid "Aspect Ratio" | msgid "Aspect Ratio" | ||||||
| msgstr "Seitenverh<EFBFBD>ltnis" | msgstr "Seitenverhältnis" | ||||||
|  |  | ||||||
| msgid "Frame Rate" | msgid "Frame Rate" | ||||||
| msgstr "Bildrate" | msgstr "Bildrate" | ||||||
|  |  | ||||||
| msgid "Video Format" | msgid "Video Format" | ||||||
| msgstr "Bildformat" | msgstr "Videoformat" | ||||||
|  |  | ||||||
| msgid "Resolution" | msgid "Resolution" | ||||||
| msgstr "Aufl<EFBFBD>sung" | msgstr "Auflösung" | ||||||
|  |  | ||||||
| msgid "Audio Stream" | msgid "Audio Stream" | ||||||
| msgstr "Audio Stream" | msgstr "Audiostream" | ||||||
|  |  | ||||||
| msgid "Channel Mode" | msgid "Channel Mode" | ||||||
| msgstr "" | msgstr "Kanalmodus" | ||||||
|  |  | ||||||
| msgid "Sampling Frequency" | msgid "Sampling Frequency" | ||||||
| msgstr "Abtastrate" | msgstr "Abtastrate" | ||||||
| @@ -115,7 +115,7 @@ msgid "Dolby Surround Mode" | |||||||
| msgstr "Dolby Surround Modus" | msgstr "Dolby Surround Modus" | ||||||
|  |  | ||||||
| msgid "Low Frequency Effects" | msgid "Low Frequency Effects" | ||||||
| msgstr "Tieft<EFBFBD>ner Effekte" | msgstr "Tieftöner Effekte" | ||||||
|  |  | ||||||
| msgid "Dialogue Normalization" | msgid "Dialogue Normalization" | ||||||
| msgstr "Dialog Normalisierung" | msgstr "Dialog Normalisierung" | ||||||
| @@ -160,82 +160,82 @@ msgid "PearlHD" | |||||||
| msgstr "PearlHD" | msgstr "PearlHD" | ||||||
|  |  | ||||||
| msgid "Hide main menu entry" | msgid "Hide main menu entry" | ||||||
| msgstr "Hauptmen<EFBFBD>eintrag verstecken" | msgstr "Hauptmenüeintrag verstecken" | ||||||
|  |  | ||||||
| msgid "Define whether the main menu entry is hidden." | msgid "Define whether the main menu entry is hidden." | ||||||
| msgstr "" | msgstr "Legt fest, ob der Hauptmenüeintrag ausgeblendet ist." | ||||||
|  |  | ||||||
| msgid "Default display mode" | msgid "Default display mode" | ||||||
| msgstr "Standard Anzeigemodus" | msgstr "Standard Anzeigemodus" | ||||||
|  |  | ||||||
| msgid "Define the default display mode at startup." | msgid "Define the default display mode at startup." | ||||||
| msgstr "" | msgstr "Definiert den Standard-Anzeigemodus beim Start." | ||||||
|  |  | ||||||
| msgid "Define the used OSD skin." | msgid "Define the used OSD skin." | ||||||
| msgstr "" | msgstr "Definiert die verwendete OSD-Oberfläche." | ||||||
|  |  | ||||||
| msgid "Define the used OSD theme." | msgid "Define the used OSD theme." | ||||||
| msgstr "" | msgstr "Definiert das verwendete OSD-Theme." | ||||||
|  |  | ||||||
| msgid "Position" | msgid "Position" | ||||||
| msgstr "Position" | msgstr "Position" | ||||||
|  |  | ||||||
| msgid "Define the position of OSD." | msgid "Define the position of OSD." | ||||||
| msgstr "" | msgstr "Definiert die Position des OSD." | ||||||
|  |  | ||||||
| msgid "Downscale OSD size [%]" | msgid "Downscale OSD size [%]" | ||||||
| msgstr "" | msgstr "OSD Größe verkleinern [%]" | ||||||
|  |  | ||||||
| msgid "Define the downscale ratio for OSD size." | msgid "Define the downscale ratio for OSD size." | ||||||
| msgstr "" | msgstr "Definiert den Verkleinerungsfaktor der OSD-Größe." | ||||||
|  |  | ||||||
| msgid "Red limit [%]" | msgid "Red limit [%]" | ||||||
| msgstr "Grenze Rot [%]" | msgstr "Grenze Rot [%]" | ||||||
|  |  | ||||||
| msgid "Define a limit for red bar, which is used to indicate a bad signal." | msgid "Define a limit for red bar, which is used to indicate a bad signal." | ||||||
| msgstr "" | msgstr "Definiert einen Grenzwert für den roten Balken, um ein schlechtes Signal zu kennzeichnen." | ||||||
|  |  | ||||||
| msgid "Green limit [%]" | msgid "Green limit [%]" | ||||||
| msgstr "Grenze Gr<EFBFBD>n [%]" | msgstr "Grenze Grün [%]" | ||||||
|  |  | ||||||
| msgid "Define a limit for green bar, which is used to indicate a good signal." | msgid "Define a limit for green bar, which is used to indicate a good signal." | ||||||
| msgstr "" | msgstr "Definiert einen Grenzwert für den grünen Balken, um ein gutes Signal zu kennzeichnen." | ||||||
|  |  | ||||||
| msgid "OSD update interval [0.1s]" | msgid "OSD update interval [0.1s]" | ||||||
| msgstr "OSD Updateintervall [0.1s]" | msgstr "OSD Updateintervall [0.1s]" | ||||||
|  |  | ||||||
| msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." | msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load." | ||||||
| msgstr "" | msgstr "Definiert den Intervall für OSD-Updates. Ein kleineres Intervall erzeugt eine höhere CPU-Last." | ||||||
|  |  | ||||||
| msgid "Analyze stream" | msgid "Analyze stream" | ||||||
| msgstr "Stream analysieren" | msgstr "Stream analysieren" | ||||||
|  |  | ||||||
| msgid "Define whether the DVB stream is analyzed and bitrates calculated." | msgid "Define whether the DVB stream is analyzed and bitrates calculated." | ||||||
| msgstr "" | msgstr "Definiert ob der DVB-Stream analysiert und die Bitraten berechnet werden." | ||||||
|  |  | ||||||
| msgid "Calculation interval [0.1s]" | msgid "Calculation interval [0.1s]" | ||||||
| msgstr "Berechnungsintervall [0.1s]" | msgstr "Berechnungsintervall [0.1s]" | ||||||
|  |  | ||||||
| msgid "Define an interval for calculation. The bigger interval generates more stable values." | msgid "Define an interval for calculation. The bigger interval generates more stable values." | ||||||
| msgstr "" | msgstr "Definiert den Intervall für die Berechnung. Ein größerer Intervall erzeugt stabilere Werte." | ||||||
|  |  | ||||||
| msgid "Use SVDRP service" | msgid "Use SVDRP service" | ||||||
| msgstr "SVDRP Service verwenden" | msgstr "SVDRP-Service verwenden" | ||||||
|  |  | ||||||
| msgid "Define whether the SVDRP service is used in client/server setups." | msgid "Define whether the SVDRP service is used in client/server setups." | ||||||
| msgstr "" | msgstr "Legt fest, ob der SVDRP-Service in Client/Server-Setups verwendet wird." | ||||||
|  |  | ||||||
| msgid "SVDRP service port" | msgid "SVDRP service port" | ||||||
| msgstr "SVDRP Service Port" | msgstr "SVDRP-Service Port" | ||||||
|  |  | ||||||
| msgid "Define the port number of SVDRP service." | msgid "Define the port number of SVDRP service." | ||||||
| msgstr "" | msgstr "Definiert die Portnummer des SVDRP-Service." | ||||||
|  |  | ||||||
| msgid "SVDRP service IP" | msgid "SVDRP service IP" | ||||||
| msgstr "SVDRP Service IP" | msgstr "SVDRP-Service IP" | ||||||
|  |  | ||||||
| msgid "Define the IP address of SVDRP service." | msgid "Define the IP address of SVDRP service." | ||||||
| msgstr "" | msgstr "Definiert die IP-Adresse des SVDRP-Service." | ||||||
|  |  | ||||||
| msgid "Help" | msgid "Help" | ||||||
| msgstr "Hilfe" | msgstr "Hilfe" | ||||||
| @@ -247,64 +247,67 @@ msgid "Analog" | |||||||
| msgstr "Analog" | msgstr "Analog" | ||||||
|  |  | ||||||
| msgid "MPEG-2" | msgid "MPEG-2" | ||||||
| msgstr "" | msgstr "MPEG-2" | ||||||
|  |  | ||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer II" | msgid "MPEG-1 Layer II" | ||||||
| msgstr "" | msgstr "MPEG-1 Layer II" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer III" | msgid "MPEG-1 Layer III" | ||||||
| msgstr "" | msgstr "MPEG-1 Layer III" | ||||||
|  |  | ||||||
| msgid "MPEG-2 Layer I" | msgid "MPEG-2 Layer I" | ||||||
| msgstr "" | msgstr "MPEG-2 Layer I" | ||||||
|  |  | ||||||
| msgid "MPEG-2 Layer II" | msgid "MPEG-2 Layer II" | ||||||
| msgstr "" | msgstr "MPEG-2 Layer II" | ||||||
|  |  | ||||||
| msgid "MPEG-2 Layer III" | msgid "MPEG-2 Layer III" | ||||||
| msgstr "" | msgstr "MPEG-2 Layer III" | ||||||
|  |  | ||||||
| msgid "HE-AAC" | msgid "HE-AAC" | ||||||
| msgstr "" | msgstr "HE-AAC" | ||||||
|  |  | ||||||
| msgid "LATM" | msgid "LATM" | ||||||
| msgstr "" | msgstr "LATM" | ||||||
|  |  | ||||||
| msgid "stereo" | msgid "stereo" | ||||||
| msgstr "" | msgstr "Stereo" | ||||||
|  |  | ||||||
| msgid "joint Stereo" | msgid "joint Stereo" | ||||||
| msgstr "" | msgstr "Joint-Stereo" | ||||||
|  |  | ||||||
| msgid "dual" | msgid "dual" | ||||||
| msgstr "" | msgstr "Dual" | ||||||
|  |  | ||||||
| msgid "mono" | msgid "mono" | ||||||
| msgstr "" | msgstr "Mono" | ||||||
|  |  | ||||||
| msgid "interlaced" | msgid "interlaced" | ||||||
| msgstr "" | msgstr "Interlaced" | ||||||
|  |  | ||||||
| msgid "progressive" | msgid "progressive" | ||||||
| msgstr "" | msgstr "Progressiv" | ||||||
|  |  | ||||||
| msgid "reserved" | msgid "reserved" | ||||||
| msgstr "belegt" | msgstr "belegt" | ||||||
|  |  | ||||||
| msgid "extended" | msgid "extended" | ||||||
| msgstr "" | msgstr "erweitert" | ||||||
|  |  | ||||||
| msgid "unknown" | msgid "unknown" | ||||||
| msgstr "unbekannt" | msgstr "unbekannt" | ||||||
|  |  | ||||||
| msgid "component" | msgid "component" | ||||||
| msgstr "" | msgstr "Komponentenvideo" | ||||||
|  |  | ||||||
| msgid "PAL" | msgid "PAL" | ||||||
| msgstr "PAL" | msgstr "PAL" | ||||||
| @@ -313,10 +316,10 @@ msgid "NTSC" | |||||||
| msgstr "NTSC" | msgstr "NTSC" | ||||||
|  |  | ||||||
| msgid "SECAM" | msgid "SECAM" | ||||||
| msgstr "" | msgstr "SECAM" | ||||||
|  |  | ||||||
| msgid "MAC" | msgid "MAC" | ||||||
| msgstr "" | msgstr "MAC" | ||||||
|  |  | ||||||
| msgid "Hz" | msgid "Hz" | ||||||
| msgstr "Hz" | msgstr "Hz" | ||||||
| @@ -331,7 +334,7 @@ msgid "Visually Impaired (VI)" | |||||||
| msgstr "Sehbehindert (VI)" | msgstr "Sehbehindert (VI)" | ||||||
|  |  | ||||||
| msgid "Hearing Impaired (HI)" | msgid "Hearing Impaired (HI)" | ||||||
| msgstr "H<EFBFBD>rbehindert (HI)" | msgstr "Hörbehindert (HI)" | ||||||
|  |  | ||||||
| msgid "Dialogue (D)" | msgid "Dialogue (D)" | ||||||
| msgstr "Dialog (D)" | msgstr "Dialog (D)" | ||||||
| @@ -343,7 +346,7 @@ msgid "Emergency (E)" | |||||||
| msgstr "Notfall (E)" | msgstr "Notfall (E)" | ||||||
|  |  | ||||||
| msgid "Voice Over (VO)" | msgid "Voice Over (VO)" | ||||||
| msgstr "<EFBFBD>berlagerte Stimme (VO)" | msgstr "Überlagerte Stimme (VO)" | ||||||
|  |  | ||||||
| msgid "Karaoke" | msgid "Karaoke" | ||||||
| msgstr "Karaoke" | msgstr "Karaoke" | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/es_ES.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/es_ES.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Luis Palacios | # Luis Palacios | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Luis Palacios\n" | "Last-Translator: Luis Palacios\n" | ||||||
| "Language-Team: Spanish <vdr@linuxtv.org>\n" | "Language-Team: Spanish <vdr@linuxtv.org>\n" | ||||||
| "Language: es\n" | "Language: es\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/et_EE.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/et_EE.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Arthur Konovalov | # Arthur Konovalov | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Arthur Konovalov\n" | "Last-Translator: Arthur Konovalov\n" | ||||||
| "Language-Team: Estonian <vdr@linuxtv.org>\n" | "Language-Team: Estonian <vdr@linuxtv.org>\n" | ||||||
| "Language: et\n" | "Language: et\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layet I" | msgstr "MPEG-1 Layet I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/fi_FI.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/fi_FI.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Rolf Ahrenberg | # Rolf Ahrenberg | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Rolf Ahrenberg\n" | "Last-Translator: Rolf Ahrenberg\n" | ||||||
| "Language-Team: Finnish <vdr@linuxtv.org>\n" | "Language-Team: Finnish <vdr@linuxtv.org>\n" | ||||||
| "Language: fi\n" | "Language: fi\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 kerros I" | msgstr "MPEG-1 kerros I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/fr_FR.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/fr_FR.po
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Nicolas Huillard | # Nicolas Huillard | ||||||
| # Michaël Nival <mnival@club-internet.fr>, 2010 | # Michaël Nival <mnival@club-internet.fr>, 2010 | ||||||
| @@ -7,10 +7,10 @@ | |||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n" | "Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n" | ||||||
| "Language-Team: French <vdr@linuxtv.org>\n" | "Language-Team: French <vdr@linuxtv.org>\n" | ||||||
| "Language: fr\n" | "Language: fr\n" | ||||||
| @@ -252,6 +252,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/hu_HU.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/hu_HU.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # F<>ley Istv<74>n <ifuley at tigercomp dot ro>, 2011 | # F<>ley Istv<74>n <ifuley at tigercomp dot ro>, 2011 | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: F<>ley Istv<74>n <ifuley at tigercomp dot ro>\n" | "Last-Translator: F<>ley Istv<74>n <ifuley at tigercomp dot ro>\n" | ||||||
| "Language-Team: Hungarian <ifuley at tigercomp dot ro>\n" | "Language-Team: Hungarian <ifuley at tigercomp dot ro>\n" | ||||||
| "Language: hu\n" | "Language: hu\n" | ||||||
| @@ -253,6 +253,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/it_IT.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/it_IT.po
									
									
									
									
									
								
							| @@ -1,15 +1,15 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Sean Carlos | # Sean Carlos | ||||||
| # Diego Pierotto <vdr-italian@tiscali.it> | # Diego Pierotto <vdr-italian@tiscali.it> | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" | "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" | ||||||
| "Language-Team: Italian <vdr@linuxtv.org>\n" | "Language-Team: Italian <vdr@linuxtv.org>\n" | ||||||
| "Language: it\n" | "Language: it\n" | ||||||
| @@ -254,6 +254,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/lt_LT.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/lt_LT.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Valdemaras Pipiras | # Valdemaras Pipiras | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" | "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" | ||||||
| "Language-Team: Lithuanian <vdr@linuxtv.org>\n" | "Language-Team: Lithuanian <vdr@linuxtv.org>\n" | ||||||
| "Language: lt\n" | "Language: lt\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										393
									
								
								po/pl_PL.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										393
									
								
								po/pl_PL.po
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,393 @@ | |||||||
|  | # VDR plugin language source file. | ||||||
|  | # Copyright (C) 2007-2018 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 "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 "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" | ||||||
							
								
								
									
										11
									
								
								po/ru_RU.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/ru_RU.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Vyacheslav Dikonov | # Vyacheslav Dikonov | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Vyacheslav Dikonov\n" | "Last-Translator: Vyacheslav Dikonov\n" | ||||||
| "Language-Team: Russian <vdr@linuxtv.org>\n" | "Language-Team: Russian <vdr@linuxtv.org>\n" | ||||||
| "Language: ru\n" | "Language: ru\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/sk_SK.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/sk_SK.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Milan Hrala | # Milan Hrala | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" | "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" | ||||||
| "Language-Team: Slovak <vdr@linuxtv.org>\n" | "Language-Team: Slovak <vdr@linuxtv.org>\n" | ||||||
| "Language: sk\n" | "Language: sk\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 vrstva I" | msgstr "MPEG-1 vrstva I" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ | |||||||
| # Yarema aka Knedlyk <yupadmin@gmail.com>, 2010. | # Yarema aka Knedlyk <yupadmin@gmail.com>, 2010. | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" | "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n" | ||||||
| "Language-Team: Ukrainian <translation@linux.org.ua>\n" | "Language-Team: Ukrainian <translation@linux.org.ua>\n" | ||||||
| "Language: uk\n" | "Language: uk\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/zh_CN.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file. | # VDR plugin language source file. | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package. | # This file is distributed under the same license as the femon package. | ||||||
| # Nan Feng VDR <nfgx@21cn.com>, 2009.2 | # Nan Feng VDR <nfgx@21cn.com>, 2009.2 | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: NanFeng <nfgx@21cn.com>\n" | "Last-Translator: NanFeng <nfgx@21cn.com>\n" | ||||||
| "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n" | "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n" | ||||||
| "Language: zh_CN\n" | "Language: zh_CN\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								po/zh_TW.po
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # VDR plugin language source file.  | # VDR plugin language source file.  | ||||||
| # Copyright (C) 2007-2015 Rolf Ahrenberg | # Copyright (C) 2007-2018 Rolf Ahrenberg | ||||||
| # This file is distributed under the same license as the femon package.  | # This file is distributed under the same license as the femon package.  | ||||||
| # Nan Feng VDR <nfgx@21cn.com>, 2009.2  | # Nan Feng VDR <nfgx@21cn.com>, 2009.2  | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: vdr-femon 2.2.1\n" | "Project-Id-Version: vdr-femon 2.4.0\n" | ||||||
| "Report-Msgid-Bugs-To: <see README>\n" | "Report-Msgid-Bugs-To: <see README>\n" | ||||||
| "POT-Creation-Date: 2015-04-04 04:04+0300\n" | "POT-Creation-Date: 2018-04-15 04:15+0300\n" | ||||||
| "PO-Revision-Date: 2015-04-04 04:04+0300\n" | "PO-Revision-Date: 2018-04-15 04:15+0300\n" | ||||||
| "Last-Translator: NanFeng <nfgx@21cn.com>\n" | "Last-Translator: NanFeng <nfgx@21cn.com>\n" | ||||||
| "Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n" | "Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n" | ||||||
| "Language: zh_TW\n" | "Language: zh_TW\n" | ||||||
| @@ -250,6 +250,9 @@ msgstr "MPEG-2" | |||||||
| msgid "H.264" | msgid "H.264" | ||||||
| msgstr "H.264" | msgstr "H.264" | ||||||
|  |  | ||||||
|  | msgid "H.265" | ||||||
|  | msgstr "H.265" | ||||||
|  |  | ||||||
| msgid "MPEG-1 Layer I" | msgid "MPEG-1 Layer I" | ||||||
| msgstr "MPEG-1 Layer I" | msgstr "MPEG-1 Layer I" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								receiver.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								receiver.c
									
									
									
									
									
								
							| @@ -19,6 +19,7 @@ cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrack | |||||||
|   sleepM(), |   sleepM(), | ||||||
|   activeM(false), |   activeM(false), | ||||||
|   detectH264M(this), |   detectH264M(this), | ||||||
|  |   detectH265M(this), | ||||||
|   detectMpegM(this, this), |   detectMpegM(this, this), | ||||||
|   detectAacM(this), |   detectAacM(this), | ||||||
|   detectLatmM(this), |   detectLatmM(this), | ||||||
| @@ -101,7 +102,7 @@ void cFemonReceiver::Activate(bool onP) | |||||||
|      Deactivate(); |      Deactivate(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void cFemonReceiver::Receive(uchar *dataP, int lengthP) | void cFemonReceiver::Receive(const uchar *dataP, int lengthP) | ||||||
| { | { | ||||||
|   // TS packet length: TS_SIZE |   // TS packet length: TS_SIZE | ||||||
|   if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) { |   if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) { | ||||||
| @@ -163,12 +164,18 @@ void cFemonReceiver::Action(void) | |||||||
|       processed = true; |       processed = true; | ||||||
|       if (TsPayloadStart(Data)) { |       if (TsPayloadStart(Data)) { | ||||||
|          while (const uint8_t *p = videoAssemblerM.GetPes(len)) { |          while (const uint8_t *p = videoAssemblerM.GetPes(len)) { | ||||||
|            if (videoTypeM == 0x1B) { // MPEG4 |            if (videoTypeM == 0x1B) { | ||||||
|               if (detectH264M.processVideo(p, len)) { |               if (detectH264M.processVideo(p, len)) { | ||||||
|                  videoValidM = true; |                  videoValidM = true; | ||||||
|                  break; |                  break; | ||||||
|                  } |                  } | ||||||
|               } |               } | ||||||
|  |            else if (videoTypeM == 0x24) { | ||||||
|  |               if (detectH265M.processVideo(p, len)) { | ||||||
|  |                  videoValidM = true; | ||||||
|  |                  break; | ||||||
|  |                  } | ||||||
|  |               } | ||||||
|            else { |            else { | ||||||
|               if (detectMpegM.processVideo(p, len)) { |               if (detectMpegM.processVideo(p, len)) { | ||||||
|                  videoValidM = true; |                  videoValidM = true; | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ | |||||||
| #include "ac3.h" | #include "ac3.h" | ||||||
| #include "audio.h" | #include "audio.h" | ||||||
| #include "h264.h" | #include "h264.h" | ||||||
|  | #include "h265.h" | ||||||
| #include "latm.h" | #include "latm.h" | ||||||
| #include "mpeg.h" | #include "mpeg.h" | ||||||
| #include "tools.h" | #include "tools.h" | ||||||
| @@ -27,6 +28,7 @@ private: | |||||||
|   bool              activeM; |   bool              activeM; | ||||||
|  |  | ||||||
|   cFemonH264        detectH264M; |   cFemonH264        detectH264M; | ||||||
|  |   cFemonH265        detectH265M; | ||||||
|   cFemonMPEG        detectMpegM; |   cFemonMPEG        detectMpegM; | ||||||
|   cFemonAAC         detectAacM; |   cFemonAAC         detectAacM; | ||||||
|   cFemonLATM        detectLatmM; |   cFemonLATM        detectLatmM; | ||||||
| @@ -59,7 +61,7 @@ private: | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|   virtual void Activate(bool onP); |   virtual void Activate(bool onP); | ||||||
|   virtual void Receive(uchar *dataP, int lengthP); |   virtual void Receive(const uchar *dataP, int lengthP); | ||||||
|   virtual void Action(void); |   virtual void Action(void); | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								symbol.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								symbol.c
									
									
									
									
									
								
							| @@ -19,6 +19,7 @@ | |||||||
| #include "symbols/dolbydigital51.xpm" | #include "symbols/dolbydigital51.xpm" | ||||||
| #include "symbols/mpeg2.xpm" | #include "symbols/mpeg2.xpm" | ||||||
| #include "symbols/h264.xpm" | #include "symbols/h264.xpm" | ||||||
|  | #include "symbols/h265.xpm" | ||||||
| #include "symbols/ntsc.xpm" | #include "symbols/ntsc.xpm" | ||||||
| #include "symbols/pal.xpm" | #include "symbols/pal.xpm" | ||||||
| #include "symbols/encrypted.xpm" | #include "symbols/encrypted.xpm" | ||||||
| @@ -42,6 +43,9 @@ | |||||||
| #include "symbols/six.xpm" | #include "symbols/six.xpm" | ||||||
| #include "symbols/seven.xpm" | #include "symbols/seven.xpm" | ||||||
| #include "symbols/eight.xpm" | #include "symbols/eight.xpm" | ||||||
|  | #include "symbols/format2160.xpm" | ||||||
|  | #include "symbols/format2160i.xpm" | ||||||
|  | #include "symbols/format2160p.xpm" | ||||||
| #include "symbols/format1080.xpm" | #include "symbols/format1080.xpm" | ||||||
| #include "symbols/format1080i.xpm" | #include "symbols/format1080i.xpm" | ||||||
| #include "symbols/format1080p.xpm" | #include "symbols/format1080p.xpm" | ||||||
| @@ -64,6 +68,7 @@ static cBitmap bmDolbyDigital20(dolbydigital20_xpm); | |||||||
| static cBitmap bmDolbyDigital51(dolbydigital51_xpm); | static cBitmap bmDolbyDigital51(dolbydigital51_xpm); | ||||||
| static cBitmap bmMpeg2(mpeg2_xpm); | static cBitmap bmMpeg2(mpeg2_xpm); | ||||||
| static cBitmap bmH264(h264_xpm); | static cBitmap bmH264(h264_xpm); | ||||||
|  | static cBitmap bmH265(h265_xpm); | ||||||
| static cBitmap bmPal(pal_xpm); | static cBitmap bmPal(pal_xpm); | ||||||
| static cBitmap bmNtsc(ntsc_xpm); | static cBitmap bmNtsc(ntsc_xpm); | ||||||
| static cBitmap bmEncrypted(encrypted_xpm); | static cBitmap bmEncrypted(encrypted_xpm); | ||||||
| @@ -87,6 +92,9 @@ static cBitmap bmFive(five_xpm); | |||||||
| static cBitmap bmSix(six_xpm); | static cBitmap bmSix(six_xpm); | ||||||
| static cBitmap bmSeven(seven_xpm); | static cBitmap bmSeven(seven_xpm); | ||||||
| static cBitmap bmEight(eight_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 bmFormat1080(format1080_xpm); | ||||||
| static cBitmap bmFormat1080i(format1080i_xpm); | static cBitmap bmFormat1080i(format1080i_xpm); | ||||||
| static cBitmap bmFormat1080p(format1080p_xpm); | static cBitmap bmFormat1080p(format1080p_xpm); | ||||||
| @@ -146,6 +154,7 @@ bool cFemonSymbolCache::Populate(void) | |||||||
|      cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM));  // SYMBOL_DD51 |      cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM));  // SYMBOL_DD51 | ||||||
|      cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_MPEG2 |      cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_MPEG2 | ||||||
|      cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_H264 |      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(bmPal.Scaled(yFactorM, yFactorM, antiAliasM));             // SYMBOL_PAL | ||||||
|      cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_NTSC |      cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_NTSC | ||||||
|      cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM));       // SYMBOL_ENCRYPTED |      cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM));       // SYMBOL_ENCRYPTED | ||||||
| @@ -169,6 +178,9 @@ bool cFemonSymbolCache::Populate(void) | |||||||
|      cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM));             // SYMBOL_SIX |      cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM));             // SYMBOL_SIX | ||||||
|      cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_SEVEN |      cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_SEVEN | ||||||
|      cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_EIGHT |      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(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM));      // SYMBOL_FORMAT_1080 | ||||||
|      cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_1080i |      cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_1080i | ||||||
|      cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_1080p |      cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM));     // SYMBOL_FORMAT_1080p | ||||||
| @@ -201,7 +213,7 @@ bool cFemonSymbolCache::Flush(void) | |||||||
|  |  | ||||||
| cBitmap& cFemonSymbolCache::Get(eSymbols symbolP) | cBitmap& cFemonSymbolCache::Get(eSymbols symbolP) | ||||||
| { | { | ||||||
|   cBitmap *bitmapM = cacheM[SYMBOL_ONEPIXEL]; |   cBitmap *bitmapM = &bmOnePixel; | ||||||
|  |  | ||||||
|   if (symbolP < cacheM.Size()) |   if (symbolP < cacheM.Size()) | ||||||
|      bitmapM = cacheM[symbolP]; |      bitmapM = cacheM[symbolP]; | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								symbol.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								symbol.h
									
									
									
									
									
								
							| @@ -21,6 +21,7 @@ enum eSymbols { | |||||||
|   SYMBOL_DD51, |   SYMBOL_DD51, | ||||||
|   SYMBOL_MPEG2, |   SYMBOL_MPEG2, | ||||||
|   SYMBOL_H264, |   SYMBOL_H264, | ||||||
|  |   SYMBOL_H265, | ||||||
|   SYMBOL_PAL, |   SYMBOL_PAL, | ||||||
|   SYMBOL_NTSC, |   SYMBOL_NTSC, | ||||||
|   SYMBOL_ENCRYPTED, |   SYMBOL_ENCRYPTED, | ||||||
| @@ -44,6 +45,9 @@ enum eSymbols { | |||||||
|   SYMBOL_SIX, |   SYMBOL_SIX, | ||||||
|   SYMBOL_SEVEN, |   SYMBOL_SEVEN, | ||||||
|   SYMBOL_EIGHT, |   SYMBOL_EIGHT, | ||||||
|  |   SYMBOL_FORMAT_2160, | ||||||
|  |   SYMBOL_FORMAT_2160i, | ||||||
|  |   SYMBOL_FORMAT_2160p, | ||||||
|   SYMBOL_FORMAT_1080, |   SYMBOL_FORMAT_1080, | ||||||
|   SYMBOL_FORMAT_1080i, |   SYMBOL_FORMAT_1080i, | ||||||
|   SYMBOL_FORMAT_1080p, |   SYMBOL_FORMAT_1080p, | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								symbols/format2160.xpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								symbols/format2160.xpm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | /* XPM */ | ||||||
|  | static const char *const format2160_xpm[] = { | ||||||
|  | "40 18 2 1", | ||||||
|  | ".	c #FFFFFF", | ||||||
|  | "+	c #000000", | ||||||
|  | "++++++++++++++++++++++++++++++++++++++++", | ||||||
|  | "+......................................+", | ||||||
|  | "+.....++++......++..++++++....++++.....+", | ||||||
|  | "+...+++++++..+++++.++++++++..++++++....+", | ||||||
|  | "+...++....++.+++++.+++...++..++..++....+", | ||||||
|  | "+.........++....++.++.......++....++...+", | ||||||
|  | "+.........++....++.++.......++....++...+", | ||||||
|  | "+.........++....++.++.+++...++....++...+", | ||||||
|  | "+.......+++.....++.+++++++..++....++...+", | ||||||
|  | "+......+++......++.+++..+++.++....++...+", | ||||||
|  | "+.....+++.......++.++....++.++....++...+", | ||||||
|  | "+.....+++.......++.++....++.++....++...+", | ||||||
|  | "+....+++........++.++....++.++....++...+", | ||||||
|  | "+....++.........++.+++..+++..++..++....+", | ||||||
|  | "+....++++++++...++..+++++++..++++++....+", | ||||||
|  | "+....++++++++...++...+++++....++++.....+", | ||||||
|  | "+......................................+", | ||||||
|  | "++++++++++++++++++++++++++++++++++++++++"}; | ||||||
							
								
								
									
										23
									
								
								symbols/format2160i.xpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								symbols/format2160i.xpm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | /* XPM */ | ||||||
|  | static const char *const format2160i_xpm[] = { | ||||||
|  | "43 18 2 1", | ||||||
|  | ".	c #FFFFFF", | ||||||
|  | "+	c #000000", | ||||||
|  | "+++++++++++++++++++++++++++++++++++++++++++", | ||||||
|  | "+.........................................+", | ||||||
|  | "+.....++++......++..++++++....++++........+", | ||||||
|  | "+...+++++++..+++++.++++++++..++++++.......+", | ||||||
|  | "+...++....++.+++++.+++...++..++..++.......+", | ||||||
|  | "+.........++....++.++.......++....++......+", | ||||||
|  | "+.........++....++.++.......++....++.++...+", | ||||||
|  | "+.........++....++.++.+++...++....++.++...+", | ||||||
|  | "+.......+++.....++.+++++++..++....++......+", | ||||||
|  | "+......+++......++.+++..+++.++....++.++...+", | ||||||
|  | "+.....+++.......++.++....++.++....++.++...+", | ||||||
|  | "+.....+++.......++.++....++.++....++.++...+", | ||||||
|  | "+....+++........++.++....++.++....++.++...+", | ||||||
|  | "+....++.........++.+++..+++..++..++..++...+", | ||||||
|  | "+....++++++++...++..+++++++..++++++..++...+", | ||||||
|  | "+....++++++++...++...+++++....++++...++...+", | ||||||
|  | "+.........................................+", | ||||||
|  | "+++++++++++++++++++++++++++++++++++++++++++"}; | ||||||
							
								
								
									
										23
									
								
								symbols/format2160p.xpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								symbols/format2160p.xpm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | /* XPM */ | ||||||
|  | static const char *const format2160p_xpm[] = { | ||||||
|  | "47 18 2 1", | ||||||
|  | ".	c #FFFFFF", | ||||||
|  | "+	c #000000", | ||||||
|  | "+++++++++++++++++++++++++++++++++++++++++++++++", | ||||||
|  | "+.............................................+", | ||||||
|  | "+.....++++......++..++++++....++++............+", | ||||||
|  | "+...+++++++..+++++.++++++++..++++++...........+", | ||||||
|  | "+...++....++.+++++.+++...++..++..++...........+", | ||||||
|  | "+.........++....++.++.......++....++..........+", | ||||||
|  | "+.........++....++.++.......++....++..........+", | ||||||
|  | "+.........++....++.++.+++...++....++.++++.....+", | ||||||
|  | "+.......+++.....++.+++++++..++....++.+++++....+", | ||||||
|  | "+......+++......++.+++..+++.++....++.++..++...+", | ||||||
|  | "+.....+++.......++.++....++.++....++.++..++...+", | ||||||
|  | "+.....+++.......++.++....++.++....++.+++++....+", | ||||||
|  | "+....+++........++.++....++.++....++.++++.....+", | ||||||
|  | "+....++.........++.+++..+++..++..++..++.......+", | ||||||
|  | "+....++++++++...++..+++++++..++++++..++.......+", | ||||||
|  | "+....++++++++...++...+++++....++++...++.......+", | ||||||
|  | "+.............................................+", | ||||||
|  | "+++++++++++++++++++++++++++++++++++++++++++++++"}; | ||||||
							
								
								
									
										23
									
								
								symbols/h265.xpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								symbols/h265.xpm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | /* XPM */ | ||||||
|  | static const char *const h265_xpm[] = { | ||||||
|  | "40 18 2 1", | ||||||
|  | ".	c #FFFFFF", | ||||||
|  | "+	c #000000", | ||||||
|  | "++++++++++++++++++++++++++++++++++++++++", | ||||||
|  | "+......................................+", | ||||||
|  | "+..++...++.....+++++...+++++..+++++++..+", | ||||||
|  | "+..++...++....+++++++.+++++++.+++++++..+", | ||||||
|  | "+..++...++....++...++.++...++.++.......+", | ||||||
|  | "+..++...++.........++.++......++.......+", | ||||||
|  | "+..++...++.........++.++......++.......+", | ||||||
|  | "+..++...++........+++.++......++.......+", | ||||||
|  | "+..+++++++.......+++..++++++..++++++...+", | ||||||
|  | "+..+++++++......+++...+++++++.+++++++..+", | ||||||
|  | "+..++...++.....+++....++...++.....+++..+", | ||||||
|  | "+..++...++....+++.....++...++......++..+", | ||||||
|  | "+..++...++....++......++...++......++..+", | ||||||
|  | "+..++...++....++...++.++...++.++...++..+", | ||||||
|  | "+..++...++.++.+++++++.+++++++.++...++..+", | ||||||
|  | "+..++...++.++.+++++++..+++++...+++++...+", | ||||||
|  | "+......................................+", | ||||||
|  | "++++++++++++++++++++++++++++++++++++++++"}; | ||||||
							
								
								
									
										167
									
								
								tools.c
									
									
									
									
									
								
							
							
						
						
									
										167
									
								
								tools.c
									
									
									
									
									
								
							| @@ -13,8 +13,6 @@ | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <sys/ioctl.h> |  | ||||||
| #include <linux/dvb/frontend.h> |  | ||||||
|  |  | ||||||
| #include "osd.h" | #include "osd.h" | ||||||
| #include "receiver.h" | #include "receiver.h" | ||||||
| @@ -91,60 +89,42 @@ static const char *getUserString(int valueP, const tDvbParameterMap *mapP) | |||||||
|   return "---"; |   return "---"; | ||||||
| } | } | ||||||
|  |  | ||||||
| cDvbDevice *getDvbDevice(cDevice* deviceP) | cString getFrontendInfo(cDevice *deviceP) | ||||||
| { | { | ||||||
|   cDvbDevice *dev = dynamic_cast<cDvbDevice*>(deviceP); |   const cChannel *channel; | ||||||
| #ifdef __DYNAMIC_DEVICE_PROBE |   int status, valid = DTV_STAT_VALID_NONE; | ||||||
|   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 = ""; |   cString info = ""; | ||||||
|   uint16_t signal = 0; |   double signal = 0, cnr = 0, ber = 0, per = 0; | ||||||
|   uint16_t snr = 0; |  | ||||||
|   uint32_t ber = 0; |  | ||||||
|   uint32_t unc = 0; |  | ||||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); |  | ||||||
|  |  | ||||||
|   if (!deviceP) |   if (!deviceP) | ||||||
|      return info; |      return info; | ||||||
|  |  | ||||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); |   info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d\nTYPE:%s\nNAME:%s", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality(), *deviceP->DeviceType(), *deviceP->DeviceName()); | ||||||
|   if (fe < 0) |   if (deviceP && deviceP->SignalStats(valid, &signal, &cnr, NULL, &ber, &per, &status)) { | ||||||
|      return info; |      if (valid & DTV_STAT_VALID_STATUS) | ||||||
|  |         info = cString::sprintf("%s\nSTAT:%04X", *info, status); | ||||||
|   info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality()); |      if (valid & DTV_STAT_VALID_STRENGTH) | ||||||
|  |         info = cString::sprintf("%s\nSGNL:%s", *info, *dtoa(signal, "%.2f")); | ||||||
|   if (ioctl(fe, FE_GET_INFO, &value) >= 0) |      if (valid & DTV_STAT_VALID_CNR) | ||||||
|      info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *deviceP->DeviceName()); |         info = cString::sprintf("%s\nCNRA:%s", *info, *dtoa(cnr, "%.2f")); | ||||||
|   if (ioctl(fe, FE_READ_STATUS, &status) >= 0) |      if (valid & DTV_STAT_VALID_BERPOST) | ||||||
|      info = cString::sprintf("%s\nSTAT:%02X", *info, status); |         info = cString::sprintf("%s\nBERA:%s", *info, *dtoa(ber, "%.0f")); | ||||||
|   if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0) |      if (valid & DTV_STAT_VALID_PER) | ||||||
|      info = cString::sprintf("%s\nSGNL:%04X", *info, signal); |         info = cString::sprintf("%s\nPERA:%s", *info, *dtoa(per, "%.0f")); | ||||||
|   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()) |   if (cFemonOsd::Instance()) | ||||||
|      info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate()); |      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")); | ||||||
|  |  | ||||||
|  |   LOCK_CHANNELS_READ; | ||||||
|  |   channel = Channels->GetByNumber(cDevice::CurrentChannel()); | ||||||
|   if (channel) |   if (channel) | ||||||
|      info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText()); |      info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText()); | ||||||
|  |  | ||||||
|   return info; |   return info; | ||||||
| } | } | ||||||
|  |  | ||||||
| cString getFrontendName(cDvbDevice *deviceP) | cString getFrontendName(cDevice *deviceP) | ||||||
| { | { | ||||||
|   if (!deviceP) |   if (!deviceP) | ||||||
|      return NULL; |      return NULL; | ||||||
| @@ -152,85 +132,69 @@ cString getFrontendName(cDvbDevice *deviceP) | |||||||
|   return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex())); |   return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex())); | ||||||
| } | } | ||||||
|  |  | ||||||
| cString getFrontendStatus(cDvbDevice *deviceP) | cString getFrontendStatus(cDevice *deviceP) | ||||||
| { | { | ||||||
|   fe_status_t value; |   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())); | ||||||
|  |      } | ||||||
|  |  | ||||||
|   if (!deviceP) |  | ||||||
|   return NULL; |   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())); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| uint16_t getSignal(cDvbDevice *deviceP) | double getSignal(cDevice *deviceP) | ||||||
| { | { | ||||||
|   uint16_t value = 0; |   double strength; | ||||||
|  |   int valid = DTV_STAT_VALID_NONE; | ||||||
|  |  | ||||||
|   if (!deviceP) |   if (deviceP && deviceP->SignalStats(valid, &strength, NULL, NULL, NULL, NULL, NULL)) { | ||||||
|      return (value); |      if (valid & DTV_STAT_VALID_STRENGTH) | ||||||
|  |         return strength; | ||||||
|   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); |  | ||||||
|      } |      } | ||||||
|  |  | ||||||
| uint16_t getSNR(cDvbDevice *deviceP) |   return 0; | ||||||
| { |  | ||||||
|   uint16_t value = 0; |  | ||||||
|  |  | ||||||
|   if (!deviceP) |  | ||||||
|      return (value); |  | ||||||
|  |  | ||||||
|   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); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| uint32_t getBER(cDvbDevice *deviceP) | double getCNR(cDevice *deviceP) | ||||||
| { | { | ||||||
|   uint32_t value = 0; |   double cnr; | ||||||
|  |   int valid = DTV_STAT_VALID_NONE; | ||||||
|  |  | ||||||
|   if (!deviceP) |   if (deviceP && deviceP->SignalStats(valid, NULL, &cnr, NULL, NULL, NULL, NULL)) { | ||||||
|      return (value); |      if (valid & DTV_STAT_VALID_CNR) | ||||||
|  |         return cnr; | ||||||
|   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); |  | ||||||
|      } |      } | ||||||
|  |  | ||||||
| uint32_t getUNC(cDvbDevice *deviceP) |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | double getBER(cDevice *deviceP) | ||||||
| { | { | ||||||
|   uint32_t value = 0; |   double ber; | ||||||
|  |   int valid = DTV_STAT_VALID_NONE; | ||||||
|  |  | ||||||
|   if (!deviceP) |   if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, &ber, NULL, NULL)) { | ||||||
|      return (value); |      if (valid & DTV_STAT_VALID_BERPOST) | ||||||
|  |         return ber; | ||||||
|  |      } | ||||||
|  |  | ||||||
|   int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK); |   return 0; | ||||||
|   if (fe < 0) | } | ||||||
|      return (value); |  | ||||||
|   ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value); |  | ||||||
|   close(fe); |  | ||||||
|  |  | ||||||
|   return (value); | double getPER(cDevice *deviceP) | ||||||
|  | { | ||||||
|  |   double per; | ||||||
|  |   int valid = DTV_STAT_VALID_NONE; | ||||||
|  |  | ||||||
|  |   if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, &per, NULL)) { | ||||||
|  |      if (valid & DTV_STAT_VALID_PER) | ||||||
|  |         return per; | ||||||
|  |      } | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| cString getApids(const cChannel *channelP) | cString getApids(const cChannel *channelP) | ||||||
| @@ -309,6 +273,7 @@ cString getVideoCodec(int valueP) | |||||||
|   switch (valueP) { |   switch (valueP) { | ||||||
|     case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2")); |     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_H264:  return cString::sprintf("%s", tr("H.264")); | ||||||
|  |     case VIDEO_CODEC_H265:  return cString::sprintf("%s", tr("H.265")); | ||||||
|     default:                break; |     default:                break; | ||||||
|     } |     } | ||||||
|   return cString::sprintf("---"); |   return cString::sprintf("---"); | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								tools.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								tools.h
									
									
									
									
									
								
							| @@ -20,17 +20,14 @@ | |||||||
|  |  | ||||||
| #define SATIP_DEVICE "SAT>IP" | #define SATIP_DEVICE "SAT>IP" | ||||||
|  |  | ||||||
| cDvbDevice *getDvbDevice(cDevice* deviceP); | cString getFrontendInfo(cDevice *deviceP); | ||||||
|  | cString getFrontendName(cDevice *deviceP); | ||||||
|  | cString getFrontendStatus(cDevice *deviceP); | ||||||
|  |  | ||||||
| cString getFrontendInfo(cDvbDevice *deviceP); | double getCNR(cDevice *deviceP); | ||||||
| cString getFrontendName(cDvbDevice *deviceP); | double getSignal(cDevice *deviceP); | ||||||
| cString getFrontendStatus(cDvbDevice *deviceP); | double getBER(cDevice *deviceP); | ||||||
|  | double getPER(cDevice *deviceP); | ||||||
| uint16_t getSNR(cDvbDevice *deviceP); |  | ||||||
| uint16_t getSignal(cDvbDevice *deviceP); |  | ||||||
|  |  | ||||||
| uint32_t getBER(cDvbDevice *deviceP); |  | ||||||
| uint32_t getUNC(cDvbDevice *deviceP); |  | ||||||
|  |  | ||||||
| cString getApids(const cChannel *channelP); | cString getApids(const cChannel *channelP); | ||||||
| cString getDpids(const cChannel *channelP); | cString getDpids(const cChannel *channelP); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user