61 #ifdef SURFACE_THRESHOLD 72 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 73 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 78 #define MHEG5_MULTIPLEX_REF_VALID(mux) \ 79 ((mux).service_id != 0 && (mux).service_id != 0xffff) 82 const char *stream_states[] = {
106 static MHEG5Bool videoPlaying = MHEG5FALSE;
109 static MHEG5Bool videoFreeze = MHEG5FALSE;
112 static MHEG5Bool iframePlaying = MHEG5FALSE;
113 static MHEG5Bool iframeDecoded = MHEG5FALSE;
115 #ifdef INCLUDE_FREESAT 117 static MHEG5Bool imagePlanePlaying = MHEG5FALSE;
118 static MHEG5Bool imagePlaneDecoded = MHEG5FALSE;
125 static MHEG5Bool video_stream_changed;
126 static MHEG5Bool video_pause_changed;
127 static MHEG5Bool videoPositionChanged;
131 static E_AudioPlayState audioPlaying = AUDIO_PLAY_DEFAULT;
134 static MHEG5Bool audioFreeze = MHEG5FALSE;
140 static MHEG5Bool audio_stream_changed;
141 static MHEG5Bool audio_pause_changed;
144 static MHEG5Int audioVolume = 0;
147 static MHEG5Bool lastTerminating = MHEG5TRUE;
148 static MHEG5Bool lastVideoPlaying = MHEG5TRUE;
149 static MHEG5Bool lastVideoFreeze = MHEG5FALSE;
150 static E_AudioPlayState lastAudioPlaying = AUDIO_PLAY_STREAM;
151 static MHEG5Bool lastAudioFreeze = MHEG5FALSE;
157 static MHEG5Bool streamSettingsChanged = MHEG5FALSE;
163 static MHEG5Bool displayStreamsAreLocked = MHEG5FALSE;
169 static int numDirtyRects = 0;
173 #ifdef INCLUDE_FREESAT 179 #ifdef SURFACE_THRESHOLD 181 static S32BIT surfaceThreshold = SURFACE_THRESHOLD;
186 static void MHEG5displayUpdateStreamDecoders(MHEG5Bool terminating);
197 if (stm->streamState <= SS_FROZEN)
199 return stream_states[(int)stm->streamState];
201 return stream_states[(int)SS_FROZEN + 1];
224 OSDColor desktopColour;
230 if ((application) && (application->group.root.runningStatus) &&
231 (scene) && (scene->group.root.runningStatus))
260 if (colour->type == MHEG5INT)
262 return (OSDColor)colour->value.i;
268 if (colour->type == MHEG5OCTETSTRING)
273 value =
OSDgetColour((
char *)colour->value.s.data, colour->value.s.len);
279 colour->type = MHEG5INT;
280 colour->value.i = (MHEG5Int)value;
287 ERROR_PRINT((
"ERROR: unknown colour type detected\n"));
300 OSDColor markerColour;
301 int boxX1, boxY1, boxX2, boxY2;
310 int screenMarkerSize;
315 width = slider->visible.boxSize[0];
316 height = slider->visible.boxSize[1];
319 boxX1 = slider->visible.position[0];
320 boxY1 = slider->visible.position[1];
321 boxX2 = boxX1 + width - 1;
322 boxY2 = boxY1 + height - 1;
325 if (slider->interactible.highlightStatus && slider->interactible.engineResp)
327 if (slider->sliderRefColour.type == MHEG5NONE)
338 if (slider->sliderRefColour.type == MHEG5NONE)
349 sliderRange = slider->maxValue - slider->minValue;
350 if (sliderRange <= 0)
358 if (slider->sliderValue < slider->minValue)
362 else if (slider->sliderValue > slider->maxValue)
364 sliderPos = sliderRange;
368 sliderPos = slider->sliderValue - slider->minValue;
372 switch (slider->orientation)
375 ERROR_PRINT((
"ERROR: Illegal slider orientation\n"));
384 screenRange = height;
389 screenPos = (sliderPos * screenRange) / sliderRange;
391 switch (slider->sliderStyle)
398 screenMarkerSize = 9;
399 screenPos = (sliderPos * (screenRange - screenMarkerSize)) / sliderRange + screenMarkerSize / 2;
401 switch (slider->orientation)
406 height, 0, markerColour, markerColour );
410 height, 0, markerColour, markerColour);
414 screenMarkerSize, 0, markerColour, markerColour);
418 screenMarkerSize, 0, markerColour, markerColour );
423 case MHEG5THERMOMETER:
424 switch (slider->orientation)
430 MG_OSDdisplayRectangle( overlap, boxX2 - screenPos + 1, boxY1, screenPos, height, 0, markerColour, markerColour);
439 MG_OSDdisplayRectangle( overlap, boxX1, boxY2 - screenPos + 1, width, screenPos, 0, markerColour, markerColour);
443 case MHEG5PROPORTIONAL:
445 screenPortion = (slider->portion * screenRange) / sliderRange;
446 switch (slider->orientation)
452 MG_OSDdisplayRectangle( overlap, boxX2 - screenPos - screenPortion + 1, boxY1, screenPortion, height, 0, markerColour, markerColour);
455 MG_OSDdisplayRectangle( overlap, boxX1 + screenPos, boxY1, screenPortion, height, 0, markerColour, markerColour);
458 MG_OSDdisplayRectangle( overlap, boxX1, boxY1 + screenPos, width, screenPortion, 0, markerColour, markerColour);
461 MG_OSDdisplayRectangle( overlap, boxX1, boxY2 - screenPos - screenPortion + 1, width, screenPortion, 0, markerColour, markerColour);
466 ERROR_PRINT((
"ERROR: Illegal slider style\n"));
471 #ifdef INCLUDE_FREESAT 484 if (visible->ingredient.data != 0 &&
485 visible->ingredient.dataLen > 0)
490 if (imagePlaneDecoded == MHEG5TRUE)
494 else if (DVB_MhegDecodeImagePlaneIFrame( visible->ingredient.data,
495 visible->ingredient.dataLen,
496 VIDEO_ENC_MPEG2 ) == MHERR_OK)
498 TRACE(TSTRM, (
"decoded Iframe(d=0x%p, l=%ld) OK", visible->ingredient.data, visible->ingredient.dataLen));
502 imagePlaneDecoded = MHEG5TRUE;
507 TRACE(TERROR, (
"(d=0x%p, l=%ld)", visible->ingredient.data, visible->ingredient.dataLen))
530 TRACE(TGRAPHICS, (
"box=(%d,%d,%d,%d) id=%ld clz=%d gd=%p", overlap->left, overlap->top, overlap->right, overlap->bottom,
536 E_VideoEncoding encoding = VIDEO_ENC_MPEG2;
537 switch (visible->ingredient.contentHook)
539 case CHOOK_BITMAP_PNG:
540 if (visible->graphic_data == NULL)
542 MG_DrawPng( visible->ingredient.data, visible->ingredient.dataLen, visible );
544 if (visible->graphic_data != NULL)
546 MG_OSDdisplayBitmap( visible, overlap );
550 case CHOOK_BITMAP_JPG:
551 if (visible->graphic_data == NULL)
553 MG_DrawJpg( visible->ingredient.data, visible->ingredient.dataLen, visible );
555 if (visible->graphic_data != NULL)
557 MG_OSDdisplayBitmap( visible, overlap );
561 case CHOOK_BITMAP_H264_IFRAME:
562 encoding = VIDEO_ENC_H_264;
565 case CHOOK_BITMAP_NORMAL_IFRAME:
567 if (visible->ingredient.data != 0 &&
568 visible->ingredient.dataLen > 0)
573 if (iframeDecoded == MHEG5TRUE)
577 else if (visible->ingredient.data && visible->ingredient.dataLen)
580 visible->ingredient.dataLen,
581 encoding ) == MHERR_OK)
583 TRACE(TSTRM, (
"decoded Iframe(d=0x%p, l=%ld enc=%d) OK", visible->ingredient.data, visible->ingredient.dataLen, encoding))
587 iframeDecoded = MHEG5TRUE;
592 TRACE(TERROR, (
"(d=0x%p, l=%ld enc=%d)", visible->ingredient.data, visible->ingredient.dataLen, encoding))
603 if (visible->graphic_data == NULL)
607 MH5_DisplayText((
MHEG5Text *)visible, overlap);
608 #ifdef SURFACE_THRESHOLD 609 MG_ApplySurfaceThreshold(&visible->graphic_data, surfaceThreshold);
616 if (visible->graphic_data == NULL)
620 MH5_DisplayText((
MHEG5Text *)visible, overlap);
621 #ifdef SURFACE_THRESHOLD 622 MG_ApplySurfaceThreshold(&visible->graphic_data, surfaceThreshold);
627 case MHEG5ENTRYFIELD:
629 if (visible->graphic_data == NULL)
634 #ifdef SURFACE_THRESHOLD 635 MG_ApplySurfaceThreshold(&visible->graphic_data, surfaceThreshold);
642 visible->rect.right - visible->rect.left, visible->rect.bottom - visible->rect.top,
649 MHEG5displaySlider((
MHEG5Slider *)visible, overlap );
652 case MHEG5DYNAMICLINEART:
658 if (((
MHEG5Root *)video->parent)->runningStatus)
664 #ifndef MHEG5PROFILE_UK1_06 676 case MHEG5SWITCHBUTTON:
679 case MHEG5PUSHBUTTON:
682 case MHEG5RTGRAPHICS:
683 MHEG5displayRTGraphics((
MHEG5RTGraphics *)visible, left, top, right, bottom);
693 static void AddExtraRect(
S_REGION rect,
int cur )
696 for (i = 0; i != cur; i++)
698 if (dirtyRects[i].right == 0)
701 TRACE(TGRAPHICS, (
"changed box[%d]=(%d,%d,%d,%d)", i, rect.left, rect.top, rect.right, rect.bottom))
702 dirtyRects[i] = rect;
703 if (numDirtyRects <= i)
710 while (numDirtyRects != 0 && dirtyRects[numDirtyRects - 1].right == 0)
716 if (numDirtyRects == MAX_RECTS)
720 dirtyRects[0].left = 0;
721 dirtyRects[0].top = 0;
722 dirtyRects[0].right = (S16BIT)scene->sceneCoordinateSystem[0];
723 dirtyRects[0].bottom = (S16BIT)scene->sceneCoordinateSystem[1];
728 TRACE(TGRAPHICS, (
"added new box[%d]=(%d,%d,%d,%d)", numDirtyRects, rect.left, rect.top, rect.right, rect.bottom))
729 assert( rect.right > rect.left && rect.bottom > rect.top );
730 dirtyRects[numDirtyRects] = rect;
736 void MHEG5displayVisUpd(
MHEG5Visible *visible, U8BIT upd)
743 rect.left = (S16BIT)visible->position[0];
744 rect.top = (S16BIT)visible->position[1];
745 rect.right = rect.left + (S16BIT)visible->boxSize[0];
746 rect.bottom = rect.top + (S16BIT)visible->boxSize[1];
758 if (!((
MHEG5Root *)visible)->runningStatus)
760 TRACE(TERROR, (
"Item is not visible! upd=%d, clz=%d id=%ld", upd, ((
MHEG5Root *)visible)->clazz, ((
MHEG5Root *)visible)->
id))
766 if (rect.right > SD_WIDTH)
767 rect.right = SD_WIDTH;
768 if (rect.bottom > SD_HEIGHT)
769 rect.bottom = SD_HEIGHT;
773 visible->rect = rect;
779 if (rect.right > scene->sceneCoordinateSystem[0])
780 rect.right = (S16BIT)scene->sceneCoordinateSystem[0];
781 if (rect.bottom > scene->sceneCoordinateSystem[1])
782 rect.bottom = (S16BIT)scene->sceneCoordinateSystem[1];
786 visible->rect = rect;
789 if ((rect.top == 0 && rect.left == 0 &&
790 rect.right == (S16BIT)scene->sceneCoordinateSystem[0] &&
791 rect.bottom == (S16BIT)scene->sceneCoordinateSystem[1]) ||
792 numDirtyRects == MAX_RECTS)
795 dirtyRects[0].left = 0;
796 dirtyRects[0].top = 0;
797 dirtyRects[0].right = (S16BIT)scene->sceneCoordinateSystem[0];
798 dirtyRects[0].bottom = (S16BIT)scene->sceneCoordinateSystem[1];
801 TRACE(TGRAPHICS, (
"screen box=(%d,%d,%d,%d)",
802 dirtyRects[0].left, dirtyRects[0].top, dirtyRects[0].right, dirtyRects[0].bottom))
804 else if ((rect.left < rect.right) && (rect.top < rect.bottom))
807 int i, d_rects, sav, expanded;
809 d_rects = numDirtyRects;
814 for (i = 0; i != d_rects; i++, pRect++)
816 assert( pRect->right == 0 || (pRect->right > pRect->left && pRect->bottom > pRect->top));
817 if (pRect->right > rect.left && rect.right > pRect->left &&
818 pRect->bottom > rect.top && rect.bottom > pRect->top)
821 if (rect.right <= pRect->right)
823 if (rect.left >= pRect->left)
826 if (rect.bottom <= pRect->bottom)
828 if (rect.top >= pRect->top)
834 if (rect.top + SIGNF_Y > pRect->top ||
835 (rect.right - rect.left) * 2 > (pRect->right - pRect->left))
838 rect.right = pRect->right;
839 rect.left = pRect->left;
840 rect.bottom = pRect->bottom;
846 rect.bottom = pRect->top;
851 if (rect.top < pRect->top)
854 if ((rect.top + SIGNF_Y > pRect->top && rect.bottom < pRect->bottom + SIGNF_Y) ||
855 (rect.right - rect.left) * 2 > (pRect->right - pRect->left))
858 rect.right = pRect->right;
859 rect.left = pRect->left;
867 if (rect.right != sav)
869 if (rect.left != pRect->left)
871 pRect->right = rect.left;
872 AddExtraRect( *pRect, i );
874 pRect->left = rect.right;
878 pRect->left = rect.right;
883 if (rect.left != pRect->left)
885 pRect->right = rect.left;
898 if (rect.bottom < pRect->bottom + SIGNF_Y ||
899 (rect.right - rect.left) * 2 > (pRect->right - pRect->left))
902 rect.right = pRect->right;
903 rect.left = pRect->left;
904 rect.top = pRect->top;
910 rect.top = pRect->bottom;
918 if (rect.bottom <= pRect->bottom)
920 if (rect.top >= pRect->top)
923 if (rect.left + SIGNF_X > pRect->left ||
924 (rect.bottom - rect.top) * 2 > (pRect->bottom - pRect->top))
927 rect.right = pRect->right;
928 rect.bottom = pRect->bottom;
929 rect.top = pRect->top;
935 rect.right = pRect->left;
941 if ((rect.left + SIGNF_X > pRect->left && rect.right + SIGNF_X > pRect->right) ||
942 (rect.top + SIGNF_Y > pRect->top && rect.bottom + SIGNF_Y > pRect->bottom) ||
943 (rect.right - pRect->left) * 2 > (pRect->right - rect.left) ||
944 (rect.bottom - pRect->top) * 2 > (pRect->bottom - rect.top))
947 rect.right = pRect->right;
948 rect.bottom = pRect->bottom;
955 if (rect.bottom != pRect->bottom)
957 if (rect.right != pRect->right)
960 pRect->top = rect.bottom;
961 AddExtraRect( *pRect, i );
962 pRect->bottom = pRect->top;
964 pRect->left = rect.right;
968 pRect->top = rect.bottom;
973 if (rect.right != pRect->right)
975 pRect->left = rect.right;
988 if (rect.top < pRect->top)
990 if (rect.right != pRect->right)
993 if (rect.right + SIGNF_X > pRect->right ||
994 (rect.bottom - rect.top) < (pRect->bottom - pRect->top) * 2)
997 rect.right = pRect->right;
1003 pRect->left = rect.right;
1015 if ((rect.left + SIGNF_X > pRect->left && rect.right + SIGNF_X > pRect->right) ||
1016 (rect.top < pRect->top + SIGNF_Y && rect.bottom < pRect->bottom + SIGNF_Y) ||
1017 (rect.right - pRect->left) * 2 > (pRect->right - rect.left) ||
1018 (pRect->bottom - rect.top) * 2 > (rect.bottom - pRect->top))
1021 rect.right = pRect->right;
1022 rect.top = pRect->top;
1029 if (rect.top != pRect->top)
1031 if (rect.right != pRect->right)
1033 sav = pRect->bottom;
1034 pRect->bottom = rect.top;
1035 AddExtraRect( *pRect, i );
1036 pRect->top = pRect->bottom;
1037 pRect->bottom = sav;
1038 pRect->left = rect.right;
1042 pRect->bottom = rect.top;
1047 if (rect.right != pRect->right)
1049 pRect->left = rect.right;
1064 if (pRect->left >= rect.left)
1067 if (pRect->bottom <= rect.bottom)
1069 if (pRect->top >= rect.top)
1077 if (rect.top < pRect->top + SIGNF_Y ||
1078 (rect.right - rect.left) < (pRect->right - pRect->left) * 2)
1081 rect.top = pRect->top;
1087 pRect->bottom = rect.top;
1093 if (pRect->top < rect.top)
1097 if ((rect.left + SIGNF_X > pRect->left && rect.right < pRect->right + SIGNF_X) ||
1098 (rect.bottom - rect.top) * 2 > (pRect->bottom - pRect->top))
1101 rect.bottom = pRect->bottom;
1102 rect.top = pRect->top;
1109 sav = pRect->bottom;
1110 pRect->bottom = rect.top;
1111 AddExtraRect( *pRect, i );
1112 pRect->bottom = sav;
1113 pRect->top = rect.bottom;
1119 if (rect.bottom + SIGNF_Y > pRect->bottom ||
1120 (rect.right - rect.left) < (pRect->right - pRect->left) * 2)
1123 rect.bottom = pRect->bottom;
1129 pRect->top = rect.bottom;
1137 if (pRect->bottom <= rect.bottom)
1139 if (pRect->top >= rect.top)
1142 if (rect.left < pRect->left + SIGNF_X ||
1143 (rect.bottom - rect.top) < (pRect->bottom - pRect->top) * 2)
1146 rect.left = pRect->left;
1152 pRect->right = rect.left;
1158 if ((rect.left < pRect->left + SIGNF_X && rect.right < pRect->right + SIGNF_X) ||
1159 (rect.top < pRect->top + SIGNF_Y && rect.bottom < pRect->bottom + SIGNF_Y) ||
1160 (pRect->right - rect.left) * 2 > (rect.right - pRect->left) ||
1161 (pRect->bottom - rect.top) * 2 > (rect.bottom - pRect->top))
1164 rect.left = pRect->left;
1165 rect.top = pRect->top;
1172 sav = pRect->bottom;
1173 pRect->bottom = rect.top;
1174 AddExtraRect( *pRect, i );
1175 pRect->top = pRect->bottom;
1176 pRect->bottom = sav;
1177 pRect->right = rect.left;
1183 if (pRect->top > rect.top)
1186 if ((rect.left < pRect->left + SIGNF_X && rect.right < pRect->right + SIGNF_X) ||
1187 (pRect->top < rect.top + SIGNF_Y && pRect->bottom < rect.bottom + SIGNF_Y) ||
1188 (pRect->right - rect.left) * 2 > (rect.right - pRect->left) ||
1189 (rect.bottom - pRect->top) * 2 > (pRect->bottom - rect.top))
1192 rect.left = pRect->left;
1193 rect.bottom = pRect->bottom;
1201 pRect->top = rect.bottom;
1202 AddExtraRect( *pRect, i );
1203 pRect->bottom = pRect->top;
1205 pRect->right = rect.left;
1211 if (rect.right < pRect->right + SIGNF_X ||
1212 (rect.bottom - rect.top) * 2 > (pRect->bottom - pRect->top))
1215 rect.left = pRect->left;
1216 rect.bottom = pRect->bottom;
1217 rect.top = pRect->top;
1223 rect.left = pRect->right;
1230 else if (pRect->right != 0)
1233 int cnt = 0, diff, most;
1235 if (pRect->top < rect.top + DELTA_Y && pRect->top + DELTA_Y > rect.top &&
1236 pRect->bottom < rect.bottom + DELTA_Y && pRect->bottom + DELTA_Y > rect.bottom)
1238 if ((pRect->right < rect.left && pRect->right + 90 > rect.left) ||
1239 (rect.right < pRect->left && rect.right + 90 > pRect->left))
1244 if (pRect->left < rect.left + DELTA_X && pRect->left + DELTA_X > rect.left &&
1245 pRect->right < rect.right + DELTA_X && pRect->right + DELTA_X > rect.right)
1247 if ((pRect->bottom < rect.top && pRect->bottom + 72 > rect.top) ||
1248 (rect.bottom < pRect->top && rect.bottom + 72 > pRect->top))
1253 if (pRect->right > rect.left && rect.right > pRect->left)
1255 if ((pRect->top < rect.bottom + DELTA_Y && pRect->top + DELTA_Y > rect.bottom) ||
1256 (rect.top < pRect->bottom + DELTA_Y && rect.top + DELTA_Y > pRect->bottom))
1258 if (pRect->right > rect.right)
1260 most = pRect->right;
1261 diff = pRect->right - rect.right;
1266 diff = rect.right - pRect->right;
1268 if (rect.left > pRect->left)
1270 most -= pRect->left;
1271 diff += rect.left - pRect->left;
1276 diff += pRect->left - rect.left;
1278 if (diff * 2 < most)
1284 if (pRect->bottom > rect.top && rect.bottom > pRect->top)
1286 if ((pRect->left < rect.right + DELTA_X && pRect->left + DELTA_X > rect.right) ||
1287 (rect.left < pRect->right + DELTA_X && rect.left + DELTA_X > pRect->right))
1289 if (pRect->bottom > rect.bottom)
1291 most = pRect->bottom;
1292 diff = pRect->bottom - rect.bottom;
1297 diff = rect.bottom - pRect->bottom;
1299 if (rect.top > pRect->top)
1302 diff += rect.top - pRect->top;
1307 diff += pRect->top - rect.top;
1309 if (diff * 2 < most)
1319 TRACE(TGRAPHICS, (
"b[%d](%d,%d,%d,%d)", i, pRect->left, pRect->top, pRect->right, pRect->bottom))
1320 TRACE(TGRAPHICS, (
"new (%d,%d,%d,%d)", rect.left, rect.top, rect.right, rect.bottom))
1321 if (rect.left > pRect->left)
1323 rect.left = pRect->left;
1326 if (rect.right < pRect->right)
1328 rect.right = pRect->right;
1331 if (rect.top > pRect->top)
1333 rect.top = pRect->top;
1336 if (rect.bottom < pRect->bottom)
1338 rect.bottom = pRect->bottom;
1344 assert( pRect->right == 0 || (pRect->right > pRect->left && pRect->bottom > pRect->top));
1347 while (expanded != 0);
1350 AddExtraRect( rect, d_rects );
1352 TRACE(TGRAPHICS, (
"finished id=%ld, box=(%d,%d,%d,%d) num:was=%d,now=%d", visible->ingredient.root.id,
1353 rect.left, rect.top, rect.right, rect.bottom, i, numDirtyRects))
1372 dirtyRects[0].left = 0;
1373 dirtyRects[0].top = 0;
1374 dirtyRects[0].right = (S16BIT)scene->sceneCoordinateSystem[0];
1375 dirtyRects[0].bottom = (S16BIT)scene->sceneCoordinateSystem[1];
1378 TRACE(TGRAPHICS, (
"box=(%d,%d,%d,%d)",
1379 dirtyRects[0].left, dirtyRects[0].top, dirtyRects[0].right, dirtyRects[0].bottom))
1385 if (stream->streamState == SS_PLAYING_CLIP)
1388 stream->looping, AUDIO_ENC_MPEG2 ) != MHERR_OK)
1390 TRACE(TERROR, (
"DVB_MhegAudioPlayClip failed"));
1395 void MHEG5displayResume(
void)
1400 iframeDecoded = MHEG5FALSE;
1404 video_stream_changed = MHEG5TRUE;
1407 video_pause_changed = MHEG5TRUE;
1410 audio_stream_changed = MHEG5TRUE;
1411 streamSettingsChanged = MHEG5TRUE;
1412 videoPositionChanged = MHEG5TRUE;
1413 MHEG5displayUpdateStreamDecoders(MHEG5FALSE);
1414 MG_VideoPositionReset();
1415 if (audioPlaying == AUDIO_PLAY_MEMORY && activeAudioObject != NULL)
1417 RestartAudioClip( activeAudioObject->parent );
1419 audio_pause_changed = audioFreeze;
1422 void MHEG5displayPause(
void)
1426 if (lastAudioPlaying == AUDIO_PLAY_MEMORY)
1433 iframeDecoded = MHEG5FALSE;
1435 #ifdef INCLUDE_FREESAT 1436 if (imagePlaneDecoded)
1438 DVB_MhegImagePlaneIFrameStop();
1439 imagePlaneDecoded = MHEG5FALSE;
1444 lastVideoPlaying = MHEG5TRUE;
1445 lastVideoFreeze = MHEG5FALSE;
1446 lastAudioPlaying = AUDIO_PLAY_STREAM;
1447 lastAudioFreeze = MHEG5FALSE;
1448 lastTerminating = MHEG5TRUE;
1451 void MHEG5groupClearImages(
MHEG5Root *group )
1456 switch (item->root.clazz)
1459 case MHEG5ENTRYFIELD:
1460 case MHEG5HYPERTEXT:
1469 case MHEG5DYNAMICLINEART:
1474 case MHEG5RECTANGLE:
1485 void MHEG5groupRedraw(
MHEG5Root *group )
1490 switch (item->root.clazz)
1495 if (visible->ingredient.data != NULL)
1497 switch (item->contentHook)
1499 case CHOOK_BITMAP_PNG:
1500 MG_DrawPng( visible->ingredient.data, visible->ingredient.dataLen, visible );
1502 case CHOOK_BITMAP_JPG:
1503 MG_DrawJpg( visible->ingredient.data, visible->ingredient.dataLen, visible );
1516 case MHEG5RECTANGLE:
1519 case MHEG5DYNAMICLINEART:
1523 case MHEG5ENTRYFIELD:
1527 case MHEG5HYPERTEXT:
1539 static void VideoStop( MHEG5Bool terminating )
1553 static void AudioStop( MHEG5Bool terminating )
1575 static void MHEG5displayUpdateStreamDecoders(MHEG5Bool terminating)
1577 static MHEG5Int lastAudioVolume = 0;
1587 if ((lastVideoPlaying != videoPlaying) || (video_stream_changed) ||
1588 (lastTerminating != terminating))
1590 TRACE(TSTRM, (
"VP=%d ifrmPly=%d", videoPlaying, iframePlaying));
1593 assert( activeVideoObject );
1594 assert( activeVideoObject->visible.ingredient.root.clazz == MHEG5VIDEO );
1596 stream = activeVideoObject->parent;
1599 if (stream->ingredient.contentHook == CHOOK_STREAM_NORMAL)
1601 TRACE(TSTRM, (
"V_srv_id=%d V_cmpt_id=%d",
1602 video_stream_ref.service_id,
1603 video_stream_ref.ComponentTag));
1605 if (MHEG5_MULTIPLEX_REF_VALID(video_stream_ref))
1614 err = MHERR_BAD_PARAMETER;
1620 TRACE(TSTRM, (
"Video Play success, SS=%s", SS(stream)));
1621 if (stream->streamState <= SS_STOPPING)
1623 stream->streamState = SS_STARTING;
1626 else if (stream->streamState == SS_PLAYING)
1628 stream->streamState = SS_NEW_REF;
1632 case MHERR_BAD_PARAMETER:
1633 TRACE(TSTRM, (
"SS=%s", SS(stream)));
1634 if (stream->streamState > SS_STOPPING)
1636 stream->streamState = SS_STOPPING;
1642 VideoStop(terminating);
1647 TRACE(TSTRM, (
"SS=%s service_id=%x", SS(stream),video_stream_ref.service_id));
1651 stream->streamState = SS_STOPPED;
1656 else if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
1661 if (lastIcStream == NULL)
1663 TRACE(TSTRM, (
"SS=%s service_id=%x", SS(stream),video_stream_ref.service_id));
1665 memset(&video_stream_ref, 0,
sizeof(video_stream_ref));
1672 else if (!iframeDecoded)
1675 if (activeVideoObject != NULL)
1677 stream = activeVideoObject->parent;
1680 if (stream->ingredient.contentHook == CHOOK_STREAM_NORMAL)
1682 TRACE(TSTRM, (
"AVO=%d AAO=%p STM=%p", activeVideoObject,
1683 activeAudioObject, stream));
1684 TRACE(TSTRM, (
"Stop Video, SS=%s", SS(stream)));
1685 switch (stream->streamState)
1698 stream->streamState = SS_STOPPED;
1702 stream->streamState = SS_STOPPING;
1711 TRACE(TSTRM, (
"No Video object (assume destroyed)"));
1714 VideoStop(terminating);
1717 lastVideoPlaying = videoPlaying;
1718 video_stream_changed = MHEG5FALSE;
1722 TRACE(TSTRM, (
"IGNORE: VP=%d ifrmPly=%d", videoPlaying, iframePlaying));
1726 if (lastVideoFreeze != videoFreeze || video_pause_changed)
1728 TRACE(TSTRM, (
"VF=%d", videoFreeze));
1737 lastVideoFreeze = videoFreeze;
1738 video_pause_changed = MHEG5FALSE;
1746 if (lastAudioVolume != audioVolume)
1749 if (activeAudioObject != NULL)
1751 stream = activeAudioObject->parent;
1752 if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
1768 if (err != MHERR_OK)
1770 ERROR_PRINT((
"ERROR: OSDaudioSetVolume() - Failed to adjust audio volume\n"));
1772 lastAudioVolume = audioVolume;
1776 if (lastAudioFreeze != audioFreeze || audio_pause_changed)
1778 if (audioPlaying == AUDIO_PLAY_MEMORY)
1791 audio_stream_changed = MHEG5TRUE;
1793 lastAudioFreeze = audioFreeze;
1794 audio_pause_changed = MHEG5FALSE;
1798 if ((lastAudioPlaying != audioPlaying) || (audio_stream_changed) ||
1799 (lastTerminating != terminating))
1801 TRACE(TSTRM, (
"AP=%d ", audioPlaying))
1802 if (lastAudioPlaying == AUDIO_PLAY_MEMORY)
1806 TRACE(TERROR, (
"Failed to stop audio"));
1809 if (audioPlaying == AUDIO_PLAY_STREAM && !audioFreeze)
1811 assert( activeAudioObject );
1812 stream = activeAudioObject->parent;
1815 if (stream->ingredient.contentHook == CHOOK_STREAM_NORMAL)
1817 TRACE(TSTRM, (
"A_srv_id=%d A_cmpt_id=%d",
1818 audio_stream_ref.service_id,
1819 audio_stream_ref.ComponentTag));
1821 if (MHEG5_MULTIPLEX_REF_VALID(audio_stream_ref))
1831 err = MHERR_BAD_PARAMETER;
1837 TRACE(TSTRM, (
"SetAudioStream/Mode OK, SS=%s", SS(stream)));
1838 if (stream->streamState <= SS_STOPPING)
1840 stream->streamState = SS_STARTING;
1843 else if (stream->streamState == SS_PLAYING)
1845 stream->streamState = SS_NEW_REF;
1849 case MHERR_BAD_PARAMETER:
1850 TRACE(TSTRM, (
"SS=%s", SS(stream)));
1851 if (stream->streamState > SS_STOPPING)
1853 stream->streamState = SS_STOPPING;
1859 AudioStop(terminating);
1864 TRACE(TSTRM, (
"SS=%s", SS(stream)));
1868 stream->streamState = SS_STOPPED;
1872 else if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
1877 if (lastIcStream == NULL)
1880 memset(&audio_stream_ref, 0,
sizeof(audio_stream_ref));
1887 else if (audioPlaying == AUDIO_PLAY_MEMORY)
1889 if (lastAudioPlaying == AUDIO_PLAY_STREAM || lastTerminating)
1893 TRACE(TERROR, (
"DVB_MhegAudioStopStream failed"))
1899 if (activeAudioObject != NULL)
1901 stream = activeAudioObject->parent;
1902 TRACE(TSTRM, (
"AVO=%d AAO=%p STM=%p", activeVideoObject,
1903 activeAudioObject, stream));
1904 TRACE(TSTRM, (
"Stop Audio, SS=%s", SS(stream)));
1907 if (stream->ingredient.contentHook == CHOOK_STREAM_NORMAL ||
1908 stream->ingredient.contentHook == CHOOK_STREAM_MEMORY)
1910 switch (stream->streamState)
1921 stream->streamState = SS_STOPPED;
1925 stream->streamState = SS_STOPPING;
1932 TRACE(TSTRM, (
"No Audio object (assume destroyed), %d", audioPlaying));
1935 AudioStop( terminating );
1938 lastAudioPlaying = audioPlaying;
1939 audio_stream_changed = MHEG5FALSE;
1942 #ifndef MHEG5PROFILE_UK1_06 1950 lastTerminating = terminating;
1955 streamSettingsChanged = MHEG5FALSE;
1958 if (icStream != NULL)
1960 lastIcStream = icStream;
1966 lastIcStream = NULL;
1971 static void SetScaling(
void *dummy)
1973 TRACE(TSTRM, (
"AVO=%p, AIO=%p", activeVideoObject, activeIframeObject))
1974 #ifdef INCLUDE_FREESAT 1975 if (activeImagePlaneObject != NULL)
1977 MG_SetVideoPosition((
MHEG5Video *)activeImagePlaneObject,
1978 activeImagePlaneObject->visible.ingredient.contentHook );
1981 if (activeIframeObject != NULL)
1983 MG_SetVideoPosition((
MHEG5Video *)activeIframeObject,
1984 activeIframeObject->visible.ingredient.contentHook );
1986 else if (activeVideoObject != NULL)
1989 MG_SetVideoPosition( activeVideoObject, stream->ingredient.contentHook );
1993 MG_SetVideoPosition( NULL, CHOOK_UNSPECIFIED );
2002 if (!displayStreamsAreLocked)
2004 if (videoPositionChanged && application && application->lockCount == 0)
2009 event_msg.proc_msg_func = SetScaling;
2010 event_msg.data_type = DT_NONE;
2011 if (
VQ_PutMsg(&event_msg, PRTY_LOW) == MHERR_OK)
2013 videoPositionChanged = MHEG5FALSE;
2016 #ifdef NO_STREAM_UPDATE_WHEN_LOCKED 2017 if (application && application->lockCount == 0))
2020 if (streamSettingsChanged)
2023 MHEG5displayUpdateStreamDecoders(MHEG5FALSE);
2038 TRACER(
int itemCount = 0;)
2043 OSDColor desktopColour;
2046 if ((application) && (application->lockCount == 0))
2048 TRACE(TGRAPHICS, (
"*************** numDirtyRects=%d *************",numDirtyRects))
2054 for (i = 0; i != numDirtyRects; i++, pRect++)
2056 if (pRect->right != 0)
2058 assert( pRect->right > pRect->left && pRect->bottom > pRect->top );
2068 #ifdef INCLUDE_FREESAT 2069 if (activeImagePlaneObject)
2076 for (i = 0; i != numDirtyRects; i++, pRect++)
2078 if (pRect->right > rect.left && rect.right > pRect->left &&
2079 pRect->bottom > rect.top && rect.bottom > pRect->top)
2082 overlap.left = MAX(pRect->left, rect.left);
2083 overlap.top = MAX(pRect->top, rect.top);
2084 overlap.right = MIN(pRect->right, rect.right);
2085 overlap.bottom = MIN(pRect->bottom, rect.bottom);
2088 MHEG5displayDrawImagePlane((
MHEG5Visible *)activeImagePlaneObject, &overlap);
2094 prevItem = application->displayStackBottom;
2099 TRACER(itemCount++;)
2100 if (!visible->ingredient.root.runningStatus)
2102 if (visible->graphic_data || visible->ingredient.cloned)
2104 TRACE(TGRAPHICS, (
"id=%d clzz=%d %p", visible->ingredient.root.id,
2105 visible->ingredient.root.clazz, visible->graphic_data))
2112 rect = visible->rect;
2114 for (i = 0; i != numDirtyRects; i++, pRect++)
2116 if (pRect->right > rect.left && rect.right > pRect->left &&
2117 pRect->bottom > rect.top && rect.bottom > pRect->top)
2120 overlap.left = MAX(pRect->left, rect.left);
2121 overlap.top = MAX(pRect->top, rect.top);
2122 overlap.right = MIN(pRect->right, rect.right);
2123 overlap.bottom = MIN(pRect->bottom, rect.bottom);
2126 MHEG5displayDraw( visible, &overlap );
2130 prevItem = prevItem->prev;
2136 TRACE(TGRAPHICS, (
"*************** itemCount=%d *************",itemCount))
2138 MHEG5displayStreamUpdate( application );
2155 stream = audio->parent;
2158 activeAudioObject = audio;
2161 audioVolume = audio->volume;
2163 TRACE(TSTRM, (
"(%p)", audio))
2168 streamSettingsChanged = MHEG5TRUE;
2170 if (stream->speed[0] == 0)
2173 audioFreeze = MHEG5TRUE;
2175 else if (audioFreeze && audioPlaying != AUDIO_PLAY_NONE)
2178 audioFreeze = MHEG5FALSE;
2183 audioFreeze = MHEG5FALSE;
2186 if (stream->storageMemory)
2189 audioPlaying = AUDIO_PLAY_MEMORY;
2190 TRACE(TSTRM, (
"aud play %ld", audio->parent->ingredient.dataLen))
2192 if (stream->ingredient.data != 0 &&
2193 stream->ingredient.dataLen != 0)
2196 TRACE(TSTRM, (
"AP=%d", audioPlaying))
2199 audio_stream_changed = MHEG5TRUE;
2200 MHEG5displayUpdateStreamDecoders(MHEG5FALSE);
2202 stream->ingredient.dataLen,
2203 stream->looping, AUDIO_ENC_MPEG2 );
2204 if (err != MHERR_OK)
2206 TRACE(TERROR, (
"DVB_MhegAudioPlayClip returned %d", err))
2210 TRACE(TSTRM, (
"Audio Play Memory success, SS=%s", SS(stream)))
2211 if (stream->streamState <= SS_STOPPING)
2215 stream->streamState = SS_PLAYING_CLIP;
2220 else if (stream->ingredient.contentHook == CHOOK_STREAM_NORMAL)
2224 TRACE(TSTRM, (
"AP=%d", audioPlaying))
2227 audioPlaying = AUDIO_PLAY_STREAM;
2233 if ((audio_stream_ref.service_id != stream->dvbLocator.service_id) ||
2234 (audio_stream_ref.original_network_id != stream->dvbLocator.original_network_id) ||
2235 (audio_stream_ref.transport_stream_id != stream->dvbLocator.transport_stream_id) ||
2236 (audio_stream_ref.ComponentTag != componentTag))
2238 audio_stream_ref.original_network_id = stream->dvbLocator.original_network_id;
2239 audio_stream_ref.transport_stream_id = stream->dvbLocator.transport_stream_id;
2240 audio_stream_ref.service_id = stream->dvbLocator.service_id;
2241 audio_stream_ref.ComponentTag = (S16BIT)componentTag;
2245 audio_stream_changed = MHEG5TRUE;
2246 TRACE(TSTRM, (
" new Audio ref, SS=%s", SS(stream)))
2250 else if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
2253 audioPlaying = AUDIO_PLAY_STREAM;
2254 audio_stream_changed = MHEG5TRUE;
2260 if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
2263 audioFreeze = MHEG5FALSE;
2278 stream = video->parent;
2280 TRACE(TSTRM, (
"(%p) VP=%d", video, videoPlaying))
2282 if (activeVideoObject != NULL)
2284 TRACE((TSTRM | TPERFORM), (
"AVO_clss=%d", activeVideoObject->visible.ingredient.root.clazz))
2288 activeVideoObject = video;
2290 videoPlaying = MHEG5TRUE;
2292 if (stream->speed[0] == 0)
2295 videoFreeze = MHEG5TRUE;
2296 TRACE(TSTRM, (
"FROZEN"))
2300 TRACE(TSTRM, (
"chook=%d vsr.sid=%x dvb.sid=%x",stream->ingredient.contentHook,
2301 video_stream_ref.service_id, stream->dvbLocator.service_id))
2302 if (stream->ingredient.contentHook == CHOOK_STREAM_NORMAL)
2307 videoFreeze = MHEG5FALSE;
2313 if ((video_stream_ref.service_id != stream->dvbLocator.service_id) ||
2314 (video_stream_ref.original_network_id != stream->dvbLocator.original_network_id) ||
2315 (video_stream_ref.transport_stream_id != stream->dvbLocator.transport_stream_id) ||
2316 (video_stream_ref.ComponentTag != componentTag))
2318 video_stream_ref.original_network_id = stream->dvbLocator.original_network_id;
2319 video_stream_ref.transport_stream_id = stream->dvbLocator.transport_stream_id;
2320 video_stream_ref.service_id = stream->dvbLocator.service_id;
2321 video_stream_ref.ComponentTag = componentTag;
2325 video_stream_changed = MHEG5TRUE;
2326 TRACE(TSTRM, (
" new Video ref, SS=%s", SS(stream)));
2330 else if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
2332 video_stream_changed = MHEG5TRUE;
2338 if (stream->ingredient.contentHook == CHOOK_STREAM_IC)
2341 videoFreeze = MHEG5FALSE;
2348 streamSettingsChanged = MHEG5TRUE;
2349 videoPositionChanged = MHEG5TRUE;
2352 U16BIT MHEG5GetVideoSid(
void)
2354 return video_stream_ref.service_id;
2357 U16BIT MHEG5GetAudioSid(
void)
2359 return audio_stream_ref.service_id;
2362 void MHEG5displayRefreshStreams( U16BIT service_id )
2364 if (videoPlaying && video_stream_ref.service_id == service_id)
2369 if (audioPlaying == AUDIO_PLAY_STREAM && audio_stream_ref.service_id == service_id)
2376 void MHEG5displayRefreshDefaultAudio( U16BIT service_id )
2378 DBGTRACE(TSTRM,
"audioPlaying %u service_ids %u,%u",audioPlaying,audio_stream_ref.service_id,service_id)
2379 if (audioPlaying == AUDIO_PLAY_STREAM &&
2380 audio_stream_ref.service_id == service_id &&
2381 audio_stream_ref.ComponentTag == -1)
2405 TRACE(TSTRM, (
"strm{id=%d} play %ld, SS=%s", stream->ingredient.root.id, stream->ingredient.dataLen, SS(stream)))
2407 item = stream->multiplex;
2410 if ((*item)->root.runningStatus)
2412 switch ((*item)->root.clazz)
2423 #ifndef MHEG5PROFILE_UK1_06 2424 case MHEG5RTGRAPHICS:
2429 streamSettingsChanged = MHEG5TRUE;
2434 ERROR_PRINT((
"ERROR: MHEG5displayStreamPlay: Illegal item class in stream multiplex\n"));
2452 TRACE(TSTRM, (
"AP=%d", audioPlaying))
2454 audioPlaying = AUDIO_PLAY_NONE;
2459 streamSettingsChanged = MHEG5TRUE;
2470 TRACE(TSTRM, (
"VP=%d", videoPlaying))
2472 videoPlaying = MHEG5FALSE;
2477 streamSettingsChanged = MHEG5TRUE;
2493 TRACE(TSTRM, (
"SS=%s", SS(stream)))
2495 item = stream->multiplex;
2498 switch ((*item)->root.clazz)
2502 TRACE(TSTRM, (
"AP=%d", audioPlaying))
2503 if (audioPlaying == AUDIO_PLAY_NONE)
2509 TRACE(TSTRM, (
" NO active Audio"))
2513 streamSettingsChanged = MHEG5TRUE;
2514 audioPlaying = AUDIO_PLAY_NONE;
2515 audio_stream_changed = MHEG5TRUE;
2521 if (videoPlaying == MHEG5FALSE)
2523 TRACE(TSTRM, (
" NO active Video"))
2527 streamSettingsChanged = MHEG5TRUE;
2528 videoPositionChanged = MHEG5TRUE;
2529 videoPlaying = MHEG5FALSE;
2536 #ifndef MHEG5PROFILE_UK1_06 2537 case MHEG5RTGRAPHICS:
2541 streamSettingsChanged = MHEG5TRUE;
2547 ERROR_PRINT((
"ERROR: MHEG5displayStreamStop: Illegal item class in stream multiplex\n"));
2553 switch (stream->streamState)
2556 case SS_PLAYING_CLIP:
2560 TRACE(TSTRM, (
"AVO=%d AAO=%p STM=%p", activeVideoObject, activeAudioObject, stream))
2561 TRACE(TSTRM, (
"STOPPING AP=%d SS=%s", audioPlaying, SS(stream)))
2562 stream->streamState = SS_STOPPING;
2567 TRACE(TSTRM, (
"AVO=%d AAO=%p STM=%p", activeVideoObject, activeAudioObject, stream))
2568 TRACE(TSTRM, (
"STOPPED AP=%d SS=%s", audioPlaying, SS(stream)))
2569 stream->streamState = SS_STOPPED;
2570 if (activeVideoObject && activeVideoObject->parent == stream)
2572 activeVideoObject = NULL;
2574 if (activeAudioObject && activeAudioObject->parent == stream)
2576 activeAudioObject = NULL;
2581 void MHEG5displayAudioDestroy(
MHEG5Audio *audio )
2583 if (activeAudioObject == audio)
2585 TRACE(TSTRM, (
"audio destroy %x SS=%s", audio, SS(audio->parent)))
2586 activeAudioObject = NULL;
2590 void MHEG5displayVideoDestroy(
MHEG5Video *video )
2592 if (activeVideoObject == video)
2594 assert(video->visible.ingredient.root.clazz == MHEG5VIDEO);
2595 TRACE(TSTRM, (
" video destroyed %x, SS=%s", video, SS(video->parent)))
2596 activeVideoObject = NULL;
2600 void MHEG5displayIframeDestroy(
MHEG5Bitmap *iframe )
2602 TRACE(TSTRM, (
"iframe destroyed, bmp=%p, AIO=%p", iframe, activeIframeObject))
2603 if (activeIframeObject == iframe)
2605 activeIframeObject = NULL;
2616 TRACE(TSTRM, (
"bmp=%x, AIO=%x, ifrmPly=%d ch=%d", bitmap, activeIframeObject, iframePlaying,
2617 bitmap->visible.ingredient.contentHook))
2618 #ifndef INCLUDE_FREESAT 2619 assert( bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_NORMAL_IFRAME ||
2620 bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_H264_IFRAME );
2622 assert( bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_NORMAL_IFRAME ||
2623 bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_H264_IFRAME ||
2624 bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_IMAGE_PLANE_IFRAME );
2625 if (bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_IMAGE_PLANE_IFRAME)
2627 if (imagePlanePlaying)
2629 E_VideoEncoding encoding;
2631 encoding = VIDEO_ENC_MPEG2;
2633 if (DVB_MhegDecodeImagePlaneIFrame( bitmap->visible.ingredient.data,
2634 bitmap->visible.ingredient.dataLen, encoding ) == MHERR_OK)
2636 imagePlaneDecoded = MHEG5TRUE;
2640 imagePlanePlaying = MHEG5FALSE;
2641 imagePlaneDecoded = MHEG5FALSE;
2646 imagePlanePlaying = MHEG5TRUE;
2648 activeImagePlaneObject = bitmap;
2655 E_VideoEncoding encoding;
2657 if (bitmap->visible.ingredient.contentHook == CHOOK_BITMAP_H264_IFRAME)
2658 encoding = VIDEO_ENC_H_264;
2660 encoding = VIDEO_ENC_MPEG2;
2662 if (bitmap->visible.ingredient.data && bitmap->visible.ingredient.dataLen &&
2664 bitmap->visible.ingredient.dataLen, encoding ) == MHERR_OK)
2666 iframeDecoded = MHEG5TRUE;
2670 iframePlaying = MHEG5FALSE;
2671 iframeDecoded = MHEG5FALSE;
2679 videoPlaying = MHEG5FALSE;
2680 streamSettingsChanged = MHEG5TRUE;
2682 if (streamSettingsChanged)
2684 MHEG5displayUpdateStreamDecoders(MHEG5FALSE);
2686 iframePlaying = MHEG5TRUE;
2688 activeIframeObject = bitmap;
2690 videoPositionChanged = MHEG5TRUE;
2693 #ifdef INCLUDE_FREESAT 2698 void MHEG5displayImagePlaneStop(
void)
2700 TRACE(TSTRM, (
"AIO=%x", activeIframeObject))
2701 if (DVB_MhegImagePlaneIFrameStop() != MHERR_OK)
2703 ERROR_PRINT((
"ERROR: OSDIFrameDisplayStop() - Failed to stop decoding IFrame\n"));
2705 imagePlanePlaying = MHEG5FALSE;
2706 imagePlaneDecoded = MHEG5FALSE;
2707 #ifdef INCLUDE_FREESAT 2708 activeImagePlaneObject = NULL;
2719 TRACE(TSTRM, (
"AIO=%x", activeIframeObject))
2722 TRACE(TERROR, (
"Failed to stop decoding IFrame %d", iframeDecoded));
2724 iframePlaying = MHEG5FALSE;
2725 iframeDecoded = MHEG5FALSE;
2726 activeIframeObject = NULL;
2729 void MHEG5displayVideoPositionUpdate(
void)
2731 videoPositionChanged = MHEG5TRUE;
2734 void MHEG5notifyVideoStarted(
void)
2737 if (activeVideoObject != NULL)
2741 switch (stream->ingredient.contentHook)
2743 case CHOOK_STREAM_NORMAL:
2744 TRACE(TSTRM, (
"VP=%d SS=%s", videoPlaying, SS(stream)));
2745 if (stream->streamState > SS_STOPPING)
2747 if (stream->streamState == SS_STARTING)
2754 stream->streamState = SS_PLAYING;
2758 case CHOOK_STREAM_IC:
2768 TRACE(TERROR, (
"SS callback, NO video object"))
2772 void MHEG5notifyVideoStopped(
void)
2775 if (activeVideoObject != NULL)
2778 switch (stream->ingredient.contentHook)
2780 case CHOOK_STREAM_NORMAL:
2781 TRACE(TSTRM, (
"AVO=%p STM=%p", activeVideoObject, stream));
2782 TRACE(TSTRM, (
"VP=%d SS=%s", videoPlaying, SS(stream)));
2783 if (stream->streamState == SS_STOPPING)
2787 stream->streamState = SS_STOPPED;
2794 if (!streamSettingsChanged)
2796 activeVideoObject = NULL;
2797 videoPlaying = MHEG5FALSE;
2800 else if (stream->streamState > SS_STOPPING)
2802 TRACE(TERROR, (
"SS=%s", SS(stream)));
2806 case CHOOK_STREAM_IC:
2816 TRACE(TSTRM, (
"SS callback, but NO video object %x", activeVideoObject))
2820 void MHEG5notifyAudioStarted(BOOLEAN isClip)
2822 if (activeAudioObject != NULL)
2825 switch (stream->ingredient.contentHook)
2827 case CHOOK_STREAM_NORMAL:
2828 case CHOOK_STREAM_MEMORY:
2829 TRACE(TSTRM, (
"AAO=%p STM=%p", activeAudioObject, stream));
2830 TRACE(TSTRM, (
"AP=%d isClp=%d SS=%s", audioPlaying, isClip, SS(stream)));
2831 if (stream->ingredient.root.runningStatus)
2833 switch (stream->streamState)
2844 stream->streamState = isClip ? SS_PLAYING_CLIP : SS_PLAYING;
2850 case CHOOK_STREAM_IC:
2860 TRACE(TERROR, (
"SS callback, but NO audio object AP=%d", audioPlaying))
2864 void MHEG5notifyAudioStopped(BOOLEAN isClip)
2866 if (activeAudioObject != NULL)
2869 switch (stream->ingredient.contentHook)
2871 case CHOOK_STREAM_NORMAL:
2872 case CHOOK_STREAM_MEMORY:
2873 TRACE(TSTRM, (
"AAO=%p STM=%p", activeAudioObject, stream));
2874 TRACE(TSTRM, (
"AP=%d isClp=%d SS=%s", audioPlaying, isClip, SS(stream)));
2875 if (stream->ingredient.root.runningStatus)
2877 if ((stream->streamState == SS_STOPPING) ||
2878 (isClip && (stream->streamState == SS_PLAYING_CLIP)))
2880 TRACE(TSTRM, (
"AP=%d", audioPlaying))
2883 stream->streamState = SS_STOPPED;
2884 activeAudioObject = NULL;
2885 audioPlaying = AUDIO_PLAY_NONE;
2890 case CHOOK_STREAM_IC:
2900 TRACE(TSTRM, (
"SS callback, but NO audio object AP=%d", audioPlaying))
2911 TRACE(TSTRM, (
"AVO=%x, AAO=%x", activeVideoObject, activeAudioObject))
2912 TRACE(TSTRM, (
"AP=%d, VP=%d", audioPlaying, videoPlaying))
2915 activeVideoObject = NULL;
2916 activeIframeObject = NULL;
2918 videoPlaying = MHEG5FALSE;
2919 videoFreeze = MHEG5FALSE;
2921 audioPlaying = AUDIO_PLAY_DEFAULT;
2922 audioFreeze = MHEG5FALSE;
2926 memset(&audio_stream_ref, 0,
sizeof(audio_stream_ref));
2927 memset(&video_stream_ref, 0,
sizeof(video_stream_ref));
2929 #ifndef MHEG5PROFILE_UK1_06 2936 MG_SetVideoPosition( NULL, CHOOK_UNSPECIFIED );
2938 MHEG5displayUpdateStreamDecoders(MHEG5TRUE);
2946 lastTerminating = MHEG5TRUE;
2956 displayStreamsAreLocked = MHEG5TRUE;
2965 displayStreamsAreLocked = MHEG5FALSE;
2976 audioVolume = volume;
2981 streamSettingsChanged = MHEG5TRUE;
2984 #ifdef SURFACE_THRESHOLD 2993 void MHEG5displaySetSurfaceThreshold(S32BIT pixels)
2995 surfaceThreshold = pixels;
3010 static void SetSurfaceThreshold( MHEG5SurfaceThresholdEventParams_t *surfThresh )
3012 MHEG5displaySetSurfaceThreshold(surfThresh->pixels);
3013 MHEG5groupDestroySurfaces(surfThresh->pixels);
3034 event_msg.proc_msg_func = SetSurfaceThreshold;
3035 event_msg.data_type = DT_NONE;
3036 event_msg.data.surfaceThreshold.pixels = pixels;
3038 result =
VQ_PutMsg(&event_msg, PRTY_HIGH);
3039 if (result != MHERR_OK)
3041 TRACE(TERROR, (
"VQ_PutMsg Failed"));
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.
void MHEG5displayAudioStop(void)
Stops playback of the audio media decoder.
Distributor for Prepare, Destruct, Activate, Deactivate and Clone calls. Distribute the +Prepare +Des...
E_MhegErr DVB_MhegAudioPlayDefault(void)
MHEG5 engine gives control of Audio to external application. Set decoding and presentation of Audio a...
void MHEG5displayHotspot(MHEG5Visible *visible, int x1, int y1, int x2, int y2)
Draw a Hotspot.
void MHEG5displayStreamStop(MHEG5Stream *stream)
Stops playback of all active component of the specified stream object.
void MHEG5displayLockStreams(void)
Lock streams, disallow any stream updates.
void MHEG5displayStreamPlay(MHEG5Stream *stream)
Begin playback of all active components in the specifed stream object.
void MG_OSDdisplayDynamicLineart(void *data, S_REGION *overlap, int x, int y)
Display dynamic lineart.
Stream event subscription management.
void MG_FreeData(void *data)
free surface buffer
void DVB_MhegSetVideoScaling(S_RECTANGLE *scaling)
Set Mheg video scaling.
void MHEG5displaySwitchbutton(MHEG5Visible *visible, int x1, int y1, int x2, int y2)
Draw a Switchbutton.
void MHEG5streamFindCurrentService(void)
Find the current service (i.e. the service corresponding to the currently running Video...
void MG_OSDclear(void)
Clear the screen, making it the specified colour.
void MHEG5displayIFrameStart(MHEG5Bitmap *bitmap)
Start displaying an I-Frame.
E_MhegErr DVB_MhegVideoStopStream(void)
MHEG5 engine takes control of Video - and specifies that decoding and presentation of any Video strea...
void MHEG5stringDestruct(MHEG5String *item)
Destruct a MHEG5String.
OSDColor OSDgetColour(const char *colour, int len)
Converts an MHEG5 colour value to an OSDColor type.
void MHEG5displayUpdate(void)
Update the display, redrawing any visible objects that are in the dirty rectangle.
DVB Video functions are required by MHEG5 engine. All required functions should be non-blocking...
void MHEG5displayResetStreamDecoders(BOOLEAN update)
Reset all media decoders to default values. This is used when the MHEG-5 engine is terminated...
E_MhegErr DVB_MhegVideoPlayStream(S_DvbComponent *pDvbComponent)
MHEG5 engine takes control of Video - and informs that Video must be switched to the specified Video ...
This file defines the profile for the MHEG engine.
void MHEG5displayRtgraphicsPlay(MHEG5RTGraphics *rtgraphics)
Begin playback of the specified RTGraphics object.
E_MhegErr DVB_MhegVideoSetUpdating(E_VideoState displayState)
Switch between frozen or unfrozen video display (reacting on either the current or subsequent frame)...
void MHEG5displayVideoPlay(MHEG5Video *video)
Begin playback of the specified video object.
Event handling. Implementation of a combined queue for events and actions. This is the eventsystem wh...
BOOLEAN MHEG5StreamerIsRunable(MHEG5Stream *stream)
Check that stream is runable (i.e. MHEG5StreamerPrepare has been called for it)
void MHEG5displayShowAll(void)
Redisplay all active visible objects. AKD: Optimised 12/5/99.
Implement functions to retrieve MHEG5objects by GroupID and ID.
Implementation of the MHEG5 Application Class Defines a set of Ingredient objects, which are shared within an application scope. Base class: Group Subclasses: None Status: Concrete class.
void MG_OSDdisplayVideo(S_REGION rgn)
Display video window.
Mheg5 logging and debug printing.
void MHEG5initDynamicLineart(MHEG5DynamicLineart *dynamicLineart)
Create the canvas for a dynamic lineart object.
void MG_OSDdisplayRectangle(S_REGION *overlap, int x, int y, int width, int height, int lineWidth, OSDColor lineColour, OSDColor fillColour)
Draw rectangle.
MHEG class interface to graphics text render.
void MHEG5StreamerRefresh(void)
Refresh any running IC streams - called when user preferences have changed.
E_MhegErr DVB_MhegAudioStopClip(void)
Instruct the controlling application that playback of the previously supplied audio clip should be st...
DVB Audio functions are required by MHEG5 engine. All required functions should be non-blocking...
void MHEG5displayIFrameStop(void)
Stop displaying an I-Frame.
void MHEG5displayClear(void)
<Function description>="">
E_MhegErr DVB_MhegAudioPlayStream(S_DvbComponent *pDvbComponent)
MHEG5 engine takes control of Audio - and informs that Audio must be switched to the specified Audio ...
OSDColor MHEG5displayColour(MHEG5Colour *colour)
Convert Generic Colour value to OSD specific value. If the generic colour is encoded as a string it i...
MHEG5Scene * MHEG5getCurrentScene(void)
<Function description>="">
void MHEG5sendEvent(MHEG5Root *source, MHEG5EventType event, MHEG5Int data)
Store an event in the asynchronous event queue.
void MHEG5displayAudioPlay(MHEG5Audio *audio)
Begin playback of the specified audio object.
void MHEG5streamSetCurrentService(MHEG5Ingredient *item, S_DvbComponent *service)
Set the current service.
MHEG5Int MHEG5streamGetComponentTag(MHEG5Ingredient *item)
Get component tag for ingredient. This depends on the stream's content and the component tag of the i...
void MG_OSDerase(S_REGION rgn, OSDColor colour)
Erase an area of the OSD to the desktop colour.
void MHEG5displayRtGraphicsReset(void)
Reset all media decoders to default values. This is used when the MHEG-5 engine is terminated...
Interaction Channel Streaming functions required by MHEG5 engine References: [1] UK1 Profile - Digita...
Definition of colour type for MHEG5 - settings and conversions.
void MHEG5StreamerRun(MHEG5Stream *stream)
Start streaming IP content for a prepared request.
E_MhegErr DVB_MhegAudioPlayClip(U8BIT *pAudioData, U32BIT dataLength, U32BIT repeatCount, E_AudioEncoding encoding)
Instruct the controlling application that the provided audio sound clip should be played...
void MHEG5freeDynamicLineart(MHEG5DynamicLineart *dynamicLineart)
Create the canvas for a dynamic lineart object.
E_MhegErr DVB_MhegVideoPlayDefault(void)
MHEG5 engine gives control of Video to external application. Set decoding and presentation of Video a...
E_MhegErr MHEG5_SetSurfaceThreshold(S32BIT pixels)
Set the minimum number of pixels that force the MHEG-5 engine to release a surface immediately after ...
E_MhegErr DVB_MhegAudioSetVolume(S32BIT volumeAdjust)
Adjust sound level for any external application sourced audio. A setting of 0 dB means leave the audi...
Implement generic MHEG5-display functions - independent from the OSD These are generic functions used...
void MHEG5displayRtgraphicsStop(void)
Stops playback of the RTGraphics (subtitle) media decoder.
E_MhegErr DVB_MhegICStreamAudioSetVolume(S32BIT volumeAdjust)
Set volume for audio component of the currently playing IC stream This function is equivalent to DVB_...
void MHEG5displayPushbutton(MHEG5Visible *visible, int x1, int y1, int x2, int y2)
Draw a Pushbutton.
Video Scaling / Positioning functionality.
E_MhegErr DVB_MhegAudioSetSpeed(E_AudioSpeed speed)
Instruct the controlling application that playback of the previously supplied audio clip should be pa...
E_MhegErr DVB_MhegAudioStopStream(void)
MHEG5 engine takes control of Audio - and specifies that decoding and presentation of any Audio strea...
void MHEG5displaySetVolume(MHEG5Int volume)
Volume Control.
void MHEG5displayLineart(int x1, int y1, int boxX1, int boxY1, int boxX2, int boxY2, MHEG5Bool bbbox, MHEG5Int lineWidth, MHEG5Int lineStyle, MHEG5Colour *refLineColour, MHEG5Colour *refFillColour)
Draw a Lineart Object.
E_MhegErr DVB_MhegVideoPlayIFrame(U8BIT *pVideoData, U32BIT dataLength, E_VideoEncoding encoding)
Instruct the controlling application to decode supplied video data. The I-Frame is displayed in the v...
void MHEG5displayUnlockStreams(void)
Unlock streams, allow stream updates.
E_MhegErr DVB_MhegVideoStopIFrame(void)
Instruct the controlling application to stop displaying the previously supplied video data in DVB_Mhe...
void MHEG5displayRtGraphicsUpdate(MHEG5Bool terminating, MHEG5Bool fullScreen)
void MHEG5displayVideoStop(void)
Stops playback of the video media decoder.
MHEG5Application * MHEG5getCurrentApplication(void)
<Function description>="">