CoglPipeline * cogl_gst_video_sink_get_pipeline (CoglGstVideoSink *vt) { CoglGstVideoSinkPrivate *priv; g_return_val_if_fail (COGL_GST_IS_VIDEO_SINK (vt), NULL); priv = vt->priv; if (priv->pipeline == NULL) { priv->pipeline = cogl_pipeline_new (priv->ctx); cogl_gst_video_sink_setup_pipeline (vt, priv->pipeline); cogl_gst_video_sink_attach_frame (vt, priv->pipeline); priv->frame_dirty = FALSE; } else if (priv->frame_dirty) { CoglPipeline *pipeline = cogl_pipeline_copy (priv->pipeline); cogl_object_unref (priv->pipeline); priv->pipeline = pipeline; cogl_gst_video_sink_attach_frame (vt, pipeline); priv->frame_dirty = FALSE; } return priv->pipeline; }
static CoglGstVideoSink * find_cogl_gst_video_sink (GstElement *element) { GstElement *sink_element = NULL; GstIterator *iterator; GstElement *iterator_value; GValue value; if (!GST_IS_BIN (element)) return NULL; iterator = gst_bin_iterate_recurse (GST_BIN (element)); g_value_init (&value, GST_TYPE_ELEMENT); while (gst_iterator_next (iterator, &value) == GST_ITERATOR_OK) { iterator_value = g_value_get_object (&value); g_value_reset (&value); if (COGL_GST_IS_VIDEO_SINK (iterator_value)) { sink_element = iterator_value; break; } } g_value_unset (&value); gst_iterator_free (iterator); return COGL_GST_VIDEO_SINK (sink_element); }
void cogl_gst_video_sink_setup_pipeline (CoglGstVideoSink *sink, CoglPipeline *pipeline) { g_return_if_fail (COGL_GST_IS_VIDEO_SINK (sink)); if (sink->priv->renderer) sink->priv->renderer->setup_pipeline (sink, pipeline); }
float cogl_gst_video_sink_get_height_for_width (CoglGstVideoSink *vt, float width) { float aspect; g_return_val_if_fail (COGL_GST_IS_VIDEO_SINK (vt), 0.); aspect = cogl_gst_video_sink_get_aspect (vt); return width / aspect; }
float cogl_gst_video_sink_get_aspect (CoglGstVideoSink *vt) { GstVideoInfo *info; g_return_val_if_fail (COGL_GST_IS_VIDEO_SINK (vt), 0.); info = &vt->priv->info; return ((float)info->width * (float)info->par_n) / ((float)info->height * (float)info->par_d); }
void cogl_gst_video_sink_set_default_sample (CoglGstVideoSink *sink, CoglBool default_sample) { g_return_if_fail (COGL_GST_IS_VIDEO_SINK (sink)); if (default_sample != sink->priv->default_sample) { sink->priv->default_sample = default_sample; dirty_default_pipeline (sink); } }
void cogl_gst_video_sink_set_first_layer (CoglGstVideoSink *sink, int first_layer) { g_return_if_fail (COGL_GST_IS_VIDEO_SINK (sink)); if (first_layer != sink->priv->custom_start) { sink->priv->custom_start = first_layer; dirty_default_pipeline (sink); if (sink->priv->renderer) sink->priv->free_layer = (sink->priv->custom_start + sink->priv->renderer->n_layers); } }
void cogl_gst_video_sink_fit_size (CoglGstVideoSink *vt, const CoglGstRectangle *available, CoglGstRectangle *output) { g_return_if_fail (COGL_GST_IS_VIDEO_SINK (vt)); g_return_if_fail (available != NULL); g_return_if_fail (output != NULL); if (available->height == 0.0f) { output->x = available->x; output->y = available->y; output->width = output->height = 0; } else { float available_aspect = available->width / available->height; float video_aspect = cogl_gst_video_sink_get_aspect (vt); if (video_aspect > available_aspect) { output->width = available->width; output->height = available->width / video_aspect; output->x = available->x; output->y = available->y + (available->height - output->height) / 2; } else { output->width = available->height * video_aspect; output->height = available->height; output->x = available->x + (available->width - output->width) / 2; output->y = available->y; } } }