static GstFlowReturn gst_png_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstPngParse *pngparse = GST_PNG_PARSE (parse); if (!pngparse->sent_codec_tag) { GstTagList *taglist; GstCaps *caps; /* codec tag */ caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse)); if (G_UNLIKELY (caps == NULL)) { if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) { GST_INFO_OBJECT (parse, "Src pad is flushing"); return GST_FLOW_FLUSHING; } else { GST_INFO_OBJECT (parse, "Src pad is not negotiated!"); return GST_FLOW_NOT_NEGOTIATED; } } taglist = gst_tag_list_new_empty (); gst_pb_utils_add_codec_description_to_tag_list (taglist, GST_TAG_VIDEO_CODEC, caps); gst_caps_unref (caps); gst_base_parse_merge_tags (parse, taglist, GST_TAG_MERGE_REPLACE); gst_tag_list_unref (taglist); /* also signals the end of first-frame processing */ pngparse->sent_codec_tag = TRUE; } return GST_FLOW_OK; }
static GstFlowReturn gst_dirac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstDiracParse *diracparse = GST_DIRAC_PARSE (parse); if (!diracparse->sent_codec_tag) { GstTagList *taglist; GstCaps *caps; taglist = gst_tag_list_new_empty (); /* codec tag */ caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse)); gst_pb_utils_add_codec_description_to_tag_list (taglist, GST_TAG_VIDEO_CODEC, caps); gst_caps_unref (caps); gst_base_parse_merge_tags (parse, taglist, GST_TAG_MERGE_REPLACE); gst_tag_list_unref (taglist); /* also signals the end of first-frame processing */ diracparse->sent_codec_tag = TRUE; } return GST_FLOW_OK; }
static GstFlowReturn gst_png_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) { GstPngParse *pngparse = GST_PNG_PARSE (parse); if (!pngparse->sent_codec_tag) { GstTagList *taglist; GstCaps *caps; taglist = gst_tag_list_new_empty (); /* codec tag */ caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse)); gst_pb_utils_add_codec_description_to_tag_list (taglist, GST_TAG_VIDEO_CODEC, caps); gst_caps_unref (caps); gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (pngparse), gst_event_new_tag (taglist)); /* also signals the end of first-frame processing */ pngparse->sent_codec_tag = TRUE; } return GST_FLOW_OK; }
static void gst_id3demux_add_container_format (GstTagList * tags) { GstCaps *sink_caps; sink_caps = gst_static_pad_template_get_caps (&sink_factory); gst_pb_utils_add_codec_description_to_tag_list (tags, GST_TAG_CONTAINER_FORMAT, sink_caps); gst_caps_unref (sink_caps); }
static GstTagDemuxResult gst_ape_demux_parse_tag (GstTagDemux * demux, GstBuffer * buffer, gboolean start_tag, guint * tag_size, GstTagList ** tags) { const guint8 *data; const guint8 *footer; gboolean have_header; gboolean end_tag = !start_tag; GstCaps *sink_caps; guint version, footer_size; GST_LOG_OBJECT (demux, "Parsing buffer of size %u", GST_BUFFER_SIZE (buffer)); data = GST_BUFFER_DATA (buffer); footer = GST_BUFFER_DATA (buffer) + GST_BUFFER_SIZE (buffer) - 32; GST_LOG_OBJECT (demux, "Checking for footer at offset 0x%04x", (guint) (footer - data)); if (footer > data && memcmp (footer, "APETAGEX", 8) == 0) { GST_DEBUG_OBJECT (demux, "Found footer"); footer_size = 32; } else { GST_DEBUG_OBJECT (demux, "No footer"); footer_size = 0; } /* APE tags at the end must have a footer */ if (end_tag && footer_size == 0) { GST_WARNING_OBJECT (demux, "Tag at end of file without footer!"); return GST_TAG_DEMUX_RESULT_BROKEN_TAG; } /* don't trust the header/footer flags, better detect them ourselves */ have_header = (memcmp (data, "APETAGEX", 8) == 0); if (start_tag && !have_header) { GST_DEBUG_OBJECT (demux, "Tag at beginning of file without header!"); return GST_TAG_DEMUX_RESULT_BROKEN_TAG; } if (end_tag && !have_header) { GST_DEBUG_OBJECT (demux, "Tag at end of file has no header (APEv1)"); *tag_size -= 32; /* adjust tag size */ } if (have_header) { version = GST_READ_UINT32_LE (data + 8); } else { version = GST_READ_UINT32_LE (footer + 8); } /* skip header */ if (have_header) { data += 32; } GST_DEBUG_OBJECT (demux, "APE tag with version %u, size %u at offset 0x%08" G_GINT64_MODIFIER "x", version, *tag_size, GST_BUFFER_OFFSET (buffer) + ((have_header) ? 0 : 32)); if (APE_VERSION_MAJOR (version) != 1 && APE_VERSION_MAJOR (version) != 2) { GST_WARNING ("APE tag is version %u.%03u, but decoder only supports " "v1 or v2. Ignoring.", APE_VERSION_MAJOR (version), version % 1000); return GST_TAG_DEMUX_RESULT_OK; } *tags = ape_demux_parse_tags (data, *tag_size - footer_size); sink_caps = gst_static_pad_template_get_caps (&sink_factory); gst_pb_utils_add_codec_description_to_tag_list (*tags, GST_TAG_CONTAINER_FORMAT, sink_caps); gst_caps_unref (sink_caps); return GST_TAG_DEMUX_RESULT_OK; }