void decode_708 (const unsigned char *data, int datalength, cc708_service_decoder* decoders) { /* Note: The data has this format: 1 byte for cc_valid and cc_type 2 bytes for the actual data */ for (int i=0; i<datalength; i+=3) { unsigned char cc_valid=data[i] & 0x04; unsigned char cc_type=data[i] & 0x03; switch (cc_type) { case 0: // only use 608 as fallback if (!decoders[0].parent->m_seen708) decode_cc(decoders[0].parent->m_cc608decoder, (uint8_t*)data+i, 3); break; case 2: if (cc_valid==0) // This ends the previous packet if complete { if (check_current_packet_complete(decoders)) { process_current_packet(decoders); } } else { if (decoders[0].parent->m_current_packet_length < 254) { decoders[0].parent->m_current_packet[decoders[0].parent->m_current_packet_length++]=data[i+1]; decoders[0].parent->m_current_packet[decoders[0].parent->m_current_packet_length++]=data[i+2]; } } break; case 3: process_current_packet(decoders); if (cc_valid) { if (decoders[0].parent->m_current_packet_length < 128) { decoders[0].parent->m_current_packet[decoders[0].parent->m_current_packet_length++]=data[i+1]; decoders[0].parent->m_current_packet[decoders[0].parent->m_current_packet_length++]=data[i+2]; } } break; default: break; } } }
int CDVDOverlayCodecCC::Decode(BYTE* pData, int iSize, double pts, double duration) { // minimum amount of data is even more for cc decode_cc(m_cc_decoder, pData, iSize); if (iSize >= 2) { Flush(); m_pCurrentOverlay = new CDVDOverlayText(); cc_buffer_t* data = &m_cc_decoder->on_buf->channel[0]; for (int r = 0; r < CC_ROWS; r++) { if (data->rows[r].num_chars > 0) { char row_text[CC_COLUMNS + 1]; row_text[0] = 0; for (int c = 0; c < data->rows[r].num_chars; c++) { row_text[c] = data->rows[r].cells[c].c; } row_text[data->rows[r].num_chars] = '\n'; row_text[data->rows[r].num_chars + 1] = 0; CDVDOverlayText::CElementText* pText = new CDVDOverlayText::CElementText(row_text); m_pCurrentOverlay->AddElement(pText); } } return OC_OVERLAY; /* m_pCurrentOverlay->iPTSStartTime = pts; m_pCurrentOverlay->iPTSStopTime = 0LL; char test[64]; sprintf(test, "cc data : %"PRId64, pts); CDVDOverlayText::CElementText* pText = new CDVDOverlayText::CElementText(test); m_pCurrentOverlay->AddElement(pText); return OC_OVERLAY;*/ } return OC_BUFFER; }