static GstFlowReturn gst_mio_video_src_create (GstPushSrc * pushsrc, GstBuffer ** buf) { GstMIOVideoSrc *self = GST_MIO_VIDEO_SRC_CAST (pushsrc); GstCMApi *cm = self->ctx->cm; CMFormatDescriptionRef format; FRAME_QUEUE_LOCK (self); while (self->running && g_queue_is_empty (self->queue)) FRAME_QUEUE_WAIT (self); *buf = g_queue_pop_tail (self->queue); FRAME_QUEUE_UNLOCK (self); if (G_UNLIKELY (!self->running)) goto shutting_down; format = cm->CMSampleBufferGetFormatDescription (GST_CORE_MEDIA_BUFFER (*buf)->sample_buf); if (self->prev_format != NULL && !cm->CMFormatDescriptionEqual (format, self->prev_format)) { goto unexpected_format; } cm->FigFormatDescriptionRelease (self->prev_format); self->prev_format = cm->FigFormatDescriptionRetain (format); if (self->prev_offset == GST_BUFFER_OFFSET_NONE || GST_BUFFER_OFFSET (*buf) - self->prev_offset != 1) { GST_BUFFER_FLAG_SET (*buf, GST_BUFFER_FLAG_DISCONT); } self->prev_offset = GST_BUFFER_OFFSET (*buf); return GST_FLOW_OK; /* ERRORS */ shutting_down: { if (*buf != NULL) { gst_buffer_unref (*buf); *buf = NULL; } return GST_FLOW_FLUSHING; } unexpected_format: { GST_ELEMENT_ERROR (self, RESOURCE, READ, ("capture format changed unexpectedly"), ("another application likely reconfigured the device")); if (*buf != NULL) { gst_buffer_unref (*buf); *buf = NULL; } return GST_FLOW_ERROR; } }