Add documentation for the xingheader plugin.

Original commit message from CVS:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* gst/xingheader/gstxingmux.c:
* gst/xingheader/gstxingmux.h:
Add documentation for the xingheader plugin.
* tests/check/elements/xingmux.c: (GST_START_TEST):
Set element state to PLAYING before doing something else.
This commit is contained in:
Sebastian Dröge 2008-01-23 10:34:40 +00:00
parent 79031308ad
commit bb56fbeed4
3 changed files with 83 additions and 32 deletions

View file

@ -20,6 +20,31 @@
/* Xing SDK: http://www.mp3-tech.org/programmer/sources/vbrheadersdk.zip */
/**
* SECTION:element-xingmux
* @short_description: Adds a Xing header to MP3 files
*
* <refsect2>
* <para>
* xingmux adds a Xing header to MP3 files. This contains information about the duration and size
* of the file and a seek table and is very useful for getting an almost correct duration and better
* seeking on VBR MP3 files.
* </para>
* <para>
* This element will remove any existing Xing, LAME or VBRI headers from the beginning of the file.
* </para>
* <title>Example launch line</title>
* <para>
* <programlisting>
* gst-launch audiotestsrc num-buffers=1000 ! audioconvert ! lame ! xingmux ! filesink location=test.mp3
* gst-launch filesrc location=test.mp3 ! xingmux ! filesink location=test2.mp3
* gst-launch filesrc location=test.mp3 ! mp3parse ! xingmux ! filesink location=test2.mp3
* </programlisting>
* </para>
* </refsect2>
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@ -38,6 +63,12 @@ GST_BOILERPLATE (GstXingMux, gst_xing_mux, GstElement, GST_TYPE_ELEMENT);
#define GST_XING_TOC_FIELD (1 << 2)
#define GST_XING_QUALITY_FIELD (1 << 3)
typedef struct _GstXingSeekEntry
{
gint64 timestamp;
gint byte;
} GstXingSeekEntry;
static void gst_xing_mux_finalize (GObject * obj);
static GstStateChangeReturn
gst_xing_mux_change_state (GstElement * element, GstStateChange transition);

View file

@ -21,33 +21,10 @@
#include <gst/gst.h>
#include <gst/base/gstadapter.h>
typedef struct _GstXingSeekEntry
{
gint64 timestamp;
gint byte;
} GstXingSeekEntry;
#ifndef __GST_XINGMUX_H__
#define __GST_XINGMUX_H__
/* Definition of structure storing data for this element. */
typedef struct _GstXingMux {
GstElement element;
GstPad *sinkpad, *srcpad;
GstAdapter *adapter;
GstClockTime duration;
guint64 byte_count;
guint64 frame_count;
GList *seek_table;
gboolean sent_xing;
/* Copy of the first frame header */
guint32 first_header;
} GstXingMux;
/* Standard definition defining a class for this element. */
typedef struct _GstXingMuxClass {
GstElementClass parent_class;
} GstXingMuxClass;
G_BEGIN_DECLS
/* Standard macros for defining types for this element. */
#define GST_TYPE_XING_MUX \
@ -61,5 +38,48 @@ typedef struct _GstXingMuxClass {
#define GST_IS_XING_MUX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_XING_MUX))
typedef struct _GstXingMux GstXingMux;
typedef struct _GstXingMuxClass GstXingMuxClass;
/* Definition of structure storing data for this element. */
/**
* GstXingMux:
*
* Opaque data structure.
*/
struct _GstXingMux {
GstElement element;
GstPad *sinkpad, *srcpad;
/* < private > */
GstAdapter *adapter;
GstClockTime duration;
guint64 byte_count;
guint64 frame_count;
GList *seek_table;
gboolean sent_xing;
/* Copy of the first frame header */
guint32 first_header;
};
/* Standard definition defining a class for this element. */
/**
* GstXingMuxClass:
*
* Opaque data structure.
*/
struct _GstXingMuxClass {
GstElementClass parent_class;
};
/* Standard function returning type information. */
GType gst_my_filter_get_type (void);
GType gst_xing_mux_get_type (void);
G_END_DECLS
#endif /* __GST_XINGMUX_H__ */

View file

@ -80,20 +80,20 @@ GST_START_TEST (test_xing_remux)
GstElement *xingmux;
GstBuffer *inbuffer;
GList *it;
guint8 *verify_data;
const guint8 *verify_data;
xingmux = setup_xingmux ();
fail_unless (gst_element_set_state (xingmux,
GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
"could not set to playing");
inbuffer = gst_buffer_new_and_alloc (sizeof (test_xing));
memcpy (GST_BUFFER_DATA (inbuffer), test_xing, sizeof (test_xing));
gst_buffer_set_caps (inbuffer, GST_PAD_CAPS (mysrcpad));
ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
/* FIXME: why are the xingmux pads flushing? */
fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_flush_stop ()));
/* pushing gives away my reference ... */
fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));