Exemplo n.º 1
0
/**
 * 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;
}
Exemplo n.º 4
0
/*
 * 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)));
}
Exemplo n.º 5
0
/*
 * 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)));
}