예제 #1
0
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;
    }
  }
}
예제 #2
0
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;
}