【正文】
化(指定類的信號(hào),參數(shù)和虛函數(shù),設(shè)定全局狀態(tài)),該初始化過(guò)程只進(jìn)行一次static voidgst_file_src_class_init (GstFileSrcClass * klass){ GObjectClass *gobject_class。 gobject_class = G_OBJECT_CLASS (klass)。 gobject_classset_property = gst_file_src_set_property。 g_object_class_install_property (gobject_class, ARG_FD, g_param_spec_int (fd, Filedescriptor, Filedescriptor for the file being mmap()d, 0, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))。 g_object_class_install_property (gobject_class, ARG_MMAPSIZE, g_param_spec_ulong (mmapsize, mmap() Block Size, Size in bytes of mmap()d regions, 0, G_MAXULONG, DEFAULT_MMAPSIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_PLAYING))。 /** * GstFileSrc:usemmap * * Whether to use mmap(). Set to TRUE to force use of mmap() instead of * read() for reading data. * * Use of mmap() is disabled by default since with mmap() there are a * number of occasions where the process/application will be notified of * read errors via a SIGBUS signal from the kernel, which will lead to * the application being killed if not handled by the application. This * is something that is difficult to work around for a library like * GStreamer, hence use of mmap() is disabled by default. Said errors * can occur for example when an external device (. an external hard * drive or a portable music player) are unplugged while in use, or when * a CD/DVD medium cannot be be read because the medium is scratched or * otherwise damaged. * **/ g_object_class_install_property (gobject_class, ARG_USEMMAP, g_param_spec_boolean (usemmap, Use mmap to read data, Whether to use mmap() instead of read(), DEFAULT_USEMMAP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))。 gobject_classfinalize = GST_DEBUG_FUNCPTR (gst_file_src_finalize)。 gstbasesrc_classstop = GST_DEBUG_FUNCPTR (gst_file_src_stop)。 gstbasesrc_classget_size = GST_DEBUG_FUNCPTR (gst_file_src_get_size)。 gstbasesrc_classquery = GST_DEBUG_FUNCPTR (gst_file_src_query)。 }}//_init()函數(shù)被用來(lái)初始化該類型的一個(gè)特定實(shí)例//類似C++中的構(gòu)造函數(shù),對(duì)包括pad在內(nèi)的內(nèi)部變量活虛函數(shù)進(jìn)行初始化。endif srcfilename = NULL。 srcuri = NULL。 srcmapbuf = NULL。 /* default is 4MB */ srcuse_mmap = DEFAULT_USEMMAP。 srcis_regular = FALSE。 src = GST_FILE_SRC (object)。 g_free (srcuri)。}static gbooleangst_file_src_set_location (GstFileSrc * src, const gchar * location){ GstState state。 state = GST_STATE (src)。amp。 GST_OBJECT_UNLOCK (src)。 g_free (srcuri)。 srcuri = NULL。 srcuri = gst_uri_construct (file, srcfilename)。 gst_uri_handler_new_uri (GST_URI_HANDLER (src), srcuri)。 /* ERROR */wrong_state: { GST_DEBUG_OBJECT (src, setting location in wrong state)。 return FALSE。 g_return_if_fail (GST_IS_FILE_SRC (object))。 switch (prop_id) { case ARG_LOCATION: gst_file_src_set_location (src, g_value_get_string (value))。 case ARG_MMAPSIZE: if ((srcmapsize % srcpagesize) == 0) { srcmapsize = g_value_get_ulong (value)。 } break。 break。 break。 break。 break。 g_return_if_fail (GST_IS_FILE_SRC (object))。 switch (prop_id) { case ARG_LOCATION: g_value_set_string (value, srcfilename)。 case ARG_FD: g_value_set_int (value, srcfd)。 case ARG_MMAPSIZE: g_value_set_ulong (value, srcmapsize)。 case ARG_TOUCH: g_value_set_boolean (value, srctouch)。 case ARG_SEQUENTIAL: g_value_set_boolean (value, srcsequential)。 case ARG_USEMMAP: g_value_set_boolean (value, srcuse_mmap)。 default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)。 }}/*** * mmap code below */ifdef HAVE_MMAP/* GstMmapBuffer */typedef struct _GstMmapBuffer GstMmapBuffer。define GST_TYPE_MMAP_BUFFER (gst_mmap_buffer_get_type())define GST_IS_MMAP_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MMAP_BUFFER))define GST_IS_MMAP_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MMAP_BUFFER))define GST_MMAP_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MMAP_BUFFER, GstMmapBufferClass))define GST_MMAP_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MMAP_BUFFER, GstMmapBuffer))define GST_MMAP_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MMAP_BUFFER, GstMmapBufferClass))struct _GstMmapBuffer{ GstBuffer buffer。}。}。static void gst_mmap_buffer_class_init (gpointer g_class, gpointer class_data)。static GstBufferClass *mmap_buffer_parent_class = NULL。 if (G_UNLIKELY (_gst_mmap_buffer_type == 0)) { static const GTypeInfo mmap_buffer_info = { sizeof (GstMmapBufferClass), NULL, NULL, gst_mmap_buffer_class_init, NULL, NULL, sizeof (GstMmapBuffer), 0, gst_mmap_buffer_init, NULL }。mmap_buffer_info, 0)。}static voidgst_mmap_buffer_class_init (gpointer g_class, gpointer class_data){ GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class)。 mini_object_classfinalize = (GstMiniObjectFinalizeFunction) gst_mmap_buffer_finalize。 GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_READONLY)。 */}static voidgst_mmap_buffer_finalize (GstMmapBuffer * mmap_buffer){ guint size。 guint64 offset。 GstBuffer *buffer = GST_BUFFER (mmap_buffer)。 offset = GST_BUFFER_OFFSET (buffer)。 src = mmap_bufferfilesrc。ifdef MADV_DONTNEED /* madvise to tell the kernel what to do with it */ if (madvise (data, size, MADV_DONTNEED) 0) { GST_WARNING_OBJECT (src, warning: madvise failed: %s, g_strerror (errno))。 } /* ca