45 #define DBG(x) do { STB_SPDebugNoCnWrite x; } while (0) 62 AFD_PREFERENCE_16_9_LB,
63 AFD_PREFERENCE_14_9_LB,
78 E_ASPECT_RATIO video_aspect_ratio;
79 E_ASPECT_RATIO display_aspect_ratio;
80 E_AFD_PREFERENCE afd_preference;
81 E_FORMAT_CONVERSION transformation;
116 E_AFD_PREFERENCE afd_preference;
117 E_VIDEO_ASPECT_MODE alignment;
118 E_ASPECT_RATIO mheg_aspect_ratio;
119 E_VIDEO_ASPECT_MODE mheg_wam;
125 BOOLEAN mheg_enabled;
126 BOOLEAN mheg_scaling_given;
127 BOOLEAN app_scaling_enabled;
128 BOOLEAN user_pref_changed;
129 BOOLEAN settings_changed;
131 U16BIT mheg_resolution_width;
132 U16BIT mheg_resolution_height;
133 U16BIT resolution_width;
134 U16BIT resolution_height;
138 U16BIT screen_height;
139 E_ASPECT_RATIO video_aspect_ratio;
140 E_ASPECT_RATIO display_aspect_ratio;
141 E_STB_AV_DECODER_STATUS decoder_status;
144 F_VT_NOTIFICATION_CALLBACK video_callback;
145 void *video_callback_userdata;
146 F_VT_NOTIFICATION_CALLBACK userpref_callback;
147 void *userpref_callback_userdata;
157 { 0, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_PILLAR_BOX },
158 { 0, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_16_9_LB, FORMAT_CONVERSION_LETTERBOX },
159 { 0, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_14_9_LB, FORMAT_CONVERSION_LETTERBOX_14_9 },
160 { 0, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_CCO, FORMAT_CONVERSION_PANSCAN },
161 { 0, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_LETTERBOX },
163 { 1, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_PILLAR_BOX },
164 { 1, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_PANSCAN },
166 { 2, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_ZOOM_4_3 },
167 { 2, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_LETTERBOX },
169 { 3, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_ZOOM_14_9 },
170 { 3, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_16_9_LB, FORMAT_CONVERSION_LETTERBOX_14_9 },
171 { 3, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_CCO, FORMAT_CONVERSION_PANSCAN },
172 { 3, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_LETTERBOX_14_9 },
174 { 5, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_ZOOM_14_9 },
175 { 5, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_PANSCAN },
176 { 5, ASPECT_RATIO_16_9, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_PANSCAN_14_9 },
178 { 6, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_ZOOM_4_3 },
179 { 6, ASPECT_RATIO_4_3, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_CENTRE_14_9 },
180 { 6, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_16_9_LB, FORMAT_CONVERSION_LETTERBOX },
181 { 6, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_14_9_LB, FORMAT_CONVERSION_LETTERBOX_14_9 },
182 { 6, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_CCO, FORMAT_CONVERSION_PANSCAN },
183 { 6, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_LETTERBOX_14_9 },
185 { 7, ASPECT_RATIO_4_3, ASPECT_RATIO_16_9, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_ZOOM_4_3 },
186 { 7, ASPECT_RATIO_4_3, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_CENTRE_4_3 },
187 { 7, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_16_9_LB, FORMAT_CONVERSION_LETTERBOX },
188 { 7, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_14_9_LB, FORMAT_CONVERSION_LETTERBOX_14_9 },
189 { 7, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_CCO, FORMAT_CONVERSION_PANSCAN },
190 { 7, ASPECT_RATIO_16_9, ASPECT_RATIO_4_3, AFD_PREFERENCE_AUTO, FORMAT_CONVERSION_PANSCAN }
201 static void InitRect(
S_RECTANGLE *rect, S32BIT left, S32BIT top,
202 S32BIT width, S32BIT height);
228 static void VTC_IdentityMatrix(
S_VT_MATRIX *matrix);
268 static void VTC_RectangleToFractRectangle(
S_RECTANGLE *rectangle,
335 static S_VT_FRACTION MakeFraction(S32BIT numerator, S32BIT denominator);
337 static S_VT_FRACT_RECT MakeRectangle(S32BIT left, S32BIT top, S32BIT width, S32BIT height);
352 new_state = malloc(
sizeof *new_state);
353 if (new_state != NULL)
355 new_state->mheg_enabled = options->mheg_required;
356 new_state->afd_enabled = options->afd_required;
357 new_state->hbb_enabled = options->hbbtv_required;
359 new_state->afd_preference = AFD_PREFERENCE_AUTO;
360 new_state->alignment = ASPECT_MODE_AUTO;
362 new_state->mheg_aspect_ratio = ASPECT_UNDEFINED;
363 new_state->mheg_wam = ASPECT_MODE_4_3;
365 InitRect(&new_state->mheg_scaling_rect, 0, 0, SD_WIDTH, SD_HEIGHT);
366 new_state->mheg_resolution_width = SD_WIDTH;
367 new_state->mheg_resolution_height = SD_HEIGHT;
368 new_state->mheg_scaling_given = FALSE;
370 InitRect(&new_state->app_scaling_window, 0, 0, SD_WIDTH, SD_HEIGHT);
371 new_state->app_scaling_enabled = FALSE;
373 InitRect(&new_state->hbb_window_rect, 0, 0, HD_WIDTH, HD_HEIGHT);
375 new_state->resolution_width = SD_WIDTH;
376 new_state->resolution_height = SD_HEIGHT;
378 new_state->video_width = SD_WIDTH;
379 new_state->video_height = SD_HEIGHT;
381 new_state->screen_width = SD_WIDTH;
382 new_state->screen_height = SD_HEIGHT;
384 new_state->video_aspect_ratio = ASPECT_RATIO_4_3;
385 new_state->display_aspect_ratio = ASPECT_RATIO_16_9;
389 new_state->decoder_status = DECODER_STATUS_NONE;
391 new_state->video_callback = NULL;
392 new_state->video_callback_userdata = NULL;
393 new_state->userpref_callback = NULL;
394 new_state->userpref_callback_userdata = NULL;
395 new_state->user_pref_changed = FALSE;
396 new_state->custom_mode_callback = NULL;
398 new_state->settings_changed = FALSE;
399 new_state->updating = FALSE;
401 InitRect(&new_state->input_rectangle, 0, 0, SD_WIDTH, SD_HEIGHT);
402 InitRect(&new_state->output_rectangle, 0, 0, SD_WIDTH, SD_HEIGHT);
414 ASSERT(context != NULL);
428 ASSERT(context != NULL);
431 if (state->updating != enable)
433 state->updating = enable;
434 if ((enable) && (state->settings_changed))
450 ASSERT(context != NULL);
453 if (state->afd != afd_value)
455 state->afd = afd_value;
456 state->settings_changed = TRUE;
457 if ((state->updating) && (UpdateOnAfdChange(state)))
473 ASSERT(context != NULL);
476 if (state->video_aspect_ratio != aspect_ratio)
478 state->video_aspect_ratio = aspect_ratio;
479 state->settings_changed = TRUE;
495 E_ASPECT_RATIO aspect_ratio;
497 ASSERT(context != NULL);
500 aspect_ratio = state->video_aspect_ratio;
514 ASSERT(context != NULL);
517 if (state->mheg_aspect_ratio != aspect_ratio)
519 state->mheg_aspect_ratio = aspect_ratio;
520 state->settings_changed = TRUE;
521 if ((state->updating) && (state->mheg_enabled))
537 ASSERT(context != NULL);
540 return state->display_aspect_ratio;
552 ASSERT(context != NULL);
555 if (state->display_aspect_ratio != aspect_ratio)
557 state->display_aspect_ratio = aspect_ratio;
558 state->settings_changed = TRUE;
576 ASSERT(context != NULL);
578 if (state->alignment != alignment)
580 if (state->display_aspect_ratio == ASPECT_RATIO_4_3)
585 case ASPECT_MODE_16_9:
586 state->afd_preference = AFD_PREFERENCE_16_9_LB;
589 case ASPECT_MODE_ZOOM:
590 case ASPECT_MODE_4_3:
591 state->afd_preference = AFD_PREFERENCE_CCO;
594 case ASPECT_MODE_14_9:
595 state->afd_preference = AFD_PREFERENCE_14_9_LB;
601 state->afd_preference = AFD_PREFERENCE_AUTO;
603 state->alignment = alignment;
604 state->user_pref_changed = TRUE;
605 state->settings_changed = TRUE;
617 ASSERT(context != NULL);
620 state->custom_mode_callback = callback;
637 ASSERT(context != NULL);
641 state->mheg_resolution_width = width;
642 state->mheg_resolution_height = height;
643 if (state->mheg_enabled)
645 state->resolution_width = width;
646 state->resolution_height = height;
661 ASSERT(context != NULL);
666 state->mheg_scaling_given = FALSE;
670 state->mheg_scaling_given = TRUE;
671 state->mheg_scaling_rect = *scaling;
673 state->settings_changed = TRUE;
674 if ((state->updating) && (state->mheg_enabled))
690 ASSERT(context != NULL);
696 state->app_scaling_enabled = FALSE;
700 state->app_scaling_enabled = TRUE;
701 state->app_scaling_window = *window;
703 UpdateResolution(state);
704 state->settings_changed = TRUE;
721 ASSERT(context != NULL);
724 if ((state->video_width != width) ||
725 (state->video_height != height))
727 state->video_width = width;
728 state->video_height = height;
729 state->settings_changed = TRUE;
748 ASSERT(context != NULL);
751 if ((state->screen_width != width) ||
752 (state->screen_height != height))
754 state->screen_width = width;
755 state->screen_height = height;
756 state->settings_changed = TRUE;
774 ASSERT(context != NULL);
777 state->mheg_wam = mode;
778 state->settings_changed = TRUE;
779 if (state->updating && state->mheg_enabled)
794 ASSERT(context != NULL);
797 state->mheg_enabled = enable;
798 state->settings_changed = TRUE;
799 UpdateResolution(state);
815 ASSERT(context != NULL);
818 state->hbb_enabled = enable;
819 state->settings_changed = TRUE;
820 UpdateResolution(state);
836 ASSERT(context != NULL);
841 state->hbb_window_rect.top = 0;
842 state->hbb_window_rect.left = 0;
843 state->hbb_window_rect.width = HD_WIDTH;
844 state->hbb_window_rect.height = HD_HEIGHT;
848 state->hbb_window_rect = *output;
850 state->settings_changed = TRUE;
851 if ((state->updating) && (state->hbb_enabled))
868 ASSERT(context != NULL);
870 *input_rect = state->input_rectangle;
871 *output_rect = state->output_rectangle;
883 ASSERT(context != NULL);
899 F_VT_NOTIFICATION_CALLBACK callback,
904 ASSERT(context != NULL);
907 state->video_callback = callback;
908 state->video_callback_userdata = user_data;
922 F_VT_NOTIFICATION_CALLBACK callback,
927 ASSERT(context != NULL);
930 state->userpref_callback = callback;
931 state->userpref_callback_userdata = user_data;
941 E_FORMAT_CONVERSION format_conversion;
944 ASSERT(context != NULL);
946 VTC_IdentityMatrix(&transform);
947 VTC_IdentityMatrix(&clip_transform);
948 format_conversion = GetVideoTransformation(context, &transform,
951 return format_conversion;
964 ASSERT(context != NULL);
967 *width = state->screen_width;
968 *height = state->screen_height;
981 ASSERT(context != NULL);
984 if ((state->video_width <= SD_WIDTH) || (state->video_height <= SD_HEIGHT))
989 else if (state->video_height < FULL_HD_HEIGHT)
991 *width = state->video_width;
996 *width = state->video_width;
997 *height = FULL_HD_HEIGHT;
1011 ASSERT(context != NULL);
1013 if (state->display_aspect_ratio == ASPECT_RATIO_16_9 &&
1014 state->mheg_aspect_ratio == ASPECT_RATIO_4_3)
1033 ASSERT(context != NULL);
1035 state->decoder_status = status;
1036 state->settings_changed = TRUE;
1038 if (state->updating)
1053 ASSERT(context != NULL);
1056 return state->decoder_status;
1071 if ((scaling->width == state->mheg_resolution_width / 2) && (scaling->height == state->mheg_resolution_height / 2))
1073 return MHEG_SCALING_QUARTER;
1075 else if ((scaling->width == state->mheg_resolution_width) && (scaling->height == state->mheg_resolution_height))
1077 if ((scaling->top == 0) && (scaling->left == 0))
1079 return MHEG_SCALING_NONE;
1083 return MHEG_SCALING_OFFSET;
1088 return MHEG_SCALING_OTHER;
1108 if (!state->afd_enabled)
1113 if (state->mheg_enabled)
1116 if (state->mheg_aspect_ratio == ASPECT_UNDEFINED &&
1117 MhegScalingType(state) == MHEG_SCALING_NONE &&
1118 state->alignment == ASPECT_MODE_AUTO)
1125 if (state->alignment == ASPECT_MODE_AUTO)
1150 E_FORMAT_CONVERSION transform;
1152 if (state->alignment == ASPECT_MODE_AUTO)
1154 transform = VTC_AfdScaling(state, current);
1158 transform = VTC_UserPreferenceScaling(state, current);
1176 CalculateMhegScaling(state);
1182 input_rectangle.top = 0;
1183 input_rectangle.left = 0;
1184 input_rectangle.width = state->video_width;
1185 input_rectangle.height = state->video_height;
1187 temp_wss = GetWss(state);
1189 VTC_IdentityMatrix(&transform);
1190 VTC_IdentityMatrix(&clip_transform);
1192 if (state->decoder_status == DECODER_STATUS_VIDEO)
1194 GetVideoTransformation(state, &transform, &clip_transform);
1196 else if (state->decoder_status == DECODER_STATUS_IFRAME)
1198 GetIframeTransformation(state, &transform, &clip_transform);
1201 VTC_RectangleToFractRectangle(&input_rectangle, &input);
1204 DBG((
"Clip transform:\n"));
1205 PrintMatrix(&clip_transform);
1207 VTC_TransformRectangles(state, &transform, &clip_transform, &input, &output);
1210 VTC_ApplyWSS(state, &output);
1212 VTC_FractRectangleToRectangle(&input, &input_rectangle);
1213 VTC_FractRectangleToRectangle(&output, &output_rectangle);
1217 if ((RectanglesDiffer(&input_rectangle, &state->input_rectangle)) ||
1218 (RectanglesDiffer(&output_rectangle, &state->output_rectangle)))
1223 state->input_rectangle = input_rectangle;
1224 state->output_rectangle = output_rectangle;
1225 state->wss = temp_wss;
1227 if (state->video_callback != NULL)
1229 state->video_callback(state->video_callback_userdata);
1232 DBG((
"user_pref_changed = %d, changed = %d\n",
1233 state->user_pref_changed, changed));
1234 if (state->user_pref_changed && state->userpref_callback != NULL && changed)
1236 DBG((
"Calling userpref changed callback\n"));
1237 state->userpref_callback(state->userpref_callback_userdata);
1240 state->user_pref_changed = FALSE;
1241 state->settings_changed = FALSE;
1257 E_FORMAT_CONVERSION transform_type;
1259 transform_type = FORMAT_CONVERSION_IGNORE;
1261 DBG((
"Initial transformation:\n"));
1262 PrintMatrix(transform);
1264 VTC_VideoCsScaling(state, transform);
1265 DBG((
"VTC_VideoCsScaling:\n"));
1266 PrintMatrix(transform);
1268 if (state->app_scaling_enabled)
1271 transform_type = AfdOrUserPreferenceTransform(state, transform);
1272 DBG((
"AppScalingTransform:\n"));
1273 PrintMatrix(transform);
1275 VTC_AppScaling(state, transform);
1276 VTC_AppScaling(state, clip_transform);
1277 DBG((
"VTC_AppScaling:\n"));
1278 PrintMatrix(transform);
1280 else if (state->hbb_enabled)
1282 VTC_HbbScaleToScreen(state, transform);
1283 VTC_HbbScaleToScreen(state, clip_transform);
1284 DBG((
"VTC_HbbScaleToScreen:\n"));
1285 PrintMatrix(transform);
1289 if (state->mheg_enabled)
1291 if (MhegScalingType(state) == MHEG_SCALING_QUARTER)
1293 transform_type = VTC_QuarterScreenScaling(state, transform);
1295 else if (state->mheg_aspect_ratio == ASPECT_UNDEFINED)
1297 if ((MhegScalingType(state) == MHEG_SCALING_NONE) ||
1298 (MhegScalingType(state) == MHEG_SCALING_OFFSET))
1300 transform_type = AfdOrUserPreferenceTransform(state, transform);
1301 DBG((
"AfdOrUserPreferenceTransform:\n"));
1302 PrintMatrix(transform);
1307 VTC_SceneArScaling(state, transform);
1308 DBG((
"VTC_SceneArScaling:\n"));
1309 PrintMatrix(transform);
1312 VTC_MhegScaling(state, transform);
1313 VTC_MhegScaling(state, clip_transform);
1314 DBG((
"VTC_MhegScaling:\n"));
1315 PrintMatrix(transform);
1319 transform_type = AfdOrUserPreferenceTransform(state, transform);
1320 DBG((
"AfdOrUserPreferenceTransform:\n"));
1321 PrintMatrix(transform);
1325 VTC_ToScreen(state, transform);
1326 VTC_ToScreen(state, clip_transform);
1327 DBG((
"VTC_ToScreen:\n"));
1328 PrintMatrix(transform);
1331 return transform_type;
1347 E_FORMAT_CONVERSION transform_type;
1349 transform_type = FORMAT_CONVERSION_IGNORE;
1351 DBG((
"Initial transformation:\n"));
1352 PrintMatrix(transform);
1354 VTC_VideoCsScaling(state, transform);
1355 DBG((
"VTC_VideoCsScaling:\n"));
1356 PrintMatrix(transform);
1358 if (state->mheg_enabled)
1360 VTC_MhegScaling(state, transform);
1361 DBG((
"VTC_MhegScaling:\n"));
1362 PrintMatrix(transform);
1367 VTC_ToScreen(state, transform);
1368 VTC_ToScreen(state, clip_transform);
1369 DBG((
"VTC_ToScreen:\n"));
1370 PrintMatrix(transform);
1372 return transform_type;
1381 if (!state->mheg_scaling_given)
1383 InitRect(&state->mheg_scaling_rect, 0, 0, state->mheg_resolution_width, state->mheg_resolution_height);
1396 if (a->left != b->left)
1400 if (a->top != b->top)
1404 if (a->width != b->width)
1408 if (a->height != b->height)
1423 static void InitRect(
S_RECTANGLE *rect, S32BIT left, S32BIT top,
1424 S32BIT width, S32BIT height)
1428 rect->width = width;
1429 rect->height = height;
1439 if (state->video_aspect_ratio == ASPECT_RATIO_4_3)
1464 if (state->display_aspect_ratio == ASPECT_RATIO_4_3)
1469 switch (state->afd_preference)
1471 case AFD_PREFERENCE_AUTO:
1472 case AFD_PREFERENCE_16_9_LB:
1475 case AFD_PREFERENCE_14_9_LB:
1478 case AFD_PREFERENCE_CCO:
1495 if (state->afd_preference == AFD_PREFERENCE_CCO)
1510 if (state->afd_preference == AFD_PREFERENCE_CCO)
1514 else if (state->afd_preference == AFD_PREFERENCE_14_9_LB)
1541 DBG((
"Conversion state:\n"));
1542 DBG((
" mheg_enabled : %s\n",
1543 state->mheg_enabled ?
"TRUE" :
"FALSE"));
1544 DBG((
" afd_enabled : %s\n",
1545 state->afd_enabled ?
"TRUE" :
"FALSE"));
1546 DBG((
" hbb_enabled : %s\n",
1547 state->hbb_enabled ?
"TRUE" :
"FALSE"));
1548 DBG((
" afd_preference : %s\n",
1549 state->afd_preference == AFD_PREFERENCE_AUTO ?
"AFD_PREFERENCE_AUTO" :
1550 state->afd_preference == AFD_PREFERENCE_16_9_LB ?
"AFD_PREFERENCE_16_9_LB" :
1551 state->afd_preference == AFD_PREFERENCE_14_9_LB ?
"AFD_PREFERENCE_14_9_LB" :
1552 state->afd_preference == AFD_PREFERENCE_CCO ?
"AFD_PREFERENCE_CCO" :
1554 DBG((
" alignment : %s\n",
1555 state->alignment == ASPECT_MODE_4_3 ?
"ASPECT_MODE_4_3" :
1556 state->alignment == ASPECT_MODE_14_9 ?
"ASPECT_MODE_14_9" :
1557 state->alignment == ASPECT_MODE_16_9 ?
"ASPECT_MODE_16_9" :
1558 state->alignment == ASPECT_MODE_AUTO ?
"ASPECT_MODE_AUTO" :
1559 state->alignment == ASPECT_MODE_CUSTOM ?
"ASPECT_MODE_CUSTOM" :
1561 DBG((
" afd : %d\n", state->afd));
1562 DBG((
" mheg_aspect_ratio : %s\n",
1563 state->mheg_aspect_ratio == ASPECT_RATIO_4_3 ?
"ASPECT_RATIO_4_3" :
1564 state->mheg_aspect_ratio == ASPECT_RATIO_16_9 ?
"ASPECT_RATIO_16_9" :
1565 state->mheg_aspect_ratio == ASPECT_UNDEFINED ?
"ASPECT_UNSPECIFIED" :
1568 state->mheg_wam == ASPECT_MODE_AUTO ?
"ALIGNMENT_MODE_NONE" :
1569 state->mheg_wam == ASPECT_MODE_4_3 ?
"ALIGNMENT_MODE_CCO" :
1570 state->mheg_wam == ASPECT_MODE_16_9 ?
"ALIGNMENT_MODE_LB" :
1572 DBG((
" mheg_scaling_rect : { l=%ld, t=%ld, w=%ld, h=%ld }\n",
1573 state->mheg_scaling_rect.left,
1574 state->mheg_scaling_rect.top,
1575 state->mheg_scaling_rect.width,
1576 state->mheg_scaling_rect.height));
1577 DBG((
" hbb_window_rect : { l=%ld, t=%ld, w=%ld, h=%ld }\n",
1578 state->hbb_window_rect.left,
1579 state->hbb_window_rect.top,
1580 state->hbb_window_rect.width,
1581 state->hbb_window_rect.height));
1582 DBG((
" mheg_scaling_given : %s\n",
1583 state->mheg_scaling_given ?
"TRUE" :
"FALSE"));
1584 DBG((
" mheg_resolution : { w=%d, h=%d}\n",
1585 state->mheg_resolution_width, state->mheg_resolution_height));
1586 DBG((
" resolution : { w=%d, h=%d}\n",
1587 state->resolution_width, state->resolution_height));
1588 DBG((
" video_width : %d\n",
1589 state->video_width));
1590 DBG((
" video_height : %d\n",
1591 state->video_height));
1592 DBG((
" screen_width : %d\n",
1593 state->screen_width));
1594 DBG((
" screen_height : %d\n",
1595 state->screen_height));
1596 DBG((
" video_aspect_ratio : %s\n",
1597 state->video_aspect_ratio == ASPECT_RATIO_4_3 ?
"ASPECT_RATIO_4_3" :
1598 state->video_aspect_ratio == ASPECT_RATIO_16_9 ?
"ASPECT_RATIO_16_9" :
1599 state->video_aspect_ratio == ASPECT_UNDEFINED ?
"ASPECT_UNDEFINED" :
1601 DBG((
" display_aspect_ratio : %s\n",
1602 state->display_aspect_ratio == ASPECT_RATIO_4_3 ?
"ASPECT_RATIO_4_3" :
1603 state->display_aspect_ratio == ASPECT_RATIO_16_9 ?
"ASPECT_RATIO_16_9" :
1604 state->display_aspect_ratio == ASPECT_UNDEFINED ?
"ASPECT_UNDEFINED" :
1614 DBG((
"matrix: A:%ld/%ld B:%ld/%ld C:%ld/%ld D:%ld/%ld\n",
1615 matrix->a.numerator,
1616 matrix->a.denominator,
1617 matrix->b.numerator,
1618 matrix->b.denominator,
1619 matrix->c.numerator,
1620 matrix->c.denominator,
1621 matrix->d.numerator,
1622 matrix->d.denominator));
1630 DBG((
"fract_rect: Width:%ld/%ld Height:%ld/%ld Left:%ld/%ld Top:%ld/%ld\n",
1631 fract_rect->width.numerator,
1632 fract_rect->width.denominator,
1633 fract_rect->height.numerator,
1634 fract_rect->height.denominator,
1635 fract_rect->left.numerator,
1636 fract_rect->left.denominator,
1637 fract_rect->top.numerator,
1638 fract_rect->top.denominator));
1646 static void VTC_IdentityMatrix(
S_VT_MATRIX *matrix)
1648 matrix->a = MakeFraction(1, 1);
1649 matrix->b = MakeFraction(0, 1);
1650 matrix->c = MakeFraction(1, 1);
1651 matrix->d = MakeFraction(0, 1);
1664 if (state->video_width == 352 && state->video_height == 288)
1666 Scale_352_288_Video(state, &transform);
1668 else if (state->video_width == 352 && state->video_height == 576)
1670 Scale_352_576_Video(state, &transform);
1672 else if (state->video_width == 480 && state->video_height == 576)
1674 Scale_480_576_Video(state, &transform);
1676 else if (state->video_width == 544 && state->video_height == 576)
1678 Scale_544_576_Video(state, &transform);
1682 Scale_Video(state, &transform);
1685 MultiplyMatrices(&transform, current, current);
1697 E_FORMAT_CONVERSION transformation;
1700 VTC_IdentityMatrix(&transform);
1701 transformation = FORMAT_CONVERSION_IGNORE;
1703 if (state->alignment == ASPECT_MODE_CUSTOM)
1705 if (state->custom_mode_callback != NULL)
1707 transformation = state->custom_mode_callback(state->video_aspect_ratio,
1708 state->display_aspect_ratio);
1709 switch (transformation)
1711 case FORMAT_CONVERSION_PANSCAN:
1713 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height,
1717 case FORMAT_CONVERSION_LETTERBOX:
1719 Scale_16_9_Letterbox(state, state->resolution_width, state->resolution_height,
1723 case FORMAT_CONVERSION_LETTERBOX_14_9:
1725 Scale_14_9_Letterbox(state, state->resolution_width, state->resolution_height,
1729 case FORMAT_CONVERSION_PILLAR_BOX:
1731 Scale_Pillarbox(state, state->resolution_width, state->resolution_height,
1735 case FORMAT_CONVERSION_ZOOM_4_3:
1737 Scale_4_3_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1740 case FORMAT_CONVERSION_ZOOM_14_9:
1742 Scale_14_9_Zoom(state, state->resolution_width, state->resolution_height,
1746 case FORMAT_CONVERSION_PANSCAN_14_9:
1748 Scale_16_9_Zoom(state, state->resolution_width, state->resolution_height,
1752 case FORMAT_CONVERSION_CENTRE_14_9:
1754 Scale_14_9_Centre(state, state->resolution_width, state->resolution_height,
1758 case FORMAT_CONVERSION_CENTRE_4_3:
1760 Scale_4_3_Centre(state, state->resolution_width, state->resolution_height,
1774 if (state->display_aspect_ratio == ASPECT_RATIO_4_3)
1777 if (state->video_aspect_ratio == ASPECT_RATIO_4_3)
1779 switch (state->alignment)
1781 case ASPECT_MODE_16_9:
1782 Scale_4_3_Centre(state, state->resolution_width, state->resolution_height, &transform);
1783 transformation = FORMAT_CONVERSION_CENTRE_4_3;
1785 case ASPECT_MODE_14_9:
1786 Scale_14_9_Centre(state, state->resolution_width, state->resolution_height, &transform);
1787 transformation = FORMAT_CONVERSION_CENTRE_14_9;
1794 else if (state->video_aspect_ratio == ASPECT_RATIO_16_9)
1796 switch (state->alignment)
1798 case ASPECT_MODE_16_9:
1800 Scale_16_9_Letterbox(state, state->resolution_width, state->resolution_height, &transform);
1801 transformation = FORMAT_CONVERSION_LETTERBOX;
1803 case ASPECT_MODE_14_9:
1804 Scale_14_9_Letterbox(state, state->resolution_width, state->resolution_height, &transform);
1805 transformation = FORMAT_CONVERSION_LETTERBOX_14_9;
1807 case ASPECT_MODE_4_3:
1808 case ASPECT_MODE_ZOOM:
1809 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
1810 transformation = FORMAT_CONVERSION_PANSCAN;
1815 else if (state->display_aspect_ratio == ASPECT_RATIO_16_9)
1818 if (state->video_aspect_ratio == ASPECT_RATIO_4_3)
1821 switch (state->alignment)
1823 case ASPECT_MODE_16_9:
1824 case ASPECT_MODE_ZOOM:
1825 Scale_4_3_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1826 transformation = FORMAT_CONVERSION_ZOOM_4_3;
1828 case ASPECT_MODE_14_9:
1829 Scale_14_9_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1830 transformation = FORMAT_CONVERSION_ZOOM_14_9;
1832 case ASPECT_MODE_4_3:
1834 Scale_Pillarbox(state, state->resolution_width, state->resolution_height, &transform);
1835 transformation = FORMAT_CONVERSION_PILLAR_BOX;
1839 else if (state->video_aspect_ratio == ASPECT_RATIO_16_9)
1842 switch (state->alignment)
1844 case ASPECT_MODE_4_3:
1845 Scale_Pillarbox(state, state->resolution_width, state->resolution_height, &transform);
1846 transformation = FORMAT_CONVERSION_PILLAR_BOX;
1848 case ASPECT_MODE_14_9:
1849 Scale_16_9_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1850 transformation = FORMAT_CONVERSION_PANSCAN_14_9;
1859 MultiplyMatrices(&transform, current, current);
1861 return transformation;
1874 E_FORMAT_CONVERSION transformation;
1878 transformation = FindAfdTransformation(state);
1879 switch (transformation)
1881 case FORMAT_CONVERSION_PILLAR_BOX:
1882 Scale_Pillarbox(state, state->resolution_width, state->resolution_height, &transform);
1885 case FORMAT_CONVERSION_ZOOM_4_3:
1886 Scale_4_3_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1889 case FORMAT_CONVERSION_ZOOM_14_9:
1890 Scale_14_9_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1893 case FORMAT_CONVERSION_LETTERBOX:
1894 Scale_16_9_Letterbox(state, state->resolution_width, state->resolution_height, &transform);
1897 case FORMAT_CONVERSION_LETTERBOX_14_9:
1898 Scale_14_9_Letterbox(state, state->resolution_width, state->resolution_height, &transform);
1901 case FORMAT_CONVERSION_PANSCAN:
1902 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
1905 case FORMAT_CONVERSION_PANSCAN_14_9:
1906 Scale_16_9_Zoom(state, state->resolution_width, state->resolution_height, &transform);
1909 case FORMAT_CONVERSION_CENTRE_14_9:
1910 Scale_14_9_Centre(state, state->resolution_width, state->resolution_height, &transform);
1913 case FORMAT_CONVERSION_CENTRE_4_3:
1914 Scale_4_3_Centre(state, state->resolution_width, state->resolution_height, &transform);
1924 MultiplyMatrices(&transform, current, current);
1927 return transformation;
1940 MhegScaling(state, &transform);
1941 MultiplyMatrices(&transform, current, current);
1954 HbbScaling(state, &transform);
1955 DBG((
"HbbScaling:\n"));
1956 PrintMatrix(&transform);
1958 MultiplyMatrices(&transform, current, current);
1960 Scale_HbbToScreen(state, &transform);
1961 DBG((
"Scale_HbbToScreen:\n"));
1962 PrintMatrix(&transform);
1963 MultiplyMatrices(&transform, current, current);
1976 AppScaling(state, &transform);
1977 MultiplyMatrices(&transform, current, current);
1989 E_FORMAT_CONVERSION transformation;
1992 transformation = FORMAT_CONVERSION_IGNORE;
1994 NoScaling(state, &transform);
1995 if (state->mheg_aspect_ratio == ASPECT_UNDEFINED)
1997 if ((state->video_aspect_ratio == ASPECT_RATIO_4_3) &&
1998 (state->display_aspect_ratio == ASPECT_RATIO_16_9))
2001 transformation = FORMAT_CONVERSION_PILLAR_BOX;
2002 Scale_Pillarbox(state, state->resolution_width, state->resolution_height, &transform);
2004 else if ((state->video_aspect_ratio == ASPECT_RATIO_16_9) &&
2005 (state->display_aspect_ratio == ASPECT_RATIO_4_3))
2008 transformation = FORMAT_CONVERSION_PANSCAN;
2009 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
2012 else if ((state->mheg_aspect_ratio == ASPECT_RATIO_4_3) &&
2013 (state->video_aspect_ratio == ASPECT_RATIO_16_9))
2016 transformation = FORMAT_CONVERSION_PANSCAN;
2017 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
2019 else if ((state->mheg_aspect_ratio == ASPECT_RATIO_16_9) &&
2020 (state->video_aspect_ratio == ASPECT_RATIO_4_3) &&
2021 (state->display_aspect_ratio == ASPECT_RATIO_16_9))
2024 transformation = FORMAT_CONVERSION_PILLAR_BOX;
2025 Scale_Pillarbox(state, state->resolution_width, state->resolution_height, &transform);
2027 else if ((state->mheg_aspect_ratio == ASPECT_RATIO_16_9) &&
2028 (state->video_aspect_ratio == ASPECT_RATIO_16_9) &&
2029 (state->display_aspect_ratio == ASPECT_RATIO_4_3))
2032 transformation = FORMAT_CONVERSION_PANSCAN;
2033 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
2035 MultiplyMatrices(&transform, current, current);
2037 return transformation;
2053 if ((state->mheg_aspect_ratio == ASPECT_RATIO_4_3) &&
2054 (state->video_aspect_ratio == ASPECT_RATIO_16_9) &&
2055 (state->decoder_status == DECODER_STATUS_VIDEO))
2058 switch (state->mheg_wam)
2063 case ASPECT_MODE_4_3:
2064 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
2067 case ASPECT_MODE_16_9:
2068 Scale_16_9_Letterbox(state, state->resolution_width, state->resolution_height, &transform);
2076 MultiplyMatrices(&transform, current, current);
2091 Scale_ToScreen(state, &transform);
2092 MultiplyMatrices(&transform, current, current);
2106 E_FORMAT_CONVERSION transformation;
2109 transformation = FORMAT_CONVERSION_IGNORE;
2112 NoScaling(state, &transform);
2113 if ((state->video_aspect_ratio == ASPECT_RATIO_4_3) &&
2114 (state->display_aspect_ratio == ASPECT_RATIO_16_9))
2117 transformation = FORMAT_CONVERSION_PILLAR_BOX;
2118 Scale_Pillarbox(state, state->resolution_width, state->resolution_height, &transform);
2120 else if ((state->video_aspect_ratio == ASPECT_RATIO_16_9) &&
2121 (state->display_aspect_ratio == ASPECT_RATIO_4_3))
2124 transformation = FORMAT_CONVERSION_PANSCAN;
2125 Scale_CentreCutOut(state, state->resolution_width, state->resolution_height, &transform);
2127 MultiplyMatrices(&transform, current, current);
2129 return transformation;
2143 DBG((
"VTC_ApplyWSS: before:\n"));
2144 PrintFractRect(output);
2146 if ((state->mheg_enabled) &&
2147 (state->mheg_aspect_ratio == ASPECT_RATIO_4_3) &&
2148 (state->display_aspect_ratio == ASPECT_RATIO_16_9))
2151 VTC_IdentityMatrix(&transform);
2152 Scale_Pillarbox(state, state->screen_width, state->screen_height,
2154 PrintMatrix(&transform);
2155 ApplyTransformation(&transform, output, output);
2156 DBG((
"VTC_ApplyWSS: after:\n"));
2157 PrintFractRect(output);
2166 static void VTC_RectangleToFractRectangle(
S_RECTANGLE *rectangle,
2169 fract_rect->left = MakeFraction(rectangle->left, 1);
2170 fract_rect->top = MakeFraction(rectangle->top, 1);
2171 fract_rect->width = MakeFraction(rectangle->width, 1);
2172 fract_rect->height = MakeFraction(rectangle->height, 1);
2181 static void VTC_FractRectangleToRectangle(
S_VT_FRACT_RECT *fract_rect,
2184 rectangle->left = ((fract_rect->left.numerator + fract_rect->left.denominator / 2) /
2185 fract_rect->left.denominator);
2186 rectangle->top = ((fract_rect->top.numerator + fract_rect->top.denominator / 2) /
2187 fract_rect->top.denominator);
2188 rectangle->width = ((fract_rect->width.numerator + fract_rect->width.denominator / 2) /
2189 fract_rect->width.denominator);
2190 rectangle->height = ((fract_rect->height.numerator + fract_rect->height.denominator / 2) /
2191 fract_rect->height.denominator);
2213 screen_clip = MakeRectangle(0, 0, state->screen_width, state->screen_height);
2215 scale_clip = MakeRectangle(0, 0, state->resolution_width, state->resolution_height);
2218 ApplyTransformation(transform, input_rect, output_rect);
2221 ApplyTransformation(clip_transform, &scale_clip, &trans_clip);
2224 ClipRectangle(&screen_clip, output_rect);
2225 ClipRectangle(&trans_clip, output_rect);
2228 if (transform->a.numerator != 0 && transform->c.numerator != 0)
2231 InvertMatrix(transform, &inverse);
2232 ApplyTransformation(&inverse, output_rect, input_rect);
2248 AddFractions(&rect->left, &rect->width, &right);
2249 AddFractions(&rect->top, &rect->height, &bottom);
2251 AddFractions(&clip_rect->left, &clip_rect->width, &clip_right);
2252 AddFractions(&clip_rect->top, &clip_rect->height, &clip_bottom);
2254 if ((CompareFractions(&rect->left, &clip_right) >= 0) ||
2255 (CompareFractions(&rect->top, &clip_bottom) >= 0) ||
2256 (CompareFractions(&right, &clip_rect->left) <= 0) ||
2257 (CompareFractions(&bottom, &clip_rect->top) <= 0))
2260 rect->left = MakeFraction(0, 1);
2261 rect->top = MakeFraction(0, 1);
2262 rect->width = MakeFraction(0, 1);
2263 rect->height = MakeFraction(0, 1);
2267 if (CompareFractions(&rect->left, &clip_rect->left) < 0)
2269 SubtractFraction(&right, &clip_rect->left, &rect->width);
2270 rect->left = clip_rect->left;
2273 if (CompareFractions(&rect->top, &clip_rect->top) < 0)
2275 SubtractFraction(&bottom, &clip_rect->top, &rect->height);
2276 rect->top = clip_rect->top;
2279 AddFractions(&rect->left, &rect->width, &right);
2280 AddFractions(&rect->top, &rect->height, &bottom);
2282 if (CompareFractions(&right, &clip_right) > 0)
2284 SubtractFraction(&clip_right, &rect->left, &rect->width);
2287 if (CompareFractions(&bottom, &clip_bottom) > 0)
2289 SubtractFraction(&clip_bottom, &rect->top, &rect->height);
2294 static S32BIT Gcd(S32BIT a, S32BIT b)
2310 S32BIT num, den, gcd;
2312 num = input->numerator >= 0 ? input->numerator : -input->numerator;
2313 den = input->denominator >= 0 ? input->denominator : -input->denominator;
2315 gcd = Gcd(num, den);
2319 output->numerator = input->numerator / gcd;
2320 output->denominator = input->denominator / gcd;
2332 ASSERT(in_a->denominator != 0);
2333 ASSERT(in_b->denominator != 0);
2335 if (in_a->numerator == 0)
2337 ReduceFraction(in_b, out);
2338 ASSERT(out->denominator != 0);
2340 else if (in_b->numerator == 0)
2342 ReduceFraction(in_a, out);
2343 ASSERT(out->denominator != 0);
2348 gcd = Gcd(in_a->denominator, in_b->denominator);
2349 out->numerator = ((in_a->numerator * in_b->denominator / gcd) +
2350 (in_b->numerator * in_a->denominator / gcd));
2351 out->denominator = in_a->denominator * in_b->denominator / gcd;
2352 ASSERT(out->denominator != 0);
2353 ReduceFraction(out, out);
2363 temp.numerator = 0 - temp.numerator;
2364 AddFractions(in_a, &temp, out);
2369 return(in_a->numerator * in_b->denominator -
2370 in_b->numerator * in_a->denominator);
2389 ASSERT(matrix_a->a.denominator != 0);
2390 ASSERT(matrix_a->b.denominator != 0);
2391 ASSERT(matrix_a->c.denominator != 0);
2392 ASSERT(matrix_a->d.denominator != 0);
2393 ASSERT(matrix_b->a.denominator != 0);
2394 ASSERT(matrix_b->b.denominator != 0);
2395 ASSERT(matrix_b->c.denominator != 0);
2396 ASSERT(matrix_b->d.denominator != 0);
2398 buffer.numerator = matrix_a->a.numerator * matrix_b->b.numerator;
2399 buffer.denominator = matrix_a->a.denominator * matrix_b->b.denominator;
2400 AddFractions(&buffer, &matrix_a->b, &tmp.b);
2402 tmp.a.denominator = matrix_a->a.denominator * matrix_b->a.denominator;
2403 tmp.a.numerator = matrix_a->a.numerator * matrix_b->a.numerator;
2404 ReduceFraction(&tmp.a, &tmp.a);
2406 buffer.numerator = matrix_a->c.numerator * matrix_b->d.numerator;
2407 buffer.denominator = matrix_a->c.denominator * matrix_b->d.denominator;
2408 ASSERT(buffer.denominator != 0);
2409 ASSERT(matrix_a->d.denominator != 0);
2410 AddFractions(&buffer, &matrix_a->d, &tmp.d);
2412 tmp.c.denominator = matrix_a->c.denominator * matrix_b->c.denominator;
2413 tmp.c.numerator = matrix_a->c.numerator * matrix_b->c.numerator;
2414 ReduceFraction(&tmp.c, &tmp.c);
2416 ASSERT(tmp.a.denominator != 0);
2417 ASSERT(tmp.b.denominator != 0);
2418 ASSERT(tmp.c.denominator != 0);
2419 ASSERT(tmp.d.denominator != 0);
2421 *output_matrix = tmp;
2438 ASSERT(matrix->a.numerator != 0);
2439 ASSERT(matrix->c.numerator != 0);
2441 inverse->b.numerator = -matrix->b.numerator * matrix->a.denominator;
2442 inverse->b.denominator = matrix->b.denominator * matrix->a.numerator;
2443 if (inverse->b.denominator < 0)
2445 inverse->b.numerator *= -1;
2446 inverse->b.denominator *= -1;
2448 ReduceFraction(&inverse->b, &inverse->b);
2450 inverse->d.numerator = -matrix->d.numerator * matrix->c.denominator;
2451 inverse->d.denominator = matrix->d.denominator * matrix->c.numerator;
2452 if (inverse->d.denominator < 0)
2454 inverse->d.numerator *= -1;
2455 inverse->d.denominator *= -1;
2457 ReduceFraction(&inverse->d, &inverse->d);
2459 temp = matrix->a.numerator;
2460 inverse->a.numerator = matrix->a.denominator;
2461 inverse->a.denominator = temp;
2462 if (inverse->a.denominator < 0)
2464 inverse->a.numerator *= -1;
2465 inverse->a.denominator *= -1;
2468 temp = matrix->c.numerator;
2469 inverse->c.numerator = matrix->c.denominator;
2470 inverse->c.denominator = temp;
2471 if (inverse->c.denominator < 0)
2473 inverse->c.numerator *= -1;
2474 inverse->c.denominator *= -1;
2477 ASSERT(inverse->a.denominator != 0);
2478 ASSERT(inverse->b.denominator != 0);
2479 ASSERT(inverse->c.denominator != 0);
2480 ASSERT(inverse->d.denominator != 0);
2494 tmp.width.numerator = input->width.numerator * matrix->a.numerator;
2495 tmp.width.denominator = input->width.denominator * matrix->a.denominator;
2496 tmp.height.numerator = input->height.numerator * matrix->c.numerator;
2497 tmp.height.denominator = input->height.denominator * matrix->c.denominator;
2498 ReduceFraction(&tmp.width, &tmp.width);
2499 ReduceFraction(&tmp.height, &tmp.height);
2501 tmp.left.numerator = input->left.numerator * matrix->a.numerator;
2502 tmp.left.denominator = input->left.denominator * matrix->a.denominator;
2503 tmp.top.numerator = input->top.numerator * matrix->c.numerator;
2504 tmp.top.denominator = input->top.denominator * matrix->c.denominator;
2506 AddFractions(&tmp.left, &matrix->b, &tmp.left);
2507 AddFractions(&tmp.top, &matrix->d, &tmp.top);
2519 E_FORMAT_CONVERSION trans;
2522 DBG((
"Looking for AFD transformation (%d, %s, %s, %s)\n",
2524 state->video_aspect_ratio == ASPECT_RATIO_4_3 ?
"ASPECT_RATIO_4_3" :
2525 state->video_aspect_ratio == ASPECT_RATIO_16_9 ?
"ASPECT_RATIO_16_9" :
2527 state->display_aspect_ratio == ASPECT_RATIO_4_3 ?
"ASPECT_RATIO_4_3" :
2528 state->display_aspect_ratio == ASPECT_RATIO_16_9 ?
"ASPECT_RATIO_16_9" :
2530 state->afd_preference == AFD_PREFERENCE_CCO ?
"AFD_PREFERENCE_CCO" :
2531 state->afd_preference == AFD_PREFERENCE_14_9_LB ?
"AFD_PREFERENCE_14_9_LB" :
2532 state->afd_preference == AFD_PREFERENCE_16_9_LB ?
"AFD_PREFERENCE_16_9_LB" :
2533 state->afd_preference == AFD_PREFERENCE_AUTO ?
"AFD_PREFERENCE_AUTO" :
2536 for (i = 0; i <
sizeof(afd_table) /
sizeof(*afd_table); i++)
2539 if ((afd_table[i].afd == state->afd) &&
2540 (afd_table[i].video_aspect_ratio == state->video_aspect_ratio) &&
2541 (afd_table[i].display_aspect_ratio == state->display_aspect_ratio) &&
2542 ((afd_table[i].afd_preference == state->afd_preference) ||
2543 (afd_table[i].afd_preference == AFD_PREFERENCE_AUTO)))
2545 trans = afd_table[i].transformation;
2546 DBG((
"Found transformation %s\n",
2547 trans == FORMAT_CONVERSION_PILLAR_BOX ?
"FORMAT_CONVERSION_PILLAR_BOX" :
2548 trans == FORMAT_CONVERSION_ZOOM_4_3 ?
"FORMAT_CONVERSION_ZOOM_4_3" :
2549 trans == FORMAT_CONVERSION_ZOOM_14_9 ?
"FORMAT_CONVERSION_ZOOM_14_9" :
2550 trans == FORMAT_CONVERSION_LETTERBOX ?
"FORMAT_CONVERSION_LETTERBOX" :
2551 trans == FORMAT_CONVERSION_LETTERBOX_14_9 ?
"FORMAT_CONVERSION_LETTERBOX_14_9" :
2552 trans == FORMAT_CONVERSION_PANSCAN ?
"FORMAT_CONVERSION_PANSCAN" :
2553 trans == FORMAT_CONVERSION_PANSCAN_14_9 ?
"FORMAT_CONVERSION_PANSCAN_14_9" :
2560 return FORMAT_CONVERSION_IGNORE;
2567 transform->a = MakeFraction(state->resolution_width, 360);
2568 transform->b = MakeFraction(state->resolution_width, 90);
2569 transform->c = MakeFraction(state->resolution_height, 288);
2570 transform->d = MakeFraction(0, 1);
2577 transform->a = MakeFraction(state->resolution_width, 360);
2578 transform->b = MakeFraction(state->resolution_width, 90);
2579 transform->c = MakeFraction(state->resolution_height, 576);
2580 transform->d = MakeFraction(0, 1);
2587 transform->a = MakeFraction(state->resolution_width, 480);
2588 transform->b = MakeFraction(0, 1);
2589 transform->c = MakeFraction(state->resolution_height, 576);
2590 transform->d = MakeFraction(0, 1);
2597 transform->a = MakeFraction(state->resolution_width, 540);
2598 transform->b = MakeFraction(0 - state->resolution_width, 270);
2599 transform->c = MakeFraction(state->resolution_height, 576);
2600 transform->d = MakeFraction(0, 1);
2607 transform->a = MakeFraction(state->resolution_width, state->video_width);
2608 transform->b = MakeFraction(0, 1);
2609 transform->c = MakeFraction(state->resolution_height, state->video_height);
2610 transform->d = MakeFraction(0, 1);
2617 transform->a = MakeFraction(state->screen_width, state->resolution_width);
2618 transform->b = MakeFraction(0, 1);
2619 transform->c = MakeFraction(state->screen_height, state->resolution_height);
2620 transform->d = MakeFraction(0, 1);
2627 transform->a = MakeFraction(state->screen_width, HD_WIDTH);
2628 transform->b = MakeFraction(0, 1);
2629 transform->c = MakeFraction(state->screen_height, HD_HEIGHT);
2630 transform->d = MakeFraction(0, 1);
2636 USE_UNWANTED_PARAM(state);
2637 USE_UNWANTED_PARAM(height);
2639 transform->a = MakeFraction(3, 4);
2640 transform->b = MakeFraction(width, 8);
2641 transform->c = MakeFraction(1, 1);
2642 transform->d = MakeFraction(0, 1);
2648 USE_UNWANTED_PARAM(state);
2649 USE_UNWANTED_PARAM(width);
2651 transform->a = MakeFraction(1, 1);
2652 transform->b = MakeFraction(0, 1);
2653 transform->c = MakeFraction(4, 3);
2654 transform->d = MakeFraction(-height, 6);
2660 USE_UNWANTED_PARAM(state);
2662 transform->a = MakeFraction(7, 8);
2663 transform->b = MakeFraction(width, 16);
2664 transform->c = MakeFraction(7, 6);
2665 transform->d = MakeFraction(-height, 12);
2671 USE_UNWANTED_PARAM(state);
2673 transform->a = MakeFraction(8, 7);
2674 transform->b = MakeFraction(-width, 14);
2675 transform->c = MakeFraction(8, 7);
2676 transform->d = MakeFraction(-height, 14);
2682 USE_UNWANTED_PARAM(state);
2684 transform->a = MakeFraction(4, 3);
2685 transform->b = MakeFraction(-width, 6);
2686 transform->c = MakeFraction(4, 3);
2687 transform->d = MakeFraction(-height, 6);
2693 USE_UNWANTED_PARAM(state);
2694 USE_UNWANTED_PARAM(width);
2696 transform->a = MakeFraction(1, 1);
2697 transform->b = MakeFraction(0, 1);
2698 transform->c = MakeFraction(3, 4);
2699 transform->d = MakeFraction(height, 8);
2705 USE_UNWANTED_PARAM(state);
2707 transform->a = MakeFraction(8, 7);
2708 transform->b = MakeFraction(-width, 14);
2709 transform->c = MakeFraction(6, 7);
2710 transform->d = MakeFraction(height, 14);
2716 USE_UNWANTED_PARAM(state);
2717 USE_UNWANTED_PARAM(height);
2719 transform->a = MakeFraction(4, 3);
2720 transform->b = MakeFraction(-width, 6);
2721 transform->c = MakeFraction(1, 1);
2722 transform->d = MakeFraction(0, 1);
2728 USE_UNWANTED_PARAM(state);
2730 transform->a = MakeFraction(7, 6);
2731 transform->b = MakeFraction(-width, 12);
2732 transform->c = MakeFraction(7, 6);
2733 transform->d = MakeFraction(-height, 12);
2738 if (state->app_scaling_enabled)
2740 state->resolution_width = state->screen_width;
2741 state->resolution_height = state->screen_height;
2743 else if (state->mheg_enabled)
2745 state->resolution_width = state->mheg_resolution_width;
2746 state->resolution_height = state->mheg_resolution_height;
2748 else if (state->hbb_enabled)
2750 state->resolution_width = HD_WIDTH;
2751 state->resolution_height = HD_HEIGHT;
2755 state->resolution_width = SD_WIDTH;
2756 state->resolution_height = SD_HEIGHT;
2762 S32BIT x = state->mheg_scaling_rect.left;
2763 S32BIT y = state->mheg_scaling_rect.top;
2764 S32BIT width = state->mheg_scaling_rect.width;
2765 S32BIT height = state->mheg_scaling_rect.height;
2766 S32BIT res_width = state->mheg_resolution_width;
2767 S32BIT res_height = state->mheg_resolution_height;
2769 transform->a = MakeFraction(width, res_width);
2770 transform->b = MakeFraction(x, 1);
2771 transform->c = MakeFraction(height, res_height);
2772 transform->d = MakeFraction(y, 1);
2777 S32BIT x = state->hbb_window_rect.left;
2778 S32BIT y = state->hbb_window_rect.top;
2779 S32BIT width = state->hbb_window_rect.width;
2780 S32BIT height = state->hbb_window_rect.height;
2782 if (state->video_aspect_ratio == ASPECT_RATIO_4_3)
2784 adjust = (height * 4) / 3;
2787 x += (width - adjust) / 2;
2792 adjust = (width * 3) / 4;
2793 if (height > adjust)
2795 y += (height - adjust) / 2;
2802 adjust = (height * 16) / 9;
2805 x += (width - adjust) / 2;
2810 adjust = (width * 9) / 16;
2811 if (height > adjust)
2813 y += (height - adjust) / 2;
2818 transform->a = MakeFraction(width, HD_WIDTH);
2819 transform->b = MakeFraction(x, 1);
2820 transform->c = MakeFraction(height, HD_HEIGHT);
2821 transform->d = MakeFraction(y, 1);
2826 S32BIT x = state->app_scaling_window.left;
2827 S32BIT y = state->app_scaling_window.top;
2828 S32BIT width = state->app_scaling_window.width;
2829 S32BIT height = state->app_scaling_window.height;
2833 transform->a = MakeFraction(width, state->resolution_width);
2834 transform->b = MakeFraction(x, 1);
2835 transform->c = MakeFraction(height, state->resolution_height);
2836 transform->d = MakeFraction(y, 1);
2841 USE_UNWANTED_PARAM(state);
2843 transform->a = MakeFraction(1, 1);
2844 transform->b = MakeFraction(0, 1);
2845 transform->c = MakeFraction(1, 1);
2846 transform->d = MakeFraction(0, 1);
2849 static S_VT_FRACTION MakeFraction(S32BIT numerator, S32BIT denominator)
2852 fraction.numerator = numerator;
2853 fraction.denominator = denominator;
2857 static S_VT_FRACT_RECT MakeRectangle(S32BIT left, S32BIT top, S32BIT width, S32BIT height)
2860 rect.left.numerator = left;
2861 rect.top.numerator = top;
2862 rect.width.numerator = width;
2863 rect.height.numerator = height;
2865 rect.left.denominator = 1;
2866 rect.top.denominator = 1;
2867 rect.width.denominator = 1;
2868 rect.height.denominator = 1;
Header file - Function prototypes for A/V control.
void VT_SetHbbtvWindow(void *context, S_RECTANGLE *output)
Set HBBTV output window.
void VT_SetProfileHbbtv(void *context, BOOLEAN enable)
Set profile to apply HBBTV option.
void VT_SetMhegScalingResolution(void *context, U16BIT width, U16BIT height)
Set MHEG5 scaling resolution.
void VT_GetVideoResolution(void *context, U16BIT *width, U16BIT *height)
Return the current video resolution.
void VT_SetUserPreferenceChangedCallback(void *context, F_VT_NOTIFICATION_CALLBACK callback, void *user_data)
Set user preference change callback.
void VT_GetScreenResolution(void *context, U16BIT *width, U16BIT *height)
Return the current screen resolution.
void VT_SetAppScaling(void *context, S_RECTANGLE *window)
Set application scaling information.
void VT_SetVideoChangedCallback(void *context, F_VT_NOTIFICATION_CALLBACK callback, void *user_data)
Set video change callback.
void VT_SetCustomModeCallback(void *context, F_VT_CUSTOM_MODE_CALLBACK callback)
Set customer mode callback.
E_FORMAT_CONVERSION(* F_VT_CUSTOM_MODE_CALLBACK)(E_ASPECT_RATIO video_aspect_ratio, E_ASPECT_RATIO display_aspect_ratio)
Callback used by the VTC module to determine what format conversion needs to be applied when the aspe...
void VT_SetAfd(void *context, U8BIT afd_value)
Set current AFD (active format descriptor value)
BOOLEAN VT_IsOsdScaled(void *context)
Check if osd must be scaled due to MHEG scene aspect ratio.
void VT_SetDisplayAspectRatio(void *context, E_ASPECT_RATIO aspect_ratio)
Set display aspect ratio.
E_STB_AV_DECODER_STATUS VT_GetDecoderStatus(void *context)
Get the decoder status.
void VT_SetMhegScaling(void *context, S_RECTANGLE *scaling)
Set MHEG-5 scaling information.
E_FORMAT_CONVERSION VT_GetDecoderFormatConversion(void *context)
Return the current decoder format conversion.
E_ASPECT_RATIO VT_GetVideoAspectRatio(void *context)
Get video aspect ratio.
void VT_Close(void *context)
Close video transformation manager.
void VT_SetMhegAspectRatio(void *context, E_ASPECT_RATIO aspect_ratio)
Set MHEG-5 aspect ratio.
void VT_SetVideoAlignmentPref(void *context, E_VIDEO_ASPECT_MODE alignment)
Set user preference for video aspect ratio alignment.
void VT_SetVideoAspectRatio(void *context, E_ASPECT_RATIO aspect_ratio)
Set video aspect ratio.
void VT_GetWss(void *context, U8BIT *wss)
Return WSS (wide-screen signalling) value.
void VT_Enable(void *context, BOOLEAN enable)
Enable or disable transformation calculations.
Debug functions header file.
void VT_SetProfileMheg5(void *context, BOOLEAN enable)
Set profile to apply MHEG5 option.
void VT_SetScreenResolution(void *context, U16BIT width, U16BIT height)
Set screen resolution.
E_ASPECT_RATIO VT_GetDisplayAspectRatio(void *context)
Get display aspect ratio.
System Wide Global Technical Data Type Definitions.
void VT_SetVideoResolution(void *context, U16BIT width, U16BIT height)
Set video resolution.
void * VT_Open(S_VT_OPTIONS *options)
Open video transformation manager.
void VT_SetDecoderStatus(void *context, E_STB_AV_DECODER_STATUS status)
Set the decoder status.
void VT_SetMhegVideoAlignment(void *context, E_VIDEO_ASPECT_MODE mode)
Set widescreeen alignment mode for MHEG-5.
void VT_GetVideoTransformation(void *context, S_RECTANGLE *input_rect, S_RECTANGLE *output_rect)
Get the current video transfromation rectangles.