static void gst_mxf_mux_reset (GstMXFMux * mux) { GSList *sl; while ((sl = mux->collect->data) != NULL) { GstMXFMuxPad *cpad = (GstMXFMuxPad *) sl->data; g_object_unref (cpad->adapter); g_free (cpad->mapping_data); gst_collect_pads_remove_pad (mux->collect, cpad->collect.pad); } mux->state = GST_MXF_MUX_STATE_HEADER; mux->n_pads = 0; if (mux->metadata) { g_hash_table_destroy (mux->metadata); mux->preface = NULL; g_list_free (mux->metadata_list); mux->metadata_list = NULL; } mux->metadata = mxf_metadata_hash_table_new (); mxf_partition_pack_reset (&mux->partition); mxf_primer_pack_reset (&mux->primer); memset (&mux->min_edit_rate, 0, sizeof (MXFFraction)); mux->last_gc_timestamp = 0; mux->last_gc_position = 0; mux->offset = 0; }
static void gst_mxf_mux_reset (GstMXFMux * mux) { GList *l; GST_OBJECT_LOCK (mux); while ((l = GST_ELEMENT_CAST (mux)->sinkpads) != NULL) { GstPad *pad = (GstPad *) l->data; gst_object_ref (pad); GST_OBJECT_UNLOCK (mux); gst_element_release_request_pad (GST_ELEMENT_CAST (mux), pad); gst_object_unref (pad); GST_OBJECT_LOCK (mux); } GST_OBJECT_UNLOCK (mux); mux->state = GST_MXF_MUX_STATE_HEADER; mux->n_pads = 0; if (mux->metadata) { g_hash_table_destroy (mux->metadata); mux->preface = NULL; g_list_free (mux->metadata_list); mux->metadata_list = NULL; } mux->metadata = mxf_metadata_hash_table_new (); mxf_partition_pack_reset (&mux->partition); mxf_primer_pack_reset (&mux->primer); memset (&mux->min_edit_rate, 0, sizeof (MXFFraction)); mux->last_gc_timestamp = 0; mux->last_gc_position = 0; mux->offset = 0; }
gboolean mxf_primer_pack_parse (const MXFUL * key, MXFPrimerPack * pack, const guint8 * data, guint size) { guint i; guint32 n; g_return_val_if_fail (data != NULL, FALSE); g_return_val_if_fail (size >= 8, FALSE); memset (pack, 0, sizeof (MXFPrimerPack)); GST_DEBUG ("Parsing primer pack:"); pack->mappings = g_hash_table_new_full (g_direct_hash, g_direct_equal, (GDestroyNotify) NULL, (GDestroyNotify) _mxf_mapping_ul_free); n = GST_READ_UINT32_BE (data); data += 4; GST_DEBUG (" number of mappings = %u", n); if (GST_READ_UINT32_BE (data) != 18) goto error; data += 4; if (size < 8 + n * 18) goto error; for (i = 0; i < n; i++) { guint local_tag; #ifndef GST_DISABLE_GST_DEBUG gchar str[48]; #endif MXFUL *uid; local_tag = GST_READ_UINT16_BE (data); data += 2; if (g_hash_table_lookup (pack->mappings, GUINT_TO_POINTER (local_tag))) continue; uid = g_slice_new (MXFUL); memcpy (uid, data, 16); data += 16; g_hash_table_insert (pack->mappings, GUINT_TO_POINTER (local_tag), uid); GST_DEBUG (" Adding mapping = 0x%04x -> %s", local_tag, mxf_ul_to_string (uid, str)); } pack->valid = TRUE; return TRUE; error: GST_DEBUG ("Invalid primer pack"); mxf_primer_pack_reset (pack); return FALSE; }