I think this block would be more readable as a `switch`, with the `cc_valid` checks inside, like:

    switch (cc_type) {
      case CCTYPE_708_START:
        if (cc_valid) {
          // The previous packet will be complete
          gst_cc_decoder_process_cea708_packet (decoder, user_data);

          decoder->cea708_buffer[decoder->cea708_index++] = cc_data_1;
          decoder->cea708_buffer[decoder->cea708_index++] = cc_data_2;
        }
        break;
      case CCTYPE_708_ADD:
        if (cc_valid) {
          // Add on to the current DTVCC packet
          if (decoder->cea708_index < DTVCC_LENGTH - 2) {
            decoder->cea708_buffer[decoder->cea708_index++] = cc_data_1;
            decoder->cea708_buffer[decoder->cea708_index++] = cc_data_2;
          } else {
            GST_ERROR ("cea708_buffer overflow!");
          }
        } else {
          // This packet should be ignored, but if there is a current
          // DTVCC packet then this is the end.
          gst_cc_decoder_process_cea708_packet (decoder, user_data);
        }
        break;
      case CCTYPE_608_CC1:
        if (cc_valid && (decoder->cea608_cc1_index < DTVCC_LENGTH - 2)) {
          if ((cc_data_1 < ' ') || (cc_data_1 > '~')) {
            gst_cc_decoder_process_cea608_packet (decoder, user_data,
                cc_type);
          }
          decoder->cea608_cc1_buffer[decoder->cea608_cc1_index++] = cc_data_1;

          if ((cc_data_2 < ' ') || (cc_data_2 > '~')) {
            gst_cc_decoder_process_cea608_packet (decoder, user_data,
                cc_type);
          }
          decoder->cea608_cc1_buffer[decoder->cea608_cc1_index++] = cc_data_2;
        } else {
          GST_ERROR ("cea608_cc1_buffer overflow!");
        }
        break;
      case CCTYPE_608_CC2:
        // It would be nice if we could avoid duplicating this..
        if (cc_valid && (decoder->cea608_cc2_index < DTVCC_LENGTH - 2)) {
          if ((cc_data_1 < ' ') || (cc_data_1 > '~')) {
            gst_cc_decoder_process_cea608_packet (decoder, user_data,
                cc_type);
          }
          decoder->cea608_cc2_buffer[decoder->cea608_cc2_index++] = cc_data_1;

          if ((cc_data_2 < ' ') || (cc_data_2 > '~')) {
            gst_cc_decoder_process_cea608_packet (decoder, user_data,
                cc_type);
          }
          decoder->cea608_cc2_buffer[decoder->cea608_cc2_index++] = cc_data_2;
        } else {
          GST_ERROR ("cea608_cc2_buffer overflow!");
        }
        break;
    }