34 #if defined(INCLUDE_IC) 53 #define MAIN_STACK_SIZE 0x2000 55 #define PRG_DONE_NONE 0 56 #define PRG_DONE_INIT 1 57 #define PRG_DONE_GRAPHICS 2 58 #define PRG_DONE_MEMORY 3 59 #define PRG_DONE_SYNCS 4 60 #define PRG_DONE_QUEUE 5 61 #define PRG_DONE_DSMCC 6 62 #define PRG_DONE_MAIN 7 63 #define PRG_DONE_TIMERS 8 64 #define PRG_DONE_HTTP 9 65 #define PRG_DONE_MHEG5 10 71 #define MAX_PP_FUNCS 4 78 F_PostProcess pp_func;
93 static S32BIT default_service_index = 0;
97 static void *task_handle;
99 static void *stop_sema = 0;
101 static void *pause_sema = 0;
103 static void *api_mutex = 0;
105 static BOOLEAN active_state = TRUE;
106 static E_ApiStatus running_state = VS_STOPPED;
107 static E_ApiStatus started_state = VS_STOPPED;
108 static BOOLEAN restore_active = FALSE;
110 static F_MainProcess main_proc_func;
111 static S_PP_LIST post_processes[MAX_PP_FUNCS];
112 static BOOLEAN ciplus_request_ndt = FALSE;
120 static void DummyMainFunc(
void)
124 static BOOLEAN DummyPostFunc(
void)
135 static void MHEG5Main(
void *pArgs)
146 else if (event_msg.proc_msg_func == NULL)
154 event_msg.proc_msg_func( &(event_msg.data));
156 for (i = 0; i != MAX_PP_FUNCS; i++)
158 if (post_processes[i].pp_func != DummyPostFunc)
164 while (post_processes[i].pp_func());
165 post_processes[i].pp_func = DummyPostFunc;
171 TRACE(TERROR, (
" **** EXIT **** %d ", running_state));
172 if (running_state == VS_RUNNING)
174 event_msg.data.stop.action = STOP_ACTION_CLEAR_DSMCC;
175 stopEngine( &event_msg.data.stop );
184 static E_MhegErr CreateSyncs(
void)
186 BOOLEAN result = MHERR_OK;
189 if (api_mutex == NULL)
191 result = MHERR_SYSTEM_RESOURCE_MUTEX;
196 if (stop_sema == NULL)
198 result = MHERR_SYSTEM_RESOURCE_SEMAPHORE;
203 if (pause_sema == NULL)
205 result = MHERR_SYSTEM_RESOURCE_SEMAPHORE;
219 static void DestroySyncs(
void)
241 BOOLEAN MH5GlueIsStarted(
void)
245 result = (started_state == VS_RUNNING) ? TRUE : FALSE;
250 void MH5GlueDoneRebootMessage(
void)
253 if (started_state == VS_REBOOT)
256 started_state = VS_RUNNING;
261 void MH5GlueSetMainPostFunc( F_MainProcess func )
266 main_proc_func = DummyMainFunc;
270 main_proc_func = func;
275 void MH5GlueAddPostProcessFunc( F_PostProcess func )
279 for (i = 0; i != MAX_PP_FUNCS; i++)
281 if (post_processes[i].pp_func == func)
284 if (i == MAX_PP_FUNCS)
286 for (i = 1; i != MAX_PP_FUNCS; i++)
288 if (post_processes[i].pp_func == DummyPostFunc)
290 post_processes[i].pp_func = func;
298 static void ResetPostFuncs(
void )
302 for (i = 0; i != MAX_PP_FUNCS; i++)
304 post_processes[i].pp_func = DummyPostFunc;
314 static E_MhegErr MHEG5Exit(
void )
321 MH5GlueSetMainPostFunc(NULL);
322 TRACE(TSTATE, (
"************** EXIT! *************"));
324 msg.proc_msg_func = NULL;
325 msg.data_type = DT_NONE;
328 if (result == MHERR_OK)
364 U32BIT progress = PRG_DONE_NONE;
376 DPL1((
"ERROR: Open - Setup NULL\n"));
377 result = MHERR_BAD_PARAMETER;
379 else if (strcmp(pSetup->version_string, MHEG5VersionString()))
381 DPL1((
"ERROR: Open - Version Mismatch: \"%s\" == \"%s\"?\n",pSetup->version_string, MHEG5VersionString()));
382 result = MHERR_VERSION_MISMATCH;
384 else if (task_handle)
386 result = MHERR_COMP_ALREADY_OPEN;
388 else if (pSetup->taskPriority < MHEG5_MIN_TASK_PRIORITY)
390 DPL1((
"Is taskPriority 0x%x >= 0x%x ?\n", pSetup->taskPriority, MHEG5_MIN_TASK_PRIORITY));
391 result = MHERR_BAD_TASK_PRIORITY;
398 main_proc_func = DummyMainFunc;
402 if (result == MHERR_OK)
405 progress = PRG_DONE_INIT;
408 pSetup->screenHeight,
409 pSetup->colourDepth );
411 if (result == MHERR_OK)
414 progress = PRG_DONE_GRAPHICS;
416 if (!MH5GlueMemoryInitialise())
418 result = MHERR_ALLOCATING_MEMORY_REGION;
422 progress = PRG_DONE_MEMORY;
423 result = CreateSyncs();
424 if (result == MHERR_OK)
426 progress = PRG_DONE_SYNCS;
428 if (result == MHERR_OK)
430 progress = PRG_DONE_QUEUE;
432 result = MH5GlueDsmccOpen( pSetup->taskPriority );
438 if (result == MHERR_OK)
441 progress = PRG_DONE_DSMCC;
444 (U8BIT)pSetup->taskPriority, (U8BIT *)
"MH5GlueMain");
445 if (task_handle == NULL)
447 TRACE(TERROR, (
"Failed To Create Task"));
448 result = MHERR_SYSTEM_RESOURCE_TASK;
452 progress = PRG_DONE_MAIN;
455 if (result == MHERR_OK)
457 progress = PRG_DONE_TIMERS;
458 #if defined(INCLUDE_IC) 459 if (
httpOpen(pSetup->taskPriority) != HTTP_OK)
461 TRACE(TERROR, (
"Failed httpOpen"));
462 result = MHERR_COMP_NOT_OPEN;
468 if (result == MHERR_OK)
471 progress = PRG_DONE_HTTP;
473 if (result == MHERR_OK)
475 progress = PRG_DONE_MHEG5;
478 result =
MHEG5StreamerOpen(pSetup->streamerBuffer, pSetup->streamerBufferSize, pSetup->taskPriority);
483 if (result == MHERR_OK)
489 if (result != MHERR_OK && result != MHERR_COMP_ALREADY_OPEN)
491 TRACE(TSTATE,(
"progress=%d",progress))
498 #if defined(INCLUDE_IC) 502 case PRG_DONE_TIMERS:
519 case PRG_DONE_MEMORY:
520 MH5GlueMemoryTerminate();
522 case PRG_DONE_GRAPHICS:
529 TRACE(TSTATE,(
"result=%d",result))
546 if (task_handle == NULL)
548 result = MHERR_COMP_NOT_OPEN;
561 #if defined(INCLUDE_IC) 567 result = MHEG5Exit();
579 MH5GlueMemoryTerminate();
608 TRACE(TERROR, (
"si=%x", params->serviceIndex))
612 TRACE(TSTATE, (
"starting sid=0x%x", locator.service_id))
614 if ( !ciplus_request_ndt &&
615 (locator.transport_stream_id != default_service.transport_stream_id ||
616 locator.original_network_id != default_service.original_network_id))
622 ciplus_request_ndt = FALSE;
625 carouselId = MHEG5tuneProcess(&locator, params->serviceIndex);
626 if (MH5GlueDsmccStart(&locator, carouselId, clear) == MHERR_OK)
628 TRACE(TSTATE, (
"Started service 0x%x (%d)", locator.service_id, locator.service_id))
631 TRACE(TSTATE, (
"DSM-CC not build in"))
634 default_service = locator;
635 default_service_index = params->serviceIndex;
659 E_MhegErr
MHEG5_Start( S32BIT serviceIndex, E_ChannelStartMode *quietMode )
663 E_ApiStatus prev_state;
664 if (task_handle == NULL)
666 TRACE(TERROR, (
"MHEG5 Not Open"));
667 err = MHERR_COMP_NOT_OPEN;
672 if (started_state == VS_RUNNING)
674 TRACE(TERROR, (
"MHEG5 already Started"));
675 err = MHERR_COMP_ALREADY_STARTED;
679 prev_state = started_state;
680 started_state = VS_RUNNING;
687 if (quietMode != NULL)
692 TRACE(TSTATE, (
"serviceIndex=%x", serviceIndex))
694 event_msg.data_type = DT_VALUE;
695 event_msg.data.start.serviceIndex = serviceIndex;
696 err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
700 started_state = prev_state;
702 TRACE(TERROR, (
"VQ_PutMsg Failed"));
718 U8BIT action = params->action;
721 TRACE(TSTATE, (
"action=%d", action));
722 action = MHEG5HandleEngineStopAction( action );
723 if (action == STOP_ACTION_MHEG_TUNE)
725 running_state = VS_TUNING;
729 running_state = VS_STOPPED;
731 if (action == STOP_ACTION_CI_PLUS_NDT)
733 ciplus_request_ndt = TRUE;
737 MH5GlueDsmccStop( action );
740 TRACE(TSTATE, (
"Last serv_id=0x%x,net_id=0x%x", default_service.service_id, default_service.original_network_id))
749 default_service.service_id = 0;
752 TRACE(TSTATE, (
"done"));
768 E_ApiStatus prev_state;
771 if (task_handle == NULL)
773 TRACE(TERROR, (
"MHEG5 Not Open"));
774 cqu_err = MHERR_COMP_NOT_OPEN;
779 prev_state = started_state;
780 if (started_state == VS_STOPPED)
782 TRACE(TERROR, (
"MHEG5 Not Started"));
783 cqu_err = MHERR_COMP_NOT_STARTED;
787 started_state = VS_STOPPED;
791 if (cqu_err == MHERR_OK)
794 event_msg.data_type = DT_VALUE;
795 event_msg.data.stop.action = STOP_ACTION_CLEAR_DSMCC;
796 cqu_err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
797 if (cqu_err != MHERR_OK)
800 started_state = prev_state;
802 TRACE(TERROR, (
"VQ_PutMsg Failed"));
808 TRACE(TSTATE, (
" vgr done"));
829 E_ApiStatus prev_state;
832 if (task_handle == NULL)
834 TRACE(TERROR, (
"MHEG5 Not Open"));
835 cqu_err = MHERR_COMP_NOT_OPEN;
840 prev_state = started_state;
841 if (started_state == VS_STOPPED)
843 cqu_err = MHERR_COMP_NOT_STARTED;
847 started_state = VS_STOPPED;
851 if (cqu_err == MHERR_OK)
854 event_msg.data_type = DT_VALUE;
855 event_msg.data.stop.action = STOP_ACTION_CI_PLUS_NDT;
856 cqu_err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
857 if (cqu_err != MHERR_OK)
860 started_state = prev_state;
862 TRACE(TERROR, (
"VQ_PutMsg Failed"));
868 TRACE(TSTATE, (
" vgr done"));
891 E_ApiStatus prev_state;
894 if (task_handle == NULL)
896 TRACE(TERROR, (
"MHEG5 Not Open"));
897 cqu_err = MHERR_COMP_NOT_OPEN;
902 prev_state = started_state;
903 switch (started_state)
906 cqu_err = MHERR_REQUEST_IGNORED;
911 started_state = VS_TUNING;
916 cqu_err = MHERR_COMP_NOT_STARTED;
919 if (cqu_err == MHERR_OK)
922 event_msg.data_type = DT_VALUE;
923 event_msg.data.stop.action = STOP_ACTION_MHEG_TUNE;
924 cqu_err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
925 if (cqu_err != MHERR_OK)
928 started_state = prev_state;
930 TRACE(TERROR, (
"VQ_PutMsg Failed"));
936 TRACE(TSTATE, (
" vgr done"));
961 if (started_state == VS_RUNNING)
963 started_state = VS_REBOOT;
968 cqu_err = MHERR_COMP_NOT_STARTED;
969 TRACE(TERROR, (
"Not Started"));
972 if (cqu_err == MHERR_OK)
974 event_msg.proc_msg_func = MHEG5StartReboot;
975 event_msg.data_type = DT_NONE;
976 cqu_err =
VQ_PutMsg(&event_msg, PRTY_HIGH);
977 if (cqu_err != MHERR_OK)
979 TRACE(TERROR, (
"VQ_PutMsg Failed"));
983 TRACE(TMHBOOT, (
"Starting reboot"));
993 BOOLEAN MH5GlueActiveState(
void)
999 static void Pause(
void *params )
1002 TRACE(TSTATE, (
"state=%d", active_state))
1009 active_state = FALSE;
1015 static void Resume(
void *params )
1018 TRACE(TSTATE, (
"state=%d", active_state))
1025 active_state = TRUE;
1040 if (task_handle == NULL)
1042 TRACE(TERROR, (
"MHEG5 Not Open"));
1043 cqu_err = MHERR_COMP_NOT_OPEN;
1047 event_msg.proc_msg_func = Pause;
1048 event_msg.data_type = DT_NONE;
1049 cqu_err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
1050 if (cqu_err != MHERR_OK)
1052 TRACE(TERROR, (
"VQ_PutMsg Failed"));
1058 TRACE(TSTATE | TMHAPI, (
"done"))
1076 if (task_handle == NULL)
1078 TRACE(TERROR, (
"MHEG5 Not Open"));
1079 cqu_err = MHERR_COMP_NOT_OPEN;
1083 event_msg.proc_msg_func = Resume;
1084 event_msg.data_type = DT_NONE;
1085 cqu_err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
1086 if (cqu_err != MHERR_OK)
1088 TRACE(TERROR, (
"VQ_PutMsg Failed"));
1092 TRACE(TSTATE | TMHAPI, (
"..."))
1103 *(params->pResult) = MHEG5ResetResolution( params->screenWidth, params->screenHeight );
1122 TRACE(TMHAPI, (
"( %d, %d, %d )", screenWidth, screenHeight))
1124 if (task_handle == NULL)
1126 TRACE(TERROR, (
"MHEG5 Not Open"));
1127 err = MHERR_COMP_NOT_OPEN;
1129 else if (screenWidth < 720 || screenHeight < 576)
1131 TRACE(TERROR, (
"Bad Resolution (%d,%d)",screenWidth,screenHeight));
1132 err = MHERR_BAD_PARAMETER;
1136 restore_active = active_state;
1139 event_msg.data_type = DT_VALUE;
1140 event_msg.data.
resetRes.screenWidth = screenWidth;
1141 event_msg.data.
resetRes.screenHeight = screenHeight;
1142 event_msg.data.
resetRes.pResult = &err;
1143 err =
VQ_PutMsg(&event_msg, PRTY_CRITICAL);
1144 if (err == MHERR_OK)
1188 *dvb_locator = default_service;
1191 U16BIT MHEG5DefaultServiceId(
void)
1193 return default_service.service_id;
1196 S32BIT MHEG5GetCurrentServiceIndex(
void)
1198 return default_service_index;
void STB_OSSemaphoreWait(void *semaphore)
Wait on Semaphore Indefinity or Until Released.
Implement MHEG5 engine control functions (i.e. start/stop etc)
E_MhegErr VQ_PutMsg(S_MhegMessage *pMsg, E_PRIORITY priority)
Post event or section message on queue. Copies data into queue.
E_MhegErr MHEG5_Close(void)
Free allocated memory region, and any other related resources. This is a synchronous blocking functio...
Interface functions to DSM-CC instance for MHEG5.
Manages the interface between MHEG5 Engine and the HTTP component.
E_MhegErr MHEG5_NotifyDvbEvent(E_DvbEvent eType, U32BIT eData)
Notifies MHEG5 of event from receiver platform This is a non-blocking function.
void STB_OSTaskDelay(U16BIT timeout)
Delay Task for Specifed Time Period.
void STB_OSDeleteMutex(void *mutex)
Delete a mutex.
E_MhegErr MHEG5_Stop(void)
Tells MHEG5 engine to enter stop state (i.e. no broadcast service). This function should kill any cur...
E_MhegErr VT_TimersExit(void)
Uninitialise the timer component - all resources are freed. Other timer functions must not be called ...
E_MhegErr MHEG5_SetScreenResolution(U16BIT screenWidth, U16BIT screenHeight)
Reset OSD resolution for MHEG-5 engine.
E_MhegErr DVB_MhegIndexToDvbLocator(S32BIT serviceIndex, S_DvbLocator *location)
Convert "service index" into DVB locator information. This being original network ID...
E_HttpErr httpOpen(U32BIT task_priority)
Open the HTTP interface.
E_MhegErr MHEG5_StopWithoutKilling(void)
Suspend MHEG5 engine (while there is no valid broadcast service). This function should be called as a...
E_MhegErr MHEG5_Suspend(void)
Suspend MHEG5 engine (while there is no valid broadcast service). When the external application is pe...
void MHEG5StreamerSetActiveState(BOOLEAN activeState)
Set the active state of the streamer. When it is not active, it is allowed to buffer data but not to ...
void(* F_MSG_PROCESS)(void *data)
Function to Process voyager message.
E_MhegErr MHEG5_Resume(void)
Resume MHEG-5 engine.
E_MhegErr MHEG5_Start(S32BIT serviceIndex, E_ChannelStartMode *quietMode)
This function starts MHEG5 engine on the current broadcast service. It will cause MHEG5 engine to sta...
void MHEG5_Terminate(void)
Terminate MHEG5 component.
void VQ_Close(void)
Close component control and section queue component. Destroys all allocated memory and resources for ...
DVB Service information functions are required by MHEG5 engine. All required functions should be non-...
void STB_OSMutexUnlock(void *mutex)
Unlock a mutex (a.k.a. 'leave', 'signal' or 'release')
This file provides the control interface for MHEG5 engine. The use of this component MUST comply with...
void * STB_OSCreateSemaphore(void)
Create a Binary Semaphore. That is maximum value of 1. The initial value should be 1...
MHEG5ResetResolutionParams_t resetRes
void MG_Terminate(void)
Free all OSD resources.
void * STB_OSCreateMutex(void)
Create a mutex.
E_MhegErr MHEG5_SetActiveState(BOOLEAN newActiveState)
Set the active state for the MHEG-5 engine. When the active state is True, the MHEG-5 engine processe...
E_MhegErr MH5_SupportInitialise(S_MhegConfig *pConfig)
Initialise support module - called when 'Open' engine.
E_MhegErr VT_TimersInit(U32BIT task_priority)
Initialise the timer component. This function must be called before any other timer functions are inv...
E_MhegErr MHEG5Initialise(S_MhegConfig *cfg_params)
initialise MHEG5 component
E_MhegErr VQ_GetMsg(S_MhegMessage *pElem)
Get an event or section from the component queues. This is a blocking function.
E_MhegErr VQ_Open(S_MhegConfig *cfg_params)
Initialise component control and section queues. Allocates memory for, sets up and creates event (com...
E_MhegErr DVB_MhegEventsStart(F_NotifyDvbEvent handler)
Start listening for DVB events.
E_MhegErr MHEG5_Pause(void)
Pause MHEG-5 engine.
void MHEG5StreamerClose(void)
Close the IC streaming module.
E_MhegErr MG_Initialise(U16BIT screenWidth, U16BIT screenHeight, U8BIT colourDepth)
Initialise OSD, font, and font fill information. Should only be called at start up.
void STB_OSMutexLock(void *mutex)
Lock a mutex (a.k.a. 'enter', 'wait' or 'get').
The timer module allows the use of timers within the MHEG5 component. These timers can be set by othe...
E_MhegErr DVB_MhegEventsStop(void)
Stop listening for DVB events.
void httpClose(void)
Close the HTTP interface.
Interaction Channel Streaming functions required by MHEG5 engine References: [1] UK1 Profile - Digita...
void MHEG5_RestoreScreen(void)
Restore MHEG OSD after reset of resolution for MHEG-5 engine.
E_MhegErr MHEG5_Reboot(void)
Reboots MHEG5 Engine This function has the same effect as calling these two: MHEG5_Stop( STOP_ACTION_...
E_MhegErr MHEG5_Open(S_MhegConfig *pSetup)
Initialise MHEG5 instance. The following will be performed as a result of a call to this function: ...
void * STB_OSCreateTask(void(*function)(void *), void *param, U32BIT stack, U8BIT priority, U8BIT *name)
Create a New Task to the calling process. Upon success, the created task runs on its own stack...
E_ChannelStartMode MHEG5_GetTuningInfoMode(S32BIT serviceIndex)
Get the current tuning mode for the target service. This is only relevant when MHEG5 has requested a ...
Engine support utility functions for MHEG5.
void STB_OSDestroyTask(void *task)
Delete Task must be called upon termination of each task as it frees all OS specific resources alloca...
void STB_OSDeleteSemaphore(void *semaphore)
Delete a Semaphore.
void STB_OSSemaphoreSignal(void *semaphore)
Signal a Semaphore to Release it by decrementing its counter.
E_MhegErr MHEG5StreamerOpen(void *buffer, U32BIT size, U32BIT taskPriority)
Open the IC streaming module.
Header file - Function prototypes for operating system.