static void __set_channels (GstCaps * caps, gint channels) { GstStructure *s; gint i, size; size = gst_caps_get_size (caps); for (i = 0; i < size; i++) { s = gst_caps_get_structure (caps, i); if (channels > 0) gst_structure_set (s, "channels", G_TYPE_INT, channels, NULL); else gst_structure_set (s, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); } }
/* * Takes caps and copies its audio fields to tmpl_caps */ static GstCaps * __gst_audio_element_proxy_caps (GstElement * element, GstCaps * templ_caps, GstCaps * caps) { GstCaps *result = gst_caps_new_empty (); gint i, j; gint templ_caps_size = gst_caps_get_size (templ_caps); gint caps_size = gst_caps_get_size (caps); for (i = 0; i < templ_caps_size; i++) { GQuark q_name = gst_structure_get_name_id (gst_caps_get_structure (templ_caps, i)); GstCapsFeatures *features = gst_caps_get_features (templ_caps, i); for (j = 0; j < caps_size; j++) { const GstStructure *caps_s = gst_caps_get_structure (caps, j); const GValue *val; GstStructure *s; GstCaps *tmp = gst_caps_new_empty (); s = gst_structure_new_id_empty (q_name); if ((val = gst_structure_get_value (caps_s, "rate"))) gst_structure_set_value (s, "rate", val); if ((val = gst_structure_get_value (caps_s, "channels"))) gst_structure_set_value (s, "channels", val); if ((val = gst_structure_get_value (caps_s, "channels-mask"))) gst_structure_set_value (s, "channels-mask", val); gst_caps_append_structure_full (tmp, s, gst_caps_features_copy (features)); result = gst_caps_merge (result, tmp); } } return result; }
static gboolean gstbt_wave_replay_setup (GstBtAudioSynth * base, GstPad * pad, GstCaps * caps) { GstBtWaveReplay *src = ((GstBtWaveReplay *) base); GstStructure *structure; gint i, n = gst_caps_get_size (caps), c = src->osc->channels; gstbt_osc_wave_setup (src->osc); for (i = 0; i < n; i++) { structure = gst_caps_get_structure (caps, i); gst_structure_fixate_field_nearest_int (structure, "channels", c); } return TRUE; }
static gboolean caps_are_raw (const GstCaps * caps) { guint i, len; len = gst_caps_get_size (caps); for (i = 0; i < len; i++) { GstStructure *st = gst_caps_get_structure (caps, i); if (gst_structure_has_name (st, "video/x-raw")) return TRUE; } return FALSE; }
static void check_caps_identical (GstCaps * a, GstCaps * b, const char *name) { int i; if (gst_caps_get_size (a) != gst_caps_get_size (b)) goto fail; for (i = 0; i < gst_caps_get_size (a); i++) { GstStructure *sa, *sb; sa = gst_caps_get_structure (a, i); sb = gst_caps_get_structure (b, i); if (!gst_structure_is_equal (sa, sb)) goto fail; } return; fail: fail ("%s caps (%s) is not equal to caps (%s)", name, gst_caps_to_string (a), gst_caps_to_string (b)); }
static VALUE rg_each(VALUE self) { int i, size; GstCaps *caps; caps = SELF(self); size = gst_caps_get_size(caps); for (i = 0; i < size; i++) { rb_yield(GST_STRUCT2RVAL(gst_caps_get_structure(caps, i))); } return Qnil; }
void test_merge_subset() { GstCaps *c1, *c2; //xmlfile = "test_merge_subset"; std_log(LOG_FILENAME_LINE, "Test Started test_merge_subset"); /* the 2nd is already covered */ c2 = gst_caps_from_string ("audio/x-raw-int,channels=[1,2]"); c1 = gst_caps_from_string ("audio/x-raw-int,channels=1"); gst_caps_merge (c2, c1); GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2); fail_unless (gst_caps_get_size (c2) == 1, NULL); gst_caps_unref (c2); /* here it is not */ c2 = gst_caps_from_string ("audio/x-raw-int,channels=1,rate=44100"); c1 = gst_caps_from_string ("audio/x-raw-int,channels=[1,2],rate=44100"); gst_caps_merge (c2, c1); GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2); fail_unless (gst_caps_get_size (c2) == 2, NULL); gst_caps_unref (c2); std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
GstCaps * gst_gl_caps_replace_all_caps_features (const GstCaps * caps, const gchar * feature_name) { GstCaps *tmp = gst_caps_copy (caps); guint n = gst_caps_get_size (tmp); guint i = 0; for (i = 0; i < n; i++) { gst_caps_set_features (tmp, i, gst_caps_features_from_string (feature_name)); } return tmp; }
static GstCaps * gst_amr_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter) { GstCaps *peercaps, *templ; GstCaps *res; templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)); peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), filter); if (peercaps) { guint i, n; /* Rename structure names */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); if (gst_structure_has_name (s, "audio/AMR")) gst_structure_set_name (s, "audio/x-amr-nb-sh"); else gst_structure_set_name (s, "audio/x-amr-wb-sh"); } res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); res = gst_caps_make_writable (res); /* Append the template caps because we still want to accept * caps without any fields in the case upstream does not * know anything. */ gst_caps_append (res, templ); } else { res = templ; } if (filter) { GstCaps *intersection; intersection = gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (res); res = intersection; } return res; }
static GstCaps * gst_xvidenc_getcaps (GstPad * pad) { GstXvidEnc *xvidenc; GstPad *peer; GstCaps *caps; /* If we already have caps return them */ if (GST_PAD_CAPS (pad)) return gst_caps_ref (GST_PAD_CAPS (pad)); xvidenc = GST_XVIDENC (gst_pad_get_parent (pad)); if (!xvidenc) return gst_caps_new_empty (); peer = gst_pad_get_peer (xvidenc->srcpad); if (peer) { const GstCaps *templcaps; GstCaps *peercaps; guint i, n; peercaps = gst_pad_get_caps (peer); /* Translate peercaps to YUV */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_set_name (s, "video/x-raw-yuv"); gst_structure_remove_field (s, "mpegversion"); gst_structure_remove_field (s, "systemstream"); } templcaps = gst_pad_get_pad_template_caps (pad); caps = gst_caps_intersect (peercaps, templcaps); gst_caps_unref (peercaps); gst_object_unref (peer); peer = NULL; } else { caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); } gst_object_unref (xvidenc); return caps; }
static GstCaps * _update_caps (GstVideoAggregator * vagg, GstCaps * caps) { GstGLVideoMixer *mix = GST_GL_VIDEO_MIXER (vagg); GList *l; gint best_width = -1, best_height = -1; GstVideoInfo info; GstCaps *ret = NULL; int i; caps = gst_caps_make_writable (caps); gst_video_info_from_caps (&info, caps); GST_OBJECT_LOCK (vagg); for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) { GstVideoAggregatorPad *vaggpad = l->data; GstGLVideoMixerPad *mixer_pad = GST_GL_VIDEO_MIXER_PAD (vaggpad); gint this_width, this_height; gint width, height; _mixer_pad_get_output_size (mix, mixer_pad, &width, &height); if (width == 0 || height == 0) continue; this_width = width + MAX (mixer_pad->xpos, 0); this_height = height + MAX (mixer_pad->ypos, 0); if (best_width < this_width) best_width = this_width; if (best_height < this_height) best_height = this_height; } GST_OBJECT_UNLOCK (vagg); ret = GST_VIDEO_AGGREGATOR_CLASS (gst_gl_video_mixer_parent_class)->update_caps (vagg, caps); for (i = 0; i < gst_caps_get_size (ret); i++) { GstStructure *s = gst_caps_get_structure (ret, i); gst_structure_set (s, "width", G_TYPE_INT, best_width, "height", G_TYPE_INT, best_height, NULL); } return ret; }
static GstCaps * _set_caps_features (const GstCaps * caps, const gchar * feature_name) { GstCaps *tmp = gst_caps_copy (caps); guint n = gst_caps_get_size (tmp); guint i = 0; for (i = 0; i < n; i++) { GstCapsFeatures *features; features = gst_caps_features_new (feature_name, NULL); gst_caps_set_features (tmp, i, features); } return tmp; }
static void gst_osx_video_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) { GstStructure *structure; int i; /* this function is for choosing defaults as a last resort */ for (i = 0; i < (int) gst_caps_get_size (caps); ++i) { structure = gst_caps_get_structure (caps, i); gst_structure_fixate_field_nearest_int (structure, "width", 640); gst_structure_fixate_field_nearest_int (structure, "height", 480); // ###: if we ever support choosing framerates, do something with this //gst_structure_fixate_field_nearest_fraction (structure, "framerate", 15, 2); } }
/* copies the given caps */ static GstCaps * gst_ffmpegscale_caps_remove_format_info (GstCaps * caps) { int i; GstStructure *structure; caps = gst_caps_copy (caps); for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_caps_get_structure (caps, i); gst_structure_remove_field (structure, "format"); } return caps; }
static gboolean _gst_caps_has_feature (const GstCaps * caps, const gchar * feature) { guint i; for (i = 0; i < gst_caps_get_size (caps); i++) { GstCapsFeatures *const features = gst_caps_get_features (caps, i); /* Skip ANY features, we need an exact match for correct evaluation */ if (gst_caps_features_is_any (features)) continue; if (gst_caps_features_contains (features, feature)) return TRUE; } return FALSE; }
static GstCaps * gst_ac3_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter) { GstCaps *peercaps, *templ; GstCaps *res; templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse)); peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), filter); if (peercaps) { guint i, n; /* Remove the framed and alignment field. We can convert * between different alignments. */ peercaps = gst_caps_make_writable (peercaps); n = gst_caps_get_size (peercaps); for (i = 0; i < n; i++) { GstStructure *s = gst_caps_get_structure (peercaps, i); gst_structure_remove_field (s, "framed"); gst_structure_remove_field (s, "alignment"); } res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); res = gst_caps_make_writable (res); /* Append the template caps because we still want to accept * caps without any fields in the case upstream does not * know anything. */ gst_caps_append (res, templ); } else { res = templ; } if (filter) { GstCaps *intersection; intersection = gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (res); res = intersection; } return res; }
static void gst_ac3_parse_set_alignment (GstAc3Parse * ac3parse, gboolean eac) { GstCaps *caps; GstStructure *st; const gchar *str = NULL; int i; if (G_LIKELY (!eac)) goto done; caps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (ac3parse)); if (!caps) goto done; for (i = 0; i < gst_caps_get_size (caps); i++) { st = gst_caps_get_structure (caps, i); if (!g_str_equal (gst_structure_get_name (st), "audio/x-eac3")) continue; if ((str = gst_structure_get_string (st, "alignment"))) { if (g_str_equal (str, "iec61937")) { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_IEC61937); GST_DEBUG_OBJECT (ac3parse, "picked iec61937 alignment"); } else if (g_str_equal (str, "frame") == 0) { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_DEBUG_OBJECT (ac3parse, "picked frame alignment"); } else { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_WARNING_OBJECT (ac3parse, "unknown alignment: %s", str); } break; } } if (caps) gst_caps_unref (caps); done: /* default */ if (ac3parse->align == GST_AC3_PARSE_ALIGN_NONE) { g_atomic_int_set (&ac3parse->align, GST_AC3_PARSE_ALIGN_FRAME); GST_DEBUG_OBJECT (ac3parse, "picked syncframe alignment"); } }
static GstCaps * gst_mill_color_transform_caps (GstBaseTransform * btrans, GstPadDirection direction, GstCaps * caps) { const GstCaps *tmpl_caps = NULL; GstCaps *result = NULL, *local_caps = NULL; guint i; local_caps = gst_caps_copy (caps); for (i = 0; i < gst_caps_get_size (local_caps); i++) { GstStructure *structure = gst_caps_get_structure (local_caps, i); /* Throw away the structure name and set it to transformed format */ if (direction == GST_PAD_SINK) { gst_structure_set_name (structure, "video/x-raw-yuv"); } else if (direction == GST_PAD_SRC) { gst_structure_set_name (structure, "video/x-raw-rgb"); } /* Remove any specific parameter from the structure */ gst_structure_remove_field (structure, "format"); gst_structure_remove_field (structure, "endianness"); gst_structure_remove_field (structure, "depth"); gst_structure_remove_field (structure, "bpp"); gst_structure_remove_field (structure, "red_mask"); gst_structure_remove_field (structure, "green_mask"); gst_structure_remove_field (structure, "blue_mask"); gst_structure_remove_field (structure, "alpha_mask"); } /* Get the appropriate template */ if (direction == GST_PAD_SINK) { tmpl_caps = gst_static_pad_template_get_caps (&src_template); } else if (direction == GST_PAD_SRC) { tmpl_caps = gst_static_pad_template_get_caps (&sink_template); } /* Intersect with our template caps */ result = gst_caps_intersect (local_caps, tmpl_caps); gst_caps_unref (local_caps); gst_caps_do_simplify (result); GST_LOG ("transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, caps, result); return result; }
/* Append new_structure to dest, but only if it does not already exist in res. This function takes ownership of new_structure. */ static bool webkitMediaPlayReadyDecryptCapsAppendIfNotDuplicate(GstCaps* destination, GstStructure* structure) { bool duplicate = false; unsigned size = gst_caps_get_size(destination); for (unsigned index = 0; !duplicate && index < size; ++index) { GstStructure* s = gst_caps_get_structure(destination, index); if (gst_structure_is_equal(s, structure)) duplicate = true; } if (!duplicate) gst_caps_append_structure(destination, structure); else gst_structure_free(structure); return duplicate; }
static gboolean gst_goo_decgsmfr_src_setcaps (GstPad *pad, GstCaps *caps) { GstStructure *structure; GstGooDecGsmFr *self; GstElement* next_element; GooPort *outport; GstPad* peer; guint width = DEFAULT_WIDTH; guint depth = DEFAULT_DEPTH; gchar* str_peer; gchar dasf[] = "dasf"; gint comp_res; self = GST_GOO_DECGSMFR (GST_PAD_PARENT (pad)); outport = (GooPort *) GST_GOO_AUDIO_FILTER (self)->outport; peer = gst_pad_get_peer (pad); next_element = GST_ELEMENT (gst_pad_get_parent (peer)); str_peer = gst_element_get_name (next_element); comp_res = strncmp (dasf, str_peer, 4); if (comp_res == 0) { GST_DEBUG_OBJECT (self, "DASF-SINK Activated: GSM-FR Dec"); GST_GOO_AUDIO_FILTER (self)->dasf_mode = TRUE; } else { GST_DEBUG_OBJECT (self, "FILE-TO-FILE Activated: GSM-FR Dec"); GST_GOO_AUDIO_FILTER (self)->dasf_mode = FALSE; } GST_DEBUG_OBJECT (self, "src_setcaps"); GST_LOG ("caps are %" GST_PTR_FORMAT, caps); g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "depth", &depth); gst_object_unref (next_element); gst_object_unref (peer); return gst_pad_set_caps (pad, caps); }
static void fixate_vis_caps (RBVisualizerPlugin *plugin) { GstPad *pad; GstCaps *caps = NULL; const GstCaps *template_caps; pad = gst_element_get_static_pad (plugin->vis_plugin, "src"); template_caps = gst_pad_get_pad_template_caps (pad); gst_object_unref (pad); if (template_caps == NULL) { rb_debug ("vis element has no template caps?"); return; } caps = gst_caps_copy (template_caps); if (gst_caps_is_fixed (caps) == FALSE) { guint i; char *dbg; const VisualizerQuality *q = &rb_visualizer_quality[g_settings_get_enum (plugin->settings, "quality")]; rb_debug ("fixating caps towards %dx%d, %d/%d", q->width, q->height, q->fps_n, q->fps_d); caps = gst_caps_make_writable (caps); for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *s = gst_caps_get_structure (caps, i); gst_structure_fixate_field_nearest_int (s, "width", q->width); gst_structure_fixate_field_nearest_int (s, "height", q->height); gst_structure_fixate_field_nearest_fraction (s, "framerate", q->fps_n, q->fps_d); } dbg = gst_caps_to_string (caps); rb_debug ("setting fixed caps on capsfilter: %s", dbg); g_free (dbg); g_object_set (plugin->capsfilter, "caps", caps, NULL); } else { char *dbg = gst_caps_to_string (caps); rb_debug ("vis element caps already fixed: %s", dbg); g_free (dbg); } gst_caps_unref (caps); }
bool contains_bayer (const GstCaps* caps) { if (caps == nullptr) { return false; } for (unsigned int i = 0; i < gst_caps_get_size(caps); ++i) { if (strcmp("video/x-bayer", gst_structure_get_name(gst_caps_get_structure(caps, i))) == 0) { return true; } } return false; }
/** * gst_encoding_profile_get_input_caps: * @profile: a #GstEncodingProfile * * Computes the full output caps that this @profile will be able to consume. * * Returns: (transfer full): The full caps the given @profile can consume. Call * gst_caps_unref() when you are done with the caps. */ GstCaps * gst_encoding_profile_get_input_caps (GstEncodingProfile * profile) { GstCaps *out, *tmp; GList *ltmp; GstStructure *st, *outst; GQuark out_name; guint i, len; GstCaps *fcaps; g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) { GstCaps *res = gst_caps_new_empty (); for (ltmp = GST_ENCODING_CONTAINER_PROFILE (profile)->encodingprofiles; ltmp; ltmp = ltmp->next) { GstEncodingProfile *sprof = (GstEncodingProfile *) ltmp->data; res = gst_caps_merge (res, gst_encoding_profile_get_input_caps (sprof)); } return res; } fcaps = profile->format; /* fast-path */ if ((profile->restriction == NULL) || gst_caps_is_any (profile->restriction)) return gst_caps_ref (fcaps); /* Combine the format with the restriction caps */ outst = gst_caps_get_structure (fcaps, 0); out_name = gst_structure_get_name_id (outst); tmp = gst_caps_new_empty (); len = gst_caps_get_size (profile->restriction); for (i = 0; i < len; i++) { st = gst_structure_copy (gst_caps_get_structure (profile->restriction, i)); st->name = out_name; gst_caps_append_structure (tmp, st); } out = gst_caps_intersect (tmp, fcaps); gst_caps_unref (tmp); return out; }
static gboolean is_raw_caps (GstCaps * caps) { gint i, n; GstStructure *s; const gchar *name; n = gst_caps_get_size (caps); for (i = 0; i < n; i++) { s = gst_caps_get_structure (caps, i); name = gst_structure_get_name (s); if (!g_str_has_prefix (name, "video/x-raw")) return FALSE; } return TRUE; }
void test_merge_fundamental() { GstCaps *c1, *c2; //xmlfile = "test_merge_fundamental"; std_log(LOG_FILENAME_LINE, "Test Started test_merge_fundamental"); /* ANY + specific = ANY */ c1 = gst_caps_from_string ("audio/x-raw-int,rate=44100"); c2 = gst_caps_new_any (); gst_caps_merge (c2, c1); GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2); fail_unless (gst_caps_get_size (c2) == 0, NULL); fail_unless (gst_caps_is_any (c2), NULL); gst_caps_unref (c2); /* specific + ANY = ANY */ c2 = gst_caps_from_string ("audio/x-raw-int,rate=44100"); c1 = gst_caps_new_any (); gst_caps_merge (c2, c1); GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2); fail_unless (gst_caps_get_size (c2) == 0, NULL); fail_unless (gst_caps_is_any (c2), NULL); gst_caps_unref (c2); /* EMPTY + specific = specific */ c1 = gst_caps_from_string ("audio/x-raw-int,rate=44100"); c2 = gst_caps_new_empty (); gst_caps_merge (c2, c1); GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2); fail_unless (gst_caps_get_size (c2) == 1, NULL); fail_if (gst_caps_is_empty (c2), NULL); gst_caps_unref (c2); /* specific + EMPTY = specific */ c2 = gst_caps_from_string ("audio/x-raw-int,rate=44100"); c1 = gst_caps_new_empty (); gst_caps_merge (c2, c1); GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2); fail_unless (gst_caps_get_size (c2) == 1, NULL); fail_if (gst_caps_is_empty (c2), NULL); gst_caps_unref (c2); std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
static void pad_added_handler (GstElement *src, GstPad *new_pad, gpointer data) { GstPad *sink_pad = gst_element_get_static_pad (gst_data.audio_sink, "sink"); GstPadLinkReturn ret; GstCaps *new_pad_caps = NULL; GstStructure *new_pad_struct = NULL; const gchar *new_pad_type = NULL; guint caps_size = 0, i; g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME (new_pad), GST_ELEMENT_NAME (src)); g_print ("sink_pad: '%s'\n", GST_PAD_NAME (sink_pad)); if (gst_pad_is_linked (sink_pad)) { g_print ("We are already linked. Ignoring.\n"); goto exit; } new_pad_caps = gst_pad_get_current_caps(new_pad); caps_size = gst_caps_get_size(new_pad_caps); g_print ("caps_size : %d\n", caps_size); for (i = 0; i < caps_size; i++) { new_pad_struct = gst_caps_get_structure(new_pad_caps, i); new_pad_type = gst_structure_get_name(new_pad_struct); g_print ("new_pad_type %d: '%s'\n", i, new_pad_type); if (strstr(new_pad_type, "audio/x-raw")) { ret = gst_pad_link (new_pad, sink_pad); if (GST_PAD_LINK_FAILED (ret)) { g_print ("Type is '%s' but link failed.\n", new_pad_type); } else { g_print ("Link succeeded (type '%s').\n", new_pad_type); } break; } } exit: /* Unreference the new pad's caps, if we got them */ if (new_pad_caps != NULL) gst_caps_unref (new_pad_caps); /* Unreference the sink pad */ gst_object_unref (sink_pad); }
static void gst_wrapper_camera_bin_src_caps_cb (GObject * gobject, GParamSpec * pspec, gpointer user_data) { GstBaseCameraSrc *bcamsrc = GST_BASE_CAMERA_SRC (user_data); GstWrapperCameraBinSrc *self = GST_WRAPPER_CAMERA_BIN_SRC (user_data); GstPad *src_caps_src_pad; GstCaps *caps = NULL; GstStructure *in_st = NULL; /* get the new caps that were set on the capsfilter that configures the * source */ src_caps_src_pad = gst_element_get_static_pad (self->src_filter, "src"); caps = gst_pad_query_caps (src_caps_src_pad, NULL); gst_object_unref (src_caps_src_pad); GST_DEBUG_OBJECT (self, "src-filter caps changed to %s", gst_caps_to_string (caps)); if (gst_caps_get_size (caps)) { in_st = gst_caps_get_structure (caps, 0); if (in_st) { gst_structure_get_int (in_st, "width", &bcamsrc->width); gst_structure_get_int (in_st, "height", &bcamsrc->height); GST_DEBUG_OBJECT (self, "Source dimensions now: %dx%d", bcamsrc->width, bcamsrc->height); } } /* Update zoom */ gst_base_camera_src_setup_zoom (bcamsrc); /* Update post-zoom capsfilter */ if (self->src_zoom_filter) { GstCaps *filtercaps; g_object_get (G_OBJECT (self->src_zoom_filter), "caps", &filtercaps, NULL); if (!gst_caps_is_equal (filtercaps, caps)) g_object_set (G_OBJECT (self->src_zoom_filter), "caps", caps, NULL); gst_caps_unref (filtercaps); } /* drop our ref on the caps */ gst_caps_unref (caps); };
static GstCaps * gst_video_flip_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps) { GstVideoFlip *videoflip; GstCaps *ret; gint width, height, i; videoflip = GST_VIDEO_FLIP (trans); ret = gst_caps_copy (caps); for (i = 0; i < gst_caps_get_size (ret); i++) { GstStructure *structure = gst_caps_get_structure (ret, i); if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { switch (videoflip->method) { case GST_VIDEO_FLIP_METHOD_90R: case GST_VIDEO_FLIP_METHOD_90L: case GST_VIDEO_FLIP_METHOD_TRANS: case GST_VIDEO_FLIP_METHOD_OTHER: gst_structure_set (structure, "width", G_TYPE_INT, height, "height", G_TYPE_INT, width, NULL); break; case GST_VIDEO_FLIP_METHOD_IDENTITY: case GST_VIDEO_FLIP_METHOD_180: case GST_VIDEO_FLIP_METHOD_HORIZ: case GST_VIDEO_FLIP_METHOD_VERT: gst_structure_set (structure, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); break; default: g_assert_not_reached (); break; } } } GST_DEBUG_OBJECT (videoflip, "transformed %" GST_PTR_FORMAT " to %" GST_PTR_FORMAT, caps, ret); return ret; }
static GstCaps * gst_dewarp_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter_caps) { GstDewarp *dewarp = GST_DEWARP (trans); GstCaps *ret; gint width, height; guint i; ret = gst_caps_copy (caps); GST_OBJECT_LOCK (dewarp); for (i = 0; i < gst_caps_get_size (ret); i++) { GstStructure *structure = gst_caps_get_structure (ret, i); if (gst_structure_get_int (structure, "width", &width) && gst_structure_get_int (structure, "height", &height)) { gint out_width, out_height; gst_dewarp_calculate_dimensions (dewarp, direction, width, height, &out_width, &out_height); gst_structure_set (structure, "width", G_TYPE_INT, out_width, "height", G_TYPE_INT, out_height, NULL); } } GST_OBJECT_UNLOCK (dewarp); if (filter_caps) { GstCaps *intersection; GST_DEBUG_OBJECT (dewarp, "Using filter caps %" GST_PTR_FORMAT, filter_caps); intersection = gst_caps_intersect_full (filter_caps, ret, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (ret); ret = intersection; GST_DEBUG_OBJECT (dewarp, "Intersection %" GST_PTR_FORMAT, ret); } return ret; }
GstCaps * gst_gl_overlay_compositor_add_caps (GstCaps * caps) { GstCaps *composition_caps; int i; composition_caps = gst_caps_copy (caps); for (i = 0; i < gst_caps_get_size (composition_caps); i++) { GstCapsFeatures *f = gst_caps_get_features (composition_caps, i); gst_caps_features_add (f, GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION); } caps = gst_caps_merge (composition_caps, caps); return caps; }