void TagExtractor::printOneTag( const GstTagList * list, const gchar * tag, gpointer user_data ) { int i, num; num = gst_tag_list_get_tag_size( list, tag ); for (i = 0; i < num; ++i) { const GValue *val; /* Note: when looking for specific tags, use the gst_tag_list_get_xyz() API, * we only use the GValue approach here because it is more generic */ val = gst_tag_list_get_value_index( list, tag, i ); if( G_VALUE_HOLDS_STRING (val)) { g_print( "\t%20s : %s\n", tag, g_value_get_string( val ) ); } else if( G_VALUE_HOLDS_UINT (val)) { g_print( "\t%20s : %u\n", tag, g_value_get_uint( val ) ); } else if( G_VALUE_HOLDS_DOUBLE (val)) { g_print( "\t%20s : %g\n", tag, g_value_get_double( val ) ); } else if( G_VALUE_HOLDS_BOOLEAN (val)) { g_print( "\t%20s : %s\n", tag, (g_value_get_boolean( val )) ? "true" : "false" ); } else if( GST_VALUE_HOLDS_BUFFER (val)) { GstBuffer *buf = gst_value_get_buffer (val); guint buffer_size = gst_buffer_get_size( buf ); g_print( "\t%20s : buffer of size %u\n", tag, buffer_size ); } else if( GST_VALUE_HOLDS_DATE_TIME (val)) { GstDateTime *dt = (GstDateTime*) g_value_get_boxed( val ); gchar *dt_str = gst_date_time_to_iso8601_string( dt ); g_print( "\t%20s : %s\n", tag, dt_str ); g_free( dt_str ); } else { g_print( "\t%20s : tag of type '%s'\n", tag, G_VALUE_TYPE_NAME (val)); } } }
static gboolean gst_flac_dec_set_format (GstAudioDecoder * dec, GstCaps * caps) { const GValue *headers; GstFlacDec *flacdec; GstStructure *s; guint i, num; flacdec = GST_FLAC_DEC (dec); GST_LOG_OBJECT (dec, "sink caps: %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); headers = gst_structure_get_value (s, "streamheader"); if (headers == NULL || !GST_VALUE_HOLDS_ARRAY (headers)) { GST_WARNING_OBJECT (dec, "no 'streamheader' field in input caps, try " "adding a flacparse element upstream"); return FALSE; } if (gst_adapter_available (flacdec->adapter) > 0) { GST_WARNING_OBJECT (dec, "unexpected data left in adapter"); gst_adapter_clear (flacdec->adapter); } num = gst_value_array_get_size (headers); for (i = 0; i < num; ++i) { const GValue *header_val; GstBuffer *header_buf; header_val = gst_value_array_get_value (headers, i); if (header_val == NULL || !GST_VALUE_HOLDS_BUFFER (header_val)) return FALSE; header_buf = g_value_dup_boxed (header_val); GST_INFO_OBJECT (dec, "pushing header buffer of %" G_GSIZE_FORMAT " bytes " "into adapter", gst_buffer_get_size (header_buf)); gst_adapter_push (flacdec->adapter, header_buf); } GST_DEBUG_OBJECT (dec, "Processing headers and metadata"); if (!FLAC__stream_decoder_process_until_end_of_metadata (flacdec->decoder)) { GST_WARNING_OBJECT (dec, "process_until_end_of_metadata failed"); if (FLAC__stream_decoder_get_state (flacdec->decoder) == FLAC__STREAM_DECODER_ABORTED) { GST_WARNING_OBJECT (flacdec, "Read callback caused internal abort"); /* allow recovery */ gst_adapter_clear (flacdec->adapter); FLAC__stream_decoder_flush (flacdec->decoder); gst_flac_dec_handle_decoder_error (flacdec, TRUE); } } GST_INFO_OBJECT (dec, "headers and metadata are now processed"); return TRUE; }
Handle<Value> gvalue_to_v8(const GValue *gv) { switch(G_VALUE_TYPE(gv)) { case G_TYPE_STRING: return gchararray_to_v8(gv); case G_TYPE_BOOLEAN: return Nan::New<Boolean>(g_value_get_boolean(gv)); case G_TYPE_INT: return Nan::New<Number>(g_value_get_int(gv)); case G_TYPE_UINT: return Nan::New<Number>(g_value_get_uint(gv)); case G_TYPE_FLOAT: return Nan::New<Number>(g_value_get_float(gv)); case G_TYPE_DOUBLE: return Nan::New<Number>(g_value_get_double(gv)); } if(GST_VALUE_HOLDS_ARRAY(gv)) { return gstvaluearray_to_v8(gv); } else if(GST_VALUE_HOLDS_BUFFER(gv)) { GstBuffer *buf = gst_value_get_buffer(gv); return gstbuffer_to_v8(buf); } else if(GST_VALUE_HOLDS_SAMPLE(gv)) { GstSample *sample = gst_value_get_sample(gv); Local<Object> caps = Nan::New<Object>(); GstCaps *gcaps = gst_sample_get_caps(sample); if (gcaps) { const GstStructure *structure = gst_caps_get_structure(gcaps,0); if (structure) gst_structure_to_v8(caps, structure); } Local<Object> result = Nan::New<Object>(); result->Set(Nan::New("buf").ToLocalChecked(), gstsample_to_v8(sample)); result->Set(Nan::New("caps").ToLocalChecked(), caps); return result; } //printf("Value is of unhandled type %s\n", G_VALUE_TYPE_NAME(gv)); /* Attempt to transform it into a GValue of type STRING */ if(g_value_type_transformable (G_VALUE_TYPE(gv), G_TYPE_STRING)) { GValue b = G_VALUE_INIT; g_value_init(&b, G_TYPE_STRING); g_value_transform(gv, &b); return gchararray_to_v8(&b); } return Nan::Undefined(); }
static void check_caps (GstCaps * caps, const gchar * profile, gint profile_id) { GstStructure *s; const GValue *sf, *avcc, *pf; const gchar *stream_format; const gchar *caps_profile; fail_unless (caps != NULL); GST_INFO ("caps %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); fail_unless (s != NULL); fail_if (!gst_structure_has_name (s, "video/x-h264")); sf = gst_structure_get_value (s, "stream-format"); fail_unless (sf != NULL); fail_unless (G_VALUE_HOLDS_STRING (sf)); stream_format = g_value_get_string (sf); fail_unless (stream_format != NULL); if (strcmp (stream_format, "avc") == 0) { GstMapInfo map; GstBuffer *buf; avcc = gst_structure_get_value (s, "codec_data"); fail_unless (avcc != NULL); fail_unless (GST_VALUE_HOLDS_BUFFER (avcc)); buf = gst_value_get_buffer (avcc); fail_unless (buf != NULL); gst_buffer_map (buf, &map, GST_MAP_READ); fail_unless_equals_int (map.data[0], 1); fail_unless (map.data[1] == profile_id); gst_buffer_unmap (buf, &map); } else if (strcmp (stream_format, "byte-stream") == 0) { fail_if (gst_structure_get_value (s, "codec_data") != NULL); } else { fail_if (TRUE, "unexpected stream-format in caps: %s", stream_format); } pf = gst_structure_get_value (s, "profile"); fail_unless (pf != NULL); fail_unless (G_VALUE_HOLDS_STRING (pf)); caps_profile = g_value_get_string (pf); fail_unless (caps_profile != NULL); fail_unless (!strcmp (caps_profile, profile)); }
static gboolean print_tag_each (GQuark field_id, const GValue * value, gpointer user_data) { gint tab = GPOINTER_TO_INT (user_data); gchar *ser; if (G_VALUE_HOLDS_STRING (value)) ser = g_value_dup_string (value); else if (GST_VALUE_HOLDS_BUFFER (value)) { GstBuffer *buf = gst_value_get_buffer (value); ser = g_strdup_printf ("<GstBuffer [%d bytes]>", GST_BUFFER_SIZE (buf)); } else ser = gst_value_serialize (value); g_print ("%*s%s: %s\n", tab, " ", gst_tag_get_nick (g_quark_to_string (field_id)), ser); g_free (ser); return TRUE; }
static void print_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) { int i, num; num = gst_tag_list_get_tag_size (list, tag); for (i = 0; i < num; ++i) { const GValue *val; /* Note: when looking for specific tags, use the g_tag_list_get_xyz() API, * we only use the GValue approach here because it is more generic */ val = gst_tag_list_get_value_index (list, tag, i); if (G_VALUE_HOLDS_STRING (val)) { const char* unformatted = g_value_get_string (val); gchar* formatted = strescape(unformatted,"\"","\""); g_print ("(%s . \"%s\")\n", tag, formatted); g_free(formatted); } else if (G_VALUE_HOLDS_UINT (val)) { unsigned int uint = g_value_get_uint (val); if(uint > 0xf) g_print ("(%s . #x%x)\n", tag, uint); } else if (G_VALUE_HOLDS_DOUBLE (val)) { g_print ("(%s . %g)\n", tag, g_value_get_double (val)); } else if (G_VALUE_HOLDS_BOOLEAN (val)) { g_print ("(%s . %s)\n", tag, (g_value_get_boolean (val)) ? "#t" : "#f"); } else if (GST_VALUE_HOLDS_BUFFER (val)) { g_print ("(%s . (buffer %u))", tag, gst_buffer_get_size(gst_value_get_buffer (val))); } else if (GST_VALUE_HOLDS_DATE_TIME (val)) { GDate* date = (GDate*)g_value_get_boxed(val); g_print ("(%s . (date 0 0 0 %u %u %u))\n", tag, g_date_get_day(date), g_date_get_month(date), g_date_get_year (date)); } else { g_print ("(%20s . (type %s))", tag, G_VALUE_TYPE_NAME (val)); } } }
static void check_caps (GstCaps * caps) { GstStructure *s; const GValue *sf, *avcc; const gchar *stream_format; fail_unless (caps != NULL); GST_INFO ("caps %" GST_PTR_FORMAT, caps); s = gst_caps_get_structure (caps, 0); fail_unless (s != NULL); fail_if (!gst_structure_has_name (s, "video/x-h264")); sf = gst_structure_get_value (s, "stream-format"); fail_unless (sf != NULL); fail_unless (G_VALUE_HOLDS_STRING (sf)); stream_format = g_value_get_string (sf); fail_unless (stream_format != NULL); if (strcmp (stream_format, "avc") == 0) { const guint8 *data; GstBuffer *buf; avcc = gst_structure_get_value (s, "codec_data"); fail_unless (avcc != NULL); fail_unless (GST_VALUE_HOLDS_BUFFER (avcc)); buf = gst_value_get_buffer (avcc); fail_unless (buf != NULL); data = GST_BUFFER_DATA (buf); fail_unless_equals_int (data[0], 1); /* should be either baseline, main profile or extended profile */ fail_unless (data[1] == 0x42 || data[1] == 0x4D || data[1] == 0x58); } else if (strcmp (stream_format, "byte-stream") == 0) { fail_if (gst_structure_get_value (s, "codec_data") != NULL); } else { fail_if (TRUE, "unexpected stream-format in caps: %s", stream_format); } }