/*************************************************************************** * Copyright (c) 2003-2006, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * ***************************************************************************/ #include "bapp_eia708.h" #include "bapp.h" #include "bapp_palette.h" #include "bos_task_priorities.h" #include "bdcc.h" #include "bccwinlib.h" #include "genericlist.h" #include "bdccengine.h" //#define CONFIG_OLD_PARSER #ifdef CONFIG_OLD_PARSER #include "bcmDccTransport.h" #include "bcmDccTransportParse.h" #endif BDBG_MODULE(eia708); #define NUM_CC_BUF 512 #define CC_BUF_SIZE (60 * 4) #define MAX_TRIPLETS (0x1f * 3) /* Number of EIA708 fonts */ #ifdef NEW_FONT_SET #define NUM_EIA_708_FONTS 7 #else #define NUM_EIA_708_FONTS 6 #endif #define EIA708_ENABLE_TIMEOUT (g_ticks_per_second * 2) #define EIA708_THREAD_STACK_SIZE 512 /* changed from 1024 */ /* * Main data structure containing references to all interfaces * required throughout the application. */ #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET extern const unsigned int g_cinecavB_type_03_16_aa[]; extern const unsigned int g_cinecavB_type_03_16_aa_size; extern const unsigned int g_cinecavB_type_03_18_aa[]; extern const unsigned int g_cinecavB_type_03_18_aa_size; extern const unsigned int g_cinecavB_type_03_20_aa[]; extern const unsigned int g_cinecavB_type_03_20_aa_size; extern const unsigned int g_cinecavB_serif_02_16_aa[]; extern const unsigned int g_cinecavB_serif_02_16_aa_size; extern const unsigned int g_cinecavB_serif_02_18_aa[]; extern const unsigned int g_cinecavB_serif_02_18_aa_size; extern const unsigned int g_cinecavB_serif_02_20_aa[]; extern const unsigned int g_cinecavB_serif_02_20_aa_size; extern const unsigned int g_cinecavB_mono_03_16_aa[]; extern const unsigned int g_cinecavB_mono_03_16_aa_size; extern const unsigned int g_cinecavB_mono_03_18_aa[]; extern const unsigned int g_cinecavB_mono_03_18_aa_size; extern const unsigned int g_cinecavB_mono_03_20_aa[]; extern const unsigned int g_cinecavB_mono_03_20_aa_size; extern const unsigned int g_cinecavB_sans_02_16_aa[]; extern const unsigned int g_cinecavB_sans_02_16_aa_size; extern const unsigned int g_cinecavB_sans_02_18_aa[]; extern const unsigned int g_cinecavB_sans_02_18_aa_size; extern const unsigned int g_cinecavB_sans_02_20_aa[]; extern const unsigned int g_cinecavB_sans_02_20_aa_size; extern const unsigned int g_cinecavB_casual_02_16_aa[]; extern const unsigned int g_cinecavB_casual_02_16_aa_size; extern const unsigned int g_cinecavB_casual_02_18_aa[]; extern const unsigned int g_cinecavB_casual_02_18_aa_size; extern const unsigned int g_cinecavB_casual_02_20_aa[]; extern const unsigned int g_cinecavB_casual_02_20_aa_size; extern const unsigned int g_cinecavB_script_02_16_aa[]; extern const unsigned int g_cinecavB_script_02_16_aa_size; extern const unsigned int g_cinecavB_script_02_18_aa[]; extern const unsigned int g_cinecavB_script_02_18_aa_size; extern const unsigned int g_cinecavB_script_02_20_aa[]; extern const unsigned int g_cinecavB_script_02_20_aa_size; extern const unsigned int g_cinecavB_sc_02_16_aa[]; extern const unsigned int g_cinecavB_sc_02_16_aa_size; extern const unsigned int g_cinecavB_sc_02_18_aa[]; extern const unsigned int g_cinecavB_sc_02_18_aa_size; extern const unsigned int g_cinecavB_sc_02_20_aa[]; extern const unsigned int g_cinecavB_sc_02_20_aa_size; #else extern const unsigned char g_SFM_20_aa[]; extern const unsigned int g_SFM_20_aa_size; extern const unsigned char g_SFP_20_aa[]; extern const unsigned int g_SFP_20_aa_size; extern const unsigned char g_SFM_24_aa[]; extern const unsigned int g_SFM_24_aa_size; extern const unsigned char g_SFP_24_aa[]; extern const unsigned int g_SFP_24_aa_size; extern const unsigned char g_SSM_20_aa[]; extern const unsigned int g_SSM_20_aa_size; extern const unsigned char g_SSP_20_aa[]; extern const unsigned int g_SSP_20_aa_size; extern const unsigned char g_SSM_24_aa[]; extern const unsigned int g_SSM_24_aa_size; extern const unsigned char g_SSP_24_aa[]; extern const unsigned int g_SSP_24_aa_size; extern const unsigned char g_SCRIPT_20_aa[]; extern const unsigned int g_SCRIPT_20_aa_size; extern const unsigned char g_SCRIPT_24_aa[]; extern const unsigned int g_SCRIPT_24_aa_size; extern const unsigned char g_SC_20_aa[]; extern const unsigned int g_SC_20_aa_size; extern const unsigned char g_SC_24_aa[]; extern const unsigned int g_SC_24_aa_size; #endif #else #ifdef NEW_FONT_SET extern const unsigned int g_cinecavB_type_03_16_mono[]; extern const unsigned int g_cinecavB_type_03_16_mono_size; extern const unsigned int g_cinecavB_type_03_20_mono[]; extern const unsigned int g_cinecavB_type_03_20_mono_size; extern const unsigned int g_cinecavB_serif_02_16_mono[]; extern const unsigned int g_cinecavB_serif_02_16_mono_size; extern const unsigned int g_cinecavB_serif_02_20_mono[]; extern const unsigned int g_cinecavB_serif_02_20_mono_size; extern const unsigned int g_cinecavB_mono_03_16_mono[]; extern const unsigned int g_cinecavB_mono_03_16_mono_size; extern const unsigned int g_cinecavB_mono_03_20_mono[]; extern const unsigned int g_cinecavB_mono_03_20_mono_size; extern const unsigned int g_cinecavB_sans_02_16_mono[]; extern const unsigned int g_cinecavB_sans_02_16_mono_size; extern const unsigned int g_cinecavB_sans_02_20_mono[]; extern const unsigned int g_cinecavB_sans_02_20_mono_size; extern const unsigned int g_cinecavB_casual_02_16_mono[]; extern const unsigned int g_cinecavB_casual_02_16_mono_size; extern const unsigned int g_cinecavB_casual_02_20_mono[]; extern const unsigned int g_cinecavB_casual_02_20_mono_size; extern const unsigned int g_cinecavB_script_02_16_mono[]; extern const unsigned int g_cinecavB_script_02_16_mono_size; extern const unsigned int g_cinecavB_script_02_20_mono[]; extern const unsigned int g_cinecavB_script_02_20_mono_size; extern const unsigned int g_cinecavB_sc_02_16_mono[]; extern const unsigned int g_cinecavB_sc_02_16_mono_size; extern const unsigned int g_cinecavB_sc_02_20_mono[]; extern const unsigned int g_cinecavB_sc_02_20_mono_size; #else extern const unsigned char g_SFM_20_mono[]; extern const unsigned int g_SFM_20_mono_size; extern const unsigned char g_SFP_24_mono[]; extern const unsigned int g_SFP_24_mono_size; extern const unsigned char g_SFM_24_mono[]; extern const unsigned int g_SFM_24_mono_size; extern const unsigned char g_SFP_28_mono[]; extern const unsigned int g_SFP_28_mono_size; extern const unsigned char g_SSM_20_mono[]; extern const unsigned int g_SSM_20_mono_size; extern const unsigned char g_SSP_24_mono[]; extern const unsigned int g_SSP_24_mono_size; extern const unsigned char g_SSM_24_mono[]; extern const unsigned int g_SSM_24_mono_size; extern const unsigned char g_SSP_28_mono[]; extern const unsigned int g_SSP_28_mono_size; extern const unsigned char g_SCRIPT_20_mono[]; extern const unsigned int g_SCRIPT_20_mono_size; extern const unsigned char g_SCRIPT_24_mono[]; extern const unsigned int g_SCRIPT_24_mono_size; extern const unsigned char g_SC_20_mono[]; extern const unsigned int g_SC_20_mono_size; extern const unsigned char g_SC_24_mono[]; extern const unsigned int g_SC_24_mono_size; #endif #endif typedef struct cc_buf_t { LINKS_T links; unsigned int size; unsigned char buf[CC_BUF_SIZE]; }cc_buf_t; typedef struct triplets_t { unsigned char data_0; unsigned char data_1; unsigned char data_2; }triplets_t; /* cache font size information instead of computing it each time */ typedef struct font_size_info_t { unsigned int width; unsigned int height; } font_size_info_t; struct bapp_eia708 { bapp_t *p_app; bool done; bool enabled; int i608_CcService; int i708_CcService; b_task_t thread; unsigned int *thread_stack; b_mutex_t mutex; #ifdef NEW_FONT_SET BCCGFX_WINLIB_P_Font hFont[NUM_EIA_708_FONTS][eFONT_SIZE_MAX]; bgfx_font_t fonts[NUM_EIA_708_FONTS][eFONT_SIZE_MAX]; #else BCCGFX_WINLIB_P_Font hFont[NUM_EIA_708_FONTS][eFONT_SIZE_MAX - 1]; bgfx_font_t fonts[NUM_EIA_708_FONTS][eFONT_SIZE_MAX - 1]; #endif BDCC_ENG_Handle hCC708Engine ; BDCC_ENG_Settings stEngineSettings ; BCCGFX_WINLIB_P_Handle hWinLibHandle; BDCC_ENG_Type type; #ifdef CONFIG_OLD_PARSER DCC_TRANSPORT_OBJECT pTransport; DCC_OUTBUF_INFO CCBufInfo; DCC_OUTBUF_INFO DTVCCBufInfo; #else unsigned char triplets[MAX_TRIPLETS]; #endif LIST_T cc_list; LIST_T free_cc_list; cc_buf_t cc_buf[NUM_CC_BUF]; bool mode_change; #ifdef NEW_FONT_SET font_size_info_t font_cell_info[NUM_EIA_708_FONTS][eFONT_SIZE_MAX]; #else font_size_info_t font_cell_info[NUM_EIA_708_FONTS][eFONT_SIZE_MAX - 1]; #endif }bapp_eia708; bapp_eia708_t s_p_eia708 = NULL; static void bapp_eia708_thread(void *data); BCCGFX_WINLIB_P_ErrCode BCCGFX_WINLIB_P_Init( BCCGFX_WINLIB_P_Handle *phWinLibHandle, bgfx_surf_t *p_osd_surf, bccgfx_update_cb_t updateCB, bccgfx_get_wide_aspect_ratio_cb_t wide_aspect_ratio_cb, void *p_app); /* Summary: Estimate the font size */ int bapp_eia708_font_size(bgfx_font_t *p_font) { unsigned int uni_str[8]; int slen,width,height; slen = c_to_uni_str("WpghjMQ",uni_str,7); bgfx_string_info(p_font,(const unsigned long *)uni_str,slen,&width,&height); BDBG_MSG(("%s (%d)\n",__FUNCTION__, width,height)); return height; } /* * Summary: * get cached font information */ void bapp_eia708_get_cell_info(bgfx_font_t *p_font,int *width, int *height) { int fidx,sidx; BAPP_ASSERT(p_font); for (fidx = 0; fidx < NUM_EIA_708_FONTS; ++fidx) { #ifdef NEW_FONT_SET for (sidx = 0; sidx < eFONT_SIZE_MAX; ++sidx) #else for (sidx = 0; sidx < (eFONT_SIZE_MAX - 1); ++sidx) #endif { if (&(s_p_eia708->fonts[fidx][sidx]) && (p_font == &(s_p_eia708->fonts[fidx][sidx]))) { /* found it */ *width = s_p_eia708->font_cell_info[fidx][sidx].width; *height = s_p_eia708->font_cell_info[fidx][sidx].height; return; } } } BDBG_WRN(("%s no match for given font pointer",__func__)); BAPP_ASSERT(0); } /* Summary: Estimate the font size */ void bapp_eia708_cell_info(bgfx_font_t *p_font,int *width, int *height) { unsigned int uni_str[8]; char str[2] = { 0, 0}; static char test_str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"; int slen,i,h,w; *width = *height = 0; slen = c_to_uni_str("WpgHjMQ",uni_str,7); bgfx_string_info(p_font,(const unsigned long *)uni_str,slen,&w,&h); #ifdef NEW_FONT_SET *height = h + 4; #else *height = h + 8; #endif /* make even number */ *height += (*height % 2); if (*height > DCCGFX_MAX_CELL_HEIGHT) *height = DCCGFX_MAX_CELL_HEIGHT; /* Determine max width */ for (i = 0; i < strlen(test_str); ++i) { str[0] = test_str[i]; slen = c_to_uni_str(str,uni_str,1); bgfx_string_info(p_font,(const unsigned long *)uni_str,slen,&w,&h); if (w > *width) *width = w; } *width += 6; /* make even number */ *width += (*width % 2); if (*width > DCCGFX_MAX_CELL_WIDTH) *width = DCCGFX_MAX_CELL_WIDTH; BDBG_MSG(("%s (%d,%d)\n",__FUNCTION__, *width,*height)); } /* Summary: Initialize and allocate resources */ bapp_eia708_t bapp_eia708_open(void* p_opaque_app) { bapp_t *p_app = (bapp_t *)p_opaque_app; cc_buf_t *p_cc_buf; b_task_params params; int idx; s_p_eia708 = (bapp_eia708_t)malloc(sizeof(struct bapp_eia708)); BAPP_ASSERT(s_p_eia708); BDBG_ERR(("eia708 structure size (%d)\n",sizeof(struct bapp_eia708))); memset(s_p_eia708, 0, sizeof(struct bapp_eia708)); s_p_eia708->p_app = p_app; BAPP_ASSERT(bos_create_mutex(&s_p_eia708->mutex) == b_ok); #ifdef CONFIG_OLD_PARSER s_p_eia708->CCBufInfo.OutputBufSize = 512; s_p_eia708->CCBufInfo.pOutputBuf = malloc(s_p_eia708->CCBufInfo.OutputBufSize); s_p_eia708->DTVCCBufInfo.OutputBufSize = 128; s_p_eia708->DTVCCBufInfo.pOutputBuf = malloc(s_p_eia708->DTVCCBufInfo.OutputBufSize); BAPP_ASSERT(s_p_eia708->CCBufInfo.pOutputBuf); BAPP_ASSERT(s_p_eia708->DTVCCBufInfo.pOutputBuf); #endif s_p_eia708->thread_stack = malloc(EIA708_THREAD_STACK_SIZE * sizeof(unsigned int)); BAPP_ASSERT(s_p_eia708->thread_stack); initl(&s_p_eia708->cc_list); initl(&s_p_eia708->free_cc_list); for (idx = 0; idx < NUM_CC_BUF; idx++) { p_cc_buf = &(s_p_eia708->cc_buf[idx]); memset(p_cc_buf,0,sizeof(cc_buf_t)); inslt(&(s_p_eia708->free_cc_list),p_cc_buf); } p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_type_03_16_aa; p_app->br.size = g_cinecavB_type_03_16_aa_size; #else p_app->br.data = (unsigned char *)g_SFM_20_aa; p_app->br.size = g_SFM_20_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_type_03_16_mono; p_app->br.size = g_cinecavB_type_03_16_mono_size; #else p_app->br.data = (unsigned char *)g_SFM_20_mono; p_app->br.size = g_SFM_20_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[0][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[0][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[0][0])), &(s_p_eia708->hFont[0][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_type_03_18_aa; p_app->br.size = g_cinecavB_type_03_18_aa_size; #else p_app->br.data = (unsigned char *)g_SFM_24_aa; p_app->br.size = g_SFM_24_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_type_03_20_mono; p_app->br.size = g_cinecavB_type_03_20_mono_size; #else p_app->br.data = (unsigned char *)g_SFM_24_mono; p_app->br.size = g_SFM_24_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[0][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[0][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[0][1])), &(s_p_eia708->hFont[0][1])) == BCCGFX_WINLIB_P_SUCCESS); #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_type_03_20_aa; p_app->br.size = g_cinecavB_type_03_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[0][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[0][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[0][2])), &(s_p_eia708->hFont[0][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_serif_02_16_aa; p_app->br.size = g_cinecavB_serif_02_16_aa_size; #else p_app->br.data = (unsigned char *)g_SFP_20_aa; p_app->br.size = g_SFP_20_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_serif_02_16_mono; p_app->br.size = g_cinecavB_serif_02_16_mono_size; #else p_app->br.data = (unsigned char *)g_SFP_24_mono; p_app->br.size = g_SFP_24_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[1][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[1][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[1][0])), &(s_p_eia708->hFont[1][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_serif_02_18_aa; p_app->br.size = g_cinecavB_serif_02_18_aa_size; #else p_app->br.data = (unsigned char *)g_SFP_24_aa; p_app->br.size = g_SFP_24_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_serif_02_20_mono; p_app->br.size = g_cinecavB_serif_02_20_mono_size; #else p_app->br.data = (unsigned char *)g_SFP_28_mono; p_app->br.size = g_SFP_28_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[1][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[1][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[1][1])), &(s_p_eia708->hFont[1][1])) == BCCGFX_WINLIB_P_SUCCESS); #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_serif_02_20_aa; p_app->br.size = g_cinecavB_serif_02_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[1][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[1][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[1][2])), &(s_p_eia708->hFont[1][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_mono_03_16_aa; p_app->br.size = g_cinecavB_mono_03_16_aa_size; #else p_app->br.data = (unsigned char *)g_SSM_20_aa; p_app->br.size = g_SSM_20_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_mono_03_16_mono; p_app->br.size = g_cinecavB_mono_03_16_mono_size; #else p_app->br.data = (unsigned char *)g_SSM_20_mono; p_app->br.size = g_SSM_20_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[2][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[2][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[2][0])), &(s_p_eia708->hFont[2][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_mono_03_18_aa; p_app->br.size = g_cinecavB_mono_03_18_aa_size; #else p_app->br.data = (unsigned char *)g_SSM_24_aa; p_app->br.size = g_SSM_24_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_mono_03_20_mono; p_app->br.size = g_cinecavB_mono_03_20_mono_size; #else p_app->br.data = (unsigned char *)g_SSM_24_mono; p_app->br.size = g_SSM_24_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[2][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[2][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[2][1])), &(s_p_eia708->hFont[2][1])) == BCCGFX_WINLIB_P_SUCCESS); #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_mono_03_20_aa; p_app->br.size = g_cinecavB_mono_03_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[2][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[2][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[2][2])), &(s_p_eia708->hFont[2][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_sans_02_16_aa; p_app->br.size = g_cinecavB_sans_02_16_aa_size; #else p_app->br.data = (unsigned char *)g_SSP_20_aa; p_app->br.size = g_SSP_20_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_sans_02_16_mono; p_app->br.size = g_cinecavB_sans_02_16_mono_size; #else p_app->br.data = (unsigned char *)g_SSP_24_mono; p_app->br.size = g_SSP_24_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[3][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[3][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[3][0])), &(s_p_eia708->hFont[3][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_sans_02_18_aa; p_app->br.size = g_cinecavB_sans_02_18_aa_size; #else p_app->br.data = (unsigned char *)g_SSP_24_aa; p_app->br.size = g_SSP_24_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_sans_02_20_mono; p_app->br.size = g_cinecavB_sans_02_20_mono_size; #else p_app->br.data = (unsigned char *)g_SSP_28_mono; p_app->br.size = g_SSP_28_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[3][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[3][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[3][1])), &(s_p_eia708->hFont[3][1])) == BCCGFX_WINLIB_P_SUCCESS); #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_sans_02_20_aa; p_app->br.size = g_cinecavB_sans_02_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[3][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[3][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[3][2])), &(s_p_eia708->hFont[3][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_casual_02_16_aa; p_app->br.size = g_cinecavB_casual_02_16_aa_size; #else p_app->br.data = (unsigned char *)g_SCRIPT_20_aa; p_app->br.size = g_SCRIPT_20_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_casual_02_16_mono; p_app->br.size = g_cinecavB_casual_02_16_mono_size; #else p_app->br.data = (unsigned char *)g_SCRIPT_20_mono; p_app->br.size = g_SCRIPT_20_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[4][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[4][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[4][0])), &(s_p_eia708->hFont[4][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_casual_02_18_aa; p_app->br.size = g_cinecavB_casual_02_18_aa_size; #else p_app->br.data = (unsigned char *)g_SCRIPT_24_aa; p_app->br.size = g_SCRIPT_24_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_casual_02_20_mono; p_app->br.size = g_cinecavB_casual_02_20_mono_size; #else p_app->br.data = (unsigned char *)g_SCRIPT_24_mono; p_app->br.size = g_SCRIPT_24_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[4][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[4][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[4][1])), &(s_p_eia708->hFont[4][1])) == BCCGFX_WINLIB_P_SUCCESS); #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_casual_02_20_aa; p_app->br.size = g_cinecavB_casual_02_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[4][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[4][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[4][2])), &(s_p_eia708->hFont[4][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_script_02_16_aa; p_app->br.size = g_cinecavB_script_02_16_aa_size; #else p_app->br.data = (unsigned char *)g_SC_20_aa; p_app->br.size = g_SC_20_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_script_02_16_mono; p_app->br.size = g_cinecavB_script_02_16_mono_size; #else p_app->br.data = (unsigned char *)g_SC_20_mono; p_app->br.size = g_SC_20_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[5][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[5][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[5][0])), &(s_p_eia708->hFont[5][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_script_02_18_aa; p_app->br.size = g_cinecavB_script_02_18_aa_size; #else p_app->br.data = (unsigned char *)g_SC_24_aa; p_app->br.size = g_SC_24_aa_size; #endif #else #ifdef NEW_FONT_SET p_app->br.data = (unsigned char *)g_cinecavB_script_02_20_mono; p_app->br.size = g_cinecavB_script_02_20_mono_size; #else p_app->br.data = (unsigned char *)g_SC_24_mono; p_app->br.size = g_SC_24_mono_size; #endif #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[5][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[5][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[5][1])), &(s_p_eia708->hFont[5][1])) == BCCGFX_WINLIB_P_SUCCESS); #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_script_02_20_aa; p_app->br.size = g_cinecavB_script_02_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[5][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[5][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[5][2])), &(s_p_eia708->hFont[5][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif #ifdef NEW_FONT_SET p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT p_app->br.data = (unsigned char *)g_cinecavB_sc_02_16_aa; p_app->br.size = g_cinecavB_sc_02_16_aa_size; #else p_app->br.data = (unsigned char *)g_cinecavB_sc_02_16_mono; p_app->br.size = g_cinecavB_sc_02_16_mono_size; #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[6][0]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[6][0]), bapp_eia708_font_size(&(s_p_eia708->fonts[6][0])), &(s_p_eia708->hFont[6][0])) == BCCGFX_WINLIB_P_SUCCESS); p_app->br.cnt = 0; #ifdef CONFIG_8BIT_FONT p_app->br.data = (unsigned char *)g_cinecavB_sc_02_18_aa; p_app->br.size = g_cinecavB_sc_02_18_aa_size; #else p_app->br.data = (unsigned char *)g_SC_24_mono; p_app->br.size = g_SC_24_mono_size; #endif BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[6][1]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[6][1]), bapp_eia708_font_size(&(s_p_eia708->fonts[6][1])), &(s_p_eia708->hFont[6][1])) == BCCGFX_WINLIB_P_SUCCESS); #endif /*NEW_FONT_SET*/ #ifdef CONFIG_8BIT_FONT #ifdef NEW_FONT_SET p_app->br.cnt = 0; p_app->br.data = (unsigned char *)g_cinecavB_sc_02_20_aa; p_app->br.size = g_cinecavB_sc_02_20_aa_size; BAPP_ASSERT(bgfx_load_font(&(s_p_eia708->fonts[6][2]),&p_app->br) == 0); BAPP_ASSERT(BCCGFX_WINLIB_P_LoadFont(s_p_eia708->hWinLibHandle, (const char *)&(s_p_eia708->fonts[6][2]), bapp_eia708_font_size(&(s_p_eia708->fonts[6][2])), &(s_p_eia708->hFont[6][2])) == BCCGFX_WINLIB_P_SUCCESS); #endif #endif #ifdef CONFIG_NOCC_SD BAPP_ASSERT(BCCGFX_WINLIB_P_Init(&(s_p_eia708->hWinLibHandle),&(p_app->surf), (bccgfx_update_cb_t)bapp_flush_screen_partial,(bccgfx_get_wide_aspect_ratio_cb_t)bapp_get_wide_aspect_ratio_cb, p_app) == BCCGFX_WINLIB_P_SUCCESS); #else BAPP_ASSERT(BCCGFX_WINLIB_P_Init(&(s_p_eia708->hWinLibHandle),&(p_app->surf), (bccgfx_update_cb_t)bapp_flush_screen,(bccgfx_get_wide_aspect_ratio_cb_t)bapp_get_wide_aspect_ratio_cb, p_app) == BCCGFX_WINLIB_P_SUCCESS); #endif BAPP_ASSERT(BDCC_ENG_GetDefaultSettings(&(s_p_eia708->stEngineSettings)) == BCCGFX_WINLIB_P_SUCCESS); s_p_eia708->stEngineSettings.iSafeTitleX = 100; /* 40 + (3 * 20) */ s_p_eia708->stEngineSettings.iSafeTitleY = 48; s_p_eia708->stEngineSettings.iEdgeWidth = 1; s_p_eia708->stEngineSettings.Columns = 32; s_p_eia708->stEngineSettings.uiTimeOutMilliSecs = 30 * 1000; s_p_eia708->type = BDCC_ENG_Type_e708; s_p_eia708->i708_CcService = (p_app->settings.dcc.captions_basic < 1) ? 1 : p_app->settings.dcc.captions_basic; s_p_eia708->i608_CcService = (p_app->settings.dcc.captions_analog < 1) ? 1 : p_app->settings.dcc.captions_analog; if (s_p_eia708->i608_CcService>4) s_p_eia708->i608_CcService -= 4; /* cache all font cell information */ { bgfx_font_t *p_font; int fidx,sidx,w,h; for (fidx = 0; fidx < NUM_EIA_708_FONTS; ++fidx) { #ifdef NEW_FONT_SET for (sidx = 0; sidx < eFONT_SIZE_MAX; ++sidx) #else for (sidx = 0; sidx < (eFONT_SIZE_MAX - 1); ++sidx) #endif { p_font = &(s_p_eia708->fonts[fidx][sidx]); if (p_font) { bapp_eia708_cell_info(p_font,&w,&h); s_p_eia708->font_cell_info[fidx][sidx].width = w; s_p_eia708->font_cell_info[fidx][sidx].height = h; if (0 == s_p_eia708->stEngineSettings.iCharCellWidth) { s_p_eia708->stEngineSettings.iCharCellWidth = w; s_p_eia708->stEngineSettings.iCharCellHeight = h; } } else { s_p_eia708->font_cell_info[fidx][sidx].width = s_p_eia708->font_cell_info[fidx][sidx].height = 0; } BDBG_MSG(("Font[%d][%d] cell: w = %d, h = %d\n", fidx,sidx,w,h)); } } } /*s_p_eia708->type = BDCC_ENG_Type_e608; */ BAPP_ASSERT(BDCC_ENG_Open(&(s_p_eia708->hCC708Engine), s_p_eia708->hWinLibHandle) == BCCGFX_WINLIB_P_SUCCESS); BDCC_ENG_SetSettings(s_p_eia708->hCC708Engine,&(s_p_eia708->stEngineSettings)); BAPP_ASSERT(BDCC_ENG_Init( s_p_eia708->hCC708Engine, s_p_eia708->i708_CcService, s_p_eia708->type ) == BCCGFX_WINLIB_P_SUCCESS); params.name="EIA708"; params.priority = EIA_708_PRIORITY; params.stack_size = EIA708_THREAD_STACK_SIZE; params.stack = s_p_eia708->thread_stack; s_p_eia708->done = false; bos_start_task(&s_p_eia708->thread,¶ms,bapp_eia708_thread,&s_p_eia708->thread); BAPP_ASSERT(s_p_eia708->thread); return s_p_eia708; } /* Summary: adjust cell size */ void bapp_eia708_adjust_cell_size(bgfx_font_t *p_font) { BDCC_ENG_GetSettings( s_p_eia708->hCC708Engine, &s_p_eia708->stEngineSettings); bapp_eia708_get_cell_info(p_font,&(s_p_eia708->stEngineSettings.iCharCellWidth),&(s_p_eia708->stEngineSettings.iCharCellHeight)); BDBG_MSG(("Change cell size (%d,%d)\n",s_p_eia708->stEngineSettings.iCharCellWidth,s_p_eia708->stEngineSettings.iCharCellHeight)); BDCC_ENG_SetSettings( s_p_eia708->hCC708Engine, &s_p_eia708->stEngineSettings ); } /* Summary: select user selected font */ BCCGFX_WINLIB_P_Font bapp_eia708_select_font(BDCC_FontStyle style, BDCC_PenSize pensize ) { BCCGFX_WINLIB_P_Font hFont; bgfx_font_t *p_font; static bgfx_font_t *p_last_font = NULL; BDBG_MSG(("%s(%d,%d)\n",__FUNCTION__,style,pensize)); #ifdef NEW_FONT_SET #ifdef CONFIG_8BIT_FONT /* currently 3 font sets */ #else /* currently 2 font sets */ if (pensize >= BDCC_PenSize_Large) pensize = BDCC_PenSize_Standard; #endif pensize += 1; /* compensite the -1 below */ #else if ((pensize == BDCC_PenSize_Small) || (pensize > BDCC_PenSize_Large)) pensize = BDCC_PenSize_Standard; #endif switch (style) { default: case BDCC_FontStyle_Default: case BDCC_FontStyle_MonoSerifs: hFont = s_p_eia708->hFont[0][pensize - 1]; p_font = &s_p_eia708->fonts[0][pensize - 1]; break; case BDCC_FontStyle_PropSerifs: hFont = s_p_eia708->hFont[1][pensize - 1]; p_font = &s_p_eia708->fonts[1][pensize - 1]; break; case BDCC_FontStyle_Mono: hFont = s_p_eia708->hFont[2][pensize - 1]; p_font = &s_p_eia708->fonts[2][pensize - 1]; break; case BDCC_FontStyle_Prop: hFont = s_p_eia708->hFont[3][pensize - 1]; p_font = &s_p_eia708->fonts[3][pensize - 1]; break; #ifdef NEW_FONT_SET case BDCC_FontStyle_Casual: hFont = s_p_eia708->hFont[4][pensize - 1]; p_font = &s_p_eia708->fonts[4][pensize - 1]; break; case BDCC_FontStyle_Cursive: hFont = s_p_eia708->hFont[5][pensize - 1]; p_font = &s_p_eia708->fonts[5][pensize - 1]; break; case BDCC_FontStyle_SmallCaps: hFont = s_p_eia708->hFont[6][pensize - 1]; p_font = &s_p_eia708->fonts[6][pensize - 1]; break; #else case BDCC_FontStyle_Casual: case BDCC_FontStyle_Cursive: hFont = s_p_eia708->hFont[4][pensize - 1]; p_font = &s_p_eia708->fonts[4][pensize - 1]; break; case BDCC_FontStyle_SmallCaps: hFont = s_p_eia708->hFont[5][pensize - 1]; p_font = &s_p_eia708->fonts[5][pensize - 1]; break; #endif } if ((hFont == NULL) || (p_font == NULL)) { BDBG_WRN(("%s ERROR hFont = 0x%08x, p_font = 0x%08x\n",__FUNCTION__,hFont,p_font)); hFont = s_p_eia708->hFont[0][0]; p_font = &s_p_eia708->fonts[0][0]; } if (p_font != p_last_font) { bapp_eia708_adjust_cell_size(p_font); p_last_font = p_font; } return hFont; } /* Summary: Release all resources */ void bapp_eia708_close(bapp_eia708_t p_eia708) { BAPP_ASSERT(s_p_eia708); bos_delete_mutex(&p_eia708->mutex); #ifdef CONFIG_OLD_PARSER if (s_p_eia708->CCBufInfo.pOutputBuf) free(s_p_eia708->CCBufInfo.pOutputBuf); if (s_p_eia708->CCBufInfo.pOutputBuf) free(s_p_eia708->CCBufInfo.pOutputBuf); if (s_p_eia708->CCBufInfo.pOutputBuf) free(s_p_eia708->CCBufInfo.pOutputBuf); #endif if (s_p_eia708->thread_stack) free(s_p_eia708->thread_stack); free(s_p_eia708); } /* * Callback to process CC data */ extern bapp_t *s_p_app; void bapp_eia708_cb(unsigned char* data, /* the data buffer, containing data_len valid bytes */ int data_len, /* the number of valid bytes in data */ bool banalog ) { cc_buf_t *p_cc_buf; unsigned int flags; BAPP_ASSERT(s_p_eia708); BAPP_ASSERT((unsigned int)s_p_eia708 == (unsigned int)s_p_app->eia708); if (s_p_eia708->enabled) { if (data_len > CC_BUF_SIZE) { BDBG_WRN(("%s:%d data_len %d > %d\n",__FUNCTION__,__LINE__,data_len,CC_BUF_SIZE)); return; } if (banalog && (s_p_eia708->type != BDCC_ENG_Type_e608) ) { /* 608 CC */ /* enable also call RESET. */ BDBG_WRN(("Reset DCC as 608 mode")); s_p_eia708->type = BDCC_ENG_Type_e608; s_p_eia708->mode_change = true; } else if (!banalog && (s_p_eia708->type != BDCC_ENG_Type_e708) ) { BDBG_WRN(("Reset DCC as 708 mode")); s_p_eia708->type = BDCC_ENG_Type_e708; s_p_eia708->mode_change = true; } flags = bos_enter_critical(); p_cc_buf = (cc_buf_t*)remlh(&(s_p_eia708->free_cc_list)); bos_exit_critical(flags); if (!p_cc_buf) { BDBG_WRN(("%s:%d no free CC buffers\n",__FUNCTION__,__LINE__)); return; } p_cc_buf->size = data_len; memcpy(p_cc_buf->buf,data,p_cc_buf->size); flags = bos_enter_critical(); inslt(&(s_p_eia708->cc_list),p_cc_buf); bos_exit_critical(flags); } else { /* actual reset will be at bapp_eia708_enable */ if (banalog && (s_p_eia708->type != BDCC_ENG_Type_e608)) { s_p_eia708->type = BDCC_ENG_Type_e608; } else if (!banalog && (s_p_eia708->type != BDCC_ENG_Type_e708)) { s_p_eia708->type = BDCC_ENG_Type_e708; } } } /* implemented in bdccengine.c */ extern uint32_t BDCC_ENG_GetPktSeqNumErrorCount(BDCC_ENG_Handle hEngine); extern void BDCC_ENG_ResetPktSeqNumErrorCount(BDCC_ENG_Handle hEngine); /* * Callback to get some DCC internal information, current PKT sequence number error counts */ void bapp_eia708_dcc_status_cb(uint32_t *pkt_sequence_num_errors) { BAPP_ASSERT(s_p_eia708); BAPP_ASSERT((unsigned int)s_p_eia708 == (unsigned int)s_p_app->eia708); if (pkt_sequence_num_errors) { *pkt_sequence_num_errors = BDCC_ENG_GetPktSeqNumErrorCount(s_p_eia708->hCC708Engine); } } /* * Callback to get some DCC internal information, current PKT sequence number error counts */ void bapp_eia708_dcc_reset_pkt_error_count(void) { BAPP_ASSERT(s_p_eia708); BAPP_ASSERT((unsigned int)s_p_eia708 == (unsigned int)s_p_app->eia708); BDCC_ENG_ResetPktSeqNumErrorCount(s_p_eia708->hCC708Engine); } /* Summary: override the settings from the user */ void bapp_eia708_overrides(bapp_eia708_t p_eia708) { BDCC_ENG_OverRides overrides; unsigned int overrideMask = BDCC_ATTR_MASK_NONE; memset(&overrides, 0, sizeof(BDCC_ENG_OverRides)); //if (p_eia708->p_app->settings.dcc.captions_font > 0) { overrides.FontStyle = p_eia708->p_app->settings.dcc.captions_font; /* it is kind of misleading to use FONTSTYLE for font */ overrideMask |= BDCC_ATTR_MASK_FONTSTYLE; bapp_eia708_select_font(overrides.FontStyle, 0 == p_eia708->p_app->settings.dcc.captions_font_size ? BDCC_PenSize_Standard : p_eia708->p_app->settings.dcc.captions_font_size - 1); BDBG_MSG(("%s:%d font = %d\n",__FUNCTION__,__LINE__,overrides.FontStyle)); } if (p_eia708->p_app->settings.dcc.captions_font_size > 0) { overrides.PenSize = p_eia708->p_app->settings.dcc.captions_font_size - 1 ; overrideMask |= BDCC_ATTR_MASK_PENSIZE; bapp_eia708_select_font(overrides.FontStyle, overrides.PenSize ); BDBG_MSG(("%s:%d font = %d\n",__FUNCTION__,__LINE__,overrides.PenSize)); } if (p_eia708->p_app->settings.dcc.captions_font_style == 2) { overrideMask |= BDCC_ATTR_MASK_ITALICS; overrides.Italics = 1; BDBG_MSG(("%s:%d captions_font_style = %d\n",__FUNCTION__,__LINE__,p_eia708->p_app->settings.dcc.captions_font_style)); } if (p_eia708->p_app->settings.dcc.captions_font_style == 3) { overrideMask |= BDCC_ATTR_MASK_UNDERLINE; overrides.Underline = 1; BDBG_MSG(("%s:%d captions_font_style = %d\n",__FUNCTION__,__LINE__,p_eia708->p_app->settings.dcc.captions_font_style)); } if ((p_eia708->p_app->settings.dcc.captions_font_color > 0) || (p_eia708->p_app->settings.dcc.captions_font_opacity > 0)) { switch (p_eia708->p_app->settings.dcc.captions_font_color) { case 0: overrides.FgColor = 0x3F; break; case 1: overrides.FgColor = 0x3F; break; case 2: overrides.FgColor = 0; break; case 3: overrides.FgColor = 0x30; break; case 4: overrides.FgColor = 0x0C; break; case 5: overrides.FgColor = 0x03; break; case 6: overrides.FgColor = 0x3C; break; case 7: overrides.FgColor = 0x33; break; case 8: overrides.FgColor = 0x0F; break; } switch (p_eia708->p_app->settings.dcc.captions_font_opacity) { case 3: overrides.FgOpacity = BDCC_Opacity_Solid; break; case 4: overrides.FgOpacity = BDCC_Opacity_Flash; break; case 2: overrides.FgOpacity = BDCC_Opacity_Translucent; break; case 1: overrides.FgOpacity = BDCC_Opacity_Transparent; break; case 0: overrides.FgOpacity = BDCC_Opacity_Solid; break; } overrideMask |= BDCC_ATTR_MASK_PENFG; BDBG_MSG(("%s:%d font color = %d\n",__FUNCTION__,__LINE__,overrides.FgColor)); BDBG_MSG(("%s:%d font effect = %d\n",__FUNCTION__,__LINE__,overrides.FgOpacity)); } if ((p_eia708->p_app->settings.dcc.captions_back_color > 0) || (p_eia708->p_app->settings.dcc.captions_back_opacity > 0)) { switch (p_eia708->p_app->settings.dcc.captions_back_color) { case 0: overrides.BgColor = 0; break; case 1: overrides.BgColor = 0x3F; break; case 2: overrides.BgColor = 0; break; case 3: overrides.BgColor = 0x30; break; case 4: overrides.BgColor = 0x0C; break; case 5: overrides.BgColor = 0x03; break; case 6: overrides.BgColor = 0x3C; break; case 7: overrides.BgColor = 0x33; break; case 8: overrides.BgColor = 0x0F; break; } switch (p_eia708->p_app->settings.dcc.captions_back_opacity) { case 3: overrides.BgOpacity = BDCC_Opacity_Solid; break; case 4: overrides.BgOpacity = BDCC_Opacity_Flash; break; case 2: overrides.BgOpacity = BDCC_Opacity_Translucent; break; case 1: overrides.BgOpacity = BDCC_Opacity_Transparent; break; case 0: overrides.BgOpacity = BDCC_Opacity_Solid; break; } overrideMask |= BDCC_ATTR_MASK_PENBG; BDBG_MSG(("%s:%d bg color = %d\n",__FUNCTION__,__LINE__,overrides.BgColor)); BDBG_MSG(("%s:%d bg effect = %d\n",__FUNCTION__,__LINE__,overrides.BgOpacity)); } if (p_eia708->p_app->settings.dcc.captions_edge_color > 0) { switch (p_eia708->p_app->settings.dcc.captions_edge_color) { case 0: overrides.EdgeColor = 0x3F; break; case 1: overrides.EdgeColor = 0x3F; break; case 2: overrides.EdgeColor = 0; break; case 3: overrides.EdgeColor = 0x30; break; case 4: overrides.EdgeColor = 0x0C; break; case 5: overrides.EdgeColor = 0x03; break; case 6: overrides.EdgeColor = 0x3C; break; case 7: overrides.EdgeColor = 0x33; break; case 8: overrides.EdgeColor = 0x0F; break; } overrideMask |= BDCC_ATTR_MASK_EDGECOLOR; } if (p_eia708->p_app->settings.dcc.captions_edge_type > 0) { overrides.EdgeType = (BDCC_Edge)p_eia708->p_app->settings.dcc.captions_edge_type; overrideMask |= BDCC_ATTR_MASK_EDGETYPE; } BDBG_MSG(("%s:%d service = %d\n",__FUNCTION__,__LINE__, (s_p_eia708->type==BDCC_ENG_Type_e608)?s_p_eia708->i608_CcService:s_p_eia708->i708_CcService)); BDCC_ENG_Override( s_p_eia708->hCC708Engine, overrideMask, &overrides ); BDCC_ENG_Reset( s_p_eia708->hCC708Engine, false, s_p_eia708->type, (s_p_eia708->type==BDCC_ENG_Type_e608)?s_p_eia708->i608_CcService:s_p_eia708->i708_CcService ); } /* Summary: reset 708 engine if needed */ void bapp_eia708_reset(bapp_eia708_t p_eia708) { if (bos_acquire_mutex(&(p_eia708->mutex),EIA708_ENABLE_TIMEOUT) != b_ok) { BDBG_ERR(("%s bos_acquire_mutex failed\n",__FUNCTION__)); return; } if (p_eia708 && p_eia708->enabled) { BDCC_ENG_Reset( s_p_eia708->hCC708Engine, false, s_p_eia708->type, (s_p_eia708->type==BDCC_ENG_Type_e608)?s_p_eia708->i608_CcService:s_p_eia708->i708_CcService ); } bos_release_mutex(&(p_eia708->mutex)); } /* Summary: Check Enable/Disable CC */ bool bapp_eia708_enabled(bapp_eia708_t p_eia708) { if (!p_eia708) return 0; return p_eia708->enabled; } /* Summary: Enable/Disable CC */ void bapp_eia708_enable(bapp_eia708_t p_eia708, bool enable) { cc_buf_t *p_cc_buf; BAPP_ASSERT(s_p_eia708); if (!p_eia708) return; BDBG_WRN(("%s:%d enable = %d - current %d (type:%d)\n",__FUNCTION__,__LINE__,enable,p_eia708->enabled,p_eia708->type)); if (p_eia708->p_app->pin_limit_timeout && p_eia708->p_app->pin_limit_override && bapp_get_block_status(p_eia708->p_app)) { BDBG_WRN(("shouldn't update screen (pin_limit_timeout:%d)",p_eia708->p_app->pin_limit_timeout)); return; } if (bos_acquire_mutex(&(p_eia708->mutex),EIA708_ENABLE_TIMEOUT) != b_ok) { BDBG_ERR(("%s bos_acquire_mutex failed(enable = %d)\n",__FUNCTION__,enable)); return; } if (p_eia708->enabled == enable) { bos_release_mutex(&(p_eia708->mutex)); BDBG_MSG(("%s:%d release\n",__FUNCTION__,__LINE__)); BDBG_MSG(("708 already enabled eia708->enabled = %d = enable = %d)\n",p_eia708->enabled,enable)); return; } p_eia708->enabled = enable; while ((p_cc_buf = (cc_buf_t*)remlh(&(s_p_eia708->cc_list)))) { inslt(&(s_p_eia708->free_cc_list),p_cc_buf); } if (p_eia708->enabled) { bapp_eia708_overrides(p_eia708); bgfx_fill_rect(&p_eia708->p_app->surf,0,0,p_eia708->p_app->surf.surface.width,p_eia708->p_app->surf.surface.height,eCOLOR_CLEAR); bapp_set_palette(p_eia708->p_app,ePALETTE_EIA_708); #ifdef CONFIG_NOCC_SD bapp_flush_screen_partial(p_eia708->p_app, eGRAPHICS_HD); #else bapp_flush_screen(p_eia708->p_app); #endif } else { bgfx_fill_rect(&p_eia708->p_app->surf,0,0,p_eia708->p_app->surf.surface.width,p_eia708->p_app->surf.surface.height,eCOLOR_CLEAR); bapp_set_palette(p_eia708->p_app,ePALETTE_APP); #ifdef CONFIG_NOCC_SD bapp_flush_screen_partial(p_eia708->p_app, eGRAPHICS_HD); #else bapp_flush_screen(p_eia708->p_app); #endif } bos_release_mutex(&(p_eia708->mutex)); if (!p_eia708->enabled) { static chm_event_t evt; evt.type = eCHM_EVT_REDRAW; evt.id = 0; evt.ticks = 0; /* JPF TODO evt.id = p_eia708->p_app->cur_ch_num; */ bos_post_event(p_eia708->p_app->msg_queue,(b_event_t*)&evt); } BDBG_MSG(("%s:%d release\n",__FUNCTION__,__LINE__)); } /* Summary: EIA 708 Processing Thread */ static void bapp_eia708_thread(void *data) { #ifdef CONFIG_OLD_PARSER DCCERR dccerr; #endif unsigned int start_ticks,flags; int delta,bytes_produced; unsigned char dumby; /* we need this to do periodic update of the screen for scrolling */ unsigned char* triplets = NULL; cc_buf_t *p_cc_buf; BAPP_ASSERT(s_p_eia708); #if 0 BDBG_SetModuleLevel("eia708",BDBG_eWrn); BDBG_SetModuleLevel("bdcc_winlib",BDBG_eWrn); BDBG_SetModuleLevel("bdccgfx",BDBG_eMsg); BDBG_SetModuleLevel("bdcc_608trans",BDBG_eMsg); BDBG_SetModuleLevel("bdccengine",BDBG_eMsg); BDBG_SetModuleLevel("bdccservice",BDBG_eMsg); BDBG_SetModuleLevel("bdccpacket",BDBG_eMsg); BDBG_SetModuleLevel("bdcc_coding",BDBG_eMsg); BDBG_SetModuleLevel("bdccintgfx",BDBG_eMsg); BDBG_SetModuleLevel("bdcc_608trans",BDBG_eMsg); #endif while (!s_p_eia708->done) { if (!s_p_eia708->enabled) { bos_sleep(100); continue; } if (s_p_eia708->mode_change) { BDCC_ENG_Reset( s_p_eia708->hCC708Engine, false, s_p_eia708->type, (s_p_eia708->type==BDCC_ENG_Type_e608)?s_p_eia708->i608_CcService:s_p_eia708->i708_CcService); s_p_eia708->mode_change = false; } flags = bos_enter_critical(); p_cc_buf = (cc_buf_t*)remlh(&(s_p_eia708->cc_list)); bos_exit_critical(flags); if (p_cc_buf) { bytes_produced = 0; if (!s_p_eia708->enabled) { flags = bos_enter_critical(); inslt(&(s_p_eia708->free_cc_list),p_cc_buf); bos_exit_critical(flags); //bos_sleep(500); bos_sleep(100); continue; } start_ticks = bos_getticks(); #ifdef CONFIG_OLD_PARSER s_p_eia708->DTVCCBufInfo.OutputBytesProduced = 0; dccerr = DccTransport_Process(&s_p_eia708->pTransport, p_cc_buf->buf, p_cc_buf->size, &s_p_eia708->CCBufInfo, &s_p_eia708->DTVCCBufInfo); bytes_produced = s_p_eia708->DTVCCBufInfo.OutputBytesProduced; triplets = (unsigned char *)s_p_eia708->DTVCCBufInfo.pOutputBuf; #else bytes_produced = p_cc_buf->size; triplets = p_cc_buf->buf; #endif flags = bos_enter_critical(); inslt(&(s_p_eia708->free_cc_list),p_cc_buf); bos_exit_critical(flags); delta = bos_getticks() - start_ticks; if (delta > MS_TO_TICKS(16)) { BDBG_WRN(("### DccTransport_Process %d ms\n",TICKS_TO_MS(delta))); //printf("?\n"); } //start_ticks = bos_getticks(); } else { triplets = NULL; bytes_produced = 0; } //BDBG_MSG(("BDCC_ENG_Process %d bytes\n",bytes_produced)); //BDBG_MSG(("%s:%d acquire\n",__FUNCTION__,__LINE__)); start_ticks = bos_getticks(); if (bos_acquire_mutex(&(s_p_eia708->mutex),EIA708_ENABLE_TIMEOUT) == b_ok) { if (triplets == NULL) triplets = &dumby; if (BDCC_ENG_Process(s_p_eia708->hCC708Engine, triplets, bytes_produced/3) != BCCGFX_WINLIB_P_SUCCESS) { BDBG_MSG(("BDCC_ENG_Process failed to process %d bytes\n",bytes_produced)); } bos_release_mutex(&(s_p_eia708->mutex)); //BDBG_MSG(("%s:%d release\n",__FUNCTION__,__LINE__)); } delta = bos_getticks() - start_ticks; if (delta > MS_TO_TICKS(32)) { BDBG_MSG(("### %d ms\n",TICKS_TO_MS(delta))); //printf("?\n"); } //if (bytes_produced) { bos_sleep(5); } } /* while (!s_p_eia708->done) */ } void bapp_eia708_get_cc_info(bapp_eia708_t p_eia708, int *type, int *service) { BAPP_ASSERT(s_p_eia708); *type = (s_p_eia708->type == BDCC_ENG_Type_e608)?0:1; *service = (*type==0)?s_p_eia708->i608_CcService:s_p_eia708->i708_CcService; } void bapp_eia708_set_cc_service(bapp_eia708_t p_eia708, int type, int service) { BAPP_ASSERT(s_p_eia708); if (type == 0) { if (service>4) service -= 4; s_p_eia708->i608_CcService = service; } else s_p_eia708->i708_CcService = service; } static int bapp_eia708_p_color2index(uint32_t ARGB) { int ColorIndex = 2; static unsigned int ColorLookup[] = {0,128,192,255} ; unsigned int red, grn, blu, i; unsigned char RGB; red = ((ARGB) >> 16) & 0xFF ; grn = ((ARGB) >> 8) & 0xFF ; blu = ((ARGB) >> 0) & 0xFF ; for (i = 0; i<4; i++) { if(red == ColorLookup[i]) break; } RGB = (i << 4) & 0x30; for (i = 0; i<4; i++) { if(grn == ColorLookup[i]) break; } RGB |= (i << 2) & 0x0C; for (i = 0; i<4; i++) { if(blu == ColorLookup[i]) break; } RGB |= (i << 0) & 0x03; switch (RGB) { case 0x00: ColorIndex = 2; break; case 0x2a: case 0x3F: ColorIndex = 1; break; case 0x30: ColorIndex = 3; break; case 0x0C: ColorIndex = 4; break; case 0x03: ColorIndex = 5; break; case 0x3C: ColorIndex = 6; break; case 0x33: ColorIndex = 7; break; case 0x0F: ColorIndex = 8; break; } return ColorIndex; } static int bapp_eia708_p_color2alpha(uint32_t ARGB) { unsigned char alpha; alpha = (ARGB>>24)&0xFF; switch (alpha) { case 0x00: return 1; /* transparent */ case 0x50: return 2; /* transfluent */ case 0xFF: default: return 3; /* solid */ } } int bapp_eia708_get_dcc_settings(bapp_eia708_t p_eia708, void *psettings) { unsigned int colors[3]; unsigned int style=0; dcc_settings_t *settings = (dcc_settings_t *)psettings; memset(settings, 0, sizeof(dcc_settings_t)); if (BDCC_WINLIB_P_GetActiveWindowSettings(p_eia708->hWinLibHandle, colors, &style)) { settings->captions_edge_color = bapp_eia708_p_color2index(colors[2]); settings->captions_edge_type = (style>>8)&0xFF; settings->captions_font_color = bapp_eia708_p_color2index(colors[0]); settings->captions_back_color = bapp_eia708_p_color2index(colors[1]); if (style&0x02) settings->captions_font_style = 3; /* underline */ else if (style&0x01) settings->captions_font_style = 2; /* italic */ else settings->captions_font_style = 1; /* solid */ if (style & 0x04) settings->captions_font_opacity = 4; /* flashsing */ else settings->captions_font_opacity = bapp_eia708_p_color2alpha(colors[0]); if (style & 0x08) settings->captions_back_opacity = 4; else settings->captions_back_opacity = bapp_eia708_p_color2alpha(colors[1]); return 1; } else { return 0; } }