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
}