MHEG5  18.9.0
MHEG5 Documentation
mh5support.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2010 Ocean Blue Software Ltd
4  *
5  * This file is part of a DTVKit Software Component
6  * You are permitted to copy, modify or distribute this file subject to the terms
7  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
8  *
9  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
10  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
11  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  * If you or your organisation is not a member of DTVKit then you have access
14  * to this source code outside of the terms of the licence agreement
15  * and you are expected to delete this and any associated files immediately.
16  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
17  *******************************************************************************/
25 /*---includes for this file--------------------------------------------------*/
26 #include <string.h>
27 #include "mh5support.h"
28 #include "mh5debug.h"
29 #include "mh5memory.h"
30 #include "mh5profile.h"
31 #include "mheg5_control.h"
32 #include "mg_fontapi.h"
33 #include "mg_osd.h"
34 
35 #include "mheg5_version.h"
36 #include "build.h"
37 
38 /*---constant definitions for this file--------------------------------------*/
39 #define FUNC_TYPE_NONE 0
40 #define FUNC_TYPE_ONEINT 1
41 #define FUNC_TYPE_TWOINT 2
42 #define FUNC_TYPE_THRINT 3
43 #define FUNC_TYPE_STRING 5
44 #define FUNC_TYPE_ERROR 0xff
45 
46 #define OPEN_BRACKET '('
47 #define CLOSE_BRACKET ')'
48 
49 #define ENGINE_STRING_TOTAL 4
50 
51 #define MAX_USER_AGENT 255
52 
53 #define FREESAT_MAX_FILE_LEN (256 * 1024)
54 #define UK_MAX_FILE_LEN 1024
55 #define AU_MAX_FILE_LEN (64 * 1024)
56 #define SA_MAX_FILE_LEN (512 * 1024)
57 
58 /*---local typedef structs for this file-------------------------------------*/
59 
60 typedef enum
61 {
62 #ifdef INCLUDE_CI_PLUS
63  PRF_NDX_CIPLUS,
64 #endif
69 #ifdef INCLUDE_SA_PROFILE
70  PRF_NDX_SA,
71 #endif
72 #ifdef INCLUDE_FREESAT
73  PRF_NDX_FS,
74 #endif
76 } E_PRFS;
77 
78 enum
79 {
84 };
85 
86 typedef struct s_EngineSupportTable
87 {
88  const char *short_name;
89  const char *long_name;
90  MHEG5Bool (*function)(void *);
93 
94 typedef struct
95 {
97  const char *c_data;
101 
102 typedef enum
103 {
111 
112 
113 static MHEG5Bool UniversalEngineProfile(void *str);
114 static MHEG5Bool HDExtension(void *p_val);
115 static MHEG5Bool PVRFunction(void *p_val);
116 static MHEG5Bool ICProfile(void *p_val);
117 static MHEG5Bool IPStreamingProfile(void *p_val);
118 static MHEG5Bool NonLinearPlaybackKeys(void *v);
119 static MHEG5Bool DownloadableFont(void *p_val);
120 static MHEG5Bool VideoScaling(void *p_val);
121 static MHEG5Bool BitmapScaling(void *p_val);
122 static MHEG5Bool BitmapFormat(void *p_val);
123 static MHEG5Bool VideoDecodeOffset(void *p_val);
124 static MHEG5Bool BitmapDecodeOffset(void *p_val);
125 static MHEG5Bool SceneCoordinateSystem(void *p_val);
126 static MHEG5Bool SceneAspectRatio(void *p_val);
127 static MHEG5Bool SubtitlesAndGraphics(void *v);
128 static MHEG5Bool MultipleVideoStreams(void *p_val);
129 static MHEG5Bool MultipleAudioStreams(void *p_val);
130 #ifdef INCLUDE_DEBUG_PACKAGE
131 static MHEG5Bool DebugPackageSupport(void *p_val);
132 #endif /* INCLUDE_DEBUG_PACKAGE */
133 #ifdef INCLUDE_CONNECTED_TV
134 static MHEG5Bool ConnectedTVExtension(void* p_val);
135 static MHEG5Bool ApplicationLaunchExtension(void* p_val);
136 #endif /* INCLUDE_CONNECTED_TV */
137 
138 static void AddProfileStringLen(S_PROFILE_STRING *profile_string,
139  MHEG5Int *length);
140 static void AppendProfileString(S_PROFILE_STRING *profile_string,
141  MHEG5Byte **pString);
142 
143 /*---local (static) variable declarations for this file----------------------*/
144 
145 static const S_EngineSupportTable support_table[] = {
146  { "UEP", "UniversalEngineProfile", UniversalEngineProfile, FUNC_TYPE_STRING },
147  { "HDE", "HDExtension", HDExtension, FUNC_TYPE_ONEINT },
148  { "HDG", "HDGraphics", HDExtension, FUNC_TYPE_ONEINT },
149  { "PVR", "PVR", PVRFunction, FUNC_TYPE_ONEINT },
150  { "ICP", "ICProfile", ICProfile, FUNC_TYPE_ONEINT },
151  { "IPS", "IPStreamingProfile", IPStreamingProfile, FUNC_TYPE_ONEINT },
152  { "NLK", "NonLinearPlaybackKeys", NonLinearPlaybackKeys, FUNC_TYPE_NONE },
153  { "DLF", "DownloadableFont", DownloadableFont, FUNC_TYPE_ONEINT },
154  { "VSc", "VideoScaling", VideoScaling, FUNC_TYPE_THRINT },
155  { "BSc", "BitmapScaling", BitmapScaling, FUNC_TYPE_THRINT },
156  { "BFo", "BitmapFormat", BitmapFormat, FUNC_TYPE_ONEINT },
157  { "VDO", "VideoDecodeOffset", VideoDecodeOffset, FUNC_TYPE_TWOINT },
158  { "BDO", "BitmapDecodeOffset", BitmapDecodeOffset, FUNC_TYPE_TWOINT },
159  { "SCS", "SceneCoordinateSystem", SceneCoordinateSystem, FUNC_TYPE_TWOINT },
160  { "SAR", "SceneAspectRatio", SceneAspectRatio, FUNC_TYPE_TWOINT },
161  { "SAG", "SubtitlesAndGraphics", SubtitlesAndGraphics, FUNC_TYPE_NONE },
162  { "Clo", "Cloning", NULL, FUNC_TYPE_NONE },
163  { "ASt", "ApplicationStacking", NULL, FUNC_TYPE_NONE },
164  { "OvV", "OverlappingVisibles", NULL, FUNC_TYPE_NONE },
165  { "MVS", "MultipleVideoStreams", MultipleVideoStreams, FUNC_TYPE_ONEINT },
166  { "MAS", "MultipleAudioStreams", MultipleAudioStreams, FUNC_TYPE_ONEINT },
167 #ifdef INCLUDE_DEBUG_PACKAGE
168  { "DPS", "DebugPackageSupport", DebugPackageSupport, FUNC_TYPE_NONE },
169 #endif
170 #ifdef INCLUDE_CONNECTED_TV
171  { "CTV", "ConnectedTVExtension", ConnectedTVExtension, FUNC_TYPE_ONEINT },
172  { "ApE", "ApplicationLaunchExtension", ApplicationLaunchExtension, FUNC_TYPE_STRING },
173 #endif /* INCLUDE_CONNECTED_TV */
174  { NULL, NULL, NULL, FUNC_TYPE_ERROR } /* End of list */
175 };
176 
177 /* The 'WhoAmI' strings for MHEG engine and DSM-CC */
178 static char mheg5EngineString[10] = "MHGDTV000";
179 static char dsmccEngineString[10] = "DSMDTV000";
180 static char manufacturerString[10] = "123456789";
181 /* The extra string (revision for internal testing) to add to 'WhoAmI' */
182 static const char *buildRevisionString = BUILD_REVISION;
183 
184 static S_PROFILE_STRING engine_strings[] = {
185  { 9, manufacturerString, TRUE, 0 },
186  { 9, mheg5EngineString, TRUE, 0 },
187  { 9, dsmccEngineString, TRUE, 0 },
188  { 0, NULL, TRUE, 0 }
189 };
190 
191 /* Holds the capabilities of the receiver, in terms of different supported
192  * scaling values and off-screen display. */
193 static E_MHEG5_CAPABILITES receiver_caps = VC_DEFAULT;
194 
195 static S_PROFILE_STRING profile_strings[PRF_TOTAL] = {
196 #ifdef INCLUDE_CI_PLUS
197  { 9, "CIPLUS001", TRUE, 0 },
198 #endif
199  { 4, "1285", FALSE, CPROFILE_UK }, /* UK v1.06 */
200  { 15, "INT002001000000", TRUE, CPROFILE_NZ }, /* New Zealand v1.03 */
201  { 15, "INTAUS001000000", TRUE, CPROFILE_AU }, /* Australia 1.0.0 */
202  { 15, "INT003001000000", TRUE, CPROFILE_HK }, /* Hong Kong 1.0.0 */
203 #ifdef INCLUDE_SA_PROFILE
204  { 14, "INTZA001000000", TRUE, CPROFILE_SA }, /* South Africa 2.1 */
205 #endif
206 #ifdef INCLUDE_FREESAT
207  { 4, "1285", FALSE, CPROFILE_FREESAT } /* Freesat */
208 #endif
209 };
210 
211 static E_ProfileId current_profile; // = PROFILE_BROADCAST;
212 static E_MHEG_PROFILE mheg_profile;
213 static MHEG5Int max_storage_file_len = UK_MAX_FILE_LEN;
214 static char user_agent[MAX_USER_AGENT];
215 
216 /***********************
217  * FUNCTION DEFINITIONS *
218  ************************/
219 
220 const char* MHEG5VersionString(void)
221 {
222  return MHEG5_VER_STRING;
223 }
224 
225 const char* MHEG5RevisionString(void)
226 {
227  return BUILD_REVISION;
228 }
229 
236 {
237  E_MhegErr result = MHERR_OK;
238 
239  U16BIT ndx;
240  U8BIT *pchr;
241  pchr = pConfig->manufacturerString;
242  if (pchr == NULL || *pchr == 0)
243  {
244  result = MHERR_BAD_PARAMETER;
245  }
246  else
247  {
248  for (ndx = 0; ndx != 10; ndx++)
249  {
250  if (pchr[ndx] == 0)
251  {
252  engine_strings[0].c_len = ndx;
253  break;
254  }
255  manufacturerString[ndx] = pchr[ndx];
256  }
257  for (; ndx != 10; ndx++)
258  {
259  manufacturerString[ndx] = 0;
260  }
261  receiver_caps = pConfig->capabilities;
262  }
263 
264 #ifndef INCLUDE_MHEG_PVR
265  if (receiver_caps & VC_SUPPORT_MHEG_PVR)
266  {
267  DPL1(("ERROR: PVR Extension not supported\n"));
269  }
270 #endif
271 #ifndef INCLUDE_PVR_AU
272  if (receiver_caps & VC_SUPPORT_MHEG_AU_PVR)
273  {
274  DPL1(("ERROR: PVR for Australia not supported\n"));
276  }
277 #endif
278 
279  mheg_profile = pConfig->countryProfile;
280 #ifndef INCLUDE_NZ_PROFILE
281  if (mheg_profile & CPROFILE_NZ)
282  {
283  DPL1(("ERROR: New Zealand profile not supported\n"));
284  mheg_profile &= ~CPROFILE_NZ;
285  if (pConfig->countryProfile != CPROFILE_ALL)
286  {
287  result = MHERR_UNSUPPORTED_PROFILE;
288  }
289  }
290 #endif
291 #ifndef INCLUDE_AU_PROFILE
292  if (mheg_profile & CPROFILE_AU)
293  {
294  DPL1(("ERROR: Australia profile not supported\n"));
295  mheg_profile &= ~CPROFILE_AU;
296  if (pConfig->countryProfile != CPROFILE_ALL)
297  {
298  result = MHERR_UNSUPPORTED_PROFILE;
299  }
300  }
301 #endif
302 #ifndef INCLUDE_SA_PROFILE
303  if (mheg_profile & CPROFILE_SA)
304  {
305  DPL1(("ERROR: South Africa profile not supported\n"));
306  mheg_profile &= ~CPROFILE_SA;
307  if (pConfig->countryProfile != CPROFILE_ALL)
308  {
309  result = MHERR_UNSUPPORTED_PROFILE;
310  }
311  }
312 #endif
313 
314 #ifdef INCLUDE_DSM_FG
315  if (mheg_profile & CPROFILE_SA)
316  {
317  if (pConfig->nvmSize < SA_NVM_MINIMUM_SIZE)
318  {
319  DPL1((" MHEG5 SA profile nvmSize 0x%x >= 0x%x ?\n", pConfig->nvmSize, SA_NVM_MINIMUM_SIZE));
320  result = MHERR_BAD_NVM_SIZE;
321  }
322  }
323  else if (mheg_profile & CPROFILE_AU)
324  {
325  if (pConfig->nvmSize < AU_NVM_MINIMUM_SIZE)
326  {
327  DPL1((" MHEG5 AU profile nvmSize 0x%x >= 0x%x ?\n", pConfig->nvmSize, AU_NVM_MINIMUM_SIZE));
328  result = MHERR_BAD_NVM_SIZE;
329  }
330  }
331 #endif
332  if (mheg_profile & CPROFILE_AU)
333  {
334  max_storage_file_len = AU_MAX_FILE_LEN;
335  }
336 #ifdef INCLUDE_FREESAT
337  if (mheg_profile & CPROFILE_FREESAT)
338  {
339  max_storage_file_len = FREESAT_MAX_FILE_LEN;
340  }
341 #endif
342  if (mheg_profile & CPROFILE_SA)
343  {
344  max_storage_file_len = SA_MAX_FILE_LEN;
345  }
346 
347 #ifndef INCLUDE_FREESAT
348  if (mheg_profile & CPROFILE_FREESAT)
349  {
350  DPL1(("ERROR: Freesat profile not supported\n"));
351  result = MHERR_UNSUPPORTED_PROFILE;
352  }
353 #else
354  /* Freesat is sensitive to specific WhoAmI */
355  engine_strings[REV_STRING].whoami = FALSE;
356 #endif
357 
358 #if (MHEG5_VER_MAJOR < 10)
359  mheg5EngineString[6] = '0' + MHEG5_VER_MAJOR;
360 #else
361  mheg5EngineString[6] = 'a' + MHEG5_VER_MAJOR - 0xa;
362 #endif
363 #if (MHEG5_VER_MINOR < 10)
364  mheg5EngineString[7] = '0' + MHEG5_VER_MINOR;
365 #else
366  mheg5EngineString[7] = 'a' + MHEG5_VER_MINOR - 0xa;
367 #endif
368 #if (MHEG5_VER_PATCH < 10)
369  mheg5EngineString[8] = '0' + MHEG5_VER_PATCH;
370 #else
371  mheg5EngineString[8] = 'a' + MHEG5_VER_PATCH - 0xa;
372 #endif
373 
374 #ifndef CI_PLUS_ONLY
375 
376 #if (DSMCC_VER_MAJOR < 10)
377  dsmccEngineString[6] = '0' + DSMCC_VER_MAJOR;
378 #else
379  dsmccEngineString[6] = 'a' + DSMCC_VER_MAJOR - 0xa;
380 #endif
381 #if (DSMCC_VER_MINOR < 10)
382  dsmccEngineString[7] = '0' + DSMCC_VER_MINOR;
383 #else
384  dsmccEngineString[7] = 'a' + DSMCC_VER_MINOR - 0xa;
385 #endif
386 #if (DSMCC_VER_PATCH < 10)
387  dsmccEngineString[8] = '0' + DSMCC_VER_PATCH;
388 #else
389  dsmccEngineString[8] = 'a' + DSMCC_VER_PATCH - 0xa;
390 #endif
391 
392 #endif /*CI_PLUS_ONLY*/
393 
394  /* find length of revision string */
395  engine_strings[REV_STRING].c_data = buildRevisionString;
396  engine_strings[REV_STRING].c_len = strlen(buildRevisionString);
397 
398  return result;
399 }
400 
406 {
407  return (U8BIT *)manufacturerString;
408 }
409 
415 {
416  return (U8BIT *)mheg5EngineString;
417 }
418 
424 {
425  if (receiver_caps & VC_SUPPORT_MHEG_INTERACTION_CHANNEL)
426  {
427  return MHEG5TRUE;
428  }
429  return MHEG5FALSE;
430 }
431 
437 {
439  {
440  return MHEG5TRUE;
441  }
442  return MHEG5FALSE;
443 }
444 
452 {
453  if (current_profile == PROFILE_BROADCAST &&
454  (mheg_profile & profile))
455  {
456  return MHEG5TRUE;
457  }
458  return MHEG5FALSE;
459 }
460 
466 {
467  return (MG_IsHdSupported()) ? MHEG5TRUE : MHEG5FALSE;
468 }
469 
475 {
476  return (!(receiver_caps & VC_HD_VIDEO_NOT_SUPPORTED)) ? MHEG5TRUE : MHEG5FALSE;
477 }
478 
484 {
485 #ifdef INCLUDE_NATIVE_APP
486  if (receiver_caps & VC_SUPPORT_MHEG_NATIVE_APP)
487  {
488  return MHEG5TRUE;
489  }
490 #endif
491  return MHEG5FALSE;
492 }
493 
499 {
500 #ifdef INCLUDE_MHEG_PVR
501  if (receiver_caps & VC_SUPPORT_MHEG_PVR)
502  {
503  return MHEG5TRUE;
504  }
505 #endif
506  return MHEG5FALSE;
507 }
508 
514 {
515 #ifdef INCLUDE_SI_EXTENSION
516  return MHEG5TRUE;
517 #else
518  return MHEG5FALSE;
519 #endif
520 }
521 
529 {
530  current_profile = profile;
531  if (profile == PROFILE_BROADCAST)
532  {
533  #ifdef INCLUDE_DLF
534  MG_SetMaxFonts( 5 );
535  #else
536  MG_SetMaxFonts( 1 );
537  #endif
538  }
539  else
540  {
541  /*CI Plus*/
542  MG_SetMaxFonts( 2 );
543  }
544 }
545 
552 {
553  return current_profile;
554 }
555 
561 {
562 #ifdef INCLUDE_DLF
563  return MHEG5TRUE;
564 #else
565  return MHEG5FALSE;
566 #endif
567 }
568 
575 {
576  return max_storage_file_len;
577 }
578 
585 {
586  const S_EngineSupportTable *table_item = support_table;
587  MHEG5Bool answer;
588  unsigned int values[3] = { 0, 0, 0 };
589  unsigned int *p_value;
590  int flen, ftype;
591 
592  assert( feature.len > 2 );
593  assert( feature.data != NULL );
594 
595  if (feature.data[3] == OPEN_BRACKET || feature.len == 3)
596  {
597  flen = 3;
598  while (table_item->short_name != NULL)
599  {
600  if (strncmp(table_item->short_name, (char *)feature.data, 3) == 0)
601  {
602  /* recognised short feature string */
603  break;
604  }
605  table_item++;
606  }
607  }
608  else
609  {
610  flen = 0;
611  while (flen != feature.len &&
612  feature.data[flen] != '\0' &&
613  feature.data[flen] != OPEN_BRACKET)
614  flen++;
615 
616  while (table_item->long_name != NULL)
617  {
618  if (strncmp(table_item->long_name, (char *)feature.data, flen) == 0)
619  {
620  /* recognised long feature string */
621  break;
622  }
623  table_item++;
624  }
625  }
626  switch (table_item->func_type)
627  {
628  case FUNC_TYPE_ERROR:
629  answer = MHEG5FALSE;
630  break;
631 
632  case FUNC_TYPE_NONE:
633  if (table_item->function != NULL)
634  answer = table_item->function( &feature );
635  else
636  answer = MHEG5TRUE;
637  break;
638 
639  case FUNC_TYPE_STRING:
640  if (feature.data[flen] != OPEN_BRACKET ||
641  feature.data[feature.len - 1] != CLOSE_BRACKET)
642  {
643  answer = MHEG5FALSE;
644  }
645  else
646  {
647  assert( table_item->function != NULL );
648  feature.data += flen + 1;
649  feature.len -= flen + 2;
650  answer = table_item->function( &feature );
651  }
652  break;
653 
654  default:
655  feature.len--;
656  ftype = table_item->func_type;
657  assert( ftype >= FUNC_TYPE_ONEINT && ftype <= FUNC_TYPE_THRINT );
658  if (feature.data[flen] != OPEN_BRACKET ||
659  feature.data[feature.len] != CLOSE_BRACKET ||
660  feature.len < flen + (ftype << 1))
661  {
662  answer = MHEG5FALSE;
663  }
664  else
665  {
666  assert( table_item->function != NULL );
667  p_value = values;
668  flen++; /*skip past open bracket*/
669  while (flen != feature.len)
670  {
671  if (feature.data[flen] >= '0' && feature.data[flen] <= '9')
672  {
673  *p_value = ((*p_value) * 10) + (feature.data[flen] - '0');
674  }
675  else if (feature.data[flen] == ',')
676  {
677  ftype--;
678  if (ftype == 0)
679  break; /*error*/
680  p_value++;
681  }
682  else
683  {
684  break;
685  }
686  flen++;
687  }
688  if (flen != feature.len || ftype != 1)
689  {
690  /* had wrong number of params */
691  answer = MHEG5FALSE;
692  }
693  else
694  {
695  assert( table_item->function != NULL );
696  answer = table_item->function( values );
697  }
698  }
699  break;
700  }
701  return answer;
702 }
703 
710 {
711  MHEG5String whoAmI;
712  MHEG5Byte *pstr;
713  unsigned int i;
714  size_t engine_strings_total;
715  size_t profile_strings_total;
716  #ifdef INCLUDE_CI_PLUS
717  MHEG5Boolean added[sizeof(profile_strings) / sizeof(*profile_strings)];
718  #endif
719 
720  engine_strings_total = sizeof(engine_strings) / sizeof(*engine_strings);
721  profile_strings_total = sizeof(profile_strings) / sizeof(*profile_strings);
722 
723  whoAmI.len = 0;
724  for (i = 0; i < engine_strings_total; i++)
725  {
726  AddProfileStringLen(&engine_strings[i], &whoAmI.len);
727  }
728 
729  /* Profile strings */
730  for (i = 0; i != profile_strings_total; i++)
731  {
732  if (profile_strings[i].type & mheg_profile)
733  {
734  AddProfileStringLen(&profile_strings[i], &whoAmI.len);
735  #ifdef INCLUDE_CI_PLUS
736  added[i] = MHEG5TRUE;
737  #endif
738  }
739  #ifdef INCLUDE_CI_PLUS
740  else
741  {
742  added[i] = MHEG5FALSE;
743  }
744  #endif
745  }
746 
747  #ifdef INCLUDE_CI_PLUS
748  /* CI+ profile is added if the engine supports it */
749  if (!added[PRF_NDX_CIPLUS])
750  {
751  AddProfileStringLen(&profile_strings[PRF_NDX_CIPLUS], &whoAmI.len);
752  }
753  #endif
754 
755  whoAmI.data = STR_DataAlloc( whoAmI.len );
756  if (whoAmI.data != NULL)
757  {
758  pstr = whoAmI.data;
759  for (i = 0; i < engine_strings_total; i++)
760  {
761  AppendProfileString(&engine_strings[i], &pstr);
762  }
763 
764  for (i = 0; i != profile_strings_total; i++)
765  {
766  if (profile_strings[i].type & mheg_profile)
767  {
768  AppendProfileString(&profile_strings[i], &pstr);
769  }
770  }
771 
772  #ifdef INCLUDE_CI_PLUS
773  if (!added[PRF_NDX_CIPLUS])
774  {
775  AppendProfileString(&profile_strings[PRF_NDX_CIPLUS], &pstr);
776  }
777  #endif
778 
779  --pstr;
780  *pstr = '\0';
781  }
782  return whoAmI;
783 }
784 
785 /*---local function definitions----------------------------------------------*/
786 
787 
788 
794 static MHEG5Bool UniversalEngineProfile(void *p_str)
795 {
796  MHEG5String *pFeature = (MHEG5String *)p_str;
797  MHEG5Bool answer = MHEG5FALSE;
798  int i;
799 
800  if (pFeature->len == 1 && *pFeature->data == '2')
801  {
802  answer = MHEG5TRUE;
803  }
804  else
805  {
806  for (i = 0; i != ENGINE_STRING_TOTAL; i++)
807  {
808  if (engine_strings[i].c_len == pFeature->len &&
809  memcmp(engine_strings[i].c_data, pFeature->data, pFeature->len) == 0)
810  {
811  answer = MHEG5TRUE;
812  break;
813  }
814  }
815  if (i == ENGINE_STRING_TOTAL)
816  {
817  #ifdef INCLUDE_CI_PLUS
818  if (profile_strings[PRF_NDX_CIPLUS].c_len == pFeature->len &&
819  memcmp(profile_strings[PRF_NDX_CIPLUS].c_data, pFeature->data, pFeature->len) == 0)
820  {
821  answer = MHEG5TRUE;
822  }
823  else
824  #endif
825  {
826  /* always respond with TRUE for UK string */
827  if (profile_strings[PRF_NDX_UK].c_len == pFeature->len &&
828  memcmp(profile_strings[PRF_NDX_UK].c_data, pFeature->data, pFeature->len) == 0)
829  {
830  answer = MHEG5TRUE;
831  }
832  else
833  {
834  for (i = PRF_NDX_UK+1; i != PRF_TOTAL; i++)
835  {
836  if ((profile_strings[i].type & mheg_profile) &&
837  profile_strings[i].c_len == pFeature->len &&
838  memcmp(profile_strings[i].c_data, pFeature->data, pFeature->len) == 0)
839  {
840  answer = MHEG5TRUE;
841  break;
842  }
843  }
844  }
845  }
846  }
847  }
848  return answer;
849 }
850 
856 static MHEG5Bool HDExtension(void *p_val)
857 {
858  MHEG5Bool capable = MHEG5FALSE;
859 
860  switch (*((unsigned int *)p_val))
861  {
862  case 1:
863  if (MG_IsHdSupported())
864  {
865  capable = MHEG5TRUE;
866  }
867  break;
868 
869  case 0:
870  if (!(receiver_caps & VC_HD_VIDEO_NOT_SUPPORTED))
871  {
872  capable = MHEG5TRUE;
873  }
874  default:;
875  }
876 
877  return capable;
878 }
879 
885 static MHEG5Bool PVRFunction(void *p_val)
886 {
887  MHEG5Bool capable = MHEG5FALSE;
888 
889  switch (*((unsigned int *)p_val))
890  {
891  case 1:
892  #ifdef INCLUDE_PVR_AU
893  if (receiver_caps & VC_SUPPORT_MHEG_AU_PVR)
894  {
895  capable = MHEG5TRUE;
896  }
897  #endif /*INCLUDE_PVR_AU*/
898  break;
899 
900  case 0:
901  #ifdef INCLUDE_MHEG_PVR
902  if (receiver_caps & VC_SUPPORT_MHEG_PVR)
903  {
904  capable = MHEG5TRUE;
905  }
906  #endif /*INCLUDE_MHEG_PVR*/
907  default:;
908  }
909  return capable;
910 }
911 
917 static MHEG5Bool ICProfile(void *p_val)
918 {
919  MHEG5Bool capable = MHEG5FALSE;
920 
921 #ifdef INCLUDE_IC
922  switch (*((unsigned int *)p_val))
923  {
924  case 1:
925  case 2:
926  case 3:
927  case 4:
928 #ifdef INCLUDE_ICS
929  if ((receiver_caps & VC_SUPPORT_MHEG_IC_STREAMING) &&
931  {
932  capable = MHEG5TRUE;
933  }
934 #endif /* INCLUDE_ICS */
935  break;
936  case 5:
937 #ifdef INCLUDE_ICS
938  if ((receiver_caps & VC_SUPPORT_MHEG_IC_STREAMING_HD) &&
940  {
941  capable = MHEG5TRUE;
942  }
943 #endif /* INCLUDE_ICS */
944  break;
945 
946  case 0:
947  if (receiver_caps & VC_SUPPORT_MHEG_INTERACTION_CHANNEL)
948  {
949  capable = MHEG5TRUE;
950  }
951  break;
952 
953  default:;
954  }
955 #endif /*INCLUDE_IC*/
956 
957  return capable;
958 }
959 
965 static MHEG5Bool IPStreamingProfile(void *p_val)
966 {
967  MHEG5Bool capable = MHEG5FALSE;
968 
969  switch (*((unsigned int *)p_val))
970  {
971  case 1:
972 #if defined(INCLUDE_IC) && defined(INCLUDE_ICS) && defined(INCLUDE_FREESAT)
973  if (receiver_caps & VC_SUPPORT_MHEG_IC_STREAMING)
974  {
975  capable = MHEG5TRUE;
976  }
977 #endif /* IC, ICS and FREESAT */
978  break;
979  default:;
980  }
981 
982  return capable;
983 }
984 
990 static MHEG5Bool NonLinearPlaybackKeys(void *v)
991 {
992  MHEG5Bool capable = MHEG5FALSE;
993 
994 #ifdef INCLUDE_ICS
995  if ((receiver_caps & VC_SUPPORT_MHEG_IC_STREAMING) &&
996  (receiver_caps & VC_SUPPORT_NON_LINEAR_PLAYBACK_KEYS))
997  {
998  capable = MHEG5TRUE;
999  }
1000 #endif /*INCLUDE_ICS*/
1001 
1002  return capable;
1003 }
1004 
1010 static MHEG5Bool DownloadableFont(void *p_val)
1011 {
1012  MHEG5Bool capable = MHEG5FALSE;
1013 
1014 #ifdef INCLUDE_DLF
1015  if (*((unsigned int *)p_val) == 10)
1016  {
1017  return MHEG5TRUE;
1018  }
1019 #endif
1020 
1021  return capable;
1022 }
1023 
1029 static MHEG5Bool CommonScaling(unsigned int *p_uint)
1030 {
1031  unsigned int scaleX, scaleY;
1032  MHEG5Bool capable = MHEG5TRUE;
1034  scaleX = *p_uint;
1035  p_uint++;
1036  scaleY = *p_uint;
1037  switch (scaleX)
1038  {
1039  case 360:
1040  switch (scaleY)
1041  {
1042  case 288:
1043  /* MHEG5_SCALE_CAPS_QUARTER */
1044  break;
1045  case 576:
1046  scaling = MHEG5_SCALE_CAPS_STANDARD;
1047  break;
1048  case 1152:
1049  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1050  break;
1051  default:
1052  capable = MHEG5FALSE;
1053  }
1054  break;
1055 #ifdef INCLUDE_FREESAT
1056  case 480:
1057  switch (scaleY)
1058  {
1059  case 288:
1060  /* MHEG5_SCALE_CAPS_QUARTER */
1061  break;
1062  case 576:
1063  scaling = MHEG5_SCALE_CAPS_STANDARD;
1064  break;
1065  case 1152:
1066  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1067  break;
1068  default:
1069  capable = MHEG5FALSE;
1070  }
1071  break;
1072 #endif
1073  case 540:
1074  switch (scaleY)
1075  {
1076  case 288:
1077  case 576:
1078  scaling = MHEG5_SCALE_CAPS_STANDARD;
1079  break;
1080  case 1152:
1081  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1082  break;
1083  default:
1084  capable = MHEG5FALSE;
1085  }
1086  break;
1087 #ifdef INCLUDE_FREESAT
1088  case 640:
1089  switch (scaleY)
1090  {
1091  case 288:
1092  case 576:
1093  scaling = MHEG5_SCALE_CAPS_STANDARD;
1094  break;
1095  case 1152:
1096  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1097  break;
1098  default:
1099  capable = MHEG5FALSE;
1100  }
1101  break;
1102 #endif
1103  case 720:
1104  switch (scaleY)
1105  {
1106  case 288:
1107  scaling = MHEG5_SCALE_CAPS_STANDARD;
1108  break;
1109  case 576:
1110  /* MHEG5_SCALE_CAPS_QUARTER */
1111  break;
1112  case 1152:
1113  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1114  break;
1115  default:
1116  capable = MHEG5FALSE;
1117  }
1118  break;
1119  case 960:
1120  switch (scaleY)
1121  {
1122  case 288:
1123  case 576:
1124  case 1152:
1125  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1126  break;
1127  default:
1128  capable = MHEG5FALSE;
1129  }
1130  break;
1131  case 1080:
1132  case 1440:
1133  switch (scaleY)
1134  {
1135  case 288:
1136  case 576:
1137  case 1152:
1138  scaling = MHEG5_SCALE_CAPS_DOUBLE;
1139  break;
1140  default:
1141  capable = MHEG5FALSE;
1142  }
1143  break;
1144  default:
1145  capable = MHEG5FALSE;
1146  }
1147 
1148  if (capable == MHEG5TRUE)
1149  {
1150  if ((receiver_caps & VC_ONLY_SD_QUARTER_SCALING) &&
1151  (scaling != MHEG5_SCALE_CAPS_QUARTER))
1152  {
1153  capable = MHEG5FALSE;
1154  }
1155  else if ((receiver_caps & VC_ONLY_SD_STANDARD_SCALING) &&
1156  (scaling != MHEG5_SCALE_CAPS_QUARTER) &&
1157  (scaling != MHEG5_SCALE_CAPS_STANDARD))
1158  {
1159  capable = MHEG5FALSE;
1160  }
1161  }
1162  return capable;
1163 }
1164 
1170 static MHEG5Bool VideoScaling(void *p_val)
1171 {
1172  MHEG5Bool capable = MHEG5FALSE;
1173  unsigned int *p_uint = (unsigned int *)p_val;
1174 
1175  switch (*p_uint)
1176  {
1177  #ifdef INCLUDE_ICS
1178  case CHOOK_STREAM_IC:
1179  #endif
1180  case CHOOK_STREAM_NORMAL:
1181  p_uint++;
1182  capable = CommonScaling( p_uint );
1183 
1184  default:;
1185  }
1186  return capable;
1187 }
1188 
1194 static MHEG5Bool BitmapScaling(void *p_val)
1195 {
1196  MHEG5Bool capable = MHEG5FALSE;
1197  unsigned int *p_uint = (unsigned int *)p_val;
1198 
1199  switch (*p_uint)
1200  {
1203  p_uint++;
1204  capable = CommonScaling( p_uint );
1205 
1206  default:;
1207  }
1208  return capable;
1209 }
1210 
1216 static MHEG5Bool BitmapFormat(void *p_val)
1217 {
1218  MHEG5Bool capable = MHEG5FALSE;
1219 
1220  switch (*((unsigned int *)p_val))
1221  {
1223  capable = MHEG5TRUE;
1224  break;
1225 
1226  case CHOOK_BITMAP_PNG:
1227  capable = MHEG5TRUE;
1228  break;
1229 
1230  case CHOOK_BITMAP_JPG:
1231  capable = MHEG5TRUE;
1232  break;
1233 
1235  if (!(receiver_caps & VC_HD_VIDEO_NOT_SUPPORTED))
1236  {
1237  capable = MHEG5TRUE;
1238  }
1239  break;
1240  #ifdef INCLUDE_FREESAT
1241  case CHOOK_BITMAP_IMAGE_PLANE_IFRAME:
1243  {
1244  capable = MHEG5TRUE;
1245  }
1246  #endif
1247  default:;
1248  }
1249  return capable;
1250 }
1251 
1257 static MHEG5Bool VideoDecodeOffset(void *p_val)
1258 {
1259  MHEG5Bool capable = MHEG5FALSE;
1260  unsigned int *p_uint = (unsigned int *)p_val;
1261 
1262  switch (*p_uint)
1263  {
1264  #ifdef INCLUDE_ICS
1265  case CHOOK_STREAM_IC:
1266  #endif
1267  case CHOOK_STREAM_NORMAL:
1268  p_uint++;
1269  if (*p_uint == 0 ||
1270  (*p_uint == 1 && !(receiver_caps & VC_NO_VIDEO_OFF_SCREEN)))
1271  {
1272  capable = MHEG5TRUE;
1273  }
1274 
1275  default:;
1276  }
1277  return capable;
1278 }
1279 
1285 static MHEG5Bool BitmapDecodeOffset(void *p_val)
1286 {
1287  MHEG5Bool capable = MHEG5FALSE;
1288  unsigned int *p_uint = (unsigned int *)p_val;
1289 
1290  switch (*p_uint)
1291  {
1292  #ifdef INCLUDE_FREESAT
1293  case CHOOK_BITMAP_IMAGE_PLANE_IFRAME:
1295  break;
1296  #endif
1297 
1300  p_uint++;
1301  if (*p_uint == 0 ||
1302  (*p_uint == 1 && !(receiver_caps & VC_NO_BITMAP_OFF_SCREEN)))
1303  {
1304  capable = MHEG5TRUE;
1305  }
1306 
1307  default:;
1308  }
1309  return capable;
1310 }
1311 
1317 static MHEG5Bool SceneCoordinateSystem(void *p_val)
1318 {
1319  unsigned int *p_uint = (unsigned int *)p_val;
1320  MHEG5Bool capable = MHEG5FALSE;
1321  if (*p_uint == 720)
1322  {
1323  p_uint++;
1324  if (*p_uint == 576)
1325  {
1326  capable = MHEG5TRUE;
1327  }
1328  }
1329  return capable;
1330 }
1331 
1337 static MHEG5Bool SceneAspectRatio(void *p_val)
1338 {
1339  unsigned int *p_uint = (unsigned int *)p_val;
1340  MHEG5Bool capable = MHEG5FALSE;
1341  switch (*p_uint)
1342  {
1343  case 4:
1344  p_uint++;
1345  if (*p_uint == 3)
1346  {
1347  capable = MHEG5TRUE;
1348  }
1349  break;
1350 
1351  case 16:
1352  p_uint++;
1353  if (*p_uint == 9)
1354  {
1355  capable = MHEG5TRUE;
1356  }
1357  break;
1358 
1359  default:;
1360  }
1361  return capable;
1362 }
1363 
1369 static MHEG5Bool SubtitlesAndGraphics(void *v)
1370 {
1371  /* Set to TRUE if the receiver can present DVB subtitles and non-MPEG
1372  * MHEG5 Visibles simultaneously, without restriction (see [1] 6.5.1.1) */
1373  if (receiver_caps & VC_SUBTITLES_NOT_SIMULTANEOUS)
1374  {
1375  return MHEG5FALSE;
1376  }
1377  return MHEG5TRUE;
1378 }
1379 
1385 static MHEG5Bool MultipleVideoStreams(void *p_val)
1386 {
1387  if (*((unsigned int *)p_val) <= 1)
1388  {
1389  return MHEG5TRUE;
1390  }
1391  return MHEG5FALSE;
1392 }
1393 
1399 static MHEG5Bool MultipleAudioStreams(void *p_val)
1400 {
1401  if (*((unsigned int *)p_val) <= 1)
1402  {
1403  return MHEG5TRUE;
1404  }
1405  return MHEG5FALSE;
1406 }
1407 
1408 #ifdef INCLUDE_DEBUG_PACKAGE
1409 
1416 static MHEG5Bool DebugPackageSupport(void *p_val)
1417 {
1418  return MHEG5TRUE;
1419 }
1420 
1421 #endif /* INCLUDE_DEBUG_PACKAGE */
1422 
1423 #ifdef INCLUDE_CONNECTED_TV
1424 /*******************************************************************************
1425 *@begin
1426 * NAME: ConnectedTVExtension
1427 * Determines whether the system supports CTV. This support string
1428 * is defined in D-Book 7 part B section B4.3.1.1.
1429 *
1430 * Returns : True if the system supports it, else False.
1431 *
1432 * Parameter Flow Description
1433 * ------------------------------------------------------------------------------
1434 * p_val IN Pointer to value: 0
1435 *
1436 * Additional information:
1437 *
1438 *@end
1439 *******************************************************************************/
1440 static MHEG5Bool ConnectedTVExtension(void* p_val)
1441 {
1442  if( *((unsigned int*)p_val) == 0)
1443  {
1444  if (receiver_caps & VC_SUPPORT_OIPF_BROWSER_PROFILE)
1445  {
1446  return MHEG5TRUE;
1447  }
1448  }
1449  return MHEG5FALSE;
1450 }
1451 
1452 /*******************************************************************************
1453 *@begin
1454 * NAME: ApplicationLaunchExtension
1455 * Determines whether the system supports CTV. This support string
1456 * is defined in D-Book 7 part B section B4.3.1.1.
1457 *
1458 * Returns : True if the system supports it, else False.
1459 *
1460 * Parameter Flow Description
1461 * ------------------------------------------------------------------------------
1462 * p_val IN Pointer to string value
1463 *
1464 * Additional information:
1465 *
1466 *@end
1467 *******************************************************************************/
1468 static MHEG5Bool ApplicationLaunchExtension(void* p_str)
1469 {
1470  MHEG5String *pFeature = (MHEG5String *)p_str;
1471  MHEG5Bool answer;
1472  U8BIT buffer[128];
1473  BOOLEAN supported;
1474 
1475  if (pFeature->len == 1 && *pFeature->data == '0')
1476  {
1477  /* Shall return "true" for N=0 if the receiver supports
1478  * ApplicationLaunchExtension.
1479  */
1480  answer = MHEG5TRUE;
1481  }
1482 
1483  else if (pFeature->len == 2 && memcmp(pFeature->data, "-1", 2) == 0)
1484  {
1485  /* Shall return “true” for N=-1 if the receiver supports
1486  * ApplicationLaunch () from ApplicationLaunchExtension.
1487  */
1488  answer = MHEG5TRUE;
1489  }
1490  else
1491  {
1492  /* Check if the receiver supports launching applications whose
1493  * MIME type=N.
1494  */
1495  memcpy(buffer, pFeature->data, pFeature->len);
1496  buffer[pFeature->len] = 0;
1497  DVB_MhegGetMimeTypeSupport(buffer, &supported);
1498  if (supported)
1499  {
1500  answer = MHEG5TRUE;
1501  }
1502  }
1503  return answer;
1504 }
1505 #endif /* INCLUDE_CONNECTED_TV */
1506 
1507 
1508 
1515 static void AddProfileStringLen(S_PROFILE_STRING *profile_string,
1516  MHEG5Int *length)
1517 {
1518  if (profile_string->c_len > 0 && profile_string->whoami)
1519  {
1520  if (*length > 0)
1521  {
1522  /* Space */
1523  (*length)++;
1524  }
1525 
1526  *length += profile_string->c_len;
1527  }
1528 }
1529 
1536 static void AppendProfileString(S_PROFILE_STRING *profile_string,
1537  MHEG5Byte **pString)
1538 {
1539  if (profile_string->c_len > 0 && profile_string->whoami)
1540  {
1541  memcpy(*pString, profile_string->c_data, profile_string->c_len);
1542  (*pString) += profile_string->c_len;
1543  *(*pString) = ' ';
1544  (*pString)++;
1545  }
1546 }
1547 
1553 {
1554  static char *uk_mheg = "UK-MHEG/1285";
1555  static BOOLEAN first = TRUE;
1556  U8BIT *manufacturer;
1557  U8BIT *mheg5_engine;
1558  int offset;
1559 
1560  if (first)
1561  {
1562  strcpy(user_agent, uk_mheg);
1563  offset = strlen(uk_mheg);
1564 
1565  user_agent[offset] = ' ';
1566  ++offset;
1567 
1568  manufacturer = MH5_GetManufacturerString();
1569  memcpy(user_agent + offset, manufacturer, 6);
1570  offset += 6;
1571  user_agent[offset] = '/';
1572  offset += 1;
1573  memcpy(user_agent + offset, manufacturer + 6, 3);
1574  offset += 3;
1575 
1576  user_agent[offset] = ' ';
1577  ++offset;
1578 
1579  mheg5_engine = MH5_GetEngineVersionString();
1580  memcpy(user_agent + offset, mheg5_engine, 6);
1581  offset += 6;
1582  user_agent[offset] = '/';
1583  offset += 1;
1584  memcpy(user_agent + offset, mheg5_engine + 6, 3);
1585  offset += 3;
1586 
1587  user_agent[offset] = '\0';
1588  }
1589 
1590  return (U8BIT *)user_agent;
1591 }
1592 
#define FREESAT_MAX_FILE_LEN
Definition: mh5support.c:53
MHEG5Bool MH5_SupportInteractionChannel(void)
Return whether Interaction channel is supported by current profile.
Definition: mh5support.c:423
#define FUNC_TYPE_TWOINT
Definition: mh5support.c:41
MHEG5Bool MH5_SupportServiceInfoExtension(void)
Return whether Service Info extension is supported.
Definition: mh5support.c:513
MHEG5Bool MH5_SupportNativeApplication(void)
Return whether Native Application extension is supported.
Definition: mh5support.c:483
U8BIT * manufacturerString
#define ENGINE_STRING_TOTAL
Definition: mh5support.c:49
MHEG5Bool MH5_SupportFontClass(void)
Return whether font class is supported by current profile.
Definition: mh5support.c:560
#define FUNC_TYPE_STRING
Definition: mh5support.c:43
MHEG5Int MH5_MaxStorageFileLength(void)
Return maximum length of file for persistent storage depending on supported profiles (e...
Definition: mh5support.c:574
E_MhegErr MH5_SupportInitialise(S_MhegConfig *pConfig)
Initialise support module - called when &#39;Open&#39; engine.
Definition: mh5support.c:235
MHEG5Bool MH5_SupportHDVideo(void)
Returns whether supporting HD Video extension.
Definition: mh5support.c:474
E_MhegErr DVB_MhegGetMimeTypeSupport(U8BIT *mimeType, BOOLEAN *supported)
Checks whether the receiver supports launching applications whose MIME type is the value given by thi...
#define CHOOK_STREAM_NORMAL
Definition: mh5profile.h:107
#define BUILD_REVISION
Definition: build.h:1
unsigned char * STR_DataAlloc(unsigned int size)
Definition: glue_memory.c:596
E_COUNTRY_PROFILE type
Definition: mh5support.c:99
#define CHOOK_BITMAP_NORMAL_IFRAME
Definition: mh5profile.h:94
const char * long_name
Definition: mh5support.c:89
E_ScalingCapabilities
Definition: mh5support.c:102
E_COUNTRY_PROFILE countryProfile
E_MhegErr
Definition: mherrors.h:28
#define MHEG5_VER_MINOR
Definition: mheg5_version.h:3
void MG_SetMaxFonts(U16BIT max)
Set Max allowable fonts for profile.
Definition: mg_font.c:164
#define MHEG5_VER_MAJOR
Definition: mheg5_version.h:2
E_PRFS
Definition: mh5support.c:60
uint8_t U8BIT
Definition: techtype.h:82
const char * short_name
Definition: mh5support.c:88
#define CHOOK_BITMAP_JPG
Definition: mh5profile.h:99
long MHEG5Int
Definition: mh5base.h:73
#define CHOOK_BITMAP_H264_IFRAME
Definition: mh5profile.h:100
const char * MHEG5RevisionString(void)
Definition: mh5support.c:225
#define FUNC_TYPE_ONEINT
Definition: mh5support.c:40
BOOLEAN whoami
Definition: mh5support.c:98
This file provides the control interface for MHEG5 engine. The use of this component MUST comply with...
MHEG5Bool MH5_SupportMhegProfile(E_MHEG_PROFILE profile)
Return whether Mheg profile (UK, NZ, AU, HK, SA, FREESAT) is currently supported. ...
Definition: mh5support.c:451
This file defines the profile for the MHEG engine.
#define MHEG5_VER_STRING
Definition: mheg5_version.h:5
#define MAX_USER_AGENT
Definition: mh5support.c:51
U8BIT * MH5_GetUserAgent(void)
Return the "User Agent" string for the engine.
Definition: mh5support.c:1552
MHEG5Bool MH5_SupportPVRExtension(void)
Return whether PVR extension (ETSI, and originally NZ) is supported.
Definition: mh5support.c:498
U8BIT * MH5_GetManufacturerString(void)
Returns a pointer to a manufacturer specific platform U8BIT*.
Definition: mh5support.c:405
short MHEG5Bool
Definition: mh5base.h:71
unsigned char MHEG5Byte
Definition: mh5base.h:74
Interface to OSD.
MHEG5Bool MH5_GetEngineSupport(MHEG5String feature)
Used by the GetEngineSupport action.
Definition: mh5support.c:584
#define DPL1(x)
Definition: glue_debug.h:191
void MH5_SetCurrentProfile(E_ProfileId profile)
Set current profile - CI plus or broadcast (Could extend this fnc to distuinguish between UK/HK/NZ/AU...
Definition: mh5support.c:528
MHEG5Byte * data
Definition: mh5base.h:85
enum E_COUNTRY_PROFILE E_MHEG_PROFILE
#define FUNC_TYPE_THRINT
Definition: mh5support.c:42
MHEG5Bool(* function)(void *)
Definition: mh5support.c:90
#define MHEG5TRUE
Definition: mh5base.h:49
uint16_t U16BIT
Definition: techtype.h:84
E_COUNTRY_PROFILE
Definition: mheg5_control.h:86
Mheg5 logging and debug printing.
#define MHEG5_VER_PATCH
Definition: mheg5_version.h:4
#define FUNC_TYPE_NONE
Definition: mh5support.c:39
E_MHEG5_CAPABILITES capabilities
#define CLOSE_BRACKET
Definition: mh5support.c:47
Font file handling with the Freetype.
U8BIT * MH5_GetEngineVersionString(void)
Returns a pointer to the engine version string U8BIT*.
Definition: mh5support.c:414
MHEG5Bool MHEG5Boolean
Definition: mh5base.h:145
E_ProfileId
Definition: mh5support.h:38
MHEG5String MH5_WhoAmI(void)
Used by the WhoAmI resident program to obtain WhoAmI string. See UK1.06 profile section 3...
Definition: mh5support.c:709
redirection include
struct s_EngineSupportTable S_EngineSupportTable
MHEG5Bool MH5_SupportHDGraphics(void)
Returns whether supporting HD Graphics extension.
Definition: mh5support.c:465
#define AU_MAX_FILE_LEN
Definition: mh5support.c:55
Definition: mg_png.c:52
const char * c_data
Definition: mh5support.c:97
MHEG5Bool MH5_SupportICStreaming(void)
Return whether Interaction channel Streaming is supported.
Definition: mh5support.c:436
#define FALSE
Definition: techtype.h:68
const char * MHEG5VersionString(void)
Definition: mh5support.c:220
#define SA_MAX_FILE_LEN
Definition: mh5support.c:56
MHEG5Int len
Definition: mh5base.h:84
U8BIT BOOLEAN
Definition: techtype.h:99
#define TRUE
Definition: techtype.h:69
#define OPEN_BRACKET
Definition: mh5support.c:46
E_MHEG5_CAPABILITES
#define FUNC_TYPE_ERROR
Definition: mh5support.c:44
BOOLEAN MG_IsHdSupported(void)
Definition: mg_osd.c:171
#define CHOOK_BITMAP_PNG
Definition: mh5profile.h:95
#define UK_MAX_FILE_LEN
Definition: mh5support.c:54
E_ProfileId MH5_GetCurrentProfile(void)
Get current profile - CI plus or broadcast.
Definition: mh5support.c:551
#define AU_NVM_MINIMUM_SIZE
Definition: mheg5_control.h:71
#define CHOOK_STREAM_IC
Definition: mh5profile.h:111
#define MHEG5FALSE
Definition: mh5base.h:48
uint32_t U32BIT
Definition: techtype.h:86
#define SA_NVM_MINIMUM_SIZE
Definition: mheg5_control.h:72
Engine support utility functions for MHEG5.