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> | ||||
|  for reporting a problem with error messages from cDvbDevice::GetVideoSize() | ||||
|  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). | ||||
| - Increased the value of MAXFRAMESIZE to better suit HD recordings (thanks to | ||||
|   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 | ||||
|  * 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" | ||||
| @@ -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) | ||||
| { | ||||
|   if (caids[0] && caids[0] <= CA_USER_MAX) | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * 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 | ||||
| @@ -129,6 +129,9 @@ private: | ||||
|   char dlangs[MAXDPIDS][MAXLANGCODE2]; | ||||
|   int spids[MAXSPIDS + 1]; // list is zero-terminated | ||||
|   char slangs[MAXSPIDS][MAXLANGCODE2]; | ||||
|   uchar subtitlingTypes[MAXSPIDS]; | ||||
|   uint16_t compositionPageIds[MAXSPIDS]; | ||||
|   uint16_t ancillaryPageIds[MAXSPIDS]; | ||||
|   int tpid; | ||||
|   int caids[MAXCAIDS + 1]; // list is zero-terminated | ||||
|   int nid; | ||||
| @@ -185,6 +188,9 @@ public: | ||||
|   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 *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; } | ||||
|   const int *Caids(void) const { return caids; } | ||||
|   int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; } | ||||
| @@ -226,6 +232,7 @@ public: | ||||
|   void SetCaDescriptors(int Level); | ||||
|   void SetLinkChannels(cLinkChannels *LinkChannels); | ||||
|   void SetRefChannel(cChannel *RefChannel); | ||||
|   void SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *CompositionPageIds, uint16_t *AncillaryPageIds); | ||||
|   }; | ||||
|  | ||||
| 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 | ||||
|  * 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" | ||||
| @@ -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 Dpids[MAXDPIDS + 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 DLangs[MAXDPIDS][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; | ||||
|                                     for (SI::Loop::Iterator it; sd->subtitlingLoop.getNext(sub, it); ) { | ||||
|                                         if (sub.languageCode[0]) { | ||||
|                                            SubtitlingTypes[NumSpids] = sub.getSubtitlingType(); | ||||
|                                            CompositionPageIds[NumSpids] = sub.getCompositionPageId(); | ||||
|                                            AncillaryPageIds[NumSpids] = sub.getAncillaryPageId(); | ||||
|                                            if (n > 0) | ||||
|                                               *s++ = '+'; | ||||
|                                            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) { | ||||
|            Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); | ||||
|            Channel->SetCaIds(CaDescriptors->CaIds()); | ||||
|            Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds); | ||||
|            } | ||||
|         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 | ||||
|  * 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" | ||||
| @@ -198,7 +198,7 @@ int cPatPmtGenerator::MakeAC3Descriptor(uchar *Target) | ||||
|   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; | ||||
|   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++] = 0x00; // subtitling type | ||||
|   Target[i++] = 0x00; // composition page id hi | ||||
|   Target[i++] = 0x01; // composition page id lo | ||||
|   Target[i++] = 0x00; // ancillary page id hi | ||||
|   Target[i++] = 0x01; // ancillary page id lo | ||||
|   Target[i++] = SubtitlingType; | ||||
|   Target[i++] = CompositionPageId >> 8; | ||||
|   Target[i++] = CompositionPageId & 0xFF; | ||||
|   Target[i++] = AncillaryPageId >> 8; | ||||
|   Target[i++] = AncillaryPageId & 0xFF; | ||||
|   IncEsInfoLength(i); | ||||
|   return i; | ||||
| } | ||||
| @@ -327,7 +327,7 @@ void cPatPmtGenerator::GeneratePmt(cChannel *Channel) | ||||
|          } | ||||
|      for (int n = 0; Channel->Spid(n); 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 | ||||
|   | ||||
							
								
								
									
										4
									
								
								remux.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								remux.h
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * 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 | ||||
| @@ -168,7 +168,7 @@ private: | ||||
| protected: | ||||
|   int MakeStream(uchar *Target, uchar Type, int Pid); | ||||
|   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 MakeCRC(uchar *Target, const uchar *Data, int Length); | ||||
|   void GeneratePmtPid(cChannel *Channel); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user