mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Implemented full handling of subtitling descriptors
This commit is contained in:
		| @@ -2486,3 +2486,6 @@ G | |||||||
| Martin Neuditschko <yosuke.tomoe@gmx.net> | Martin Neuditschko <yosuke.tomoe@gmx.net> | ||||||
|  for reporting a problem with error messages from cDvbDevice::GetVideoSize() |  for reporting a problem with error messages from cDvbDevice::GetVideoSize() | ||||||
|  on systems with no real primary replay device |  on systems with no real primary replay device | ||||||
|  |  | ||||||
|  | Mikko Tuumanen <mikko.tuumanen@utu.fi> | ||||||
|  |  for implementing full handling of subtitling descriptors | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -6155,3 +6155,4 @@ Video Disk Recorder Revision History | |||||||
|   (thanks to Matthias Schwarzott). |   (thanks to Matthias Schwarzott). | ||||||
| - Increased the value of MAXFRAMESIZE to better suit HD recordings (thanks to | - Increased the value of MAXFRAMESIZE to better suit HD recordings (thanks to | ||||||
|   Reinhard Nissl). |   Reinhard Nissl). | ||||||
|  | - Implemented full handling of subtitling descriptors (thanks to Mikko Tuumanen). | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								channels.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								channels.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: channels.c 2.6 2009/04/25 13:57:32 kls Exp $ |  * $Id: channels.c 2.7 2009/08/16 15:08:49 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "channels.h" | #include "channels.h" | ||||||
| @@ -533,6 +533,22 @@ void cChannel::SetPids(int Vpid, int Ppid, int Vtype, int *Apids, char ALangs[][ | |||||||
|      } |      } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void cChannel::SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *CompositionPageIds, uint16_t *AncillaryPageIds) | ||||||
|  | { | ||||||
|  |   if (SubtitlingTypes) { | ||||||
|  |      for (int i = 0; i < MAXSPIDS; i++) | ||||||
|  |          subtitlingTypes[i] = SubtitlingTypes[i]; | ||||||
|  |      } | ||||||
|  |   if (CompositionPageIds) { | ||||||
|  |      for (int i = 0; i < MAXSPIDS; i++) | ||||||
|  |          compositionPageIds[i] = CompositionPageIds[i]; | ||||||
|  |      } | ||||||
|  |   if (AncillaryPageIds) { | ||||||
|  |      for (int i = 0; i < MAXSPIDS; i++) | ||||||
|  |          ancillaryPageIds[i] = AncillaryPageIds[i]; | ||||||
|  |      } | ||||||
|  | } | ||||||
|  |  | ||||||
| void cChannel::SetCaIds(const int *CaIds) | void cChannel::SetCaIds(const int *CaIds) | ||||||
| { | { | ||||||
|   if (caids[0] && caids[0] <= CA_USER_MAX) |   if (caids[0] && caids[0] <= CA_USER_MAX) | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: channels.h 2.4 2008/11/22 13:35:52 kls Exp $ |  * $Id: channels.h 2.5 2009/08/16 14:58:26 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef __CHANNELS_H | #ifndef __CHANNELS_H | ||||||
| @@ -129,6 +129,9 @@ private: | |||||||
|   char dlangs[MAXDPIDS][MAXLANGCODE2]; |   char dlangs[MAXDPIDS][MAXLANGCODE2]; | ||||||
|   int spids[MAXSPIDS + 1]; // list is zero-terminated |   int spids[MAXSPIDS + 1]; // list is zero-terminated | ||||||
|   char slangs[MAXSPIDS][MAXLANGCODE2]; |   char slangs[MAXSPIDS][MAXLANGCODE2]; | ||||||
|  |   uchar subtitlingTypes[MAXSPIDS]; | ||||||
|  |   uint16_t compositionPageIds[MAXSPIDS]; | ||||||
|  |   uint16_t ancillaryPageIds[MAXSPIDS]; | ||||||
|   int tpid; |   int tpid; | ||||||
|   int caids[MAXCAIDS + 1]; // list is zero-terminated |   int caids[MAXCAIDS + 1]; // list is zero-terminated | ||||||
|   int nid; |   int nid; | ||||||
| @@ -185,6 +188,9 @@ public: | |||||||
|   const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; } |   const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; } | ||||||
|   const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; } |   const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; } | ||||||
|   const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; } |   const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; } | ||||||
|  |   uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS ? subtitlingTypes[i] : 0); } | ||||||
|  |   uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS ? compositionPageIds[i] : 0); } | ||||||
|  |   uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS ? ancillaryPageIds[i] : 0); } | ||||||
|   int Tpid(void) const { return tpid; } |   int Tpid(void) const { return tpid; } | ||||||
|   const int *Caids(void) const { return caids; } |   const int *Caids(void) const { return caids; } | ||||||
|   int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; } |   int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; } | ||||||
| @@ -226,6 +232,7 @@ public: | |||||||
|   void SetCaDescriptors(int Level); |   void SetCaDescriptors(int Level); | ||||||
|   void SetLinkChannels(cLinkChannels *LinkChannels); |   void SetLinkChannels(cLinkChannels *LinkChannels); | ||||||
|   void SetRefChannel(cChannel *RefChannel); |   void SetRefChannel(cChannel *RefChannel); | ||||||
|  |   void SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *CompositionPageIds, uint16_t *AncillaryPageIds); | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| class cChannels : public cRwLock, public cConfig<cChannel> { | class cChannels : public cRwLock, public cConfig<cChannel> { | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								pat.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								pat.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: pat.c 2.3 2009/08/15 22:16:02 kls Exp $ |  * $Id: pat.c 2.4 2009/08/16 15:01:03 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "pat.h" | #include "pat.h" | ||||||
| @@ -334,6 +334,9 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length | |||||||
|         int Apids[MAXAPIDS + 1] = { 0 }; // these lists are zero-terminated |         int Apids[MAXAPIDS + 1] = { 0 }; // these lists are zero-terminated | ||||||
|         int Dpids[MAXDPIDS + 1] = { 0 }; |         int Dpids[MAXDPIDS + 1] = { 0 }; | ||||||
|         int Spids[MAXSPIDS + 1] = { 0 }; |         int Spids[MAXSPIDS + 1] = { 0 }; | ||||||
|  |         uchar SubtitlingTypes[MAXSPIDS + 1] = { 0 }; | ||||||
|  |         uint16_t CompositionPageIds[MAXSPIDS + 1] = { 0 }; | ||||||
|  |         uint16_t AncillaryPageIds[MAXSPIDS + 1] = { 0 }; | ||||||
|         char ALangs[MAXAPIDS][MAXLANGCODE2] = { "" }; |         char ALangs[MAXAPIDS][MAXLANGCODE2] = { "" }; | ||||||
|         char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" }; |         char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" }; | ||||||
|         char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" }; |         char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" }; | ||||||
| @@ -405,6 +408,9 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length | |||||||
|                                     int n = 0; |                                     int n = 0; | ||||||
|                                     for (SI::Loop::Iterator it; sd->subtitlingLoop.getNext(sub, it); ) { |                                     for (SI::Loop::Iterator it; sd->subtitlingLoop.getNext(sub, it); ) { | ||||||
|                                         if (sub.languageCode[0]) { |                                         if (sub.languageCode[0]) { | ||||||
|  |                                            SubtitlingTypes[NumSpids] = sub.getSubtitlingType(); | ||||||
|  |                                            CompositionPageIds[NumSpids] = sub.getCompositionPageId(); | ||||||
|  |                                            AncillaryPageIds[NumSpids] = sub.getAncillaryPageId(); | ||||||
|                                            if (n > 0) |                                            if (n > 0) | ||||||
|                                               *s++ = '+'; |                                               *s++ = '+'; | ||||||
|                                            strn0cpy(s, I18nNormalizeLanguageCode(sub.languageCode), MAXLANGCODE1); |                                            strn0cpy(s, I18nNormalizeLanguageCode(sub.languageCode), MAXLANGCODE1); | ||||||
| @@ -447,6 +453,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length | |||||||
|         if (Setup.UpdateChannels >= 2) { |         if (Setup.UpdateChannels >= 2) { | ||||||
|            Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); |            Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); | ||||||
|            Channel->SetCaIds(CaDescriptors->CaIds()); |            Channel->SetCaIds(CaDescriptors->CaIds()); | ||||||
|  |            Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds); | ||||||
|            } |            } | ||||||
|         Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors)); |         Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors)); | ||||||
|         } |         } | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								remux.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								remux.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: remux.c 2.25 2009/06/21 13:30:03 kls Exp $ |  * $Id: remux.c 2.26 2009/08/16 15:13:42 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "remux.h" | #include "remux.h" | ||||||
| @@ -198,7 +198,7 @@ int cPatPmtGenerator::MakeAC3Descriptor(uchar *Target) | |||||||
|   return i; |   return i; | ||||||
| } | } | ||||||
|  |  | ||||||
| int cPatPmtGenerator::MakeSubtitlingDescriptor(uchar *Target, const char *Language) | int cPatPmtGenerator::MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId) | ||||||
| { | { | ||||||
|   int i = 0; |   int i = 0; | ||||||
|   Target[i++] = SI::SubtitlingDescriptorTag; |   Target[i++] = SI::SubtitlingDescriptorTag; | ||||||
| @@ -206,11 +206,11 @@ int cPatPmtGenerator::MakeSubtitlingDescriptor(uchar *Target, const char *Langua | |||||||
|   Target[i++] = *Language++; |   Target[i++] = *Language++; | ||||||
|   Target[i++] = *Language++; |   Target[i++] = *Language++; | ||||||
|   Target[i++] = *Language++; |   Target[i++] = *Language++; | ||||||
|   Target[i++] = 0x00; // subtitling type |   Target[i++] = SubtitlingType; | ||||||
|   Target[i++] = 0x00; // composition page id hi |   Target[i++] = CompositionPageId >> 8; | ||||||
|   Target[i++] = 0x01; // composition page id lo |   Target[i++] = CompositionPageId & 0xFF; | ||||||
|   Target[i++] = 0x00; // ancillary page id hi |   Target[i++] = AncillaryPageId >> 8; | ||||||
|   Target[i++] = 0x01; // ancillary page id lo |   Target[i++] = AncillaryPageId & 0xFF; | ||||||
|   IncEsInfoLength(i); |   IncEsInfoLength(i); | ||||||
|   return i; |   return i; | ||||||
| } | } | ||||||
| @@ -327,7 +327,7 @@ void cPatPmtGenerator::GeneratePmt(cChannel *Channel) | |||||||
|          } |          } | ||||||
|      for (int n = 0; Channel->Spid(n); n++) { |      for (int n = 0; Channel->Spid(n); n++) { | ||||||
|          i += MakeStream(buf + i, 0x06, Channel->Spid(n)); |          i += MakeStream(buf + i, 0x06, Channel->Spid(n)); | ||||||
|          i += MakeSubtitlingDescriptor(buf + i, Channel->Slang(n)); |          i += MakeSubtitlingDescriptor(buf + i, Channel->Slang(n), Channel->SubtitlingType(n), Channel->CompositionPageId(n), Channel->AncillaryPageId(n)); | ||||||
|          } |          } | ||||||
|  |  | ||||||
|      int sl = i - SectionLength - 2 + 4; // -2 = SectionLength storage, +4 = length of CRC |      int sl = i - SectionLength - 2 + 4; // -2 = SectionLength storage, +4 = length of CRC | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								remux.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								remux.h
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  * See the main source file 'vdr.c' for copyright information and |  * See the main source file 'vdr.c' for copyright information and | ||||||
|  * how to reach the author. |  * how to reach the author. | ||||||
|  * |  * | ||||||
|  * $Id: remux.h 2.18 2009/06/21 13:01:30 kls Exp $ |  * $Id: remux.h 2.19 2009/08/16 15:15:33 kls Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef __REMUX_H | #ifndef __REMUX_H | ||||||
| @@ -168,7 +168,7 @@ private: | |||||||
| protected: | protected: | ||||||
|   int MakeStream(uchar *Target, uchar Type, int Pid); |   int MakeStream(uchar *Target, uchar Type, int Pid); | ||||||
|   int MakeAC3Descriptor(uchar *Target); |   int MakeAC3Descriptor(uchar *Target); | ||||||
|   int MakeSubtitlingDescriptor(uchar *Target, const char *Language); |   int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId); | ||||||
|   int MakeLanguageDescriptor(uchar *Target, const char *Language); |   int MakeLanguageDescriptor(uchar *Target, const char *Language); | ||||||
|   int MakeCRC(uchar *Target, const uchar *Data, int Length); |   int MakeCRC(uchar *Target, const uchar *Data, int Length); | ||||||
|   void GeneratePmtPid(cChannel *Channel); |   void GeneratePmtPid(cChannel *Channel); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user