/******************************************** * NAME: cc_vbi_show_on * set vbi display or not * * Returns : none * Parameter Flow Description * * ------------------------------------------------------------------------------ * BOOL bOn IN Show CC via VBI. TRUE: Show, False: Not Show * ------------------------------------------------------------------------------ * Additional information: ******************************************/ void cc_vbi_show_on(BOOL bOn) { #define CMD_ERASE_DISPLAYED_MEMORY_NONDIS_CH1 0x94 #define CMD_ERASE_DISPLAYED_MEMORY_NONDIS_CH2 0x1C #define CMD_ERASE_DISPLAYED_MEMORY_DIS 0x2C UINT16 bdata1,bdata2; if(bOn) { disable_vbioutput(FALSE); } else { disable_vbioutput(TRUE); //Erase Channel 1 bdata1=CMD_ERASE_DISPLAYED_MEMORY_NONDIS_CH1; bdata2=CMD_ERASE_DISPLAYED_MEMORY_DIS; sub_sdhd_write_cc_data(0,(bdata2<<8)|bdata1); // 1:top, 0:bot sub_sdhd_write_cc_data(1,(bdata2<<8)|bdata1); // 1:top, 0:bot //Erase Channel 2 bdata1=CMD_ERASE_DISPLAYED_MEMORY_NONDIS_CH2; bdata2=CMD_ERASE_DISPLAYED_MEMORY_DIS; sub_sdhd_write_cc_data(0,(bdata2<<8)|bdata1); // 1:top, 0:bot sub_sdhd_write_cc_data(1,(bdata2<<8)|bdata1); // 1:top, 0:bot } }
/******************************************** * NAME: atsc_user_data_cc * callback func to: 1 vbi output, 2 push user data for cc and dtvcc using * * Returns : void * * Parameter Flow Description * ------------------------------------------------------------------------------ * UINT8 FieldPolar IN no use * ------------------------------------------------------------------------------ * Additional information: ******************************************/ static void atsc_user_data_cc(UINT8 FieldPolar) { UINT8 i=0,j=0,cc_cnt=0; UINT8 byte1,byte2, pariety_check_1=0,pariety_check_2=0; UINT8 cc_field=0; BOOL push_1=FALSE, push_2=FALSE; static BOOL XDS=FALSE; //if(FieldPolar == 0) return;// current is Top field linemeet ,return UINT8 rd_idx; //g_vbi_priv->vbi_line21_push_by_cc((((g_user_data[rd_idx][i*3+8])&0X7F)<<8)|(g_user_data[rd_idx][i*3+9])&0X7F); // if(g_user_data_array_cnt>0) { rd_idx = g_user_data_array_rd; if(g_user_data[rd_idx][0]==0x47 //'G' &&g_user_data[rd_idx][1]==0x41 //'A' &&g_user_data[rd_idx][2]==0x39 //'9' &&g_user_data[rd_idx][3]==0x34 //'4' &&g_user_data[rd_idx][4]==0x03 //cc indicator &&(g_user_data[rd_idx][5]&0x40)==0x40 //process_cc_data_flag ) { cc_cnt = g_user_data[rd_idx][5]&0x1f; /* if(*ccg_vbi27_cc_by_osd != 0) cc_cnt = (cc_cnt>2)?2:cc_cnt;// xing 20070522 for DTVCC unused */ //em_data = g_user_data[6]; //ccvbi_CC=FALSE; for(i=0;i<cc_cnt;i++) { if((g_user_data[rd_idx][i*3+7]&0x04) == 0x04)//cc_valid == 1 { pariety_check_1=0;pariety_check_2=0; byte1=(g_user_data[rd_idx][i*3+8])&0x7F; byte2=(g_user_data[rd_idx][i*3+9])&0x7F; if((byte1==0x01 && byte2==0x05) ||(byte1==0x09 && byte2==0x01) || (byte1==0x09 && byte2==0x02) \ || (byte1==0x0a && byte2==0x01) || (byte1==0x0a && byte2==0x02) ) //v-chip , puplic service & puplic service cont. XDS=TRUE; if((byte1>=0x10&&byte1<=0x1f)&&(!(byte2>0x2f&&byte2<0x40)) && byte2>=0x20&&byte2<=0x7f)//control data XDS=FALSE; //=== if((byte1>=0x10&&byte1<=0x1f)&&(!(byte2>0x2f&&byte2<0x40)) && byte2>=0x20&&byte2<=0x7f && \ (!((byte1==0x12 || byte1==0x13|| byte1==0x1A|| byte1==0x1B) && (byte2>0x1f&&byte2<0x40) ))) { ccvbi_CC=TRUE; } //=== push_1 = (*ccg_vbi27_cc_by_osd==0x00 || *ccg_vbi27_cc_by_osd==0x01 || *ccg_vbi27_cc_by_osd==0x02|| *ccg_vbi27_cc_by_osd==0x05|| *ccg_vbi27_cc_by_osd==0x06); push_2 = ( XDS || *ccg_vbi27_cc_by_osd==0x00 || *ccg_vbi27_cc_by_osd==0x03 || *ccg_vbi27_cc_by_osd==0x04|| *ccg_vbi27_cc_by_osd==0x07|| *ccg_vbi27_cc_by_osd==0x08); if((g_user_data[rd_idx][i*3+7]&0x03) == 0x00)//NTSC_CC_FIELD_1 { for(j=0;j<8;j++)//pariety check { if( (((g_user_data[rd_idx][i*3+8])>>j)&0x01) == 0x01) pariety_check_1 += 1; if( (((g_user_data[rd_idx][i*3+9])>>j)&0x01) == 0x01) pariety_check_2 += 1; //libc_printf("%3x - %3x\n",(g_user_data[rd_idx][i*3+8]),(g_user_data[rd_idx][i*3+9])); } if( (pariety_check_1 % 2)==0 || (pariety_check_2 % 2)==0 ) continue; cc_field=1; if(TRUE == ccg_vbi27_pconfig_par->cc_by_vbi && g_disable_vbioutput==FALSE) sub_sdhd_write_cc_data(1,(g_user_data[rd_idx][i*3+9]<<8)|g_user_data[rd_idx][i*3+8]); // 1:top, 0:bot //ccvbi_CC=TRUE; if(ccg_disable_process_cc==TRUE) { //soc_printf("ccrecv_PAC=%d\n",ccrecv_PAC); ccrecv_PAC=FALSE; //MEMSET(g_user_data[rd_idx],0x00,USER_DATA_LENGTH_MAX); //return; } if(push_1 )//cc1 cc2 tt1 tt2 { if(NULL != g_vbi_priv->vbi_line21_push_by_cc) { cc_push_field(cc_field); g_vbi_priv->vbi_line21_push_by_cc((byte1<<8)|byte2); } } // } else if((g_user_data[rd_idx][i*3+7]&0x03) == 0x01)//NTSC_CC_FIELD_2 { for(j=0;j<8;j++)//pariety check { if( (((g_user_data[rd_idx][i*3+8])>>j)&0x01) == 0x01) pariety_check_1 += 1; if( (((g_user_data[rd_idx][i*3+9])>>j)&0x01) == 0x01) pariety_check_2 += 1; } if( (pariety_check_1 % 2)==0 || (pariety_check_2 % 2)==0 ) continue; cc_field=2; if(TRUE == ccg_vbi27_pconfig_par->cc_by_vbi && g_disable_vbioutput==FALSE) sub_sdhd_write_cc_data(0,(g_user_data[rd_idx][i*3+9]<<8)|g_user_data[rd_idx][i*3+8]); // 1:top, 0:bot //ccvbi_CC=TRUE; if(ccg_disable_process_cc==TRUE) { ccrecv_PAC=FALSE; //MEMSET(g_user_data[rd_idx],0x00,USER_DATA_LENGTH_MAX); //return; } if(push_2 )//cc3 cc4 tt3 tt4 if(NULL != g_vbi_priv->vbi_line21_push_by_cc) { cc_push_field(cc_field); g_vbi_priv->vbi_line21_push_by_cc((byte1<<8)|byte2); } } else if((((g_user_data[rd_idx][i*3+7]&0x03) == 0x03) || ((g_user_data[rd_idx][i*3+7]&0x03) == 0x02)) && (g_dtv_cc_service !=0) && (*ccg_vbi27_cc_by_osd==0x00)) //xing 20070522 for DTVCC Packet Start