int fc8050_demux(fci_u8* data, fci_u32 length) { int res = BBM_OK; fci_u32 i; fci_u8 sync_error = 0; for(i = 0; i < length; i += 188) { if(data[i] == SYNC_MASK_FIC) { res = ts_fic_gather(&data[i], 188); } else if((data[i] == SYNC_MASK_VIDEO) || (data[i] == SYNC_MASK_VIDEO1)) { res = ts_dmb_gather(&data[i], 188); } else if((data[i] & 0xC0) == 0xC0) { res = ts_nv_gather(&data[i], 188); } else { //PRINTF(" %02X", data[i]); sync_error++; } } if(sync_error > 0) { sync_error_cnt += sync_error; if(sync_error_cnt >= 5) return BBM_E_MUX_SYNC; } else{ sync_error_cnt = 0; } return res; }
int fc8050_demux(u8* data, u32 length, u8** res_ptr, u32* res_size) #endif { int res = BBM_OK; u32 i;//, pos; u8 sync_error = 0; int is_video_data = FALSE; //int fic_len = 0; #ifdef FC8050_USE_TSIF int msc_idx = 0; int dab_len = 0; #endif #ifdef FEATURE_TDMB_DAB_BUF u8* data = NULL; if(serviceType == TDMB_BB_SVC_DAB) { memcpy(dab_buf, data_buf, length); data = dab_buf; } else { data = data_buf; } #endif #ifdef FEATURE_DMB_DATA_DUMP dmb_data_dump(data, length, FILENAME_PRE_DEMUX); #endif for(i = 0; i < length; i += 188) { if(data[i] == SYNC_MASK_FIC) { #ifdef FC8050_USE_TSIF ts_data.fic_size = 0; res = ts_fic_gather(&data[i], 188, ts_data.fic_buf, &ts_data.fic_size); if(ts_data.fic_size) { // FIC데이터는 384 만큼만 한다. memcpy((void*)ts_data.fic_buf, sTSFic.buffer, ts_data.fic_size); } #else res = ts_fic_gather(&data[i], 188); #endif } else if((data[i] == SYNC_MASK_VIDEO) || (data[i] == SYNC_MASK_VIDEO1)) { is_video_data = TRUE; res = ts_dmb_gather(&data[i], 188); #ifdef FC8050_USE_TSIF if(msc_idx != i) { memcpy(&data[msc_idx * 188], &data[i], 188); } msc_idx ++; #endif } else if((data[i] & 0xC0) == 0xC0) { #ifdef FC8050_USE_TSIF ts_data.msc_size = 0; res = ts_nv_gather(&data[i], 188, ts_data.msc_buf, &ts_data.msc_size); if(ts_data.msc_size) { memcpy((void*)&ts_data.msc_buf[dab_len], sTSNVideo[3].buffer, ts_data.msc_size); dab_len += ts_data.msc_size; } #else res = ts_nv_gather(&data[i], 188); #endif } else { //PRINTF(" %02X", data[i]); //TDMB_MSG_FCI_BB("[%s] sync_error \n", __func__); sync_error++; } } #ifdef FC8050_USE_TSIF if(is_video_data) { ts_data.msc_size = msc_idx * 188; } else { ts_data.msc_size = dab_len; } #ifdef FEATURE_DMB_DATA_DUMP dmb_data_dump(ts_data.msc_buf, ts_data.msc_size, FILENAME_POST_DEMUX); #endif //TDMB_MSG_FCI_BB("[%s] msc_size[%d], fic_size[%d], length[%d]\n", __func__, ts_data.msc_size, ts_data.fic_size, length); if(sync_error) { TDMB_MSG_FCI_BB("[%s] sync_error cnt[%d]\n", __func__, sync_error); } if(ts_data.msc_size) { ts_data.type = MSC_DATA; if(ts_data.fic_size) { ts_data.type = FIC_MSC_DATA; } } else if(ts_data.fic_size) { ts_data.type = FIC_DATA; } sync_error_cnt = 0; return ts_data.msc_size; #else if(sync_error > 0) { sync_error_cnt += sync_error; if(sync_error_cnt >= 5) return BBM_E_MUX_SYNC; } else { sync_error_cnt = 0; } fc8050_get_demux_buffer(res_ptr, res_size); return res; #endif }