static gboolean gst_deinterleave_src_query (GstPad * pad, GstQuery * query) { GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); gboolean res; res = gst_pad_query_default (pad, query); if (res && GST_QUERY_TYPE (query) == GST_QUERY_DURATION) { GstFormat format; gint64 dur; gst_query_parse_duration (query, &format, &dur); /* Need to divide by the number of channels in byte format * to get the correct value. All other formats should be fine */ if (format == GST_FORMAT_BYTES && dur != -1) gst_query_set_duration (query, format, dur / self->channels); } else if (res && GST_QUERY_TYPE (query) == GST_QUERY_POSITION) { GstFormat format; gint64 pos; gst_query_parse_position (query, &format, &pos); /* Need to divide by the number of channels in byte format * to get the correct value. All other formats should be fine */ if (format == GST_FORMAT_BYTES && pos != -1) gst_query_set_position (query, format, pos / self->channels); } gst_object_unref (self); return res; }
static gboolean gst_decklink_sink_audiosink_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; GST_DEBUG_OBJECT (pad, "query: %" GST_PTR_FORMAT, query); switch (GST_QUERY_TYPE (query)) { default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_rsvg_dec_src_query (GstPad * pad, GstQuery * query) { GstRsvgDec *rsvg = GST_RSVG_DEC (gst_pad_get_parent (pad)); gboolean res = TRUE; switch (GST_QUERY_TYPE (query)) { default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (rsvg); return res; }
static gboolean gst_mve_demux_handle_src_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION:{ GstFormat format; gst_query_parse_position (query, &format, NULL); /* we only support TIME */ if (format == GST_FORMAT_TIME) { GstMveDemuxStream *s = gst_pad_get_element_private (pad); if (s != NULL) { GST_OBJECT_LOCK (s); gst_query_set_position (query, GST_FORMAT_TIME, s->last_ts); GST_OBJECT_UNLOCK (s); res = TRUE; } } break; } case GST_QUERY_SEEKING:{ GstFormat format; gst_query_parse_seeking (query, &format, NULL, NULL, NULL); if (format == GST_FORMAT_TIME) { gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, 0, -1); res = TRUE; } break; } case GST_QUERY_DURATION:{ /* FIXME: really should implement/estimate this somehow */ res = FALSE; break; } default: res = gst_pad_query_default (pad, query); break; } return res; }
static gboolean gst_deinterleave_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstDeinterleave *self = GST_DEINTERLEAVE (parent); gboolean res; res = gst_pad_query_default (pad, parent, query); if (res && GST_QUERY_TYPE (query) == GST_QUERY_DURATION) { GstFormat format; gint64 dur; gst_query_parse_duration (query, &format, &dur); /* Need to divide by the number of channels in byte format * to get the correct value. All other formats should be fine */ if (format == GST_FORMAT_BYTES && dur != -1) gst_query_set_duration (query, format, dur / GST_AUDIO_INFO_CHANNELS (&self->audio_info)); } else if (res && GST_QUERY_TYPE (query) == GST_QUERY_POSITION) { GstFormat format; gint64 pos; gst_query_parse_position (query, &format, &pos); /* Need to divide by the number of channels in byte format * to get the correct value. All other formats should be fine */ if (format == GST_FORMAT_BYTES && pos != -1) gst_query_set_position (query, format, pos / GST_AUDIO_INFO_CHANNELS (&self->audio_info)); } else if (res && GST_QUERY_TYPE (query) == GST_QUERY_CAPS) { GstCaps *filter, *caps; gst_query_parse_caps (query, &filter); caps = gst_deinterleave_sink_getcaps (pad, parent, filter); gst_query_set_caps_result (query, caps); gst_caps_unref (caps); } return res; }
static gboolean gst_interleave_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstInterleave *self = GST_INTERLEAVE (parent); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: /* FIXME, bring to stream time, might be tricky */ gst_query_set_position (query, format, self->timestamp); res = TRUE; break; case GST_FORMAT_BYTES: gst_query_set_position (query, format, self->offset * self->channels * self->width); res = TRUE; break; case GST_FORMAT_DEFAULT: gst_query_set_position (query, format, self->offset); res = TRUE; break; default: break; } break; } case GST_QUERY_DURATION: res = gst_interleave_src_query_duration (self, query); break; default: /* FIXME, needs a custom query handler because we have multiple * sinkpads */ res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_output_selector_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res = TRUE; GstOutputSelector *sel; GstPad *active = NULL; sel = GST_OUTPUT_SELECTOR (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS: { switch (sel->pad_negotiation_mode) { case GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL: /* Send caps to all src pads */ res = gst_pad_proxy_query_caps (pad, query); break; case GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE: res = FALSE; break; default: active = gst_output_selector_get_active (sel); if (active) { res = gst_pad_peer_query (active, query); gst_object_unref (active); } else { res = FALSE; } break; } break; } case GST_QUERY_DRAIN: if (sel->latest_buffer) { gst_buffer_unref (sel->latest_buffer); sel->latest_buffer = NULL; } /* fall through */ default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_tee_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstTee *tee; gboolean res; GstPad *sinkpad; tee = GST_TEE (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_SCHEDULING: { gboolean pull_mode; GST_OBJECT_LOCK (tee); pull_mode = TRUE; if (tee->pull_mode == GST_TEE_PULL_MODE_NEVER) { GST_INFO_OBJECT (tee, "Cannot activate in pull mode, pull-mode " "set to NEVER"); pull_mode = FALSE; } else if (tee->pull_mode == GST_TEE_PULL_MODE_SINGLE && tee->pull_pad) { GST_INFO_OBJECT (tee, "Cannot activate multiple src pads in pull mode, " "pull-mode set to SINGLE"); pull_mode = FALSE; } sinkpad = gst_object_ref (tee->sinkpad); GST_OBJECT_UNLOCK (tee); if (pull_mode) { /* ask peer if we can operate in pull mode */ res = gst_pad_peer_query (sinkpad, query); } else { res = TRUE; } gst_object_unref (sinkpad); break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_adder_query (GstPad * pad, GstQuery * query) { GstAdder *adder = GST_ADDER (gst_pad_get_parent (pad)); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_TIME: /* FIXME, bring to stream time, might be tricky */ gst_query_set_position (query, format, adder->timestamp); res = TRUE; break; case GST_FORMAT_DEFAULT: gst_query_set_position (query, format, adder->offset); res = TRUE; break; default: break; } break; } case GST_QUERY_DURATION: res = gst_adder_query_duration (adder, query); break; case GST_QUERY_LATENCY: res = gst_adder_query_latency (adder, query); break; default: /* FIXME, needs a custom query handler because we have multiple * sinkpads */ res = gst_pad_query_default (pad, query); break; } gst_object_unref (adder); return res; }
static gboolean kms_agnostic_bin2_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean ret; ret = gst_pad_query_default (pad, parent, query); if (ret && GST_QUERY_TYPE (query) == GST_QUERY_LATENCY) { GstClockTime min_latency; GstClockTime max_latency; gst_query_parse_latency (query, NULL, &min_latency, &max_latency); gst_query_set_latency (query, TRUE, min_latency, max_latency); } return ret; }
static gboolean gst_a2dp_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstA2dpSink *sink = GST_A2DP_SINK (parent); gboolean ret; if (GST_QUERY_TYPE (query) == GST_QUERY_CAPS) { GstCaps *caps; caps = gst_a2dp_sink_get_caps (sink); gst_query_set_caps_result (query, caps); gst_caps_unref (caps); ret = TRUE; } else { ret = gst_pad_query_default (pad, parent, query); } return ret; }
static gboolean gst_spc_dec_src_query (GstPad * pad, GstQuery * query) { GstSpcDec *spc = GST_SPC_DEC (gst_pad_get_parent (pad)); gboolean result = TRUE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); if (!spc->initialized || format != GST_FORMAT_TIME) { result = FALSE; break; } gst_query_set_duration (query, GST_FORMAT_TIME, gst_spc_duration (spc) + gst_spc_fadeout (spc)); break; } case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); if (!spc->initialized || format != GST_FORMAT_TIME) { result = FALSE; break; } gst_query_set_position (query, GST_FORMAT_TIME, (gint64) gst_util_uint64_scale (spc->byte_pos, GST_SECOND, 32000 * 2 * 2)); break; } default: result = gst_pad_query_default (pad, query); break; } gst_object_unref (spc); return result; }
static gboolean gst_decklink_sink_videosink_query (GstPad * pad, GstQuery * query) { gboolean res; GstDecklinkSink *decklinksink; decklinksink = GST_DECKLINK_SINK (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (decklinksink, "query"); switch (GST_QUERY_TYPE (query)) { default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (decklinksink); return res; }
static gboolean gst_decklink_src_audio_src_query (GstPad * pad, GstQuery * query) { gboolean res; GstDecklinkSrc *decklinksrc; decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (decklinksrc, "query"); switch (GST_QUERY_TYPE (query)) { default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (decklinksrc); return res; }
static gboolean gst_rtp_dec_query_src (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { /* we pretend to be live with a 3 second latency */ gst_query_set_latency (query, TRUE, 3 * GST_SECOND, -1); res = TRUE; break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_real_audio_demux_src_query (GstPad * pad, GstQuery * query) { GstRealAudioDemux *demux; gboolean ret = FALSE; demux = GST_REAL_AUDIO_DEMUX (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION:{ GstFormat format; gst_query_parse_duration (query, &format, NULL); if (format == GST_FORMAT_TIME && demux->duration > 0) { gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration); ret = TRUE; } else if (format == GST_FORMAT_BYTES && demux->upstream_size > 0) { gst_query_set_duration (query, GST_FORMAT_BYTES, demux->upstream_size - demux->data_offset); ret = TRUE; } break; } case GST_QUERY_SEEKING:{ GstFormat format; gboolean seekable; gst_query_parse_seeking (query, &format, NULL, NULL, NULL); seekable = (format == GST_FORMAT_TIME && demux->seekable); gst_query_set_seeking (query, format, seekable, 0, (format == GST_FORMAT_TIME) ? demux->duration : -1); ret = TRUE; break; } default: ret = gst_pad_query_default (pad, query); break; } gst_object_unref (demux); return ret; }
static gboolean gst_base_video_decoder_sink_query (GstPad * pad, GstQuery * query) { GstBaseVideoDecoder *base_video_decoder; gboolean res = FALSE; base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (base_video_decoder, "sink query fps=%d/%d", base_video_decoder->state.fps_n, base_video_decoder->state.fps_d); switch (GST_QUERY_TYPE (query)) { default: res = gst_pad_query_default (pad, query); break; } gst_object_unref (base_video_decoder); return res; }
static gboolean _query_function (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS:{ GstCaps *caps = g_object_get_data (G_OBJECT (pad), "caps"); fail_unless (caps != NULL); gst_query_set_caps_result (query, caps); res = TRUE; break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_gme_dec_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstGmeDec *gme = GST_GME_DEC (parent); gboolean result = TRUE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); if (!gme->initialized || format != GST_FORMAT_TIME || gme->total_duration == GST_CLOCK_TIME_NONE) { result = FALSE; break; } gst_query_set_duration (query, GST_FORMAT_TIME, gme->total_duration); break; } case GST_QUERY_POSITION: { GstFormat format; gst_query_parse_position (query, &format, NULL); if (!gme->initialized || format != GST_FORMAT_TIME) { result = FALSE; break; } gst_query_set_position (query, GST_FORMAT_TIME, (gint64) gme_tell (gme->player) * GST_MSECOND); break; } default: result = gst_pad_query_default (pad, parent, query); break; } return result; }
static gboolean mq_dummypad_query (GstPad * sinkpad, GstObject * parent, GstQuery * query) { gboolean res = TRUE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS: { GstCaps *filter, *caps; gst_query_parse_caps (query, &filter); caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ()); gst_query_set_caps_result (query, caps); gst_caps_unref (caps); break; } default: res = gst_pad_query_default (sinkpad, parent, query); break; } return res; }
static gboolean gst_cdxa_parse_src_query (GstPad * srcpad, GstQuery * query) { GstCDXAParse *cdxa = GST_CDXA_PARSE (gst_pad_get_parent (srcpad)); gboolean res = FALSE; GST_DEBUG_OBJECT (cdxa, "Handling %s query", gst_query_type_get_name (GST_QUERY_TYPE (query))); res = gst_pad_query_default (srcpad, query); if (res) { GstFormat format; gint64 val; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: gst_query_parse_duration (query, &format, &val); if (format == GST_FORMAT_BYTES) { val = gst_cdxa_parse_convert_sink_to_src_offset (cdxa, val); gst_query_set_duration (query, format, val); } break; case GST_QUERY_POSITION: gst_query_parse_position (query, &format, &val); if (format == GST_FORMAT_BYTES) { val = gst_cdxa_parse_convert_sink_to_src_offset (cdxa, val); gst_query_set_position (query, format, val); } break; default: break; } } gst_object_unref (cdxa); return res; }
static gboolean proxy_src_pad_query_function (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean ret = gst_pad_query_default (pad, parent, query); if (!ret) { return ret; } if (GST_QUERY_TYPE (query) == GST_QUERY_ACCEPT_CAPS) { gboolean accepted; gst_query_parse_accept_caps_result (query, &accepted); if (!accepted) { GstProxyPad *gp = gst_proxy_pad_get_internal (GST_PROXY_PAD (pad)); KmsAgnosticBin2 *self = NULL; GST_ERROR_OBJECT (pad, "Caps not accepted: %" GST_PTR_FORMAT, query); if (gp) { self = KMS_AGNOSTIC_BIN2 (GST_OBJECT_PARENT (gp)); } if (self) { KMS_AGNOSTIC_BIN2_LOCK (self); remove_target_pad (GST_PAD_CAST (gp)); kms_agnostic_bin2_process_pad (self, GST_PAD_CAST (gp)); KMS_AGNOSTIC_BIN2_UNLOCK (self); } g_object_unref (gp); } } return ret; }
static gboolean vorbis_dec_sink_query (GstPad * pad, GstQuery * query) { GstVorbisDec *dec; gboolean res; dec = GST_VORBIS_DEC (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if (!(res = vorbis_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val))) goto error; gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; } default: res = gst_pad_query_default (pad, query); break; } done: gst_object_unref (dec); return res; /* ERRORS */ error: { GST_DEBUG_OBJECT (dec, "error converting value"); goto done; } }
static gboolean gst_rtp_ssrc_demux_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstRtpSsrcDemux *demux; gboolean res = FALSE; demux = GST_RTP_SSRC_DEMUX (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: { if ((res = gst_pad_peer_query (demux->rtp_sink, query))) { gboolean live; GstClockTime min_latency, max_latency; GstRtpSsrcDemuxPad *demuxpad; demuxpad = gst_pad_get_element_private (pad); gst_query_parse_latency (query, &live, &min_latency, &max_latency); GST_DEBUG_OBJECT (demux, "peer min latency %" GST_TIME_FORMAT, GST_TIME_ARGS (min_latency)); GST_DEBUG_OBJECT (demux, "latency for SSRC %08x", demuxpad->ssrc); gst_query_set_latency (query, live, min_latency, max_latency); } break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_segment_clip_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstSegmentClip *self = GST_SEGMENT_CLIP (parent); gboolean ret; GST_LOG_OBJECT (pad, "Handling query of type '%s'", gst_query_type_get_name (GST_QUERY_TYPE (query))); if (GST_QUERY_TYPE (query) == GST_QUERY_CAPS) { GstCaps *caps; gst_query_parse_caps (query, &caps); caps = gst_segment_clip_getcaps (self, pad, caps); gst_query_set_caps_result (query, caps); gst_caps_unref (caps); ret = TRUE; } else { ret = gst_pad_query_default (pad, parent, query); } return ret; }
static gboolean smart_encoder_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS: { GstCaps *filter, *caps; gst_query_parse_caps (query, &filter); caps = smart_encoder_sink_getcaps (pad, filter); gst_query_set_caps_result (query, caps); gst_caps_unref (caps); res = TRUE; break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_decklink_sink_videosink_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; GstDecklinkSink *decklinksink; decklinksink = GST_DECKLINK_SINK (parent); GST_DEBUG_OBJECT (decklinksink, "query"); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS:{ GstCaps *mode_caps, *filter, *caps; /* FIXME: do we change mode if incoming caps change? If yes, we * should probably return the template caps instead */ mode_caps = gst_decklink_mode_get_caps (decklinksink->mode); gst_query_parse_caps (query, &filter); if (filter) { caps = gst_caps_intersect_full (filter, mode_caps, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (mode_caps); } else { caps = mode_caps; } gst_query_set_caps_result (query, caps); gst_caps_unref (caps); res = TRUE; break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }
static gboolean gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstTSDemux *demux; demux = GST_TS_DEMUX (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); /* can only get position in time */ if (format != GST_FORMAT_TIME) goto wrong_format; gst_query_set_duration (query, GST_FORMAT_TIME, demux->duration); break; } default: res = gst_pad_query_default (pad, query); break; } done: gst_object_unref (demux); return res; wrong_format: { GST_DEBUG_OBJECT (demux, "only query duration on TIME is supported"); res = FALSE; goto done; } }
static gboolean gst_base_video_decoder_sink_query (GstPad * pad, GstQuery * query) { GstBaseVideoDecoder *base_video_decoder; gboolean res = FALSE; base_video_decoder = GST_BASE_VIDEO_DECODER (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (base_video_decoder, "sink query fps=%d/%d", base_video_decoder->state.fps_n, base_video_decoder->state.fps_d); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); res = gst_base_video_rawvideo_convert (&base_video_decoder->state, src_fmt, src_val, &dest_fmt, &dest_val); if (!res) goto error; gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; } default: res = gst_pad_query_default (pad, query); break; } done: gst_object_unref (base_video_decoder); return res; error: GST_DEBUG_OBJECT (base_video_decoder, "query failed"); goto done; }
static gboolean gst_dvd_spu_video_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS: { GstCaps *filter, *caps; gst_query_parse_caps (query, &filter); caps = gst_dvd_spu_video_proxy_getcaps (pad, filter); gst_query_set_caps_result (query, caps); gst_caps_unref (caps); res = TRUE; break; } default: res = gst_pad_query_default (pad, parent, query); break; } return res; }