Exemplo n.º 1
0
static VTStatus
gst_vtenc_enqueue_buffer (void *data, int a2, int a3, int a4,
    CMSampleBufferRef sbuf, int a6, int a7)
{
  GstVTEnc *self = data;
  gboolean is_keyframe;
  GstBuffer *buf;

  /* This may happen if we don't have enough bitrate */
  if (sbuf == NULL)
    goto beach;

  is_keyframe = gst_vtenc_buffer_is_keyframe (self, sbuf);
  if (self->expect_keyframe) {
    if (!is_keyframe)
      goto beach;
    CFDictionaryRemoveValue (self->options,
        *(self->ctx->vt->kVTEncodeFrameOptionKey_ForceKeyFrame));
  }
  self->expect_keyframe = FALSE;

  buf = gst_core_media_buffer_new (self->ctx, sbuf);
  gst_buffer_copy_metadata (buf, self->cur_inbuf, GST_BUFFER_COPY_TIMESTAMPS);
  if (is_keyframe) {
    GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
  } else {
    GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT);
    GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
  }

  g_ptr_array_add (self->cur_outbufs, buf);

beach:
  return kVTSuccess;
}
Exemplo n.º 2
0
static GstFlowReturn
gst_cel_video_src_create (GstPushSrc * pushsrc, GstBuffer ** buf)
{
  GstCelVideoSrc *self = GST_CEL_VIDEO_SRC_CAST (pushsrc);
  GstCMApi *cm = self->ctx->cm;
  CMSampleBufferRef sbuf;

  sbuf = cm->CMBufferQueueDequeueAndRetain (self->queue);

  while (sbuf == NULL) {
    QUEUE_READY_LOCK (self);
    while (!self->queue_is_ready && g_atomic_int_get (&self->is_running))
      QUEUE_READY_WAIT (self);
    self->queue_is_ready = FALSE;
    QUEUE_READY_UNLOCK (self);

    if (G_UNLIKELY (!g_atomic_int_get (&self->is_running)))
      goto shutting_down;

    sbuf = cm->CMBufferQueueDequeueAndRetain (self->queue);
  }

  if (G_UNLIKELY (!g_atomic_int_get (&self->is_running)))
    goto shutting_down;

  *buf = gst_core_media_buffer_new (self->ctx, sbuf);
  gst_cel_video_src_timestamp_buffer (self, *buf);

  cm->FigSampleBufferRelease (sbuf);

  if (self->do_stats)
    gst_cel_video_src_update_statistics (self);

  return GST_FLOW_OK;

  /* ERRORS */
shutting_down:
  {
    cm->FigSampleBufferRelease (sbuf);
    return GST_FLOW_FLUSHING;
  }
}
Exemplo n.º 3
0
static TundraStatus
gst_mio_video_src_output_render (gpointer instance, gpointer unk1,
    gpointer unk2, gpointer unk3, CMSampleBufferRef sample_buf)
{
  GstMIOVideoSrc *self = GST_MIO_VIDEO_SRC_CAST (instance);
  GstBuffer *buf;
  CFNumberRef number;
  UInt32 seq;

  buf = gst_core_media_buffer_new (self->ctx, sample_buf);
  if (G_UNLIKELY (buf == NULL))
    goto buffer_creation_failed;

  number = self->ctx->cm->CMGetAttachment (sample_buf,
      *self->ctx->mio->kTundraSampleBufferAttachmentKey_SequenceNumber, NULL);
  if (number != NULL && CFNumberGetValue (number, kCFNumberSInt32Type, &seq)) {
    GST_BUFFER_OFFSET (buf) = seq;
    GST_BUFFER_OFFSET_END (buf) = seq + 1;
  }

  GST_BUFFER_TIMESTAMP (buf) = gst_mio_video_src_get_timestamp (self,
      sample_buf);

  if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
    GST_BUFFER_DURATION (buf) =
        gst_mio_video_device_get_duration (self->device);
  }

  FRAME_QUEUE_LOCK (self);
  if (g_queue_get_length (self->queue) == FRAME_QUEUE_SIZE)
    gst_buffer_unref (g_queue_pop_tail (self->queue));
  g_queue_push_head (self->queue, buf);
  FRAME_QUEUE_NOTIFY (self);
  FRAME_QUEUE_UNLOCK (self);

  return kTundraSuccess;

buffer_creation_failed:
  GST_WARNING_OBJECT (instance, "failed to create buffer");
  return kTundraSuccess;
}