/** * gst_pb_utils_add_codec_description_to_tag_list: * @taglist: a #GstTagList * @codec_tag: a GStreamer codec tag such as #GST_TAG_AUDIO_CODEC, * #GST_TAG_VIDEO_CODEC or #GST_TAG_CODEC * @caps: the (fixed) #GstCaps for which a codec tag should be added. * * Adds a codec tag describing the format specified by @caps to @taglist. * * Returns: TRUE if a codec tag was added, FALSE otherwise. */ gboolean gst_pb_utils_add_codec_description_to_tag_list (GstTagList * taglist, const gchar * codec_tag, const GstCaps * caps) { const FormatInfo *info; gchar *desc; g_return_val_if_fail (taglist != NULL, FALSE); g_return_val_if_fail (GST_IS_TAG_LIST (taglist), FALSE); g_return_val_if_fail (codec_tag != NULL, FALSE); g_return_val_if_fail (gst_tag_exists (codec_tag), FALSE); g_return_val_if_fail (gst_tag_get_type (codec_tag) == G_TYPE_STRING, FALSE); g_return_val_if_fail (caps != NULL, FALSE); g_return_val_if_fail (GST_IS_CAPS (caps), FALSE); info = find_format_info (caps); if (info == NULL) return FALSE; desc = format_info_get_desc (info, caps); gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, codec_tag, desc, NULL); g_free (desc); return TRUE; }
/** * gst_pb_utils_add_codec_description_to_tag_list: * @taglist: a #GstTagList * @codec_tag: (allow-none): a GStreamer codec tag such as #GST_TAG_AUDIO_CODEC, * #GST_TAG_VIDEO_CODEC or #GST_TAG_CODEC. If none is specified, * the function will attempt to detect the appropriate category. * @caps: the (fixed) #GstCaps for which a codec tag should be added. * * Adds a codec tag describing the format specified by @caps to @taglist. * * Returns: TRUE if a codec tag was added, FALSE otherwise. */ gboolean gst_pb_utils_add_codec_description_to_tag_list (GstTagList * taglist, const gchar * codec_tag, const GstCaps * caps) { const FormatInfo *info; gchar *desc; g_return_val_if_fail (taglist != NULL, FALSE); g_return_val_if_fail (GST_IS_TAG_LIST (taglist), FALSE); g_return_val_if_fail (codec_tag == NULL || (gst_tag_exists (codec_tag) && gst_tag_get_type (codec_tag) == G_TYPE_STRING), FALSE); g_return_val_if_fail (caps != NULL, FALSE); g_return_val_if_fail (GST_IS_CAPS (caps), FALSE); info = find_format_info (caps); if (info == NULL) return FALSE; /* Attempt to find tag classification */ if (codec_tag == NULL) { if (info->flags & FLAG_CONTAINER) codec_tag = GST_TAG_CONTAINER_FORMAT; else if (info->flags & FLAG_AUDIO) codec_tag = GST_TAG_AUDIO_CODEC; else if (info->flags & FLAG_VIDEO) codec_tag = GST_TAG_VIDEO_CODEC; else if (info->flags & FLAG_SUB) codec_tag = GST_TAG_SUBTITLE_CODEC; else codec_tag = GST_TAG_CODEC; } desc = format_info_get_desc (info, caps); gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, codec_tag, desc, NULL); g_free (desc); return TRUE; }
static gboolean flv_metadata_value_handler(FlvScriptDataReader* reader, gchar* value_name, gint value_type, void* param) { gdouble double_value; guint8 boolean_value; gchar* string_value; gboolean result = TRUE; FlvMetadata* metadata = (FlvMetadata*)param; switch (value_type) { case FLV_SCRIPT_DATA_TYPE_DOUBLE: result = flv_script_data_read_double(reader, &double_value); if (!result) break; if (strcmp(value_name, "duration") == 0) { metadata->duration = (GstClockTime)(double_value * GST_SECOND); gst_tag_list_add (metadata->tag_list, GST_TAG_MERGE_REPLACE, GST_TAG_DURATION, metadata->duration, NULL); } else if (strcmp(value_name, "filesize") == 0) { metadata->file_size = (gint)double_value; } else if (strcmp(value_name, "videocodecid") == 0) { metadata->video_codec_id = (gint)double_value; } else if (strcmp(value_name, "videodatarate") == 0) { metadata->video_data_rate = double_value; } else if (strcmp(value_name, "width") == 0) { metadata->width = (gint)double_value; } else if (strcmp(value_name, "height") == 0) { metadata->height = (gint)double_value; } else if (strcmp(value_name, "AspectRatioX") == 0) { metadata->par_x = (gint)double_value; } else if (strcmp(value_name, "AspectRatioY") == 0) { metadata->par_y = (gint)double_value; } else if (strcmp(value_name, "framerate") == 0) { metadata->framerate = double_value; } else if (strcmp(value_name, "audiocodecid") == 0) { metadata->audio_codec_id = (gint)double_value; } else if (strcmp(value_name, "audiosamplesize") == 0) { metadata->audio_sample_size = (gint)double_value; } break; case FLV_SCRIPT_DATA_TYPE_BOOL: result = flv_script_data_read_ui8(reader, &boolean_value); if (!result) break; if (strcmp(value_name, "canSeekToEnd") == 0) { metadata->can_seek_to_end = boolean_value; } else if (strcmp(value_name, "stereo") == 0) { metadata->is_stereo = boolean_value; } break; case FLV_SCRIPT_DATA_TYPE_STRING: case FLV_SCRIPT_DATA_TYPE_LONG_STRING: result = flv_script_data_read_string(reader, &string_value, value_type == FLV_SCRIPT_DATA_TYPE_LONG_STRING); if (!result) break; // Register the tag if needed so it shows up if (!gst_tag_exists(value_name)) { gst_tag_register(value_name, GST_TAG_FLAG_META, G_TYPE_STRING, value_name, "FLV Metadata Tag", NULL); } gst_tag_list_add(metadata->tag_list, GST_TAG_MERGE_REPLACE, value_name, string_value, NULL); g_free(string_value); break; case FLV_SCRIPT_DATA_TYPE_OBJECT: // Only read the keyframe metadata once if ((strcmp(value_name, "keyframes") == 0) && (metadata->keyframes == NULL)) { result &= flv_script_data_read_object(reader, flv_metadata_keyframe_handler, param); } else { result &= flv_script_data_read_object(reader, flv_metadata_skip_handler, param); } break; case FLV_SCRIPT_DATA_TYPE_MOVIE_CLIP: // Per AMF version 0: "This type is not supported and is reserved for future use." result = FALSE; break; case FLV_SCRIPT_DATA_TYPE_NULL: case FLV_SCRIPT_DATA_TYPE_UNDEFINED: // Nothing follows break; case FLV_SCRIPT_DATA_TYPE_REFERENCE: // U16, two byte index follows // this is just an index to some other object in this script tag, we can safely ignore this reader->position += 2; break; case FLV_SCRIPT_DATA_TYPE_ECMA: result &= flv_script_data_read_ecma(reader, flv_metadata_skip_handler, param); break; case FLV_SCRIPT_DATA_TYPE_TERMINATOR: /* Just return true for ECMA terminator */ break; case FLV_SCRIPT_DATA_TYPE_STRICT: result &= flv_script_data_read_strict_array(reader, flv_metadata_skip_handler, param); break; case FLV_SCRIPT_DATA_TYPE_DATE: // Skip date value (64 bits milliseconds + 16 bits time zone == 80 bits == 10 bytes) reader->position += 10; break; default: /* Non-handled type */ result = FALSE; break; } return result; }
/* * Class method: exists?(tag) * tag: the name of the tag. * * Checks if the given tag is already registered. * * Returns: true if the tag is registered, false otherwise. */ static VALUE rg_s_exists_p (G_GNUC_UNUSED VALUE self, VALUE tag) { return CBOOL2RVAL (gst_tag_exists (RVAL2CSTR (tag))); }
/* * Class method: exists?(tag) * tag: the name of the tag. * * Checks if the given tag is already registered. * * Returns: true if the tag is registered, false otherwise. */ static VALUE rb_gst_tag_exists (VALUE self, VALUE tag) { return CBOOL2RVAL (gst_tag_exists (RVAL2CSTR (tag))); }