Exemplo n.º 1
0
static GstFlowReturn
gst_kate_tiger_kate_chain (GstPad * pad, GstBuffer * buf)
{
  GstKateTiger *tiger = GST_KATE_TIGER (gst_pad_get_parent (pad));
  const kate_event *ev = NULL;
  GstFlowReturn rflow = GST_FLOW_OK;

  g_mutex_lock (tiger->mutex);

  GST_LOG_OBJECT (tiger, "Got kate buffer");

  rflow =
      gst_kate_util_decoder_base_chain_kate_packet (&tiger->decoder,
      GST_ELEMENT_CAST (tiger), pad, buf, tiger->srcpad, &ev);
  if (G_LIKELY (rflow == GST_FLOW_OK)) {
    if (ev) {
      int ret = tiger_renderer_add_event (tiger->tr, ev->ki, ev);
      GST_INFO_OBJECT (tiger, "adding event for %p from %f to %f: %p, \"%s\"",
          ev->ki, ev->start_time, ev->end_time, ev->bitmap, ev->text);
      if (G_UNLIKELY (ret < 0)) {
        GST_WARNING_OBJECT (tiger,
            "failed to add Kate event to Tiger renderer: %d", ret);
      }
    }
  }

  gst_object_unref (tiger);
  gst_buffer_unref (buf);

  g_mutex_unlock (tiger->mutex);

  return rflow;
}
Exemplo n.º 2
0
OggPlayErrorCode
oggplay_data_handle_kate_data(OggPlayKateDecode *decode, const kate_event *ev) {

  OggPlayTextRecord * record = NULL;
  size_t              rec_size = sizeof(OggPlayTextRecord);
  
  if (decode == NULL) {
    return -1; 
  }
#ifdef HAVE_TIGER
  tiger_renderer_add_event(decode->tr, ev->ki, ev);

  if (decode->use_tiger) {
    /* if rendering with Tiger, we don't add an event, a synthetic one will be
       generated each "tick" with an updated tracker state */
  }
  else
#endif
  {
    /* check for integer overflow */
    if 
    ( 
      oggplay_check_add_overflow (rec_size, ev->len0, &rec_size)
      == 
      E_OGGPLAY_TYPE_OVERFLOW
    )
    {
      return E_OGGPLAY_TYPE_OVERFLOW;
    }
    
    record = (OggPlayTextRecord*)oggplay_calloc (rec_size, 1);
    if (!record) {
      return E_OGGPLAY_OUT_OF_MEMORY;
    }

    oggplay_data_initialise_header(&decode->decoder, &(record->header));

    //record->header.presentation_time = (ogg_int64_t)(ev->start_time*1000);
    record->header.samples_in_record = (ev->end_time-ev->start_time)*1000;
    record->data = (char *)(record + 1);

    memcpy(record->data, ev->text, ev->len0);

    oggplay_data_add_to_list(&decode->decoder, &(record->header));
  }
  
  return E_OGGPLAY_CONTINUE;
}