You can make this less repetitive with something like this:

    static void
    gst_cc_decoder_process_cea608_packet (GstCcDecoder * decoder,
        UserData * user_data, guint8 cc_type)
    {
      guint8* buffer;
      gint16* index;

      switch (cc_type) {
        case CCTYPE_608_CC1:
          buffer = decoder->cea608_cc1_buffer;
          index = &decoder->cea608_cc1_index;
          break;
        case CCTYPE_608_CC2:
          buffer = decoder->cea608_cc2_buffer;
          index = &decoder->cea608_cc2_index;
          break;
        default:
          // Should this be a warning or error?
          return;
      }

      if (*index > 0) {
        if (decoder->cea608_srcpad == NULL) {
          gst_cc_decoder_add_cea608_srcpad (decoder);
        }
        gst_cc_decoder_send_buffer (decoder, buffer, *index, decoder->cea608_srcpad,
            user_data);
        *index = 0;
      }
    }

It's not any shorter, but I think it's easier to read. An even nicer way to handle this would be to make the buffers and indexes into an array, and make `cc_type` index into it directly.