From 7a778ee4b7ec09a1f5b2185c9cceee3910dfbdf2 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Sun, 14 Mar 2004 22:34:33 +0000 Subject: gst-indent Original commit message from CVS: gst-indent --- gst/cdxaparse/gstcdxaparse.c | 145 +- gst/cdxaparse/gstcdxaparse.h | 53 +- gst/chart/gstchart.c | 325 +-- gst/colorspace/gstcolorspace.c | 368 ++- gst/colorspace/gstcolorspace.h | 31 +- gst/colorspace/yuv2rgb.c | 886 ++++--- gst/colorspace/yuv2rgb.h | 33 +- gst/deinterlace/gstdeinterlace.c | 271 +- gst/deinterlace/gstdeinterlace.h | 13 +- gst/festival/gstfestival.c | 275 +- gst/festival/gstfestival.h | 52 +- gst/filter/gstbpwsinc.c | 185 +- gst/filter/gstfilter.c | 48 +- gst/filter/gstiir.c | 125 +- gst/filter/gstlpwsinc.c | 138 +- gst/filter/iir.c | 228 +- gst/filter/iir.h | 11 +- gst/flx/flx_color.c | 58 +- gst/flx/flx_color.h | 28 +- gst/flx/flx_fmt.h | 197 +- gst/flx/gstflxdec.c | 565 ++-- gst/flx/gstflxdec.h | 60 +- gst/mixmatrix/mixmatrix.c | 339 +-- gst/modplug/gstmodplug.h | 111 +- gst/modplug/libmodplug/it_defs.h | 194 +- gst/modplug/libmodplug/modplug.h | 97 +- gst/modplug/libmodplug/sndfile.h | 1022 ++++---- gst/modplug/libmodplug/stdafx.h | 44 +- gst/mpeg1sys/buffer.c | 407 +-- gst/mpeg1sys/buffer.h | 194 +- gst/mpeg1sys/gstmpeg1systemencode.c | 474 ++-- gst/mpeg1sys/gstmpeg1systemencode.h | 93 +- gst/mpeg1sys/main.h | 111 +- gst/mpeg1sys/systems.c | 421 +-- gst/mpeg1videoparse/gstmp1videoparse.c | 491 ++-- gst/mpeg1videoparse/gstmp1videoparse.h | 47 +- gst/mpeg2sub/gstmpeg2subt.c | 329 +-- gst/mpeg2sub/gstmpeg2subt.h | 49 +- gst/mpegaudioparse/gstmpegaudioparse.c | 421 +-- gst/mpegaudioparse/gstmpegaudioparse.h | 41 +- gst/overlay/gstoverlay.c | 268 +- gst/overlay/gstoverlay.h | 36 +- gst/passthrough/gstpassthrough.c | 209 +- gst/passthrough/gstpassthrough.h | 16 +- gst/playondemand/demo-mp3.c | 169 +- gst/playondemand/gstplayondemand.c | 517 ++-- gst/playondemand/gstplayondemand.h | 60 +- gst/qtdemux/qtdemux.c | 2016 ++++++++------- gst/qtdemux/qtdemux.h | 57 +- gst/rtjpeg/RTjpeg.c | 4434 ++++++++++++++++---------------- gst/rtjpeg/RTjpeg.h | 50 +- gst/rtjpeg/gstrtjpeg.c | 22 +- gst/rtjpeg/gstrtjpegdec.c | 59 +- gst/rtjpeg/gstrtjpegdec.h | 37 +- gst/rtjpeg/gstrtjpegenc.c | 65 +- gst/rtjpeg/gstrtjpegenc.h | 37 +- gst/smooth/gstsmooth.c | 236 +- gst/smooth/gstsmooth.h | 45 +- gst/smoothwave/demo-osssrc.c | 57 +- gst/smoothwave/gstsmoothwave.c | 202 +- gst/smoothwave/gstsmoothwave.h | 39 +- gst/smpte/barboxwipes.c | 1186 +++++---- gst/smpte/gstmask.c | 20 +- gst/smpte/gstmask.h | 50 +- gst/smpte/gstsmpte.c | 292 +-- gst/smpte/gstsmpte.h | 32 +- gst/smpte/paint.c | 162 +- gst/smpte/paint.h | 31 +- gst/spectrum/demo-osssrc.c | 78 +- gst/spectrum/fix_fft.c | 643 +++-- gst/spectrum/gstspectrum.c | 157 +- gst/spectrum/gstspectrum.h | 33 +- gst/speed/demo-mp3.c | 112 +- gst/speed/gstspeed.c | 189 +- gst/speed/gstspeed.h | 14 +- gst/stereo/gststereo.c | 172 +- gst/stereo/gststereo.h | 35 +- gst/switch/gstswitch.c | 364 ++- gst/switch/gstswitch.h | 18 +- gst/vbidec/gstvbidec.c | 259 +- gst/vbidec/gstvbidec.h | 2 +- gst/vbidec/vbidata.c | 1840 ++++++------- gst/vbidec/vbidata.h | 20 +- gst/vbidec/vbiscreen.c | 1138 ++++---- gst/vbidec/vbiscreen.h | 40 +- gst/videocrop/gstvideocrop.c | 218 +- gst/videodrop/gstvideodrop.c | 170 +- gst/videodrop/gstvideodrop.h | 14 +- gst/virtualdub/gstvirtualdub.c | 97 +- gst/virtualdub/gstvirtualdub.h | 12 +- gst/virtualdub/gstxsharpen.c | 349 ++- gst/y4m/gsty4mencode.c | 204 +- gst/y4m/gsty4mencode.h | 37 +- 93 files changed, 13080 insertions(+), 12519 deletions(-) (limited to 'gst') diff --git a/gst/cdxaparse/gstcdxaparse.c b/gst/cdxaparse/gstcdxaparse.c index 0cfa010e..3241db24 100644 --- a/gst/cdxaparse/gstcdxaparse.c +++ b/gst/cdxaparse/gstcdxaparse.c @@ -48,65 +48,63 @@ static GstElementDetails gst_cdxa_parse_details = { }; /* CDXAParse signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static GstStaticPadTemplate sink_templ = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "video/x-cdxa" ) -); - -static GstStaticPadTemplate src_templ = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "video/mpeg, " - "systemstream = (boolean) TRUE" - ) -); - -static void gst_cdxa_parse_base_init (gpointer g_class); -static void gst_cdxa_parse_class_init (GstCDXAParseClass *klass); -static void gst_cdxa_parse_init (GstCDXAParse *cdxa_parse); - -static void gst_cdxa_parse_loop (GstElement *element); +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-cdxa") + ); -static GstElementStateReturn - gst_cdxa_parse_change_state (GstElement *element); +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " "systemstream = (boolean) TRUE") + ); + +static void gst_cdxa_parse_base_init (gpointer g_class); +static void gst_cdxa_parse_class_init (GstCDXAParseClass * klass); +static void gst_cdxa_parse_init (GstCDXAParse * cdxa_parse); + +static void gst_cdxa_parse_loop (GstElement * element); + +static GstElementStateReturn gst_cdxa_parse_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_cdxa_parse_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_cdxa_parse_get_type(void) +gst_cdxa_parse_get_type (void) { static GType cdxa_parse_type = 0; if (!cdxa_parse_type) { static const GTypeInfo cdxa_parse_info = { - sizeof(GstCDXAParseClass), + sizeof (GstCDXAParseClass), gst_cdxa_parse_base_init, NULL, - (GClassInitFunc)gst_cdxa_parse_class_init, + (GClassInitFunc) gst_cdxa_parse_class_init, NULL, NULL, - sizeof(GstCDXAParse), + sizeof (GstCDXAParse), 0, - (GInstanceInitFunc)gst_cdxa_parse_init, + (GInstanceInitFunc) gst_cdxa_parse_init, }; - cdxa_parse_type = g_type_register_static(GST_TYPE_ELEMENT, "GstCDXAParse", &cdxa_parse_info, 0); + cdxa_parse_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstCDXAParse", + &cdxa_parse_info, 0); } return cdxa_parse_type; } @@ -124,30 +122,32 @@ gst_cdxa_parse_base_init (gpointer g_class) } static void -gst_cdxa_parse_class_init (GstCDXAParseClass *klass) +gst_cdxa_parse_class_init (GstCDXAParseClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - + gstelement_class->change_state = gst_cdxa_parse_change_state; } -static void -gst_cdxa_parse_init (GstCDXAParse *cdxa_parse) +static void +gst_cdxa_parse_init (GstCDXAParse * cdxa_parse) { GST_FLAG_SET (cdxa_parse, GST_ELEMENT_EVENT_AWARE); - - cdxa_parse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_templ), "sink"); + + cdxa_parse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_templ), + "sink"); gst_element_add_pad (GST_ELEMENT (cdxa_parse), cdxa_parse->sinkpad); - cdxa_parse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_templ), "src"); + cdxa_parse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_templ), + "src"); gst_element_add_pad (GST_ELEMENT (cdxa_parse), cdxa_parse->srcpad); gst_element_set_loop_function (GST_ELEMENT (cdxa_parse), gst_cdxa_parse_loop); @@ -155,15 +155,15 @@ gst_cdxa_parse_init (GstCDXAParse *cdxa_parse) } static gboolean -gst_cdxa_parse_handle_event (GstCDXAParse *cdxa_parse) +gst_cdxa_parse_handle_event (GstCDXAParse * cdxa_parse) { guint32 remaining; GstEvent *event; GstEventType type; - + gst_bytestream_get_status (cdxa_parse->bs, &remaining, &event); - type = event? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { case GST_EVENT_EOS: @@ -195,15 +195,15 @@ CDXA starts with the following header: */ -typedef struct +typedef struct { - gchar RIFF_tag[4]; + gchar RIFF_tag[4]; guint32 riff_size; - gchar CDXA_tag[4]; - gchar fmt_tag[4]; + gchar CDXA_tag[4]; + gchar fmt_tag[4]; guint32 fmt_size; } CDXAParseHeader; - + /* A sectors is 2352 bytes long and is composed of: @@ -215,7 +215,7 @@ We parse the data out of it and send it to the srcpad. */ static void -gst_cdxa_parse_loop (GstElement *element) +gst_cdxa_parse_loop (GstElement * element) { GstCDXAParse *cdxa_parse; CDXAParseHeader *header; @@ -237,17 +237,18 @@ gst_cdxa_parse_loop (GstElement *element) return; cdxa_parse->riff_size = GUINT32_FROM_LE (header->riff_size); - fmt_size = (GUINT32_FROM_LE (header->fmt_size) + 1)&~1; + fmt_size = (GUINT32_FROM_LE (header->fmt_size) + 1) & ~1; /* flush the header + fmt_size bytes + 4 bytes "data" */ if (!gst_bytestream_flush (cdxa_parse->bs, 20 + fmt_size + 4)) return; - + /* get the data size */ - got_bytes = gst_bytestream_peek_bytes (cdxa_parse->bs, (guint8**)&buf, 4); + got_bytes = + gst_bytestream_peek_bytes (cdxa_parse->bs, (guint8 **) & buf, 4); if (got_bytes < 4) return; - cdxa_parse->data_size = GUINT32_FROM_LE (*((guint32 *)buf)); + cdxa_parse->data_size = GUINT32_FROM_LE (*((guint32 *) buf)); /* flush the data size */ if (!gst_bytestream_flush (cdxa_parse->bs, 4)) @@ -257,10 +258,9 @@ gst_cdxa_parse_loop (GstElement *element) g_warning ("cdxa_parse: size not multiple of %d bytes", CDXA_SECTOR_SIZE); cdxa_parse->sectors = cdxa_parse->data_size / CDXA_SECTOR_SIZE; - + cdxa_parse->state = CDXA_PARSE_DATA; - } - else { + } else { GstBuffer *buf; GstBuffer *outbuf; guint32 got_bytes; @@ -279,7 +279,7 @@ gst_cdxa_parse_loop (GstElement *element) } static GstElementStateReturn -gst_cdxa_parse_change_state (GstElement *element) +gst_cdxa_parse_change_state (GstElement * element) { GstCDXAParse *cdxa_parse = GST_CDXA_PARSE (element); @@ -309,25 +309,20 @@ gst_cdxa_parse_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstbytestream")) return FALSE; - if (!gst_element_register (plugin, "cdxaparse", GST_RANK_NONE, GST_TYPE_CDXA_PARSE)) + if (!gst_element_register (plugin, "cdxaparse", GST_RANK_NONE, + GST_TYPE_CDXA_PARSE)) return FALSE; - + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "cdxaparse", - "Parse a .dat file (VCD) into raw mpeg1", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) - +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "cdxaparse", + "Parse a .dat file (VCD) into raw mpeg1", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/cdxaparse/gstcdxaparse.h b/gst/cdxaparse/gstcdxaparse.h index 32af5527..ef1475b2 100644 --- a/gst/cdxaparse/gstcdxaparse.h +++ b/gst/cdxaparse/gstcdxaparse.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_CDXA_PARSE \ (gst_cdxa_parse_get_type()) @@ -43,38 +44,40 @@ extern "C" { #define CDXA_SECTOR_SIZE 2352 #define CDXA_DATA_SIZE 2324 -typedef enum -{ - CDXA_PARSE_HEADER, - CDXA_PARSE_DATA, -} GstCDXAParseState; + typedef enum + { + CDXA_PARSE_HEADER, + CDXA_PARSE_DATA, + } GstCDXAParseState; -typedef struct _GstCDXAParse GstCDXAParse; -typedef struct _GstCDXAParseClass GstCDXAParseClass; + typedef struct _GstCDXAParse GstCDXAParse; + typedef struct _GstCDXAParseClass GstCDXAParseClass; -struct _GstCDXAParse { - GstElement element; + struct _GstCDXAParse + { + GstElement element; - /* pads */ - GstPad *sinkpad, *srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - GstByteStream *bs; + GstByteStream *bs; - GstCDXAParseState state; + GstCDXAParseState state; - guint32 riff_size; - guint32 data_size; - guint32 sectors; -}; + guint32 riff_size; + guint32 data_size; + guint32 sectors; + }; -struct _GstCDXAParseClass { - GstElementClass parent_class; -}; + struct _GstCDXAParseClass + { + GstElementClass parent_class; + }; -GType gst_cdxa_parse_get_type (void); + GType gst_cdxa_parse_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_CDXA_PARSE_H__ */ +#endif /* __GST_CDXA_PARSE_H__ */ diff --git a/gst/chart/gstchart.c b/gst/chart/gstchart.c index cafc1416..21832795 100644 --- a/gst/chart/gstchart.c +++ b/gst/chart/gstchart.c @@ -33,11 +33,12 @@ typedef struct _GstChart GstChart; typedef struct _GstChartClass GstChartClass; -struct _GstChart { +struct _GstChart +{ GstElement element; /* pads */ - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; /* the timestamp of the next frame */ guint64 next_time; @@ -49,16 +50,17 @@ struct _GstChart { gint height; gint samplerate; - gdouble framerate; /* desired frame rate */ - gint samples_between_frames; /* number of samples between start of successive frames */ - gint samples_since_last_frame; /* number of samples between start of successive frames */ + gdouble framerate; /* desired frame rate */ + gint samples_between_frames; /* number of samples between start of successive frames */ + gint samples_since_last_frame; /* number of samples between start of successive frames */ }; -struct _GstChartClass { +struct _GstChartClass +{ GstElementClass parent_class; }; -GType gst_chart_get_type(void); +GType gst_chart_get_type (void); /* elementfactory information */ @@ -70,51 +72,50 @@ static GstElementDetails gst_chart_details = { }; /* signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_RGB_16) -); - -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) TRUE, " - "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) [ 8000, 96000 ], " - "channels = (int) 1") -); - -static void gst_chart_base_init (gpointer g_class); -static void gst_chart_class_init (GstChartClass *klass); -static void gst_chart_init (GstChart *chart); - -static void gst_chart_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_chart_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - -static void gst_chart_chain (GstPad *pad, GstData *_data); - -static GstPadLinkReturn - gst_chart_sinkconnect (GstPad *pad, const GstCaps *caps); -static GstPadLinkReturn - gst_chart_srcconnect (GstPad *pad, const GstCaps *caps); +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB_16) + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 8000, 96000 ], " "channels = (int) 1") + ); + +static void gst_chart_base_init (gpointer g_class); +static void gst_chart_class_init (GstChartClass * klass); +static void gst_chart_init (GstChart * chart); + +static void gst_chart_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_chart_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_chart_chain (GstPad * pad, GstData * _data); + +static GstPadLinkReturn +gst_chart_sinkconnect (GstPad * pad, const GstCaps * caps); +static GstPadLinkReturn +gst_chart_srcconnect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; @@ -125,17 +126,17 @@ gst_chart_get_type (void) if (!type) { static const GTypeInfo info = { - sizeof(GstChartClass), + sizeof (GstChartClass), gst_chart_base_init, NULL, - (GClassInitFunc)gst_chart_class_init, + (GClassInitFunc) gst_chart_class_init, NULL, NULL, - sizeof(GstChart), + sizeof (GstChart), 0, - (GInstanceInitFunc)gst_chart_init, + (GInstanceInitFunc) gst_chart_init, }; - type = g_type_register_static(GST_TYPE_ELEMENT, "GstChart", &info, 0); + type = g_type_register_static (GST_TYPE_ELEMENT, "GstChart", &info, 0); } return type; } @@ -145,36 +146,38 @@ gst_chart_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); - gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details (element_class, &gst_chart_details); } static void -gst_chart_class_init(GstChartClass *klass) +gst_chart_class_init (GstChartClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_chart_set_property; gobject_class->get_property = gst_chart_get_property; } static void -gst_chart_init (GstChart *chart) +gst_chart_init (GstChart * chart) { /* create the sink and src pads */ - chart->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_factory), - "sink"); - chart->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_factory), - "src"); + chart->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), + "sink"); + chart->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), + "src"); gst_element_add_pad (GST_ELEMENT (chart), chart->sinkpad); gst_element_add_pad (GST_ELEMENT (chart), chart->srcpad); @@ -191,13 +194,13 @@ gst_chart_init (GstChart *chart) chart->height = 128; chart->samplerate = -1; - chart->framerate = 25; /* desired frame rate */ - chart->samples_between_frames = 0; /* number of samples between start of successive frames */ + chart->framerate = 25; /* desired frame rate */ + chart->samples_between_frames = 0; /* number of samples between start of successive frames */ chart->samples_since_last_frame = 0; } static GstPadLinkReturn -gst_chart_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_chart_sinkconnect (GstPad * pad, const GstCaps * caps) { GstChart *chart; GstStructure *structure; @@ -209,15 +212,14 @@ gst_chart_sinkconnect (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "rate", &chart->samplerate); chart->samples_between_frames = chart->samplerate / chart->framerate; - GST_DEBUG ("CHART: new sink caps: rate %d", - chart->samplerate); + GST_DEBUG ("CHART: new sink caps: rate %d", chart->samplerate); /*gst_chart_sync_parms (chart); */ /* */ return GST_PAD_LINK_OK; } static GstPadLinkReturn -gst_chart_srcconnect (GstPad *pad, const GstCaps*caps) +gst_chart_srcconnect (GstPad * pad, const GstCaps * caps) { GstChart *chart; GstStructure *structure; @@ -234,63 +236,64 @@ gst_chart_srcconnect (GstPad *pad, const GstCaps*caps) gst_structure_get_int (structure, "height", &chart->height); GST_DEBUG ("CHART: new src caps: framerate %f, %dx%d", - chart->framerate, chart->width, chart->height); + chart->framerate, chart->width, chart->height); return GST_PAD_LINK_OK; } static void -draw_chart_16bpp(guchar * output, gint width, gint height, - gint16 * src_data, gint src_size) +draw_chart_16bpp (guchar * output, gint width, gint height, + gint16 * src_data, gint src_size) { - gint i; - guint16 *colstart; - gint16 * in; - - GST_DEBUG ("CHART: drawing frame to %p, width = %d, height = %d, src_data = %p, src_size = %d", - output, width, height, src_data, src_size); - - for (colstart = (guint16 *)output, in = (gint16 *)src_data, i = 0; - i < width; - colstart++, in++, i++) { - guint16 * pos = colstart; - gint h1; - - h1 = (((gint)(*in)) * height / (1 << 16)) + height / 2; - if (h1 >= height) h1 = height; - - if (h1 < height / 2) { - while (pos < colstart + h1 * width) { - *pos = 0x0000; - pos += width; - } - while (pos < colstart + height / 2 * width) { - *pos = 0x07e0; - pos += width; - } - while (pos < colstart + height * width) { - *pos = 0x0000; - pos += width; - } - } else { - while (pos < colstart + height / 2 * width) { - *pos = 0x0000; - pos += width; - } - while (pos < colstart + h1 * width) { - *pos = 0x07e0; - pos += width; - } - while (pos < colstart + height * width) { - *pos = 0x0000; - pos += width; - } - } + gint i; + guint16 *colstart; + gint16 *in; + + GST_DEBUG + ("CHART: drawing frame to %p, width = %d, height = %d, src_data = %p, src_size = %d", + output, width, height, src_data, src_size); + + for (colstart = (guint16 *) output, in = (gint16 *) src_data, i = 0; + i < width; colstart++, in++, i++) { + guint16 *pos = colstart; + gint h1; + + h1 = (((gint) (*in)) * height / (1 << 16)) + height / 2; + if (h1 >= height) + h1 = height; + + if (h1 < height / 2) { + while (pos < colstart + h1 * width) { + *pos = 0x0000; + pos += width; + } + while (pos < colstart + height / 2 * width) { + *pos = 0x07e0; + pos += width; + } + while (pos < colstart + height * width) { + *pos = 0x0000; + pos += width; + } + } else { + while (pos < colstart + height / 2 * width) { + *pos = 0x0000; + pos += width; + } + while (pos < colstart + h1 * width) { + *pos = 0x07e0; + pos += width; + } + while (pos < colstart + height * width) { + *pos = 0x0000; + pos += width; + } } + } } static void -gst_chart_chain (GstPad *pad, GstData *_data) +gst_chart_chain (GstPad * pad, GstData * _data) { GstBuffer *bufin = GST_BUFFER (_data); GstChart *chart; @@ -302,14 +305,14 @@ gst_chart_chain (GstPad *pad, GstData *_data) g_return_if_fail (bufin != NULL); g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD(pad)); - g_return_if_fail (GST_IS_CHART(GST_OBJECT_PARENT(pad))); - chart = GST_CHART(GST_OBJECT_PARENT (pad)); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (GST_IS_CHART (GST_OBJECT_PARENT (pad))); + chart = GST_CHART (GST_OBJECT_PARENT (pad)); g_return_if_fail (chart != NULL); GST_DEBUG ("CHART: chainfunc called"); - samples_in = GST_BUFFER_SIZE (bufin) / sizeof(gint16); + samples_in = GST_BUFFER_SIZE (bufin) / sizeof (gint16); datain = (gint16 *) (GST_BUFFER_DATA (bufin)); GST_DEBUG ("input buffer has %d samples", samples_in); if (chart->next_time <= GST_BUFFER_TIMESTAMP (bufin)) { @@ -319,43 +322,45 @@ gst_chart_chain (GstPad *pad, GstData *_data) chart->samples_since_last_frame += samples_in; if (chart->samples_between_frames <= chart->samples_since_last_frame) { - chart->samples_since_last_frame = 0; - - /* get data to draw into buffer */ - if (samples_in >= chart->width) { - /* make a new buffer for the output */ - bufout = gst_buffer_new (); - sizeout = chart->bpp / 8 * chart->width * chart->height; - dataout = g_malloc (sizeout); - GST_BUFFER_SIZE(bufout) = sizeout; - GST_BUFFER_DATA(bufout) = dataout; - GST_DEBUG ("CHART: made new buffer: size %d, width %d, height %d", - sizeout, chart->width, chart->height); - - /* take data and draw to new buffer */ - /* FIXME: call different routines for different properties */ - draw_chart_16bpp(dataout, chart->width, chart->height, (gint16 *)datain, samples_in); - - gst_buffer_unref(bufin); - - /* set timestamp */ - GST_BUFFER_TIMESTAMP (bufout) = chart->next_time; - - GST_DEBUG ("CHART: outputting buffer"); - /* output buffer */ - GST_BUFFER_FLAG_SET (bufout, GST_BUFFER_READONLY); - gst_pad_push (chart->srcpad, GST_DATA (bufout)); - } + chart->samples_since_last_frame = 0; + + /* get data to draw into buffer */ + if (samples_in >= chart->width) { + /* make a new buffer for the output */ + bufout = gst_buffer_new (); + sizeout = chart->bpp / 8 * chart->width * chart->height; + dataout = g_malloc (sizeout); + GST_BUFFER_SIZE (bufout) = sizeout; + GST_BUFFER_DATA (bufout) = dataout; + GST_DEBUG ("CHART: made new buffer: size %d, width %d, height %d", + sizeout, chart->width, chart->height); + + /* take data and draw to new buffer */ + /* FIXME: call different routines for different properties */ + draw_chart_16bpp (dataout, chart->width, chart->height, (gint16 *) datain, + samples_in); + + gst_buffer_unref (bufin); + + /* set timestamp */ + GST_BUFFER_TIMESTAMP (bufout) = chart->next_time; + + GST_DEBUG ("CHART: outputting buffer"); + /* output buffer */ + GST_BUFFER_FLAG_SET (bufout, GST_BUFFER_READONLY); + gst_pad_push (chart->srcpad, GST_DATA (bufout)); + } } else { - GST_DEBUG ("CHART: skipping buffer"); - gst_buffer_unref(bufin); + GST_DEBUG ("CHART: skipping buffer"); + gst_buffer_unref (bufin); } GST_DEBUG ("CHART: exiting chainfunc"); } static void -gst_chart_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_chart_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstChart *chart; @@ -370,7 +375,8 @@ gst_chart_set_property (GObject *object, guint prop_id, const GValue *value, GPa } static void -gst_chart_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_chart_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstChart *chart; @@ -385,21 +391,16 @@ gst_chart_get_property (GObject *object, guint prop_id, GValue *value, GParamSpe } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "chart", GST_RANK_NONE, GST_TYPE_CHART)) return FALSE; - + return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "chart", - "Takes frames of data and outputs video frames of a chart of data", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "chart", + "Takes frames of data and outputs video frames of a chart of data", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/colorspace/gstcolorspace.c b/gst/colorspace/gstcolorspace.c index db4056eb..8ec6fe8a 100644 --- a/gst/colorspace/gstcolorspace.c +++ b/gst/colorspace/gstcolorspace.c @@ -28,84 +28,80 @@ static GstColorspaceFormat gst_colorspace_formats[] = { - { GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) }, - { GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("YV12")) }, - { GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB) }, - { GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB) }, - { GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB_16) }, + {GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420"))}, + {GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("YV12"))}, + {GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB)}, + {GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB)}, + {GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB_16)}, }; static GstColorspaceConverter gst_colorspace_converters[] = { - { GST_COLORSPACE_I420, GST_COLORSPACE_RGB32, gst_colorspace_I420_to_rgb32 }, - { GST_COLORSPACE_YV12, GST_COLORSPACE_RGB32, gst_colorspace_YV12_to_rgb32 }, - { GST_COLORSPACE_I420, GST_COLORSPACE_RGB24, gst_colorspace_I420_to_rgb24 }, - { GST_COLORSPACE_YV12, GST_COLORSPACE_RGB24, gst_colorspace_YV12_to_rgb24 }, - { GST_COLORSPACE_I420, GST_COLORSPACE_RGB16, gst_colorspace_I420_to_rgb16 }, - { GST_COLORSPACE_YV12, GST_COLORSPACE_RGB16, gst_colorspace_YV12_to_rgb16 }, + {GST_COLORSPACE_I420, GST_COLORSPACE_RGB32, gst_colorspace_I420_to_rgb32}, + {GST_COLORSPACE_YV12, GST_COLORSPACE_RGB32, gst_colorspace_YV12_to_rgb32}, + {GST_COLORSPACE_I420, GST_COLORSPACE_RGB24, gst_colorspace_I420_to_rgb24}, + {GST_COLORSPACE_YV12, GST_COLORSPACE_RGB24, gst_colorspace_YV12_to_rgb24}, + {GST_COLORSPACE_I420, GST_COLORSPACE_RGB16, gst_colorspace_I420_to_rgb16}, + {GST_COLORSPACE_YV12, GST_COLORSPACE_RGB16, gst_colorspace_YV12_to_rgb16}, }; -static GstElementDetails colorspace_details = GST_ELEMENT_DETAILS ( - "Colorspace converter", - "Filter/Converter/Video", - "Converts video from one colorspace to another", - "Wim Taymans " -); +static GstElementDetails colorspace_details = +GST_ELEMENT_DETAILS ("Colorspace converter", + "Filter/Converter/Video", + "Converts video from one colorspace to another", + "Wim Taymans "); static GstStaticPadTemplate gst_colorspace_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ I420, YV12 }")) -); + ); static GstStaticPadTemplate gst_colorspace_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_xRGB "; " - GST_VIDEO_CAPS_BGRx "; " - GST_VIDEO_CAPS_RGB "; " - GST_VIDEO_CAPS_RGB_16 - ) -); + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB "; " + GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGB "; " GST_VIDEO_CAPS_RGB_16) + ); /* Stereo signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SOURCE, ARG_DEST, }; -static void gst_colorspace_base_init (gpointer g_class); -static void gst_colorspace_class_init (GstColorspaceClass *klass); -static void gst_colorspace_init (GstColorspace *space); +static void gst_colorspace_base_init (gpointer g_class); +static void gst_colorspace_class_init (GstColorspaceClass * klass); +static void gst_colorspace_init (GstColorspace * space); -static void gst_colorspace_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_colorspace_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_colorspace_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_colorspace_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstPadLinkReturn - gst_colorspace_link (GstPad *pad, const GstCaps *caps); -static void gst_colorspace_chain (GstPad *pad, GstData *_data); -static GstElementStateReturn - gst_colorspace_change_state (GstElement *element); +gst_colorspace_link (GstPad * pad, const GstCaps * caps); +static void gst_colorspace_chain (GstPad * pad, GstData * _data); +static GstElementStateReturn gst_colorspace_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_colorspace_signals[LAST_SIGNAL] = { 0 }; */ #if 0 -static gboolean -colorspace_setup_converter (GstColorspace *space, GstCaps *from_caps, GstCaps *to_caps) +static gboolean +colorspace_setup_converter (GstColorspace * space, GstCaps * from_caps, + GstCaps * to_caps) { guint32 from_space, to_space; GstStructure *from_struct; @@ -117,138 +113,142 @@ colorspace_setup_converter (GstColorspace *space, GstCaps *from_caps, GstCaps *t from_struct = gst_caps_get_structure (from_caps, 0); to_struct = gst_caps_get_structure (to_caps, 0); - from_space = GST_MAKE_FOURCC ('R','G','B',' '); + from_space = GST_MAKE_FOURCC ('R', 'G', 'B', ' '); gst_structure_get_fourcc (from_struct, "format", &from_space); - to_space = GST_MAKE_FOURCC ('R','G','B',' '); + to_space = GST_MAKE_FOURCC ('R', 'G', 'B', ' '); gst_structure_get_fourcc (to_struct, "format", &to_space); - GST_INFO ("set up converter for " GST_FOURCC_FORMAT - " (%08x) to " GST_FOURCC_FORMAT " (%08x)", - GST_FOURCC_ARGS (from_space), from_space, - GST_FOURCC_ARGS (to_space), to_space); + GST_INFO ("set up converter for " GST_FOURCC_FORMAT + " (%08x) to " GST_FOURCC_FORMAT " (%08x)", + GST_FOURCC_ARGS (from_space), from_space, + GST_FOURCC_ARGS (to_space), to_space); switch (from_space) { - case GST_MAKE_FOURCC ('R','G','B',' '): + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '): { gint from_bpp; - + gst_structure_get_int (from_struct, "bpp", &from_bpp); switch (to_space) { - case GST_MAKE_FOURCC ('R','G','B',' '): + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '): #ifdef HAVE_HERMES - { - gint to_bpp; - - gst_structure_get_int (to_struct, "bpp", &to_bpp); + { + gint to_bpp; + + gst_structure_get_int (to_struct, "bpp", &to_bpp); - gst_structure_get_int (from_struct, "red_mask", &space->source.r); + gst_structure_get_int (from_struct, "red_mask", &space->source.r); gst_structure_get_int (from_struct, "green_mask", &space->source.g); - gst_structure_get_int (from_struct, "blue_mask", &space->source.b); + gst_structure_get_int (from_struct, "blue_mask", &space->source.b); space->source.a = 0; space->srcbpp = space->source.bits = from_bpp; space->source.indexed = 0; space->source.has_colorkey = 0; - GST_INFO ( "source red mask %08x", space->source.r); - GST_INFO ( "source green mask %08x", space->source.g); - GST_INFO ( "source blue mask %08x", space->source.b); - GST_INFO ( "source bpp %08x", space->srcbpp); + GST_INFO ("source red mask %08x", space->source.r); + GST_INFO ("source green mask %08x", space->source.g); + GST_INFO ("source blue mask %08x", space->source.b); + GST_INFO ("source bpp %08x", space->srcbpp); - gst_structure_get_int (to_struct, "red_mask", &space->dest.r); + gst_structure_get_int (to_struct, "red_mask", &space->dest.r); gst_structure_get_int (to_struct, "green_mask", &space->dest.g); - gst_structure_get_int (to_struct, "blue_mask", &space->dest.b); + gst_structure_get_int (to_struct, "blue_mask", &space->dest.b); space->dest.a = 0; space->destbpp = space->dest.bits = to_bpp; space->dest.indexed = 0; space->dest.has_colorkey = 0; - GST_INFO ( "dest red mask %08x", space->dest.r); - GST_INFO ( "dest green mask %08x", space->dest.g); - GST_INFO ( "dest blue mask %08x", space->dest.b); - GST_INFO ( "dest bpp %08x", space->destbpp); + GST_INFO ("dest red mask %08x", space->dest.r); + GST_INFO ("dest green mask %08x", space->dest.g); + GST_INFO ("dest blue mask %08x", space->dest.b); + GST_INFO ("dest bpp %08x", space->destbpp); - if (!Hermes_ConverterRequest (space->h_handle, &space->source, &space->dest)) { + if (!Hermes_ConverterRequest (space->h_handle, &space->source, + &space->dest)) { g_warning ("Hermes: could not get converter\n"); return FALSE; } - GST_INFO ( "converter set up"); - space->type = GST_COLORSPACE_HERMES; + GST_INFO ("converter set up"); + space->type = GST_COLORSPACE_HERMES; return TRUE; } #else g_warning ("colorspace: compiled without hermes!"); return FALSE; #endif - case GST_MAKE_FOURCC ('Y','V','1','2'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): if (from_bpp == 32) { - space->type = GST_COLORSPACE_RGB32_YV12; + space->type = GST_COLORSPACE_RGB32_YV12; space->destbpp = 12; return TRUE; } - case GST_MAKE_FOURCC ('I','4','2','0'): + case GST_MAKE_FOURCC ('I', '4', '2', '0'): if (from_bpp == 32) { - space->type = GST_COLORSPACE_RGB32_I420; + space->type = GST_COLORSPACE_RGB32_I420; space->destbpp = 12; return TRUE; } - case GST_MAKE_FOURCC ('Y','U','Y','2'): - GST_INFO ( "colorspace: RGB to YUV with bpp %d not implemented!!", from_bpp); + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + GST_INFO ("colorspace: RGB to YUV with bpp %d not implemented!!", + from_bpp); return FALSE; } break; } - case GST_MAKE_FOURCC ('I','4','2','0'): + case GST_MAKE_FOURCC ('I', '4', '2', '0'): switch (to_space) { - case GST_MAKE_FOURCC ('R','G','B',' '): - GST_INFO ( "colorspace: YUV to RGB"); + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '): + GST_INFO ("colorspace: YUV to RGB"); gst_structure_get_int (to_struct, "bpp", &space->destbpp); - space->converter = gst_colorspace_yuv2rgb_get_converter (from_caps, to_caps); - space->type = GST_COLORSPACE_YUV_RGB; + space->converter = + gst_colorspace_yuv2rgb_get_converter (from_caps, to_caps); + space->type = GST_COLORSPACE_YUV_RGB; return TRUE; - case GST_MAKE_FOURCC ('I','4','2','0'): - space->type = GST_COLORSPACE_NONE; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + space->type = GST_COLORSPACE_NONE; space->destbpp = 12; return TRUE; - case GST_MAKE_FOURCC ('Y','V','1','2'): - space->type = GST_COLORSPACE_420_SWAP; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + space->type = GST_COLORSPACE_420_SWAP; space->destbpp = 12; return TRUE; } break; - case GST_MAKE_FOURCC ('Y','U','Y','2'): + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): switch (to_space) { - case GST_MAKE_FOURCC ('I','4','2','0'): - space->type = GST_COLORSPACE_YUY2_I420; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + space->type = GST_COLORSPACE_YUY2_I420; space->destbpp = 12; return TRUE; - case GST_MAKE_FOURCC ('Y','U','Y','2'): - space->type = GST_COLORSPACE_NONE; + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + space->type = GST_COLORSPACE_NONE; space->destbpp = 16; return TRUE; - case GST_MAKE_FOURCC ('R','G','B',' '): - GST_INFO ( "colorspace: YUY2 to RGB not implemented!!"); + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '): + GST_INFO ("colorspace: YUY2 to RGB not implemented!!"); return FALSE; } break; - case GST_MAKE_FOURCC ('Y','V','1','2'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): switch (to_space) { - case GST_MAKE_FOURCC ('R','G','B',' '): - GST_INFO ( "colorspace: YV12 to RGB"); + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '): + GST_INFO ("colorspace: YV12 to RGB"); gst_structure_get_int (to_struct, "bpp", &space->destbpp); - space->converter = gst_colorspace_yuv2rgb_get_converter (from_caps, to_caps); - space->type = GST_COLORSPACE_YUV_RGB; + space->converter = + gst_colorspace_yuv2rgb_get_converter (from_caps, to_caps); + space->type = GST_COLORSPACE_YUV_RGB; return TRUE; - case GST_MAKE_FOURCC ('I','4','2','0'): - space->type = GST_COLORSPACE_420_SWAP; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + space->type = GST_COLORSPACE_420_SWAP; space->destbpp = 12; return TRUE; - case GST_MAKE_FOURCC ('Y','V','1','2'): - space->type = GST_COLORSPACE_NONE; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + space->type = GST_COLORSPACE_NONE; space->destbpp = 12; return TRUE; } @@ -259,13 +259,13 @@ colorspace_setup_converter (GstColorspace *space, GstCaps *from_caps, GstCaps *t #endif static GstCaps * -gst_colorspace_caps_remove_format_info (GstCaps *caps, const char *media_type) +gst_colorspace_caps_remove_format_info (GstCaps * caps, const char *media_type) { int i; GstStructure *structure; GstCaps *rgbcaps; - for (i=0; isrcpad) ? space->sinkpad : space->srcpad; @@ -308,16 +308,16 @@ gst_colorspace_getcaps (GstPad *pad) } static GstColorSpaceFormatType -gst_colorspace_get_format (const GstCaps *caps) +gst_colorspace_get_format (const GstCaps * caps) { int i; - for(i=0; ifrom && to == converter->to) { return i; } } - g_assert_not_reached(); + g_assert_not_reached (); return -1; } static GstPadLinkReturn -gst_colorspace_link (GstPad *pad, const GstCaps *caps) +gst_colorspace_link (GstPad * pad, const GstCaps * caps) { GstColorspace *space; GstPad *otherpad; @@ -402,23 +403,22 @@ gst_colorspace_link (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); format_index = gst_colorspace_get_format (caps); - g_print("format index is %d\n", format_index); + g_print ("format index is %d\n", format_index); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); gst_structure_get_double (structure, "framerate", &fps); - GST_INFO ( "size: %dx%d", space->width, space->height); + GST_INFO ("size: %dx%d", space->width, space->height); if (gst_pad_is_negotiated (otherpad)) { GstCaps *othercaps; - + othercaps = gst_caps_copy (gst_pad_get_negotiated_caps (otherpad)); gst_caps_set_simple (othercaps, - "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, - "framerate", G_TYPE_DOUBLE, fps, NULL); + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, "framerate", G_TYPE_DOUBLE, fps, NULL); link_ret = gst_pad_try_set_caps (otherpad, othercaps); if (link_ret != GST_PAD_LINK_OK) { @@ -433,20 +433,20 @@ gst_colorspace_link (GstPad *pad, const GstCaps *caps) } if (gst_pad_is_negotiated (otherpad)) { - space->converter_index = gst_colorspace_get_converter ( - space->sink_format_index, space->src_format_index); + space->converter_index = + gst_colorspace_get_converter (space->sink_format_index, + space->src_format_index); - g_print("using index %d\n", space->converter_index); + g_print ("using index %d\n", space->converter_index); - space->sink_size = gst_colorspace_format_get_size(space->sink_format_index, - width,height); - space->src_size = gst_colorspace_format_get_size(space->src_format_index, - width,height); + space->sink_size = gst_colorspace_format_get_size (space->sink_format_index, + width, height); + space->src_size = gst_colorspace_format_get_size (space->src_format_index, + width, height); space->width = width; space->height = height; space->fps = fps; } - #if 0 if (gst_pad_is_negotiated (otherpad)) { g_warning ("could not get converter\n"); @@ -464,17 +464,19 @@ gst_colorspace_get_type (void) if (!colorspace_type) { static const GTypeInfo colorspace_info = { - sizeof(GstColorspaceClass), + sizeof (GstColorspaceClass), gst_colorspace_base_init, NULL, - (GClassInitFunc)gst_colorspace_class_init, + (GClassInitFunc) gst_colorspace_class_init, NULL, NULL, - sizeof(GstColorspace), + sizeof (GstColorspace), 0, - (GInstanceInitFunc)gst_colorspace_init, + (GInstanceInitFunc) gst_colorspace_init, }; - colorspace_type = g_type_register_static(GST_TYPE_ELEMENT, "GstColorspace", &colorspace_info, 0); + colorspace_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstColorspace", + &colorspace_info, 0); } return colorspace_type; } @@ -483,54 +485,54 @@ static void gst_colorspace_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_colorspace_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_colorspace_sink_template)); + gst_static_pad_template_get (&gst_colorspace_sink_template)); gst_element_class_set_details (element_class, &colorspace_details); } - + static void -gst_colorspace_class_init (GstColorspaceClass *klass) +gst_colorspace_class_init (GstColorspaceClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_colorspace_set_property; gobject_class->get_property = gst_colorspace_get_property; gstelement_class->change_state = gst_colorspace_change_state; - gst_colorspace_table_init(NULL); + gst_colorspace_table_init (NULL); } static void -gst_colorspace_init (GstColorspace *space) +gst_colorspace_init (GstColorspace * space) { - space->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_colorspace_sink_template), - "sink"); + space->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_colorspace_sink_template), "sink"); gst_pad_set_link_function (space->sinkpad, gst_colorspace_link); gst_pad_set_getcaps_function (space->sinkpad, gst_colorspace_getcaps); - gst_pad_set_chain_function(space->sinkpad,gst_colorspace_chain); - gst_element_add_pad(GST_ELEMENT(space),space->sinkpad); + gst_pad_set_chain_function (space->sinkpad, gst_colorspace_chain); + gst_element_add_pad (GST_ELEMENT (space), space->sinkpad); - space->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_colorspace_src_template), - "src"); - gst_element_add_pad(GST_ELEMENT(space),space->srcpad); + space->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_colorspace_src_template), "src"); + gst_element_add_pad (GST_ELEMENT (space), space->srcpad); gst_pad_set_link_function (space->srcpad, gst_colorspace_link); } static void -gst_colorspace_chain (GstPad *pad,GstData *_data) +gst_colorspace_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstColorspace *space; @@ -542,7 +544,7 @@ gst_colorspace_chain (GstPad *pad,GstData *_data) g_return_if_fail (buf != NULL); space = GST_COLORSPACE (gst_pad_get_parent (pad)); - + g_return_if_fail (space != NULL); g_return_if_fail (GST_IS_COLORSPACE (space)); @@ -552,10 +554,9 @@ gst_colorspace_chain (GstPad *pad,GstData *_data) outbuf = gst_pad_alloc_buffer (space->srcpad, GST_BUFFER_OFFSET_NONE, space->src_size); - + converter = gst_colorspace_converters + space->converter_index; - converter->convert (space, GST_BUFFER_DATA (outbuf), - GST_BUFFER_DATA (buf)); + converter->convert (space, GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (buf)); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf); @@ -565,7 +566,7 @@ gst_colorspace_chain (GstPad *pad,GstData *_data) } static GstElementStateReturn -gst_colorspace_change_state (GstElement *element) +gst_colorspace_change_state (GstElement * element) { GstColorspace *space; @@ -584,13 +585,14 @@ gst_colorspace_change_state (GstElement *element) } static void -gst_colorspace_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_colorspace_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstColorspace *space; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_COLORSPACE(object)); - space = GST_COLORSPACE(object); + g_return_if_fail (GST_IS_COLORSPACE (object)); + space = GST_COLORSPACE (object); switch (prop_id) { default: @@ -599,13 +601,14 @@ gst_colorspace_set_property (GObject *object, guint prop_id, const GValue *value } static void -gst_colorspace_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_colorspace_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstColorspace *space; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_COLORSPACE(object)); - space = GST_COLORSPACE(object); + g_return_if_fail (GST_IS_COLORSPACE (object)); + space = GST_COLORSPACE (object); switch (prop_id) { default: @@ -615,22 +618,17 @@ gst_colorspace_get_property (GObject *object, guint prop_id, GValue *value, GPar } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "colorspace", GST_RANK_PRIMARY, - GST_TYPE_COLORSPACE)) + GST_TYPE_COLORSPACE)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "colorspace", - "internal colorspace converter", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "colorspace", + "internal colorspace converter", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/colorspace/gstcolorspace.h b/gst/colorspace/gstcolorspace.h index 22e2f7ec..f777b41b 100644 --- a/gst/colorspace/gstcolorspace.h +++ b/gst/colorspace/gstcolorspace.h @@ -23,7 +23,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_COLORSPACE \ (gst_colorspace_get_type()) #define GST_COLORSPACE(obj) \ @@ -34,11 +33,11 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_COLORSPACE)) #define GST_IS_COLORSPACE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_COLORSPACE)) - typedef struct _GstColorspace GstColorspace; typedef struct _GstColorspaceClass GstColorspaceClass; -typedef enum { +typedef enum +{ GST_COLORSPACE_NONE, GST_COLORSPACE_HERMES, GST_COLORSPACE_YUV_RGB, @@ -48,10 +47,11 @@ typedef enum { GST_COLORSPACE_420_SWAP, } GstColorSpaceConverterType; -struct _GstColorspace { +struct _GstColorspace +{ GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; int converter_index; @@ -60,7 +60,7 @@ struct _GstColorspace { int src_size; int sink_size; - + int src_stride; int sink_stride; @@ -68,18 +68,21 @@ struct _GstColorspace { gdouble fps; }; -struct _GstColorspaceClass { +struct _GstColorspaceClass +{ GstElementClass parent_class; }; -GType gst_colorspace_get_type(void); +GType gst_colorspace_get_type (void); -typedef struct _GstColorspaceFormat { +typedef struct _GstColorspaceFormat +{ GstStaticCaps caps; } GstColorspaceFormat; -typedef enum { +typedef enum +{ GST_COLORSPACE_I420, GST_COLORSPACE_YV12, GST_COLORSPACE_RGB32, @@ -87,13 +90,13 @@ typedef enum { GST_COLORSPACE_RGB16, } GstColorSpaceFormatType; -typedef struct _GstColorspaceConverter { +typedef struct _GstColorspaceConverter +{ GstColorSpaceFormatType from; GstColorSpaceFormatType to; - void (*convert) (GstColorspace *colorspace, unsigned char *dest, unsigned char *src); + void (*convert) (GstColorspace * colorspace, unsigned char *dest, + unsigned char *src); } GstColorspaceConverter; G_END_DECLS - #endif - diff --git a/gst/colorspace/yuv2rgb.c b/gst/colorspace/yuv2rgb.c index 3627e896..37eaa628 100644 --- a/gst/colorspace/yuv2rgb.c +++ b/gst/colorspace/yuv2rgb.c @@ -28,14 +28,14 @@ #undef HAVE_LIBMMX -#ifdef HAVE_LIBMMX +#ifdef HAVE_LIBMMX #include #endif -static int V_r_tab [256]; -static int V_g_tab [256]; -static int U_g_tab [256]; -static int U_b_tab [256]; +static int V_r_tab[256]; +static int V_g_tab[256]; +static int U_g_tab[256]; +static int U_b_tab[256]; #define CB_BASE 1 #define CR_BASE (CB_BASE*CB_RANGE) @@ -59,75 +59,69 @@ static int U_b_tab [256]; : Max(-128.0, ((x) * chromaCorrect))) -void gst_colorspace_I420_to_rgb16 (GstColorspace *space, unsigned char *src, unsigned char *dest); -void gst_colorspace_I420_to_rgb24 (GstColorspace *space, unsigned char *src, unsigned char *dest); -void gst_colorspace_I420_to_rgb32 (GstColorspace *space, unsigned char *src, unsigned char *dest); +void gst_colorspace_I420_to_rgb16 (GstColorspace * space, unsigned char *src, + unsigned char *dest); +void gst_colorspace_I420_to_rgb24 (GstColorspace * space, unsigned char *src, + unsigned char *dest); +void gst_colorspace_I420_to_rgb32 (GstColorspace * space, unsigned char *src, + unsigned char *dest); #ifdef HAVE_LIBMMX -void gst_colorspace_I420_to_bgr16_mmx (GstColorspace *space, unsigned char *src, unsigned char *dest); -void gst_colorspace_I420_to_bgr32_mmx (GstColorspace *space, unsigned char *src, unsigned char *dest); +void gst_colorspace_I420_to_bgr16_mmx (GstColorspace * space, + unsigned char *src, unsigned char *dest); +void gst_colorspace_I420_to_bgr32_mmx (GstColorspace * space, + unsigned char *src, unsigned char *dest); #endif -void gst_colorspace_YV12_to_rgb16 (GstColorspace *space, unsigned char *src, unsigned char *dest); -void gst_colorspace_YV12_to_rgb24 (GstColorspace *space, unsigned char *src, unsigned char *dest); -void gst_colorspace_YV12_to_rgb32 (GstColorspace *space, unsigned char *src, unsigned char *dest); +void gst_colorspace_YV12_to_rgb16 (GstColorspace * space, unsigned char *src, + unsigned char *dest); +void gst_colorspace_YV12_to_rgb24 (GstColorspace * space, unsigned char *src, + unsigned char *dest); +void gst_colorspace_YV12_to_rgb32 (GstColorspace * space, unsigned char *src, + unsigned char *dest); #ifdef HAVE_LIBMMX -void gst_colorspace_YV12_to_bgr16_mmx (GstColorspace *space, unsigned char *src, unsigned char *dest); -void gst_colorspace_YV12_to_bgr32_mmx (GstColorspace *space, unsigned char *src, unsigned char *dest); +void gst_colorspace_YV12_to_bgr16_mmx (GstColorspace * space, + unsigned char *src, unsigned char *dest); +void gst_colorspace_YV12_to_bgr32_mmx (GstColorspace * space, + unsigned char *src, unsigned char *dest); #endif static void -gst_colorspace_yuv_to_rgb16(GstColorspace *space, - unsigned char *out, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - int cols, int rows); +gst_colorspace_yuv_to_rgb16 (GstColorspace * space, + unsigned char *out, + unsigned char *lum, + unsigned char *cr, unsigned char *cb, int cols, int rows); static void -gst_colorspace_yuv_to_rgb24(GstColorspace *space, - unsigned char *out, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - int cols, int rows); +gst_colorspace_yuv_to_rgb24 (GstColorspace * space, + unsigned char *out, + unsigned char *lum, + unsigned char *cr, unsigned char *cb, int cols, int rows); static void -gst_colorspace_yuv_to_rgb32(GstColorspace *space, - unsigned char *out, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - int cols, int rows); +gst_colorspace_yuv_to_rgb32 (GstColorspace * space, + unsigned char *out, + unsigned char *lum, + unsigned char *cr, unsigned char *cb, int cols, int rows); #if 0 -static void gst_colorspace_yuv_to_rgb16(GstColorspaceYUVTables *tables, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - unsigned char *out, - int cols, int rows); -static void gst_colorspace_yuv_to_rgb24(GstColorspaceYUVTables *tables, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - unsigned char *out, - int cols, int rows); -static void gst_colorspace_yuv_to_rgb32(GstColorspaceYUVTables *tables, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - unsigned char *out, - int cols, int rows); +static void gst_colorspace_yuv_to_rgb16 (GstColorspaceYUVTables * tables, + unsigned char *lum, + unsigned char *cr, + unsigned char *cb, unsigned char *out, int cols, int rows); +static void gst_colorspace_yuv_to_rgb24 (GstColorspaceYUVTables * tables, + unsigned char *lum, + unsigned char *cr, + unsigned char *cb, unsigned char *out, int cols, int rows); +static void gst_colorspace_yuv_to_rgb32 (GstColorspaceYUVTables * tables, + unsigned char *lum, + unsigned char *cr, + unsigned char *cb, unsigned char *out, int cols, int rows); #ifdef HAVE_LIBMMX -void gst_colorspace_yuv_to_bgr32_mmx(GstColorspaceYUVTables *tables, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - unsigned char *out, - int cols, int rows); -extern void gst_colorspace_yuv_to_bgr16_mmx(GstColorspaceYUVTables *tables, - unsigned char *lum, - unsigned char *cr, - unsigned char *cb, - unsigned char *out, - int cols, int rows); +void gst_colorspace_yuv_to_bgr32_mmx (GstColorspaceYUVTables * tables, + unsigned char *lum, + unsigned char *cr, + unsigned char *cb, unsigned char *out, int cols, int rows); +extern void gst_colorspace_yuv_to_bgr16_mmx (GstColorspaceYUVTables * tables, + unsigned char *lum, + unsigned char *cr, + unsigned char *cb, unsigned char *out, int cols, int rows); #endif #endif @@ -136,159 +130,163 @@ extern void gst_colorspace_yuv_to_bgr16_mmx(GstColorspaceYUVTables *tables, #define ROUND_UP_8(x) (((x)+7)&~7) -void gst_colorspace_I420_to_rgb32(GstColorspace *space, unsigned char *dest, - unsigned char *src) +void +gst_colorspace_I420_to_rgb32 (GstColorspace * space, unsigned char *dest, + unsigned char *src) { unsigned char *src_U; unsigned char *src_V; src_U = src + ROUND_UP_4 (space->width) * ROUND_UP_2 (space->height); - src_V = src_U + ROUND_UP_8 (space->width)/2 * ROUND_UP_2 (space->height)/2; + src_V = + src_U + ROUND_UP_8 (space->width) / 2 * ROUND_UP_2 (space->height) / 2; - gst_colorspace_yuv_to_rgb32(space, - dest, - src, src_U, src_V, - space->width, space->height); + gst_colorspace_yuv_to_rgb32 (space, + dest, src, src_U, src_V, space->width, space->height); } -void gst_colorspace_I420_to_rgb24(GstColorspace *space, unsigned char *dest, - unsigned char *src) +void +gst_colorspace_I420_to_rgb24 (GstColorspace * space, unsigned char *dest, + unsigned char *src) { unsigned char *src_U; unsigned char *src_V; src_U = src + ROUND_UP_4 (space->width) * ROUND_UP_2 (space->height); - src_V = src_U + ROUND_UP_8 (space->width)/2 * ROUND_UP_2 (space->height)/2; + src_V = + src_U + ROUND_UP_8 (space->width) / 2 * ROUND_UP_2 (space->height) / 2; - gst_colorspace_yuv_to_rgb24(space, - dest, - src, src_U, src_V, - space->width, space->height); + gst_colorspace_yuv_to_rgb24 (space, + dest, src, src_U, src_V, space->width, space->height); } -void gst_colorspace_I420_to_rgb16(GstColorspace *space, unsigned char *dest, - unsigned char *src) +void +gst_colorspace_I420_to_rgb16 (GstColorspace * space, unsigned char *dest, + unsigned char *src) { unsigned char *src_U; unsigned char *src_V; src_U = src + ROUND_UP_4 (space->width) * ROUND_UP_2 (space->height); - src_V = src_U + ROUND_UP_8 (space->width)/2 * ROUND_UP_2 (space->height)/2; + src_V = + src_U + ROUND_UP_8 (space->width) / 2 * ROUND_UP_2 (space->height) / 2; - gst_colorspace_yuv_to_rgb16(space, - dest, - src, src_U, src_V, - space->width, space->height); + gst_colorspace_yuv_to_rgb16 (space, + dest, src, src_U, src_V, space->width, space->height); } -void gst_colorspace_YV12_to_rgb32(GstColorspace *space, unsigned char *dest, - unsigned char *src) +void +gst_colorspace_YV12_to_rgb32 (GstColorspace * space, unsigned char *dest, + unsigned char *src) { unsigned char *src_U; unsigned char *src_V; src_V = src + ROUND_UP_4 (space->width) * ROUND_UP_2 (space->height); - src_U = src_V + ROUND_UP_8 (space->width)/2 * ROUND_UP_2 (space->height)/2; + src_U = + src_V + ROUND_UP_8 (space->width) / 2 * ROUND_UP_2 (space->height) / 2; - gst_colorspace_yuv_to_rgb32(space, - dest, - src, src_U, src_V, - space->width, space->height); + gst_colorspace_yuv_to_rgb32 (space, + dest, src, src_U, src_V, space->width, space->height); } -void gst_colorspace_YV12_to_rgb24(GstColorspace *space, unsigned char *dest, - unsigned char *src) +void +gst_colorspace_YV12_to_rgb24 (GstColorspace * space, unsigned char *dest, + unsigned char *src) { unsigned char *src_U; unsigned char *src_V; src_V = src + ROUND_UP_4 (space->width) * ROUND_UP_2 (space->height); - src_U = src_V + ROUND_UP_8 (space->width)/2 * ROUND_UP_2 (space->height)/2; + src_U = + src_V + ROUND_UP_8 (space->width) / 2 * ROUND_UP_2 (space->height) / 2; - gst_colorspace_yuv_to_rgb24(space, - dest, - src, src_U, src_V, - space->width, space->height); + gst_colorspace_yuv_to_rgb24 (space, + dest, src, src_U, src_V, space->width, space->height); } -void gst_colorspace_YV12_to_rgb16(GstColorspace *space, unsigned char *dest, - unsigned char *src) +void +gst_colorspace_YV12_to_rgb16 (GstColorspace * space, unsigned char *dest, + unsigned char *src) { unsigned char *src_U; unsigned char *src_V; src_V = src + ROUND_UP_4 (space->width) * ROUND_UP_2 (space->height); - src_U = src_V + ROUND_UP_8 (space->width)/2 * ROUND_UP_2 (space->height)/2; + src_U = + src_V + ROUND_UP_8 (space->width) / 2 * ROUND_UP_2 (space->height) / 2; - gst_colorspace_yuv_to_rgb16(space, - dest, - src, src_U, src_V, - space->width, space->height); + gst_colorspace_yuv_to_rgb16 (space, + dest, src, src_U, src_V, space->width, space->height); } #ifdef HAVE_LIBMMX -void gst_colorspace_I420_to_bgr32_mmx(GstColorspace *space, unsigned char *src, unsigned char *dest) { +void +gst_colorspace_I420_to_bgr32_mmx (GstColorspace * space, unsigned char *src, + unsigned char *dest) +{ int size; + GST_DEBUG ("gst_colorspace_I420_to_rgb32_mmx"); size = space->width * space->height; - gst_colorspace_yuv_to_bgr32_mmx(NULL, - src, /* Y component */ - src+size, /* cr component */ - src+size+(size>>2), /* cb component */ - dest, - space->height, - space->width); + gst_colorspace_yuv_to_bgr32_mmx (NULL, src, /* Y component */ + src + size, /* cr component */ + src + size + (size >> 2), /* cb component */ + dest, space->height, space->width); } -void gst_colorspace_I420_to_bgr16_mmx(GstColorspace *space, unsigned char *src, unsigned char *dest) { +void +gst_colorspace_I420_to_bgr16_mmx (GstColorspace * space, unsigned char *src, + unsigned char *dest) +{ int size; + GST_DEBUG ("gst_colorspace_I420_to_bgr16_mmx "); size = space->width * space->height; - gst_colorspace_yuv_to_bgr16_mmx(NULL, - src, /* Y component */ - src+size, /* cr component */ - src+size+(size>>2), /* cb component */ - dest, - space->height, - space->width); + gst_colorspace_yuv_to_bgr16_mmx (NULL, src, /* Y component */ + src + size, /* cr component */ + src + size + (size >> 2), /* cb component */ + dest, space->height, space->width); GST_DEBUG ("gst_colorspace_I420_to_bgr16_mmx done"); } -void gst_colorspace_YV12_to_bgr32_mmx(GstColorspace *space, unsigned char *src, unsigned char *dest) { +void +gst_colorspace_YV12_to_bgr32_mmx (GstColorspace * space, unsigned char *src, + unsigned char *dest) +{ int size; + GST_DEBUG ("gst_colorspace_YV12_to_rgb32_mmx"); size = space->width * space->height; - gst_colorspace_yuv_to_bgr32_mmx(NULL, - src, /* Y component */ - src+size+(size>>2), /* cb component */ - src+size, /* cr component */ - dest, - space->height, - space->width); + gst_colorspace_yuv_to_bgr32_mmx (NULL, src, /* Y component */ + src + size + (size >> 2), /* cb component */ + src + size, /* cr component */ + dest, space->height, space->width); } -void gst_colorspace_YV12_to_bgr16_mmx(GstColorspace *space, unsigned char *src, unsigned char *dest) { +void +gst_colorspace_YV12_to_bgr16_mmx (GstColorspace * space, unsigned char *src, + unsigned char *dest) +{ int size; + GST_DEBUG ("gst_colorspace_YV12_to_bgr16_mmx "); size = space->width * space->height; - gst_colorspace_yuv_to_bgr16_mmx(NULL, - src, /* Y component */ - src+size+(size>>2), /* cb component */ - src+size, /* cr component */ - dest, - space->height, - space->width); + gst_colorspace_yuv_to_bgr16_mmx (NULL, src, /* Y component */ + src + size + (size >> 2), /* cb component */ + src + size, /* cr component */ + dest, space->height, space->width); GST_DEBUG ("gst_colorspace_YV12_to_bgr16_mmx done"); } @@ -299,12 +297,14 @@ void gst_colorspace_YV12_to_bgr16_mmx(GstColorspace *space, unsigned char *src, */ static int -number_of_bits_set(a) -unsigned long a; +number_of_bits_set (a) + unsigned long a; { - if(!a) return 0; - if(a & 1) return 1 + number_of_bits_set(a >> 1); - return(number_of_bits_set(a >> 1)); + if (!a) + return 0; + if (a & 1) + return 1 + number_of_bits_set (a >> 1); + return (number_of_bits_set (a >> 1)); } /* @@ -312,14 +312,16 @@ unsigned long a; * Low performance, do not call often. */ static int -free_bits_at_top(a) -unsigned long a; +free_bits_at_top (a) + unsigned long a; { - /* assume char is 8 bits */ - if(!a) return sizeof(unsigned long) * 8; - /* assume twos complement */ - if(((long)a) < 0l) return 0; - return 1 + free_bits_at_top ( a << 1); + /* assume char is 8 bits */ + if (!a) + return sizeof (unsigned long) * 8; + /* assume twos complement */ + if (((long) a) < 0l) + return 0; + return 1 + free_bits_at_top (a << 1); } /* @@ -327,13 +329,15 @@ unsigned long a; * Low performance, do not call often. */ static int -free_bits_at_bottom(a) -unsigned long a; +free_bits_at_bottom (a) + unsigned long a; { - /* assume char is 8 bits */ - if(!a) return sizeof(unsigned long) * 8; - if(((long)a) & 1l) return 0; - return 1 + free_bits_at_bottom ( a >> 1); + /* assume char is 8 bits */ + if (!a) + return sizeof (unsigned long) * 8; + if (((long) a) & 1l) + return 0; + return 1 + free_bits_at_bottom (a >> 1); } /* @@ -354,367 +358,359 @@ unsigned long a; */ void -gst_colorspace_table_init (GstColorspace *space) +gst_colorspace_table_init (GstColorspace * space) { int i; - for (i=0; i<256; i++) { - V_r_tab[i] = (0.419/0.299) * (i-128); - V_g_tab[i] = -(0.299/0.419) * (i-128); - U_g_tab[i] = -(0.114/0.331) * (i-128); - U_b_tab[i] = (0.587/0.331) * (i-128); + for (i = 0; i < 256; i++) { + V_r_tab[i] = (0.419 / 0.299) * (i - 128); + V_g_tab[i] = -(0.299 / 0.419) * (i - 128); + U_g_tab[i] = -(0.114 / 0.331) * (i - 128); + U_b_tab[i] = (0.587 / 0.331) * (i - 128); } #if 0 - int CR, CB, i; - int *L_tab, *Cr_r_tab, *Cr_g_tab, *Cb_g_tab, *Cb_b_tab; - long *r_2_pix_alloc; - long *g_2_pix_alloc; - long *b_2_pix_alloc; - long depth = 32; - long red_mask = 0xff0000; - long green_mask = 0x00ff00; - long blue_mask = 0x0000ff; - - L_tab = space->L_tab = (int *)malloc(256*sizeof(int)); - Cr_r_tab = space->Cr_r_tab = (int *)malloc(256*sizeof(int)); - Cr_g_tab = space->Cr_g_tab = (int *)malloc(256*sizeof(int)); - Cb_g_tab = space->Cb_g_tab = (int *)malloc(256*sizeof(int)); - Cb_b_tab = space->Cb_b_tab = (int *)malloc(256*sizeof(int)); - - r_2_pix_alloc = (long *)malloc(768*sizeof(long)); - g_2_pix_alloc = (long *)malloc(768*sizeof(long)); - b_2_pix_alloc = (long *)malloc(768*sizeof(long)); - - if (L_tab == NULL || - Cr_r_tab == NULL || - Cr_g_tab == NULL || - Cb_g_tab == NULL || - Cb_b_tab == NULL || - r_2_pix_alloc == NULL || - g_2_pix_alloc == NULL || - b_2_pix_alloc == NULL) { - fprintf(stderr, "Could not get enough memory in InitColorDither\n"); - exit(1); - } + int CR, CB, i; + int *L_tab, *Cr_r_tab, *Cr_g_tab, *Cb_g_tab, *Cb_b_tab; + long *r_2_pix_alloc; + long *g_2_pix_alloc; + long *b_2_pix_alloc; + long depth = 32; + long red_mask = 0xff0000; + long green_mask = 0x00ff00; + long blue_mask = 0x0000ff; + + L_tab = space->L_tab = (int *) malloc (256 * sizeof (int)); + Cr_r_tab = space->Cr_r_tab = (int *) malloc (256 * sizeof (int)); + Cr_g_tab = space->Cr_g_tab = (int *) malloc (256 * sizeof (int)); + Cb_g_tab = space->Cb_g_tab = (int *) malloc (256 * sizeof (int)); + Cb_b_tab = space->Cb_b_tab = (int *) malloc (256 * sizeof (int)); + + r_2_pix_alloc = (long *) malloc (768 * sizeof (long)); + g_2_pix_alloc = (long *) malloc (768 * sizeof (long)); + b_2_pix_alloc = (long *) malloc (768 * sizeof (long)); + + if (L_tab == NULL || + Cr_r_tab == NULL || + Cr_g_tab == NULL || + Cb_g_tab == NULL || + Cb_b_tab == NULL || + r_2_pix_alloc == NULL || g_2_pix_alloc == NULL || b_2_pix_alloc == NULL) { + fprintf (stderr, "Could not get enough memory in InitColorDither\n"); + exit (1); + } - for (i=0; i<256; i++) { - L_tab[i] = i; - /* - if (gammaCorrectFlag) { - L_tab[i] = GAMMA_CORRECTION(i); - } - */ - - CB = CR = i; - /* - if (chromaCorrectFlag) { - CB -= 128; - CB = CHROMA_CORRECTION128(CB); - CR -= 128; - CR = CHROMA_CORRECTION128(CR); - } - else - */ - { - CB -= 128; CR -= 128; - } - Cr_r_tab[i] = (0.419/0.299) * CR; - Cr_g_tab[i] = -(0.299/0.419) * CR; - Cb_g_tab[i] = -(0.114/0.331) * CB; - Cb_b_tab[i] = (0.587/0.331) * CB; + for (i = 0; i < 256; i++) { + L_tab[i] = i; + /* + if (gammaCorrectFlag) { + L_tab[i] = GAMMA_CORRECTION(i); + } + */ + CB = CR = i; + /* + if (chromaCorrectFlag) { + CB -= 128; + CB = CHROMA_CORRECTION128(CB); + CR -= 128; + CR = CHROMA_CORRECTION128(CR); + } + else + */ + { + CB -= 128; + CR -= 128; } + Cr_r_tab[i] = (0.419 / 0.299) * CR; + Cr_g_tab[i] = -(0.299 / 0.419) * CR; + Cb_g_tab[i] = -(0.114 / 0.331) * CB; + Cb_b_tab[i] = (0.587 / 0.331) * CB; - /* - * Set up entries 0-255 in rgb-to-pixel value tables. + } + + /* + * Set up entries 0-255 in rgb-to-pixel value tables. + */ + for (i = 0; i < 256; i++) { + r_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set (red_mask)); + r_2_pix_alloc[i + 256] <<= free_bits_at_bottom (red_mask); + g_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set (green_mask)); + g_2_pix_alloc[i + 256] <<= free_bits_at_bottom (green_mask); + b_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set (blue_mask)); + b_2_pix_alloc[i + 256] <<= free_bits_at_bottom (blue_mask); + /* + * If we have 16-bit output depth, then we double the value + * in the top word. This means that we can write out both + * pixels in the pixel doubling mode with one op. It is + * harmless in the normal case as storing a 32-bit value + * through a short pointer will lose the top bits anyway. + * A similar optimisation for Alpha for 64 bit has been + * prepared for, but is not yet implemented. */ - for (i = 0; i < 256; i++) { - r_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(red_mask)); - r_2_pix_alloc[i + 256] <<= free_bits_at_bottom(red_mask); - g_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(green_mask)); - g_2_pix_alloc[i + 256] <<= free_bits_at_bottom(green_mask); - b_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set(blue_mask)); - b_2_pix_alloc[i + 256] <<= free_bits_at_bottom(blue_mask); - /* - * If we have 16-bit output depth, then we double the value - * in the top word. This means that we can write out both - * pixels in the pixel doubling mode with one op. It is - * harmless in the normal case as storing a 32-bit value - * through a short pointer will lose the top bits anyway. - * A similar optimisation for Alpha for 64 bit has been - * prepared for, but is not yet implemented. - */ - if(!(depth == 32) && !(depth == 24)) { - - r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 16; - g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 16; - b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 16; - - } -#ifdef SIXTYFOUR_BIT - if(depth == 32) { + if (!(depth == 32) && !(depth == 24)) { - r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 32; - g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 32; - b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 32; + r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 16; + g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 16; + b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 16; - } -#endif } +#ifdef SIXTYFOUR_BIT + if (depth == 32) { + + r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 32; + g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 32; + b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 32; - /* - * Spread out the values we have to the rest of the array so that - * we do not need to check for overflow. - */ - for (i = 0; i < 256; i++) { - r_2_pix_alloc[i] = r_2_pix_alloc[256]; - r_2_pix_alloc[i+ 512] = r_2_pix_alloc[511]; - g_2_pix_alloc[i] = g_2_pix_alloc[256]; - g_2_pix_alloc[i+ 512] = g_2_pix_alloc[511]; - b_2_pix_alloc[i] = b_2_pix_alloc[256]; - b_2_pix_alloc[i+ 512] = b_2_pix_alloc[511]; } +#endif + } + + /* + * Spread out the values we have to the rest of the array so that + * we do not need to check for overflow. + */ + for (i = 0; i < 256; i++) { + r_2_pix_alloc[i] = r_2_pix_alloc[256]; + r_2_pix_alloc[i + 512] = r_2_pix_alloc[511]; + g_2_pix_alloc[i] = g_2_pix_alloc[256]; + g_2_pix_alloc[i + 512] = g_2_pix_alloc[511]; + b_2_pix_alloc[i] = b_2_pix_alloc[256]; + b_2_pix_alloc[i + 512] = b_2_pix_alloc[511]; + } - space->r_2_pix = r_2_pix_alloc + 256; - space->g_2_pix = g_2_pix_alloc + 256; - space->b_2_pix = b_2_pix_alloc + 256; + space->r_2_pix = r_2_pix_alloc + 256; + space->g_2_pix = g_2_pix_alloc + 256; + space->b_2_pix = b_2_pix_alloc + 256; #endif } static void -gst_colorspace_yuv_to_rgb32(GstColorspace *space, - unsigned char *dest, - unsigned char *Y, - unsigned char *U, - unsigned char *V, - int width, int height) +gst_colorspace_yuv_to_rgb32 (GstColorspace * space, + unsigned char *dest, + unsigned char *Y, unsigned char *U, unsigned char *V, int width, int height) { - int x,y; + int x, y; int src_rowstride; int dest_rowstride; src_rowstride = ROUND_UP_4 (space->width); dest_rowstride = width * 4; - for(y=0;ywidth); dest_rowstride = ROUND_UP_4 (width * 3); - for(y=0;ywidth); dest_rowstride = ROUND_UP_4 (width * 2); - for(y=0;y>3); + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + r = CLAMP (Y[x] + V_r_tab[V[x / 2]], 0, 255); + g = CLAMP (Y[x] + U_g_tab[U[x / 2]] + V_g_tab[V[x / 2]], 0, 255); + b = CLAMP (Y[x] + U_b_tab[U[x / 2]], 0, 255); + *(unsigned short *) (dest + x * 2) = + ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3); } Y += src_rowstride; dest += dest_rowstride; - if (y&1) { - U += src_rowstride/2; - V += src_rowstride/2; + if (y & 1) { + U += src_rowstride / 2; + V += src_rowstride / 2; } } } #ifdef HAVE_LIBMMX -static mmx_t MMX_80w = (mmx_t)(long long)0x0080008000800080LL; /*dd 00080 0080h, 000800080h */ +static mmx_t MMX_80w = (mmx_t) (long long) 0x0080008000800080LL; /*dd 00080 0080h, 000800080h */ -static mmx_t MMX_00FFw = (mmx_t)(long long)0x00ff00ff00ff00ffLL; /*dd 000FF 00FFh, 000FF00FFh */ -static mmx_t MMX_FF00w = (mmx_t)(long long)0xff00ff00ff00ff00LL; /*dd 000FF 00FFh, 000FF00FFh */ +static mmx_t MMX_00FFw = (mmx_t) (long long) 0x00ff00ff00ff00ffLL; /*dd 000FF 00FFh, 000FF00FFh */ +static mmx_t MMX_FF00w = (mmx_t) (long long) 0xff00ff00ff00ff00LL; /*dd 000FF 00FFh, 000FF00FFh */ -static mmx_t MMX32_Vredcoeff = (mmx_t)(long long)0x0059005900590059LL; -static mmx_t MMX32_Ubluecoeff = (mmx_t)(long long)0x0072007200720072LL; -static mmx_t MMX32_Ugrncoeff = (mmx_t)(long long)0xffeaffeaffeaffeaLL; -static mmx_t MMX32_Vgrncoeff = (mmx_t)(long long)0xffd2ffd2ffd2ffd2LL; +static mmx_t MMX32_Vredcoeff = (mmx_t) (long long) 0x0059005900590059LL; +static mmx_t MMX32_Ubluecoeff = (mmx_t) (long long) 0x0072007200720072LL; +static mmx_t MMX32_Ugrncoeff = (mmx_t) (long long) 0xffeaffeaffeaffeaLL; +static mmx_t MMX32_Vgrncoeff = (mmx_t) (long long) 0xffd2ffd2ffd2ffd2LL; static void -gst_colorspace_yuv_to_bgr32_mmx(tables, lum, cr, cb, out, rows, cols) - GstColorspaceYUVTables *tables; - unsigned char *lum; - unsigned char *cr; - unsigned char *cb; - unsigned char *out; - int cols, rows; +gst_colorspace_yuv_to_bgr32_mmx (tables, lum, cr, cb, out, rows, cols) + GstColorspaceYUVTables *tables; + unsigned char *lum; + unsigned char *cr; + unsigned char *cb; + unsigned char *out; + int cols, rows; { - guint32 *row1 = (guint32 *)out; /* 32 bit target */ - int cols4 = cols>>2; - - int y, x; - - for (y=rows>>1; y; y--) { - for (x=cols4; x; x--) { - - /* create Cr (result in mm1) */ - movd_m2r(*(mmx_t *)cb, mm1); /* 0 0 0 0 v3 v2 v1 v0 */ - pxor_r2r(mm7, mm7); /* 00 00 00 00 00 00 00 00 */ - movd_m2r(*(mmx_t *)lum, mm2); /* 0 0 0 0 l3 l2 l1 l0 */ - punpcklbw_r2r(mm7, mm1); /* 0 v3 0 v2 00 v1 00 v0 */ - punpckldq_r2r(mm1, mm1); /* 00 v1 00 v0 00 v1 00 v0 */ - psubw_m2r(MMX_80w, mm1); /* mm1-128:r1 r1 r0 r0 r1 r1 r0 r0 */ - - /* create Cr_g (result in mm0) */ - movq_r2r(mm1, mm0); /* r1 r1 r0 r0 r1 r1 r0 r0 */ - pmullw_m2r(MMX32_Vgrncoeff, mm0); /* red*-46dec=0.7136*64 */ - pmullw_m2r(MMX32_Vredcoeff, mm1); /* red*89dec=1.4013*64 */ - psraw_i2r(6, mm0); /* red=red/64 */ - psraw_i2r(6, mm1); /* red=red/64 */ - - /* create L1 L2 (result in mm2,mm4) */ - /* L2=lum+cols */ - movq_m2r(*(mmx_t *)(lum+cols),mm3); /* 0 0 0 0 L3 L2 L1 L0 */ - punpckldq_r2r(mm3, mm2); /* L3 L2 L1 L0 l3 l2 l1 l0 */ - movq_r2r(mm2, mm4); /* L3 L2 L1 L0 l3 l2 l1 l0 */ - pand_m2r(MMX_FF00w, mm2); /* L3 0 L1 0 l3 0 l1 0 */ - pand_m2r(MMX_00FFw, mm4); /* 0 L2 0 L0 0 l2 0 l0 */ - psrlw_i2r(8, mm2); /* 0 L3 0 L1 0 l3 0 l1 */ - - /* create R (result in mm6) */ - movq_r2r(mm2, mm5); /* 0 L3 0 L1 0 l3 0 l1 */ - movq_r2r(mm4, mm6); /* 0 L2 0 L0 0 l2 0 l0 */ - paddsw_r2r(mm1, mm5); /* lum1+red:x R3 x R1 x r3 x r1 */ - paddsw_r2r(mm1, mm6); /* lum1+red:x R2 x R0 x r2 x r0 */ - packuswb_r2r(mm5, mm5); /* R3 R1 r3 r1 R3 R1 r3 r1 */ - packuswb_r2r(mm6, mm6); /* R2 R0 r2 r0 R2 R0 r2 r0 */ - pxor_r2r(mm7, mm7); /* 00 00 00 00 00 00 00 00 */ - punpcklbw_r2r(mm5, mm6); /* R3 R2 R1 R0 r3 r2 r1 r0 */ - - /* create Cb (result in mm1) */ - movd_m2r(*(mmx_t *)cr, mm1); /* 0 0 0 0 u3 u2 u1 u0 */ - punpcklbw_r2r(mm7, mm1); /* 0 u3 0 u2 00 u1 00 u0 */ - punpckldq_r2r(mm1, mm1); /* 00 u1 00 u0 00 u1 00 u0 */ - psubw_m2r(MMX_80w, mm1); /* mm1-128:u1 u1 u0 u0 u1 u1 u0 u0 */ - /* create Cb_g (result in mm5) */ - movq_r2r(mm1, mm5); /* u1 u1 u0 u0 u1 u1 u0 u0 */ - pmullw_m2r(MMX32_Ugrncoeff, mm5); /* blue*-109dec=1.7129*64 */ - pmullw_m2r(MMX32_Ubluecoeff, mm1); /* blue*114dec=1.78125*64 */ - psraw_i2r(6, mm5); /* blue=red/64 */ - psraw_i2r(6, mm1); /* blue=blue/64 */ - - /* create G (result in mm7) */ - movq_r2r(mm2, mm3); /* 0 L3 0 L1 0 l3 0 l1 */ - movq_r2r(mm4, mm7); /* 0 L2 0 L0 0 l2 0 l1 */ - paddsw_r2r(mm5, mm3); /* lum1+Cb_g:x G3t x G1t x g3t x g1t */ - paddsw_r2r(mm5, mm7); /* lum1+Cb_g:x G2t x G0t x g2t x g0t */ - paddsw_r2r(mm0, mm3); /* lum1+Cr_g:x G3 x G1 x g3 x g1 */ - paddsw_r2r(mm0, mm7); /* lum1+blue:x G2 x G0 x g2 x g0 */ - packuswb_r2r(mm3, mm3); /* G3 G1 g3 g1 G3 G1 g3 g1 */ - packuswb_r2r(mm7, mm7); /* G2 G0 g2 g0 G2 G0 g2 g0 */ - punpcklbw_r2r(mm3, mm7); /* G3 G2 G1 G0 g3 g2 g1 g0 */ - - /* create B (result in mm5) */ - movq_r2r(mm2, mm3); /* 0 L3 0 L1 0 l3 0 l1 */ - movq_r2r(mm4, mm5); /* 0 L2 0 L0 0 l2 0 l1 */ - paddsw_r2r(mm1, mm3); /* lum1+blue:x B3 x B1 x b3 x b1 */ - paddsw_r2r(mm1, mm5); /* lum1+blue:x B2 x B0 x b2 x b0 */ - packuswb_r2r(mm3, mm3); /* B3 B1 b3 b1 B3 B1 b3 b1 */ - packuswb_r2r(mm5, mm5); /* B2 B0 b2 b0 B2 B0 b2 b0 */ - punpcklbw_r2r(mm3, mm5); /* B3 B2 B1 B0 b3 b2 b1 b0 */ - - /* fill destination row1 (needed are mm6=Rr,mm7=Gg,mm5=Bb) */ - - pxor_r2r(mm2, mm2); /* 0 0 0 0 0 0 0 0 */ - pxor_r2r(mm4, mm4); /* 0 0 0 0 0 0 0 0 */ - movq_r2r(mm6, mm1); /* R3 R2 R1 R0 r3 r2 r1 r0 */ - movq_r2r(mm5, mm3); /* B3 B2 B1 B0 b3 b2 b1 b0 */ - /* process lower lum */ - punpcklbw_r2r(mm4, mm1); /* 0 r3 0 r2 0 r1 0 r0 */ - punpcklbw_r2r(mm4, mm3); /* 0 b3 0 b2 0 b1 0 b0 */ - movq_r2r(mm1, mm2); /* 0 r3 0 r2 0 r1 0 r0 */ - movq_r2r(mm3, mm0); /* 0 b3 0 b2 0 b1 0 b0 */ - punpcklwd_r2r(mm1, mm3); /* 0 r1 0 b1 0 r0 0 b0 */ - punpckhwd_r2r(mm2, mm0); /* 0 r3 0 b3 0 r2 0 b2 */ - - pxor_r2r(mm2, mm2); /* 0 0 0 0 0 0 0 0 */ - movq_r2r(mm7, mm1); /* G3 G2 G1 G0 g3 g2 g1 g0 */ - punpcklbw_r2r(mm1, mm2); /* g3 0 g2 0 g1 0 g0 0 */ - punpcklwd_r2r(mm4, mm2); /* 0 0 g1 0 0 0 g0 0 */ - por_r2r(mm3, mm2); /* 0 r1 g1 b1 0 r0 g0 b0 */ - movq_r2m(mm2, *(mmx_t *)row1); /* wrote out ! row1 */ - - pxor_r2r(mm2, mm2); /* 0 0 0 0 0 0 0 0 */ - punpcklbw_r2r(mm1, mm4); /* g3 0 g2 0 g1 0 g0 0 */ - punpckhwd_r2r(mm2, mm4); /* 0 0 g3 0 0 0 g2 0 */ - por_r2r(mm0, mm4); /* 0 r3 g3 b3 0 r2 g2 b2 */ - movq_r2m(mm4, *(mmx_t *)(row1+2)); /* wrote out ! row1 */ - - /* fill destination row2 (needed are mm6=Rr,mm7=Gg,mm5=Bb) */ - /* this can be done "destructive" */ - pxor_r2r(mm2, mm2); /* 0 0 0 0 0 0 0 0 */ - punpckhbw_r2r(mm2, mm6); /* 0 R3 0 R2 0 R1 0 R0 */ - punpckhbw_r2r(mm1, mm5); /* G3 B3 G2 B2 G1 B1 G0 B0 */ - movq_r2r(mm5, mm1); /* G3 B3 G2 B2 G1 B1 G0 B0 */ - punpcklwd_r2r(mm6, mm1); /* 0 R1 G1 B1 0 R0 G0 B0 */ - movq_r2m(mm1, *(mmx_t *)(row1+cols)); /* wrote out ! row2 */ - punpckhwd_r2r(mm6, mm5); /* 0 R3 G3 B3 0 R2 G2 B2 */ - movq_r2m(mm5, *(mmx_t *)(row1+cols+2)); /* wrote out ! row2 */ - - lum+=4; - cr+=2; - cb+=2; - row1 +=4; - } - lum += cols; - row1 += cols; + guint32 *row1 = (guint32 *) out; /* 32 bit target */ + int cols4 = cols >> 2; + + int y, x; + + for (y = rows >> 1; y; y--) { + for (x = cols4; x; x--) { + + /* create Cr (result in mm1) */ + movd_m2r (*(mmx_t *) cb, mm1); /* 0 0 0 0 v3 v2 v1 v0 */ + pxor_r2r (mm7, mm7); /* 00 00 00 00 00 00 00 00 */ + movd_m2r (*(mmx_t *) lum, mm2); /* 0 0 0 0 l3 l2 l1 l0 */ + punpcklbw_r2r (mm7, mm1); /* 0 v3 0 v2 00 v1 00 v0 */ + punpckldq_r2r (mm1, mm1); /* 00 v1 00 v0 00 v1 00 v0 */ + psubw_m2r (MMX_80w, mm1); /* mm1-128:r1 r1 r0 r0 r1 r1 r0 r0 */ + + /* create Cr_g (result in mm0) */ + movq_r2r (mm1, mm0); /* r1 r1 r0 r0 r1 r1 r0 r0 */ + pmullw_m2r (MMX32_Vgrncoeff, mm0); /* red*-46dec=0.7136*64 */ + pmullw_m2r (MMX32_Vredcoeff, mm1); /* red*89dec=1.4013*64 */ + psraw_i2r (6, mm0); /* red=red/64 */ + psraw_i2r (6, mm1); /* red=red/64 */ + + /* create L1 L2 (result in mm2,mm4) */ + /* L2=lum+cols */ + movq_m2r (*(mmx_t *) (lum + cols), mm3); /* 0 0 0 0 L3 L2 L1 L0 */ + punpckldq_r2r (mm3, mm2); /* L3 L2 L1 L0 l3 l2 l1 l0 */ + movq_r2r (mm2, mm4); /* L3 L2 L1 L0 l3 l2 l1 l0 */ + pand_m2r (MMX_FF00w, mm2); /* L3 0 L1 0 l3 0 l1 0 */ + pand_m2r (MMX_00FFw, mm4); /* 0 L2 0 L0 0 l2 0 l0 */ + psrlw_i2r (8, mm2); /* 0 L3 0 L1 0 l3 0 l1 */ + + /* create R (result in mm6) */ + movq_r2r (mm2, mm5); /* 0 L3 0 L1 0 l3 0 l1 */ + movq_r2r (mm4, mm6); /* 0 L2 0 L0 0 l2 0 l0 */ + paddsw_r2r (mm1, mm5); /* lum1+red:x R3 x R1 x r3 x r1 */ + paddsw_r2r (mm1, mm6); /* lum1+red:x R2 x R0 x r2 x r0 */ + packuswb_r2r (mm5, mm5); /* R3 R1 r3 r1 R3 R1 r3 r1 */ + packuswb_r2r (mm6, mm6); /* R2 R0 r2 r0 R2 R0 r2 r0 */ + pxor_r2r (mm7, mm7); /* 00 00 00 00 00 00 00 00 */ + punpcklbw_r2r (mm5, mm6); /* R3 R2 R1 R0 r3 r2 r1 r0 */ + + /* create Cb (result in mm1) */ + movd_m2r (*(mmx_t *) cr, mm1); /* 0 0 0 0 u3 u2 u1 u0 */ + punpcklbw_r2r (mm7, mm1); /* 0 u3 0 u2 00 u1 00 u0 */ + punpckldq_r2r (mm1, mm1); /* 00 u1 00 u0 00 u1 00 u0 */ + psubw_m2r (MMX_80w, mm1); /* mm1-128:u1 u1 u0 u0 u1 u1 u0 u0 */ + /* create Cb_g (result in mm5) */ + movq_r2r (mm1, mm5); /* u1 u1 u0 u0 u1 u1 u0 u0 */ + pmullw_m2r (MMX32_Ugrncoeff, mm5); /* blue*-109dec=1.7129*64 */ + pmullw_m2r (MMX32_Ubluecoeff, mm1); /* blue*114dec=1.78125*64 */ + psraw_i2r (6, mm5); /* blue=red/64 */ + psraw_i2r (6, mm1); /* blue=blue/64 */ + + /* create G (result in mm7) */ + movq_r2r (mm2, mm3); /* 0 L3 0 L1 0 l3 0 l1 */ + movq_r2r (mm4, mm7); /* 0 L2 0 L0 0 l2 0 l1 */ + paddsw_r2r (mm5, mm3); /* lum1+Cb_g:x G3t x G1t x g3t x g1t */ + paddsw_r2r (mm5, mm7); /* lum1+Cb_g:x G2t x G0t x g2t x g0t */ + paddsw_r2r (mm0, mm3); /* lum1+Cr_g:x G3 x G1 x g3 x g1 */ + paddsw_r2r (mm0, mm7); /* lum1+blue:x G2 x G0 x g2 x g0 */ + packuswb_r2r (mm3, mm3); /* G3 G1 g3 g1 G3 G1 g3 g1 */ + packuswb_r2r (mm7, mm7); /* G2 G0 g2 g0 G2 G0 g2 g0 */ + punpcklbw_r2r (mm3, mm7); /* G3 G2 G1 G0 g3 g2 g1 g0 */ + + /* create B (result in mm5) */ + movq_r2r (mm2, mm3); /* 0 L3 0 L1 0 l3 0 l1 */ + movq_r2r (mm4, mm5); /* 0 L2 0 L0 0 l2 0 l1 */ + paddsw_r2r (mm1, mm3); /* lum1+blue:x B3 x B1 x b3 x b1 */ + paddsw_r2r (mm1, mm5); /* lum1+blue:x B2 x B0 x b2 x b0 */ + packuswb_r2r (mm3, mm3); /* B3 B1 b3 b1 B3 B1 b3 b1 */ + packuswb_r2r (mm5, mm5); /* B2 B0 b2 b0 B2 B0 b2 b0 */ + punpcklbw_r2r (mm3, mm5); /* B3 B2 B1 B0 b3 b2 b1 b0 */ + + /* fill destination row1 (needed are mm6=Rr,mm7=Gg,mm5=Bb) */ + + pxor_r2r (mm2, mm2); /* 0 0 0 0 0 0 0 0 */ + pxor_r2r (mm4, mm4); /* 0 0 0 0 0 0 0 0 */ + movq_r2r (mm6, mm1); /* R3 R2 R1 R0 r3 r2 r1 r0 */ + movq_r2r (mm5, mm3); /* B3 B2 B1 B0 b3 b2 b1 b0 */ + /* process lower lum */ + punpcklbw_r2r (mm4, mm1); /* 0 r3 0 r2 0 r1 0 r0 */ + punpcklbw_r2r (mm4, mm3); /* 0 b3 0 b2 0 b1 0 b0 */ + movq_r2r (mm1, mm2); /* 0 r3 0 r2 0 r1 0 r0 */ + movq_r2r (mm3, mm0); /* 0 b3 0 b2 0 b1 0 b0 */ + punpcklwd_r2r (mm1, mm3); /* 0 r1 0 b1 0 r0 0 b0 */ + punpckhwd_r2r (mm2, mm0); /* 0 r3 0 b3 0 r2 0 b2 */ + + pxor_r2r (mm2, mm2); /* 0 0 0 0 0 0 0 0 */ + movq_r2r (mm7, mm1); /* G3 G2 G1 G0 g3 g2 g1 g0 */ + punpcklbw_r2r (mm1, mm2); /* g3 0 g2 0 g1 0 g0 0 */ + punpcklwd_r2r (mm4, mm2); /* 0 0 g1 0 0 0 g0 0 */ + por_r2r (mm3, mm2); /* 0 r1 g1 b1 0 r0 g0 b0 */ + movq_r2m (mm2, *(mmx_t *) row1); /* wrote out ! row1 */ + + pxor_r2r (mm2, mm2); /* 0 0 0 0 0 0 0 0 */ + punpcklbw_r2r (mm1, mm4); /* g3 0 g2 0 g1 0 g0 0 */ + punpckhwd_r2r (mm2, mm4); /* 0 0 g3 0 0 0 g2 0 */ + por_r2r (mm0, mm4); /* 0 r3 g3 b3 0 r2 g2 b2 */ + movq_r2m (mm4, *(mmx_t *) (row1 + 2)); /* wrote out ! row1 */ + + /* fill destination row2 (needed are mm6=Rr,mm7=Gg,mm5=Bb) */ + /* this can be done "destructive" */ + pxor_r2r (mm2, mm2); /* 0 0 0 0 0 0 0 0 */ + punpckhbw_r2r (mm2, mm6); /* 0 R3 0 R2 0 R1 0 R0 */ + punpckhbw_r2r (mm1, mm5); /* G3 B3 G2 B2 G1 B1 G0 B0 */ + movq_r2r (mm5, mm1); /* G3 B3 G2 B2 G1 B1 G0 B0 */ + punpcklwd_r2r (mm6, mm1); /* 0 R1 G1 B1 0 R0 G0 B0 */ + movq_r2m (mm1, *(mmx_t *) (row1 + cols)); /* wrote out ! row2 */ + punpckhwd_r2r (mm6, mm5); /* 0 R3 G3 B3 0 R2 G2 B2 */ + movq_r2m (mm5, *(mmx_t *) (row1 + cols + 2)); /* wrote out ! row2 */ + + lum += 4; + cr += 2; + cb += 2; + row1 += 4; } + lum += cols; + row1 += cols; + } - emms(); + emms (); } #endif - diff --git a/gst/colorspace/yuv2rgb.h b/gst/colorspace/yuv2rgb.h index be173bca..ec987dfc 100644 --- a/gst/colorspace/yuv2rgb.h +++ b/gst/colorspace/yuv2rgb.h @@ -26,11 +26,11 @@ #include G_BEGIN_DECLS - #if 0 typedef struct _GstColorspaceYUVTables GstColorspaceYUVTables; -struct _GstColorspaceYUVTables { +struct _GstColorspaceYUVTables +{ int gammaCorrectFlag; double gammaCorrect; int chromaCorrectFlag; @@ -50,9 +50,11 @@ struct _GstColorspaceYUVTables { typedef struct _GstColorspaceConverter GstColorspaceConverter; -typedef void (*GstColorspaceConvertFunction) (GstColorspaceConverter *space, guchar *src, guchar *dest); +typedef void (*GstColorspaceConvertFunction) (GstColorspaceConverter * space, + guchar * src, guchar * dest); -struct _GstColorspaceConverter { +struct _GstColorspaceConverter +{ guint width; guint height; guint insize; @@ -63,35 +65,34 @@ struct _GstColorspaceConverter { }; #endif -void gst_colorspace_table_init (GstColorspace *space); +void gst_colorspace_table_init (GstColorspace * space); -void gst_colorspace_I420_to_rgb32(GstColorspace *space, +void gst_colorspace_I420_to_rgb32 (GstColorspace * space, unsigned char *src, unsigned char *dest); -void gst_colorspace_I420_to_rgb24(GstColorspace *space, +void gst_colorspace_I420_to_rgb24 (GstColorspace * space, unsigned char *src, unsigned char *dest); -void gst_colorspace_I420_to_rgb16(GstColorspace *space, +void gst_colorspace_I420_to_rgb16 (GstColorspace * space, unsigned char *src, unsigned char *dest); -void gst_colorspace_YV12_to_rgb32(GstColorspace *space, +void gst_colorspace_YV12_to_rgb32 (GstColorspace * space, unsigned char *src, unsigned char *dest); -void gst_colorspace_YV12_to_rgb24(GstColorspace *space, +void gst_colorspace_YV12_to_rgb24 (GstColorspace * space, unsigned char *src, unsigned char *dest); -void gst_colorspace_YV12_to_rgb16(GstColorspace *space, +void gst_colorspace_YV12_to_rgb16 (GstColorspace * space, unsigned char *src, unsigned char *dest); #if 0 -GstColorspaceYUVTables * gst_colorspace_init_yuv(long depth, +GstColorspaceYUVTables *gst_colorspace_init_yuv (long depth, long red_mask, long green_mask, long blue_mask); #endif #if 0 -GstColorspaceConverter* gst_colorspace_yuv2rgb_get_converter (const GstCaps *from, const GstCaps *to); +GstColorspaceConverter *gst_colorspace_yuv2rgb_get_converter (const GstCaps * + from, const GstCaps * to); #define gst_colorspace_convert(converter, src, dest) \ (converter)->convert((converter), (src), (dest)) -void gst_colorspace_converter_destroy (GstColorspaceConverter *space); +void gst_colorspace_converter_destroy (GstColorspaceConverter * space); #endif G_END_DECLS - #endif - diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c index 31cc7a9d..8b174e39 100644 --- a/gst/deinterlace/gstdeinterlace.c +++ b/gst/deinterlace/gstdeinterlace.c @@ -28,21 +28,22 @@ #include "gstdeinterlace.h" /* elementfactory information */ -static GstElementDetails deinterlace_details = GST_ELEMENT_DETAILS ( - "Deinterlace", - "Filter/Effect/Video", - "Deinterlace video", - "Wim Taymans " -); +static GstElementDetails deinterlace_details = +GST_ELEMENT_DETAILS ("Deinterlace", + "Filter/Effect/Video", + "Deinterlace video", + "Wim Taymans "); /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_DI_ONLY, ARG_BLEND, @@ -51,108 +52,102 @@ enum { }; static GstStaticPadTemplate deinterlace_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate deinterlace_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); -static GType gst_deinterlace_get_type (void); +static GType gst_deinterlace_get_type (void); -static void gst_deinterlace_base_init (gpointer g_class); -static void gst_deinterlace_class_init (GstDeInterlaceClass *klass); -static void gst_deinterlace_init (GstDeInterlace *filter); +static void gst_deinterlace_base_init (gpointer g_class); +static void gst_deinterlace_class_init (GstDeInterlaceClass * klass); +static void gst_deinterlace_init (GstDeInterlace * filter); -static void gst_deinterlace_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_deinterlace_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_deinterlace_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_deinterlace_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_deinterlace_chain (GstPad *pad, GstData *_data); +static void gst_deinterlace_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; */ static GType -gst_deinterlace_get_type(void) { +gst_deinterlace_get_type (void) +{ static GType deinterlace_type = 0; if (!deinterlace_type) { static const GTypeInfo deinterlace_info = { - sizeof(GstDeInterlaceClass), + sizeof (GstDeInterlaceClass), gst_deinterlace_base_init, NULL, - (GClassInitFunc)gst_deinterlace_class_init, + (GClassInitFunc) gst_deinterlace_class_init, NULL, NULL, - sizeof(GstDeInterlace), + sizeof (GstDeInterlace), 0, - (GInstanceInitFunc)gst_deinterlace_init, + (GInstanceInitFunc) gst_deinterlace_init, }; - deinterlace_type = g_type_register_static(GST_TYPE_ELEMENT, "GstDeInterlace", &deinterlace_info, 0); + deinterlace_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstDeInterlace", + &deinterlace_info, 0); } return deinterlace_type; } static void gst_deinterlace_base_init (gpointer g_class) -{ +{ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&deinterlace_src_factory)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&deinterlace_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&deinterlace_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&deinterlace_sink_factory)); gst_element_class_set_details (element_class, &deinterlace_details); } static void -gst_deinterlace_class_init (GstDeInterlaceClass *klass) +gst_deinterlace_class_init (GstDeInterlaceClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DI_ONLY, - g_param_spec_boolean("di_area_only","di_area_only","di_area_only", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BLEND, - g_param_spec_boolean("blend","blend","blend", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_THRESHOLD, - g_param_spec_int("threshold","threshold","threshold", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_EDGE_DETECT, - g_param_spec_int("edge_detect","edge_detect","edge_detect", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DI_ONLY, g_param_spec_boolean ("di_area_only", "di_area_only", "di_area_only", TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BLEND, g_param_spec_boolean ("blend", "blend", "blend", TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_THRESHOLD, g_param_spec_int ("threshold", "threshold", "threshold", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_EDGE_DETECT, g_param_spec_int ("edge_detect", "edge_detect", "edge_detect", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = gst_deinterlace_set_property; gobject_class->get_property = gst_deinterlace_get_property; } static GstPadLinkReturn -gst_deinterlace_link (GstPad *pad, const GstCaps *caps) +gst_deinterlace_link (GstPad * pad, const GstCaps * caps) { GstDeInterlace *filter; GstStructure *structure; GstPadLinkReturn ret; - filter = GST_DEINTERLACE(gst_pad_get_parent (pad)); - + filter = GST_DEINTERLACE (gst_pad_get_parent (pad)); + ret = gst_pad_try_set_caps (filter->srcpad, caps); if (GST_PAD_LINK_FAILED (ret)) { return ret; @@ -162,29 +157,31 @@ gst_deinterlace_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "width", &filter->width); gst_structure_get_int (structure, "height", &filter->height); - if (filter->picsize != (filter->width*filter->height)) { - if (filter->src) - g_free(filter->src); - filter->picsize = filter->width*filter->height; - filter->src = g_malloc(filter->picsize); + if (filter->picsize != (filter->width * filter->height)) { + if (filter->src) + g_free (filter->src); + filter->picsize = filter->width * filter->height; + filter->src = g_malloc (filter->picsize); } return GST_PAD_LINK_OK; } static void -gst_deinterlace_init (GstDeInterlace *filter) +gst_deinterlace_init (GstDeInterlace * filter) { - filter->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get(&deinterlace_sink_factory),"sink"); - gst_pad_set_chain_function(filter->sinkpad,gst_deinterlace_chain); - gst_pad_set_link_function(filter->sinkpad,gst_deinterlace_link); - gst_element_add_pad(GST_ELEMENT(filter),filter->sinkpad); - - filter->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get(&deinterlace_src_factory),"src"); - gst_pad_set_link_function(filter->srcpad,gst_deinterlace_link); - gst_element_add_pad(GST_ELEMENT(filter),filter->srcpad); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&deinterlace_sink_factory), "sink"); + gst_pad_set_chain_function (filter->sinkpad, gst_deinterlace_chain); + gst_pad_set_link_function (filter->sinkpad, gst_deinterlace_link); + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&deinterlace_src_factory), "src"); + gst_pad_set_link_function (filter->srcpad, gst_deinterlace_link); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->show_deinterlaced_area_only = FALSE; filter->blend = FALSE; @@ -197,7 +194,7 @@ gst_deinterlace_init (GstDeInterlace *filter) } static void -gst_deinterlace_chain (GstPad *pad, GstData *_data) +gst_deinterlace_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstDeInterlace *filter; @@ -228,14 +225,14 @@ gst_deinterlace_chain (GstPad *pad, GstData *_data) yuvptr = GST_BUFFER_DATA (buf); bShowDeinterlacedAreaOnly = filter->show_deinterlaced_area_only; - memcpy(filter->src, yuvptr, filter->picsize); + memcpy (filter->src, yuvptr, filter->picsize); - y_dst = yuvptr; /* dst y pointer */ - /* we should not change u,v because one u, v value stands for */ - /* 2 pixels per 2 lines = 4 pixel and we don't want to change */ - /* the color of */ + y_dst = yuvptr; /* dst y pointer */ + /* we should not change u,v because one u, v value stands for */ + /* 2 pixels per 2 lines = 4 pixel and we don't want to change */ + /* the color of */ - y_line = width; + y_line = width; y_src = src; iThreshold = iThreshold * iThreshold * 4; @@ -244,10 +241,10 @@ gst_deinterlace_chain (GstPad *pad, GstData *_data) iEdgeDetect = 180; iEdgeDetect = iEdgeDetect * iEdgeDetect; - y1 = 0; /* Avoid compiler warning. The value is not used. */ + y1 = 0; /* Avoid compiler warning. The value is not used. */ for (x = 0; x < width; x++) { psrc3 = y_src + x; - y3 = *psrc3; + y3 = *psrc3; psrc2 = psrc3 + y_line; y2 = *psrc2; pdst1 = y_dst + x; @@ -260,48 +257,49 @@ gst_deinterlace_chain (GstPad *pad, GstData *_data) y1 = y2; y2 = y3; if (y < height - 1) { - y3 = *psrc3; + y3 = *psrc3; } else { - y3 = y1; + y3 = y1; } iInterlaceValue0 = iInterlaceValue1; iInterlaceValue1 = iInterlaceValue2; if (y < height) - iInterlaceValue2 = ((y1 - y2) * (y3 - y2) - - ((iEdgeDetect * (y1 - y3) * (y1 - y3)) >> 12))*10; + iInterlaceValue2 = ((y1 - y2) * (y3 - y2) - + ((iEdgeDetect * (y1 - y3) * (y1 - y3)) >> 12)) * 10; else - iInterlaceValue2 = 0; - - if (y > 0) { - if (iInterlaceValue0 + 2 * iInterlaceValue1 + iInterlaceValue2 > iThreshold) { - if (bBlend) { - *pdst1 = (unsigned char)((y0 + 2*y1 + y2) >> 2); - } else { - /* this method seems to work better than blending if the */ - /* quality is pretty bad and the half pics don't fit together */ - if ((y % 2)==1) { /* if odd simply copy the value */ - *pdst1 = *psrc1; - /**pdst1 = 0; // FIXME this is for adjusting an initial iThreshold */ - } else { /* even interpolate the even line (upper + lower)/2 */ - *pdst1 = (unsigned char)((y0 + y2) >> 1); - /**pdst1 = 0; // FIXME this is for adjusting an initial iThreshold */ - } - } - } else { - /* so we went below the treshold and therefore we don't have to */ - /* change anything */ - if (bShowDeinterlacedAreaOnly) { - /* this is for testing to see how we should tune the treshhold */ - /* and shows as the things that haven't change because the */ - /* threshhold was to low?? (or shows that everything is ok :-) */ - *pdst1 = 0; /* blank the point and so the interlac area */ - } else { - *pdst1 = *psrc1; - } - } - pdst1 = pdst1 + y_line; + iInterlaceValue2 = 0; + + if (y > 0) { + if (iInterlaceValue0 + 2 * iInterlaceValue1 + iInterlaceValue2 > + iThreshold) { + if (bBlend) { + *pdst1 = (unsigned char) ((y0 + 2 * y1 + y2) >> 2); + } else { + /* this method seems to work better than blending if the */ + /* quality is pretty bad and the half pics don't fit together */ + if ((y % 2) == 1) { /* if odd simply copy the value */ + *pdst1 = *psrc1; + /**pdst1 = 0; // FIXME this is for adjusting an initial iThreshold */ + } else { /* even interpolate the even line (upper + lower)/2 */ + *pdst1 = (unsigned char) ((y0 + y2) >> 1); + /**pdst1 = 0; // FIXME this is for adjusting an initial iThreshold */ + } + } + } else { + /* so we went below the treshold and therefore we don't have to */ + /* change anything */ + if (bShowDeinterlacedAreaOnly) { + /* this is for testing to see how we should tune the treshhold */ + /* and shows as the things that haven't change because the */ + /* threshhold was to low?? (or shows that everything is ok :-) */ + *pdst1 = 0; /* blank the point and so the interlac area */ + } else { + *pdst1 = *psrc1; + } + } + pdst1 = pdst1 + y_line; } } } @@ -310,17 +308,17 @@ gst_deinterlace_chain (GstPad *pad, GstData *_data) } static void -gst_deinterlace_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_deinterlace_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstDeInterlace *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_DEINTERLACE(object)); + g_return_if_fail (GST_IS_DEINTERLACE (object)); - filter = GST_DEINTERLACE(object); + filter = GST_DEINTERLACE (object); - switch (prop_id) - { + switch (prop_id) { case ARG_DI_ONLY: filter->show_deinterlaced_area_only = g_value_get_boolean (value); break; @@ -339,14 +337,15 @@ gst_deinterlace_set_property (GObject *object, guint prop_id, const GValue *valu } static void -gst_deinterlace_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_deinterlace_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstDeInterlace *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_DEINTERLACE(object)); + g_return_if_fail (GST_IS_DEINTERLACE (object)); - filter = GST_DEINTERLACE(object); + filter = GST_DEINTERLACE (object); switch (prop_id) { case ARG_DI_ONLY: @@ -368,22 +367,16 @@ gst_deinterlace_get_property (GObject *object, guint prop_id, GValue *value, GPa } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "deinterlace", GST_RANK_NONE, gst_deinterlace_get_type())) + if (!gst_element_register (plugin, "deinterlace", GST_RANK_NONE, + gst_deinterlace_get_type ())) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "deinterlace", - "Deinterlace video", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -); +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "deinterlace", + "Deinterlace video", plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN); diff --git a/gst/deinterlace/gstdeinterlace.h b/gst/deinterlace/gstdeinterlace.h index 27207319..13f3d66f 100644 --- a/gst/deinterlace/gstdeinterlace.h +++ b/gst/deinterlace/gstdeinterlace.h @@ -26,7 +26,6 @@ /* #include */ G_BEGIN_DECLS - #define GST_TYPE_DEINTERLACE \ (gst_deinterlace_get_type()) #define GST_DEINTERLACE(obj) \ @@ -37,11 +36,11 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLACE)) #define GST_IS_DEINTERLACE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLACE)) - typedef struct _GstDeInterlace GstDeInterlace; typedef struct _GstDeInterlaceClass GstDeInterlaceClass; -struct _GstDeInterlace { +struct _GstDeInterlace +{ GstElement element; GstPad *sinkpad, *srcpad; @@ -50,8 +49,8 @@ struct _GstDeInterlace { gboolean show_deinterlaced_area_only; gboolean blend; - gint threshold_blend; /* here we start blending */ - gint threshold; /* here we start interpolating TODO FIXME */ + gint threshold_blend; /* here we start blending */ + gint threshold; /* here we start interpolating TODO FIXME */ gint edge_detect; gint picsize; @@ -59,10 +58,10 @@ struct _GstDeInterlace { }; -struct _GstDeInterlaceClass { +struct _GstDeInterlaceClass +{ GstElementClass parent_class; }; G_END_DECLS - #endif /* __GST_DEINTERLACE_H__ */ diff --git a/gst/festival/gstfestival.c b/gst/festival/gstfestival.c index d59a8518..977455bd 100644 --- a/gst/festival/gstfestival.c +++ b/gst/festival/gstfestival.c @@ -77,88 +77,86 @@ #include "gstfestival.h" #include -static void gst_festival_base_init (gpointer g_class); -static void gst_festival_class_init (GstFestivalClass *klass); -static void gst_festival_init (GstFestival *festival); +static void gst_festival_base_init (gpointer g_class); +static void gst_festival_class_init (GstFestivalClass * klass); +static void gst_festival_init (GstFestival * festival); -static void gst_festival_chain (GstPad *pad, GstData *_data); -static GstElementStateReturn - gst_festival_change_state (GstElement *element); +static void gst_festival_chain (GstPad * pad, GstData * _data); +static GstElementStateReturn gst_festival_change_state (GstElement * element); -static FT_Info* festival_default_info (void); -static char* socket_receive_file_to_buff (int fd,int *size); -static char* client_accept_s_expr (int fd); +static FT_Info *festival_default_info (void); +static char *socket_receive_file_to_buff (int fd, int *size); +static char *client_accept_s_expr (int fd); /* elementfactory information */ -static GstElementDetails gst_festival_details = GST_ELEMENT_DETAILS ( - "Festival synthesizer", - "Filter/Effect/Audio", - "Synthesizes plain text into audio", - "Wim Taymans " -); +static GstElementDetails gst_festival_details = +GST_ELEMENT_DETAILS ("Festival synthesizer", + "Filter/Effect/Audio", + "Synthesizes plain text into audio", + "Wim Taymans "); static GstStaticPadTemplate sink_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "festival_sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "text/plain" ) -); +GST_STATIC_PAD_TEMPLATE ("festival_sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/plain") + ); static GstStaticPadTemplate src_template_factory = -GST_STATIC_PAD_TEMPLATE ( - "festival_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " - "signed = (boolean) TRUE, " - "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) 16000, " - "channels = (int) 1" - ) -); +GST_STATIC_PAD_TEMPLATE ("festival_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) BYTE_ORDER, " + "signed = (boolean) TRUE, " + "width = (int) 16, " + "depth = (int) 16, " "rate = (int) 16000, " "channels = (int) 1") + ); /* Festival signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; static GstElementClass *parent_class = NULL; + /*static guint gst_festival_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_festival_get_type (void) +gst_festival_get_type (void) { static GType festival_type = 0; if (!festival_type) { static const GTypeInfo festival_info = { - sizeof(GstFestivalClass), + sizeof (GstFestivalClass), gst_festival_base_init, NULL, (GClassInitFunc) gst_festival_class_init, NULL, NULL, - sizeof(GstFestival), + sizeof (GstFestival), 0, (GInstanceInitFunc) gst_festival_init, }; - festival_type = g_type_register_static (GST_TYPE_ELEMENT, "GstFestival", &festival_info, 0); + festival_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstFestival", &festival_info, + 0); } return festival_type; } static void gst_festival_base_init (gpointer g_class) -{ +{ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); /* register src pads */ @@ -167,38 +165,40 @@ gst_festival_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_template_factory)); - gst_element_class_set_details (element_class, &gst_festival_details); + gst_element_class_set_details (element_class, &gst_festival_details); } static void -gst_festival_class_init (GstFestivalClass *klass) +gst_festival_class_init (GstFestivalClass * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*) klass; + gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_festival_change_state; } -static void -gst_festival_init (GstFestival *festival) +static void +gst_festival_init (GstFestival * festival) { - festival->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_template_factory), "sink"); + festival->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&sink_template_factory), "sink"); gst_pad_set_chain_function (festival->sinkpad, gst_festival_chain); gst_element_add_pad (GST_ELEMENT (festival), festival->sinkpad); - festival->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_template_factory), "src"); + festival->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&src_template_factory), "src"); gst_element_add_pad (GST_ELEMENT (festival), festival->srcpad); - festival->info = festival_default_info(); + festival->info = festival_default_info (); } static void -gst_festival_chain (GstPad *pad, GstData *_data) +gst_festival_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); gchar *wavefile; @@ -218,102 +218,98 @@ gst_festival_chain (GstPad *pad, GstData *_data) festival = GST_FESTIVAL (gst_pad_get_parent (pad)); GST_DEBUG ("gst_festival_chain: got buffer in '%s'", - gst_object_get_name (GST_OBJECT (festival))); + gst_object_get_name (GST_OBJECT (festival))); + + fd = fdopen (dup (festival->info->server_fd), "wb"); - fd = fdopen(dup(festival->info->server_fd),"wb"); - size = GST_BUFFER_SIZE (buf); /* Copy text over to server, escaping any quotes */ - fprintf(fd,"(tts_textall \"\n"); - for (p=GST_BUFFER_DATA(buf); p && (*p != '\0') && size; p++, size--) - { + fprintf (fd, "(tts_textall \"\n"); + for (p = GST_BUFFER_DATA (buf); p && (*p != '\0') && size; p++, size--) { if ((*p == '"') || (*p == '\\')) - putc('\\',fd); - putc(*p,fd); + putc ('\\', fd); + putc (*p, fd); } - fprintf(fd,"\" \"%s\")\n",festival->info->text_mode); - fclose(fd); + fprintf (fd, "\" \"%s\")\n", festival->info->text_mode); + fclose (fd); /* Read back info from server */ /* This assumes only one waveform will come back, also LP is unlikely */ wavefile = NULL; do { - for (n=0; n < 3; ) - n += read(festival->info->server_fd,ack+n,3-n); + for (n = 0; n < 3;) + n += read (festival->info->server_fd, ack + n, 3 - n); ack[3] = '\0'; - if (strcmp(ack,"WV\n") == 0) /* receive a waveform */ - wavefile = socket_receive_file_to_buff (festival->info->server_fd, &filesize); - else if (strcmp(ack,"LP\n") == 0) /* receive an s-expr */ - client_accept_s_expr(festival->info->server_fd); - else if (strcmp(ack,"ER\n") == 0) /* server got an error */ - { - fprintf(stderr,"festival_client: server returned error\n"); - break; + if (strcmp (ack, "WV\n") == 0) /* receive a waveform */ + wavefile = + socket_receive_file_to_buff (festival->info->server_fd, &filesize); + else if (strcmp (ack, "LP\n") == 0) /* receive an s-expr */ + client_accept_s_expr (festival->info->server_fd); + else if (strcmp (ack, "ER\n") == 0) { /* server got an error */ + fprintf (stderr, "festival_client: server returned error\n"); + break; } if (wavefile) { outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = wavefile; GST_BUFFER_SIZE (outbuf) = filesize; - + gst_pad_push (festival->srcpad, GST_DATA (outbuf)); wavefile = NULL; } - } while (strcmp(ack,"OK\n") != 0); - + } while (strcmp (ack, "OK\n") != 0); + gst_buffer_unref (buf); } -static FT_Info* +static FT_Info * festival_default_info (void) { FT_Info *info; - info = (FT_Info *)malloc(1 * sizeof(FT_Info)); - + + info = (FT_Info *) malloc (1 * sizeof (FT_Info)); + info->server_host = FESTIVAL_DEFAULT_SERVER_HOST; info->server_port = FESTIVAL_DEFAULT_SERVER_PORT; info->text_mode = FESTIVAL_DEFAULT_TEXT_MODE; info->server_fd = -1; - + return info; } static int festival_socket_open (const char *host, int port) -{ - /* Return an FD to a remote server */ +{ + /* Return an FD to a remote server */ struct sockaddr_in serv_addr; struct hostent *serverhost; int fd; - fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (fd < 0) - { - fprintf(stderr,"festival_client: can't get socket\n"); + if (fd < 0) { + fprintf (stderr, "festival_client: can't get socket\n"); return -1; } - memset(&serv_addr, 0, sizeof(serv_addr)); - if ((serv_addr.sin_addr.s_addr = inet_addr(host)) == -1) - { + memset (&serv_addr, 0, sizeof (serv_addr)); + if ((serv_addr.sin_addr.s_addr = inet_addr (host)) == -1) { /* its a name rather than an ipnum */ - serverhost = gethostbyname(host); - if (serverhost == (struct hostent *)0) - { - fprintf(stderr,"festival_client: gethostbyname failed\n"); + serverhost = gethostbyname (host); + if (serverhost == (struct hostent *) 0) { + fprintf (stderr, "festival_client: gethostbyname failed\n"); return -1; } - memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length); + memmove (&serv_addr.sin_addr, serverhost->h_addr, serverhost->h_length); } serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(port); + serv_addr.sin_port = htons (port); - if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) - { - fprintf(stderr,"festival_client: connect to server failed\n"); + if (connect (fd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) != 0) { + fprintf (stderr, "festival_client: connect to server failed\n"); return -1; } @@ -321,58 +317,57 @@ festival_socket_open (const char *host, int port) } -static char* +static char * client_accept_s_expr (int fd) { /* Read s-expression from server, as a char * */ char *expr; int filesize; - expr = socket_receive_file_to_buff(fd,&filesize); + expr = socket_receive_file_to_buff (fd, &filesize); expr[filesize] = '\0'; return expr; } -static char* +static char * socket_receive_file_to_buff (int fd, int *size) { /* Receive file (probably a waveform file) from socket using */ /* Festival key stuff technique, but long winded I know, sorry */ /* but will receive any file without closeing the stream or */ /* using OOB data */ - static const char *file_stuff_key = "ft_StUfF_key"; /* must == Festival's key */ + static const char *file_stuff_key = "ft_StUfF_key"; /* must == Festival's key */ char *buff; int bufflen; - int n,k,i; + int n, k, i; char c; bufflen = 1024; - buff = (char *)malloc(bufflen); - *size=0; - - for (k=0; file_stuff_key[k] != '\0';) - { - n = read(fd,&c,1); - if (n==0) break; /* hit stream eof before end of file */ - if ((*size)+k+1 >= bufflen) { + buff = (char *) malloc (bufflen); + *size = 0; + + for (k = 0; file_stuff_key[k] != '\0';) { + n = read (fd, &c, 1); + if (n == 0) + break; /* hit stream eof before end of file */ + if ((*size) + k + 1 >= bufflen) { /* +1 so you can add a NULL if you want */ - bufflen += bufflen/4; - buff = (char *)realloc(buff,bufflen); + bufflen += bufflen / 4; + buff = (char *) realloc (buff, bufflen); } if (file_stuff_key[k] == c) k++; - else if ((c == 'X') && (file_stuff_key[k+1] == '\0')) { + else if ((c == 'X') && (file_stuff_key[k + 1] == '\0')) { /* It looked like the key but wasn't */ - for (i=0; i < k; i++,(*size)++) - buff[*size] = file_stuff_key[i]; - k=0; + for (i = 0; i < k; i++, (*size)++) + buff[*size] = file_stuff_key[i]; + k = 0; /* omit the stuffed 'X' */ - } - else { - for (i=0; i < k; i++,(*size)++) - buff[*size] = file_stuff_key[i]; - k=0; + } else { + for (i = 0; i < k; i++, (*size)++) + buff[*size] = file_stuff_key[i]; + k = 0; buff[*size] = c; (*size)++; } @@ -386,14 +381,15 @@ socket_receive_file_to_buff (int fd, int *size) /***********************************************************************/ static gboolean -gst_festival_open (GstFestival *festival) +gst_festival_open (GstFestival * festival) { /* Open socket to server */ if (festival->info == NULL) - festival->info = festival_default_info(); + festival->info = festival_default_info (); - festival->info->server_fd = - festival_socket_open(festival->info->server_host, festival->info->server_port); + festival->info->server_fd = + festival_socket_open (festival->info->server_host, + festival->info->server_port); if (festival->info->server_fd == -1) return FALSE; @@ -401,19 +397,19 @@ gst_festival_open (GstFestival *festival) } static void -gst_festival_close (GstFestival *festival) +gst_festival_close (GstFestival * festival) { if (festival->info == NULL) return; if (festival->info->server_fd != -1) - close(festival->info->server_fd); + close (festival->info->server_fd); return; } static GstElementStateReturn -gst_festival_change_state (GstElement *element) +gst_festival_change_state (GstElement * element) { g_return_val_if_fail (GST_IS_FESTIVAL (element), GST_STATE_FAILURE); @@ -423,7 +419,7 @@ gst_festival_change_state (GstElement *element) } else { if (!GST_FLAG_IS_SET (element, GST_FESTIVAL_OPEN)) { if (!gst_festival_open (GST_FESTIVAL (element))) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; } } @@ -434,22 +430,17 @@ gst_festival_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "festival", GST_RANK_NONE, GST_TYPE_FESTIVAL)) + if (!gst_element_register (plugin, "festival", GST_RANK_NONE, + GST_TYPE_FESTIVAL)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "festival", - "Synthesizes plain text into audio", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -); +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "festival", + "Synthesizes plain text into audio", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN); diff --git a/gst/festival/gstfestival.h b/gst/festival/gstfestival.h index ab463106..6c649e17 100644 --- a/gst/festival/gstfestival.h +++ b/gst/festival/gstfestival.h @@ -64,23 +64,24 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define FESTIVAL_DEFAULT_SERVER_HOST "localhost" #define FESTIVAL_DEFAULT_SERVER_PORT 1314 #define FESTIVAL_DEFAULT_TEXT_MODE "fundamental" -typedef struct FT_Info -{ + typedef struct FT_Info + { int encoding; char *server_host; int server_port; char *text_mode; - + int server_fd; -} FT_Info; + } FT_Info; #define GST_TYPE_FESTIVAL \ (gst_festival_get_type()) @@ -93,32 +94,35 @@ typedef struct FT_Info #define GST_IS_FESTIVAL_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FESTIVAL)) -typedef enum { - GST_FESTIVAL_OPEN = GST_ELEMENT_FLAG_LAST, + typedef enum + { + GST_FESTIVAL_OPEN = GST_ELEMENT_FLAG_LAST, - GST_FESTIVAL_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, -} GstFestivalFlags; + GST_FESTIVAL_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2, + } GstFestivalFlags; -typedef struct _GstFestival GstFestival; -typedef struct _GstFestivalClass GstFestivalClass; + typedef struct _GstFestival GstFestival; + typedef struct _GstFestivalClass GstFestivalClass; -struct _GstFestival { - GstElement element; + struct _GstFestival + { + GstElement element; - /* pads */ - GstPad *sinkpad,*srcpad; + /* pads */ + GstPad *sinkpad, *srcpad; - FT_Info *info; -}; + FT_Info *info; + }; -struct _GstFestivalClass { - GstElementClass parent_class; -}; + struct _GstFestivalClass + { + GstElementClass parent_class; + }; -GType gst_festival_get_type(void); + GType gst_festival_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_FESTIVAL_H__ */ +#endif /* __GST_FESTIVAL_H__ */ diff --git a/gst/filter/gstbpwsinc.c b/gst/filter/gstbpwsinc.c index 77529053..a848cc26 100644 --- a/gst/filter/gstbpwsinc.c +++ b/gst/filter/gstbpwsinc.c @@ -39,20 +39,19 @@ #include /* memmove */ /* elementfactory information */ -static GstElementDetails gst_bpwsinc_details = GST_ELEMENT_DETAILS ( - "BPWSinc", - "Filter/Effect/Audio", - "Band-Pass Windowed sinc filter", - "Thomas , " - "Steven W. Smith" -); - -enum { +static GstElementDetails gst_bpwsinc_details = GST_ELEMENT_DETAILS ("BPWSinc", + "Filter/Effect/Audio", + "Band-Pass Windowed sinc filter", + "Thomas , " "Steven W. Smith"); + +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_LENGTH, ARG_LOWER_FREQUENCY, @@ -81,51 +80,52 @@ struct _GstBPWSinc double frequency; double lower_frequency, upper_frequency; - int wing_size; /* length of a "wing" of the filter; - actual length is 2 * wing_size + 1 */ + int wing_size; /* length of a "wing" of the filter; + actual length is 2 * wing_size + 1 */ - gfloat *residue; /* buffer for left-over samples from previous buffer */ + gfloat *residue; /* buffer for left-over samples from previous buffer */ double *kernel; }; struct _GstBPWSincClass { - GstElementClass parent_class; + GstElementClass parent_class; }; -static void gst_bpwsinc_base_init (gpointer g_class); -static void gst_bpwsinc_class_init (GstBPWSincClass * klass); -static void gst_bpwsinc_init (GstBPWSinc * filter); +static void gst_bpwsinc_base_init (gpointer g_class); +static void gst_bpwsinc_class_init (GstBPWSincClass * klass); +static void gst_bpwsinc_init (GstBPWSinc * filter); -static void gst_bpwsinc_set_property (GObject * object, guint prop_id, - const GValue * value, - GParamSpec * pspec); -static void gst_bpwsinc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_bpwsinc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_bpwsinc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_bpwsinc_chain (GstPad * pad, GstData *_data); +static void gst_bpwsinc_chain (GstPad * pad, GstData * _data); static GstPadLinkReturn - gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); +gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_bpwsinc_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_bpwsinc_get_type (void) +GType +gst_bpwsinc_get_type (void) { static GType bpwsinc_type = 0; if (!bpwsinc_type) { static const GTypeInfo bpwsinc_info = { - sizeof (GstBPWSincClass), - gst_bpwsinc_base_init, + sizeof (GstBPWSincClass), + gst_bpwsinc_base_init, NULL, (GClassInitFunc) gst_bpwsinc_class_init, NULL, NULL, sizeof (GstBPWSinc), 0, (GInstanceInitFunc) gst_bpwsinc_init, }; - bpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstBPWSinc", - &bpwsinc_info, 0); + bpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstBPWSinc", + &bpwsinc_info, 0); } return bpwsinc_type; } @@ -139,9 +139,9 @@ gst_bpwsinc_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_filter_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_filter_sink_template)); + gst_static_pad_template_get (&gst_filter_sink_template)); - gst_element_class_set_details (element_class, &gst_bpwsinc_details); + gst_element_class_set_details (element_class, &gst_bpwsinc_details); } static void @@ -156,20 +156,17 @@ gst_bpwsinc_class_init (GstBPWSincClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOWER_FREQUENCY, - g_param_spec_double ("lower-frequency", "Lower Frequency", - "Cut-off lower frequency (relative to sample rate)", - 0.0, 0.5, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("lower-frequency", "Lower Frequency", + "Cut-off lower frequency (relative to sample rate)", + 0.0, 0.5, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_UPPER_FREQUENCY, - g_param_spec_double ("upper-frequency", "Upper Frequency", - "Cut-off upper frequency (relative to sample rate)", - 0.0, 0.5, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("upper-frequency", "Upper Frequency", + "Cut-off upper frequency (relative to sample rate)", + 0.0, 0.5, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LENGTH, - g_param_spec_int ("length", "Length", - "N such that the filter length = 2N + 1", - 1, G_MAXINT, - 1, G_PARAM_READWRITE)); + g_param_spec_int ("length", "Length", + "N such that the filter length = 2N + 1", + 1, G_MAXINT, 1, G_PARAM_READWRITE)); gobject_class->set_property = gst_bpwsinc_set_property; gobject_class->get_property = gst_bpwsinc_get_property; @@ -178,14 +175,16 @@ gst_bpwsinc_class_init (GstBPWSincClass * klass) static void gst_bpwsinc_init (GstBPWSinc * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_sink_template), "sink"); gst_pad_set_chain_function (filter->sinkpad, gst_bpwsinc_chain); gst_pad_set_link_function (filter->sinkpad, gst_bpwsinc_sink_connect); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_src_template), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->wing_size = 50; @@ -202,65 +201,65 @@ gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) int len = 0; double *kernel_lp, *kernel_hp; GstPadLinkReturn set_retval; - + GstBPWSinc *filter = GST_BPWSINC (gst_pad_get_parent (pad)); g_assert (GST_IS_PAD (pad)); g_assert (caps != NULL); set_retval = gst_pad_try_set_caps (filter->srcpad, caps); - - if (set_retval > 0) - { + + if (set_retval > 0) { len = filter->wing_size; /* fill the lp kernel */ - GST_DEBUG ( - "bpwsinc: initializing LP kernel of length %d with cut-off %f", - len * 2 + 1, filter->lower_frequency); + GST_DEBUG ("bpwsinc: initializing LP kernel of length %d with cut-off %f", + len * 2 + 1, filter->lower_frequency); kernel_lp = (double *) g_malloc (sizeof (double) * (2 * len + 1)); - for (i = 0; i <= len * 2; ++i) - { + for (i = 0; i <= len * 2; ++i) { if (i == len) kernel_lp[i] = 2 * M_PI * filter->lower_frequency; else - kernel_lp[i] = sin (2 * M_PI * filter->lower_frequency * (i - len)) - / (i - len); + kernel_lp[i] = sin (2 * M_PI * filter->lower_frequency * (i - len)) + / (i - len); /* Blackman windowing */ - kernel_lp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) - + 0.08 * cos (2 * M_PI * i / len)); + kernel_lp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) + + 0.08 * cos (2 * M_PI * i / len)); } /* normalize for unity gain at DC * FIXME: sure this is not supposed to be quadratic ? */ sum = 0.0; - for (i = 0; i <= len * 2; ++i) sum += kernel_lp[i]; - for (i = 0; i <= len * 2; ++i) kernel_lp[i] /= sum; + for (i = 0; i <= len * 2; ++i) + sum += kernel_lp[i]; + for (i = 0; i <= len * 2; ++i) + kernel_lp[i] /= sum; /* fill the hp kernel */ - GST_DEBUG ( - "bpwsinc: initializing HP kernel of length %d with cut-off %f", - len * 2 + 1, filter->upper_frequency); + GST_DEBUG ("bpwsinc: initializing HP kernel of length %d with cut-off %f", + len * 2 + 1, filter->upper_frequency); kernel_hp = (double *) g_malloc (sizeof (double) * (2 * len + 1)); - for (i = 0; i <= len * 2; ++i) - { + for (i = 0; i <= len * 2; ++i) { if (i == len) kernel_hp[i] = 2 * M_PI * filter->upper_frequency; else - kernel_hp[i] = sin (2 * M_PI * filter->upper_frequency * (i - len)) - / (i - len); + kernel_hp[i] = sin (2 * M_PI * filter->upper_frequency * (i - len)) + / (i - len); /* Blackman windowing */ - kernel_hp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) - + 0.08 * cos (2 * M_PI * i / len)); + kernel_hp[i] *= (0.42 - 0.5 * cos (M_PI * i / len) + + 0.08 * cos (2 * M_PI * i / len)); } /* normalize for unity gain at DC * FIXME: sure this is not supposed to be quadratic ? */ sum = 0.0; - for (i = 0; i <= len * 2; ++i) sum += kernel_hp[i]; - for (i = 0; i <= len * 2; ++i) kernel_hp[i] /= sum; + for (i = 0; i <= len * 2; ++i) + sum += kernel_hp[i]; + for (i = 0; i <= len * 2; ++i) + kernel_hp[i] /= sum; /* do spectral inversion to get a HP filter */ - for (i = 0; i <= len * 2; ++i) kernel_hp[i] = -kernel_hp[i]; + for (i = 0; i <= len * 2; ++i) + kernel_hp[i] = -kernel_hp[i]; kernel_hp[len] += 1; /* combine the two filters */ @@ -271,7 +270,8 @@ gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) filter->kernel[i] = kernel_lp[i] + kernel_hp[i]; /* do spectral inversion to go from band reject to bandpass */ - for (i = 0; i <= len * 2; ++i) filter->kernel[i] = -filter->kernel[i]; + for (i = 0; i <= len * 2; ++i) + filter->kernel[i] = -filter->kernel[i]; filter->kernel[len] += 1; /* free the helper kernels */ @@ -280,14 +280,15 @@ gst_bpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) /* set up the residue memory space */ filter->residue = (gfloat *) g_malloc (sizeof (gfloat) * (len * 2 + 1)); - for (i = 0; i <= len * 2; ++i) filter->residue[i] = 0.0; + for (i = 0; i <= len * 2; ++i) + filter->residue[i] = 0.0; } return set_retval; } static void -gst_bpwsinc_chain (GstPad *pad, GstData *_data) +gst_bpwsinc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstBPWSinc *filter; @@ -323,24 +324,24 @@ gst_bpwsinc_chain (GstPad *pad, GstData *_data) memcpy (&input[residue_samples], src, sizeof (gfloat) * input_samples); /* copy the tail of the current input buffer to the residue */ memcpy (filter->residue, &src[input_samples - residue_samples], - sizeof (gfloat) * residue_samples); + sizeof (gfloat) * residue_samples); /* convolution */ /* since we copied the previous set of samples we needed before the actual * input data, we need to add the filter length to our indices for input */ - for (i = 0; i < input_samples; ++i) - { + for (i = 0; i < input_samples; ++i) { src[i] = 0.0; for (j = 0; j < residue_samples; ++j) src[i] += input[i - j + residue_samples] * filter->kernel[j]; } - + g_free (input); gst_pad_push (filter->srcpad, GST_DATA (buf)); } static void -gst_bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstBPWSinc *filter; @@ -351,27 +352,28 @@ gst_bpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, switch (prop_id) { case ARG_LENGTH: - filter->wing_size = g_value_get_int (value); - break; + filter->wing_size = g_value_get_int (value); + break; case ARG_LOWER_FREQUENCY: - filter->lower_frequency = g_value_get_double (value); - break; + filter->lower_frequency = g_value_get_double (value); + break; case ARG_UPPER_FREQUENCY: - filter->upper_frequency = g_value_get_double (value); - break; + filter->upper_frequency = g_value_get_double (value); + break; default: break; } } static void -gst_bpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_bpwsinc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstBPWSinc *filter; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_BPWSINC (object)); - + filter = GST_BPWSINC (object); switch (prop_id) { @@ -388,5 +390,4 @@ gst_bpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GPara G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } -} - +} diff --git a/gst/filter/gstfilter.c b/gst/filter/gstfilter.c index 7a5d4248..f723ae63 100644 --- a/gst/filter/gstfilter.c +++ b/gst/filter/gstfilter.c @@ -27,33 +27,30 @@ #include -struct _elements_entry { +struct _elements_entry +{ gchar *name; - GType (*type) (void); + GType (*type) (void); }; static struct _elements_entry _elements[] = { - { "iir", gst_iir_get_type }, - { "lpwsinc", gst_lpwsinc_get_type }, - { "bpwsinc", gst_bpwsinc_get_type }, - { NULL, 0 }, + {"iir", gst_iir_get_type}, + {"lpwsinc", gst_lpwsinc_get_type}, + {"bpwsinc", gst_bpwsinc_get_type}, + {NULL, 0}, }; -GstStaticPadTemplate gst_filter_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +GstStaticPadTemplate gst_filter_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS ) -); + GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); -GstStaticPadTemplate gst_filter_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", +GstStaticPadTemplate gst_filter_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS ) -); + GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); static gboolean plugin_init (GstPlugin * plugin) @@ -61,7 +58,8 @@ plugin_init (GstPlugin * plugin) gint i = 0; while (_elements[i].name) { - if (!gst_element_register (plugin, _elements[i].name, GST_RANK_NONE, _elements[i].type())) + if (!gst_element_register (plugin, _elements[i].name, GST_RANK_NONE, + _elements[i].type ())) return FALSE; i++; @@ -70,14 +68,8 @@ plugin_init (GstPlugin * plugin) return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "filter", - "IIR, lpwsinc and bpwsinc audio filter elements", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -); +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "filter", + "IIR, lpwsinc and bpwsinc audio filter elements", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN); diff --git a/gst/filter/gstiir.c b/gst/filter/gstiir.c index 4ccf9f09..5e44f3d0 100644 --- a/gst/filter/gstiir.c +++ b/gst/filter/gstiir.c @@ -25,20 +25,19 @@ #include "gstfilter.h" #include "iir.h" -static GstElementDetails gst_iir_details = GST_ELEMENT_DETAILS ( - "IIR", - "Filter/Effect/Audio", - "IIR filter based on vorbis code", - "Monty , " - "Thomas " -); - -enum { +static GstElementDetails gst_iir_details = GST_ELEMENT_DETAILS ("IIR", + "Filter/Effect/Audio", + "IIR filter based on vorbis code", + "Monty , " "Thomas "); + +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_A, ARG_B, @@ -74,33 +73,34 @@ struct _GstIIR struct _GstIIRClass { - GstElementClass parent_class; + GstElementClass parent_class; }; -static void gst_iir_base_init (gpointer g_class); -static void gst_iir_class_init (GstIIRClass * klass); -static void gst_iir_init (GstIIR * filter); +static void gst_iir_base_init (gpointer g_class); +static void gst_iir_class_init (GstIIRClass * klass); +static void gst_iir_init (GstIIR * filter); -static void gst_iir_set_property (GObject * object, guint prop_id, - const GValue * value, - GParamSpec * pspec); -static void gst_iir_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_iir_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_iir_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_iir_chain (GstPad * pad, GstData *_data); +static void gst_iir_chain (GstPad * pad, GstData * _data); static GstPadLinkReturn - gst_iir_sink_connect (GstPad * pad, const GstCaps * caps); +gst_iir_sink_connect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_iir_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_iir_get_type (void) +GType +gst_iir_get_type (void) { static GType iir_type = 0; if (!iir_type) { static const GTypeInfo iir_info = { - sizeof (GstIIRClass), + sizeof (GstIIRClass), gst_iir_base_init, NULL, (GClassInitFunc) gst_iir_class_init, NULL, NULL, @@ -108,8 +108,8 @@ GType gst_iir_get_type (void) (GInstanceInitFunc) gst_iir_init, }; - iir_type = g_type_register_static (GST_TYPE_ELEMENT, "GstIIR", - &iir_info, 0); + iir_type = g_type_register_static (GST_TYPE_ELEMENT, "GstIIR", + &iir_info, 0); } return iir_type; } @@ -123,9 +123,9 @@ gst_iir_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_filter_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_filter_sink_template)); + gst_static_pad_template_get (&gst_filter_sink_template)); - gst_element_class_set_details (element_class, &gst_iir_details); + gst_element_class_set_details (element_class, &gst_iir_details); } static void @@ -140,21 +140,17 @@ gst_iir_class_init (GstIIRClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_A, - g_param_spec_double ("A", "A", "A filter coefficient", - -G_MAXDOUBLE, G_MAXDOUBLE, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("A", "A", "A filter coefficient", + -G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_B, - g_param_spec_double ("B", "B", "B filter coefficient", - -G_MAXDOUBLE, G_MAXDOUBLE, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("B", "B", "B filter coefficient", + -G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_GAIN, - g_param_spec_double ("gain", "Gain", "Filter gain", - -G_MAXDOUBLE, G_MAXDOUBLE, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("gain", "Gain", "Filter gain", + -G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STAGES, - g_param_spec_int ("stages", "Stages", "Number of filter stages", - 1, G_MAXINT, - 1, G_PARAM_READWRITE)); + g_param_spec_int ("stages", "Stages", "Number of filter stages", + 1, G_MAXINT, 1, G_PARAM_READWRITE)); gobject_class->set_property = gst_iir_set_property; gobject_class->get_property = gst_iir_get_property; @@ -163,19 +159,21 @@ gst_iir_class_init (GstIIRClass * klass) static void gst_iir_init (GstIIR * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_sink_template), "sink"); gst_pad_set_chain_function (filter->sinkpad, gst_iir_chain); gst_pad_set_link_function (filter->sinkpad, gst_iir_sink_connect); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_src_template), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->A = 0.0; filter->B = 0.0; - filter->gain = 1.0; /* unity gain as default */ + filter->gain = 1.0; /* unity gain as default */ filter->stages = 1; filter->state = NULL; } @@ -185,23 +183,23 @@ gst_iir_sink_connect (GstPad * pad, const GstCaps * caps) { GstIIR *filter; GstPadLinkReturn set_retval; - + filter = GST_IIR (gst_pad_get_parent (pad)); - - set_retval = gst_pad_try_set_caps(filter->srcpad, caps); + + set_retval = gst_pad_try_set_caps (filter->srcpad, caps); if (set_retval > 0) { /* connection works, so init the filter */ /* FIXME: remember to free it */ filter->state = (IIR_state *) g_malloc (sizeof (IIR_state)); - IIR_init (filter->state, filter->stages, - filter->gain, &(filter->A), &(filter->B)); + IIR_init (filter->state, filter->stages, + filter->gain, &(filter->A), &(filter->B)); } return set_retval; } static void -gst_iir_chain (GstPad * pad, GstData *_data) +gst_iir_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstIIR *filter; @@ -223,7 +221,8 @@ gst_iir_chain (GstPad * pad, GstData *_data) } static void -gst_iir_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_iir_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstIIR *filter; @@ -234,30 +233,31 @@ gst_iir_set_property (GObject * object, guint prop_id, const GValue * value, GPa switch (prop_id) { case ARG_A: - filter->A = g_value_get_double (value); - break; + filter->A = g_value_get_double (value); + break; case ARG_B: - filter->B = g_value_get_double (value); - break; + filter->B = g_value_get_double (value); + break; case ARG_GAIN: - filter->gain = g_value_get_double (value); - break; + filter->gain = g_value_get_double (value); + break; case ARG_STAGES: - filter->stages = g_value_get_int (value); - break; + filter->stages = g_value_get_int (value); + break; default: break; } } static void -gst_iir_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_iir_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstIIR *filter; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_IIR (object)); - + filter = GST_IIR (object); switch (prop_id) { @@ -277,5 +277,4 @@ gst_iir_get_property (GObject * object, guint prop_id, GValue * value, GParamSpe G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } -} - +} diff --git a/gst/filter/gstlpwsinc.c b/gst/filter/gstlpwsinc.c index 603d8775..0ce33b32 100644 --- a/gst/filter/gstlpwsinc.c +++ b/gst/filter/gstlpwsinc.c @@ -38,20 +38,19 @@ #include /* M_PI */ #include /* memmove */ -static GstElementDetails gst_lpwsinc_details = GST_ELEMENT_DETAILS ( - "LPWSinc", - "Filter/Effect/Audio", - "Low-pass Windowed sinc filter", - "Thomas , " - "Steven W. Smith" -); - -enum { +static GstElementDetails gst_lpwsinc_details = GST_ELEMENT_DETAILS ("LPWSinc", + "Filter/Effect/Audio", + "Low-pass Windowed sinc filter", + "Thomas , " "Steven W. Smith"); + +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_LENGTH, ARG_FREQUENCY, @@ -78,42 +77,43 @@ struct _GstLPWSinc GstPad *sinkpad, *srcpad; double frequency; - int wing_size; /* length of a "wing" of the filter; - actual length is 2 * wing_size + 1 */ + int wing_size; /* length of a "wing" of the filter; + actual length is 2 * wing_size + 1 */ - gfloat *residue; /* buffer for left-over samples from previous buffer */ + gfloat *residue; /* buffer for left-over samples from previous buffer */ double *kernel; }; struct _GstLPWSincClass { - GstElementClass parent_class; + GstElementClass parent_class; }; -static void gst_lpwsinc_base_init (gpointer g_class); -static void gst_lpwsinc_class_init (GstLPWSincClass * klass); -static void gst_lpwsinc_init (GstLPWSinc * filter); +static void gst_lpwsinc_base_init (gpointer g_class); +static void gst_lpwsinc_class_init (GstLPWSincClass * klass); +static void gst_lpwsinc_init (GstLPWSinc * filter); -static void gst_lpwsinc_set_property (GObject * object, guint prop_id, - const GValue * value, - GParamSpec * pspec); -static void gst_lpwsinc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_lpwsinc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_lpwsinc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_lpwsinc_chain (GstPad * pad, GstData *_data); +static void gst_lpwsinc_chain (GstPad * pad, GstData * _data); static GstPadLinkReturn - gst_lpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); +gst_lpwsinc_sink_connect (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; + /*static guint gst_lpwsinc_signals[LAST_SIGNAL] = { 0 }; */ -GType gst_lpwsinc_get_type (void) +GType +gst_lpwsinc_get_type (void) { static GType lpwsinc_type = 0; if (!lpwsinc_type) { static const GTypeInfo lpwsinc_info = { - sizeof (GstLPWSincClass), + sizeof (GstLPWSincClass), gst_lpwsinc_base_init, NULL, (GClassInitFunc) gst_lpwsinc_class_init, NULL, NULL, @@ -121,8 +121,8 @@ GType gst_lpwsinc_get_type (void) (GInstanceInitFunc) gst_lpwsinc_init, }; - lpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLPWSinc", - &lpwsinc_info, 0); + lpwsinc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstLPWSinc", + &lpwsinc_info, 0); } return lpwsinc_type; } @@ -136,9 +136,9 @@ gst_lpwsinc_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_filter_src_template)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_filter_sink_template)); + gst_static_pad_template_get (&gst_filter_sink_template)); - gst_element_class_set_details (element_class, &gst_lpwsinc_details); + gst_element_class_set_details (element_class, &gst_lpwsinc_details); } static void @@ -153,15 +153,13 @@ gst_lpwsinc_class_init (GstLPWSincClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_double ("frequency", "Frequency", - "Cut-off Frequency relative to sample rate)", - 0.0, 0.5, - 0, G_PARAM_READWRITE)); + g_param_spec_double ("frequency", "Frequency", + "Cut-off Frequency relative to sample rate)", + 0.0, 0.5, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LENGTH, - g_param_spec_int ("length", "Length", - "N such that the filter length = 2N + 1", - 1, G_MAXINT, - 1, G_PARAM_READWRITE)); + g_param_spec_int ("length", "Length", + "N such that the filter length = 2N + 1", + 1, G_MAXINT, 1, G_PARAM_READWRITE)); gobject_class->set_property = gst_lpwsinc_set_property; gobject_class->get_property = gst_lpwsinc_get_property; @@ -170,14 +168,16 @@ gst_lpwsinc_class_init (GstLPWSincClass * klass) static void gst_lpwsinc_init (GstLPWSinc * filter) { - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_sink_template), "sink"); gst_pad_set_chain_function (filter->sinkpad, gst_lpwsinc_chain); gst_pad_set_link_function (filter->sinkpad, gst_lpwsinc_sink_connect); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_filter_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_filter_src_template), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->wing_size = 50; @@ -197,45 +197,45 @@ gst_lpwsinc_sink_connect (GstPad * pad, const GstCaps * caps) g_assert (GST_IS_PAD (pad)); g_assert (caps != NULL); - set_retval = gst_pad_try_set_caps(filter->srcpad, caps); - - if (set_retval > 0) - { + set_retval = gst_pad_try_set_caps (filter->srcpad, caps); + + if (set_retval > 0) { /* connection works, so init the filter */ /* FIXME: remember to free it */ /* fill the kernel */ g_print ("DEBUG: initing filter kernel\n"); len = filter->wing_size; - GST_DEBUG ( - "lpwsinc: initializing filter kernel of length %d", len * 2 + 1); + GST_DEBUG ("lpwsinc: initializing filter kernel of length %d", len * 2 + 1); filter->kernel = (double *) g_malloc (sizeof (double) * (2 * len + 1)); - for (i = 0; i <= len * 2; ++i) - { + for (i = 0; i <= len * 2; ++i) { if (i == len) filter->kernel[i] = 2 * M_PI * filter->frequency; else - filter->kernel[i] = sin (2 * M_PI * filter->frequency * (i - len)) - / (i - len); + filter->kernel[i] = sin (2 * M_PI * filter->frequency * (i - len)) + / (i - len); /* windowing */ filter->kernel[i] *= (0.54 - 0.46 * cos (M_PI * i / len)); } /* normalize for unity gain at DC * FIXME: sure this is not supposed to be quadratic ? */ - for (i = 0; i <= len * 2; ++i) sum += filter->kernel[i]; - for (i = 0; i <= len * 2; ++i) filter->kernel[i] /= sum; + for (i = 0; i <= len * 2; ++i) + sum += filter->kernel[i]; + for (i = 0; i <= len * 2; ++i) + filter->kernel[i] /= sum; /* set up the residue memory space */ filter->residue = (gfloat *) g_malloc (sizeof (gfloat) * (len * 2 + 1)); - for (i = 0; i <= len * 2; ++i) filter->residue[i] = 0.0; + for (i = 0; i <= len * 2; ++i) + filter->residue[i] = 0.0; } return set_retval; } static void -gst_lpwsinc_chain (GstPad * pad, GstData *_data) +gst_lpwsinc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstLPWSinc *filter; @@ -271,24 +271,24 @@ gst_lpwsinc_chain (GstPad * pad, GstData *_data) memcpy (&input[residue_samples], src, sizeof (gfloat) * input_samples); /* copy the tail of the current input buffer to the residue */ memcpy (filter->residue, &src[input_samples - residue_samples], - sizeof (gfloat) * residue_samples); + sizeof (gfloat) * residue_samples); /* convolution */ /* since we copied the previous set of samples we needed before the actual * input data, we need to add the filter length to our indices for input */ - for (i = 0; i < input_samples; ++i) - { + for (i = 0; i < input_samples; ++i) { src[i] = 0.0; for (j = 0; j < residue_samples; ++j) src[i] += input[i - j + residue_samples] * filter->kernel[j]; } - + g_free (input); gst_pad_push (filter->srcpad, GST_DATA (buf)); } static void -gst_lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstLPWSinc *filter; @@ -299,24 +299,25 @@ gst_lpwsinc_set_property (GObject * object, guint prop_id, const GValue * value, switch (prop_id) { case ARG_LENGTH: - filter->wing_size = g_value_get_int (value); - break; + filter->wing_size = g_value_get_int (value); + break; case ARG_FREQUENCY: - filter->frequency = g_value_get_double (value); - break; + filter->frequency = g_value_get_double (value); + break; default: break; } } static void -gst_lpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_lpwsinc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstLPWSinc *filter; /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_LPWSINC (object)); - + filter = GST_LPWSINC (object); switch (prop_id) { @@ -330,5 +331,4 @@ gst_lpwsinc_get_property (GObject * object, guint prop_id, GValue * value, GPara G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } -} - +} diff --git a/gst/filter/iir.c b/gst/filter/iir.c index 13e2e937..8bf629b6 100644 --- a/gst/filter/iir.c +++ b/gst/filter/iir.c @@ -28,91 +28,103 @@ #include #include "iir.h" -void IIR_init(IIR_state *s,int stages,double gain, double *A, double *B){ - memset(s,0,sizeof(IIR_state)); - s->stages=stages; - s->gain=gain; - s->coeff_A=malloc(stages*sizeof(double)); - s->coeff_B=malloc((stages+1)*sizeof(double)); - s->z_A=calloc(stages*2,sizeof(double)); - s->z_B=calloc(stages*2,sizeof(double)); - - memcpy(s->coeff_A,A,stages*sizeof(double)); - memcpy(s->coeff_B,B,(stages+1)*sizeof(double)); +void +IIR_init (IIR_state * s, int stages, double gain, double *A, double *B) +{ + memset (s, 0, sizeof (IIR_state)); + s->stages = stages; + s->gain = gain; + s->coeff_A = malloc (stages * sizeof (double)); + s->coeff_B = malloc ((stages + 1) * sizeof (double)); + s->z_A = calloc (stages * 2, sizeof (double)); + s->z_B = calloc (stages * 2, sizeof (double)); + + memcpy (s->coeff_A, A, stages * sizeof (double)); + memcpy (s->coeff_B, B, (stages + 1) * sizeof (double)); } -void IIR_clear(IIR_state *s){ - if(s){ - free(s->coeff_A); - free(s->coeff_B); - free(s->z_A); - free(s->z_B); - memset(s,0,sizeof(IIR_state)); +void +IIR_clear (IIR_state * s) +{ + if (s) { + free (s->coeff_A); + free (s->coeff_B); + free (s->z_A); + free (s->z_B); + memset (s, 0, sizeof (IIR_state)); } } -double IIR_filter(IIR_state *s,double in){ - int stages=s->stages,i; +double +IIR_filter (IIR_state * s, double in) +{ + int stages = s->stages, i; double newA; - double newB=0; - double *zA=s->z_A+s->ring; + double newB = 0; + double *zA = s->z_A + s->ring; - newA=in/=s->gain; - for(i=0;icoeff_A[i] * zA[i]; - newB+= s->coeff_B[i] * zA[i]; + newA = in /= s->gain; + for (i = 0; i < stages; i++) { + newA += s->coeff_A[i] * zA[i]; + newB += s->coeff_B[i] * zA[i]; } - newB+=newA*s->coeff_B[stages]; + newB += newA * s->coeff_B[stages]; - zA[0]=zA[stages]=newA; - if(++s->ring>=stages)s->ring=0; + zA[0] = zA[stages] = newA; + if (++s->ring >= stages) + s->ring = 0; - return(newB); + return (newB); } /* this assumes the symmetrical structure of the feed-forward stage of a Chebyshev bandpass to save multiplies */ -double IIR_filter_ChebBand(IIR_state *s,double in){ - int stages=s->stages,i; +double +IIR_filter_ChebBand (IIR_state * s, double in) +{ + int stages = s->stages, i; double newA; - double newB=0; - double *zA=s->z_A+s->ring; + double newB = 0; + double *zA = s->z_A + s->ring; - newA=in/=s->gain; + newA = in /= s->gain; - newA+= s->coeff_A[0] * zA[0]; - for(i=1;i<(stages>>1);i++){ - newA+= s->coeff_A[i] * zA[i]; - newB+= s->coeff_B[i] * (zA[i]-zA[stages-i]); + newA += s->coeff_A[0] * zA[0]; + for (i = 1; i < (stages >> 1); i++) { + newA += s->coeff_A[i] * zA[i]; + newB += s->coeff_B[i] * (zA[i] - zA[stages - i]); } - newB+= s->coeff_B[i] * zA[i]; - for(;icoeff_A[i] * zA[i]; + newB += s->coeff_B[i] * zA[i]; + for (; i < stages; i++) + newA += s->coeff_A[i] * zA[i]; - newB+= newA-zA[0]; + newB += newA - zA[0]; - zA[0]=zA[stages]=newA; - if(++s->ring>=stages)s->ring=0; + zA[0] = zA[stages] = newA; + if (++s->ring >= stages) + s->ring = 0; - return(newB); + return (newB); } #ifdef _V_SELFTEST /* z^-stage, z^-stage+1... */ -static double cheb_bandpass_B[]={-1.,0.,5.,0.,-10.,0.,10.,0.,-5.,0.,1}; -static double cheb_bandpass_A[]={-0.6665900311, - 1.0070146601, - -3.1262875409, - 3.5017171569, - -6.2779211945, - 5.2966481740, - -6.7570216587, - 4.0760335768, - -3.9134284363, - 1.3997338886}; - -static double data[128]={ +static double cheb_bandpass_B[] = + { -1., 0., 5., 0., -10., 0., 10., 0., -5., 0., 1 }; +static double cheb_bandpass_A[] = { -0.6665900311, + 1.0070146601, + -3.1262875409, + 3.5017171569, + -6.2779211945, + 5.2966481740, + -6.7570216587, + 4.0760335768, + -3.9134284363, + 1.3997338886 +}; + +static double data[128] = { 0.0426331, 0.0384521, 0.0345764, @@ -240,7 +252,8 @@ static double data[128]={ -0.0537415, -0.0610046, -0.0609741, - -0.0547791}; + -0.0547791 +}; /* comparison test code from http://www-users.cs.york.ac.uk/~fisher/mkfilter/ (the above page kicks ass, BTW)*/ @@ -249,58 +262,87 @@ static double data[128]={ #define NPOLES 10 #define GAIN 4.599477515e+02 -static float xv[NZEROS+1], yv[NPOLES+1]; - -static double filterloop(double next){ - xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4]; xv[4] = xv[5]; - xv[5] = xv[6]; xv[6] = xv[7]; xv[7] = xv[8]; xv[8] = xv[9]; xv[9] = xv[10]; +static float xv[NZEROS + 1], yv[NPOLES + 1]; + +static double +filterloop (double next) +{ + xv[0] = xv[1]; + xv[1] = xv[2]; + xv[2] = xv[3]; + xv[3] = xv[4]; + xv[4] = xv[5]; + xv[5] = xv[6]; + xv[6] = xv[7]; + xv[7] = xv[8]; + xv[8] = xv[9]; + xv[9] = xv[10]; xv[10] = next / GAIN; - yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4]; yv[4] = yv[5]; - yv[5] = yv[6]; yv[6] = yv[7]; yv[7] = yv[8]; yv[8] = yv[9]; yv[9] = yv[10]; - yv[10] = (xv[10] - xv[0]) + 5 * (xv[2] - xv[8]) + 10 * (xv[6] - xv[4]) - + ( -0.6665900311 * yv[0]) + ( 1.0070146601 * yv[1]) - + ( -3.1262875409 * yv[2]) + ( 3.5017171569 * yv[3]) - + ( -6.2779211945 * yv[4]) + ( 5.2966481740 * yv[5]) - + ( -6.7570216587 * yv[6]) + ( 4.0760335768 * yv[7]) - + ( -3.9134284363 * yv[8]) + ( 1.3997338886 * yv[9]); - return(yv[10]); + yv[0] = yv[1]; + yv[1] = yv[2]; + yv[2] = yv[3]; + yv[3] = yv[4]; + yv[4] = yv[5]; + yv[5] = yv[6]; + yv[6] = yv[7]; + yv[7] = yv[8]; + yv[8] = yv[9]; + yv[9] = yv[10]; + yv[10] = (xv[10] - xv[0]) + 5 * (xv[2] - xv[8]) + 10 * (xv[6] - xv[4]) + + (-0.6665900311 * yv[0]) + (1.0070146601 * yv[1]) + + (-3.1262875409 * yv[2]) + (3.5017171569 * yv[3]) + + (-6.2779211945 * yv[4]) + (5.2966481740 * yv[5]) + + (-6.7570216587 * yv[6]) + (4.0760335768 * yv[7]) + + (-3.9134284363 * yv[8]) + (1.3997338886 * yv[9]); + return (yv[10]); } #include -int main(){ +int +main () +{ /* run the pregenerated Chebyshev filter, then our own distillation through the generic and specialized code */ - double *work=malloc(128*sizeof(double)); + double *work = malloc (128 * sizeof (double)); IIR_state iir; int i; - for(i=0;i<128;i++)work[i]=filterloop(data[i]); + for (i = 0; i < 128; i++) + work[i] = filterloop (data[i]); { - FILE *out=fopen("IIR_ref.m","w"); - for(i=0;i<128;i++)fprintf(out,"%g\n",work[i]); - fclose(out); + FILE *out = fopen ("IIR_ref.m", "w"); + + for (i = 0; i < 128; i++) + fprintf (out, "%g\n", work[i]); + fclose (out); } - IIR_init(&iir,NPOLES,GAIN,cheb_bandpass_A,cheb_bandpass_B); - for(i=0;i<128;i++)work[i]=IIR_filter(&iir,data[i]); + IIR_init (&iir, NPOLES, GAIN, cheb_bandpass_A, cheb_bandpass_B); + for (i = 0; i < 128; i++) + work[i] = IIR_filter (&iir, data[i]); { - FILE *out=fopen("IIR_gen.m","w"); - for(i=0;i<128;i++)fprintf(out,"%g\n",work[i]); - fclose(out); + FILE *out = fopen ("IIR_gen.m", "w"); + + for (i = 0; i < 128; i++) + fprintf (out, "%g\n", work[i]); + fclose (out); } - IIR_clear(&iir); + IIR_clear (&iir); - IIR_init(&iir,NPOLES,GAIN,cheb_bandpass_A,cheb_bandpass_B); - for(i=0;i<128;i++)work[i]=IIR_filter_ChebBand(&iir,data[i]); + IIR_init (&iir, NPOLES, GAIN, cheb_bandpass_A, cheb_bandpass_B); + for (i = 0; i < 128; i++) + work[i] = IIR_filter_ChebBand (&iir, data[i]); { - FILE *out=fopen("IIR_cheb.m","w"); - for(i=0;i<128;i++)fprintf(out,"%g\n",work[i]); - fclose(out); + FILE *out = fopen ("IIR_cheb.m", "w"); + + for (i = 0; i < 128; i++) + fprintf (out, "%g\n", work[i]); + fclose (out); } - IIR_clear(&iir); + IIR_clear (&iir); - return(0); + return (0); } #endif diff --git a/gst/filter/iir.h b/gst/filter/iir.h index 241cc1d2..1cea5663 100644 --- a/gst/filter/iir.h +++ b/gst/filter/iir.h @@ -19,7 +19,8 @@ #ifndef _V_IIR_H_ #define _V_IIR_H_ -typedef struct { +typedef struct +{ int stages; double *coeff_A; double *coeff_B; @@ -29,9 +30,9 @@ typedef struct { double gain; } IIR_state; -void IIR_init(IIR_state *s,int stages,double gain, double *A, double *B); -void IIR_clear(IIR_state *s); -double IIR_filter(IIR_state *s,double in); -double IIR_filter_ChebBand(IIR_state *s,double in); +void IIR_init (IIR_state * s, int stages, double gain, double *A, double *B); +void IIR_clear (IIR_state * s); +double IIR_filter (IIR_state * s, double in); +double IIR_filter_ChebBand (IIR_state * s, double in); #endif diff --git a/gst/flx/flx_color.c b/gst/flx/flx_color.c index b64c90c4..73846845 100644 --- a/gst/flx/flx_color.c +++ b/gst/flx/flx_color.c @@ -27,40 +27,41 @@ #include "flx_color.h" FlxColorSpaceConverter * -flx_colorspace_converter_new(gint width, gint height) +flx_colorspace_converter_new (gint width, gint height) { - FlxColorSpaceConverter *new = g_malloc(sizeof(FlxColorSpaceConverter)); + FlxColorSpaceConverter *new = g_malloc (sizeof (FlxColorSpaceConverter)); new->width = width; new->height = height; - memset(new->palvec, 0, sizeof(new->palvec)); + memset (new->palvec, 0, sizeof (new->palvec)); return new; } void -flx_colorspace_converter_destroy(FlxColorSpaceConverter *flxpal) +flx_colorspace_converter_destroy (FlxColorSpaceConverter * flxpal) { - g_return_if_fail(flxpal != NULL); + g_return_if_fail (flxpal != NULL); - g_free(flxpal); + g_free (flxpal); } void -flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest) +flx_colorspace_convert (FlxColorSpaceConverter * flxpal, guchar * src, + guchar * dest) { guint size, col; - g_return_if_fail(flxpal != NULL); - g_return_if_fail(src != dest); + g_return_if_fail (flxpal != NULL); + g_return_if_fail (src != dest); size = flxpal->width * flxpal->height; - while(size--) { - col = (*src++ * 3); - *dest++ = flxpal->palvec[col+2]; - *dest++ = flxpal->palvec[col+1]; + while (size--) { + col = (*src++ * 3); + *dest++ = flxpal->palvec[col + 2]; + *dest++ = flxpal->palvec[col + 1]; *dest++ = flxpal->palvec[col]; *dest++ = 0; } @@ -68,13 +69,14 @@ flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest } -void -flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, guchar *newpal, gint scale) +void +flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, guint num, + guchar * newpal, gint scale) { - guint grab; - - g_return_if_fail(flxpal != NULL); - g_return_if_fail(start < 0x100); + guint grab; + + g_return_if_fail (flxpal != NULL); + g_return_if_fail (start < 0x100); grab = ((start + num) > 0x100 ? 0x100 - start : num); @@ -88,23 +90,21 @@ flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, g flxpal->palvec[start++] = newpal[i++] << scale; grab--; } - } - else { - memcpy(&flxpal->palvec[start * 3], newpal, grab * 3); + } else { + memcpy (&flxpal->palvec[start * 3], newpal, grab * 3); } } void -flx_set_color(FlxColorSpaceConverter *flxpal, guint colr, guint red, guint green, guint blue, gint scale) +flx_set_color (FlxColorSpaceConverter * flxpal, guint colr, guint red, + guint green, guint blue, gint scale) { - - g_return_if_fail(flxpal != NULL); - g_return_if_fail(colr < 0x100); - flxpal->palvec[(colr * 3)] = red << scale; + g_return_if_fail (flxpal != NULL); + g_return_if_fail (colr < 0x100); + + flxpal->palvec[(colr * 3)] = red << scale; flxpal->palvec[(colr * 3) + 1] = green << scale; flxpal->palvec[(colr * 3) + 2] = blue << scale; } - - diff --git a/gst/flx/flx_color.h b/gst/flx/flx_color.h index d423ab87..2ad852fa 100644 --- a/gst/flx/flx_color.h +++ b/gst/flx/flx_color.h @@ -17,7 +17,8 @@ * Boston, MA 02111-1307, USA. */ -typedef enum { +typedef enum +{ FLX_COLORSPACE_RGB8, FLX_COLORSPACE_RGB32, } FlxColorSpaceType; @@ -25,19 +26,20 @@ typedef enum { typedef struct _FlxColorSpaceConverter FlxColorSpaceConverter; -struct _FlxColorSpaceConverter { - guint width; - guint height; - guchar palvec[768]; +struct _FlxColorSpaceConverter +{ + guint width; + guint height; + guchar palvec[768]; }; -void flx_colorspace_converter_destroy(FlxColorSpaceConverter *flxpal); -void flx_colorspace_convert(FlxColorSpaceConverter *flxpal, guchar *src, guchar *dest); -FlxColorSpaceConverter * flx_colorspace_converter_new(gint width, gint height); - -void flx_set_palette_vector(FlxColorSpaceConverter *flxpal, guint start, guint num, - guchar *newpal, gint scale); -void flx_set_color(FlxColorSpaceConverter *flxpal, guint colr, guint red, guint green, - guint blue, gint scale); +void flx_colorspace_converter_destroy (FlxColorSpaceConverter * flxpal); +void flx_colorspace_convert (FlxColorSpaceConverter * flxpal, guchar * src, + guchar * dest); +FlxColorSpaceConverter *flx_colorspace_converter_new (gint width, gint height); +void flx_set_palette_vector (FlxColorSpaceConverter * flxpal, guint start, + guint num, guchar * newpal, gint scale); +void flx_set_color (FlxColorSpaceConverter * flxpal, guint colr, guint red, + guint green, guint blue, gint scale); diff --git a/gst/flx/flx_fmt.h b/gst/flx/flx_fmt.h index ac2062ed..1457551a 100644 --- a/gst/flx/flx_fmt.h +++ b/gst/flx/flx_fmt.h @@ -24,113 +24,114 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -enum Flx_TypeChunk -{ - /* frame chunks */ - FLX_PREFIX_TYPE = 0xf100, - FLX_SCRIPT_CHUNK = 0xf1e0, - FLX_FRAME_TYPE = 0xf1fa, - FLX_SEGMENT_TABLE = 0xf1fb, - FLX_HUFFMAN_TABLE = 0xf1fc, - - /* sub chunks */ - FLX_CEL_DATA = 3, - FLX_COLOR256 = 4, - FLX_SS2 = 7, - FLX_COLOR64 = 11, - FLX_LC = 12, - FLX_BLACK = 13, - FLX_BRUN = 15, - FLX_COPY = 16, - FLX_MINI = 18, - FLX_DTA_RUN = 25, - FLX_DTA_COPY = 26, - FLX_DTA_LC = 27, - FLX_LABEL = 31, - FLX_BMP_MASK = 32, - FLX_MLEV_MASK = 33, - FLX_SEGMENT = 34, - FLX_KEY_IMAGE = 35, - FLX_KEY_PAL = 36, - FLX_REGION = 37, - FLX_WAVE = 38, - FLX_USERSTRING = 39, - FLX_RGN_MASK = 40, - -}; - -enum Flx_MagicHdr +extern "C" { - FLX_MAGICHDR_FLI = 0xaf11, - FLX_MAGICHDR_FLC = 0xaf12, - FLX_MAGICHDR_FLX = 0xaf44, - FLX_MAGICHDR_HUFFBWT = 0xaf30, -}; - - - -typedef struct _FlxHeader -{ - guint32 size; - guint16 type; - guint16 frames; - guint16 width,height,depth,flags; - guint32 speed; - guint16 reserved1; - /* FLC */ - guint32 created,creator,updated,updater; - guint16 aspect_dx, aspect_dy; - /* EGI */ - guint16 ext_flags,keyframes,totalframes; - guint32 req_memory; - guint16 max_regions,transp_num; - guchar reserved2[24]; - /* FLC */ - guint32 oframe1,oframe2; - guchar reserved3[40]; -} FlxHeader; +#endif /* __cplusplus */ + + enum Flx_TypeChunk + { + /* frame chunks */ + FLX_PREFIX_TYPE = 0xf100, + FLX_SCRIPT_CHUNK = 0xf1e0, + FLX_FRAME_TYPE = 0xf1fa, + FLX_SEGMENT_TABLE = 0xf1fb, + FLX_HUFFMAN_TABLE = 0xf1fc, + + /* sub chunks */ + FLX_CEL_DATA = 3, + FLX_COLOR256 = 4, + FLX_SS2 = 7, + FLX_COLOR64 = 11, + FLX_LC = 12, + FLX_BLACK = 13, + FLX_BRUN = 15, + FLX_COPY = 16, + FLX_MINI = 18, + FLX_DTA_RUN = 25, + FLX_DTA_COPY = 26, + FLX_DTA_LC = 27, + FLX_LABEL = 31, + FLX_BMP_MASK = 32, + FLX_MLEV_MASK = 33, + FLX_SEGMENT = 34, + FLX_KEY_IMAGE = 35, + FLX_KEY_PAL = 36, + FLX_REGION = 37, + FLX_WAVE = 38, + FLX_USERSTRING = 39, + FLX_RGN_MASK = 40, + + }; + + enum Flx_MagicHdr + { + FLX_MAGICHDR_FLI = 0xaf11, + FLX_MAGICHDR_FLC = 0xaf12, + FLX_MAGICHDR_FLX = 0xaf44, + FLX_MAGICHDR_HUFFBWT = 0xaf30, + }; + + + + typedef struct _FlxHeader + { + guint32 size; + guint16 type; + guint16 frames; + guint16 width, height, depth, flags; + guint32 speed; + guint16 reserved1; + /* FLC */ + guint32 created, creator, updated, updater; + guint16 aspect_dx, aspect_dy; + /* EGI */ + guint16 ext_flags, keyframes, totalframes; + guint32 req_memory; + guint16 max_regions, transp_num; + guchar reserved2[24]; + /* FLC */ + guint32 oframe1, oframe2; + guchar reserved3[40]; + } FlxHeader; #define FlxHeaderSize 128 -typedef struct _FlxFrameChunk -{ - guint32 size; - guint16 id; -} FlxFrameChunk; + typedef struct _FlxFrameChunk + { + guint32 size; + guint16 id; + } FlxFrameChunk; #define FlxFrameChunkSize 6 -typedef struct _FlxPrefixChunk -{ - guint16 chunks; - guchar reserved[8]; -} FlxPrefixChunk; - -typedef struct _FlxSegmentTable -{ - guint16 segments; -} FlxSegmentTable; - -typedef struct _FlxHuffmanTable -{ - guint16 codelength; - guint16 numcodes; - guchar reserved[6]; -} FlxHuffmanTable; - -typedef struct _FlxFrameType -{ - guint16 chunks; - guint16 delay; - guchar reserved[6]; -} FlxFrameType; + typedef struct _FlxPrefixChunk + { + guint16 chunks; + guchar reserved[8]; + } FlxPrefixChunk; + + typedef struct _FlxSegmentTable + { + guint16 segments; + } FlxSegmentTable; + + typedef struct _FlxHuffmanTable + { + guint16 codelength; + guint16 numcodes; + guchar reserved[6]; + } FlxHuffmanTable; + + typedef struct _FlxFrameType + { + guint16 chunks; + guint16 delay; + guchar reserved[6]; + } FlxFrameType; #define FlxFrameTypeSize 10 #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_FLX_FMT_H__ */ +#endif /* __GST_FLX_FMT_H__ */ diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c index aaddee58..a84ce2d2 100644 --- a/gst/flx/gstflxdec.c +++ b/gst/flx/gstflxdec.c @@ -37,120 +37,122 @@ static GstElementDetails flxdec_details = { }; /* Flx signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; /* input */ -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "video/x-fli" ) -); +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-fli") + ); /* output */ -static GstStaticPadTemplate src_video_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( GST_VIDEO_CAPS_xRGB_HOST_ENDIAN ) -); +static GstStaticPadTemplate src_video_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN) + ); -static void gst_flxdec_class_init (GstFlxDecClass *klass); -static void gst_flxdec_base_init (GstFlxDecClass *klass); -static void gst_flxdec_init (GstFlxDec *flxdec); +static void gst_flxdec_class_init (GstFlxDecClass * klass); +static void gst_flxdec_base_init (GstFlxDecClass * klass); +static void gst_flxdec_init (GstFlxDec * flxdec); -static void gst_flxdec_loop (GstElement *element); +static void gst_flxdec_loop (GstElement * element); -static GstElementStateReturn - gst_flxdec_change_state (GstElement *element); +static GstElementStateReturn gst_flxdec_change_state (GstElement * element); -static void gst_flxdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_flxdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_flxdec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_flxdec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); -static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); -static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); -static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); +static void flx_decode_color (GstFlxDec *, guchar *, guchar *, gint); +static void flx_decode_brun (GstFlxDec *, guchar *, guchar *); +static void flx_decode_delta_fli (GstFlxDec *, guchar *, guchar *); +static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *); #define rndalign(off) ((off) + ((off) % 2)) static GstElementClass *parent_class = NULL; GType -gst_flxdec_get_type(void) +gst_flxdec_get_type (void) { static GType flxdec_type = 0; if (!flxdec_type) { static const GTypeInfo flxdec_info = { - sizeof(GstFlxDecClass), - (GBaseInitFunc)gst_flxdec_base_init, + sizeof (GstFlxDecClass), + (GBaseInitFunc) gst_flxdec_base_init, NULL, - (GClassInitFunc)gst_flxdec_class_init, + (GClassInitFunc) gst_flxdec_class_init, NULL, NULL, - sizeof(GstFlxDec), + sizeof (GstFlxDec), 0, - (GInstanceInitFunc)gst_flxdec_init, + (GInstanceInitFunc) gst_flxdec_init, }; - flxdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstFlxDec", &flxdec_info, 0); + flxdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstFlxDec", &flxdec_info, 0); } return flxdec_type; } static void -gst_flxdec_base_init (GstFlxDecClass *klass) +gst_flxdec_base_init (GstFlxDecClass * klass) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); - + gst_element_class_set_details (gstelement_class, &flxdec_details); gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&sink_factory)); + gst_static_pad_template_get (&sink_factory)); gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&src_video_factory)); + gst_static_pad_template_get (&src_video_factory)); } -static void -gst_flxdec_class_init (GstFlxDecClass *klass) +static void +gst_flxdec_class_init (GstFlxDecClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - gobject_class->set_property = gst_flxdec_set_property; + gobject_class->set_property = gst_flxdec_set_property; gobject_class->get_property = gst_flxdec_get_property; gstelement_class->change_state = gst_flxdec_change_state; } - -static void -gst_flxdec_init(GstFlxDec *flxdec) + +static void +gst_flxdec_init (GstFlxDec * flxdec) { - flxdec->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_factory), "sink"); - gst_element_add_pad(GST_ELEMENT(flxdec),flxdec->sinkpad); - gst_element_set_loop_function(GST_ELEMENT(flxdec),gst_flxdec_loop); + flxdec->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), + "sink"); + gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->sinkpad); + gst_element_set_loop_function (GST_ELEMENT (flxdec), gst_flxdec_loop); - flxdec->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_video_factory), "src"); - gst_element_add_pad(GST_ELEMENT(flxdec),flxdec->srcpad); + flxdec->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&src_video_factory), "src"); + gst_element_add_pad (GST_ELEMENT (flxdec), flxdec->srcpad); flxdec->bs = NULL; flxdec->frame = NULL; @@ -158,75 +160,74 @@ gst_flxdec_init(GstFlxDec *flxdec) } static void -flx_decode_chunks (GstFlxDec *flxdec , gulong count, gchar *data, gchar *dest) +flx_decode_chunks (GstFlxDec * flxdec, gulong count, gchar * data, gchar * dest) { - FlxFrameChunk *hdr; + FlxFrameChunk *hdr; - g_return_if_fail(data != NULL); + g_return_if_fail (data != NULL); while (count--) { - hdr = (FlxFrameChunk *) data; + hdr = (FlxFrameChunk *) data; data += FlxFrameChunkSize; - switch(hdr->id) - { + switch (hdr->id) { case FLX_COLOR64: - flx_decode_color(flxdec, data, dest, 2); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_color (flxdec, data, dest, 2); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_COLOR256: - flx_decode_color(flxdec, data, dest, 0); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_color (flxdec, data, dest, 0); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_BRUN: - flx_decode_brun(flxdec, data, dest); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_brun (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_LC: - flx_decode_delta_fli(flxdec, data, dest); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_delta_fli (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_SS2: - flx_decode_delta_flc(flxdec, data, dest); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + flx_decode_delta_flc (flxdec, data, dest); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; case FLX_BLACK: - memset(dest, 0, flxdec->size); - break; + memset (dest, 0, flxdec->size); + break; case FLX_MINI: - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; default: - g_print("GstFlxDec: Unimplented chunk type: 0x%02x size: %d\n", - hdr->id, hdr->size); - g_print("GstFlxDec: Skipping...\n"); - data += rndalign(hdr->size) - FlxFrameChunkSize; - break; + g_print ("GstFlxDec: Unimplented chunk type: 0x%02x size: %d\n", + hdr->id, hdr->size); + g_print ("GstFlxDec: Skipping...\n"); + data += rndalign (hdr->size) - FlxFrameChunkSize; + break; } } } static void -flx_decode_color(GstFlxDec *flxdec, guchar *data, guchar *dest, gint scale) +flx_decode_color (GstFlxDec * flxdec, guchar * data, guchar * dest, gint scale) { guint packs, count, indx; - g_return_if_fail(flxdec != NULL); + g_return_if_fail (flxdec != NULL); packs = (data[0] + (data[1] << 8)); data += 2; - indx = 0; + indx = 0; - g_print("GstFlxDec: cmap packs: %d\n", packs); + g_print ("GstFlxDec: cmap packs: %d\n", packs); while (packs--) { /* color map index + skip count */ indx += *data++; @@ -236,23 +237,23 @@ flx_decode_color(GstFlxDec *flxdec, guchar *data, guchar *dest, gint scale) if (count == 0) count = 256; - g_print("GstFlxDec: cmap count: %d (indx: %d)\n", count, indx); - flx_set_palette_vector(flxdec->converter, indx, count, data, scale); + g_print ("GstFlxDec: cmap count: %d (indx: %d)\n", count, indx); + flx_set_palette_vector (flxdec->converter, indx, count, data, scale); data += (count * 3); } } -static void -flx_decode_brun(GstFlxDec *flxdec, guchar *data, guchar *dest) +static void +flx_decode_brun (GstFlxDec * flxdec, guchar * data, guchar * dest) { - gulong count, lines, row; - guchar x; - - g_return_if_fail(flxdec != NULL); + gulong count, lines, row; + guchar x; + + g_return_if_fail (flxdec != NULL); lines = flxdec->hdr.height; - while(lines--) { + while (lines--) { /* packet count. * should not be used anymore, since the flc format can * contain more then 255 RLE packets. we use the frame @@ -261,101 +262,101 @@ flx_decode_brun(GstFlxDec *flxdec, guchar *data, guchar *dest) data++; row = flxdec->hdr.width; - while(row) { + while (row) { count = *data++; - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; - row -= count; + if (count > 0x7f) { + /* literal run */ + count = 0x100 - count; + row -= count; + + while (count--) + *dest++ = *data++; - while(count--) - *dest++ = *data++; - } else { - /* replicate run */ - row -= count; - x = *data++; + /* replicate run */ + row -= count; + x = *data++; - while(count--) - *dest++ = x; + while (count--) + *dest++ = x; } } } } -static void -flx_decode_delta_fli(GstFlxDec *flxdec, guchar *data, guchar *dest) +static void +flx_decode_delta_fli (GstFlxDec * flxdec, guchar * data, guchar * dest) { - gulong count, packets, lines, start_line, start_l; - guchar *start_p, x; - - g_return_if_fail(flxdec != NULL); - g_return_if_fail(flxdec->delta != NULL); + gulong count, packets, lines, start_line, start_l; + guchar *start_p, x; + + g_return_if_fail (flxdec != NULL); + g_return_if_fail (flxdec->delta != NULL); /* use last frame for delta */ - memcpy(dest, GST_BUFFER_DATA(flxdec->delta), - GST_BUFFER_SIZE(flxdec->delta)); + memcpy (dest, GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_SIZE (flxdec->delta)); start_line = (data[0] + (data[1] << 8)); - lines = (data[2] + (data[3] << 8)); - data += 4; + lines = (data[2] + (data[3] << 8)); + data += 4; /* start position of delta */ dest += (flxdec->hdr.width * start_line); start_p = dest; start_l = lines; - while(lines--) { + while (lines--) { /* packet count */ packets = *data++; - while(packets--) { + while (packets--) { /* skip count */ dest += *data++; /* RLE count */ count = *data++; - if (count > 0x7f) { - /* literal run */ - count = 0x100 - count; - x = *data++; + if (count > 0x7f) { + /* literal run */ + count = 0x100 - count; + x = *data++; - while (count--) - *dest++ = x; + while (count--) + *dest++ = x; } else { - /* replicate run */ - while (count--) - *dest++ = *data++; + /* replicate run */ + while (count--) + *dest++ = *data++; } } start_p += flxdec->hdr.width; dest = start_p; - } + } } -static void -flx_decode_delta_flc(GstFlxDec *flxdec, guchar *data, guchar *dest) +static void +flx_decode_delta_flc (GstFlxDec * flxdec, guchar * data, guchar * dest) { - gulong count, lines, start_l, opcode; - guchar *start_p; - - g_return_if_fail(flxdec != NULL); - g_return_if_fail(flxdec->delta != NULL); + gulong count, lines, start_l, opcode; + guchar *start_p; + + g_return_if_fail (flxdec != NULL); + g_return_if_fail (flxdec->delta != NULL); /* use last frame for delta */ - memcpy(dest, GST_BUFFER_DATA(flxdec->delta), - GST_BUFFER_SIZE(flxdec->delta)); + memcpy (dest, GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_SIZE (flxdec->delta)); - lines = (data[0] + (data[1] << 8)); - data += 2; + lines = (data[0] + (data[1] << 8)); + data += 2; - start_p = dest; - start_l = lines; + start_p = dest; + start_l = lines; while (lines) { dest = start_p + (flxdec->hdr.width * (start_l - lines)); @@ -364,47 +365,47 @@ flx_decode_delta_flc(GstFlxDec *flxdec, guchar *data, guchar *dest) while ((opcode = (data[0] + (data[1] << 8))) & 0xc000) { data += 2; if ((opcode & 0xc000) == 0xc000) { - /* skip count */ - start_l += (0x10000 - opcode); - dest += flxdec->hdr.width * (0x10000 - opcode); + /* skip count */ + start_l += (0x10000 - opcode); + dest += flxdec->hdr.width * (0x10000 - opcode); } else { - /* last pixel */ - dest += flxdec->hdr.width; - *dest++ = (opcode & 0xff); - } + /* last pixel */ + dest += flxdec->hdr.width; + *dest++ = (opcode & 0xff); + } } data += 2; /* last opcode is the packet count */ - while(opcode--) { + while (opcode--) { /* skip count */ dest += *data++; - + /* RLE count */ count = *data++; - + if (count > 0x7f) { - /* replicate word run */ - count = 0x100 - count; - while (count--) { - *dest++ = data[0]; - *dest++ = data[1]; - } - data += 2; + /* replicate word run */ + count = 0x100 - count; + while (count--) { + *dest++ = data[0]; + *dest++ = data[1]; + } + data += 2; } else { - /* literal word run */ - while (count--) { - *dest++ = *data++; - *dest++ = *data++; - } + /* literal word run */ + while (count--) { + *dest++ = *data++; + *dest++ = *data++; + } } } lines--; } } - -static GstBuffer* -flx_get_data(GstFlxDec *flxdec, gulong size) + +static GstBuffer * +flx_get_data (GstFlxDec * flxdec, gulong size) { GstBuffer *retbuf; guint32 got_bytes; @@ -424,36 +425,36 @@ flx_get_data(GstFlxDec *flxdec, gulong size) } -static void -gst_flxdec_loop (GstElement *element) +static void +gst_flxdec_loop (GstElement * element) { - GstBuffer *buf; - GstBuffer *databuf; - guchar *data, *chunk; - GstCaps *caps; - - GstFlxDec *flxdec; - FlxHeader *flxh; - FlxFrameChunk *flxfh; - + GstBuffer *buf; + GstBuffer *databuf; + guchar *data, *chunk; + GstCaps *caps; + + GstFlxDec *flxdec; + FlxHeader *flxh; + FlxFrameChunk *flxfh; + g_return_if_fail (element != NULL); - g_return_if_fail (GST_IS_FLXDEC(element)); + g_return_if_fail (GST_IS_FLXDEC (element)); GST_DEBUG ("entering loop function"); - - flxdec = GST_FLXDEC(element); + + flxdec = GST_FLXDEC (element); if (flxdec->state == GST_FLXDEC_READ_HEADER) { - databuf = flx_get_data(flxdec, FlxHeaderSize); + databuf = flx_get_data (flxdec, FlxHeaderSize); if (!databuf) { g_print ("empty buffer\n"); return; } - data = GST_BUFFER_DATA(databuf); + data = GST_BUFFER_DATA (databuf); - memcpy((char *) &flxdec->hdr, data, sizeof(FlxHeader)); + memcpy ((char *) &flxdec->hdr, data, sizeof (FlxHeader)); gst_buffer_unref (databuf); @@ -461,119 +462,115 @@ gst_flxdec_loop (GstElement *element) /* check header */ if (flxh->type != FLX_MAGICHDR_FLI && - flxh->type != FLX_MAGICHDR_FLC && - flxh->type != FLX_MAGICHDR_FLX) { - GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), ("not a flx file (type %d)\n", flxh->type)); + flxh->type != FLX_MAGICHDR_FLC && flxh->type != FLX_MAGICHDR_FLX) { + GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), + ("not a flx file (type %d)\n", flxh->type)); return; } - - - g_print("GstFlxDec: size : %d\n", flxh->size); - g_print("GstFlxDec: frames : %d\n", flxh->frames); - g_print("GstFlxDec: width : %d\n", flxh->width); - g_print("GstFlxDec: height : %d\n", flxh->height); - g_print("GstFlxDec: depth : %d\n", flxh->depth); - g_print("GstFlxDec: speed : %d\n", flxh->speed); + + + g_print ("GstFlxDec: size : %d\n", flxh->size); + g_print ("GstFlxDec: frames : %d\n", flxh->frames); + g_print ("GstFlxDec: width : %d\n", flxh->width); + g_print ("GstFlxDec: height : %d\n", flxh->height); + g_print ("GstFlxDec: depth : %d\n", flxh->depth); + g_print ("GstFlxDec: speed : %d\n", flxh->speed); flxdec->next_time = 0; if (flxh->type == FLX_MAGICHDR_FLI) { flxdec->frame_time = JIFFIE * flxh->speed; - } - else { + } else { flxdec->frame_time = flxh->speed * GST_MSECOND; } - + caps = gst_caps_from_string (GST_VIDEO_CAPS_xRGB_HOST_ENDIAN); gst_caps_set_simple (caps, - "width", G_TYPE_INT, flxh->width, + "width", G_TYPE_INT, flxh->width, "height", G_TYPE_INT, flxh->height, - "framerate", G_TYPE_DOUBLE, GST_SECOND/flxdec->frame_time, NULL); + "framerate", G_TYPE_DOUBLE, GST_SECOND / flxdec->frame_time, NULL); - if (flxh->depth <= 8) - flxdec->converter = flx_colorspace_converter_new(flxh->width, flxh->height); + if (flxh->depth <= 8) + flxdec->converter = + flx_colorspace_converter_new (flxh->width, flxh->height); - if (flxh->type == FLX_MAGICHDR_FLC || - flxh->type == FLX_MAGICHDR_FLX) { - g_print("GstFlxDec: (FLC) aspect_dx : %d\n", flxh->aspect_dx); - g_print("GstFlxDec: (FLC) aspect_dy : %d\n", flxh->aspect_dy); - g_print("GstFlxDec: (FLC) oframe1 : 0x%08x\n", flxh->oframe1); - g_print("GstFlxDec: (FLC) oframe2 : 0x%08x\n", flxh->oframe2); + if (flxh->type == FLX_MAGICHDR_FLC || flxh->type == FLX_MAGICHDR_FLX) { + g_print ("GstFlxDec: (FLC) aspect_dx : %d\n", flxh->aspect_dx); + g_print ("GstFlxDec: (FLC) aspect_dy : %d\n", flxh->aspect_dy); + g_print ("GstFlxDec: (FLC) oframe1 : 0x%08x\n", flxh->oframe1); + g_print ("GstFlxDec: (FLC) oframe2 : 0x%08x\n", flxh->oframe2); } - + flxdec->size = (flxh->width * flxh->height); - + /* create delta and output frame */ - flxdec->frame = gst_buffer_new(); - flxdec->delta = gst_buffer_new(); - GST_BUFFER_DATA(flxdec->frame) = g_malloc(flxdec->size); - GST_BUFFER_SIZE(flxdec->frame) = flxdec->size; - GST_BUFFER_DATA(flxdec->delta) = g_malloc(flxdec->size); - GST_BUFFER_SIZE(flxdec->delta) = flxdec->size; + flxdec->frame = gst_buffer_new (); + flxdec->delta = gst_buffer_new (); + GST_BUFFER_DATA (flxdec->frame) = g_malloc (flxdec->size); + GST_BUFFER_SIZE (flxdec->frame) = flxdec->size; + GST_BUFFER_DATA (flxdec->delta) = g_malloc (flxdec->size); + GST_BUFFER_SIZE (flxdec->delta) = flxdec->size; flxdec->state = GST_FLXDEC_PLAYING; - } - else if (flxdec->state == GST_FLXDEC_PLAYING) { + } else if (flxdec->state == GST_FLXDEC_PLAYING) { GstBuffer *out; - databuf = flx_get_data(flxdec, FlxFrameChunkSize); + databuf = flx_get_data (flxdec, FlxFrameChunkSize); if (!databuf) return; - flxfh = (FlxFrameChunk *) GST_BUFFER_DATA(databuf); - - switch(flxfh->id) { + flxfh = (FlxFrameChunk *) GST_BUFFER_DATA (databuf); + + switch (flxfh->id) { case FLX_FRAME_TYPE: - buf = flx_get_data(flxdec, flxfh->size-FlxFrameChunkSize); - - chunk = GST_BUFFER_DATA(buf); - - if (((FlxFrameType *)chunk)->chunks == 0) - break; - - /* create 32 bits output frame */ - out = gst_buffer_new(); - GST_BUFFER_DATA(out) = g_malloc(flxdec->size * 4); - GST_BUFFER_SIZE(out) = flxdec->size * 4; - - /* decode chunks */ - flx_decode_chunks(flxdec, - ((FlxFrameType *)chunk)->chunks, - GST_BUFFER_DATA(buf) + FlxFrameTypeSize, - GST_BUFFER_DATA(flxdec->frame)); - - /* destroy input buffer*/ - gst_buffer_unref(buf); - - /* save copy of the current frame for possible delta. */ - memcpy(GST_BUFFER_DATA(flxdec->delta), - GST_BUFFER_DATA(flxdec->frame), - GST_BUFFER_SIZE(flxdec->delta)); - - /* convert current frame. */ - flx_colorspace_convert(flxdec->converter, - GST_BUFFER_DATA(flxdec->frame), - GST_BUFFER_DATA(out)); + buf = flx_get_data (flxdec, flxfh->size - FlxFrameChunkSize); + + chunk = GST_BUFFER_DATA (buf); + + if (((FlxFrameType *) chunk)->chunks == 0) + break; + + /* create 32 bits output frame */ + out = gst_buffer_new (); + GST_BUFFER_DATA (out) = g_malloc (flxdec->size * 4); + GST_BUFFER_SIZE (out) = flxdec->size * 4; + + /* decode chunks */ + flx_decode_chunks (flxdec, + ((FlxFrameType *) chunk)->chunks, + GST_BUFFER_DATA (buf) + FlxFrameTypeSize, + GST_BUFFER_DATA (flxdec->frame)); + + /* destroy input buffer */ + gst_buffer_unref (buf); + + /* save copy of the current frame for possible delta. */ + memcpy (GST_BUFFER_DATA (flxdec->delta), + GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_SIZE (flxdec->delta)); + + /* convert current frame. */ + flx_colorspace_convert (flxdec->converter, + GST_BUFFER_DATA (flxdec->frame), GST_BUFFER_DATA (out)); GST_BUFFER_TIMESTAMP (out) = flxdec->next_time; flxdec->next_time += flxdec->frame_time; - gst_pad_push(flxdec->srcpad, GST_DATA (out)); - - break; + gst_pad_push (flxdec->srcpad, GST_DATA (out)); + + break; } /* destroy header buffer */ - gst_buffer_unref(databuf); + gst_buffer_unref (databuf); } } -static GstElementStateReturn -gst_flxdec_change_state (GstElement *element) +static GstElementStateReturn +gst_flxdec_change_state (GstElement * element) { GstFlxDec *flxdec; - flxdec = GST_FLXDEC(element); + flxdec = GST_FLXDEC (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: @@ -596,20 +593,21 @@ gst_flxdec_change_state (GstElement *element) case GST_STATE_READY_TO_NULL: break; } - + parent_class->change_state (element); return GST_STATE_SUCCESS; } -static void -gst_flxdec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +static void +gst_flxdec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstFlxDec *flxdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_FLXDEC(object)); - flxdec = GST_FLXDEC(object); + g_return_if_fail (GST_IS_FLXDEC (object)); + flxdec = GST_FLXDEC (object); switch (prop_id) { default: @@ -617,14 +615,15 @@ gst_flxdec_set_property (GObject *object, guint prop_id, const GValue *value, GP } } -static void -gst_flxdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +static void +gst_flxdec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstFlxDec *flxdec; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_FLXDEC(object)); - flxdec = GST_FLXDEC(object); + g_return_if_fail (GST_IS_FLXDEC (object)); + flxdec = GST_FLXDEC (object); switch (prop_id) { default: @@ -634,23 +633,17 @@ gst_flxdec_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstbytestream")) return FALSE; return gst_element_register (plugin, "flxdec", - GST_RANK_PRIMARY, GST_TYPE_FLXDEC); + GST_RANK_PRIMARY, GST_TYPE_FLXDEC); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "flxdec", - "FLX video decoder", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "flxdec", + "FLX video decoder", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/flx/gstflxdec.h b/gst/flx/gstflxdec.h index c7d6f386..c5ce60ec 100644 --- a/gst/flx/gstflxdec.h +++ b/gst/flx/gstflxdec.h @@ -27,42 +27,46 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ + + typedef enum + { + GST_FLXDEC_READ_HEADER, + GST_FLXDEC_PLAYING, + } GstFlxDecState; -typedef enum { - GST_FLXDEC_READ_HEADER, - GST_FLXDEC_PLAYING, -} GstFlxDecState; - /* Definition of structure storing data for this element. */ -typedef struct _GstFlxDec GstFlxDec; + typedef struct _GstFlxDec GstFlxDec; -struct _GstFlxDec { - GstElement element; + struct _GstFlxDec + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gboolean active, new_meta; + gboolean active, new_meta; - GstBuffer *delta, *frame; - GstByteStream *bs; - gulong size; - GstFlxDecState state; - glong frame_time; - gint64 next_time; + GstBuffer *delta, *frame; + GstByteStream *bs; + gulong size; + GstFlxDecState state; + glong frame_time; + gint64 next_time; - FlxColorSpaceConverter *converter; + FlxColorSpaceConverter *converter; - FlxHeader hdr; -}; + FlxHeader hdr; + }; /* Standard definition defining a class for this element. */ -typedef struct _GstFlxDecClass GstFlxDecClass; -struct _GstFlxDecClass { - GstElementClass parent_class; -}; + typedef struct _GstFlxDecClass GstFlxDecClass; + struct _GstFlxDecClass + { + GstElementClass parent_class; + }; /* Standard macros for defining types for this element. */ #define GST_TYPE_FLXDEC \ @@ -77,12 +81,12 @@ struct _GstFlxDecClass { (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLXDEC)) /* Standard function returning type information. */ -GType gst_flxdec_get_type(void); + GType gst_flxdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_FLX_DECODER_H__ */ +#endif /* __GST_FLX_DECODER_H__ */ diff --git a/gst/mixmatrix/mixmatrix.c b/gst/mixmatrix/mixmatrix.c index 0551cac0..f7095e27 100644 --- a/gst/mixmatrix/mixmatrix.c +++ b/gst/mixmatrix/mixmatrix.c @@ -40,7 +40,8 @@ typedef struct _GstMixMatrix GstMixMatrix; typedef struct _GstMixMatrixClass GstMixMatrixClass; -struct _GstMixMatrix { +struct _GstMixMatrix +{ GstElement element; GstCaps *caps; @@ -59,10 +60,11 @@ struct _GstMixMatrix { gfloat **matrix; }; -struct _GstMixMatrixClass { +struct _GstMixMatrixClass +{ GstElementClass parent_class; - void (*resize) (GstMixMatrix *mix); + void (*resize) (GstMixMatrix * mix); }; /* elementfactory information */ @@ -73,13 +75,15 @@ static GstElementDetails mixmatrix_details = { "Erik Walthinsen " }; -enum { +enum +{ /* FILL ME */ RESIZE_SIGNAL, LAST_SIGNAL, }; -enum { +enum +{ ARG_0, ARG_GRPSIZE, ARG_OUTSIZE, @@ -89,59 +93,64 @@ enum { }; static GstStaticPadTemplate mixmatrix_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS ) -); +GST_STATIC_PAD_TEMPLATE ("sink%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); static GstStaticPadTemplate mixmatrix_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src%d", - GST_PAD_SRC, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS ) -); +GST_STATIC_PAD_TEMPLATE ("src%d", + GST_PAD_SRC, + GST_PAD_REQUEST, + GST_STATIC_CAPS (GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); -static void gst_mixmatrix_class_init (GstMixMatrixClass *klass); -static void gst_mixmatrix_base_init (GstMixMatrixClass *klass); -static void gst_mixmatrix_init (GstMixMatrix *element); +static void gst_mixmatrix_class_init (GstMixMatrixClass * klass); +static void gst_mixmatrix_base_init (GstMixMatrixClass * klass); +static void gst_mixmatrix_init (GstMixMatrix * element); -static void gst_mixmatrix_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_mixmatrix_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static GstPad * gst_mixmatrix_request_new_pad (GstElement *element, GstPadTemplate *temp, const gchar *name); +static void gst_mixmatrix_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mixmatrix_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstPad *gst_mixmatrix_request_new_pad (GstElement * element, + GstPadTemplate * temp, const gchar * name); -static GstPadLinkReturn gst_mixmatrix_connect (GstPad *pad, const GstCaps *caps); +static GstPadLinkReturn gst_mixmatrix_connect (GstPad * pad, + const GstCaps * caps); -static void gst_mixmatrix_loop (GstElement *element); +static void gst_mixmatrix_loop (GstElement * element); -static guint gst_mixmatrix_signals[LAST_SIGNAL] = { 0 }; -static GstElementClass *parent_class = NULL; +static guint gst_mixmatrix_signals[LAST_SIGNAL] = { 0 }; +static GstElementClass *parent_class = NULL; GType -gst_mixmatrix_get_type(void) { +gst_mixmatrix_get_type (void) +{ static GType mixmatrix_type = 0; if (!mixmatrix_type) { static const GTypeInfo mixmatrix_info = { - sizeof(GstMixMatrixClass), - (GBaseInitFunc)gst_mixmatrix_base_init, + sizeof (GstMixMatrixClass), + (GBaseInitFunc) gst_mixmatrix_base_init, NULL, - (GClassInitFunc)gst_mixmatrix_class_init, + (GClassInitFunc) gst_mixmatrix_class_init, NULL, NULL, - sizeof(GstMixMatrix), + sizeof (GstMixMatrix), 0, - (GInstanceInitFunc)gst_mixmatrix_init, + (GInstanceInitFunc) gst_mixmatrix_init, }; - mixmatrix_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMixMatrix", &mixmatrix_info, 0); + mixmatrix_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMixMatrix", + &mixmatrix_info, 0); } return mixmatrix_type; } static void -gst_mixmatrix_base_init (GstMixMatrixClass *klass) +gst_mixmatrix_base_init (GstMixMatrixClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -153,36 +162,34 @@ gst_mixmatrix_base_init (GstMixMatrixClass *klass) } static void -gst_mixmatrix_class_init (GstMixMatrixClass *klass) +gst_mixmatrix_class_init (GstMixMatrixClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass *)klass; - gstelement_class = (GstElementClass *)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gst_mixmatrix_signals[RESIZE_SIGNAL] = - g_signal_new("resize", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstMixMatrixClass, resize), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SINKPADS, - g_param_spec_int("sinkpads","Sink Pads","Number of sink pads in matrix", - 0, G_MAXINT, 8, G_PARAM_READABLE)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SRCPADS, - g_param_spec_int("srcpads","Src Pads","Number of src pads in matrix", - 0, G_MAXINT, 8, G_PARAM_READABLE)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MATRIXPTR, - g_param_spec_pointer("matrixptr","Matrix Pointer","Pointer to gfloat mix matrix", - G_PARAM_READABLE)); + g_signal_new ("resize", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstMixMatrixClass, resize), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SINKPADS, + g_param_spec_int ("sinkpads", "Sink Pads", + "Number of sink pads in matrix", 0, G_MAXINT, 8, G_PARAM_READABLE)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SRCPADS, + g_param_spec_int ("srcpads", "Src Pads", "Number of src pads in matrix", + 0, G_MAXINT, 8, G_PARAM_READABLE)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MATRIXPTR, + g_param_spec_pointer ("matrixptr", "Matrix Pointer", + "Pointer to gfloat mix matrix", G_PARAM_READABLE)); gobject_class->set_property = gst_mixmatrix_set_property; gobject_class->get_property = gst_mixmatrix_get_property; @@ -190,32 +197,34 @@ gst_mixmatrix_class_init (GstMixMatrixClass *klass) } static gfloat ** -mixmatrix_alloc_matrix (int x,int y) +mixmatrix_alloc_matrix (int x, int y) { gfloat **matrix; int i; - GST_DEBUG ("mixmatrix: allocating a %dx%d matrix of floats\n",x,y); - matrix = g_new(gfloat *,x); - GST_DEBUG ("mixmatrix: %p: ",matrix); - for (i=0;igrpsize = 8; mix->outsize = 1024; @@ -225,29 +234,31 @@ gst_mixmatrix_init (GstMixMatrix *mix) mix->srcpadalloc = mix->grpsize; // allocate the pads - mix->sinkpads = g_new(GstPad *,mix->sinkpadalloc); - mix->sinkbs = g_new(GstByteStream *,mix->sinkpadalloc); + mix->sinkpads = g_new (GstPad *, mix->sinkpadalloc); + mix->sinkbs = g_new (GstByteStream *, mix->sinkpadalloc); - mix->srcpads = g_new(GstPad *,mix->srcpadalloc); + mix->srcpads = g_new (GstPad *, mix->srcpadalloc); // allocate a similarly sized matrix - mix->matrix = mixmatrix_alloc_matrix(mix->sinkpadalloc,mix->srcpadalloc); + mix->matrix = mixmatrix_alloc_matrix (mix->sinkpadalloc, mix->srcpadalloc); // set the loop function that does all the work - gst_element_set_loop_function(GST_ELEMENT(mix), gst_mixmatrix_loop); + gst_element_set_loop_function (GST_ELEMENT (mix), gst_mixmatrix_loop); } #define ROUND_UP(val,bound) ((((val)/bound)+1)*bound) -static void **grow_ptrlist(void **origlist,int origsize,int newsize) { - void **newlist = g_new(void *,newsize); - memcpy(newlist,origlist,sizeof(void*)*origsize); - g_free(origlist); +static void ** +grow_ptrlist (void **origlist, int origsize, int newsize) +{ + void **newlist = g_new (void *, newsize); + memcpy (newlist, origlist, sizeof (void *) * origsize); + g_free (origlist); return newlist; } void -mixmatrix_resize(GstMixMatrix *mix, int sinkpads, int srcpads) +mixmatrix_resize (GstMixMatrix * mix, int sinkpads, int srcpads) { int sinkresize = (sinkpads != mix->sinkpadalloc); int srcresize = (srcpads != mix->srcpadalloc); @@ -259,32 +270,37 @@ mixmatrix_resize(GstMixMatrix *mix, int sinkpads, int srcpads) // check the sinkpads list if (sinkresize) { - mix->sinkpads = (GstPad **)grow_ptrlist((void **)mix->sinkpads,mix->sinkpadalloc,sinkpads); - mix->sinkbs = (GstByteStream **)grow_ptrlist((void **)mix->sinkbs,mix->sinkpadalloc,sinkpads); + mix->sinkpads = + (GstPad **) grow_ptrlist ((void **) mix->sinkpads, mix->sinkpadalloc, + sinkpads); + mix->sinkbs = + (GstByteStream **) grow_ptrlist ((void **) mix->sinkbs, + mix->sinkpadalloc, sinkpads); } - // check the srcpads list if (srcresize) { - mix->srcpads = (GstPad **)grow_ptrlist((void **)mix->srcpads,mix->srcpadalloc,srcpads); + mix->srcpads = + (GstPad **) grow_ptrlist ((void **) mix->srcpads, mix->srcpadalloc, + srcpads); } - // now resize the matrix if either has changed if (sinkresize || srcresize) { // allocate the new matrix - newmatrix = mixmatrix_alloc_matrix(sinkpads,srcpads); + newmatrix = mixmatrix_alloc_matrix (sinkpads, srcpads); // if only the srcpad count changed (y axis), we can just copy if (!sinkresize) { - memcpy(newmatrix,mix->matrix,sizeof(gfloat *)*sinkpads); - // otherwise we have to copy line by line + memcpy (newmatrix, mix->matrix, sizeof (gfloat *) * sinkpads); + // otherwise we have to copy line by line } else { - for (i=0;isrcpadalloc;i++) - memcpy(newmatrix[i], mix->matrix[i], sizeof(gfloat) * mix->srcpadalloc); + for (i = 0; i < mix->srcpadalloc; i++) + memcpy (newmatrix[i], mix->matrix[i], + sizeof (gfloat) * mix->srcpadalloc); } // would signal here! // free old matrix and replace it - mixmatrix_free_matrix(mix->matrix, mix->sinkpadalloc); + mixmatrix_free_matrix (mix->matrix, mix->sinkpadalloc); mix->matrix = newmatrix; } @@ -319,76 +335,79 @@ gst_mixmatrix_set_all_caps (GstMixMatrix *mix) */ static GstPadLinkReturn -gst_mixmatrix_connect (GstPad *pad, const GstCaps *caps) +gst_mixmatrix_connect (GstPad * pad, const GstCaps * caps) { - GstMixMatrix *mix = GST_MIXMATRIX(GST_PAD_PARENT(pad)); + GstMixMatrix *mix = GST_MIXMATRIX (GST_PAD_PARENT (pad)); gint i; - for (i=0;isrcpadalloc;i++) { + for (i = 0; i < mix->srcpadalloc; i++) { if (mix->srcpads[i]) { - if (GST_PAD_CAPS(mix->srcpads[i]) == NULL) { - if (gst_pad_try_set_caps(mix->srcpads[i], caps) <= 0) { + if (GST_PAD_CAPS (mix->srcpads[i]) == NULL) { + if (gst_pad_try_set_caps (mix->srcpads[i], caps) <= 0) { return GST_PAD_LINK_REFUSED; } } } } - mix->caps = gst_caps_copy(caps); + mix->caps = gst_caps_copy (caps); return GST_PAD_LINK_OK; } static GstPad * -gst_mixmatrix_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *name) +gst_mixmatrix_request_new_pad (GstElement * element, GstPadTemplate * templ, + const gchar * name) { GstMixMatrix *mix; gint padnum; GstPad *pad = NULL; - g_return_val_if_fail(element != NULL, NULL); - g_return_val_if_fail(GST_IS_MIXMATRIX(element), NULL); + g_return_val_if_fail (element != NULL, NULL); + g_return_val_if_fail (GST_IS_MIXMATRIX (element), NULL); - mix = GST_MIXMATRIX(element); + mix = GST_MIXMATRIX (element); // figure out if it's a sink pad - if (sscanf(name,"sink%d",&padnum)) { + if (sscanf (name, "sink%d", &padnum)) { // check to see if it already exists if (padnum < mix->sinkpadalloc && mix->sinkpads[padnum]) return mix->sinkpads[padnum]; // determine if it's bigger than the current size if (padnum >= mix->sinkpadalloc) - mixmatrix_resize(mix, ROUND_UP(padnum,mix->grpsize), mix->sinkpadalloc); - - pad = gst_pad_new_from_template( - gst_static_pad_template_get (&mixmatrix_sink_template), name); - GST_PAD_ELEMENT_PRIVATE(pad) = GINT_TO_POINTER(padnum); - gst_element_add_pad(GST_ELEMENT(mix), pad); + mixmatrix_resize (mix, ROUND_UP (padnum, mix->grpsize), + mix->sinkpadalloc); + + pad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mixmatrix_sink_template), name); + GST_PAD_ELEMENT_PRIVATE (pad) = GINT_TO_POINTER (padnum); + gst_element_add_pad (GST_ELEMENT (mix), pad); // g_signal_connect(G_OBJECT(pad), "unlink", G_CALLBACK(sink_unlinked), mix); gst_pad_set_link_function (pad, gst_mixmatrix_connect); // create a bytestream for it - mix->sinkbs[padnum] = gst_bytestream_new(pad); + mix->sinkbs[padnum] = gst_bytestream_new (pad); // store away the pad and account for it mix->sinkpads[padnum] = pad; } - // or it's a src pad - else if (sscanf(name,"src%d",&padnum)) { + else if (sscanf (name, "src%d", &padnum)) { // check to see if it already exists if (padnum < mix->srcpadalloc && mix->srcpads[padnum]) return mix->srcpads[padnum]; // determine if it's bigger than the current size if (padnum >= mix->srcpadalloc) - mixmatrix_resize(mix, ROUND_UP(padnum,mix->grpsize), mix->srcpadalloc); + mixmatrix_resize (mix, ROUND_UP (padnum, mix->grpsize), mix->srcpadalloc); - pad = gst_pad_new_from_template( - gst_static_pad_template_get (&mixmatrix_src_template), name); - GST_PAD_ELEMENT_PRIVATE(pad) = GINT_TO_POINTER(padnum); - gst_element_add_pad(GST_ELEMENT(mix), pad); + pad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mixmatrix_src_template), name); + GST_PAD_ELEMENT_PRIVATE (pad) = GINT_TO_POINTER (padnum); + gst_element_add_pad (GST_ELEMENT (mix), pad); // g_signal_connect(G_OBJECT(pad), "unlink", G_CALLBACK(sink_unlinked), mix); //gst_pad_set_link_function (pad, gst_mixmatrix_connect); @@ -400,38 +419,38 @@ gst_mixmatrix_request_new_pad (GstElement *element, GstPadTemplate *templ, const } static void -gst_mixmatrix_loop (GstElement *element) +gst_mixmatrix_loop (GstElement * element) { - GstMixMatrix *mix = GST_MIXMATRIX(element); - int i,j,k; + GstMixMatrix *mix = GST_MIXMATRIX (element); + int i, j, k; GstBuffer **inbufs; gfloat **infloats; GstBuffer **outbufs; gfloat **outfloats; - int bytesize = sizeof(gfloat)*mix->outsize; + int bytesize = sizeof (gfloat) * mix->outsize; gfloat gain; // create the output buffers - outbufs = g_new(GstBuffer *,mix->srcpadalloc); - outfloats = g_new(gfloat *,mix->srcpadalloc); - for (i=0;isrcpadalloc;i++) { + outbufs = g_new (GstBuffer *, mix->srcpadalloc); + outfloats = g_new (gfloat *, mix->srcpadalloc); + for (i = 0; i < mix->srcpadalloc; i++) { if (mix->srcpads[i] != NULL) { - outbufs[i] = gst_buffer_new_and_alloc(bytesize); - outfloats[i] = (gfloat *)GST_BUFFER_DATA(outbufs[i]); - memset(outfloats[i],0,bytesize); + outbufs[i] = gst_buffer_new_and_alloc (bytesize); + outfloats[i] = (gfloat *) GST_BUFFER_DATA (outbufs[i]); + memset (outfloats[i], 0, bytesize); } } // go through all the input buffers and pull them - inbufs = g_new(GstBuffer *,mix->sinkpadalloc); - infloats = g_new(gfloat *,mix->sinkpadalloc); - for (i=0;isinkpadalloc;i++) { + inbufs = g_new (GstBuffer *, mix->sinkpadalloc); + infloats = g_new (gfloat *, mix->sinkpadalloc); + for (i = 0; i < mix->sinkpadalloc; i++) { if (mix->sinkpads[i] != NULL) { - gst_bytestream_read(mix->sinkbs[i],&inbufs[i],bytesize); - infloats[i] = (gfloat *)GST_BUFFER_DATA(inbufs[i]); + gst_bytestream_read (mix->sinkbs[i], &inbufs[i], bytesize); + infloats[i] = (gfloat *) GST_BUFFER_DATA (inbufs[i]); // loop through each src pad - for (j=0;jsrcpadalloc;j++) { - if (mix->srcpads[j] != NULL) { + for (j = 0; j < mix->srcpadalloc; j++) { + if (mix->srcpads[j] != NULL) { /* { int z; @@ -442,31 +461,32 @@ gst_mixmatrix_loop (GstElement *element) } fprintf(stderr,"attempting to get gain for %dx%d\n",i,j); */ - gain = mix->matrix[i][j]; + gain = mix->matrix[i][j]; // fprintf(stderr,"%d->%d=%0.2f ",i,j,gain); - for (k=0;koutsize;k++) { - outfloats[j][k] += infloats[i][k] * gain; - } - } + for (k = 0; k < mix->outsize; k++) { + outfloats[j][k] += infloats[i][k] * gain; + } + } } } } // fprintf(stderr,"\n"); - for (i=0;isrcpadalloc;i++) { + for (i = 0; i < mix->srcpadalloc; i++) { if (mix->srcpads[i] != NULL) { - gst_pad_push(mix->srcpads[i],GST_DATA (outbufs[i])); + gst_pad_push (mix->srcpads[i], GST_DATA (outbufs[i])); } } } static void -gst_mixmatrix_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_mixmatrix_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstMixMatrix *mix; - g_return_if_fail(GST_IS_MIXMATRIX(object)); - mix = GST_MIXMATRIX(object); + g_return_if_fail (GST_IS_MIXMATRIX (object)); + mix = GST_MIXMATRIX (object); switch (prop_id) { default: @@ -475,22 +495,23 @@ gst_mixmatrix_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_mixmatrix_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_mixmatrix_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMixMatrix *mix; - g_return_if_fail(GST_IS_MIXMATRIX(object)); - mix = GST_MIXMATRIX(object); + g_return_if_fail (GST_IS_MIXMATRIX (object)); + mix = GST_MIXMATRIX (object); switch (prop_id) { case ARG_SINKPADS: - g_value_set_int(value, mix->sinkpadalloc); + g_value_set_int (value, mix->sinkpadalloc); break; case ARG_SRCPADS: - g_value_set_int(value, mix->srcpadalloc); + g_value_set_int (value, mix->srcpadalloc); break; case ARG_MATRIXPTR: - g_value_set_pointer(value, mix->matrix); + g_value_set_pointer (value, mix->matrix); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -499,23 +520,17 @@ gst_mixmatrix_get_property (GObject *object, guint prop_id, GValue *value, GPara } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("gstbytestream")) return FALSE; return gst_element_register (plugin, "mixmatrix", - GST_RANK_NONE, GST_TYPE_MIXMATRIX); + GST_RANK_NONE, GST_TYPE_MIXMATRIX); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mixmatrix", - "An audio mixer matrix", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mixmatrix", + "An audio mixer matrix", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/modplug/gstmodplug.h b/gst/modplug/gstmodplug.h index c4a98b86..f32c9a9a 100644 --- a/gst/modplug/gstmodplug.h +++ b/gst/modplug/gstmodplug.h @@ -22,15 +22,16 @@ #define __GST_MODPLUG_H__ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #include #include - + #define GST_TYPE_MODPLUG \ (gst_modplug_get_type()) - + #define GST_MODPLUG(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MODPLUG,GstModPlug)) #define GST_MODPLUG_CLASS(klass) \ @@ -39,57 +40,59 @@ extern "C" { (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MODPLUG)) #define GST_IS_MODPLUG_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MODPLUG)) - -struct _GstModPlug { - GstElement element; - GstPad *sinkpad, *srcpad; - guint8 *buffer_in; - GstByteStream *bs; - - const gchar *songname; - gboolean reverb; - gint reverb_depth; - gint reverb_delay; - gboolean megabass; - gint megabass_amount; - gint megabass_range; - gboolean surround; - gint surround_depth; - gint surround_delay; - gboolean noise_reduction; - gboolean _16bit; - gboolean oversamp; - gint channel; - gint frequency; - - guchar *audiobuffer; - gint32 length; - guint state; - guint bitsPerSample; - gboolean need_discont; - gboolean eos; - gint64 seek_at; - guint64 song_size; - guint64 timestamp; - - CSoundFile *mSoundFile; - gboolean opened; /* set to TRUE when mSoundFile is created */ -}; - -struct _GstModPlugClass { - GstElementClass parent_class; -}; - -typedef struct _GstModPlug GstModPlug; -typedef struct _GstModPlugClass GstModPlugClass; - -GstPad *srcpad; -int need_sync; - -GType gst_modplug_get_type(void); + + struct _GstModPlug + { + GstElement element; + GstPad *sinkpad, *srcpad; + guint8 *buffer_in; + GstByteStream *bs; + + const gchar *songname; + gboolean reverb; + gint reverb_depth; + gint reverb_delay; + gboolean megabass; + gint megabass_amount; + gint megabass_range; + gboolean surround; + gint surround_depth; + gint surround_delay; + gboolean noise_reduction; + gboolean _16bit; + gboolean oversamp; + gint channel; + gint frequency; + + guchar *audiobuffer; + gint32 length; + guint state; + guint bitsPerSample; + gboolean need_discont; + gboolean eos; + gint64 seek_at; + guint64 song_size; + guint64 timestamp; + + CSoundFile *mSoundFile; + gboolean opened; /* set to TRUE when mSoundFile is created */ + }; + + struct _GstModPlugClass + { + GstElementClass parent_class; + }; + + typedef struct _GstModPlug GstModPlug; + typedef struct _GstModPlugClass GstModPlugClass; + + GstPad *srcpad; + int need_sync; + + GType gst_modplug_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_MODPLUG_H__ */ +#endif /* __GST_MODPLUG_H__ */ diff --git a/gst/modplug/libmodplug/it_defs.h b/gst/modplug/libmodplug/it_defs.h index 732ce45c..48ff0b15 100644 --- a/gst/modplug/libmodplug/it_defs.h +++ b/gst/modplug/libmodplug/it_defs.h @@ -5,125 +5,125 @@ typedef struct tagITFILEHEADER { - DWORD id; /* 0x4D504D49 */ - CHAR songname[26]; - WORD reserved1; /* 0x1004 */ - WORD ordnum; - WORD insnum; - WORD smpnum; - WORD patnum; - WORD cwtv; - WORD cmwt; - WORD flags; - WORD special; - BYTE globalvol; - BYTE mv; - BYTE speed; - BYTE tempo; - BYTE sep; - BYTE zero; - WORD msglength; - DWORD msgoffset; - DWORD reserved2; - BYTE chnpan[64]; - BYTE chnvol[64]; + DWORD id; /* 0x4D504D49 */ + CHAR songname[26]; + WORD reserved1; /* 0x1004 */ + WORD ordnum; + WORD insnum; + WORD smpnum; + WORD patnum; + WORD cwtv; + WORD cmwt; + WORD flags; + WORD special; + BYTE globalvol; + BYTE mv; + BYTE speed; + BYTE tempo; + BYTE sep; + BYTE zero; + WORD msglength; + DWORD msgoffset; + DWORD reserved2; + BYTE chnpan[64]; + BYTE chnvol[64]; } ITFILEHEADER; typedef struct tagITENVELOPE { - BYTE flags; - BYTE num; - BYTE lpb; - BYTE lpe; - BYTE slb; - BYTE sle; - BYTE data[25*3]; - BYTE reserved; + BYTE flags; + BYTE num; + BYTE lpb; + BYTE lpe; + BYTE slb; + BYTE sle; + BYTE data[25 * 3]; + BYTE reserved; } ITENVELOPE; /* Old Impulse Instrument Format (cmwt < 0x200) */ typedef struct tagITOLDINSTRUMENT { - DWORD id; /* IMPI = 0x49504D49 */ - CHAR filename[12]; /* DOS file name */ - BYTE zero; - BYTE flags; - BYTE vls; - BYTE vle; - BYTE sls; - BYTE sle; - WORD reserved1; - WORD fadeout; - BYTE nna; - BYTE dnc; - WORD trkvers; - BYTE nos; - BYTE reserved2; - CHAR name[26]; - WORD reserved3[3]; - BYTE keyboard[240]; - BYTE volenv[200]; - BYTE nodes[50]; + DWORD id; /* IMPI = 0x49504D49 */ + CHAR filename[12]; /* DOS file name */ + BYTE zero; + BYTE flags; + BYTE vls; + BYTE vle; + BYTE sls; + BYTE sle; + WORD reserved1; + WORD fadeout; + BYTE nna; + BYTE dnc; + WORD trkvers; + BYTE nos; + BYTE reserved2; + CHAR name[26]; + WORD reserved3[3]; + BYTE keyboard[240]; + BYTE volenv[200]; + BYTE nodes[50]; } ITOLDINSTRUMENT; /* Impulse Instrument Format */ typedef struct tagITINSTRUMENT { - DWORD id; - CHAR filename[12]; - BYTE zero; - BYTE nna; - BYTE dct; - BYTE dca; - WORD fadeout; - signed char pps; - BYTE ppc; - BYTE gbv; - BYTE dfp; - BYTE rv; - BYTE rp; - WORD trkvers; - BYTE nos; - BYTE reserved1; - CHAR name[26]; - BYTE ifc; - BYTE ifr; - BYTE mch; - BYTE mpr; - WORD mbank; - BYTE keyboard[240]; - ITENVELOPE volenv; - ITENVELOPE panenv; - ITENVELOPE pitchenv; - BYTE dummy[4]; /* was 7, but IT v2.17 saves 554 bytes */ + DWORD id; + CHAR filename[12]; + BYTE zero; + BYTE nna; + BYTE dct; + BYTE dca; + WORD fadeout; + signed char pps; + BYTE ppc; + BYTE gbv; + BYTE dfp; + BYTE rv; + BYTE rp; + WORD trkvers; + BYTE nos; + BYTE reserved1; + CHAR name[26]; + BYTE ifc; + BYTE ifr; + BYTE mch; + BYTE mpr; + WORD mbank; + BYTE keyboard[240]; + ITENVELOPE volenv; + ITENVELOPE panenv; + ITENVELOPE pitchenv; + BYTE dummy[4]; /* was 7, but IT v2.17 saves 554 bytes */ } ITINSTRUMENT; /* IT Sample Format */ typedef struct ITSAMPLESTRUCT { - DWORD id; /* 0x53504D49 */ - CHAR filename[12]; - BYTE zero; - BYTE gvl; - BYTE flags; - BYTE vol; - CHAR name[26]; - BYTE cvt; - BYTE dfp; - DWORD length; - DWORD loopbegin; - DWORD loopend; - DWORD C5Speed; - DWORD susloopbegin; - DWORD susloopend; - DWORD samplepointer; - BYTE vis; - BYTE vid; - BYTE vir; - BYTE vit; + DWORD id; /* 0x53504D49 */ + CHAR filename[12]; + BYTE zero; + BYTE gvl; + BYTE flags; + BYTE vol; + CHAR name[26]; + BYTE cvt; + BYTE dfp; + DWORD length; + DWORD loopbegin; + DWORD loopend; + DWORD C5Speed; + DWORD susloopbegin; + DWORD susloopend; + DWORD samplepointer; + BYTE vis; + BYTE vid; + BYTE vir; + BYTE vit; } ITSAMPLESTRUCT; #pragma pack() diff --git a/gst/modplug/libmodplug/modplug.h b/gst/modplug/libmodplug/modplug.h index fd8ec02f..877060d0 100644 --- a/gst/modplug/libmodplug/modplug.h +++ b/gst/modplug/libmodplug/modplug.h @@ -8,30 +8,31 @@ #define MODPLUG_H__INCLUDED #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -struct _ModPlugFile; -typedef struct _ModPlugFile ModPlugFile; + struct _ModPlugFile; + typedef struct _ModPlugFile ModPlugFile; /* Load a mod file. [data] should point to a block of memory containing the complete * file, and [size] should be the size of that block. * Return the loaded mod file on success, or NULL on failure. */ -ModPlugFile* ModPlug_Load(const void* data, int size); + ModPlugFile *ModPlug_Load (const void *data, int size); /* Unload a mod file. */ -void ModPlug_Unload(ModPlugFile* file); + void ModPlug_Unload (ModPlugFile * file); /* Read sample data into the buffer. Returns the number of bytes read. If the end * of the mod has been reached, zero is returned. */ -int ModPlug_Read(ModPlugFile* file, void* buffer, int size); + int ModPlug_Read (ModPlugFile * file, void *buffer, int size); /* Get the name of the mod. The returned buffer is stored within the ModPlugFile * structure and will remain valid until you unload the file. */ -const char* ModPlug_GetName(ModPlugFile* file); + const char *ModPlug_GetName (ModPlugFile * file); /* Get the length of the mod, in milliseconds. Note that this result is not always * accurate, especially in the case of mods with loops. */ -int ModPlug_GetLength(ModPlugFile* file); + int ModPlug_GetLength (ModPlugFile * file); /* Seek to a particular position in the song. Note that seeking and MODs don't mix very * well. Some mods will be missing instruments for a short time after a seek, as ModPlug @@ -39,54 +40,54 @@ int ModPlug_GetLength(ModPlugFile* file); * playing at that time. (Doing so would be difficult and not very reliable.) Also, * note that seeking is not very exact in some mods -- especially those for which * ModPlug_GetLength() does not report the full length. */ -void ModPlug_Seek(ModPlugFile* file, int millisecond); + void ModPlug_Seek (ModPlugFile * file, int millisecond); -enum _ModPlug_Flags -{ - MODPLUG_ENABLE_OVERSAMPLING = 1 << 0, /* Enable oversampling (*highly* recommended) */ - MODPLUG_ENABLE_NOISE_REDUCTION = 1 << 1, /* Enable noise reduction */ - MODPLUG_ENABLE_REVERB = 1 << 2, /* Enable reverb */ - MODPLUG_ENABLE_MEGABASS = 1 << 3, /* Enable megabass */ - MODPLUG_ENABLE_SURROUND = 1 << 4 /* Enable surround sound. */ -}; - -enum _ModPlug_ResamplingMode -{ - MODPLUG_RESAMPLE_NEAREST = 0, /* No interpolation (very fast, extremely bad sound quality) */ - MODPLUG_RESAMPLE_LINEAR = 1, /* Linear interpolation (fast, good quality) */ - MODPLUG_RESAMPLE_SPLINE = 2, /* Cubic spline interpolation (high quality) */ - MODPLUG_RESAMPLE_FIR = 3 /* 8-tap fir filter (extremely high quality) */ -}; + enum _ModPlug_Flags + { + MODPLUG_ENABLE_OVERSAMPLING = 1 << 0, /* Enable oversampling (*highly* recommended) */ + MODPLUG_ENABLE_NOISE_REDUCTION = 1 << 1, /* Enable noise reduction */ + MODPLUG_ENABLE_REVERB = 1 << 2, /* Enable reverb */ + MODPLUG_ENABLE_MEGABASS = 1 << 3, /* Enable megabass */ + MODPLUG_ENABLE_SURROUND = 1 << 4 /* Enable surround sound. */ + }; -typedef struct _ModPlug_Settings -{ - int mFlags; /* One or more of the MODPLUG_ENABLE_* flags above, bitwise-OR'ed */ - - /* Note that ModPlug always decodes sound at 44100kHz, 32 bit, stereo and then - * down-mixes to the settings you choose. */ - int mChannels; /* Number of channels - 1 for mono or 2 for stereo */ - int mBits; /* Bits per sample - 8, 16, or 32 */ - int mFrequency; /* Sampling rate - 11025, 22050, or 44100 */ - int mResamplingMode; /* One of MODPLUG_RESAMPLE_*, above */ - - int mReverbDepth; /* Reverb level 0(quiet)-100(loud) */ - int mReverbDelay; /* Reverb delay in ms, usually 40-200ms */ - int mBassAmount; /* XBass level 0(quiet)-100(loud) */ - int mBassRange; /* XBass cutoff in Hz 10-100 */ - int mSurroundDepth; /* Surround level 0(quiet)-100(heavy) */ - int mSurroundDelay; /* Surround delay in ms, usually 5-40ms */ - int mLoopCount; /* Number of times to loop. Zero prevents looping. - -1 loops forever. */ -} ModPlug_Settings; + enum _ModPlug_ResamplingMode + { + MODPLUG_RESAMPLE_NEAREST = 0, /* No interpolation (very fast, extremely bad sound quality) */ + MODPLUG_RESAMPLE_LINEAR = 1, /* Linear interpolation (fast, good quality) */ + MODPLUG_RESAMPLE_SPLINE = 2, /* Cubic spline interpolation (high quality) */ + MODPLUG_RESAMPLE_FIR = 3 /* 8-tap fir filter (extremely high quality) */ + }; + + typedef struct _ModPlug_Settings + { + int mFlags; /* One or more of the MODPLUG_ENABLE_* flags above, bitwise-OR'ed */ + + /* Note that ModPlug always decodes sound at 44100kHz, 32 bit, stereo and then + * down-mixes to the settings you choose. */ + int mChannels; /* Number of channels - 1 for mono or 2 for stereo */ + int mBits; /* Bits per sample - 8, 16, or 32 */ + int mFrequency; /* Sampling rate - 11025, 22050, or 44100 */ + int mResamplingMode; /* One of MODPLUG_RESAMPLE_*, above */ + + int mReverbDepth; /* Reverb level 0(quiet)-100(loud) */ + int mReverbDelay; /* Reverb delay in ms, usually 40-200ms */ + int mBassAmount; /* XBass level 0(quiet)-100(loud) */ + int mBassRange; /* XBass cutoff in Hz 10-100 */ + int mSurroundDepth; /* Surround level 0(quiet)-100(heavy) */ + int mSurroundDelay; /* Surround delay in ms, usually 5-40ms */ + int mLoopCount; /* Number of times to loop. Zero prevents looping. + -1 loops forever. */ + } ModPlug_Settings; /* Get and set the mod decoder settings. All options, except for channels, bits-per-sample, * sampling rate, and loop count, will take effect immediately. Those options which don't * take effect immediately will take effect the next time you load a mod. */ -void ModPlug_GetSettings(ModPlug_Settings* settings); -void ModPlug_SetSettings(const ModPlug_Settings* settings); + void ModPlug_GetSettings (ModPlug_Settings * settings); + void ModPlug_SetSettings (const ModPlug_Settings * settings); #ifdef __cplusplus -} /* extern "C" */ +} /* extern "C" */ #endif #endif diff --git a/gst/modplug/libmodplug/sndfile.h b/gst/modplug/libmodplug/sndfile.h index 0fe6f459..ebfd4afd 100644 --- a/gst/modplug/libmodplug/sndfile.h +++ b/gst/modplug/libmodplug/sndfile.h @@ -9,7 +9,7 @@ #define __SNDFILE_H #ifndef LPCBYTE -typedef const BYTE * LPCBYTE; +typedef const BYTE *LPCBYTE; #endif #define MOD_AMIGAC2 0x1AB @@ -60,7 +60,7 @@ typedef const BYTE * LPCBYTE; #define MOD_TYPE_AMF0 0x200000 #define MOD_TYPE_PSM 0x400000 #define MOD_TYPE_J2B 0x800000 -#define MOD_TYPE_UMX 0x80000000 /* Fake type */ +#define MOD_TYPE_UMX 0x80000000 /* Fake type */ #define MAX_MODTYPE 23 @@ -202,9 +202,9 @@ typedef const BYTE * LPCBYTE; #define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO) /* stereo 16-bit unsigned */ #define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO) /* stereo 16-bit signed big endian */ /* 24-bit signed */ -#define RS_PCM24S (RS_PCM16S|0x80) /* mono 24-bit signed */ +#define RS_PCM24S (RS_PCM16S|0x80) /* mono 24-bit signed */ #define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) /* stereo 24-bit signed */ -#define RS_PCM32S (RS_PCM16S|0xC0) /* mono 24-bit signed */ +#define RS_PCM32S (RS_PCM16S|0xC0) /* mono 24-bit signed */ #define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) /* stereo 24-bit signed */ /* NNA types */ @@ -269,176 +269,178 @@ typedef const BYTE * LPCBYTE; /* Reverb Types (GM2 Presets) */ -enum { - REVERBTYPE_SMALLROOM, - REVERBTYPE_MEDIUMROOM, - REVERBTYPE_LARGEROOM, - REVERBTYPE_SMALLHALL, - REVERBTYPE_MEDIUMHALL, - REVERBTYPE_LARGEHALL, - NUM_REVERBTYPES +enum +{ + REVERBTYPE_SMALLROOM, + REVERBTYPE_MEDIUMROOM, + REVERBTYPE_LARGEROOM, + REVERBTYPE_SMALLHALL, + REVERBTYPE_MEDIUMHALL, + REVERBTYPE_LARGEHALL, + NUM_REVERBTYPES }; -enum { - SRCMODE_NEAREST, - SRCMODE_LINEAR, - SRCMODE_SPLINE, - SRCMODE_POLYPHASE, - NUM_SRC_MODES +enum +{ + SRCMODE_NEAREST, + SRCMODE_LINEAR, + SRCMODE_SPLINE, + SRCMODE_POLYPHASE, + NUM_SRC_MODES }; /* Sample Struct */ typedef struct _MODINSTRUMENT { - UINT nLength,nLoopStart,nLoopEnd; - UINT nSustainStart, nSustainEnd; - signed char *pSample; - UINT nC4Speed; - WORD nPan; - WORD nVolume; - WORD nGlobalVol; - WORD uFlags; - signed char RelativeTone; - signed char nFineTune; - BYTE nVibType; - BYTE nVibSweep; - BYTE nVibDepth; - BYTE nVibRate; - CHAR name[22]; + UINT nLength, nLoopStart, nLoopEnd; + UINT nSustainStart, nSustainEnd; + signed char *pSample; + UINT nC4Speed; + WORD nPan; + WORD nVolume; + WORD nGlobalVol; + WORD uFlags; + signed char RelativeTone; + signed char nFineTune; + BYTE nVibType; + BYTE nVibSweep; + BYTE nVibDepth; + BYTE nVibRate; + CHAR name[22]; } MODINSTRUMENT; /* Instrument Struct */ typedef struct _INSTRUMENTHEADER { - UINT nFadeOut; - DWORD dwFlags; - WORD nGlobalVol; - WORD nPan; - WORD VolPoints[MAX_ENVPOINTS]; - WORD PanPoints[MAX_ENVPOINTS]; - WORD PitchPoints[MAX_ENVPOINTS]; - BYTE VolEnv[MAX_ENVPOINTS]; - BYTE PanEnv[MAX_ENVPOINTS]; - BYTE PitchEnv[MAX_ENVPOINTS]; - BYTE Keyboard[128]; - BYTE NoteMap[128]; - - BYTE nVolEnv; - BYTE nPanEnv; - BYTE nPitchEnv; - BYTE nVolLoopStart; - BYTE nVolLoopEnd; - BYTE nVolSustainBegin; - BYTE nVolSustainEnd; - BYTE nPanLoopStart; - BYTE nPanLoopEnd; - BYTE nPanSustainBegin; - BYTE nPanSustainEnd; - BYTE nPitchLoopStart; - BYTE nPitchLoopEnd; - BYTE nPitchSustainBegin; - BYTE nPitchSustainEnd; - BYTE nNNA; - BYTE nDCT; - BYTE nDNA; - BYTE nPanSwing; - BYTE nVolSwing; - BYTE nIFC; - BYTE nIFR; - WORD wMidiBank; - BYTE nMidiProgram; - BYTE nMidiChannel; - BYTE nMidiDrumKey; - signed char nPPS; - unsigned char nPPC; - CHAR name[32]; - CHAR filename[12]; + UINT nFadeOut; + DWORD dwFlags; + WORD nGlobalVol; + WORD nPan; + WORD VolPoints[MAX_ENVPOINTS]; + WORD PanPoints[MAX_ENVPOINTS]; + WORD PitchPoints[MAX_ENVPOINTS]; + BYTE VolEnv[MAX_ENVPOINTS]; + BYTE PanEnv[MAX_ENVPOINTS]; + BYTE PitchEnv[MAX_ENVPOINTS]; + BYTE Keyboard[128]; + BYTE NoteMap[128]; + + BYTE nVolEnv; + BYTE nPanEnv; + BYTE nPitchEnv; + BYTE nVolLoopStart; + BYTE nVolLoopEnd; + BYTE nVolSustainBegin; + BYTE nVolSustainEnd; + BYTE nPanLoopStart; + BYTE nPanLoopEnd; + BYTE nPanSustainBegin; + BYTE nPanSustainEnd; + BYTE nPitchLoopStart; + BYTE nPitchLoopEnd; + BYTE nPitchSustainBegin; + BYTE nPitchSustainEnd; + BYTE nNNA; + BYTE nDCT; + BYTE nDNA; + BYTE nPanSwing; + BYTE nVolSwing; + BYTE nIFC; + BYTE nIFR; + WORD wMidiBank; + BYTE nMidiProgram; + BYTE nMidiChannel; + BYTE nMidiDrumKey; + signed char nPPS; + unsigned char nPPC; + CHAR name[32]; + CHAR filename[12]; } INSTRUMENTHEADER; /* Channel Struct */ typedef struct _MODCHANNEL { - /* First 32-bytes: Most used mixing information: don't change it */ - signed char * pCurrentSample; - DWORD nPos; - DWORD nPosLo; /* actually 16-bit */ - LONG nInc; /* 16.16 */ - LONG nRightVol; - LONG nLeftVol; - LONG nRightRamp; - LONG nLeftRamp; - /* 2nd cache line */ - DWORD nLength; - DWORD dwFlags; - DWORD nLoopStart; - DWORD nLoopEnd; - LONG nRampRightVol; - LONG nRampLeftVol; - LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; - LONG nFilter_A0, nFilter_B0, nFilter_B1; - LONG nROfs, nLOfs; - LONG nRampLength; - /* Information not used in the mixer */ - signed char * pSample; - LONG nNewRightVol, nNewLeftVol; - LONG nRealVolume, nRealPan; - LONG nVolume, nPan, nFadeOutVol; - LONG nPeriod, nC4Speed, nPortamentoDest; - INSTRUMENTHEADER *pHeader; - MODINSTRUMENT *pInstrument; - DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; - DWORD nMasterChn, nVUMeter; - LONG nGlobalVol, nInsVol; - LONG nFineTune, nTranspose; - LONG nPortamentoSlide, nAutoVibDepth; - UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos; - /* 16-bit members */ - signed short nVolSwing, nPanSwing; - /* 8-bit members */ - BYTE nNote, nNNA; - BYTE nNewNote, nNewIns, nCommand, nArpeggio; - BYTE nOldVolumeSlide, nOldFineVolUpDown; - BYTE nOldPortaUpDown, nOldFinePortaUpDown; - BYTE nOldPanSlide, nOldChnVolSlide; - BYTE nVibratoType, nVibratoSpeed, nVibratoDepth; - BYTE nTremoloType, nTremoloSpeed, nTremoloDepth; - BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth; - BYTE nOldCmdEx, nOldVolParam, nOldTempo; - BYTE nOldOffset, nOldHiOffset; - BYTE nCutOff, nResonance; - BYTE nRetrigCount, nRetrigParam; - BYTE nTremorCount, nTremorParam; - BYTE nPatternLoop, nPatternLoopCount; - BYTE nRowNote, nRowInstr; - BYTE nRowVolCmd, nRowVolume; - BYTE nRowCommand, nRowParam; - BYTE nLeftVU, nRightVU; - BYTE nActiveMacro, nPadding; + /* First 32-bytes: Most used mixing information: don't change it */ + signed char *pCurrentSample; + DWORD nPos; + DWORD nPosLo; /* actually 16-bit */ + LONG nInc; /* 16.16 */ + LONG nRightVol; + LONG nLeftVol; + LONG nRightRamp; + LONG nLeftRamp; + /* 2nd cache line */ + DWORD nLength; + DWORD dwFlags; + DWORD nLoopStart; + DWORD nLoopEnd; + LONG nRampRightVol; + LONG nRampLeftVol; + LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4; + LONG nFilter_A0, nFilter_B0, nFilter_B1; + LONG nROfs, nLOfs; + LONG nRampLength; + /* Information not used in the mixer */ + signed char *pSample; + LONG nNewRightVol, nNewLeftVol; + LONG nRealVolume, nRealPan; + LONG nVolume, nPan, nFadeOutVol; + LONG nPeriod, nC4Speed, nPortamentoDest; + INSTRUMENTHEADER *pHeader; + MODINSTRUMENT *pInstrument; + DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition; + DWORD nMasterChn, nVUMeter; + LONG nGlobalVol, nInsVol; + LONG nFineTune, nTranspose; + LONG nPortamentoSlide, nAutoVibDepth; + UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos; + /* 16-bit members */ + signed short nVolSwing, nPanSwing; + /* 8-bit members */ + BYTE nNote, nNNA; + BYTE nNewNote, nNewIns, nCommand, nArpeggio; + BYTE nOldVolumeSlide, nOldFineVolUpDown; + BYTE nOldPortaUpDown, nOldFinePortaUpDown; + BYTE nOldPanSlide, nOldChnVolSlide; + BYTE nVibratoType, nVibratoSpeed, nVibratoDepth; + BYTE nTremoloType, nTremoloSpeed, nTremoloDepth; + BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth; + BYTE nOldCmdEx, nOldVolParam, nOldTempo; + BYTE nOldOffset, nOldHiOffset; + BYTE nCutOff, nResonance; + BYTE nRetrigCount, nRetrigParam; + BYTE nTremorCount, nTremorParam; + BYTE nPatternLoop, nPatternLoopCount; + BYTE nRowNote, nRowInstr; + BYTE nRowVolCmd, nRowVolume; + BYTE nRowCommand, nRowParam; + BYTE nLeftVU, nRightVU; + BYTE nActiveMacro, nPadding; } MODCHANNEL; typedef struct _MODCHANNELSETTINGS { - UINT nPan; - UINT nVolume; - DWORD dwFlags; - UINT nMixPlugin; - char szName[MAX_CHANNELNAME]; /* changed from CHAR */ + UINT nPan; + UINT nVolume; + DWORD dwFlags; + UINT nMixPlugin; + char szName[MAX_CHANNELNAME]; /* changed from CHAR */ } MODCHANNELSETTINGS; typedef struct _MODCOMMAND { - BYTE note; - BYTE instr; - BYTE volcmd; - BYTE command; - BYTE vol; - BYTE param; + BYTE note; + BYTE instr; + BYTE volcmd; + BYTE command; + BYTE vol; + BYTE param; } MODCOMMAND, *LPMODCOMMAND; /*////////////////////////////////////////////////////////////////// */ @@ -448,14 +450,15 @@ typedef struct _MODCOMMAND class IMixPlugin { public: - virtual int AddRef() = 0; - virtual int Release() = 0; - virtual void SaveAllParameters() = 0; - virtual void RestoreAllParameters() = 0; - virtual void Process(float *pOutL, float *pOutR, unsigned long nSamples) = 0; - virtual void Init(unsigned long nFreq, int bReset) = 0; - virtual void MidiSend(DWORD dwMidiCode) = 0; - virtual void MidiCommand(UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = 0; + virtual int AddRef () = 0; + virtual int Release () = 0; + virtual void SaveAllParameters () = 0; + virtual void RestoreAllParameters () = 0; + virtual void Process (float *pOutL, float *pOutR, unsigned long nSamples) = 0; + virtual void Init (unsigned long nFreq, int bReset) = 0; + virtual void MidiSend (DWORD dwMidiCode) = 0; + virtual void MidiCommand (UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) = + 0; }; @@ -465,59 +468,60 @@ public: typedef struct _SNDMIXPLUGINSTATE { - DWORD dwFlags; /* MIXPLUG_XXXX */ - LONG nVolDecayL, nVolDecayR; /* Buffer click removal */ - int *pMixBuffer; /* Stereo effect send buffer */ - float *pOutBufferL; /* Temp storage for int -> float conversion */ - float *pOutBufferR; + DWORD dwFlags; /* MIXPLUG_XXXX */ + LONG nVolDecayL, nVolDecayR; /* Buffer click removal */ + int *pMixBuffer; /* Stereo effect send buffer */ + float *pOutBufferL; /* Temp storage for int -> float conversion */ + float *pOutBufferR; } SNDMIXPLUGINSTATE, *PSNDMIXPLUGINSTATE; typedef struct _SNDMIXPLUGININFO { - DWORD dwPluginId1; - DWORD dwPluginId2; - DWORD dwInputRouting; /* MIXPLUG_INPUTF_XXXX */ - DWORD dwOutputRouting; /* 0=mix 0x80+=fx */ - DWORD dwReserved[4]; /* Reserved for routing info */ - CHAR szName[32]; - CHAR szLibraryName[64]; /* original DLL name */ -} SNDMIXPLUGININFO, *PSNDMIXPLUGININFO; /* Size should be 128 */ + DWORD dwPluginId1; + DWORD dwPluginId2; + DWORD dwInputRouting; /* MIXPLUG_INPUTF_XXXX */ + DWORD dwOutputRouting; /* 0=mix 0x80+=fx */ + DWORD dwReserved[4]; /* Reserved for routing info */ + CHAR szName[32]; + CHAR szLibraryName[64]; /* original DLL name */ +} SNDMIXPLUGININFO, *PSNDMIXPLUGININFO; /* Size should be 128 */ typedef struct _SNDMIXPLUGIN { - IMixPlugin *pMixPlugin; - PSNDMIXPLUGINSTATE pMixState; - ULONG nPluginDataSize; - PVOID pPluginData; - SNDMIXPLUGININFO Info; + IMixPlugin *pMixPlugin; + PSNDMIXPLUGINSTATE pMixState; + ULONG nPluginDataSize; + PVOID pPluginData; + SNDMIXPLUGININFO Info; } SNDMIXPLUGIN, *PSNDMIXPLUGIN; -typedef BOOL (*PMIXPLUGINCREATEPROC)(PSNDMIXPLUGIN); +typedef BOOL (*PMIXPLUGINCREATEPROC) (PSNDMIXPLUGIN); /*////////////////////////////////////////////////////////////////// */ -enum { - MIDIOUT_START=0, - MIDIOUT_STOP, - MIDIOUT_TICK, - MIDIOUT_NOTEON, - MIDIOUT_NOTEOFF, - MIDIOUT_VOLUME, - MIDIOUT_PAN, - MIDIOUT_BANKSEL, - MIDIOUT_PROGRAM +enum +{ + MIDIOUT_START = 0, + MIDIOUT_STOP, + MIDIOUT_TICK, + MIDIOUT_NOTEON, + MIDIOUT_NOTEOFF, + MIDIOUT_VOLUME, + MIDIOUT_PAN, + MIDIOUT_BANKSEL, + MIDIOUT_PROGRAM }; typedef struct MODMIDICFG { - char szMidiGlb[9*32]; /* changed from CHAR */ - char szMidiSFXExt[16*32]; /* changed from CHAR */ - char szMidiZXXExt[128*32]; /* changed from CHAR */ + char szMidiGlb[9 * 32]; /* changed from CHAR */ + char szMidiSFXExt[16 * 32]; /* changed from CHAR */ + char szMidiZXXExt[128 * 32]; /* changed from CHAR */ } MODMIDICFG, *LPMODMIDICFG; -typedef VOID (* LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); /* buffer, samples, channels */ +typedef VOID (*LPSNDMIXHOOKPROC) (int *, unsigned long, unsigned long); /* buffer, samples, channels */ @@ -525,251 +529,343 @@ typedef VOID (* LPSNDMIXHOOKPROC)(int *, unsigned long, unsigned long); /* buffe class CSoundFile /*============== */ { -public: /* Static Members */ - static UINT m_nXBassDepth, m_nXBassRange; - static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType; - static UINT m_nProLogicDepth, m_nProLogicDelay; - static UINT m_nStereoSeparation; - static UINT m_nMaxMixChannels; - static LONG m_nStreamVolume; - static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, gnChannels; - static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage; - static LPSNDMIXHOOKPROC gpSndMixHook; - static PMIXPLUGINCREATEPROC gpMixPluginCreateProc; - -public: /* for Editing */ - MODCHANNEL Chn[MAX_CHANNELS]; /* Channels */ - UINT ChnMix[MAX_CHANNELS]; /* Channels to be mixed */ - MODINSTRUMENT Ins[MAX_SAMPLES]; /* Instruments */ - INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; /* Instrument Headers */ - MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; /* Channels settings */ - MODCOMMAND *Patterns[MAX_PATTERNS]; /* Patterns */ - WORD PatternSize[MAX_PATTERNS]; /* Patterns Lengths */ - BYTE Order[MAX_ORDERS]; /* Pattern Orders */ - MODMIDICFG m_MidiCfg; /* Midi macro config table */ - SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; /* Mix plugins */ - UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume; - DWORD m_dwSongFlags; /* Song flags SONG_XXXX */ - UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount; - UINT m_nType, m_nSamples, m_nInstruments; - UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay; - UINT m_nMusicSpeed, m_nMusicTempo; - UINT m_nNextRow, m_nRow; - UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos; - UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp; - UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide; - LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount; - DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples; - UINT m_nMaxOrderPosition; - UINT m_nPatternNames; - LPSTR m_lpszSongComments, m_lpszPatternNames; - char m_szNames[MAX_INSTRUMENTS][32]; /* changed from CHAR */ - CHAR CompressionTable[16]; +public: /* Static Members */ + static UINT m_nXBassDepth, m_nXBassRange; + static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType; + static UINT m_nProLogicDepth, m_nProLogicDelay; + static UINT m_nStereoSeparation; + static UINT m_nMaxMixChannels; + static LONG m_nStreamVolume; + static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample, + gnChannels; + static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage; + static LPSNDMIXHOOKPROC gpSndMixHook; + static PMIXPLUGINCREATEPROC gpMixPluginCreateProc; + +public: /* for Editing */ + MODCHANNEL Chn[MAX_CHANNELS]; /* Channels */ + UINT ChnMix[MAX_CHANNELS]; /* Channels to be mixed */ + MODINSTRUMENT Ins[MAX_SAMPLES]; /* Instruments */ + INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; /* Instrument Headers */ + MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; /* Channels settings */ + MODCOMMAND *Patterns[MAX_PATTERNS]; /* Patterns */ + WORD PatternSize[MAX_PATTERNS]; /* Patterns Lengths */ + BYTE Order[MAX_ORDERS]; /* Pattern Orders */ + MODMIDICFG m_MidiCfg; /* Midi macro config table */ + SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; /* Mix plugins */ + UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume; + DWORD m_dwSongFlags; /* Song flags SONG_XXXX */ + UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount; + UINT m_nType, m_nSamples, m_nInstruments; + UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay; + UINT m_nMusicSpeed, m_nMusicTempo; + UINT m_nNextRow, m_nRow; + UINT m_nPattern, m_nCurrentPattern, m_nNextPattern, m_nRestartPos; + UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp; + UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide; + LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount; + DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples; + UINT m_nMaxOrderPosition; + UINT m_nPatternNames; + LPSTR m_lpszSongComments, m_lpszPatternNames; + char m_szNames[MAX_INSTRUMENTS][32]; /* changed from CHAR */ + CHAR CompressionTable[16]; public: - CSoundFile(); - ~CSoundFile(); + CSoundFile (); + ~CSoundFile (); public: - BOOL Create(LPCBYTE lpStream, DWORD dwMemLength=0); - BOOL Destroy(); - UINT GetType() const { return m_nType; } - UINT GetNumChannels() const; - UINT GetLogicalChannels() const { return m_nChannels; } - BOOL SetMasterVolume(UINT vol, BOOL bAdjustAGC=FALSE); - UINT GetMasterVolume() const { return m_nMasterVolume; } - UINT GetNumPatterns() const; - UINT GetNumInstruments() const; - UINT GetNumSamples() const { return m_nSamples; } - UINT GetCurrentPos() const; - UINT GetCurrentPattern() const { return m_nPattern; } - UINT GetCurrentOrder() const { return m_nCurrentPattern; } - UINT GetSongComments(LPSTR s, UINT cbsize, UINT linesize=32); - UINT GetRawSongComments(LPSTR s, UINT cbsize, UINT linesize=32); - UINT GetMaxPosition() const; - void SetCurrentPos(UINT nPos); - void SetCurrentOrder(UINT nOrder); - void GetTitle(LPSTR s) const { lstrcpyn(s,m_szNames[0],32); } - LPCSTR GetTitle() const { return m_szNames[0]; } - UINT GetSampleName(UINT nSample,LPSTR s=NULL) const; - UINT GetInstrumentName(UINT nInstr,LPSTR s=NULL) const; - UINT GetMusicSpeed() const { return m_nMusicSpeed; } - UINT GetMusicTempo() const { return m_nMusicTempo; } - DWORD GetLength(BOOL bAdjust, BOOL bTotal=FALSE); - DWORD GetSongTime() { return GetLength(FALSE, TRUE); } - void SetRepeatCount(int n) { m_nRepeatCount = n; m_nInitialRepeatCount = n; } - int GetRepeatCount() const { return m_nRepeatCount; } - BOOL IsPaused() const { return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE; } - void LoopPattern(int nPat, int nRow=0); - void CheckCPUUsage(UINT nCPU); - BOOL SetPatternName(UINT nPat, LPCSTR lpszName); - BOOL GetPatternName(UINT nPat, LPSTR lpszName, UINT cbSize=MAX_PATTERNNAME) const; - /* Module Loaders */ - BOOL ReadXM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadS3M(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadMod(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadMed(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadMTM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadSTM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadIT(LPCBYTE lpStream, DWORD dwMemLength); - BOOL Read669(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadUlt(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadWav(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadDSM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadFAR(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadAMS(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadMDL(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadOKT(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadDMF(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadPTM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadDBM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength); - BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength); - /* Save Functions */ + BOOL Create (LPCBYTE lpStream, DWORD dwMemLength = 0); + BOOL Destroy (); + UINT GetType () const + { + return m_nType; + } + UINT GetNumChannels () const; + UINT GetLogicalChannels () const + { + return m_nChannels; + } + BOOL SetMasterVolume (UINT vol, BOOL bAdjustAGC = FALSE); + UINT GetMasterVolume () const + { + return m_nMasterVolume; + } + UINT GetNumPatterns () const; + UINT GetNumInstruments () const; + UINT GetNumSamples () const + { + return m_nSamples; + } + UINT GetCurrentPos () const; + UINT GetCurrentPattern () const + { + return m_nPattern; + } + UINT GetCurrentOrder () const + { + return m_nCurrentPattern; + } + UINT GetSongComments (LPSTR s, UINT cbsize, UINT linesize = 32); + UINT GetRawSongComments (LPSTR s, UINT cbsize, UINT linesize = 32); + UINT GetMaxPosition () const; + void SetCurrentPos (UINT nPos); + void SetCurrentOrder (UINT nOrder); + void GetTitle (LPSTR s) const + { + lstrcpyn (s, m_szNames[0], 32); + } + LPCSTR GetTitle () const + { + return m_szNames[0]; + } + UINT GetSampleName (UINT nSample, LPSTR s = NULL) const; + UINT GetInstrumentName (UINT nInstr, LPSTR s = NULL) const; + UINT GetMusicSpeed () const + { + return m_nMusicSpeed; + } + UINT GetMusicTempo () const + { + return m_nMusicTempo; + } + DWORD GetLength (BOOL bAdjust, BOOL bTotal = FALSE); + DWORD GetSongTime () + { + return GetLength (FALSE, TRUE); + } + void SetRepeatCount (int n) + { + m_nRepeatCount = n; + m_nInitialRepeatCount = n; + } + int GetRepeatCount () const + { + return m_nRepeatCount; + } + BOOL IsPaused () const + { + return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE; + } + void LoopPattern (int nPat, int nRow = 0); + void CheckCPUUsage (UINT nCPU); + BOOL SetPatternName (UINT nPat, LPCSTR lpszName); + BOOL GetPatternName (UINT nPat, LPSTR lpszName, UINT cbSize = + MAX_PATTERNNAME) const; + /* Module Loaders */ + BOOL ReadXM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadS3M (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadMod (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadMed (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadMTM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadSTM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadIT (LPCBYTE lpStream, DWORD dwMemLength); + BOOL Read669 (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadUlt (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadWav (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadDSM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadFAR (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadAMS (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadAMS2 (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadMDL (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadOKT (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadDMF (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadPTM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadDBM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadAMF (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadMT2 (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadPSM (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadJ2B (LPCBYTE lpStream, DWORD dwMemLength); + BOOL ReadUMX (LPCBYTE lpStream, DWORD dwMemLength); + + /* Save Functions */ #ifndef MODPLUG_NO_FILESAVE - UINT WriteSample(FILE *f, MODINSTRUMENT *pins, UINT nFlags, UINT nMaxLen=0); - BOOL SaveXM(LPCSTR lpszFileName, UINT nPacking=0); - BOOL SaveS3M(LPCSTR lpszFileName, UINT nPacking=0); - BOOL SaveMod(LPCSTR lpszFileName, UINT nPacking=0); - BOOL SaveIT(LPCSTR lpszFileName, UINT nPacking=0); + UINT WriteSample (FILE * f, MODINSTRUMENT * pins, UINT nFlags, UINT nMaxLen = + 0); + BOOL SaveXM (LPCSTR lpszFileName, UINT nPacking = 0); + BOOL SaveS3M (LPCSTR lpszFileName, UINT nPacking = 0); + BOOL SaveMod (LPCSTR lpszFileName, UINT nPacking = 0); + BOOL SaveIT (LPCSTR lpszFileName, UINT nPacking = 0); #endif /* MODPLUG_NO_FILESAVE */ - /* MOD Convert function */ - UINT GetBestSaveFormat() const; - UINT GetSaveFormats() const; - void ConvertModCommand(MODCOMMAND *) const; - void S3MConvert(MODCOMMAND *m, BOOL bIT) const; - void S3MSaveConvert(UINT *pcmd, UINT *pprm, BOOL bIT) const; - WORD ModSaveCommand(const MODCOMMAND *m, BOOL bXM) const; + /* MOD Convert function */ + UINT GetBestSaveFormat () const; + UINT GetSaveFormats () const; + void ConvertModCommand (MODCOMMAND *) const; + void S3MConvert (MODCOMMAND * m, BOOL bIT) const; + void S3MSaveConvert (UINT * pcmd, UINT * pprm, BOOL bIT) const; + WORD ModSaveCommand (const MODCOMMAND * m, BOOL bXM) const; public: - /* Real-time sound functions */ - VOID ResetChannels(); - - UINT Read(LPVOID lpBuffer, UINT cbBuffer); - UINT CreateStereoMix(int count); - BOOL FadeSong(UINT msec); - BOOL GlobalFadeSong(UINT msec); - UINT GetTotalTickCount() const { return m_nTotalCount; } - VOID ResetTotalTickCount() { m_nTotalCount = 0; } + /* Real-time sound functions */ + VOID ResetChannels (); + + UINT Read (LPVOID lpBuffer, UINT cbBuffer); + UINT CreateStereoMix (int count); + BOOL FadeSong (UINT msec); + BOOL GlobalFadeSong (UINT msec); + UINT GetTotalTickCount () const + { + return m_nTotalCount; + } + VOID ResetTotalTickCount () + { + m_nTotalCount = 0; + } public: - /* Mixer Config */ - static BOOL InitPlayer(BOOL bReset=FALSE); - static BOOL SetWaveConfig(UINT nRate,UINT nBits,UINT nChannels,BOOL bMMX=FALSE); - static BOOL SetResamplingMode(UINT nMode); /* SRCMODE_XXXX */ - static BOOL IsStereo() { return (gnChannels > 1) ? TRUE : FALSE; } - static DWORD GetSampleRate() { return gdwMixingFreq; } - static DWORD GetBitsPerSample() { return gnBitsPerSample; } - static DWORD InitSysInfo(); - static DWORD GetSysInfo() { return gdwSysInfo; } - /* AGC */ - static BOOL GetAGC() { return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; } - static void SetAGC(BOOL b); - static void ResetAGC(); - static void ProcessAGC(int count); - - /*GCCFIX -- added these functions back in! */ - static BOOL SetWaveConfigEx(BOOL bSurround,BOOL bNoOverSampling,BOOL bReverb,BOOL hqido,BOOL bMegaBass,BOOL bNR,BOOL bEQ); - /* DSP Effects */ - static void InitializeDSP(BOOL bReset); - static void ProcessStereoDSP(int count); - static void ProcessMonoDSP(int count); - /* [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms] */ - static BOOL SetReverbParameters(UINT nDepth, UINT nDelay); - /* [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100] */ - static BOOL SetXBassParameters(UINT nDepth, UINT nRange); - /* [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms] */ - static BOOL SetSurroundParameters(UINT nDepth, UINT nDelay); + /* Mixer Config */ + static BOOL InitPlayer (BOOL bReset = FALSE); + static BOOL SetWaveConfig (UINT nRate, UINT nBits, UINT nChannels, BOOL bMMX = + FALSE); + static BOOL SetResamplingMode (UINT nMode); /* SRCMODE_XXXX */ + static BOOL IsStereo () + { + return (gnChannels > 1) ? TRUE : FALSE; + } + static DWORD GetSampleRate () + { + return gdwMixingFreq; + } + static DWORD GetBitsPerSample () + { + return gnBitsPerSample; + } + static DWORD InitSysInfo (); + static DWORD GetSysInfo () + { + return gdwSysInfo; + } + /* AGC */ + static BOOL GetAGC () + { + return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE; + } + static void SetAGC (BOOL b); + static void ResetAGC (); + static void ProcessAGC (int count); + + /*GCCFIX -- added these functions back in! */ + static BOOL SetWaveConfigEx (BOOL bSurround, BOOL bNoOverSampling, + BOOL bReverb, BOOL hqido, BOOL bMegaBass, BOOL bNR, BOOL bEQ); + /* DSP Effects */ + static void InitializeDSP (BOOL bReset); + static void ProcessStereoDSP (int count); + static void ProcessMonoDSP (int count); + + /* [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms] */ + static BOOL SetReverbParameters (UINT nDepth, UINT nDelay); + + /* [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100] */ + static BOOL SetXBassParameters (UINT nDepth, UINT nRange); + + /* [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms] */ + static BOOL SetSurroundParameters (UINT nDepth, UINT nDelay); + public: - BOOL ReadNote(); - BOOL ProcessRow(); - BOOL ProcessEffects(); - UINT GetNNAChannel(UINT nChn) const; - void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut); - void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE); - void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE); - /* Channel Effects */ - void PortamentoUp(MODCHANNEL *pChn, UINT param); - void PortamentoDown(MODCHANNEL *pChn, UINT param); - void FinePortamentoUp(MODCHANNEL *pChn, UINT param); - void FinePortamentoDown(MODCHANNEL *pChn, UINT param); - void ExtraFinePortamentoUp(MODCHANNEL *pChn, UINT param); - void ExtraFinePortamentoDown(MODCHANNEL *pChn, UINT param); - void TonePortamento(MODCHANNEL *pChn, UINT param); - void Vibrato(MODCHANNEL *pChn, UINT param); - void FineVibrato(MODCHANNEL *pChn, UINT param); - void VolumeSlide(MODCHANNEL *pChn, UINT param); - void PanningSlide(MODCHANNEL *pChn, UINT param); - void ChannelVolSlide(MODCHANNEL *pChn, UINT param); - void FineVolumeUp(MODCHANNEL *pChn, UINT param); - void FineVolumeDown(MODCHANNEL *pChn, UINT param); - void Tremolo(MODCHANNEL *pChn, UINT param); - void Panbrello(MODCHANNEL *pChn, UINT param); - void RetrigNote(UINT nChn, UINT param); - void NoteCut(UINT nChn, UINT nTick); - void KeyOff(UINT nChn); - int PatternLoop(MODCHANNEL *, UINT param); - void ExtendedMODCommands(UINT nChn, UINT param); - void ExtendedS3MCommands(UINT nChn, UINT param); - void ExtendedChannelEffect(MODCHANNEL *, UINT param); - void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); - void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const; - /* Low-Level effect processing */ - void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide); - /* Global Effects */ - void SetTempo(UINT param); - void SetSpeed(UINT param); - void GlobalVolSlide(UINT param); - DWORD IsSongFinished(UINT nOrder, UINT nRow) const; - BOOL IsValidBackwardJump(UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, UINT nJumpRow) const; - /* Read/Write sample functions */ - signed char GetDeltaValue(signed char prev, UINT n) const { return (signed char)(prev + CompressionTable[n & 0x0F]); } - UINT PackSample(int &sample, int next); - BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL); - UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength); - BOOL DestroySample(UINT nSample); - BOOL DestroyInstrument(UINT nInstr); - BOOL IsSampleUsed(UINT nSample); - BOOL IsInstrumentUsed(UINT nInstr); - BOOL RemoveInstrumentSamples(UINT nInstr); - UINT DetectUnusedSamples(BOOL *); - BOOL RemoveSelectedSamples(BOOL *); - void AdjustSampleLoop(MODINSTRUMENT *pIns); - /* I/O from another sound file */ - BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument); - BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample); - /* Period/Note functions */ - UINT GetNoteFromPeriod(UINT period) const; - UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC4Speed) const; - UINT GetFreqFromPeriod(UINT period, UINT nC4Speed, int nPeriodFrac=0) const; - /* Misc functions */ - MODINSTRUMENT *GetSample(UINT n) { return Ins+n; } - void ResetMidiCfg(); - UINT MapMidiInstrument(DWORD dwProgram, UINT nChannel, UINT nNote); - BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers); - UINT SaveMixPlugins(FILE *f=NULL, BOOL bUpdate=TRUE); - UINT LoadMixPlugins(const void *pData, UINT nLen); + BOOL ReadNote (); + BOOL ProcessRow (); + BOOL ProcessEffects (); + UINT GetNNAChannel (UINT nChn) const; + void CheckNNA (UINT nChn, UINT instr, int note, BOOL bForceCut); + void NoteChange (UINT nChn, int note, BOOL bPorta = FALSE, BOOL bResetEnv = + TRUE); + void InstrumentChange (MODCHANNEL * pChn, UINT instr, BOOL bPorta = + FALSE, BOOL bUpdVol = TRUE, BOOL bResetEnv = TRUE); + /* Channel Effects */ + void PortamentoUp (MODCHANNEL * pChn, UINT param); + void PortamentoDown (MODCHANNEL * pChn, UINT param); + void FinePortamentoUp (MODCHANNEL * pChn, UINT param); + void FinePortamentoDown (MODCHANNEL * pChn, UINT param); + void ExtraFinePortamentoUp (MODCHANNEL * pChn, UINT param); + void ExtraFinePortamentoDown (MODCHANNEL * pChn, UINT param); + void TonePortamento (MODCHANNEL * pChn, UINT param); + void Vibrato (MODCHANNEL * pChn, UINT param); + void FineVibrato (MODCHANNEL * pChn, UINT param); + void VolumeSlide (MODCHANNEL * pChn, UINT param); + void PanningSlide (MODCHANNEL * pChn, UINT param); + void ChannelVolSlide (MODCHANNEL * pChn, UINT param); + void FineVolumeUp (MODCHANNEL * pChn, UINT param); + void FineVolumeDown (MODCHANNEL * pChn, UINT param); + void Tremolo (MODCHANNEL * pChn, UINT param); + void Panbrello (MODCHANNEL * pChn, UINT param); + void RetrigNote (UINT nChn, UINT param); + void NoteCut (UINT nChn, UINT nTick); + void KeyOff (UINT nChn); + int PatternLoop (MODCHANNEL *, UINT param); + void ExtendedMODCommands (UINT nChn, UINT param); + void ExtendedS3MCommands (UINT nChn, UINT param); + void ExtendedChannelEffect (MODCHANNEL *, UINT param); + void ProcessMidiMacro (UINT nChn, LPCSTR pszMidiMacro, UINT param = 0); + void SetupChannelFilter (MODCHANNEL * pChn, BOOL bReset, int flt_modifier = + 256) const; + /* Low-Level effect processing */ + void DoFreqSlide (MODCHANNEL * pChn, LONG nFreqSlide); + + /* Global Effects */ + void SetTempo (UINT param); + void SetSpeed (UINT param); + void GlobalVolSlide (UINT param); + DWORD IsSongFinished (UINT nOrder, UINT nRow) const; + BOOL IsValidBackwardJump (UINT nStartOrder, UINT nStartRow, UINT nJumpOrder, + UINT nJumpRow) const; + /* Read/Write sample functions */ + signed char GetDeltaValue (signed char prev, UINT n) const + { + return (signed char) (prev + CompressionTable[n & 0x0F]); + } + UINT PackSample (int &sample, int next); + BOOL CanPackSample (LPSTR pSample, UINT nLen, UINT nPacking, BYTE * result = + NULL); + UINT ReadSample (MODINSTRUMENT * pIns, UINT nFlags, LPCSTR pMemFile, + DWORD dwMemLength); + BOOL DestroySample (UINT nSample); + BOOL DestroyInstrument (UINT nInstr); + BOOL IsSampleUsed (UINT nSample); + BOOL IsInstrumentUsed (UINT nInstr); + BOOL RemoveInstrumentSamples (UINT nInstr); + UINT DetectUnusedSamples (BOOL *); + BOOL RemoveSelectedSamples (BOOL *); + void AdjustSampleLoop (MODINSTRUMENT * pIns); + + /* I/O from another sound file */ + BOOL ReadInstrumentFromSong (UINT nInstr, CSoundFile *, UINT nSrcInstrument); + BOOL ReadSampleFromSong (UINT nSample, CSoundFile *, UINT nSrcSample); + + /* Period/Note functions */ + UINT GetNoteFromPeriod (UINT period) const; + UINT GetPeriodFromNote (UINT note, int nFineTune, UINT nC4Speed) const; + UINT GetFreqFromPeriod (UINT period, UINT nC4Speed, int nPeriodFrac = + 0) const; + /* Misc functions */ + MODINSTRUMENT *GetSample (UINT n) + { + return Ins + n; + } + void ResetMidiCfg (); + UINT MapMidiInstrument (DWORD dwProgram, UINT nChannel, UINT nNote); + BOOL ITInstrToMPT (const void *p, INSTRUMENTHEADER * penv, UINT trkvers); + UINT SaveMixPlugins (FILE * f = NULL, BOOL bUpdate = TRUE); + UINT LoadMixPlugins (const void *pData, UINT nLen); + #ifndef NO_FILTER - DWORD CutOffToFrequency(UINT nCutOff, int flt_modifier=256) const; /* [0-255] => [1-10KHz] */ + DWORD CutOffToFrequency (UINT nCutOff, int flt_modifier = 256) const; /* [0-255] => [1-10KHz] */ #endif - /* Static helper functions */ + /* Static helper functions */ public: - static DWORD TransposeToFrequency(int transp, int ftune=0); - static int FrequencyToTranspose(DWORD freq); - static void FrequencyToTranspose(MODINSTRUMENT *psmp); + static DWORD TransposeToFrequency (int transp, int ftune = 0); + static int FrequencyToTranspose (DWORD freq); + static void FrequencyToTranspose (MODINSTRUMENT * psmp); - /* System-Dependant functions */ + /* System-Dependant functions */ public: - static MODCOMMAND *AllocatePattern(UINT rows, UINT nchns); - static signed char* AllocateSample(UINT nbytes); - static void FreePattern(LPVOID pat); - static void FreeSample(LPVOID p); - static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); + static MODCOMMAND *AllocatePattern (UINT rows, UINT nchns); + static signed char *AllocateSample (UINT nbytes); + static void FreePattern (LPVOID pat); + static void FreeSample (LPVOID p); + static UINT Normalize24BitBuffer (LPBYTE pbuffer, UINT cbsizebytes, + DWORD lmax24, DWORD dwByteInc); }; @@ -812,88 +908,88 @@ public: typedef struct WAVEFILEHEADER { - DWORD id_RIFF; /* "RIFF" */ - DWORD filesize; /* file length-8 */ - DWORD id_WAVE; + DWORD id_RIFF; /* "RIFF" */ + DWORD filesize; /* file length-8 */ + DWORD id_WAVE; } WAVEFILEHEADER; typedef struct WAVEFORMATHEADER { - DWORD id_fmt; /* "fmt " */ - DWORD hdrlen; /* 16 */ - WORD format; /* 1 */ - WORD channels; /* 1:mono, 2:stereo */ - DWORD freqHz; /* sampling freq */ - DWORD bytessec; /* bytes/sec=freqHz*samplesize */ - WORD samplesize; /* sizeof(sample) */ - WORD bitspersample; /* bits per sample (8/16) */ + DWORD id_fmt; /* "fmt " */ + DWORD hdrlen; /* 16 */ + WORD format; /* 1 */ + WORD channels; /* 1:mono, 2:stereo */ + DWORD freqHz; /* sampling freq */ + DWORD bytessec; /* bytes/sec=freqHz*samplesize */ + WORD samplesize; /* sizeof(sample) */ + WORD bitspersample; /* bits per sample (8/16) */ } WAVEFORMATHEADER; typedef struct WAVEDATAHEADER { - DWORD id_data; /* "data" */ - DWORD length; /* length of data */ + DWORD id_data; /* "data" */ + DWORD length; /* length of data */ } WAVEDATAHEADER; typedef struct WAVESMPLHEADER { - /* SMPL */ - DWORD smpl_id; /* "smpl" -> 0x6C706D73 */ - DWORD smpl_len; /* length of smpl: 3Ch (54h with sustain loop) */ - DWORD dwManufacturer; - DWORD dwProduct; - DWORD dwSamplePeriod; /* 1000000000/freqHz */ - DWORD dwBaseNote; /* 3Ch = C-4 -> 60 + RelativeTone */ - DWORD dwPitchFraction; - DWORD dwSMPTEFormat; - DWORD dwSMPTEOffset; - DWORD dwSampleLoops; /* number of loops */ - DWORD cbSamplerData; + /* SMPL */ + DWORD smpl_id; /* "smpl" -> 0x6C706D73 */ + DWORD smpl_len; /* length of smpl: 3Ch (54h with sustain loop) */ + DWORD dwManufacturer; + DWORD dwProduct; + DWORD dwSamplePeriod; /* 1000000000/freqHz */ + DWORD dwBaseNote; /* 3Ch = C-4 -> 60 + RelativeTone */ + DWORD dwPitchFraction; + DWORD dwSMPTEFormat; + DWORD dwSMPTEOffset; + DWORD dwSampleLoops; /* number of loops */ + DWORD cbSamplerData; } WAVESMPLHEADER; typedef struct SAMPLELOOPSTRUCT { - DWORD dwIdentifier; - DWORD dwLoopType; /* 0=normal, 1=bidi */ - DWORD dwLoopStart; - DWORD dwLoopEnd; /* Byte offset ? */ - DWORD dwFraction; - DWORD dwPlayCount; /* Loop Count, 0=infinite */ + DWORD dwIdentifier; + DWORD dwLoopType; /* 0=normal, 1=bidi */ + DWORD dwLoopStart; + DWORD dwLoopEnd; /* Byte offset ? */ + DWORD dwFraction; + DWORD dwPlayCount; /* Loop Count, 0=infinite */ } SAMPLELOOPSTRUCT; typedef struct WAVESAMPLERINFO { - WAVESMPLHEADER wsiHdr; - SAMPLELOOPSTRUCT wsiLoops[2]; + WAVESMPLHEADER wsiHdr; + SAMPLELOOPSTRUCT wsiLoops[2]; } WAVESAMPLERINFO; typedef struct WAVELISTHEADER { - DWORD list_id; /* "LIST" -> 0x5453494C */ - DWORD list_len; - DWORD info; /* "INFO" */ + DWORD list_id; /* "LIST" -> 0x5453494C */ + DWORD list_len; + DWORD info; /* "INFO" */ } WAVELISTHEADER; typedef struct WAVEEXTRAHEADER { - DWORD xtra_id; /* "xtra" -> 0x61727478 */ - DWORD xtra_len; - DWORD dwFlags; - WORD wPan; - WORD wVolume; - WORD wGlobalVol; - WORD wReserved; - BYTE nVibType; - BYTE nVibSweep; - BYTE nVibDepth; - BYTE nVibRate; + DWORD xtra_id; /* "xtra" -> 0x61727478 */ + DWORD xtra_len; + DWORD dwFlags; + WORD wPan; + WORD wVolume; + WORD wGlobalVol; + WORD wReserved; + BYTE nVibType; + BYTE nVibSweep; + BYTE nVibDepth; + BYTE nVibRate; } WAVEEXTRAHEADER; #pragma pack() @@ -923,8 +1019,8 @@ typedef struct WAVEEXTRAHEADER #define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) )) #define XM2MODFineTune(k) ((int)( (k>>4)&0x0f )) -int _muldiv(long a, long b, long c); -int _muldivr(long a, long b, long c); +int _muldiv (long a, long b, long c); +int _muldivr (long a, long b, long c); /* Byte swapping functions from the GNU C Library and libsdl */ @@ -954,8 +1050,8 @@ bswap_16 (unsigned short int __bsx) static inline unsigned int bswap_32 (unsigned int __bsx) { - return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | - (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); + return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); } #endif diff --git a/gst/modplug/libmodplug/stdafx.h b/gst/modplug/libmodplug/stdafx.h index dc71ea8f..76b8f67f 100644 --- a/gst/modplug/libmodplug/stdafx.h +++ b/gst/modplug/libmodplug/stdafx.h @@ -19,7 +19,10 @@ #include #include -inline void ProcessPlugins(int n) {} +inline void +ProcessPlugins (int n) +{ +} #else @@ -29,7 +32,7 @@ inline void ProcessPlugins(int n) {} typedef signed char CHAR; typedef unsigned char UCHAR; -typedef unsigned char* PUCHAR; +typedef unsigned char *PUCHAR; typedef unsigned short USHORT; typedef unsigned long ULONG; typedef unsigned long UINT; @@ -37,23 +40,24 @@ typedef unsigned long DWORD; typedef long LONG; typedef unsigned short WORD; typedef unsigned char BYTE; -typedef unsigned char * LPBYTE; +typedef unsigned char *LPBYTE; typedef bool BOOL; -typedef char * LPSTR; -typedef void * LPVOID; -typedef long * LPLONG; -typedef unsigned long * LPDWORD; -typedef unsigned short * LPWORD; -typedef const char * LPCSTR; +typedef char *LPSTR; +typedef void *LPVOID; +typedef long *LPLONG; +typedef unsigned long *LPDWORD; +typedef unsigned short *LPWORD; +typedef const char *LPCSTR; typedef long long LONGLONG; -typedef void * PVOID; +typedef void *PVOID; typedef void VOID; -inline LONG MulDiv (long a, long b, long c) +inline LONG +MulDiv (long a, long b, long c) { /* if (!c) return 0; */ - return ((unsigned long long) a * (unsigned long long) b ) / c; + return ((unsigned long long) a * (unsigned long long) b) / c; } #define MODPLUG_NO_FILESAVE @@ -67,15 +71,20 @@ inline LONG MulDiv (long a, long b, long c) #define GHND 0 -inline signed char * GlobalAllocPtr(unsigned int, size_t size) +inline signed char * +GlobalAllocPtr (unsigned int, size_t size) { - signed char * p = (signed char *) malloc(size); + signed char *p = (signed char *) malloc (size); - if (p != NULL) memset(p, 0, size); + if (p != NULL) + memset (p, 0, size); return p; } -inline void ProcessPlugins(int n) {} +inline void +ProcessPlugins (int n) +{ +} #define GlobalFreePtr(p) free((void *)(p)) @@ -93,6 +102,3 @@ inline void ProcessPlugins(int n) {} #endif /* MSC_VER */ #endif - - - diff --git a/gst/mpeg1sys/buffer.c b/gst/mpeg1sys/buffer.c index 0d029529..ceb67d07 100644 --- a/gst/mpeg1sys/buffer.c +++ b/gst/mpeg1sys/buffer.c @@ -36,7 +36,7 @@ #define AUDIO_SYNCWORD 0xfff -#define CLOCKS 90000.0 +#define CLOCKS 90000.0 #ifdef G_HAVE_ISO_VARARGS @@ -49,26 +49,26 @@ #endif /* This must match decoder and encoder tables */ -static double picture_rates [16] = -{ - 0.0, - 24000.0/1001., - 24.0, - 25.0, - 30000.0/1001., - 30.0, - 50.0, - 60000.0/1001., - 60.0, - - 1, - 5, - 10, - 12, - 15, - 0, - 0 +static double picture_rates[16] = { + 0.0, + 24000.0 / 1001., + 24.0, + 25.0, + 30000.0 / 1001., + 30.0, + 50.0, + 60000.0 / 1001., + 60.0, + + 1, + 5, + 10, + 12, + 15, + 0, + 0 }; + /* defined but not used static double ratio [16] = { 0., 1., 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, 0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, @@ -76,26 +76,25 @@ static double ratio [16] = { 0., 1., 0.6735, 0.7031, 0.7615, 0.8055, */ #ifndef GST_DISABLE_GST_DEBUG -static char picture_types [4][3] = - { "I", "P", "B", "D" }; +static char picture_types[4][3] = { "I", "P", "B", "D" }; #endif static int bitrate_index[2][3][16] = -{ { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, }, - {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, }, - {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, } }, - { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, }, - {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, }, - {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, } }, + { {{0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}}, +{{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}}, }; static long frequency[9] = -{44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000}; + { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000 }; + +static double dfrequency[9] = { 44.1, 48, 32, 22.05, 24, 16, 11.025, 12, 8 }; -static double dfrequency[9] = -{44.1, 48, 32, 22.05, 24, 16, 11.025, 12, 8}; +static unsigned int samples[4] = { 192, 384, 1152, 1152 }; -static unsigned int samples [4] = {192, 384, 1152, 1152}; /* deined but not used static char mode [4][15] = { "stereo", "joint stereo", "dual channel", "single channel" }; @@ -106,11 +105,13 @@ static char original [2][10] = static char emphasis [4][20] = { "none", "50/15 microseconds", "reserved", "CCITT J.17" }; */ -static void mpeg1mux_buffer_update_video_info(Mpeg1MuxBuffer *mb); -static void mpeg1mux_buffer_update_audio_info(Mpeg1MuxBuffer *mb); +static void mpeg1mux_buffer_update_video_info (Mpeg1MuxBuffer * mb); +static void mpeg1mux_buffer_update_audio_info (Mpeg1MuxBuffer * mb); -Mpeg1MuxBuffer *mpeg1mux_buffer_new(guchar type, guchar id) { - Mpeg1MuxBuffer *new = g_malloc(sizeof(Mpeg1MuxBuffer)); +Mpeg1MuxBuffer * +mpeg1mux_buffer_new (guchar type, guchar id) +{ + Mpeg1MuxBuffer *new = g_malloc (sizeof (Mpeg1MuxBuffer)); new->buffer = NULL; new->length = 0; @@ -127,47 +128,50 @@ Mpeg1MuxBuffer *mpeg1mux_buffer_new(guchar type, guchar id) { return new; } -void mpeg1mux_buffer_queue(Mpeg1MuxBuffer *mb, GstBuffer *buf) { +void +mpeg1mux_buffer_queue (Mpeg1MuxBuffer * mb, GstBuffer * buf) +{ if (mb->buffer == NULL) { - mb->buffer = g_malloc(GST_BUFFER_SIZE(buf)); - mb->length = GST_BUFFER_SIZE(buf); - memcpy(mb->buffer, GST_BUFFER_DATA(buf), GST_BUFFER_SIZE(buf)); - } - else { - mb->buffer = g_realloc(mb->buffer, mb->length + GST_BUFFER_SIZE(buf)); - memcpy(mb->buffer+mb->length, GST_BUFFER_DATA(buf), GST_BUFFER_SIZE(buf)); - mb->length += GST_BUFFER_SIZE(buf); + mb->buffer = g_malloc (GST_BUFFER_SIZE (buf)); + mb->length = GST_BUFFER_SIZE (buf); + memcpy (mb->buffer, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + } else { + mb->buffer = g_realloc (mb->buffer, mb->length + GST_BUFFER_SIZE (buf)); + memcpy (mb->buffer + mb->length, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + mb->length += GST_BUFFER_SIZE (buf); } GST_DEBUG ("queuing buffer %lu", mb->length); if (mb->buffer_type == BUFFER_TYPE_VIDEO) { - mpeg1mux_buffer_update_video_info(mb); - } - else { - mpeg1mux_buffer_update_audio_info(mb); + mpeg1mux_buffer_update_video_info (mb); + } else { + mpeg1mux_buffer_update_audio_info (mb); } } -gulong mpeg1mux_buffer_update_queued(Mpeg1MuxBuffer *mb, guint64 scr) { +gulong +mpeg1mux_buffer_update_queued (Mpeg1MuxBuffer * mb, guint64 scr) +{ GList *queued_list; Mpeg1MuxTimecode *tc; gulong total_queued = 0; - + GST_DEBUG ("queued in buffer on SCR=%" G_GUINT64_FORMAT, scr); - queued_list = g_list_first(mb->queued_list); + queued_list = g_list_first (mb->queued_list); while (queued_list) { tc = (Mpeg1MuxTimecode *) queued_list->data; if (tc->DTS < scr) { /* this buffer should be sent out */ - mb->queued_list = g_list_remove(mb->queued_list, tc); - queued_list = g_list_first(mb->queued_list); - } - else { - GST_DEBUG ("queued in buffer %ld, %" G_GUINT64_FORMAT, tc->original_length, tc->DTS); + mb->queued_list = g_list_remove (mb->queued_list, tc); + queued_list = g_list_first (mb->queued_list); + } else { + GST_DEBUG ("queued in buffer %ld, %" G_GUINT64_FORMAT, + tc->original_length, tc->DTS); total_queued += tc->original_length; - queued_list = g_list_next(queued_list); + queued_list = g_list_next (queued_list); } } GST_DEBUG ("queued in buffer %lu", total_queued); @@ -175,7 +179,9 @@ gulong mpeg1mux_buffer_update_queued(Mpeg1MuxBuffer *mb, guint64 scr) { return total_queued; } -void mpeg1mux_buffer_shrink(Mpeg1MuxBuffer *mb, gulong size) { +void +mpeg1mux_buffer_shrink (Mpeg1MuxBuffer * mb, gulong size) +{ GList *timecode_list; Mpeg1MuxTimecode *tc; gulong consumed = 0; @@ -183,35 +189,37 @@ void mpeg1mux_buffer_shrink(Mpeg1MuxBuffer *mb, gulong size) { GST_DEBUG ("shrinking buffer %lu", size); - g_assert(mb->length >= size); + g_assert (mb->length >= size); - memcpy(mb->buffer, mb->buffer+size, mb->length-size); - mb->buffer = g_realloc(mb->buffer, mb->length-size); + memcpy (mb->buffer, mb->buffer + size, mb->length - size); + mb->buffer = g_realloc (mb->buffer, mb->length - size); mb->length -= size; mb->scan_pos -= size; mb->current_start -= size; - timecode_list = g_list_first(mb->timecode_list); + timecode_list = g_list_first (mb->timecode_list); tc = (Mpeg1MuxTimecode *) timecode_list->data; - + if (tc->length > size) { tc->length -= size; mb->new_frame = FALSE; - } - else { + } else { consumed += tc->length; while (size >= consumed) { - GST_DEBUG ("removing timecode: %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %lu %lu", tc->DTS, tc->PTS, tc->length, consumed); - mb->timecode_list = g_list_remove_link(mb->timecode_list, timecode_list); - mb->queued_list = g_list_append(mb->queued_list, tc); - timecode_list = g_list_first(mb->timecode_list); + GST_DEBUG ("removing timecode: %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT + " %lu %lu", tc->DTS, tc->PTS, tc->length, consumed); + mb->timecode_list = g_list_remove_link (mb->timecode_list, timecode_list); + mb->queued_list = g_list_append (mb->queued_list, tc); + timecode_list = g_list_first (mb->timecode_list); tc = (Mpeg1MuxTimecode *) timecode_list->data; consumed += tc->length; - GST_DEBUG ("next timecode: %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %lu %lu", tc->DTS, tc->PTS, tc->length, consumed); + GST_DEBUG ("next timecode: %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT + " %lu %lu", tc->DTS, tc->PTS, tc->length, consumed); } mb->new_frame = TRUE; - GST_DEBUG ("leftover frame size from %lu to %lu ", tc->length, consumed-size); + GST_DEBUG ("leftover frame size from %lu to %lu ", tc->length, + consumed - size); tc->length = consumed - size; } @@ -219,128 +227,143 @@ void mpeg1mux_buffer_shrink(Mpeg1MuxBuffer *mb, gulong size) { mb->info.video.DTS = tc->DTS; mb->info.video.PTS = tc->PTS; mb->next_frame_time = tc->DTS; - } - else { + } else { mb->info.audio.PTS = tc->PTS; mb->next_frame_time = tc->PTS; } - GST_DEBUG ("next frame time timecode: %" G_GUINT64_FORMAT " %lu", mb->next_frame_time, tc->length); + GST_DEBUG ("next frame time timecode: %" G_GUINT64_FORMAT " %lu", + mb->next_frame_time, tc->length); /* check buffer consistency */ - timecode_list = g_list_first(mb->timecode_list); + timecode_list = g_list_first (mb->timecode_list); count = 0; while (timecode_list) { tc = (Mpeg1MuxTimecode *) timecode_list->data; count += tc->length; - - timecode_list = g_list_next(timecode_list); + + timecode_list = g_list_next (timecode_list); } - if (count != mb->current_start) g_print("********** error %lu != %lu\n", count, mb->current_start); + if (count != mb->current_start) + g_print ("********** error %lu != %lu\n", count, mb->current_start); mb->base += size; } -static void mpeg1mux_buffer_update_video_info(Mpeg1MuxBuffer *mb) { +static void +mpeg1mux_buffer_update_video_info (Mpeg1MuxBuffer * mb) +{ gboolean have_sync = FALSE; guchar *data = mb->buffer; gulong offset = mb->scan_pos; guint sync_zeros = 0; - gulong id=0; + gulong id = 0; guint temporal_reference, temp; gst_getbits_t gb; - + GST_DEBUG ("mpeg1mux::update_video_info %lu %lu", mb->base, mb->scan_pos); if (mb->base == 0 && mb->scan_pos == 0) { - if ((SYNCWORD_START<<8)+*(mb->buffer+3) == SEQUENCE_HEADER) { - - gst_getbits_init(&gb, NULL, NULL); - gst_getbits_newbuf(&gb, data+4, mb->length); - mb->info.video.horizontal_size = gst_getbits12(&gb); - mb->info.video.vertical_size = gst_getbits12(&gb); - mb->info.video.aspect_ratio = gst_getbits4(&gb); - mb->info.video.picture_rate = gst_getbits4(&gb); - mb->info.video.bit_rate = gst_getbits18(&gb); - if (gst_getbits1(&gb) != 1) { - g_print("mpeg1mux::update_video_info: marker bit error\n"); + if ((SYNCWORD_START << 8) + *(mb->buffer + 3) == SEQUENCE_HEADER) { + + gst_getbits_init (&gb, NULL, NULL); + gst_getbits_newbuf (&gb, data + 4, mb->length); + mb->info.video.horizontal_size = gst_getbits12 (&gb); + mb->info.video.vertical_size = gst_getbits12 (&gb); + mb->info.video.aspect_ratio = gst_getbits4 (&gb); + mb->info.video.picture_rate = gst_getbits4 (&gb); + mb->info.video.bit_rate = gst_getbits18 (&gb); + if (gst_getbits1 (&gb) != 1) { + g_print ("mpeg1mux::update_video_info: marker bit error\n"); } - mb->info.video.vbv_buffer_size = gst_getbits10(&gb); - mb->info.video.CSPF = gst_getbits1(&gb); - - mb->info.video.secs_per_frame = 1. / picture_rates[mb->info.video.picture_rate]; - mb->info.video.decoding_order=0; - mb->info.video.group_order=0; - GST_DEBUG ("mpeg1mux::update_video_info: secs per frame %g", mb->info.video.secs_per_frame); - } - else { - g_print("mpeg1mux::update_video_info: Invalid MPEG Video header\n"); + mb->info.video.vbv_buffer_size = gst_getbits10 (&gb); + mb->info.video.CSPF = gst_getbits1 (&gb); + + mb->info.video.secs_per_frame = + 1. / picture_rates[mb->info.video.picture_rate]; + mb->info.video.decoding_order = 0; + mb->info.video.group_order = 0; + GST_DEBUG ("mpeg1mux::update_video_info: secs per frame %g", + mb->info.video.secs_per_frame); + } else { + g_print ("mpeg1mux::update_video_info: Invalid MPEG Video header\n"); } } - while (offset < mb->length-6) { + while (offset < mb->length - 6) { if (!have_sync) { - guchar byte = *(data+offset); + guchar byte = *(data + offset); + /*GST_DEBUG ("mpeg1mux::update_video_info: found #%d at %lu",byte,offset); */ offset++; /* if it's zero, increment the zero count */ if (byte == 0) { - sync_zeros++; - /*GST_DEBUG ("mpeg1mux::update_video_info: found zero #%d at %lu",sync_zeros,offset-1); */ + sync_zeros++; + /*GST_DEBUG ("mpeg1mux::update_video_info: found zero #%d at %lu",sync_zeros,offset-1); */ } /* if it's a one and we have two previous zeros, we have sync */ else if ((byte == 1) && (sync_zeros >= 2)) { - GST_DEBUG ("mpeg1mux::update_video_info: synced at %lu",offset-1); - have_sync = TRUE; - sync_zeros = 0; + GST_DEBUG ("mpeg1mux::update_video_info: synced at %lu", offset - 1); + have_sync = TRUE; + sync_zeros = 0; } /* if it's anything else, we've lost it completely */ - else sync_zeros = 0; - /* then snag the chunk ID */ + else + sync_zeros = 0; + /* then snag the chunk ID */ } else if (id == 0) { - id = *(data+offset); - GST_DEBUG ("mpeg1mux::update_video_info: got id 0x%02lX",id); - id = (SYNCWORD_START<<8)+id; + id = *(data + offset); + GST_DEBUG ("mpeg1mux::update_video_info: got id 0x%02lX", id); + id = (SYNCWORD_START << 8) + id; switch (id) { case SEQUENCE_HEADER: - GST_DEBUG ("mpeg1mux::update_video_info: sequence header"); + GST_DEBUG ("mpeg1mux::update_video_info: sequence header"); break; case GROUP_START: - GST_DEBUG ("mpeg1mux::update_video_info: group start"); - mb->info.video.group_order=0; + GST_DEBUG ("mpeg1mux::update_video_info: group start"); + mb->info.video.group_order = 0; break; case PICTURE_START: /* skip the first access unit */ if (mb->info.video.decoding_order != 0) { Mpeg1MuxTimecode *tc; - GST_DEBUG ("mpeg1mux::update_video_info: PTS %" G_GUINT64_FORMAT ", DTS %" G_GUINT64_FORMAT ", length %lu", mb->info.video.current_PTS, - mb->info.video.current_DTS, offset - mb->current_start-3); - tc = (Mpeg1MuxTimecode *) g_malloc(sizeof(Mpeg1MuxTimecode)); - tc->length = offset - mb->current_start-3; + GST_DEBUG ("mpeg1mux::update_video_info: PTS %" G_GUINT64_FORMAT + ", DTS %" G_GUINT64_FORMAT ", length %lu", + mb->info.video.current_PTS, mb->info.video.current_DTS, + offset - mb->current_start - 3); + + tc = (Mpeg1MuxTimecode *) g_malloc (sizeof (Mpeg1MuxTimecode)); + tc->length = offset - mb->current_start - 3; tc->original_length = tc->length; tc->frame_type = mb->info.video.current_type; tc->DTS = mb->info.video.current_DTS; tc->PTS = mb->info.video.current_PTS; - mb->timecode_list = g_list_append(mb->timecode_list, tc); + mb->timecode_list = g_list_append (mb->timecode_list, tc); if (mb->info.video.decoding_order == 0) { mb->next_frame_time = tc->DTS; } - mb->current_start = offset-3; + mb->current_start = offset - 3; } - temp= (*(data+offset+1)<<8)+*(data+offset+2); + temp = (*(data + offset + 1) << 8) + *(data + offset + 2); temporal_reference = (temp & 0xffc0) >> 6; mb->info.video.current_type = (temp & 0x0038) >> 3; - GST_DEBUG ("mpeg1mux::update_video_info: picture start temporal_ref:%d type:%s Frame", temporal_reference, - picture_types[mb->info.video.current_type-1]); - - mb->info.video.current_DTS = mb->info.video.decoding_order * mb->info.video.secs_per_frame * CLOCKS; - mb->info.video.current_PTS = (temporal_reference - mb->info.video.group_order + 1 + - mb->info.video.decoding_order) *mb->info.video.secs_per_frame*CLOCKS; + GST_DEBUG + ("mpeg1mux::update_video_info: picture start temporal_ref:%d type:%s Frame", + temporal_reference, + picture_types[mb->info.video.current_type - 1]); + + mb->info.video.current_DTS = + mb->info.video.decoding_order * mb->info.video.secs_per_frame * + CLOCKS; + mb->info.video.current_PTS = + (temporal_reference - mb->info.video.group_order + 1 + + mb->info.video.decoding_order) * mb->info.video.secs_per_frame * + CLOCKS; mb->info.video.decoding_order++; mb->info.video.group_order++; @@ -349,7 +372,7 @@ static void mpeg1mux_buffer_update_video_info(Mpeg1MuxBuffer *mb) { offset++; break; case SEQUENCE_END: - GST_DEBUG ("mpeg1mux::update_video_info: sequence end"); + GST_DEBUG ("mpeg1mux::update_video_info: sequence end"); break; } /* prepare for next sync */ @@ -362,105 +385,115 @@ static void mpeg1mux_buffer_update_video_info(Mpeg1MuxBuffer *mb) { mb->scan_pos = offset; } -static void mpeg1mux_buffer_update_audio_info(Mpeg1MuxBuffer *mb) { +static void +mpeg1mux_buffer_update_audio_info (Mpeg1MuxBuffer * mb) +{ guchar *data = mb->buffer; gulong offset = mb->scan_pos; - guint32 id=0; + guint32 id = 0; guint padding_bit; gst_getbits_t gb; guint startup_delay = 0; - int layer_index,lsf,samplerate_index,padding; + int layer_index, lsf, samplerate_index, padding; long bpf; Mpeg1MuxTimecode *tc; - + GST_DEBUG ("mpeg1mux::update_audio_info %lu %lu", mb->base, mb->scan_pos); if (mb->base == 0 && mb->scan_pos == 0) { - id = GUINT32_FROM_BE(*((guint32 *)(data))); + id = GUINT32_FROM_BE (*((guint32 *) (data))); - printf("MPEG audio id = %08x\n", (unsigned int)id); - if ((id & 0xfff00000) == AUDIO_SYNCWORD<<20) { + printf ("MPEG audio id = %08x\n", (unsigned int) id); + if ((id & 0xfff00000) == AUDIO_SYNCWORD << 20) { /* mpegver = (header >> 19) & 0x3; don't need this for bpf */ layer_index = (id >> 17) & 0x3; mb->info.audio.layer = 4 - layer_index; lsf = (id & (1 << 20)) ? ((id & (1 << 19)) ? 0 : 1) : 1; - mb->info.audio.bit_rate = bitrate_index[lsf][mb->info.audio.layer - 1][((id >> 12) & 0xf)]; + mb->info.audio.bit_rate = + bitrate_index[lsf][mb->info.audio.layer - 1][((id >> 12) & 0xf)]; samplerate_index = (id >> 10) & 0x3; padding = (id >> 9) & 0x1; if (mb->info.audio.layer == 1) { - bpf = mb->info.audio.bit_rate * 12000; - bpf /= frequency[samplerate_index]; - bpf = ((bpf + padding) << 2); + bpf = mb->info.audio.bit_rate * 12000; + bpf /= frequency[samplerate_index]; + bpf = ((bpf + padding) << 2); } else { - bpf = mb->info.audio.bit_rate * 144000; - bpf /= frequency[samplerate_index]; - bpf += padding; + bpf = mb->info.audio.bit_rate * 144000; + bpf /= frequency[samplerate_index]; + bpf += padding; } mb->info.audio.framesize = bpf; - GST_DEBUG ("mpeg1mux::update_audio_info: samples per second %d", samplerate_index); + GST_DEBUG ("mpeg1mux::update_audio_info: samples per second %d", + samplerate_index); - gst_getbits_init(&gb, NULL, NULL); - gst_getbits_newbuf(&gb, data, mb->length); + gst_getbits_init (&gb, NULL, NULL); + gst_getbits_newbuf (&gb, data, mb->length); - gst_flushbitsn(&gb, 12); - if (gst_getbits1(&gb) != 1) { - g_print("mpeg1mux::update_audio_info: marker bit error\n"); + gst_flushbitsn (&gb, 12); + if (gst_getbits1 (&gb) != 1) { + g_print ("mpeg1mux::update_audio_info: marker bit error\n"); } - gst_flushbitsn(&gb, 2); - mb->info.audio.protection = gst_getbits1(&gb); - gst_flushbitsn(&gb, 4); - mb->info.audio.frequency = gst_getbits2(&gb); - padding_bit = gst_getbits1(&gb); - gst_flushbitsn(&gb, 1); - mb->info.audio.mode = gst_getbits2(&gb); - mb->info.audio.mode_extension = gst_getbits2(&gb); - mb->info.audio.copyright = gst_getbits1(&gb); - mb->info.audio.original_copy = gst_getbits1(&gb); - mb->info.audio.emphasis = gst_getbits2(&gb); + gst_flushbitsn (&gb, 2); + mb->info.audio.protection = gst_getbits1 (&gb); + gst_flushbitsn (&gb, 4); + mb->info.audio.frequency = gst_getbits2 (&gb); + padding_bit = gst_getbits1 (&gb); + gst_flushbitsn (&gb, 1); + mb->info.audio.mode = gst_getbits2 (&gb); + mb->info.audio.mode_extension = gst_getbits2 (&gb); + mb->info.audio.copyright = gst_getbits1 (&gb); + mb->info.audio.original_copy = gst_getbits1 (&gb); + mb->info.audio.emphasis = gst_getbits2 (&gb); GST_DEBUG ("mpeg1mux::update_audio_info: layer %d", mb->info.audio.layer); - GST_DEBUG ("mpeg1mux::update_audio_info: bit_rate %d", mb->info.audio.bit_rate); - GST_DEBUG ("mpeg1mux::update_audio_info: frequency %d", mb->info.audio.frequency); + GST_DEBUG ("mpeg1mux::update_audio_info: bit_rate %d", + mb->info.audio.bit_rate); + GST_DEBUG ("mpeg1mux::update_audio_info: frequency %d", + mb->info.audio.frequency); - mb->info.audio.samples_per_second = (double)dfrequency [mb->info.audio.frequency]; + mb->info.audio.samples_per_second = + (double) dfrequency[mb->info.audio.frequency]; - GST_DEBUG ("mpeg1mux::update_audio_info: samples per second %g", mb->info.audio.samples_per_second); + GST_DEBUG ("mpeg1mux::update_audio_info: samples per second %g", + mb->info.audio.samples_per_second); - mb->info.audio.decoding_order=0; + mb->info.audio.decoding_order = 0; - tc = (Mpeg1MuxTimecode *) g_malloc(sizeof(Mpeg1MuxTimecode)); + tc = (Mpeg1MuxTimecode *) g_malloc (sizeof (Mpeg1MuxTimecode)); tc->length = mb->info.audio.framesize; tc->original_length = tc->length; tc->frame_type = FRAME_TYPE_AUDIO; - mb->info.audio.current_PTS = mb->info.audio.decoding_order * samples [mb->info.audio.layer] / - mb->info.audio.samples_per_second * 90. + startup_delay; + mb->info.audio.current_PTS = + mb->info.audio.decoding_order * samples[mb->info.audio.layer] / + mb->info.audio.samples_per_second * 90. + startup_delay; - GST_DEBUG ("mpeg1mux::update_audio_info: PTS %" G_GUINT64_FORMAT ", length %u", mb->info.audio.current_PTS, mb->info.audio.framesize); + GST_DEBUG ("mpeg1mux::update_audio_info: PTS %" G_GUINT64_FORMAT + ", length %u", mb->info.audio.current_PTS, mb->info.audio.framesize); tc->PTS = mb->info.audio.current_PTS; tc->DTS = mb->info.audio.current_PTS; - mb->timecode_list = g_list_append(mb->timecode_list, tc); + mb->timecode_list = g_list_append (mb->timecode_list, tc); mb->next_frame_time = tc->PTS; mb->info.audio.decoding_order++; offset += tc->length; - } - else { - g_print("mpeg1mux::update_audio_info: Invalid MPEG Video header\n"); + } else { + g_print ("mpeg1mux::update_audio_info: Invalid MPEG Video header\n"); } } - while (offset < mb->length-4) { - id = GUINT32_FROM_BE(*((guint32 *)(data+offset))); + while (offset < mb->length - 4) { + id = GUINT32_FROM_BE (*((guint32 *) (data + offset))); /* mpegver = (header >> 19) & 0x3; don't need this for bpf */ layer_index = (id >> 17) & 0x3; mb->info.audio.layer = 4 - layer_index; lsf = (id & (1 << 20)) ? ((id & (1 << 19)) ? 0 : 1) : 1; - mb->info.audio.bit_rate = bitrate_index[lsf][mb->info.audio.layer - 1][((id >> 12) & 0xf)]; + mb->info.audio.bit_rate = + bitrate_index[lsf][mb->info.audio.layer - 1][((id >> 12) & 0xf)]; samplerate_index = (id >> 10) & 0x3; padding = (id >> 9) & 0x1; @@ -473,21 +506,25 @@ static void mpeg1mux_buffer_update_audio_info(Mpeg1MuxBuffer *mb) { bpf /= frequency[samplerate_index]; bpf += padding; } - tc = (Mpeg1MuxTimecode *) g_malloc(sizeof(Mpeg1MuxTimecode)); + tc = (Mpeg1MuxTimecode *) g_malloc (sizeof (Mpeg1MuxTimecode)); tc->length = bpf; tc->original_length = tc->length; tc->frame_type = FRAME_TYPE_AUDIO; mb->current_start = offset + bpf; - mb->info.audio.samples_per_second = (double)dfrequency [mb->info.audio.frequency]; + mb->info.audio.samples_per_second = + (double) dfrequency[mb->info.audio.frequency]; - mb->info.audio.current_PTS = (mb->info.audio.decoding_order * samples [mb->info.audio.layer]) / - mb->info.audio.samples_per_second * 90. ; + mb->info.audio.current_PTS = + (mb->info.audio.decoding_order * samples[mb->info.audio.layer]) / + mb->info.audio.samples_per_second * 90.; tc->DTS = tc->PTS = mb->info.audio.current_PTS; - GST_DEBUG ("mpeg1mux::update_audio_info: PTS %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT " length %lu", mb->info.audio.current_PTS, tc->PTS, tc->length); - mb->timecode_list = g_list_append(mb->timecode_list, tc); + GST_DEBUG ("mpeg1mux::update_audio_info: PTS %" G_GUINT64_FORMAT ", %" + G_GUINT64_FORMAT " length %lu", mb->info.audio.current_PTS, tc->PTS, + tc->length); + mb->timecode_list = g_list_append (mb->timecode_list, tc); mb->info.audio.decoding_order++; offset += tc->length; diff --git a/gst/mpeg1sys/buffer.h b/gst/mpeg1sys/buffer.h index 0624c3aa..2a9fb71f 100644 --- a/gst/mpeg1sys/buffer.h +++ b/gst/mpeg1sys/buffer.h @@ -24,8 +24,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define MPEG1MUX_BUFFER_QUEUED(mb) (g_list_length((mb)->timecode_list)) #define MPEG1MUX_BUFFER_SPACE(mb) ((mb)->length) @@ -41,101 +42,104 @@ extern "C" { #define FRAME_TYPE_PFRAME 3 #define FRAME_TYPE_AUDIO 4 -typedef struct _Mpeg1MuxBuffer Mpeg1MuxBuffer; -typedef struct _Mpeg1MuxTimecode Mpeg1MuxTimecode; - -typedef struct video_struc /* Informationen ueber Video Stream */ -{ - unsigned int stream_length ; - unsigned int num_sequence ; - unsigned int num_seq_end ; - unsigned int num_pictures ; - unsigned int num_groups ; - unsigned int num_frames[4] ; - unsigned int avg_frames[4] ; - - unsigned int horizontal_size; - unsigned int vertical_size ; - unsigned int aspect_ratio ; - unsigned int picture_rate ; - unsigned int bit_rate ; - unsigned int comp_bit_rate ; - unsigned int vbv_buffer_size; - unsigned int CSPF ; - - guint64 PTS; - guint64 DTS; - - guint64 current_PTS; - guint64 current_DTS; - guchar current_type; - - double secs_per_frame; - gulong group_order, decoding_order; -} Video_struc; - -typedef struct audio_struc /* Informationen ueber Audio Stream */ -{ - unsigned int stream_length ; - unsigned int num_syncword ; - unsigned int num_frames [2] ; - unsigned int framesize ; - unsigned int layer ; - unsigned int protection ; - unsigned int bit_rate ; - unsigned int frequency ; - unsigned int mode ; - unsigned int mode_extension ; - unsigned int copyright ; - unsigned int original_copy ; - unsigned int emphasis ; - - guint64 PTS; - - guint64 current_PTS; - - double samples_per_second; - gulong decoding_order; -} Audio_struc; - -struct _Mpeg1MuxTimecode { - gulong length; - gulong original_length; - guchar frame_type; - guint64 PTS; - guint64 DTS; -}; - -struct _Mpeg1MuxBuffer { - unsigned char *buffer; - gulong length; - gulong base; - gulong scan_pos; - gulong last_pos; - gulong current_start; - guchar buffer_type; - guchar stream_id; - gboolean new_frame; - guint64 next_frame_time; - - union { - Video_struc video; - Audio_struc audio; - } info; - - GList *timecode_list; - GList *queued_list; -}; - -Mpeg1MuxBuffer *mpeg1mux_buffer_new(guchar type, guchar id); - -void mpeg1mux_buffer_queue(Mpeg1MuxBuffer *mb, GstBuffer *buf); -void mpeg1mux_buffer_shrink(Mpeg1MuxBuffer *mb, gulong size); -gulong mpeg1mux_buffer_update_queued(Mpeg1MuxBuffer *mb, guint64 scr); + typedef struct _Mpeg1MuxBuffer Mpeg1MuxBuffer; + typedef struct _Mpeg1MuxTimecode Mpeg1MuxTimecode; + + typedef struct video_struc /* Informationen ueber Video Stream */ + { + unsigned int stream_length; + unsigned int num_sequence; + unsigned int num_seq_end; + unsigned int num_pictures; + unsigned int num_groups; + unsigned int num_frames[4]; + unsigned int avg_frames[4]; + + unsigned int horizontal_size; + unsigned int vertical_size; + unsigned int aspect_ratio; + unsigned int picture_rate; + unsigned int bit_rate; + unsigned int comp_bit_rate; + unsigned int vbv_buffer_size; + unsigned int CSPF; + + guint64 PTS; + guint64 DTS; + + guint64 current_PTS; + guint64 current_DTS; + guchar current_type; + + double secs_per_frame; + gulong group_order, decoding_order; + } Video_struc; + + typedef struct audio_struc /* Informationen ueber Audio Stream */ + { + unsigned int stream_length; + unsigned int num_syncword; + unsigned int num_frames[2]; + unsigned int framesize; + unsigned int layer; + unsigned int protection; + unsigned int bit_rate; + unsigned int frequency; + unsigned int mode; + unsigned int mode_extension; + unsigned int copyright; + unsigned int original_copy; + unsigned int emphasis; + + guint64 PTS; + + guint64 current_PTS; + + double samples_per_second; + gulong decoding_order; + } Audio_struc; + + struct _Mpeg1MuxTimecode + { + gulong length; + gulong original_length; + guchar frame_type; + guint64 PTS; + guint64 DTS; + }; + + struct _Mpeg1MuxBuffer + { + unsigned char *buffer; + gulong length; + gulong base; + gulong scan_pos; + gulong last_pos; + gulong current_start; + guchar buffer_type; + guchar stream_id; + gboolean new_frame; + guint64 next_frame_time; + + union + { + Video_struc video; + Audio_struc audio; + } info; + + GList *timecode_list; + GList *queued_list; + }; + + Mpeg1MuxBuffer *mpeg1mux_buffer_new (guchar type, guchar id); + + void mpeg1mux_buffer_queue (Mpeg1MuxBuffer * mb, GstBuffer * buf); + void mpeg1mux_buffer_shrink (Mpeg1MuxBuffer * mb, gulong size); + gulong mpeg1mux_buffer_update_queued (Mpeg1MuxBuffer * mb, guint64 scr); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __BUFFER_H__ */ +#endif /* __BUFFER_H__ */ diff --git a/gst/mpeg1sys/gstmpeg1systemencode.c b/gst/mpeg1sys/gstmpeg1systemencode.c index e3d38d9a..a071f0c4 100644 --- a/gst/mpeg1sys/gstmpeg1systemencode.c +++ b/gst/mpeg1sys/gstmpeg1systemencode.c @@ -39,59 +39,54 @@ static GstElementDetails system_encode_details = { }; /* GstMPEG1SystemEncode signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/mpeg, " - "systemstream = (boolean) TRUE") -); +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " "systemstream = (boolean) TRUE") + ); static GstStaticPadTemplate video_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "video_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ("video/mpeg, " - "mpegversion = (int) 1, " - "systemstream = (boolean) FALSE") -); +GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) 1, " "systemstream = (boolean) FALSE") + ); static GstStaticPadTemplate audio_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "audio_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ("audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 2 ] " - ) -); - -static void gst_system_encode_class_init (GstMPEG1SystemEncodeClass *klass); -static void gst_system_encode_base_init (GstMPEG1SystemEncodeClass *klass); -static void gst_system_encode_init (GstMPEG1SystemEncode *system_encode); - -static GstPad* gst_system_encode_request_new_pad (GstElement *element, GstPadTemplate *templ, - const gchar *unused); -static void gst_system_encode_chain (GstPad *pad, GstData *_data); - -static void gst_system_encode_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_system_encode_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " "layer = (int) [ 1, 2 ] ") + ); + +static void gst_system_encode_class_init (GstMPEG1SystemEncodeClass * klass); +static void gst_system_encode_base_init (GstMPEG1SystemEncodeClass * klass); +static void gst_system_encode_init (GstMPEG1SystemEncode * system_encode); + +static GstPad *gst_system_encode_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * unused); +static void gst_system_encode_chain (GstPad * pad, GstData * _data); + +static void gst_system_encode_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_system_encode_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_system_encode_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -101,46 +96,48 @@ gst_mpeg1_system_encode_get_type (void) if (!system_encode_type) { static const GTypeInfo system_encode_info = { - sizeof(GstMPEG1SystemEncodeClass), - (GBaseInitFunc)gst_system_encode_base_init, + sizeof (GstMPEG1SystemEncodeClass), + (GBaseInitFunc) gst_system_encode_base_init, NULL, - (GClassInitFunc)gst_system_encode_class_init, + (GClassInitFunc) gst_system_encode_class_init, NULL, NULL, - sizeof(GstMPEG1SystemEncode), + sizeof (GstMPEG1SystemEncode), 0, - (GInstanceInitFunc)gst_system_encode_init, + (GInstanceInitFunc) gst_system_encode_init, NULL }; - system_encode_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMPEG1SystemEncode", &system_encode_info, 0); + system_encode_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMPEG1SystemEncode", + &system_encode_info, 0); } return system_encode_type; } static void -gst_system_encode_base_init (GstMPEG1SystemEncodeClass *klass) +gst_system_encode_base_init (GstMPEG1SystemEncodeClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_factory)); + gst_static_pad_template_get (&src_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&audio_sink_factory)); + gst_static_pad_template_get (&audio_sink_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&video_sink_factory)); + gst_static_pad_template_get (&video_sink_factory)); gst_element_class_set_details (element_class, &system_encode_details); } static void -gst_system_encode_class_init (GstMPEG1SystemEncodeClass *klass) +gst_system_encode_class_init (GstMPEG1SystemEncodeClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_system_encode_set_property; gobject_class->get_property = gst_system_encode_get_property; @@ -149,10 +146,11 @@ gst_system_encode_class_init (GstMPEG1SystemEncodeClass *klass) } static void -gst_system_encode_init (GstMPEG1SystemEncode *system_encode) +gst_system_encode_init (GstMPEG1SystemEncode * system_encode) { - system_encode->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_factory), "src"); + system_encode->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), + "src"); gst_element_add_pad (GST_ELEMENT (system_encode), system_encode->srcpad); system_encode->video_buffer = mpeg1mux_buffer_new (BUFFER_TYPE_VIDEO, 0xE0); @@ -160,7 +158,7 @@ gst_system_encode_init (GstMPEG1SystemEncode *system_encode) system_encode->have_setup = FALSE; system_encode->mta = NULL; system_encode->packet_size = 2048; - system_encode->lock = g_mutex_new(); + system_encode->lock = g_mutex_new (); system_encode->current_pack = system_encode->packets_per_pack = 3; system_encode->video_delay_ms = 0; system_encode->audio_delay_ms = 0; @@ -175,8 +173,9 @@ gst_system_encode_init (GstMPEG1SystemEncode *system_encode) } -static GstPad* -gst_system_encode_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) +static GstPad * +gst_system_encode_request_new_pad (GstElement * element, GstPadTemplate * templ, + const gchar * unused) { GstMPEG1SystemEncode *system_encode; gchar *name = NULL; @@ -194,23 +193,23 @@ gst_system_encode_request_new_pad (GstElement *element, GstPadTemplate *templ, c name = g_strdup_printf ("audio_%02d", system_encode->num_audio_pads); g_print ("%s\n", name); newpad = gst_pad_new_from_template (templ, name); - gst_pad_set_element_private (newpad, GINT_TO_POINTER (system_encode->num_audio_pads)); + gst_pad_set_element_private (newpad, + GINT_TO_POINTER (system_encode->num_audio_pads)); system_encode->audio_pad[system_encode->num_audio_pads] = newpad; system_encode->num_audio_pads++; system_encode->which_streams |= STREAMS_AUDIO; - } - else if (templ == gst_static_pad_template_get (&video_sink_factory)) { + } else if (templ == gst_static_pad_template_get (&video_sink_factory)) { name = g_strdup_printf ("video_%02d", system_encode->num_video_pads); g_print ("%s\n", name); newpad = gst_pad_new_from_template (templ, name); - gst_pad_set_element_private (newpad, GINT_TO_POINTER (system_encode->num_video_pads)); + gst_pad_set_element_private (newpad, + GINT_TO_POINTER (system_encode->num_video_pads)); system_encode->video_pad[system_encode->num_video_pads] = newpad; system_encode->num_video_pads++; system_encode->which_streams |= STREAMS_VIDEO; - } - else { + } else { g_warning ("system_encode: this is not our template!\n"); return NULL; } @@ -222,59 +221,67 @@ gst_system_encode_request_new_pad (GstElement *element, GstPadTemplate *templ, c } /* return a list of all the highest prioripty streams */ -static GList* -gst_system_encode_pick_streams (GList *mta, GstMPEG1SystemEncode *system_encode) +static GList * +gst_system_encode_pick_streams (GList * mta, + GstMPEG1SystemEncode * system_encode) { guint64 lowest = ~1; - GST_DEBUG ("pick_streams: %" G_GINT64_FORMAT ", %" G_GINT64_FORMAT, system_encode->video_buffer->next_frame_time, - system_encode->audio_buffer->next_frame_time); + GST_DEBUG ("pick_streams: %" G_GINT64_FORMAT ", %" G_GINT64_FORMAT, + system_encode->video_buffer->next_frame_time, + system_encode->audio_buffer->next_frame_time); if (system_encode->which_streams & STREAMS_VIDEO) { - if (system_encode->video_buffer->next_frame_time < lowest-system_encode->video_delay) { + if (system_encode->video_buffer->next_frame_time < + lowest - system_encode->video_delay) { lowest = system_encode->video_buffer->next_frame_time; } } if (system_encode->which_streams & STREAMS_AUDIO) { - if (system_encode->audio_buffer->next_frame_time < lowest-system_encode->audio_delay) { + if (system_encode->audio_buffer->next_frame_time < + lowest - system_encode->audio_delay) { lowest = system_encode->audio_buffer->next_frame_time; } } if (system_encode->which_streams & STREAMS_VIDEO) { if (system_encode->video_buffer->next_frame_time == lowest) { - mta = g_list_append(mta, system_encode->video_buffer); + mta = g_list_append (mta, system_encode->video_buffer); } } if (system_encode->which_streams & STREAMS_AUDIO) { if (system_encode->audio_buffer->next_frame_time == lowest) { - mta = g_list_append(mta, system_encode->audio_buffer); + mta = g_list_append (mta, system_encode->audio_buffer); } } return mta; } static gboolean -gst_system_encode_have_data (GstMPEG1SystemEncode *system_encode) +gst_system_encode_have_data (GstMPEG1SystemEncode * system_encode) { if (system_encode->which_streams == (STREAMS_VIDEO | STREAMS_AUDIO)) { - if (MPEG1MUX_BUFFER_QUEUED(system_encode->audio_buffer) > 2 && - MPEG1MUX_BUFFER_SPACE(system_encode->audio_buffer) > system_encode->packet_size*2 && - MPEG1MUX_BUFFER_QUEUED(system_encode->video_buffer) > 2 && - MPEG1MUX_BUFFER_SPACE(system_encode->video_buffer) > system_encode->packet_size*2) { + if (MPEG1MUX_BUFFER_QUEUED (system_encode->audio_buffer) > 2 && + MPEG1MUX_BUFFER_SPACE (system_encode->audio_buffer) > + system_encode->packet_size * 2 + && MPEG1MUX_BUFFER_QUEUED (system_encode->video_buffer) > 2 + && MPEG1MUX_BUFFER_SPACE (system_encode->video_buffer) > + system_encode->packet_size * 2) { return TRUE; } } if (system_encode->which_streams == STREAMS_VIDEO) { - if (MPEG1MUX_BUFFER_QUEUED(system_encode->video_buffer) > 2 && - MPEG1MUX_BUFFER_SPACE(system_encode->video_buffer) > system_encode->packet_size*2) { + if (MPEG1MUX_BUFFER_QUEUED (system_encode->video_buffer) > 2 && + MPEG1MUX_BUFFER_SPACE (system_encode->video_buffer) > + system_encode->packet_size * 2) { return TRUE; } } if (system_encode->which_streams == STREAMS_VIDEO) { - if (MPEG1MUX_BUFFER_QUEUED(system_encode->audio_buffer) > 2 && - MPEG1MUX_BUFFER_SPACE(system_encode->audio_buffer) > system_encode->packet_size*2) { + if (MPEG1MUX_BUFFER_QUEUED (system_encode->audio_buffer) > 2 && + MPEG1MUX_BUFFER_SPACE (system_encode->audio_buffer) > + system_encode->packet_size * 2) { return TRUE; } } @@ -282,67 +289,85 @@ gst_system_encode_have_data (GstMPEG1SystemEncode *system_encode) return FALSE; } -static GList* -gst_system_encode_update_mta (GstMPEG1SystemEncode *system_encode, GList *mta, gulong size) +static GList * +gst_system_encode_update_mta (GstMPEG1SystemEncode * system_encode, GList * mta, + gulong size) { - GList *streams = g_list_first(mta); - Mpeg1MuxBuffer *mb = (Mpeg1MuxBuffer *)streams->data; + GList *streams = g_list_first (mta); + Mpeg1MuxBuffer *mb = (Mpeg1MuxBuffer *) streams->data; GST_DEBUG ("system_encode::multiplex: update mta"); - mpeg1mux_buffer_shrink(mb, size); + mpeg1mux_buffer_shrink (mb, size); - mta = g_list_remove(mta, mb); + mta = g_list_remove (mta, mb); return mta; } static void -gst_system_setup_multiplex (GstMPEG1SystemEncode *system_encode) +gst_system_setup_multiplex (GstMPEG1SystemEncode * system_encode) { Mpeg1MuxTimecode *video_tc, *audio_tc; - system_encode->audio_buffer_size = 4*1024; - system_encode->video_buffer_size = 46*1024; + system_encode->audio_buffer_size = 4 * 1024; + system_encode->video_buffer_size = 46 * 1024; system_encode->bytes_output = 0; - system_encode->min_packet_data = system_encode->packet_size - PACK_HEADER_SIZE - SYS_HEADER_SIZE - - PACKET_HEADER_SIZE - AFTER_PACKET_LENGTH; - system_encode->max_packet_data = system_encode->packet_size - PACKET_HEADER_SIZE - AFTER_PACKET_LENGTH; + system_encode->min_packet_data = + system_encode->packet_size - PACK_HEADER_SIZE - SYS_HEADER_SIZE - + PACKET_HEADER_SIZE - AFTER_PACKET_LENGTH; + system_encode->max_packet_data = + system_encode->packet_size - PACKET_HEADER_SIZE - AFTER_PACKET_LENGTH; if (system_encode->which_streams & STREAMS_VIDEO) { - system_encode->video_rate = system_encode->video_buffer->info.video.bit_rate * 50; - } - else system_encode->video_rate = 0; + system_encode->video_rate = + system_encode->video_buffer->info.video.bit_rate * 50; + } else + system_encode->video_rate = 0; if (system_encode->which_streams & STREAMS_AUDIO) - system_encode->audio_rate = system_encode->audio_buffer->info.audio.bit_rate * 128; - else system_encode->audio_rate = 0; - - system_encode->data_rate = system_encode->video_rate + system_encode->audio_rate; - - system_encode->dmux_rate = ceil((double)(system_encode->data_rate) * - ((double)(system_encode->packet_size)/(double)(system_encode->min_packet_data) + - ((double)(system_encode->packet_size)/(double)(system_encode->max_packet_data) * - (double)(system_encode->packets_per_pack-1.))) / (double)(system_encode->packets_per_pack) ); - system_encode->data_rate = ceil(system_encode->dmux_rate/50.)*50; - - GST_DEBUG ("system_encode::multiplex: data_rate %u, video_rate: %u, audio_rate: %u", system_encode->data_rate, - system_encode->video_rate, system_encode->audio_rate); - - system_encode->video_delay = (double)system_encode->video_delay_ms*(double)(CLOCKS/1000); - system_encode->audio_delay = (double)system_encode->audio_delay_ms*(double)(CLOCKS/1000); - - system_encode->mux_rate = ceil(system_encode->dmux_rate/50.); - system_encode->dmux_rate= system_encode->mux_rate * 50.; - - video_tc = MPEG1MUX_BUFFER_FIRST_TIMECODE(system_encode->video_buffer); - audio_tc = MPEG1MUX_BUFFER_FIRST_TIMECODE(system_encode->audio_buffer); - - GST_DEBUG ("system_encode::video tc %" G_GINT64_FORMAT ", audio tc %" G_GINT64_FORMAT ":", video_tc->DTS, audio_tc->DTS); - - system_encode->delay = ((double)system_encode->sectors_delay + - ceil((double)video_tc->length/(double)system_encode->min_packet_data) + - ceil((double)video_tc->length/(double)system_encode->min_packet_data )) * - (double)system_encode->packet_size/system_encode->dmux_rate*(double)CLOCKS; + system_encode->audio_rate = + system_encode->audio_buffer->info.audio.bit_rate * 128; + else + system_encode->audio_rate = 0; + + system_encode->data_rate = + system_encode->video_rate + system_encode->audio_rate; + + system_encode->dmux_rate = ceil ((double) (system_encode->data_rate) * + ((double) (system_encode->packet_size) / + (double) (system_encode->min_packet_data) + + ((double) (system_encode->packet_size) / + (double) (system_encode->max_packet_data) * + (double) (system_encode->packets_per_pack - + 1.))) / (double) (system_encode->packets_per_pack)); + system_encode->data_rate = ceil (system_encode->dmux_rate / 50.) * 50; + + GST_DEBUG + ("system_encode::multiplex: data_rate %u, video_rate: %u, audio_rate: %u", + system_encode->data_rate, system_encode->video_rate, + system_encode->audio_rate); + + system_encode->video_delay = + (double) system_encode->video_delay_ms * (double) (CLOCKS / 1000); + system_encode->audio_delay = + (double) system_encode->audio_delay_ms * (double) (CLOCKS / 1000); + + system_encode->mux_rate = ceil (system_encode->dmux_rate / 50.); + system_encode->dmux_rate = system_encode->mux_rate * 50.; + + video_tc = MPEG1MUX_BUFFER_FIRST_TIMECODE (system_encode->video_buffer); + audio_tc = MPEG1MUX_BUFFER_FIRST_TIMECODE (system_encode->audio_buffer); + + GST_DEBUG ("system_encode::video tc %" G_GINT64_FORMAT ", audio tc %" + G_GINT64_FORMAT ":", video_tc->DTS, audio_tc->DTS); + + system_encode->delay = ((double) system_encode->sectors_delay + + ceil ((double) video_tc->length / + (double) system_encode->min_packet_data) + + ceil ((double) video_tc->length / + (double) system_encode->min_packet_data)) * + (double) system_encode->packet_size / system_encode->dmux_rate * + (double) CLOCKS; system_encode->audio_delay += system_encode->delay; system_encode->video_delay += system_encode->delay; @@ -351,134 +376,142 @@ gst_system_setup_multiplex (GstMPEG1SystemEncode *system_encode) system_encode->video_delay = 0; system_encode->delay = 0; - GST_DEBUG ("system_encode::multiplex: delay %g, mux_rate: %lu", system_encode->delay, system_encode->mux_rate); + GST_DEBUG ("system_encode::multiplex: delay %g, mux_rate: %lu", + system_encode->delay, system_encode->mux_rate); } static void -gst_system_encode_multiplex(GstMPEG1SystemEncode *system_encode) +gst_system_encode_multiplex (GstMPEG1SystemEncode * system_encode) { GList *streams; - Mpeg1MuxBuffer *mb = (Mpeg1MuxBuffer *)streams->data; + Mpeg1MuxBuffer *mb = (Mpeg1MuxBuffer *) streams->data; guchar timestamps; guchar buffer_scale; GstBuffer *outbuf; - Pack_struc *pack; - Sys_header_struc *sys_header; + Pack_struc *pack; + Sys_header_struc *sys_header; Mpeg1MuxTimecode *tc; gulong buffer_size, non_scaled_buffer_size, total_queued; guint64 PTS, DTS; - g_mutex_lock(system_encode->lock); + g_mutex_lock (system_encode->lock); - while (gst_system_encode_have_data(system_encode)) { + while (gst_system_encode_have_data (system_encode)) { GST_DEBUG ("system_encode::multiplex: multiplexing"); if (!system_encode->have_setup) { - gst_system_setup_multiplex(system_encode); + gst_system_setup_multiplex (system_encode); system_encode->have_setup = TRUE; } if (system_encode->mta == NULL) { - system_encode->mta = gst_system_encode_pick_streams(system_encode->mta, system_encode); + system_encode->mta = + gst_system_encode_pick_streams (system_encode->mta, system_encode); } - if (system_encode->mta == NULL) break; + if (system_encode->mta == NULL) + break; - system_encode->SCR = (guint64)(system_encode->bytes_output+LAST_SCR_BYTE_IN_PACK)*CLOCKS/system_encode->dmux_rate; + system_encode->SCR = + (guint64) (system_encode->bytes_output + + LAST_SCR_BYTE_IN_PACK) * CLOCKS / system_encode->dmux_rate; - streams = g_list_first(system_encode->mta); - mb = (Mpeg1MuxBuffer *)streams->data; + streams = g_list_first (system_encode->mta); + mb = (Mpeg1MuxBuffer *) streams->data; if (system_encode->current_pack == system_encode->packets_per_pack) { - create_pack(system_encode->pack, system_encode->SCR, system_encode->mux_rate); - create_sys_header (system_encode->sys_header, system_encode->mux_rate, 1, 1, 1, 1, 1, 1, - AUDIO_STR_0, 0, system_encode->audio_buffer_size/128, - VIDEO_STR_0, 1, system_encode->video_buffer_size/1024, system_encode->which_streams ); + create_pack (system_encode->pack, system_encode->SCR, + system_encode->mux_rate); + create_sys_header (system_encode->sys_header, system_encode->mux_rate, 1, + 1, 1, 1, 1, 1, AUDIO_STR_0, 0, system_encode->audio_buffer_size / 128, + VIDEO_STR_0, 1, system_encode->video_buffer_size / 1024, + system_encode->which_streams); system_encode->current_pack = 0; pack = system_encode->pack; sys_header = system_encode->sys_header; - } - else { + } else { system_encode->current_pack++; pack = NULL; sys_header = NULL; } - tc = MPEG1MUX_BUFFER_FIRST_TIMECODE(mb); + tc = MPEG1MUX_BUFFER_FIRST_TIMECODE (mb); if (mb->new_frame) { GST_DEBUG ("system_encode::multiplex: new frame"); - if (tc->frame_type == FRAME_TYPE_AUDIO || tc->frame_type == FRAME_TYPE_IFRAME || tc->frame_type == FRAME_TYPE_PFRAME) { - timestamps = TIMESTAMPS_PTS; - } - else { - timestamps = TIMESTAMPS_PTS_DTS; + if (tc->frame_type == FRAME_TYPE_AUDIO + || tc->frame_type == FRAME_TYPE_IFRAME + || tc->frame_type == FRAME_TYPE_PFRAME) { + timestamps = TIMESTAMPS_PTS; + } else { + timestamps = TIMESTAMPS_PTS_DTS; } - } - else { + } else { timestamps = TIMESTAMPS_NO; } if (tc->frame_type != FRAME_TYPE_AUDIO) { - if (tc->PTSstartup_delay) + if (tc->PTS < system_encode->startup_delay) system_encode->startup_delay = tc->PTS; } if (tc->frame_type == FRAME_TYPE_AUDIO) { buffer_scale = 0; non_scaled_buffer_size = system_encode->audio_buffer_size; - buffer_size = system_encode->audio_buffer_size/128; + buffer_size = system_encode->audio_buffer_size / 128; PTS = tc->PTS + system_encode->audio_delay + system_encode->startup_delay; DTS = tc->PTS + system_encode->audio_delay + system_encode->startup_delay; - } - else { + } else { buffer_scale = 1; non_scaled_buffer_size = system_encode->video_buffer_size; - buffer_size = system_encode->video_buffer_size/1024; + buffer_size = system_encode->video_buffer_size / 1024; PTS = tc->PTS + system_encode->video_delay; DTS = tc->DTS + system_encode->video_delay; } - total_queued = mpeg1mux_buffer_update_queued(mb, system_encode->SCR); + total_queued = mpeg1mux_buffer_update_queued (mb, system_encode->SCR); if (non_scaled_buffer_size - total_queued >= system_encode->packet_size) { /* write the pack/packet here */ create_sector (system_encode->sector, pack, sys_header, - system_encode->packet_size, - MPEG1MUX_BUFFER_DATA(mb), mb->stream_id, buffer_scale, - buffer_size, TRUE, PTS, DTS, - timestamps, system_encode->which_streams); - /* update mta */ - system_encode->mta = gst_system_encode_update_mta(system_encode, system_encode->mta, - system_encode->sector->length_of_packet_data); - } - else { + system_encode->packet_size, + MPEG1MUX_BUFFER_DATA (mb), mb->stream_id, buffer_scale, + buffer_size, TRUE, PTS, DTS, + timestamps, system_encode->which_streams); + /* update mta */ + system_encode->mta = + gst_system_encode_update_mta (system_encode, system_encode->mta, + system_encode->sector->length_of_packet_data); + } else { /* write a padding packet */ create_sector (system_encode->sector, pack, sys_header, - system_encode->packet_size, NULL, PADDING_STR, 0, - 0, FALSE, 0, 0, - TIMESTAMPS_NO, system_encode->which_streams); + system_encode->packet_size, NULL, PADDING_STR, 0, + 0, FALSE, 0, 0, TIMESTAMPS_NO, system_encode->which_streams); } - outbuf = gst_buffer_new(); - GST_BUFFER_DATA(outbuf) = g_malloc(system_encode->sector->length_of_sector); - GST_BUFFER_SIZE(outbuf) = system_encode->sector->length_of_sector; - memcpy(GST_BUFFER_DATA(outbuf),system_encode->sector->buf, system_encode->sector->length_of_sector); - system_encode->bytes_output += GST_BUFFER_SIZE(outbuf); - gst_pad_push(system_encode->srcpad,GST_DATA (outbuf)); + outbuf = gst_buffer_new (); + GST_BUFFER_DATA (outbuf) = + g_malloc (system_encode->sector->length_of_sector); + GST_BUFFER_SIZE (outbuf) = system_encode->sector->length_of_sector; + memcpy (GST_BUFFER_DATA (outbuf), system_encode->sector->buf, + system_encode->sector->length_of_sector); + system_encode->bytes_output += GST_BUFFER_SIZE (outbuf); + gst_pad_push (system_encode->srcpad, GST_DATA (outbuf)); GST_DEBUG ("system_encode::multiplex: writing %02x", mb->stream_id); } - gst_info("system_encode::multiplex: data left in video buffer %lu\n", MPEG1MUX_BUFFER_SPACE(system_encode->video_buffer)); - gst_info("system_encode::multiplex: data left in audio buffer %lu\n", MPEG1MUX_BUFFER_SPACE(system_encode->audio_buffer)); + gst_info ("system_encode::multiplex: data left in video buffer %lu\n", + MPEG1MUX_BUFFER_SPACE (system_encode->video_buffer)); + gst_info ("system_encode::multiplex: data left in audio buffer %lu\n", + MPEG1MUX_BUFFER_SPACE (system_encode->audio_buffer)); - g_mutex_unlock(system_encode->lock); + g_mutex_unlock (system_encode->lock); } static void -gst_system_encode_chain (GstPad *pad, GstData *_data) +gst_system_encode_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstMPEG1SystemEncode *system_encode; @@ -487,46 +520,50 @@ gst_system_encode_chain (GstPad *pad, GstData *_data) const gchar *padname; gint channel; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); system_encode = GST_SYSTEM_ENCODE (GST_OBJECT_PARENT (pad)); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - GST_DEBUG ("system_encode::chain: system_encode: have buffer of size %lu",size); + GST_DEBUG ("system_encode::chain: system_encode: have buffer of size %lu", + size); padname = GST_OBJECT_NAME (pad); - if (strncmp(padname, "audio_", 6) == 0) { - channel = atoi(&padname[6]); - GST_DEBUG ("gst_system_encode_chain: got audio buffer in from audio channel %02d", channel); + if (strncmp (padname, "audio_", 6) == 0) { + channel = atoi (&padname[6]); + GST_DEBUG + ("gst_system_encode_chain: got audio buffer in from audio channel %02d", + channel); - mpeg1mux_buffer_queue(system_encode->audio_buffer, buf); - } - else if (strncmp(padname, "video_", 6) == 0) { - channel = atoi(&padname[6]); - GST_DEBUG ("gst_system_encode_chain: got video buffer in from video channel %02d", channel); + mpeg1mux_buffer_queue (system_encode->audio_buffer, buf); + } else if (strncmp (padname, "video_", 6) == 0) { + channel = atoi (&padname[6]); + GST_DEBUG + ("gst_system_encode_chain: got video buffer in from video channel %02d", + channel); - mpeg1mux_buffer_queue(system_encode->video_buffer, buf); + mpeg1mux_buffer_queue (system_encode->video_buffer, buf); + } else { + g_assert_not_reached (); } - else { - g_assert_not_reached (); - } - gst_system_encode_multiplex(system_encode); + gst_system_encode_multiplex (system_encode); - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_system_encode_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_system_encode_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstMPEG1SystemEncode *system_encode; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SYSTEM_ENCODE(object)); - system_encode = GST_SYSTEM_ENCODE(object); + g_return_if_fail (GST_IS_SYSTEM_ENCODE (object)); + system_encode = GST_SYSTEM_ENCODE (object); switch (prop_id) { default: @@ -536,13 +573,14 @@ gst_system_encode_set_property (GObject *object, guint prop_id, const GValue *va } static void -gst_system_encode_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_system_encode_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMPEG1SystemEncode *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SYSTEM_ENCODE(object)); - src = GST_SYSTEM_ENCODE(object); + g_return_if_fail (GST_IS_SYSTEM_ENCODE (object)); + src = GST_SYSTEM_ENCODE (object); switch (prop_id) { default: @@ -552,24 +590,18 @@ gst_system_encode_get_property (GObject *object, guint prop_id, GValue *value, G } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { /* this filter needs the getbits functions */ if (!gst_library_load ("gstgetbits")) return FALSE; return gst_element_register (plugin, "system_encode", - GST_RANK_NONE, GST_TYPE_SYSTEM_ENCODE); + GST_RANK_NONE, GST_TYPE_SYSTEM_ENCODE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "system_encode", - "MPEG-1 system stream encoder", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "system_encode", + "MPEG-1 system stream encoder", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/mpeg1sys/gstmpeg1systemencode.h b/gst/mpeg1sys/gstmpeg1systemencode.h index 44555332..0580cedc 100644 --- a/gst/mpeg1sys/gstmpeg1systemencode.h +++ b/gst/mpeg1sys/gstmpeg1systemencode.h @@ -29,8 +29,9 @@ #include "main.h" #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SYSTEM_ENCODE \ @@ -44,66 +45,68 @@ extern "C" { #define GST_IS_SYSTEM_ENCODE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SYSTEM_ENCODE)) -typedef struct _GstMPEG1SystemEncode GstMPEG1SystemEncode; -typedef struct _GstMPEG1SystemEncodeClass GstMPEG1SystemEncodeClass; + typedef struct _GstMPEG1SystemEncode GstMPEG1SystemEncode; + typedef struct _GstMPEG1SystemEncodeClass GstMPEG1SystemEncodeClass; -struct _GstMPEG1SystemEncode { - GstElement element; + struct _GstMPEG1SystemEncode + { + GstElement element; - GstPad *srcpad; + GstPad *srcpad; - gboolean have_setup; + gboolean have_setup; - GMutex *lock; + GMutex *lock; - guint num_audio_pads; - guint num_video_pads; + guint num_audio_pads; + guint num_video_pads; - Mpeg1MuxBuffer *audio_buffer; - Mpeg1MuxBuffer *video_buffer; + Mpeg1MuxBuffer *audio_buffer; + Mpeg1MuxBuffer *video_buffer; - Pack_struc *pack; - Sys_header_struc *sys_header; - Sector_struc *sector; + Pack_struc *pack; + Sys_header_struc *sys_header; + Sector_struc *sector; - guint data_rate, video_rate, audio_rate; - gdouble delay, audio_delay, video_delay; - gdouble clock_cycles; - gulong sectors_delay, video_delay_ms, audio_delay_ms; - gulong startup_delay; - gulong audio_buffer_size; - gulong video_buffer_size; - gulong mux_rate, dmux_rate; - guint64 SCR; - gint which_streams; + guint data_rate, video_rate, audio_rate; + gdouble delay, audio_delay, video_delay; + gdouble clock_cycles; + gulong sectors_delay, video_delay_ms, audio_delay_ms; + gulong startup_delay; + gulong audio_buffer_size; + gulong video_buffer_size; + gulong mux_rate, dmux_rate; + guint64 SCR; + gint which_streams; - gint current_pack; - gulong min_packet_data; - gulong max_packet_data; - gint packets_per_pack; - gulong packet_size; - gulong bytes_output; + gint current_pack; + gulong min_packet_data; + gulong max_packet_data; + gint packets_per_pack; + gulong packet_size; + gulong bytes_output; - GList *mta; + GList *mta; - /* stream input pads */ - GstPad *private_1_pad[8]; /* up to 8 ac3 audio tracks */ - GstPad *private_2_pad; - GstPad *video_pad[16]; - GstPad *audio_pad[32]; -}; + /* stream input pads */ + GstPad *private_1_pad[8]; /* up to 8 ac3 audio tracks */ + GstPad *private_2_pad; + GstPad *video_pad[16]; + GstPad *audio_pad[32]; + }; -struct _GstMPEG1SystemEncodeClass { - GstElementClass parent_class; -}; + struct _GstMPEG1SystemEncodeClass + { + GstElementClass parent_class; + }; -GType gst_mpeg1_system_encode_get_type(void); + GType gst_mpeg1_system_encode_get_type (void); /* multplex.c */ #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __SYSTEM_ENCODE_H__ */ +#endif /* __SYSTEM_ENCODE_H__ */ diff --git a/gst/mpeg1sys/main.h b/gst/mpeg1sys/main.h index 434f57f5..c09fc41b 100644 --- a/gst/mpeg1sys/main.h +++ b/gst/mpeg1sys/main.h @@ -45,79 +45,82 @@ #define ISO11172_END 0x000001b9 #define PACKET_START 0x000001 -#define CLOCKS 90000.0 /* System Clock Hertz */ +#define CLOCKS 90000.0 /* System Clock Hertz */ -#define AFTER_PACKET_LENGTH 15 /* No of non-data-bytes */ - /* following the packet */ - /* length field */ -#define LAST_SCR_BYTE_IN_PACK 9 /* No of bytes in pack */ - /* preceding, and */ - /* including, the SCR */ +#define AFTER_PACKET_LENGTH 15 /* No of non-data-bytes */ + /* following the packet */ + /* length field */ +#define LAST_SCR_BYTE_IN_PACK 9 /* No of bytes in pack */ + /* preceding, and */ + /* including, the SCR */ /* The following values for sys_header_length & size are only valid for */ /* System streams consisting of two basic streams. When wrapping around */ /* the system layer on a single video or a single audio stream, those */ /* values get decreased by 3. */ -#define SYS_HEADER_LENGTH 12 /* length of Sys Header */ - /* after start code and */ - /* length field */ +#define SYS_HEADER_LENGTH 12 /* length of Sys Header */ + /* after start code and */ + /* length field */ -#define SYS_HEADER_SIZE 18 /* incl. start code and */ - /* length field */ +#define SYS_HEADER_SIZE 18 /* incl. start code and */ + /* length field */ #define PACK_HEADER_SIZE 12 #define PACKET_HEADER_SIZE 6 -#define MAX_SECTOR_SIZE 0x20000 /* Max Sektor Groesse */ +#define MAX_SECTOR_SIZE 0x20000 /* Max Sektor Groesse */ #define STREAMS_VIDEO 1 #define STREAMS_AUDIO 2 #define STREAMS_BOTH 3 -#define AUDIO_STREAMS 0xb8 /* Marker Audio Streams */ -#define VIDEO_STREAMS 0xb9 /* Marker Video Streams */ -#define AUDIO_STR_0 0xc0 /* Marker Audio Stream0 */ -#define VIDEO_STR_0 0xe0 /* Marker Video Stream0 */ -#define PADDING_STR 0xbe /* Marker Padding Stream*/ +#define AUDIO_STREAMS 0xb8 /* Marker Audio Streams */ +#define VIDEO_STREAMS 0xb9 /* Marker Video Streams */ +#define AUDIO_STR_0 0xc0 /* Marker Audio Stream0 */ +#define VIDEO_STR_0 0xe0 /* Marker Video Stream0 */ +#define PADDING_STR 0xbe /* Marker Padding Stream */ #define ZERO_STUFFING_BYTE 0 #define STUFFING_BYTE 0xff #define RESERVED_BYTE 0xff -#define TIMESTAMPS_NO 0 /* Flag NO timestamps */ -#define TIMESTAMPS_PTS 1 /* Flag PTS timestamp */ -#define TIMESTAMPS_PTS_DTS 2 /* Flag BOTH timestamps */ +#define TIMESTAMPS_NO 0 /* Flag NO timestamps */ +#define TIMESTAMPS_PTS 1 /* Flag PTS timestamp */ +#define TIMESTAMPS_PTS_DTS 2 /* Flag BOTH timestamps */ -#define MARKER_SCR 2 /* Marker SCR */ -#define MARKER_JUST_PTS 2 /* Marker only PTS */ -#define MARKER_PTS 3 /* Marker PTS */ -#define MARKER_DTS 1 /* Marker DTS */ -#define MARKER_NO_TIMESTAMPS 0x0f /* Marker NO timestamps */ +#define MARKER_SCR 2 /* Marker SCR */ +#define MARKER_JUST_PTS 2 /* Marker only PTS */ +#define MARKER_PTS 3 /* Marker PTS */ +#define MARKER_DTS 1 /* Marker DTS */ +#define MARKER_NO_TIMESTAMPS 0x0f /* Marker NO timestamps */ -#define STATUS_AUDIO_END 0 /* Statusmessage A end */ -#define STATUS_VIDEO_END 1 /* Statusmessage V end */ -#define STATUS_AUDIO_TIME_OUT 2 /* Statusmessage A out */ -#define STATUS_VIDEO_TIME_OUT 3 /* Statusmessage V out */ +#define STATUS_AUDIO_END 0 /* Statusmessage A end */ +#define STATUS_VIDEO_END 1 /* Statusmessage V end */ +#define STATUS_AUDIO_TIME_OUT 2 /* Statusmessage A out */ +#define STATUS_VIDEO_TIME_OUT 3 /* Statusmessage V out */ /************************************************************************* Typ- und Strukturdefinitionen *************************************************************************/ -typedef struct sector_struc /* A sector, can contain pack, sys header */ - /* and packet. */ -{ unsigned char buf [MAX_SECTOR_SIZE] ; - unsigned int length_of_sector ; - unsigned int length_of_packet_data ; - guint64 TS ; +typedef struct sector_struc /* A sector, can contain pack, sys header */ + /* and packet. */ +{ + unsigned char buf[MAX_SECTOR_SIZE]; + unsigned int length_of_sector; + unsigned int length_of_packet_data; + guint64 TS; } Sector_struc; -typedef struct pack_struc /* Pack Info */ -{ unsigned char buf [PACK_HEADER_SIZE]; - guint64 SCR; +typedef struct pack_struc /* Pack Info */ +{ + unsigned char buf[PACK_HEADER_SIZE]; + guint64 SCR; } Pack_struc; -typedef struct sys_header_struc /* System Header Info */ -{ unsigned char buf [SYS_HEADER_SIZE]; +typedef struct sys_header_struc /* System Header Info */ +{ + unsigned char buf[SYS_HEADER_SIZE]; } Sys_header_struc; /************************************************************************* @@ -125,16 +128,20 @@ typedef struct sys_header_struc /* System Header Info */ *************************************************************************/ /* systems.c */ -void create_sector (Sector_struc *sector, Pack_struc *pack, Sys_header_struc *sys_header, - unsigned int packet_size, unsigned char *inputbuffer, unsigned char type, unsigned char buffer_scale, - unsigned int buffer_size, unsigned char buffers, guint64 PTS, guint64 DTS, - unsigned char timestamps, unsigned int which_streams); - -void create_pack (Pack_struc *pack, guint64 SCR, unsigned int mux_rate); - -void create_sys_header (Sys_header_struc *sys_header, unsigned int rate_bound, unsigned char audio_bound, - unsigned char fixed, unsigned char CSPS, unsigned char audio_lock, unsigned char video_lock, - unsigned char video_bound, unsigned char stream1, unsigned char buffer1_scale, unsigned int buffer1_size, - unsigned char stream2, unsigned char buffer2_scale, unsigned int buffer2_size, unsigned int which_streams); +void create_sector (Sector_struc * sector, Pack_struc * pack, + Sys_header_struc * sys_header, unsigned int packet_size, + unsigned char *inputbuffer, unsigned char type, unsigned char buffer_scale, + unsigned int buffer_size, unsigned char buffers, guint64 PTS, guint64 DTS, + unsigned char timestamps, unsigned int which_streams); + +void create_pack (Pack_struc * pack, guint64 SCR, unsigned int mux_rate); + +void create_sys_header (Sys_header_struc * sys_header, unsigned int rate_bound, + unsigned char audio_bound, unsigned char fixed, unsigned char CSPS, + unsigned char audio_lock, unsigned char video_lock, + unsigned char video_bound, unsigned char stream1, + unsigned char buffer1_scale, unsigned int buffer1_size, + unsigned char stream2, unsigned char buffer2_scale, + unsigned int buffer2_size, unsigned int which_streams); #endif diff --git a/gst/mpeg1sys/systems.c b/gst/mpeg1sys/systems.c index aa6de41a..20e7bd90 100644 --- a/gst/mpeg1sys/systems.c +++ b/gst/mpeg1sys/systems.c @@ -6,25 +6,26 @@ #include "main.h" -static void buffer_timecode (timecode, marker, buffer) -guint64 timecode; -unsigned char marker; -unsigned char **buffer; +static void +buffer_timecode (timecode, marker, buffer) + guint64 timecode; + unsigned char marker; + unsigned char **buffer; { unsigned char temp; - temp = (marker << 4) | ((timecode>>29) & 0x38) | - ((timecode >> 29) & 0x6) | 1; - *((*buffer)++)=temp; + temp = (marker << 4) | ((timecode >> 29) & 0x38) | + ((timecode >> 29) & 0x6) | 1; + *((*buffer)++) = temp; temp = (timecode & 0x3fc00000) >> 22; - *((*buffer)++)=temp; + *((*buffer)++) = temp; temp = ((timecode & 0x003f8000) >> 14) | 1; - *((*buffer)++)=temp; + *((*buffer)++) = temp; temp = (timecode & 0x7f80) >> 7; - *((*buffer)++)=temp; + *((*buffer)++) = temp; temp = ((timecode & 0x007f) << 1) | 1; - *((*buffer)++)=temp; + *((*buffer)++) = temp; } /************************************************************************* @@ -35,152 +36,151 @@ unsigned char **buffer; *************************************************************************/ -void create_sector (sector, pack, sys_header, - packet_size, inputbuffer, type, - buffer_scale, buffer_size, buffers, - PTS, DTS, timestamps, which_streams ) +void +create_sector (sector, pack, sys_header, + packet_size, inputbuffer, type, + buffer_scale, buffer_size, buffers, PTS, DTS, timestamps, which_streams) -Sector_struc *sector; -Pack_struc *pack; -Sys_header_struc *sys_header; -unsigned int packet_size; -unsigned char *inputbuffer; + Sector_struc *sector; + Pack_struc *pack; + Sys_header_struc *sys_header; + unsigned int packet_size; + unsigned char *inputbuffer; -unsigned char type; -unsigned char buffer_scale; -unsigned int buffer_size; -unsigned char buffers; -guint64 PTS; -guint64 DTS; -unsigned char timestamps; -unsigned int which_streams; + unsigned char type; + unsigned char buffer_scale; + unsigned int buffer_size; + unsigned char buffers; + guint64 PTS; + guint64 DTS; + unsigned char timestamps; + unsigned int which_streams; { - int i,j,tmp; - unsigned char *index; - unsigned char *size_offset; + int i, j, tmp; + unsigned char *index; + unsigned char *size_offset; - /* printf("creating sector\n"); */ + /* printf("creating sector\n"); */ - index = sector->buf; - sector->length_of_sector=0; + index = sector->buf; + sector->length_of_sector = 0; /* Should we copy Pack Header information ? */ - if (pack != NULL) - { - i = sizeof(pack->buf); - bcopy (pack->buf, index, i); - index += i; - sector->length_of_sector += i; - } + if (pack != NULL) { + i = sizeof (pack->buf); + bcopy (pack->buf, index, i); + index += i; + sector->length_of_sector += i; + } /* Should we copy System Header information ? */ - if (sys_header != NULL) - { - i = sizeof(sys_header->buf); + if (sys_header != NULL) { + i = sizeof (sys_header->buf); - /* only one stream? 3 bytes less in sys header */ - if (which_streams != STREAMS_BOTH) i -= 3; + /* only one stream? 3 bytes less in sys header */ + if (which_streams != STREAMS_BOTH) + i -= 3; - bcopy (sys_header->buf, index, i); - index += i; - sector->length_of_sector += i; - } + bcopy (sys_header->buf, index, i); + index += i; + sector->length_of_sector += i; + } - /* write constant packet header data */ + /* write constant packet header data */ - *(index++) = (unsigned char)(PACKET_START)>>16; - *(index++) = (unsigned char)(PACKET_START & 0x00ffff)>>8; - *(index++) = (unsigned char)(PACKET_START & 0x0000ff); - *(index++) = type; + *(index++) = (unsigned char) (PACKET_START) >> 16; + *(index++) = (unsigned char) (PACKET_START & 0x00ffff) >> 8; + *(index++) = (unsigned char) (PACKET_START & 0x0000ff); + *(index++) = type; - /* we remember this offset in case we will have to shrink this packet */ - - size_offset = index; - *(index++) = (unsigned char)((packet_size - PACKET_HEADER_SIZE)>>8); - *(index++) = (unsigned char)((packet_size - PACKET_HEADER_SIZE)&0xff); + /* we remember this offset in case we will have to shrink this packet */ - *(index++) = STUFFING_BYTE; - *(index++) = STUFFING_BYTE; - *(index++) = STUFFING_BYTE; + size_offset = index; + *(index++) = (unsigned char) ((packet_size - PACKET_HEADER_SIZE) >> 8); + *(index++) = (unsigned char) ((packet_size - PACKET_HEADER_SIZE) & 0xff); - i = 0; + *(index++) = STUFFING_BYTE; + *(index++) = STUFFING_BYTE; + *(index++) = STUFFING_BYTE; - if (!buffers) i +=2; - if (timestamps == TIMESTAMPS_NO) i+=9; - else if (timestamps == TIMESTAMPS_PTS) i+=5; + i = 0; - /* printf("%i stuffing %d\n", i, timestamps); */ - - for (j=0; j> 8)); - *(index++) = (unsigned char) (buffer_size & 0xff); - } + for (j = 0; j < i; j++) + *(index++) = STUFFING_BYTE; - /* should we write PTS, PTS & DTS or nothing at all ? */ - - switch (timestamps) - { - case TIMESTAMPS_NO: - *(index++) = MARKER_NO_TIMESTAMPS; - break; - case TIMESTAMPS_PTS: - buffer_timecode (PTS, MARKER_JUST_PTS, &index); - sector->TS = PTS; - break; - case TIMESTAMPS_PTS_DTS: - buffer_timecode (PTS, MARKER_PTS, &index); - buffer_timecode (DTS, MARKER_DTS, &index); - sector->TS = DTS; - break; - } + /* should we write buffer info ? */ + + if (buffers) { + *(index++) = (unsigned char) (0x40 | + (buffer_scale << 5) | (buffer_size >> 8)); + *(index++) = (unsigned char) (buffer_size & 0xff); + } + + /* should we write PTS, PTS & DTS or nothing at all ? */ + + switch (timestamps) { + case TIMESTAMPS_NO: + *(index++) = MARKER_NO_TIMESTAMPS; + break; + case TIMESTAMPS_PTS: + buffer_timecode (PTS, MARKER_JUST_PTS, &index); + sector->TS = PTS; + break; + case TIMESTAMPS_PTS_DTS: + buffer_timecode (PTS, MARKER_PTS, &index); + buffer_timecode (DTS, MARKER_DTS, &index); + sector->TS = DTS; + break; + } /* read in packet data */ - - i = (packet_size - PACKET_HEADER_SIZE - AFTER_PACKET_LENGTH); - - if (type == PADDING_STR) - { - for (j=0; j>8); - *(size_offset++) = (unsigned char)((packet_size - PACKET_HEADER_SIZE)&0xff); - + + i = (packet_size - PACKET_HEADER_SIZE - AFTER_PACKET_LENGTH); + + if (type == PADDING_STR) { + for (j = 0; j < i; j++) + *(index++) = (unsigned char) STUFFING_BYTE; + tmp = i; + } else { + /*tmp = fread (index, sizeof (unsigned char), i, inputstream); */ + memcpy (index, inputbuffer, i); + tmp = i; + index += tmp; + + /* if we did not get enough data bytes, shorten the Packet length */ + + if (tmp != i) { + packet_size -= (i - tmp); + *(size_offset++) = + (unsigned char) ((packet_size - PACKET_HEADER_SIZE) >> 8); + *(size_offset++) = + (unsigned char) ((packet_size - PACKET_HEADER_SIZE) & 0xff); + /* zero byte stuffing in the last Packet of a stream */ /* we don't need this any more, since we shortenend the packet */ /* for (j=tmp; jlength_of_sector += packet_size; + sector->length_of_packet_data = tmp; - sector->length_of_sector += packet_size; - sector->length_of_packet_data = tmp; - } /************************************************************************* @@ -189,26 +189,27 @@ unsigned int which_streams; the sector buffer *************************************************************************/ -void create_pack (pack, SCR, mux_rate) +void +create_pack (pack, SCR, mux_rate) -Pack_struc *pack; -unsigned int mux_rate; -guint64 SCR; + Pack_struc *pack; + unsigned int mux_rate; + guint64 SCR; { - unsigned char *index; - - index = pack->buf; - - *(index++) = (unsigned char)((PACK_START)>>24); - *(index++) = (unsigned char)((PACK_START & 0x00ff0000)>>16); - *(index++) = (unsigned char)((PACK_START & 0x0000ff00)>>8); - *(index++) = (unsigned char)(PACK_START & 0x000000ff); - buffer_timecode (SCR, MARKER_SCR, &index); - *(index++) = (unsigned char)(0x80 | (mux_rate >>15)); - *(index++) = (unsigned char)(0xff & (mux_rate >> 7)); - *(index++) = (unsigned char)(0x01 | ((mux_rate & 0x7f)<<1)); - pack->SCR = SCR; + unsigned char *index; + + index = pack->buf; + + *(index++) = (unsigned char) ((PACK_START) >> 24); + *(index++) = (unsigned char) ((PACK_START & 0x00ff0000) >> 16); + *(index++) = (unsigned char) ((PACK_START & 0x0000ff00) >> 8); + *(index++) = (unsigned char) (PACK_START & 0x000000ff); + buffer_timecode (SCR, MARKER_SCR, &index); + *(index++) = (unsigned char) (0x80 | (mux_rate >> 15)); + *(index++) = (unsigned char) (0xff & (mux_rate >> 7)); + *(index++) = (unsigned char) (0x01 | ((mux_rate & 0x7f) << 1)); + pack->SCR = SCR; } @@ -218,77 +219,77 @@ guint64 SCR; the sector buffer *************************************************************************/ -void create_sys_header (sys_header, rate_bound, audio_bound, - fixed, CSPS, audio_lock, video_lock, - video_bound, - stream1, buffer1_scale, buffer1_size, - stream2, buffer2_scale, buffer2_size, - which_streams) - -Sys_header_struc *sys_header; -unsigned int rate_bound; -unsigned char audio_bound; -unsigned char fixed; -unsigned char CSPS; -unsigned char audio_lock; -unsigned char video_lock; -unsigned char video_bound; - -unsigned char stream1; -unsigned char buffer1_scale; -unsigned int buffer1_size; -unsigned char stream2; -unsigned char buffer2_scale; -unsigned int buffer2_size; -unsigned int which_streams; +void +create_sys_header (sys_header, rate_bound, audio_bound, + fixed, CSPS, audio_lock, video_lock, + video_bound, + stream1, buffer1_scale, buffer1_size, + stream2, buffer2_scale, buffer2_size, which_streams) + + Sys_header_struc *sys_header; + unsigned int rate_bound; + unsigned char audio_bound; + unsigned char fixed; + unsigned char CSPS; + unsigned char audio_lock; + unsigned char video_lock; + unsigned char video_bound; + + unsigned char stream1; + unsigned char buffer1_scale; + unsigned int buffer1_size; + unsigned char stream2; + unsigned char buffer2_scale; + unsigned int buffer2_size; + unsigned int which_streams; { - unsigned char *index; - - index = sys_header->buf; - - /* if we are not using both streams, we should clear some - options here */ - - if (!(which_streams & STREAMS_AUDIO)) - audio_bound = 0; - if (!(which_streams & STREAMS_VIDEO)) - video_bound = 0; - - *(index++) = (unsigned char)((SYS_HEADER_START)>>24); - *(index++) = (unsigned char)((SYS_HEADER_START & 0x00ff0000)>>16); - *(index++) = (unsigned char)((SYS_HEADER_START & 0x0000ff00)>>8); - *(index++) = (unsigned char)(SYS_HEADER_START & 0x000000ff); - - if (which_streams == STREAMS_BOTH) { - *(index++) = (unsigned char)(SYS_HEADER_LENGTH >> 8); - *(index++) = (unsigned char)(SYS_HEADER_LENGTH & 0xff); - } else { - *(index++) = (unsigned char)((SYS_HEADER_LENGTH-3) >> 8); - *(index++) = (unsigned char)((SYS_HEADER_LENGTH-3) & 0xff); - } - - *(index++) = (unsigned char)(0x80 | (rate_bound >>15)); - *(index++) = (unsigned char)(0xff & (rate_bound >> 7)); - *(index++) = (unsigned char)(0x01 | ((rate_bound & 0x7f)<<1)); - *(index++) = (unsigned char)((audio_bound << 2)|(fixed << 1)|CSPS); - *(index++) = (unsigned char)((audio_lock << 7)| - (video_lock << 6)|0x20|video_bound); - - *(index++) = (unsigned char)RESERVED_BYTE; - - if (which_streams & STREAMS_AUDIO) { - *(index++) = stream1; - *(index++) = (unsigned char) (0xc0 | - (buffer1_scale << 5) | (buffer1_size >> 8)); - *(index++) = (unsigned char) (buffer1_size & 0xff); - } - - if (which_streams & STREAMS_VIDEO) { - *(index++) = stream2; - *(index++) = (unsigned char) (0xc0 | - (buffer2_scale << 5) | (buffer2_size >> 8)); - *(index++) = (unsigned char) (buffer2_size & 0xff); - } + unsigned char *index; + + index = sys_header->buf; + + /* if we are not using both streams, we should clear some + options here */ + + if (!(which_streams & STREAMS_AUDIO)) + audio_bound = 0; + if (!(which_streams & STREAMS_VIDEO)) + video_bound = 0; + + *(index++) = (unsigned char) ((SYS_HEADER_START) >> 24); + *(index++) = (unsigned char) ((SYS_HEADER_START & 0x00ff0000) >> 16); + *(index++) = (unsigned char) ((SYS_HEADER_START & 0x0000ff00) >> 8); + *(index++) = (unsigned char) (SYS_HEADER_START & 0x000000ff); + + if (which_streams == STREAMS_BOTH) { + *(index++) = (unsigned char) (SYS_HEADER_LENGTH >> 8); + *(index++) = (unsigned char) (SYS_HEADER_LENGTH & 0xff); + } else { + *(index++) = (unsigned char) ((SYS_HEADER_LENGTH - 3) >> 8); + *(index++) = (unsigned char) ((SYS_HEADER_LENGTH - 3) & 0xff); + } + + *(index++) = (unsigned char) (0x80 | (rate_bound >> 15)); + *(index++) = (unsigned char) (0xff & (rate_bound >> 7)); + *(index++) = (unsigned char) (0x01 | ((rate_bound & 0x7f) << 1)); + *(index++) = (unsigned char) ((audio_bound << 2) | (fixed << 1) | CSPS); + *(index++) = (unsigned char) ((audio_lock << 7) | + (video_lock << 6) | 0x20 | video_bound); + + *(index++) = (unsigned char) RESERVED_BYTE; + + if (which_streams & STREAMS_AUDIO) { + *(index++) = stream1; + *(index++) = (unsigned char) (0xc0 | + (buffer1_scale << 5) | (buffer1_size >> 8)); + *(index++) = (unsigned char) (buffer1_size & 0xff); + } + + if (which_streams & STREAMS_VIDEO) { + *(index++) = stream2; + *(index++) = (unsigned char) (0xc0 | + (buffer2_scale << 5) | (buffer2_size >> 8)); + *(index++) = (unsigned char) (buffer2_size & 0xff); + } } diff --git a/gst/mpeg1videoparse/gstmp1videoparse.c b/gst/mpeg1videoparse/gstmp1videoparse.c index 06897e87..e1b5b089 100644 --- a/gst/mpeg1videoparse/gstmp1videoparse.c +++ b/gst/mpeg1videoparse/gstmp1videoparse.c @@ -36,62 +36,57 @@ #define SEQ_END_CODE 0x000001b7 /* elementfactory information */ -static GstElementDetails mpeg1videoparse_details = GST_ELEMENT_DETAILS ( - "MPEG 1 Video Parser", - "Codec/Parser/Video", - "Parses and frames MPEG 1 video streams, provides seek", - "Wim Taymans " -); - -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/mpeg, " - "mpegversion = (int) 1, " - "systemstream = (boolean) false, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "pixel_width = (int) [ 1, 255 ], " - "pixel_height = (int) [ 1, 255 ], " - "framerate = (double) [ 0, MAX ]" - ) -); - -static GstStaticPadTemplate sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/mpeg, " - "mpegversion = (int) 1, " - "systemstream = (boolean) false" - ) -); +static GstElementDetails mpeg1videoparse_details = +GST_ELEMENT_DETAILS ("MPEG 1 Video Parser", + "Codec/Parser/Video", + "Parses and frames MPEG 1 video streams, provides seek", + "Wim Taymans "); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) 1, " + "systemstream = (boolean) false, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "pixel_width = (int) [ 1, 255 ], " + "pixel_height = (int) [ 1, 255 ], " "framerate = (double) [ 0, MAX ]") + ); + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) 1, " "systemstream = (boolean) false") + ); /* Mp1VideoParse signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, /* FILL ME */ }; -static void gst_mp1videoparse_class_init (Mp1VideoParseClass *klass); -static void gst_mp1videoparse_base_init (Mp1VideoParseClass *klass); -static void gst_mp1videoparse_init (Mp1VideoParse *mp1videoparse); +static void gst_mp1videoparse_class_init (Mp1VideoParseClass * klass); +static void gst_mp1videoparse_base_init (Mp1VideoParseClass * klass); +static void gst_mp1videoparse_init (Mp1VideoParse * mp1videoparse); -static void gst_mp1videoparse_chain (GstPad *pad, GstData *_data); -static void gst_mp1videoparse_real_chain (Mp1VideoParse *mp1videoparse, GstBuffer *buf, GstPad *outpad); -static void gst_mp1videoparse_flush (Mp1VideoParse *mp1videoparse); +static void gst_mp1videoparse_chain (GstPad * pad, GstData * _data); +static void gst_mp1videoparse_real_chain (Mp1VideoParse * mp1videoparse, + GstBuffer * buf, GstPad * outpad); +static void gst_mp1videoparse_flush (Mp1VideoParse * mp1videoparse); static GstElementStateReturn - gst_mp1videoparse_change_state (GstElement *element); +gst_mp1videoparse_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_mp1videoparse_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -101,56 +96,60 @@ mp1videoparse_get_type (void) if (!mp1videoparse_type) { static const GTypeInfo mp1videoparse_info = { - sizeof(Mp1VideoParseClass), - (GBaseInitFunc)gst_mp1videoparse_base_init, + sizeof (Mp1VideoParseClass), + (GBaseInitFunc) gst_mp1videoparse_base_init, NULL, - (GClassInitFunc)gst_mp1videoparse_class_init, + (GClassInitFunc) gst_mp1videoparse_class_init, NULL, NULL, - sizeof(Mp1VideoParse), + sizeof (Mp1VideoParse), 0, - (GInstanceInitFunc)gst_mp1videoparse_init, + (GInstanceInitFunc) gst_mp1videoparse_init, }; - mp1videoparse_type = g_type_register_static(GST_TYPE_ELEMENT, "Mp1VideoParse", &mp1videoparse_info, 0); + mp1videoparse_type = + g_type_register_static (GST_TYPE_ELEMENT, "Mp1VideoParse", + &mp1videoparse_info, 0); } return mp1videoparse_type; } static void -gst_mp1videoparse_base_init (Mp1VideoParseClass *klass) +gst_mp1videoparse_base_init (Mp1VideoParseClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_factory)); + gst_static_pad_template_get (&src_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_factory)); + gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details (element_class, &mpeg1videoparse_details); } static void -gst_mp1videoparse_class_init (Mp1VideoParseClass *klass) +gst_mp1videoparse_class_init (Mp1VideoParseClass * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*)klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_mp1videoparse_change_state; } static void -gst_mp1videoparse_init (Mp1VideoParse *mp1videoparse) +gst_mp1videoparse_init (Mp1VideoParse * mp1videoparse) { - mp1videoparse->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_factory), "sink"); - gst_element_add_pad(GST_ELEMENT(mp1videoparse),mp1videoparse->sinkpad); - gst_pad_set_chain_function(mp1videoparse->sinkpad,gst_mp1videoparse_chain); - - mp1videoparse->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&src_factory), "src"); - gst_element_add_pad(GST_ELEMENT(mp1videoparse),mp1videoparse->srcpad); + mp1videoparse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_factory), + "sink"); + gst_element_add_pad (GST_ELEMENT (mp1videoparse), mp1videoparse->sinkpad); + gst_pad_set_chain_function (mp1videoparse->sinkpad, gst_mp1videoparse_chain); + + mp1videoparse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get (&src_factory), + "src"); + gst_element_add_pad (GST_ELEMENT (mp1videoparse), mp1videoparse->srcpad); gst_pad_use_explicit_caps (mp1videoparse->srcpad); mp1videoparse->partialbuf = NULL; @@ -162,38 +161,39 @@ gst_mp1videoparse_init (Mp1VideoParse *mp1videoparse) } static void -mp1videoparse_parse_seq (Mp1VideoParse *mp1videoparse, GstBuffer *buf) +mp1videoparse_parse_seq (Mp1VideoParse * mp1videoparse, GstBuffer * buf) { gint width, height, asr_idx, fps_idx; gfloat asr_table[] = { 0., 1., - 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, - 0.8935, 0.9157, 0.9815, 1.0255, 1.0695, - 1.0950, 1.1575, 1.2015 }; - gfloat fps_table[] = { 0., 24./1.001, 24., 25., - 30./1.001, 30., - 50., 60./1.001, 60. }; + 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, + 0.8935, 0.9157, 0.9815, 1.0255, 1.0695, + 1.0950, 1.1575, 1.2015 + }; + gfloat fps_table[] = { 0., 24. / 1.001, 24., 25., + 30. / 1.001, 30., + 50., 60. / 1.001, 60. + }; guint32 n = GUINT32_FROM_BE (*(guint32 *) GST_BUFFER_DATA (buf)); - width = (n & 0xfff00000) >> 20; - height = (n & 0x000fff00) >> 8; - asr_idx = (n & 0x000000f0) >> 4; - fps_idx = (n & 0x0000000f) >> 0; + width = (n & 0xfff00000) >> 20; + height = (n & 0x000fff00) >> 8; + asr_idx = (n & 0x000000f0) >> 4; + fps_idx = (n & 0x0000000f) >> 0; if (fps_idx >= 9 || fps_idx <= 0) - fps_idx = 3; /* well, we need a default */ + fps_idx = 3; /* well, we need a default */ if (asr_idx >= 15 || asr_idx <= 0) - asr_idx = 1; /* no aspect ratio */ + asr_idx = 1; /* no aspect ratio */ - if (asr_table[asr_idx] != mp1videoparse->asr || - fps_table[fps_idx] != mp1videoparse->fps || - width != mp1videoparse->width || - height != mp1videoparse->height) { + if (asr_table[asr_idx] != mp1videoparse->asr || + fps_table[fps_idx] != mp1videoparse->fps || + width != mp1videoparse->width || height != mp1videoparse->height) { GstCaps *caps; gint p_w, p_h; - mp1videoparse->asr = asr_table[asr_idx]; - mp1videoparse->fps = fps_table[fps_idx]; - mp1videoparse->width = width; + mp1videoparse->asr = asr_table[asr_idx]; + mp1videoparse->fps = fps_table[fps_idx]; + mp1videoparse->width = width; mp1videoparse->height = height; p_w = (asr_table[asr_idx] < 1.0) ? (100 / asr_table[asr_idx]) : 1; @@ -201,12 +201,11 @@ mp1videoparse_parse_seq (Mp1VideoParse *mp1videoparse, GstBuffer *buf) caps = gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, FALSE, - "mpegversion", G_TYPE_INT, 1, - "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, - "framerate", G_TYPE_DOUBLE, fps_table[fps_idx], - "pixel_width", G_TYPE_INT, p_w, - "pixel_height", G_TYPE_INT, p_h, NULL); + "mpegversion", G_TYPE_INT, 1, + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", G_TYPE_DOUBLE, fps_table[fps_idx], + "pixel_width", G_TYPE_INT, p_w, "pixel_height", G_TYPE_INT, p_h, NULL); GST_DEBUG ("New mpeg1videoparse caps: " GST_PTR_FORMAT, caps); @@ -215,13 +214,15 @@ mp1videoparse_parse_seq (Mp1VideoParse *mp1videoparse, GstBuffer *buf) } static gboolean -mp1videoparse_valid_sync (Mp1VideoParse *mp1videoparse, guint32 head, GstBuffer *buf) +mp1videoparse_valid_sync (Mp1VideoParse * mp1videoparse, guint32 head, + GstBuffer * buf) { switch (head) { - case SEQ_START_CODE: { + case SEQ_START_CODE:{ GstBuffer *subbuf = gst_buffer_create_sub (buf, 4, - GST_BUFFER_SIZE (buf) - 4); - mp1videoparse_parse_seq(mp1videoparse, subbuf); + GST_BUFFER_SIZE (buf) - 4); + + mp1videoparse_parse_seq (mp1videoparse, subbuf); gst_buffer_unref (subbuf); return TRUE; } @@ -231,42 +232,39 @@ mp1videoparse_valid_sync (Mp1VideoParse *mp1videoparse, guint32 head, GstBuffer case EXT_START_CODE: return TRUE; default: - if (head >= SLICE_MIN_START_CODE && - head <= SLICE_MAX_START_CODE) - return TRUE; + if (head >= SLICE_MIN_START_CODE && head <= SLICE_MAX_START_CODE) + return TRUE; } return FALSE; } static gint -mp1videoparse_find_next_gop (Mp1VideoParse *mp1videoparse, GstBuffer *buf) +mp1videoparse_find_next_gop (Mp1VideoParse * mp1videoparse, GstBuffer * buf) { - guchar *data = GST_BUFFER_DATA(buf); - gulong size = GST_BUFFER_SIZE(buf); + guchar *data = GST_BUFFER_DATA (buf); + gulong size = GST_BUFFER_SIZE (buf); gulong offset = 0; gint sync_zeros = 0; gboolean have_sync = FALSE; while (offset < size) { - guchar byte = *(data+offset); + guchar byte = *(data + offset); + offset++; if (byte == 0) { sync_zeros++; - } - else if (byte == 1 && sync_zeros >=2 ) { + } else if (byte == 1 && sync_zeros >= 2) { sync_zeros = 0; have_sync = TRUE; - } - else if (have_sync) { + } else if (have_sync) { if (byte == (SEQ_START_CODE & 0xff) || byte == (GOP_START_CODE & 0xff)) { - return offset - 4; + return offset - 4; } else { - sync_zeros = 0; + sync_zeros = 0; have_sync = FALSE; } - } - else { + } else { sync_zeros = 0; } } @@ -275,24 +273,23 @@ mp1videoparse_find_next_gop (Mp1VideoParse *mp1videoparse, GstBuffer *buf) } static guint64 -gst_mp1videoparse_time_code (guchar *gop, - gfloat fps) +gst_mp1videoparse_time_code (guchar * gop, gfloat fps) { - guint32 data = GUINT32_FROM_BE (* (guint32 *) gop); + guint32 data = GUINT32_FROM_BE (*(guint32 *) gop); - return ((((data & 0xfc000000) >> 26) * 3600 * GST_SECOND) + /* hours */ - (((data & 0x03f00000) >> 20) * 60 * GST_SECOND) + /* minutes */ - (((data & 0x0007e000) >> 13) * GST_SECOND) + /* seconds */ - (((data & 0x00001f80) >> 7) * GST_SECOND / fps)); /* frames */ + return ((((data & 0xfc000000) >> 26) * 3600 * GST_SECOND) + /* hours */ + (((data & 0x03f00000) >> 20) * 60 * GST_SECOND) + /* minutes */ + (((data & 0x0007e000) >> 13) * GST_SECOND) + /* seconds */ + (((data & 0x00001f80) >> 7) * GST_SECOND / fps)); /* frames */ } static void -gst_mp1videoparse_flush (Mp1VideoParse *mp1videoparse) +gst_mp1videoparse_flush (Mp1VideoParse * mp1videoparse) { GST_DEBUG ("mp1videoparse: flushing"); if (mp1videoparse->partialbuf) { - gst_buffer_unref(mp1videoparse->partialbuf); - mp1videoparse->partialbuf= NULL; + gst_buffer_unref (mp1videoparse->partialbuf); + mp1videoparse->partialbuf = NULL; } mp1videoparse->need_resync = TRUE; mp1videoparse->in_flush = TRUE; @@ -300,7 +297,7 @@ gst_mp1videoparse_flush (Mp1VideoParse *mp1videoparse) } static void -gst_mp1videoparse_chain (GstPad *pad,GstData *_data) +gst_mp1videoparse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); Mp1VideoParse *mp1videoparse; @@ -311,11 +308,12 @@ gst_mp1videoparse_chain (GstPad *pad,GstData *_data) mp1videoparse = GST_MP1VIDEOPARSE (GST_OBJECT_PARENT (pad)); - gst_mp1videoparse_real_chain(mp1videoparse, buf, mp1videoparse->srcpad); + gst_mp1videoparse_real_chain (mp1videoparse, buf, mp1videoparse->srcpad); } static void -gst_mp1videoparse_real_chain (Mp1VideoParse *mp1videoparse, GstBuffer *buf, GstPad *outpad) +gst_mp1videoparse_real_chain (Mp1VideoParse * mp1videoparse, GstBuffer * buf, + GstPad * outpad) { guchar *data; gulong size, offset = 0; @@ -328,7 +326,7 @@ gst_mp1videoparse_real_chain (Mp1VideoParse *mp1videoparse, GstBuffer *buf, GstP guint64 time_stamp; GstBuffer *temp; - time_stamp = GST_BUFFER_TIMESTAMP(buf); + time_stamp = GST_BUFFER_TIMESTAMP (buf); if (GST_IS_EVENT (buf)) { GstEvent *event = GST_EVENT (buf); @@ -336,90 +334,91 @@ gst_mp1videoparse_real_chain (Mp1VideoParse *mp1videoparse, GstBuffer *buf, GstP switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH: case GST_EVENT_DISCONTINUOUS: - gst_mp1videoparse_flush(mp1videoparse); - break; + gst_mp1videoparse_flush (mp1videoparse); + break; case GST_EVENT_EOS: - gst_mp1videoparse_flush(mp1videoparse); - gst_event_ref(event); - gst_pad_push(outpad, GST_DATA (event)); - gst_element_set_eos (GST_ELEMENT (mp1videoparse)); - break; + gst_mp1videoparse_flush (mp1videoparse); + gst_event_ref (event); + gst_pad_push (outpad, GST_DATA (event)); + gst_element_set_eos (GST_ELEMENT (mp1videoparse)); + break; default: - GST_DEBUG ("Unhandled event type %d", - GST_EVENT_TYPE (event)); - break; + GST_DEBUG ("Unhandled event type %d", GST_EVENT_TYPE (event)); + break; } - + gst_event_unref (event); return; } - + if (mp1videoparse->partialbuf) { GstBuffer *merge; - offset = GST_BUFFER_SIZE(mp1videoparse->partialbuf); - merge = gst_buffer_merge(mp1videoparse->partialbuf, buf); + offset = GST_BUFFER_SIZE (mp1videoparse->partialbuf); + merge = gst_buffer_merge (mp1videoparse->partialbuf, buf); - gst_buffer_unref(mp1videoparse->partialbuf); - gst_buffer_unref(buf); + gst_buffer_unref (mp1videoparse->partialbuf); + gst_buffer_unref (buf); mp1videoparse->partialbuf = merge; - } - else { + } else { mp1videoparse->partialbuf = buf; offset = 0; } - data = GST_BUFFER_DATA(mp1videoparse->partialbuf); - size = GST_BUFFER_SIZE(mp1videoparse->partialbuf); + data = GST_BUFFER_DATA (mp1videoparse->partialbuf); + size = GST_BUFFER_SIZE (mp1videoparse->partialbuf); - GST_DEBUG ("mp1videoparse: received buffer of %ld bytes %" G_GINT64_FORMAT,size, GST_BUFFER_TIMESTAMP(buf)); + GST_DEBUG ("mp1videoparse: received buffer of %ld bytes %" G_GINT64_FORMAT, + size, GST_BUFFER_TIMESTAMP (buf)); do { - data = GST_BUFFER_DATA(mp1videoparse->partialbuf); - size = GST_BUFFER_SIZE(mp1videoparse->partialbuf); + data = GST_BUFFER_DATA (mp1videoparse->partialbuf); + size = GST_BUFFER_SIZE (mp1videoparse->partialbuf); - head = GUINT32_FROM_BE(*((guint32 *)data)); + head = GUINT32_FROM_BE (*((guint32 *) data)); - GST_DEBUG ("mp1videoparse: head is %08x", (unsigned int)head); + GST_DEBUG ("mp1videoparse: head is %08x", (unsigned int) head); - if (!mp1videoparse_valid_sync(mp1videoparse, head, - mp1videoparse->partialbuf) || - mp1videoparse->need_resync) { - sync_pos = mp1videoparse_find_next_gop(mp1videoparse, mp1videoparse->partialbuf); + if (!mp1videoparse_valid_sync (mp1videoparse, head, + mp1videoparse->partialbuf) || mp1videoparse->need_resync) { + sync_pos = + mp1videoparse_find_next_gop (mp1videoparse, + mp1videoparse->partialbuf); if (sync_pos >= 0) { - mp1videoparse->need_resync = FALSE; - GST_DEBUG ("mp1videoparse: found new gop at %d", sync_pos); - - if (sync_pos != 0) { - temp = gst_buffer_create_sub(mp1videoparse->partialbuf, sync_pos, size-sync_pos); - g_assert(temp != NULL); - gst_buffer_unref(mp1videoparse->partialbuf); + mp1videoparse->need_resync = FALSE; + GST_DEBUG ("mp1videoparse: found new gop at %d", sync_pos); + + if (sync_pos != 0) { + temp = + gst_buffer_create_sub (mp1videoparse->partialbuf, sync_pos, + size - sync_pos); + g_assert (temp != NULL); + gst_buffer_unref (mp1videoparse->partialbuf); mp1videoparse->partialbuf = temp; - data = GST_BUFFER_DATA(mp1videoparse->partialbuf); - size = GST_BUFFER_SIZE(mp1videoparse->partialbuf); + data = GST_BUFFER_DATA (mp1videoparse->partialbuf); + size = GST_BUFFER_SIZE (mp1videoparse->partialbuf); offset = 0; - } - - head = GUINT32_FROM_BE(*((guint32 *)data)); - /* re-call this function so that if we hadn't already, we can - * now read the sequence header and parse video properties, - * set caps, stream data, be happy, bla, bla, bla... */ - if (!mp1videoparse_valid_sync (mp1videoparse, head, - mp1videoparse->partialbuf)) - g_error ("Found sync but no valid sync point at pos 0x0"); - } - else { - GST_DEBUG ("mp1videoparse: could not sync"); - gst_buffer_unref(mp1videoparse->partialbuf); - mp1videoparse->partialbuf = NULL; - return; + } + + head = GUINT32_FROM_BE (*((guint32 *) data)); + /* re-call this function so that if we hadn't already, we can + * now read the sequence header and parse video properties, + * set caps, stream data, be happy, bla, bla, bla... */ + if (!mp1videoparse_valid_sync (mp1videoparse, head, + mp1videoparse->partialbuf)) + g_error ("Found sync but no valid sync point at pos 0x0"); + } else { + GST_DEBUG ("mp1videoparse: could not sync"); + gst_buffer_unref (mp1videoparse->partialbuf); + mp1videoparse->partialbuf = NULL; + return; } } if (mp1videoparse->picture_in_buffer == 1 && - time_stamp != GST_CLOCK_TIME_NONE) { + time_stamp != GST_CLOCK_TIME_NONE) { mp1videoparse->last_pts = time_stamp; } @@ -428,143 +427,139 @@ gst_mp1videoparse_real_chain (Mp1VideoParse *mp1videoparse, GstBuffer *buf, GstP GST_DEBUG ("mp1videoparse: searching sync"); - while (offset < size-1) { + while (offset < size - 1) { sync_byte = *(data + offset); if (sync_byte == 0) { - sync_state++; - } - else if ((sync_byte == 1) && (sync_state >=2)) { - GST_DEBUG ("mp1videoparse: code 0x000001%02x",data[offset+1]); - if (data[offset+1] == (PICTURE_START_CODE & 0xff)) { + sync_state++; + } else if ((sync_byte == 1) && (sync_state >= 2)) { + GST_DEBUG ("mp1videoparse: code 0x000001%02x", data[offset + 1]); + if (data[offset + 1] == (PICTURE_START_CODE & 0xff)) { mp1videoparse->picture_in_buffer++; if (mp1videoparse->picture_in_buffer == 1) { if (time_stamp != GST_CLOCK_TIME_NONE) { - mp1videoparse->last_pts = time_stamp; + mp1videoparse->last_pts = time_stamp; } sync_state = 0; + } else if (mp1videoparse->picture_in_buffer == 2) { + have_sync = TRUE; + break; + } else { + GST_DEBUG ("mp1videoparse: %d in buffer", + mp1videoparse->picture_in_buffer); + g_assert_not_reached (); } - else if (mp1videoparse->picture_in_buffer == 2) { - have_sync = TRUE; - break; - } - else { - GST_DEBUG ("mp1videoparse: %d in buffer", mp1videoparse->picture_in_buffer); - g_assert_not_reached(); - } - } - /* A new sequence (or GOP) is a valid sync too. Note that the - * sequence header should be put in the next buffer, not here. */ - else if (data[offset+1] == (SEQ_START_CODE & 0xFF) || - data[offset+1] == (GOP_START_CODE & 0xFF)) { - if (mp1videoparse->picture_in_buffer == 0 && - data[offset+1] == (GOP_START_CODE & 0xFF)) { + } + /* A new sequence (or GOP) is a valid sync too. Note that the + * sequence header should be put in the next buffer, not here. */ + else if (data[offset + 1] == (SEQ_START_CODE & 0xFF) || + data[offset + 1] == (GOP_START_CODE & 0xFF)) { + if (mp1videoparse->picture_in_buffer == 0 && + data[offset + 1] == (GOP_START_CODE & 0xFF)) { mp1videoparse->last_pts = gst_mp1videoparse_time_code (&data[2], - mp1videoparse->fps); - } - else if (mp1videoparse->picture_in_buffer == 1) { + mp1videoparse->fps); + } else if (mp1videoparse->picture_in_buffer == 1) { have_sync = TRUE; break; } else { g_assert (mp1videoparse->picture_in_buffer == 0); } - } - /* end-of-sequence is a valid sync point and should be included - * in the current picture, not the next. */ - else if (data[offset+1] == (SEQ_END_CODE & 0xFF)) { - if (mp1videoparse->picture_in_buffer == 1) { - offset += 4; + } + /* end-of-sequence is a valid sync point and should be included + * in the current picture, not the next. */ + else if (data[offset + 1] == (SEQ_END_CODE & 0xFF)) { + if (mp1videoparse->picture_in_buffer == 1) { + offset += 4; have_sync = TRUE; break; } else { g_assert (mp1videoparse->picture_in_buffer == 0); } - } - else sync_state = 0; + } else + sync_state = 0; } /* something else... */ - else sync_state = 0; + else + sync_state = 0; /* go down the buffer */ offset++; } if (have_sync) { offset -= 2; - GST_DEBUG ("mp1videoparse: synced at %ld code 0x000001%02x",offset,data[offset+3]); + GST_DEBUG ("mp1videoparse: synced at %ld code 0x000001%02x", offset, + data[offset + 3]); - outbuf = gst_buffer_create_sub(mp1videoparse->partialbuf, 0, offset+4); - g_assert(outbuf != NULL); - GST_BUFFER_TIMESTAMP(outbuf) = mp1videoparse->last_pts; - GST_BUFFER_DURATION(outbuf) = GST_SECOND / mp1videoparse->fps; + outbuf = gst_buffer_create_sub (mp1videoparse->partialbuf, 0, offset + 4); + g_assert (outbuf != NULL); + GST_BUFFER_TIMESTAMP (outbuf) = mp1videoparse->last_pts; + GST_BUFFER_DURATION (outbuf) = GST_SECOND / mp1videoparse->fps; mp1videoparse->last_pts += GST_BUFFER_DURATION (outbuf); if (mp1videoparse->in_flush) { - /* FIXME, send a flush event here */ - mp1videoparse->in_flush = FALSE; + /* FIXME, send a flush event here */ + mp1videoparse->in_flush = FALSE; } if (GST_PAD_CAPS (outpad) != NULL) { - GST_DEBUG ("mp1videoparse: pushing %d bytes %" G_GUINT64_FORMAT, GST_BUFFER_SIZE(outbuf), GST_BUFFER_TIMESTAMP(outbuf)); - gst_pad_push(outpad, GST_DATA (outbuf)); - GST_DEBUG ("mp1videoparse: pushing done"); + GST_DEBUG ("mp1videoparse: pushing %d bytes %" G_GUINT64_FORMAT, + GST_BUFFER_SIZE (outbuf), GST_BUFFER_TIMESTAMP (outbuf)); + gst_pad_push (outpad, GST_DATA (outbuf)); + GST_DEBUG ("mp1videoparse: pushing done"); } else { - GST_DEBUG ("No capsnego yet, delaying buffer push"); - gst_buffer_unref (outbuf); + GST_DEBUG ("No capsnego yet, delaying buffer push"); + gst_buffer_unref (outbuf); } mp1videoparse->picture_in_buffer = 0; - temp = gst_buffer_create_sub(mp1videoparse->partialbuf, offset, size-offset); - gst_buffer_unref(mp1videoparse->partialbuf); + temp = + gst_buffer_create_sub (mp1videoparse->partialbuf, offset, + size - offset); + gst_buffer_unref (mp1videoparse->partialbuf); mp1videoparse->partialbuf = temp; offset = 0; - } - else { + } else { if (time_stamp != GST_CLOCK_TIME_NONE) { - mp1videoparse->last_pts = time_stamp; + mp1videoparse->last_pts = time_stamp; break; } } } while (1); } -static GstElementStateReturn -gst_mp1videoparse_change_state (GstElement *element) +static GstElementStateReturn +gst_mp1videoparse_change_state (GstElement * element) { Mp1VideoParse *mp1videoparse; - g_return_val_if_fail(GST_IS_MP1VIDEOPARSE(element),GST_STATE_FAILURE); - mp1videoparse = GST_MP1VIDEOPARSE(element); + g_return_val_if_fail (GST_IS_MP1VIDEOPARSE (element), GST_STATE_FAILURE); + + mp1videoparse = GST_MP1VIDEOPARSE (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_PAUSED_TO_READY: - gst_mp1videoparse_flush(mp1videoparse); + gst_mp1videoparse_flush (mp1videoparse); mp1videoparse->width = mp1videoparse->height = -1; - mp1videoparse->fps = mp1videoparse->asr = 0.; + mp1videoparse->fps = mp1videoparse->asr = 0.; break; default: break; } - if (GST_ELEMENT_CLASS(parent_class)->change_state) - return GST_ELEMENT_CLASS(parent_class)->change_state(element); + if (GST_ELEMENT_CLASS (parent_class)->change_state) + return GST_ELEMENT_CLASS (parent_class)->change_state (element); return GST_STATE_SUCCESS; } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "mpeg1videoparse", - GST_RANK_NONE, GST_TYPE_MP1VIDEOPARSE); + GST_RANK_NONE, GST_TYPE_MP1VIDEOPARSE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mpeg1videoparse", - "MPEG-1 video parser", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mpeg1videoparse", + "MPEG-1 video parser", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/mpeg1videoparse/gstmp1videoparse.h b/gst/mpeg1videoparse/gstmp1videoparse.h index b8b4f016..0fb4f161 100644 --- a/gst/mpeg1videoparse/gstmp1videoparse.h +++ b/gst/mpeg1videoparse/gstmp1videoparse.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MP1VIDEOPARSE \ @@ -41,35 +42,37 @@ extern "C" { #define GST_IS_MP1VIDEOPARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MP1VIDEOPARSE)) -typedef struct _Mp1VideoParse Mp1VideoParse; -typedef struct _Mp1VideoParseClass Mp1VideoParseClass; + typedef struct _Mp1VideoParse Mp1VideoParse; + typedef struct _Mp1VideoParseClass Mp1VideoParseClass; -struct _Mp1VideoParse { - GstElement element; + struct _Mp1VideoParse + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - GstBuffer *partialbuf; /* previous buffer (if carryover) */ - gulong next_buffer_offset; - gboolean need_resync; - gboolean in_flush; - guint64 last_pts; - gint picture_in_buffer; + GstBuffer *partialbuf; /* previous buffer (if carryover) */ + gulong next_buffer_offset; + gboolean need_resync; + gboolean in_flush; + guint64 last_pts; + gint picture_in_buffer; - gint width, height; - gfloat fps, asr; -}; + gint width, height; + gfloat fps, asr; + }; -struct _Mp1VideoParseClass { - GstElementClass parent_class; -}; + struct _Mp1VideoParseClass + { + GstElementClass parent_class; + }; -GType gst_mp1videoparse_get_type(void); + GType gst_mp1videoparse_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __MP1VIDEOPARSE_H__ */ +#endif /* __MP1VIDEOPARSE_H__ */ diff --git a/gst/mpeg2sub/gstmpeg2subt.c b/gst/mpeg2sub/gstmpeg2subt.c index d267932a..65047297 100644 --- a/gst/mpeg2sub/gstmpeg2subt.c +++ b/gst/mpeg2sub/gstmpeg2subt.c @@ -24,17 +24,20 @@ #endif #include -static void gst_mpeg2subt_class_init (GstMpeg2SubtClass *klass); -static void gst_mpeg2subt_base_init (GstMpeg2SubtClass *klass); -static void gst_mpeg2subt_init (GstMpeg2Subt *mpeg2subt); +static void gst_mpeg2subt_class_init (GstMpeg2SubtClass * klass); +static void gst_mpeg2subt_base_init (GstMpeg2SubtClass * klass); +static void gst_mpeg2subt_init (GstMpeg2Subt * mpeg2subt); -static void gst_mpeg2subt_chain_video (GstPad *pad,GstData *_data); -static void gst_mpeg2subt_chain_subtitle (GstPad *pad,GstData *_data); +static void gst_mpeg2subt_chain_video (GstPad * pad, GstData * _data); +static void gst_mpeg2subt_chain_subtitle (GstPad * pad, GstData * _data); -static void gst_mpeg2subt_merge_title (GstMpeg2Subt *mpeg2subt, GstBuffer *buf); +static void gst_mpeg2subt_merge_title (GstMpeg2Subt * mpeg2subt, + GstBuffer * buf); -static void gst_mpeg2subt_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_mpeg2subt_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_mpeg2subt_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mpeg2subt_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); /* elementfactory information */ static GstElementDetails mpeg2subt_details = { @@ -45,12 +48,14 @@ static GstElementDetails mpeg2subt_details = { }; /* GstMpeg2Subt signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SKIP, /* FILL ME */ @@ -79,6 +84,7 @@ static guchar yuv_color[16] = { static GstElementClass *parent_class = NULL; + /*static guint gst_mpeg2subt_signals[LAST_SIGNAL] = { 0 };*/ GType @@ -88,23 +94,25 @@ gst_mpeg2subt_get_type (void) if (!mpeg2subt_type) { static const GTypeInfo mpeg2subt_info = { - sizeof(GstMpeg2SubtClass), - (GBaseInitFunc)gst_mpeg2subt_base_init, + sizeof (GstMpeg2SubtClass), + (GBaseInitFunc) gst_mpeg2subt_base_init, NULL, - (GClassInitFunc)gst_mpeg2subt_class_init, + (GClassInitFunc) gst_mpeg2subt_class_init, NULL, NULL, - sizeof(GstMpeg2Subt), + sizeof (GstMpeg2Subt), 0, - (GInstanceInitFunc)gst_mpeg2subt_init, + (GInstanceInitFunc) gst_mpeg2subt_init, }; - mpeg2subt_type = g_type_register_static(GST_TYPE_ELEMENT, "GstMpeg2Subt", &mpeg2subt_info, 0); + mpeg2subt_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstMpeg2Subt", + &mpeg2subt_info, 0); } return mpeg2subt_type; } static void -gst_mpeg2subt_base_init (GstMpeg2SubtClass *klass) +gst_mpeg2subt_base_init (GstMpeg2SubtClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -112,19 +120,17 @@ gst_mpeg2subt_base_init (GstMpeg2SubtClass *klass) } static void -gst_mpeg2subt_class_init (GstMpeg2SubtClass *klass) +gst_mpeg2subt_class_init (GstMpeg2SubtClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SKIP, - g_param_spec_int("skip","skip","skip", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SKIP, g_param_spec_int ("skip", "skip", "skip", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_mpeg2subt_set_property; gobject_class->get_property = gst_mpeg2subt_get_property; @@ -132,150 +138,153 @@ gst_mpeg2subt_class_init (GstMpeg2SubtClass *klass) } static void -gst_mpeg2subt_init (GstMpeg2Subt *mpeg2subt) +gst_mpeg2subt_init (GstMpeg2Subt * mpeg2subt) { - mpeg2subt->videopad = gst_pad_new("video",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(mpeg2subt),mpeg2subt->videopad); - gst_pad_set_chain_function(mpeg2subt->videopad,gst_mpeg2subt_chain_video); + mpeg2subt->videopad = gst_pad_new ("video", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (mpeg2subt), mpeg2subt->videopad); + gst_pad_set_chain_function (mpeg2subt->videopad, gst_mpeg2subt_chain_video); - mpeg2subt->subtitlepad = gst_pad_new("subtitle",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(mpeg2subt),mpeg2subt->subtitlepad); - gst_pad_set_chain_function(mpeg2subt->subtitlepad,gst_mpeg2subt_chain_subtitle); + mpeg2subt->subtitlepad = gst_pad_new ("subtitle", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (mpeg2subt), mpeg2subt->subtitlepad); + gst_pad_set_chain_function (mpeg2subt->subtitlepad, + gst_mpeg2subt_chain_subtitle); - mpeg2subt->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(mpeg2subt),mpeg2subt->srcpad); + mpeg2subt->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (mpeg2subt), mpeg2subt->srcpad); mpeg2subt->partialbuf = NULL; mpeg2subt->have_title = FALSE; } static void -gst_mpeg2subt_chain_video (GstPad *pad, GstData *_data) +gst_mpeg2subt_chain_video (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstMpeg2Subt *mpeg2subt; guchar *data; glong size; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); mpeg2subt = GST_MPEG2SUBT (GST_OBJECT_PARENT (pad)); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); if (mpeg2subt->have_title && mpeg2subt->duration != 0) { - gst_mpeg2subt_merge_title(mpeg2subt, buf); + gst_mpeg2subt_merge_title (mpeg2subt, buf); mpeg2subt->duration--; } - gst_pad_push(mpeg2subt->srcpad, GST_DATA (buf)); + gst_pad_push (mpeg2subt->srcpad, GST_DATA (buf)); } static void -gst_mpeg2subt_parse_header (GstMpeg2Subt *mpeg2subt) +gst_mpeg2subt_parse_header (GstMpeg2Subt * mpeg2subt) { - guchar *buffer = GST_BUFFER_DATA(mpeg2subt->partialbuf); + guchar *buffer = GST_BUFFER_DATA (mpeg2subt->partialbuf); guchar dummy; guint i; i = mpeg2subt->data_size + 4; - while (i < mpeg2subt->packet_size) - { - dummy = buffer [i]; - switch (dummy) - { - case 0x01: /* null packet ? */ - i++; - break; - case 0x02: /* 02 ff (ff) is the end of the packet */ - i = mpeg2subt->packet_size; - break; - case 0x03: /* palette */ - mpeg2subt->color[0] = yuv_color[buffer [i+1] >> 4]; - mpeg2subt->color[1] = yuv_color[buffer [i+1] & 0xf]; - mpeg2subt->color[2] = yuv_color[buffer [i+2] >> 4]; - mpeg2subt->color[3] = yuv_color[buffer [i+2] & 0xf]; - mpeg2subt->color[4] = yuv_color[0xf]; - GST_DEBUG ("mpeg2subt: colors %d %d %d %d", mpeg2subt->color[0],mpeg2subt->color[1],mpeg2subt->color[2],mpeg2subt->color[3]); - i += 3; - break; - case 0x04: /* transparency palette */ - mpeg2subt->trans[3] = buffer [i+1] >> 4; - mpeg2subt->trans[2] = buffer [i+1] & 0xf; - mpeg2subt->trans[1] = buffer [i+2] >> 4; - mpeg2subt->trans[0] = buffer [i+2] & 0xf; - GST_DEBUG ("mpeg2subt: transparency %d %d %d %d", mpeg2subt->trans[0],mpeg2subt->trans[1],mpeg2subt->trans[2],mpeg2subt->trans[3]); + while (i < mpeg2subt->packet_size) { + dummy = buffer[i]; + switch (dummy) { + case 0x01: /* null packet ? */ + i++; + break; + case 0x02: /* 02 ff (ff) is the end of the packet */ + i = mpeg2subt->packet_size; + break; + case 0x03: /* palette */ + mpeg2subt->color[0] = yuv_color[buffer[i + 1] >> 4]; + mpeg2subt->color[1] = yuv_color[buffer[i + 1] & 0xf]; + mpeg2subt->color[2] = yuv_color[buffer[i + 2] >> 4]; + mpeg2subt->color[3] = yuv_color[buffer[i + 2] & 0xf]; + mpeg2subt->color[4] = yuv_color[0xf]; + GST_DEBUG ("mpeg2subt: colors %d %d %d %d", mpeg2subt->color[0], + mpeg2subt->color[1], mpeg2subt->color[2], mpeg2subt->color[3]); i += 3; break; - case 0x05: /* image coordinates */ - mpeg2subt->width = 1 + ( ((buffer[i+2] & 0x0f) << 8) + buffer[i+3] ) - - ( (((unsigned int)buffer[i+1]) << 4) + (buffer[i+2] >> 4) ); - mpeg2subt->height = 1 + ( ((buffer[i+5] & 0x0f) << 8) + buffer[i+6] ) - - ( (((unsigned int)buffer[i+4]) << 4) + (buffer[i+5] >> 4) ); - i += 7; + case 0x04: /* transparency palette */ + mpeg2subt->trans[3] = buffer[i + 1] >> 4; + mpeg2subt->trans[2] = buffer[i + 1] & 0xf; + mpeg2subt->trans[1] = buffer[i + 2] >> 4; + mpeg2subt->trans[0] = buffer[i + 2] & 0xf; + GST_DEBUG ("mpeg2subt: transparency %d %d %d %d", mpeg2subt->trans[0], + mpeg2subt->trans[1], mpeg2subt->trans[2], mpeg2subt->trans[3]); + i += 3; break; - case 0x06: /* image 1 / image 2 offsets */ - mpeg2subt->offset[0] = (((unsigned int)buffer[i+1]) << 8) + buffer[i+2]; - mpeg2subt->offset[1] = (((unsigned int)buffer[i+3]) << 8) + buffer[i+4]; + case 0x05: /* image coordinates */ + mpeg2subt->width = 1 + (((buffer[i + 2] & 0x0f) << 8) + buffer[i + 3]) + - ((((unsigned int) buffer[i + 1]) << 4) + (buffer[i + 2] >> 4)); + mpeg2subt->height = 1 + (((buffer[i + 5] & 0x0f) << 8) + buffer[i + 6]) + - ((((unsigned int) buffer[i + 4]) << 4) + (buffer[i + 5] >> 4)); + i += 7; + break; + case 0x06: /* image 1 / image 2 offsets */ + mpeg2subt->offset[0] = + (((unsigned int) buffer[i + 1]) << 8) + buffer[i + 2]; + mpeg2subt->offset[1] = + (((unsigned int) buffer[i + 3]) << 8) + buffer[i + 4]; i += 5; break; - case 0xff: /* "ff xx yy zz uu" with 'zz uu' == start of control packet - * xx and yy are the end time in 90th/sec - */ - mpeg2subt->duration = (((buffer[i+1] << 8) + buffer[i+2]) * 25)/90; + case 0xff: /* "ff xx yy zz uu" with 'zz uu' == start of control packet + * xx and yy are the end time in 90th/sec + */ + mpeg2subt->duration = + (((buffer[i + 1] << 8) + buffer[i + 2]) * 25) / 90; GST_DEBUG ("duration %d", mpeg2subt->duration); - if ( (buffer[i+3] != buffer[mpeg2subt->data_size+2]) - || (buffer[i+4] != buffer[mpeg2subt->data_size+3]) ) - { - g_print("mpeg2subt: invalid control header (%.2x%.2x != %.2x%.2x) !\n", - buffer[i+3], buffer[i+4], buffer[mpeg2subt->data_size+2], buffer[mpeg2subt->data_size+3] ); + if ((buffer[i + 3] != buffer[mpeg2subt->data_size + 2]) + || (buffer[i + 4] != buffer[mpeg2subt->data_size + 3])) { + g_print + ("mpeg2subt: invalid control header (%.2x%.2x != %.2x%.2x) !\n", + buffer[i + 3], buffer[i + 4], buffer[mpeg2subt->data_size + 2], + buffer[mpeg2subt->data_size + 3]); /* FIXME */ /* exit(1); */ } i += 5; break; default: - g_print("mpeg2subt: invalid sequence in control header (%.2x) !\n", dummy); + g_print ("mpeg2subt: invalid sequence in control header (%.2x) !\n", + dummy); break; } } } static int -get_nibble (guchar *buffer, gint *offset, gint id, gint *aligned) +get_nibble (guchar * buffer, gint * offset, gint id, gint * aligned) { static int next; - if (*aligned) - { + if (*aligned) { next = buffer[offset[id]]; offset[id]++; *aligned = 0; return next >> 4; - } - else - { + } else { *aligned = 1; return next & 0xf; } } static void -gst_mpeg2subt_merge_title (GstMpeg2Subt *mpeg2subt, GstBuffer *buf) +gst_mpeg2subt_merge_title (GstMpeg2Subt * mpeg2subt, GstBuffer * buf) { - gint x=0, y=0; + gint x = 0, y = 0; gint width = mpeg2subt->width; gint height = mpeg2subt->height; - guchar *buffer = GST_BUFFER_DATA(mpeg2subt->partialbuf); - guchar *target = GST_BUFFER_DATA(buf); - gint id=0, aligned=1; + guchar *buffer = GST_BUFFER_DATA (mpeg2subt->partialbuf); + guchar *target = GST_BUFFER_DATA (buf); + gint id = 0, aligned = 1; gint offset[2]; offset[0] = mpeg2subt->offset[0]; @@ -284,59 +293,57 @@ gst_mpeg2subt_merge_title (GstMpeg2Subt *mpeg2subt, GstBuffer *buf) GST_DEBUG ("mpeg2subt: merging subtitle"); - while ((offset[1] < mpeg2subt->data_size + 2) && (y < height)) - { + while ((offset[1] < mpeg2subt->data_size + 2) && (y < height)) { gint code; gint length, colorid; - code = get_nibble(); - if (code >= 0x4) /* 4 .. f */ - { -found_code: + code = get_nibble (); + if (code >= 0x4) { /* 4 .. f */ + found_code: length = code >> 2; colorid = code & 3; while (length--) - if (x++ < width) { + if (x++ < width) { if (mpeg2subt->trans[colorid] != 0x0) { - *target++ = mpeg2subt->color[colorid]; - } - else target++; + *target++ = mpeg2subt->color[colorid]; + } else + target++; } - if (x >= width) - { - if (!aligned) - get_nibble (); - goto next_line; + if (x >= width) { + if (!aligned) + get_nibble (); + goto next_line; } continue; } - code = (code << 4) + get_nibble(); - if (code >= 0x10) /* 1x .. 3x */ + code = (code << 4) + get_nibble (); + if (code >= 0x10) /* 1x .. 3x */ goto found_code; - code = (code << 4) + get_nibble(); - if (code >= 0x40) /* 04x .. 0fx */ + code = (code << 4) + get_nibble (); + if (code >= 0x40) /* 04x .. 0fx */ goto found_code; - code = (code << 4) + get_nibble(); - if (code >= 0x100) /* 01xx .. 03xx */ + code = (code << 4) + get_nibble (); + if (code >= 0x100) /* 01xx .. 03xx */ goto found_code; /* 00xx - should only happen for 00 00 */ if (!aligned) - code = (code << 4) + get_nibble(); /* 0 0x xx */ + code = (code << 4) + get_nibble (); /* 0 0x xx */ - if (code) - { - g_print("mpeg2subt: got unknown code 00%x (offset %x side %x, x=%d, y=%d)\n", code, mpeg2subt->offset[id], id, x, y); + if (code) { + g_print + ("mpeg2subt: got unknown code 00%x (offset %x side %x, x=%d, y=%d)\n", + code, mpeg2subt->offset[id], id, x, y); goto next_line; } -next_line: + next_line: /* aligned 00 00 */ if (y < height) { - target+=(width-x); + target += (width - x); x = 0; y++; id = 1 - id; @@ -345,64 +352,67 @@ next_line: } static void -gst_mpeg2subt_chain_subtitle (GstPad *pad, GstData *_data) +gst_mpeg2subt_chain_subtitle (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstMpeg2Subt *mpeg2subt; guchar *data; glong size = 0; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); /* g_return_if_fail(GST_IS_BUFFER(buf)); */ mpeg2subt = GST_MPEG2SUBT (GST_OBJECT_PARENT (pad)); if (mpeg2subt->have_title) { - gst_buffer_unref(mpeg2subt->partialbuf); + gst_buffer_unref (mpeg2subt->partialbuf); mpeg2subt->partialbuf = NULL; mpeg2subt->have_title = FALSE; } - GST_DEBUG ("presentation time %" G_GUINT64_FORMAT, GST_BUFFER_TIMESTAMP(buf)); + GST_DEBUG ("presentation time %" G_GUINT64_FORMAT, + GST_BUFFER_TIMESTAMP (buf)); /* deal with partial frame from previous buffer */ if (mpeg2subt->partialbuf) { GstBuffer *merge; - merge = gst_buffer_merge(mpeg2subt->partialbuf, buf); + + merge = gst_buffer_merge (mpeg2subt->partialbuf, buf); gst_buffer_unref (mpeg2subt->partialbuf); - gst_buffer_unref(buf); + gst_buffer_unref (buf); mpeg2subt->partialbuf = merge; - } - else { + } else { mpeg2subt->partialbuf = buf; } - data = GST_BUFFER_DATA(mpeg2subt->partialbuf); - size = GST_BUFFER_SIZE(mpeg2subt->partialbuf); + data = GST_BUFFER_DATA (mpeg2subt->partialbuf); + size = GST_BUFFER_SIZE (mpeg2subt->partialbuf); - mpeg2subt->packet_size = GUINT16_FROM_BE(*(guint16 *)data); + mpeg2subt->packet_size = GUINT16_FROM_BE (*(guint16 *) data); if (mpeg2subt->packet_size == size) { - GST_DEBUG ("mpeg2subt: subtitle packet size %d, current size %ld", mpeg2subt->packet_size, size); + GST_DEBUG ("mpeg2subt: subtitle packet size %d, current size %ld", + mpeg2subt->packet_size, size); - mpeg2subt->data_size = GUINT16_FROM_BE(*(guint16 *)(data+2)); + mpeg2subt->data_size = GUINT16_FROM_BE (*(guint16 *) (data + 2)); - gst_mpeg2subt_parse_header(mpeg2subt); + gst_mpeg2subt_parse_header (mpeg2subt); mpeg2subt->have_title = TRUE; } } static void -gst_mpeg2subt_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_mpeg2subt_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstMpeg2Subt *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MPEG2SUBT(object)); - src = GST_MPEG2SUBT(object); + g_return_if_fail (GST_IS_MPEG2SUBT (object)); + src = GST_MPEG2SUBT (object); switch (prop_id) { default: @@ -411,13 +421,14 @@ gst_mpeg2subt_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_mpeg2subt_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_mpeg2subt_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMpeg2Subt *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MPEG2SUBT(object)); - src = GST_MPEG2SUBT(object); + g_return_if_fail (GST_IS_MPEG2SUBT (object)); + src = GST_MPEG2SUBT (object); switch (prop_id) { default: @@ -426,20 +437,14 @@ gst_mpeg2subt_get_property (GObject *object, guint prop_id, GValue *value, GPara } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "mpeg2subt", - GST_RANK_NONE, GST_TYPE_MPEG2SUBT); + return gst_element_register (plugin, "mpeg2subt", + GST_RANK_NONE, GST_TYPE_MPEG2SUBT); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mpeg2sub", - "MPEG-2 video subtitle parser", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mpeg2sub", + "MPEG-2 video subtitle parser", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/mpeg2sub/gstmpeg2subt.h b/gst/mpeg2sub/gstmpeg2subt.h index 29f60b27..5cde7058 100644 --- a/gst/mpeg2sub/gstmpeg2subt.h +++ b/gst/mpeg2sub/gstmpeg2subt.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MPEG2SUBT \ @@ -41,41 +42,43 @@ extern "C" { #define GST_IS_MPEG2SUBT_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MPEG2SUBT)) -typedef struct _GstMpeg2Subt GstMpeg2Subt; -typedef struct _GstMpeg2SubtClass GstMpeg2SubtClass; + typedef struct _GstMpeg2Subt GstMpeg2Subt; + typedef struct _GstMpeg2SubtClass GstMpeg2SubtClass; -struct _GstMpeg2Subt { - GstElement element; + struct _GstMpeg2Subt + { + GstElement element; - GstPad *videopad,*subtitlepad,*srcpad; + GstPad *videopad, *subtitlepad, *srcpad; - GstBuffer *partialbuf; /* previous buffer (if carryover) */ + GstBuffer *partialbuf; /* previous buffer (if carryover) */ - gboolean have_title; + gboolean have_title; - guint16 packet_size; - guint16 data_size; + guint16 packet_size; + guint16 data_size; - gint offset[2]; - guchar color[5]; - guchar trans[4]; + gint offset[2]; + guchar color[5]; + guchar trans[4]; - guint duration; + guint duration; - gint width, height; + gint width, height; -}; + }; -struct _GstMpeg2SubtClass { - GstElementClass parent_class; -}; + struct _GstMpeg2SubtClass + { + GstElementClass parent_class; + }; -GType gst_mpeg2subt_get_type(void); + GType gst_mpeg2subt_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_MPEG2SUBT_H__ */ +#endif /* __GST_MPEG2SUBT_H__ */ diff --git a/gst/mpegaudioparse/gstmpegaudioparse.c b/gst/mpegaudioparse/gstmpegaudioparse.c index aeed48f1..1e77bf42 100644 --- a/gst/mpegaudioparse/gstmpegaudioparse.c +++ b/gst/mpegaudioparse/gstmpegaudioparse.c @@ -32,35 +32,30 @@ static GstElementDetails mp3parse_details = { "Erik Walthinsen " }; -static GstStaticPadTemplate mp3_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", +static GstStaticPadTemplate mp3_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - "rate = (int) [ 8000, 48000], " - "channels = (int) [ 1, 2 ]") -); - -static GstStaticPadTemplate mp3_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "rate = (int) [ 8000, 48000], " "channels = (int) [ 1, 2 ]") + ); + +static GstStaticPadTemplate mp3_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/mpeg, " - "mpegversion = (int) 1" - ) -); + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") + ); /* GstMPEGAudioParse signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SKIP, ARG_BIT_RATE, @@ -68,63 +63,64 @@ enum { }; -static void gst_mp3parse_class_init (GstMPEGAudioParseClass *klass); -static void gst_mp3parse_base_init (GstMPEGAudioParseClass *klass); -static void gst_mp3parse_init (GstMPEGAudioParse *mp3parse); +static void gst_mp3parse_class_init (GstMPEGAudioParseClass * klass); +static void gst_mp3parse_base_init (GstMPEGAudioParseClass * klass); +static void gst_mp3parse_init (GstMPEGAudioParse * mp3parse); -static void gst_mp3parse_chain (GstPad *pad,GstData *_data); -static long bpf_from_header (GstMPEGAudioParse *parse, unsigned long header); -static int head_check (unsigned long head); +static void gst_mp3parse_chain (GstPad * pad, GstData * _data); +static long bpf_from_header (GstMPEGAudioParse * parse, unsigned long header); +static int head_check (unsigned long head); -static void gst_mp3parse_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_mp3parse_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static GstElementStateReturn - gst_mp3parse_change_state (GstElement *element); +static void gst_mp3parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mp3parse_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_mp3parse_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_mp3parse_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_mp3parse_get_type(void) { +gst_mp3parse_get_type (void) +{ static GType mp3parse_type = 0; if (!mp3parse_type) { static const GTypeInfo mp3parse_info = { - sizeof(GstMPEGAudioParseClass), - (GBaseInitFunc)gst_mp3parse_base_init, + sizeof (GstMPEGAudioParseClass), + (GBaseInitFunc) gst_mp3parse_base_init, NULL, - (GClassInitFunc)gst_mp3parse_class_init, + (GClassInitFunc) gst_mp3parse_class_init, NULL, NULL, - sizeof(GstMPEGAudioParse), + sizeof (GstMPEGAudioParse), 0, - (GInstanceInitFunc)gst_mp3parse_init, + (GInstanceInitFunc) gst_mp3parse_init, }; mp3parse_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstMPEGAudioParse", - &mp3parse_info, 0); + "GstMPEGAudioParse", &mp3parse_info, 0); } return mp3parse_type; } static guint mp3types_bitrates[2][3][16] = -{ { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, }, - {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, }, - {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, } }, - { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, }, - {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, }, - {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, } }, + { {{0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}}, +{{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}}, }; -static guint mp3types_freqs[3][3] = -{ {44100, 48000, 32000}, - {22050, 24000, 16000}, - {11025, 12000, 8000}}; +static guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, +{22050, 24000, 16000}, +{11025, 12000, 8000} +}; static inline guint -mp3_type_frame_length_from_header (guint32 header, guint *put_layer, - guint *put_channels, guint *put_bitrate, - guint *put_samplerate) +mp3_type_frame_length_from_header (guint32 header, guint * put_layer, + guint * put_channels, guint * put_bitrate, guint * put_samplerate) { guint length; gulong mode, samplerate, bitrate, layer, channels, padding; @@ -163,7 +159,7 @@ mp3_type_frame_length_from_header (guint32 header, guint *put_layer, GST_DEBUG ("Calculated mp3 frame length of %u bytes", length); GST_DEBUG ("samplerate = %lu, bitrate = %lu, layer = %lu, channels = %lu", - samplerate, bitrate, layer, channels); + samplerate, bitrate, layer, channels); if (put_layer) *put_layer = layer; @@ -204,8 +200,7 @@ mp3_type_frame_length_from_header (guint32 header, guint *put_layer, #define GST_MP3_TYPEFIND_MIN_DATA (1440 * (GST_MP3_TYPEFIND_MIN_HEADERS + 1) - 1 + 3) static GstCaps * -mp3_caps_create (guint layer, guint channels, - guint bitrate, guint samplerate) +mp3_caps_create (guint layer, guint channels, guint bitrate, guint samplerate) { GstCaps *new; @@ -216,15 +211,14 @@ mp3_caps_create (guint layer, guint channels, new = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, layer, - "rate", G_TYPE_INT, samplerate, - "channels", G_TYPE_INT, channels, NULL); + "layer", G_TYPE_INT, layer, + "rate", G_TYPE_INT, samplerate, "channels", G_TYPE_INT, channels, NULL); return new; } static void -gst_mp3parse_base_init (GstMPEGAudioParseClass *klass) +gst_mp3parse_base_init (GstMPEGAudioParseClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -236,22 +230,18 @@ gst_mp3parse_base_init (GstMPEGAudioParseClass *klass) } static void -gst_mp3parse_class_init (GstMPEGAudioParseClass *klass) +gst_mp3parse_class_init (GstMPEGAudioParseClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SKIP, - g_param_spec_int("skip","skip","skip", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BIT_RATE, - g_param_spec_int("bitrate","Bitrate","Bit Rate", - G_MININT,G_MAXINT,0,G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SKIP, g_param_spec_int ("skip", "skip", "skip", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BIT_RATE, g_param_spec_int ("bitrate", "Bitrate", "Bit Rate", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); /* CHECKME */ - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_mp3parse_set_property; gobject_class->get_property = gst_mp3parse_get_property; @@ -260,18 +250,20 @@ gst_mp3parse_class_init (GstMPEGAudioParseClass *klass) } static void -gst_mp3parse_init (GstMPEGAudioParse *mp3parse) +gst_mp3parse_init (GstMPEGAudioParse * mp3parse) { - mp3parse->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&mp3_sink_template), "sink"); - gst_element_add_pad(GST_ELEMENT(mp3parse),mp3parse->sinkpad); - - gst_pad_set_chain_function(mp3parse->sinkpad,gst_mp3parse_chain); - gst_element_set_loop_function (GST_ELEMENT(mp3parse),NULL); - - mp3parse->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&mp3_src_template), "src"); - gst_element_add_pad(GST_ELEMENT(mp3parse),mp3parse->srcpad); + mp3parse->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mp3_sink_template), "sink"); + gst_element_add_pad (GST_ELEMENT (mp3parse), mp3parse->sinkpad); + + gst_pad_set_chain_function (mp3parse->sinkpad, gst_mp3parse_chain); + gst_element_set_loop_function (GST_ELEMENT (mp3parse), NULL); + + mp3parse->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&mp3_src_template), "src"); + gst_element_add_pad (GST_ELEMENT (mp3parse), mp3parse->srcpad); gst_pad_use_explicit_caps (mp3parse->srcpad); /*gst_pad_set_type_id(mp3parse->srcpad, mp3frametype); */ @@ -283,71 +275,71 @@ gst_mp3parse_init (GstMPEGAudioParse *mp3parse) } static void -gst_mp3parse_chain (GstPad *pad, GstData *_data) +gst_mp3parse_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstMPEGAudioParse *mp3parse; guchar *data; - glong size,offset = 0; + glong size, offset = 0; guint32 header; int bpf; GstBuffer *outbuf; guint64 last_ts; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); /* g_return_if_fail(GST_IS_BUFFER(buf)); */ mp3parse = GST_MP3PARSE (gst_pad_get_parent (pad)); - GST_DEBUG ("mp3parse: received buffer of %d bytes",GST_BUFFER_SIZE(buf)); + GST_DEBUG ("mp3parse: received buffer of %d bytes", GST_BUFFER_SIZE (buf)); - last_ts = GST_BUFFER_TIMESTAMP(buf); + last_ts = GST_BUFFER_TIMESTAMP (buf); /* FIXME, do flush */ /* - if (mp3parse->partialbuf) { - gst_buffer_unref(mp3parse->partialbuf); - mp3parse->partialbuf = NULL; - } - mp3parse->in_flush = TRUE; - */ + if (mp3parse->partialbuf) { + gst_buffer_unref(mp3parse->partialbuf); + mp3parse->partialbuf = NULL; + } + mp3parse->in_flush = TRUE; + */ /* if we have something left from the previous frame */ if (mp3parse->partialbuf) { GstBuffer *newbuf; - newbuf = gst_buffer_merge(mp3parse->partialbuf, buf); + newbuf = gst_buffer_merge (mp3parse->partialbuf, buf); /* and the one we received.. */ - gst_buffer_unref(buf); - gst_buffer_unref(mp3parse->partialbuf); + gst_buffer_unref (buf); + gst_buffer_unref (mp3parse->partialbuf); mp3parse->partialbuf = newbuf; - } - else { + } else { mp3parse->partialbuf = buf; } - size = GST_BUFFER_SIZE(mp3parse->partialbuf); - data = GST_BUFFER_DATA(mp3parse->partialbuf); + size = GST_BUFFER_SIZE (mp3parse->partialbuf); + data = GST_BUFFER_DATA (mp3parse->partialbuf); /* while we still have bytes left -4 for the header */ - while (offset < size-4) { + while (offset < size - 4) { int skipped = 0; - GST_DEBUG ("mp3parse: offset %ld, size %ld ",offset, size); + GST_DEBUG ("mp3parse: offset %ld, size %ld ", offset, size); /* search for a possible start byte */ - for (;((data[offset] != 0xff) && (offset < size));offset++) skipped++; + for (; ((data[offset] != 0xff) && (offset < size)); offset++) + skipped++; if (skipped && !mp3parse->in_flush) { - GST_DEBUG ("mp3parse: **** now at %ld skipped %d bytes",offset,skipped); + GST_DEBUG ("mp3parse: **** now at %ld skipped %d bytes", offset, skipped); } /* construct the header word */ - header = GUINT32_FROM_BE(*((guint32 *)(data+offset))); + header = GUINT32_FROM_BE (*((guint32 *) (data + offset))); /* if it's a valid header, go ahead and send off the frame */ - if (head_check(header)) { + if (head_check (header)) { /* calculate the bpf of the frame */ - bpf = bpf_from_header(mp3parse, header); + bpf = bpf_from_header (mp3parse, header); /******************************************************************************** * robust seek support @@ -361,107 +353,116 @@ gst_mp3parse_chain (GstPad *pad, GstData *_data) * from previous frames. In this case, seeking may be more complicated because * the frames are not independently coded. ********************************************************************************/ - if ( mp3parse->in_flush ) { - guint32 header2; + if (mp3parse->in_flush) { + guint32 header2; - if ((size-offset)<(bpf+4)) { if (mp3parse->in_flush) break; } /* wait until we have the the entire current frame as well as the next frame header */ - - header2 = GUINT32_FROM_BE(*((guint32 *)(data+offset+bpf))); - GST_DEBUG ("mp3parse: header=%08X, header2=%08X, bpf=%d", (unsigned int)header, (unsigned int)header2, bpf ); + if ((size - offset) < (bpf + 4)) { + if (mp3parse->in_flush) + break; + } + /* wait until we have the the entire current frame as well as the next frame header */ + header2 = GUINT32_FROM_BE (*((guint32 *) (data + offset + bpf))); + GST_DEBUG ("mp3parse: header=%08X, header2=%08X, bpf=%d", + (unsigned int) header, (unsigned int) header2, bpf); /* mask the bits which are allowed to differ between frames */ #define HDRMASK ~((0xF << 12) /* bitrate */ | \ (0x1 << 9) /* padding */ | \ - (0x3 << 4)) /*mode extension*/ - - if ( (header2&HDRMASK) != (header&HDRMASK) ) { /* require 2 matching headers in a row */ - GST_DEBUG ("mp3parse: next header doesn't match (header=%08X, header2=%08X, bpf=%d)", (unsigned int)header, (unsigned int)header2, bpf ); - offset++; /* This frame is invalid. Start looking for a valid frame at the next position in the stream */ - continue; - } + (0x3 << 4)) /*mode extension */ + + if ((header2 & HDRMASK) != (header & HDRMASK)) { /* require 2 matching headers in a row */ + GST_DEBUG + ("mp3parse: next header doesn't match (header=%08X, header2=%08X, bpf=%d)", + (unsigned int) header, (unsigned int) header2, bpf); + offset++; /* This frame is invalid. Start looking for a valid frame at the next position in the stream */ + continue; + } } /* if we don't have the whole frame... */ if ((size - offset) < bpf) { - GST_DEBUG ("mp3parse: partial buffer needed %ld < %d ",(size-offset), bpf); + GST_DEBUG ("mp3parse: partial buffer needed %ld < %d ", (size - offset), + bpf); break; } else { - guint bitrate, layer, rate, channels; - - if (!mp3_type_frame_length_from_header (header, &layer, - &channels, - &bitrate, &rate)) { - g_error("Header failed internal error"); - } - if (channels != mp3parse->channels || - rate != mp3parse->rate || - layer != mp3parse->layer || - bitrate != mp3parse->bit_rate) { - GstCaps *caps = mp3_caps_create (layer, channels, bitrate, rate); - - gst_pad_set_explicit_caps(mp3parse->srcpad, caps); - - mp3parse->channels = channels; - mp3parse->layer = layer; - mp3parse->rate = rate; - mp3parse->bit_rate = bitrate; - } - - outbuf = gst_buffer_create_sub(mp3parse->partialbuf,offset,bpf); - - offset += bpf; + guint bitrate, layer, rate, channels; + + if (!mp3_type_frame_length_from_header (header, &layer, + &channels, &bitrate, &rate)) { + g_error ("Header failed internal error"); + } + if (channels != mp3parse->channels || + rate != mp3parse->rate || + layer != mp3parse->layer || bitrate != mp3parse->bit_rate) { + GstCaps *caps = mp3_caps_create (layer, channels, bitrate, rate); + + gst_pad_set_explicit_caps (mp3parse->srcpad, caps); + + mp3parse->channels = channels; + mp3parse->layer = layer; + mp3parse->rate = rate; + mp3parse->bit_rate = bitrate; + } + + outbuf = gst_buffer_create_sub (mp3parse->partialbuf, offset, bpf); + + offset += bpf; if (mp3parse->skip == 0) { - GST_DEBUG ("mp3parse: pushing buffer of %d bytes",GST_BUFFER_SIZE(outbuf)); + GST_DEBUG ("mp3parse: pushing buffer of %d bytes", + GST_BUFFER_SIZE (outbuf)); if (mp3parse->in_flush) { /* FIXME do some sort of flush event */ mp3parse->in_flush = FALSE; } - GST_BUFFER_TIMESTAMP(outbuf) = last_ts; - GST_BUFFER_DURATION(outbuf) = 8 * (GST_SECOND/1000) * GST_BUFFER_SIZE(outbuf) / mp3parse->bit_rate; - - if (GST_PAD_CAPS (mp3parse->srcpad) != NULL) { - gst_pad_push(mp3parse->srcpad,GST_DATA (outbuf)); - } else { - GST_DEBUG ("No capsnego yet, delaying buffer push"); - gst_buffer_unref (outbuf); - } - } - else { - GST_DEBUG ("mp3parse: skipping buffer of %d bytes",GST_BUFFER_SIZE(outbuf)); - gst_buffer_unref(outbuf); + GST_BUFFER_TIMESTAMP (outbuf) = last_ts; + GST_BUFFER_DURATION (outbuf) = + 8 * (GST_SECOND / 1000) * GST_BUFFER_SIZE (outbuf) / + mp3parse->bit_rate; + + if (GST_PAD_CAPS (mp3parse->srcpad) != NULL) { + gst_pad_push (mp3parse->srcpad, GST_DATA (outbuf)); + } else { + GST_DEBUG ("No capsnego yet, delaying buffer push"); + gst_buffer_unref (outbuf); + } + } else { + GST_DEBUG ("mp3parse: skipping buffer of %d bytes", + GST_BUFFER_SIZE (outbuf)); + gst_buffer_unref (outbuf); mp3parse->skip--; } } } else { offset++; - if (!mp3parse->in_flush) GST_DEBUG ("mp3parse: *** wrong header, skipping byte (FIXME?)"); + if (!mp3parse->in_flush) + GST_DEBUG ("mp3parse: *** wrong header, skipping byte (FIXME?)"); } } /* if we have processed this block and there are still */ /* bytes left not in a partial block, copy them over. */ - if (size-offset > 0) { + if (size - offset > 0) { glong remainder = (size - offset); - GST_DEBUG ("mp3parse: partial buffer needed %ld for trailing bytes",remainder); - outbuf = gst_buffer_create_sub(mp3parse->partialbuf,offset,remainder); - gst_buffer_unref(mp3parse->partialbuf); + GST_DEBUG ("mp3parse: partial buffer needed %ld for trailing bytes", + remainder); + + outbuf = gst_buffer_create_sub (mp3parse->partialbuf, offset, remainder); + gst_buffer_unref (mp3parse->partialbuf); mp3parse->partialbuf = outbuf; - } - else { - gst_buffer_unref(mp3parse->partialbuf); + } else { + gst_buffer_unref (mp3parse->partialbuf); mp3parse->partialbuf = NULL; } } static long -bpf_from_header (GstMPEGAudioParse *parse, unsigned long header) +bpf_from_header (GstMPEGAudioParse * parse, unsigned long header) { guint bitrate, layer, rate, channels, length; if (!(length = mp3_type_frame_length_from_header (header, &layer, - &channels, - &bitrate, &rate))) { + &channels, &bitrate, &rate))) { return 0; } @@ -471,40 +472,57 @@ bpf_from_header (GstMPEGAudioParse *parse, unsigned long header) static gboolean head_check (unsigned long head) { - GST_DEBUG ("checking mp3 header 0x%08lx",head); + GST_DEBUG ("checking mp3 header 0x%08lx", head); /* if it's not a valid sync */ if ((head & 0xffe00000) != 0xffe00000) { - GST_DEBUG ("invalid sync");return FALSE; } + GST_DEBUG ("invalid sync"); + return FALSE; + } /* if it's an invalid MPEG version */ if (((head >> 19) & 3) == 0x1) { - GST_DEBUG ("invalid MPEG version");return FALSE; } + GST_DEBUG ("invalid MPEG version"); + return FALSE; + } /* if it's an invalid layer */ if (!((head >> 17) & 3)) { - GST_DEBUG ("invalid layer");return FALSE; } + GST_DEBUG ("invalid layer"); + return FALSE; + } /* if it's an invalid bitrate */ if (((head >> 12) & 0xf) == 0x0) { - GST_DEBUG ("invalid bitrate");return FALSE; } + GST_DEBUG ("invalid bitrate"); + return FALSE; + } if (((head >> 12) & 0xf) == 0xf) { - GST_DEBUG ("invalid bitrate");return FALSE; } + GST_DEBUG ("invalid bitrate"); + return FALSE; + } /* if it's an invalid samplerate */ if (((head >> 10) & 0x3) == 0x3) { - GST_DEBUG ("invalid samplerate");return FALSE; } - if ((head & 0xffff0000) == 0xfffe0000) { - GST_DEBUG ("invalid sync");return FALSE; } + GST_DEBUG ("invalid samplerate"); + return FALSE; + } + if ((head & 0xffff0000) == 0xfffe0000) { + GST_DEBUG ("invalid sync"); + return FALSE; + } if (head & 0x00000002) { - GST_DEBUG ("invalid emphasis");return FALSE; } + GST_DEBUG ("invalid emphasis"); + return FALSE; + } return TRUE; } static void -gst_mp3parse_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_mp3parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstMPEGAudioParse *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MP3PARSE(object)); - src = GST_MP3PARSE(object); + g_return_if_fail (GST_IS_MP3PARSE (object)); + src = GST_MP3PARSE (object); switch (prop_id) { case ARG_SKIP: @@ -516,13 +534,14 @@ gst_mp3parse_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_mp3parse_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_mp3parse_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstMPEGAudioParse *src; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_MP3PARSE(object)); - src = GST_MP3PARSE(object); + g_return_if_fail (GST_IS_MP3PARSE (object)); + src = GST_MP3PARSE (object); switch (prop_id) { case ARG_SKIP: @@ -537,43 +556,39 @@ gst_mp3parse_get_property (GObject *object, guint prop_id, GValue *value, GParam } } -static GstElementStateReturn -gst_mp3parse_change_state (GstElement *element) +static GstElementStateReturn +gst_mp3parse_change_state (GstElement * element) { GstMPEGAudioParse *src; - g_return_val_if_fail(GST_IS_MP3PARSE(element), GST_STATE_FAILURE); - src = GST_MP3PARSE(element); + g_return_val_if_fail (GST_IS_MP3PARSE (element), GST_STATE_FAILURE); + src = GST_MP3PARSE (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_PAUSED_TO_READY: - src->channels = -1; src->rate = -1; src->layer = -1; + src->channels = -1; + src->rate = -1; + src->layer = -1; break; default: break; } - if (GST_ELEMENT_CLASS(parent_class)->change_state) - return GST_ELEMENT_CLASS(parent_class)->change_state(element); + if (GST_ELEMENT_CLASS (parent_class)->change_state) + return GST_ELEMENT_CLASS (parent_class)->change_state (element); return GST_STATE_SUCCESS; } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "mp3parse", - GST_RANK_NONE, GST_TYPE_MP3PARSE); + GST_RANK_NONE, GST_TYPE_MP3PARSE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "mpegaudioparse", - "MPEG-1 layer 1/2/3 audio parser", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mpegaudioparse", + "MPEG-1 layer 1/2/3 audio parser", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/mpegaudioparse/gstmpegaudioparse.h b/gst/mpegaudioparse/gstmpegaudioparse.h index ce8121a0..812a6d56 100644 --- a/gst/mpegaudioparse/gstmpegaudioparse.h +++ b/gst/mpegaudioparse/gstmpegaudioparse.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_MP3PARSE \ @@ -41,31 +42,33 @@ extern "C" { #define GST_IS_MP3PARSE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MP3PARSE)) -typedef struct _GstMPEGAudioParse GstMPEGAudioParse; -typedef struct _GstMPEGAudioParseClass GstMPEGAudioParseClass; + typedef struct _GstMPEGAudioParse GstMPEGAudioParse; + typedef struct _GstMPEGAudioParseClass GstMPEGAudioParseClass; -struct _GstMPEGAudioParse { - GstElement element; + struct _GstMPEGAudioParse + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - GstBuffer *partialbuf; /* previous buffer (if carryover) */ - guint skip; /* number of frames to skip */ - guint bit_rate; - gint channels, rate, layer; - gboolean in_flush; -}; + GstBuffer *partialbuf; /* previous buffer (if carryover) */ + guint skip; /* number of frames to skip */ + guint bit_rate; + gint channels, rate, layer; + gboolean in_flush; + }; -struct _GstMPEGAudioParseClass { - GstElementClass parent_class; -}; + struct _GstMPEGAudioParseClass + { + GstElementClass parent_class; + }; -GType gst_mp3parse_get_type(void); + GType gst_mp3parse_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __MP3PARSE_H__ */ +#endif /* __MP3PARSE_H__ */ diff --git a/gst/overlay/gstoverlay.c b/gst/overlay/gstoverlay.c index fccd88b9..cf787e87 100644 --- a/gst/overlay/gstoverlay.c +++ b/gst/overlay/gstoverlay.c @@ -33,60 +33,59 @@ static GstElementDetails overlay_details = { }; static GstStaticPadTemplate overlay_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate overlay_sink1_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink1", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink1", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate overlay_sink2_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink2", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink2", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate overlay_sink3_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink3", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink3", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); /* OVERLAY signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, }; -static void gst_overlay_class_init (GstOverlayClass *klass); -static void gst_overlay_base_init (GstOverlayClass *klass); -static void gst_overlay_init (GstOverlay *overlay); +static void gst_overlay_class_init (GstOverlayClass * klass); +static void gst_overlay_base_init (GstOverlayClass * klass); +static void gst_overlay_init (GstOverlay * overlay); -static void gst_overlay_loop (GstElement *element); +static void gst_overlay_loop (GstElement * element); -static void gst_overlay_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_overlay_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_overlay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_overlay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_overlay_signals[LAST_SIGNAL] = { 0 }; */ static GType @@ -96,47 +95,49 @@ gst_overlay_get_type (void) if (!overlay_type) { static const GTypeInfo overlay_info = { - sizeof(GstOverlayClass), - (GBaseInitFunc)gst_overlay_base_init, + sizeof (GstOverlayClass), + (GBaseInitFunc) gst_overlay_base_init, NULL, - (GClassInitFunc)gst_overlay_class_init, + (GClassInitFunc) gst_overlay_class_init, NULL, NULL, - sizeof(GstOverlay), + sizeof (GstOverlay), 0, - (GInstanceInitFunc)gst_overlay_init, + (GInstanceInitFunc) gst_overlay_init, }; - overlay_type = g_type_register_static(GST_TYPE_ELEMENT, "GstOverlay", &overlay_info, 0); + overlay_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstOverlay", &overlay_info, + 0); } return overlay_type; } static void -gst_overlay_base_init (GstOverlayClass *klass) +gst_overlay_base_init (GstOverlayClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&overlay_sink1_factory)); + gst_static_pad_template_get (&overlay_sink1_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&overlay_sink2_factory)); + gst_static_pad_template_get (&overlay_sink2_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&overlay_sink3_factory)); + gst_static_pad_template_get (&overlay_sink3_factory)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&overlay_src_factory)); + gst_static_pad_template_get (&overlay_src_factory)); gst_element_class_set_details (element_class, &overlay_details); } static void -gst_overlay_class_init (GstOverlayClass *klass) +gst_overlay_class_init (GstOverlayClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_overlay_set_property; gobject_class->get_property = gst_overlay_get_property; @@ -144,29 +145,28 @@ gst_overlay_class_init (GstOverlayClass *klass) } #if 0 -static GstCaps *gst_overlay_getcaps(GstPad *pad) +static GstCaps * +gst_overlay_getcaps (GstPad * pad) { GstCaps *caps; GstOverlay *overlay; overlay = GST_OVERLAY (gst_pad_get_parent (pad)); - if(overlay->width && overlay->height){ - caps = GST_STATIC_CAPS ( - "overlay_sink2", - "video/raw", - "format", GST_TYPE_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), - "width", G_TYPE_INT (overlay->width), - "height", G_TYPE_INT (overlay->height) - ); - }else{ - caps = GST_STATIC_CAPS ( - "overlay_sink2", - "video/raw", - "format", GST_TYPE_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), - "width", G_TYPE_INT_RANGE (0, 4096), - "height", G_TYPE_INT_RANGE (0, 4096) - ); + if (overlay->width && overlay->height) { + caps = GST_STATIC_CAPS ("overlay_sink2", + "video/raw", + "format", GST_TYPE_FOURCC (GST_MAKE_FOURCC ('I', '4', '2', '0')), + "width", G_TYPE_INT (overlay->width), + "height", G_TYPE_INT (overlay->height) + ); + } else { + caps = GST_STATIC_CAPS ("overlay_sink2", + "video/raw", + "format", GST_TYPE_FOURCC (GST_MAKE_FOURCC ('I', '4', '2', '0')), + "width", G_TYPE_INT_RANGE (0, 4096), + "height", G_TYPE_INT_RANGE (0, 4096) + ); } return caps; @@ -174,7 +174,7 @@ static GstCaps *gst_overlay_getcaps(GstPad *pad) #endif static gboolean -gst_overlay_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_overlay_sinkconnect (GstPad * pad, const GstCaps * caps) { GstOverlay *overlay; GstStructure *structure; @@ -183,80 +183,91 @@ gst_overlay_sinkconnect (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "width", &overlay->width); - gst_structure_get_int (structure, "height", &overlay->height); - gst_structure_get_double (structure, "framerate", &overlay->framerate); + gst_structure_get_int (structure, "width", &overlay->width); + gst_structure_get_int (structure, "height", &overlay->height); + gst_structure_get_double (structure, "framerate", &overlay->framerate); /* forward to the next plugin */ - return gst_pad_try_set_caps(overlay->srcpad, caps); + return gst_pad_try_set_caps (overlay->srcpad, caps); } -static void -gst_overlay_init (GstOverlay *overlay) +static void +gst_overlay_init (GstOverlay * overlay) { - overlay->sinkpad1 = gst_pad_new_from_template ( - gst_static_pad_template_get (&overlay_sink1_factory), "sink1"); + overlay->sinkpad1 = + gst_pad_new_from_template (gst_static_pad_template_get + (&overlay_sink1_factory), "sink1"); gst_pad_set_link_function (overlay->sinkpad1, gst_overlay_sinkconnect); gst_element_add_pad (GST_ELEMENT (overlay), overlay->sinkpad1); - overlay->sinkpad2 = gst_pad_new_from_template ( - gst_static_pad_template_get (&overlay_sink2_factory), "sink2"); + overlay->sinkpad2 = + gst_pad_new_from_template (gst_static_pad_template_get + (&overlay_sink2_factory), "sink2"); gst_pad_set_link_function (overlay->sinkpad2, gst_overlay_sinkconnect); gst_element_add_pad (GST_ELEMENT (overlay), overlay->sinkpad2); - overlay->sinkpad3 = gst_pad_new_from_template ( - gst_static_pad_template_get (&overlay_sink3_factory), "sink3"); + overlay->sinkpad3 = + gst_pad_new_from_template (gst_static_pad_template_get + (&overlay_sink3_factory), "sink3"); gst_pad_set_link_function (overlay->sinkpad3, gst_overlay_sinkconnect); gst_element_add_pad (GST_ELEMENT (overlay), overlay->sinkpad3); - overlay->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&overlay_src_factory), "src"); + overlay->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&overlay_src_factory), "src"); gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad); gst_element_set_loop_function (GST_ELEMENT (overlay), gst_overlay_loop); } static void -gst_overlay_blend_i420 (guint8 *out, guint8 *in1, guint8 *in2, guint8 *in3, - gint width, gint height) +gst_overlay_blend_i420 (guint8 * out, guint8 * in1, guint8 * in2, guint8 * in3, + gint width, gint height) { int mask; int i, j; - guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; + guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; int lumsize; int chromsize; - int width2 = width/2; - int height2 = height/2; + int width2 = width / 2; + int height2 = height / 2; lumsize = width * height; chromsize = width2 * height2; - in1u = in1 + lumsize; in1v = in1u + chromsize; - in2u = in2 + lumsize; in2v = in2u + chromsize; - outu = out + lumsize; outv = outu + chromsize; - + in1u = in1 + lumsize; + in1v = in1u + chromsize; + in2u = in2 + lumsize; + in2v = in2u + chromsize; + outu = out + lumsize; + outv = outu + chromsize; + for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { - mask = in3[i*width + j]; - out[i*width+j] = ((in1[i*width+j] * mask) + - (in2[i*width+j] * (255 - mask))) >> 8; + mask = in3[i * width + j]; + out[i * width + j] = ((in1[i * width + j] * mask) + + (in2[i * width + j] * (255 - mask))) >> 8; } } - for (i = 0; i < height/2; i++) { - for (j = 0; j < width/2; j++) { - mask = (in3[(i*2)*width + (j*2)] + in3[(i*2 + 1)*width + (j*2)] + - in3[(i*2)*width + (j*2 + 1)] + in3[(i*2 + 1)*width + (j*2 + 1)]) / 4; - outu[i*width2 + j] = ((in1u[i*width2+j] * mask) + - (in2u[i*width2 + j] * (255 - mask))) >> 8; - outv[i*width2 + j] = ((in1v[i*width2+j] * mask) + - (in2v[i*width2 + j] * (255 - mask))) >> 8; + for (i = 0; i < height / 2; i++) { + for (j = 0; j < width / 2; j++) { + mask = + (in3[(i * 2) * width + (j * 2)] + in3[(i * 2 + 1) * width + (j * 2)] + + in3[(i * 2) * width + (j * 2 + 1)] + in3[(i * 2 + 1) * width + + (j * 2 + 1)]) / 4; + outu[i * width2 + j] = + ((in1u[i * width2 + j] * mask) + (in2u[i * width2 + j] * (255 - + mask))) >> 8; + outv[i * width2 + j] = + ((in1v[i * width2 + j] * mask) + (in2v[i * width2 + j] * (255 - + mask))) >> 8; } } } static void -gst_overlay_loop (GstElement *element) +gst_overlay_loop (GstElement * element) { GstOverlay *overlay; GstBuffer *out; @@ -284,22 +295,21 @@ gst_overlay_loop (GstElement *element) return; } - g_return_if_fail(in1 != NULL); - g_return_if_fail(in2 != NULL); - g_return_if_fail(in3 != NULL); + g_return_if_fail (in1 != NULL); + g_return_if_fail (in2 != NULL); + g_return_if_fail (in3 != NULL); - size = (overlay->width * overlay->height * 3)/2; - g_return_if_fail(GST_BUFFER_SIZE(in1) != size); - g_return_if_fail(GST_BUFFER_SIZE(in2) != size); - g_return_if_fail(GST_BUFFER_SIZE(in3) != size); + size = (overlay->width * overlay->height * 3) / 2; + g_return_if_fail (GST_BUFFER_SIZE (in1) != size); + g_return_if_fail (GST_BUFFER_SIZE (in2) != size); + g_return_if_fail (GST_BUFFER_SIZE (in3) != size); out = gst_buffer_new_and_alloc (size); gst_overlay_blend_i420 (GST_BUFFER_DATA (out), - GST_BUFFER_DATA (in1), - GST_BUFFER_DATA (in2), - GST_BUFFER_DATA (in3), - overlay->width, overlay->height); + GST_BUFFER_DATA (in1), + GST_BUFFER_DATA (in2), + GST_BUFFER_DATA (in3), overlay->width, overlay->height); GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (in1); GST_BUFFER_DURATION (out) = GST_BUFFER_DURATION (in1); @@ -312,12 +322,12 @@ gst_overlay_loop (GstElement *element) } static void -gst_overlay_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_overlay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstOverlay *overlay; - overlay = GST_OVERLAY(object); + overlay = GST_OVERLAY (object); switch (prop_id) { default: @@ -327,12 +337,12 @@ gst_overlay_set_property (GObject *object, guint prop_id, } static void -gst_overlay_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_overlay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstOverlay *overlay; - overlay = GST_OVERLAY(object); + overlay = GST_OVERLAY (object); switch (prop_id) { default: @@ -343,20 +353,14 @@ gst_overlay_get_property (GObject *object, guint prop_id, static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "overlay", - GST_RANK_NONE, GST_TYPE_OVERLAY); + GST_RANK_NONE, GST_TYPE_OVERLAY); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "overlay", - "Overlay multiple video streams", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "overlay", + "Overlay multiple video streams", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/overlay/gstoverlay.h b/gst/overlay/gstoverlay.h index 523656e0..377a2590 100644 --- a/gst/overlay/gstoverlay.h +++ b/gst/overlay/gstoverlay.h @@ -37,30 +37,32 @@ typedef struct _GstOverlay GstOverlay; typedef struct _GstOverlayClass GstOverlayClass; -struct _GstOverlay { - GstElement element; +struct _GstOverlay +{ + GstElement element; - GstPad *srcpad; - GstPad *sinkpad1; - GstPad *sinkpad2; - GstPad *sinkpad3; + GstPad *srcpad; + GstPad *sinkpad1; + GstPad *sinkpad2; + GstPad *sinkpad3; - gint format; - gint width; - gint height; + gint format; + gint width; + gint height; - gint duration; - gint position; + gint duration; + gint position; - gint type; - gint fps; - gint border; - gint depth; + gint type; + gint fps; + gint border; + gint depth; - gdouble framerate; + gdouble framerate; }; -struct _GstOverlayClass { +struct _GstOverlayClass +{ GstElementClass parent_class; }; diff --git a/gst/passthrough/gstpassthrough.c b/gst/passthrough/gstpassthrough.c index 5bf97f16..37fecf78 100644 --- a/gst/passthrough/gstpassthrough.c +++ b/gst/passthrough/gstpassthrough.c @@ -34,68 +34,68 @@ static GstElementDetails passthrough_details = { "Passthrough", "Filter/Effect/Audio", "Transparent filter for audio/raw (boilerplate for effects)", - "Thomas , "\ - "Andy Wingo " + "Thomas , " "Andy Wingo " }; -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; /* static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; */ -enum { +enum +{ ARG_0, ARG_SILENT }; static GstStaticPadTemplate passthrough_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS - ) -); + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); static GstStaticPadTemplate passthrough_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS - ) -); + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); -static void passthrough_class_init (GstPassthroughClass *klass); -static void passthrough_base_init (GstPassthroughClass *klass); -static void passthrough_init (GstPassthrough *filter); +static void passthrough_class_init (GstPassthroughClass * klass); +static void passthrough_base_init (GstPassthroughClass * klass); +static void passthrough_init (GstPassthrough * filter); -static void passthrough_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void passthrough_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void passthrough_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void passthrough_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static GstPadLinkReturn passthrough_connect_sink (GstPad *pad, const GstCaps *caps); +static GstPadLinkReturn passthrough_connect_sink (GstPad * pad, + const GstCaps * caps); -static void passthrough_chain (GstPad *pad, GstData *_data); -static void inline passthrough_fast_float_chain (gfloat* data, guint numsamples); -static void inline passthrough_fast_16bit_chain (gint16* data, guint numsamples); -static void inline passthrough_fast_8bit_chain (gint8* data, guint numsamples); +static void passthrough_chain (GstPad * pad, GstData * _data); +static void inline passthrough_fast_float_chain (gfloat * data, + guint numsamples); +static void inline passthrough_fast_16bit_chain (gint16 * data, + guint numsamples); +static void inline passthrough_fast_8bit_chain (gint8 * data, guint numsamples); static GstElementClass *parent_class = NULL; static GstPadLinkReturn -passthrough_connect_sink (GstPad *pad, const GstCaps *caps) +passthrough_connect_sink (GstPad * pad, const GstCaps * caps) { const gchar *mimetype; GstPassthrough *filter; GstStructure *structure; - - g_return_val_if_fail (pad != NULL, GST_PAD_LINK_DELAYED); + + g_return_val_if_fail (pad != NULL, GST_PAD_LINK_DELAYED); g_return_val_if_fail (caps != NULL, GST_PAD_LINK_DELAYED); filter = GST_PASSTHROUGH (gst_pad_get_parent (pad)); @@ -105,27 +105,30 @@ passthrough_connect_sink (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); mimetype = gst_structure_get_name (structure); - gst_structure_get_int (structure, "rate", &filter->rate); - gst_structure_get_int (structure, "channels", &filter->channels); - gst_structure_get_int (structure, "width", &filter->width); - gst_structure_get_int (structure, "endianness", &filter->endianness); + gst_structure_get_int (structure, "rate", &filter->rate); + gst_structure_get_int (structure, "channels", &filter->channels); + gst_structure_get_int (structure, "width", &filter->width); + gst_structure_get_int (structure, "endianness", &filter->endianness); if (strcmp (mimetype, "audio/x-raw-int") == 0) { filter->format = GST_PASSTHROUGH_FORMAT_INT; - gst_structure_get_int (structure, "depth", &filter->depth); - gst_structure_get_boolean (structure, "signed", &filter->is_signed); + gst_structure_get_int (structure, "depth", &filter->depth); + gst_structure_get_boolean (structure, "signed", &filter->is_signed); - if (! filter->silent) { - g_print ("Passthrough : channels %d, rate %d\n", filter->channels, filter->rate); - g_print ("Passthrough : format int, bit width %d, endianness %d, signed %s\n", - filter->width, filter->endianness, filter->is_signed ? "yes" : "no"); + if (!filter->silent) { + g_print ("Passthrough : channels %d, rate %d\n", filter->channels, + filter->rate); + g_print + ("Passthrough : format int, bit width %d, endianness %d, signed %s\n", + filter->width, filter->endianness, filter->is_signed ? "yes" : "no"); } } else if (strcmp (mimetype, "audio/x-raw-float") == 0) { filter->format = GST_PASSTHROUGH_FORMAT_FLOAT; - if (! filter->silent) { - g_print ("Passthrough : channels %d, rate %d\n", filter->channels, filter->rate); + if (!filter->silent) { + g_print ("Passthrough : channels %d, rate %d\n", filter->channels, + filter->rate); g_print ("Passthrough : format float, width %d\n", filter->width); } } @@ -150,13 +153,15 @@ gst_passthrough_get_type (void) 0, (GInstanceInitFunc) passthrough_init, }; - passthrough_type = g_type_register_static (GST_TYPE_ELEMENT, "GstPassthrough", &passthrough_info, 0); + passthrough_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstPassthrough", + &passthrough_info, 0); } return passthrough_type; } static void -passthrough_base_init (GstPassthroughClass *klass) +passthrough_base_init (GstPassthroughClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -168,103 +173,102 @@ passthrough_base_init (GstPassthroughClass *klass) } static void -passthrough_class_init (GstPassthroughClass *klass) +passthrough_class_init (GstPassthroughClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*) klass; - gstelement_class = (GstElementClass*) klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SILENT, - g_param_spec_boolean("silent","silent","silent", - TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT, g_param_spec_boolean ("silent", "silent", "silent", TRUE, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = passthrough_set_property; gobject_class->get_property = passthrough_get_property; } static void -passthrough_init (GstPassthrough *filter) +passthrough_init (GstPassthrough * filter) { - filter->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&passthrough_src_template), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&passthrough_src_template), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); - filter->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&passthrough_sink_template), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&passthrough_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - gst_pad_set_link_function (filter->sinkpad, passthrough_connect_sink); - gst_pad_set_chain_function (filter->sinkpad, passthrough_chain); + gst_pad_set_link_function (filter->sinkpad, passthrough_connect_sink); + gst_pad_set_chain_function (filter->sinkpad, passthrough_chain); filter->silent = FALSE; } static void -passthrough_chain (GstPad *pad, GstData *_data) +passthrough_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstPassthrough *filter; gint16 *int_data; gfloat *float_data; - + g_return_if_fail (pad != NULL); g_return_if_fail (GST_IS_PAD (pad)); g_return_if_fail (buf != NULL); - + filter = GST_PASSTHROUGH (gst_pad_get_parent (pad)); g_return_if_fail (filter != NULL); g_return_if_fail (GST_IS_PASSTHROUGH (filter)); switch (filter->format) { - case GST_PASSTHROUGH_FORMAT_INT: - int_data = (gint16 *) GST_BUFFER_DATA (buf); + case GST_PASSTHROUGH_FORMAT_INT: + int_data = (gint16 *) GST_BUFFER_DATA (buf); + + switch (filter->width) { + case 16: + passthrough_fast_16bit_chain (int_data, GST_BUFFER_SIZE (buf) / 2); + break; + case 8: + passthrough_fast_8bit_chain ((gint8 *) int_data, + GST_BUFFER_SIZE (buf)); + break; + } - switch (filter->width) { - case 16: - passthrough_fast_16bit_chain (int_data, GST_BUFFER_SIZE (buf) / 2); break; - case 8: - passthrough_fast_8bit_chain ((gint8*) int_data, GST_BUFFER_SIZE (buf)); - break; - } + case GST_PASSTHROUGH_FORMAT_FLOAT: + float_data = (gfloat *) GST_BUFFER_DATA (buf); - break; - case GST_PASSTHROUGH_FORMAT_FLOAT: - float_data = (gfloat *) GST_BUFFER_DATA (buf); - - passthrough_fast_float_chain (float_data, GST_BUFFER_SIZE (buf) / sizeof (gfloat)); - - break; + passthrough_fast_float_chain (float_data, + GST_BUFFER_SIZE (buf) / sizeof (gfloat)); + + break; } - + gst_pad_push (filter->srcpad, GST_DATA (buf)); } static void inline -passthrough_fast_float_chain(gfloat* data, guint num_samples) +passthrough_fast_float_chain (gfloat * data, guint num_samples) #include "filter.func" - -static void inline -passthrough_fast_16bit_chain(gint16* data, guint num_samples) + static void inline + passthrough_fast_16bit_chain (gint16 * data, guint num_samples) #include "filter.func" - -static void inline -passthrough_fast_8bit_chain(gint8* data, guint num_samples) + static void inline + passthrough_fast_8bit_chain (gint8 * data, guint num_samples) #include "filter.func" - -static void -passthrough_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) + static void + passthrough_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstPassthrough *filter; g_return_if_fail (GST_IS_PASSTHROUGH (object)); filter = GST_PASSTHROUGH (object); - switch (prop_id) - { + switch (prop_id) { case ARG_SILENT: filter->silent = g_value_get_boolean (value); break; @@ -274,7 +278,8 @@ passthrough_set_property (GObject *object, guint prop_id, const GValue *value, G } static void -passthrough_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +passthrough_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstPassthrough *filter; @@ -292,20 +297,14 @@ passthrough_get_property (GObject *object, guint prop_id, GValue *value, GParamS } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "passthrough", - GST_RANK_NONE, GST_TYPE_PASSTHROUGH); + GST_RANK_NONE, GST_TYPE_PASSTHROUGH); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "passthrough", - "Transparent filter for audio/raw (boilerplate for effects)", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "passthrough", + "Transparent filter for audio/raw (boilerplate for effects)", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/passthrough/gstpassthrough.h b/gst/passthrough/gstpassthrough.h index 0b6f9d58..c8da5dea 100644 --- a/gst/passthrough/gstpassthrough.h +++ b/gst/passthrough/gstpassthrough.h @@ -25,7 +25,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_PASSTHROUGH \ (gst_passthrough_get_type()) #define GST_PASSTHROUGH(obj) \ @@ -36,17 +35,18 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PASSTHROUGH)) #define GST_IS_PASSTHROUGH_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PASSTHROUGH)) - typedef struct _GstPassthrough GstPassthrough; typedef struct _GstPassthroughClass GstPassthroughClass; -typedef enum _GstPassthroughFormat GstPassthroughFormat; +typedef enum _GstPassthroughFormat GstPassthroughFormat; -enum _GstPassthroughFormat { +enum _GstPassthroughFormat +{ GST_PASSTHROUGH_FORMAT_INT, GST_PASSTHROUGH_FORMAT_FLOAT }; -struct _GstPassthrough { +struct _GstPassthrough +{ GstElement element; GstPad *sinkpad, *srcpad; @@ -66,12 +66,12 @@ struct _GstPassthrough { gboolean is_signed; }; -struct _GstPassthroughClass { +struct _GstPassthroughClass +{ GstElementClass parent_class; }; -GType gst_passthrough_get_type(void); +GType gst_passthrough_get_type (void); G_END_DECLS - #endif /* __GST_PASSTHROUGH_H__ */ diff --git a/gst/playondemand/demo-mp3.c b/gst/playondemand/demo-mp3.c index 6e404a15..907f7379 100644 --- a/gst/playondemand/demo-mp3.c +++ b/gst/playondemand/demo-mp3.c @@ -16,81 +16,84 @@ GstClock *element_clock; guint32 *beats; void -played (GstElement *pod, gpointer data) +played (GstElement * pod, gpointer data) { gint i; - g_print("Played beat at %02u, beats are ", - (guint) (gst_clock_get_time(element_clock) / GST_SECOND * - (GTK_ADJUSTMENT(speed_adj))->value) % NUM_BEATS); + g_print ("Played beat at %02u, beats are ", + (guint) (gst_clock_get_time (element_clock) / GST_SECOND * + (GTK_ADJUSTMENT (speed_adj))->value) % NUM_BEATS); - for (i = 0; i <= NUM_BEATS / 32; i++) g_print ("%08x ", beats[i]); + for (i = 0; i <= NUM_BEATS / 32; i++) + g_print ("%08x ", beats[i]); - g_print("\n"); + g_print ("\n"); } void -play (GtkButton *button, gpointer data) +play (GtkButton * button, gpointer data) { - g_signal_emit_by_name(G_OBJECT(pod), "play", NULL, NULL); + g_signal_emit_by_name (G_OBJECT (pod), "play", NULL, NULL); } void -clear (GtkButton *button, gpointer data) +clear (GtkButton * button, gpointer data) { - g_signal_emit_by_name(G_OBJECT(pod), "clear", NULL, NULL); + g_signal_emit_by_name (G_OBJECT (pod), "clear", NULL, NULL); } void -reset (GtkButton *button, gpointer data) +reset (GtkButton * button, gpointer data) { guint i; - g_signal_emit_by_name(G_OBJECT(pod), "reset", NULL, NULL); + + g_signal_emit_by_name (G_OBJECT (pod), "reset", NULL, NULL); for (i = 0; i < NUM_BEATS; i++) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(beat_button[i]), 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (beat_button[i]), 0); } void -beat (GtkToggleButton *button, gpointer data) +beat (GtkToggleButton * button, gpointer data) { - guint b = GPOINTER_TO_UINT(data); + guint b = GPOINTER_TO_UINT (data); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) beats[b / 32] |= 1 << (b % 32); else - beats[b / 32] &= ~ (1 << (b % 32)); + beats[b / 32] &= ~(1 << (b % 32)); } void -speed (GtkAdjustment *adjustment, gpointer data) +speed (GtkAdjustment * adjustment, gpointer data) { - /*g_signal_stop_emission_by_name(G_OBJECT(pod), "deep-notify");*/ - g_object_set(G_OBJECT(pod), "tick-rate", TICK_RATE(adjustment->value), NULL); - /*gst_clock_set_speed(element_clock, adjustment->value);*/ + /*g_signal_stop_emission_by_name(G_OBJECT(pod), "deep-notify"); */ + g_object_set (G_OBJECT (pod), "tick-rate", TICK_RATE (adjustment->value), + NULL); + /*gst_clock_set_speed(element_clock, adjustment->value); */ } void -setup_pipeline (gchar *filename) +setup_pipeline (gchar * filename) { - src = gst_element_factory_make("filesrc", "source"); - dec = gst_element_factory_make("vorbisfile", "decoder"); - pod = gst_element_factory_make("playondemand", "sequencer"); - sink = gst_element_factory_make("alsasink", "sink"); + src = gst_element_factory_make ("filesrc", "source"); + dec = gst_element_factory_make ("vorbisfile", "decoder"); + pod = gst_element_factory_make ("playondemand", "sequencer"); + sink = gst_element_factory_make ("alsasink", "sink"); - g_object_set(G_OBJECT (src), "location", filename, NULL); - g_object_set(G_OBJECT (sink), "period-count", 64, "period-size", 512, NULL); - g_object_set(G_OBJECT (pod), "total-ticks", NUM_BEATS, - "tick-rate", 1.0e-6, "max-plays", NUM_BEATS * 2, NULL); + g_object_set (G_OBJECT (src), "location", filename, NULL); + g_object_set (G_OBJECT (sink), "period-count", 64, "period-size", 512, NULL); + g_object_set (G_OBJECT (pod), "total-ticks", NUM_BEATS, + "tick-rate", 1.0e-6, "max-plays", NUM_BEATS * 2, NULL); - g_object_get(G_OBJECT (pod), "ticks", &beats, NULL); + g_object_get (G_OBJECT (pod), "ticks", &beats, NULL); - pipeline = gst_pipeline_new("app"); + pipeline = gst_pipeline_new ("app"); - gst_bin_add_many(GST_BIN (pipeline), src, dec, pod, sink, NULL); - gst_element_link_many(src, dec, pod, sink, NULL); + gst_bin_add_many (GST_BIN (pipeline), src, dec, pod, sink, NULL); + gst_element_link_many (src, dec, pod, sink, NULL); - element_clock = gst_element_get_clock(GST_ELEMENT (sink)); - gst_element_set_clock(GST_ELEMENT (pod), element_clock); + element_clock = gst_element_get_clock (GST_ELEMENT (sink)); + gst_element_set_clock (GST_ELEMENT (pod), element_clock); } void @@ -98,78 +101,84 @@ setup_gui (void) { guint i; - beat_button = g_new(GtkWidget *, NUM_BEATS); + beat_button = g_new (GtkWidget *, NUM_BEATS); /* initialize gui elements ... */ - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_container_set_border_width(GTK_CONTAINER(window), 12); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width (GTK_CONTAINER (window), 12); - vbox = gtk_vbox_new(TRUE, 0); - gtk_box_set_spacing(GTK_BOX(vbox), 12); + vbox = gtk_vbox_new (TRUE, 0); + gtk_box_set_spacing (GTK_BOX (vbox), 12); - beat_box = gtk_hbox_new(TRUE, 0); - button_box = gtk_hbox_new(TRUE, 0); + beat_box = gtk_hbox_new (TRUE, 0); + button_box = gtk_hbox_new (TRUE, 0); - play_button = gtk_button_new_with_label("Play"); - clear_button = gtk_button_new_with_label("Reset Sound"); - reset_button = gtk_button_new_with_label("Reset All"); - quit_button = gtk_button_new_with_label("Quit"); + play_button = gtk_button_new_with_label ("Play"); + clear_button = gtk_button_new_with_label ("Reset Sound"); + reset_button = gtk_button_new_with_label ("Reset All"); + quit_button = gtk_button_new_with_label ("Quit"); for (i = 0; i < NUM_BEATS; i++) - beat_button[i] = gtk_toggle_button_new_with_label(g_strdup_printf("%2d", i+1)); + beat_button[i] = + gtk_toggle_button_new_with_label (g_strdup_printf ("%2d", i + 1)); - speed_adj = gtk_adjustment_new(1, 0.0, 10.0, 0.1, 1.0, 0.0); - speed_scale = gtk_hscale_new(GTK_ADJUSTMENT(speed_adj)); - gtk_scale_set_digits(GTK_SCALE(speed_scale), 4); - gtk_range_set_update_policy(GTK_RANGE(speed_scale), GTK_UPDATE_DISCONTINUOUS); + speed_adj = gtk_adjustment_new (1, 0.0, 10.0, 0.1, 1.0, 0.0); + speed_scale = gtk_hscale_new (GTK_ADJUSTMENT (speed_adj)); + gtk_scale_set_digits (GTK_SCALE (speed_scale), 4); + gtk_range_set_update_policy (GTK_RANGE (speed_scale), + GTK_UPDATE_DISCONTINUOUS); /* do the packing stuff ... */ - gtk_window_set_default_size(GTK_WINDOW(window), 96, 96); - gtk_container_add(GTK_CONTAINER(window), vbox); + gtk_window_set_default_size (GTK_WINDOW (window), 96, 96); + gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_box_pack_start(GTK_BOX(button_box), play_button, TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(button_box), clear_button, TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(button_box), reset_button, TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(button_box), quit_button, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (button_box), play_button, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (button_box), clear_button, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (button_box), reset_button, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (button_box), quit_button, TRUE, TRUE, 2); for (i = 0; i < NUM_BEATS; i++) - gtk_box_pack_start(GTK_BOX(beat_box), beat_button[i], TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (beat_box), beat_button[i], TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(vbox), button_box, TRUE, FALSE, 2); - gtk_box_pack_start(GTK_BOX(vbox), beat_box, TRUE, FALSE, 2); - gtk_box_pack_start(GTK_BOX(vbox), speed_scale, TRUE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (vbox), button_box, TRUE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (vbox), beat_box, TRUE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (vbox), speed_scale, TRUE, FALSE, 2); /* connect things ... */ - g_signal_connect(G_OBJECT(play_button), "clicked", G_CALLBACK(play), NULL); - g_signal_connect(G_OBJECT(clear_button), "clicked", G_CALLBACK(clear), NULL); - g_signal_connect(G_OBJECT(reset_button), "clicked", G_CALLBACK(reset), NULL); - g_signal_connect(G_OBJECT(quit_button), "clicked", gtk_main_quit, NULL); - g_signal_connect(G_OBJECT(pod), "played", G_CALLBACK(played), NULL); - g_signal_connect(G_OBJECT(speed_adj), "value_changed", G_CALLBACK(speed), NULL); + g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play), NULL); + g_signal_connect (G_OBJECT (clear_button), "clicked", G_CALLBACK (clear), + NULL); + g_signal_connect (G_OBJECT (reset_button), "clicked", G_CALLBACK (reset), + NULL); + g_signal_connect (G_OBJECT (quit_button), "clicked", gtk_main_quit, NULL); + g_signal_connect (G_OBJECT (pod), "played", G_CALLBACK (played), NULL); + g_signal_connect (G_OBJECT (speed_adj), "value_changed", G_CALLBACK (speed), + NULL); for (i = 0; i < NUM_BEATS; i++) - g_signal_connect(G_OBJECT(beat_button[i]), "toggled", G_CALLBACK(beat), GUINT_TO_POINTER(i)); + g_signal_connect (G_OBJECT (beat_button[i]), "toggled", G_CALLBACK (beat), + GUINT_TO_POINTER (i)); /* show the gui. */ - gtk_widget_show_all(window); + gtk_widget_show_all (window); - gtk_idle_add((GtkFunction)gst_bin_iterate, pipeline); + gtk_idle_add ((GtkFunction) gst_bin_iterate, pipeline); } int -main(int argc, char **argv) +main (int argc, char **argv) { gst_init (&argc, &argv); gtk_init (&argc, &argv); - if (argc!=2) { - g_print("usage: %s \n", argv[0]); - exit(-1); + if (argc != 2) { + g_print ("usage: %s \n", argv[0]); + exit (-1); } - setup_pipeline(argv[1]); - gst_element_set_state(pipeline, GST_STATE_PLAYING); - setup_gui(); - gtk_main(); - g_free(beat_button); + setup_pipeline (argv[1]); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + setup_gui (); + gtk_main (); + g_free (beat_button); return 0; } diff --git a/gst/playondemand/gstplayondemand.c b/gst/playondemand/gstplayondemand.c index 3313599c..b3d8d909 100644 --- a/gst/playondemand/gstplayondemand.c +++ b/gst/playondemand/gstplayondemand.c @@ -32,9 +32,9 @@ * way beyond what a real computer can actually keep track of, but hey ... */ /* some default values */ -#define GST_POD_MAX_PLAYS 100 /* maximum simultaneous plays */ -#define GST_POD_BUFFER_TIME 5.0 /* buffer length in seconds */ -#define GST_POD_TICK_RATE 1e-6 /* ticks per second */ +#define GST_POD_MAX_PLAYS 100 /* maximum simultaneous plays */ +#define GST_POD_BUFFER_TIME 5.0 /* buffer length in seconds */ +#define GST_POD_TICK_RATE 1e-6 /* ticks per second */ /* buffer pool fallback values ... use if no buffer pool is available */ #define GST_POD_BUFPOOL_SIZE 4096 @@ -50,77 +50,75 @@ static GstElementDetails play_on_demand_details = { static GstStaticPadTemplate play_on_demand_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS - ) -); + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); static GstStaticPadTemplate play_on_demand_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS - ) -); + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); /* GObject functionality */ -static void play_on_demand_class_init (GstPlayOnDemandClass *klass); -static void play_on_demand_base_init (GstPlayOnDemandClass *klass); -static void play_on_demand_init (GstPlayOnDemand *filter); -static void play_on_demand_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void play_on_demand_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void play_on_demand_dispose (GObject *object); +static void play_on_demand_class_init (GstPlayOnDemandClass * klass); +static void play_on_demand_base_init (GstPlayOnDemandClass * klass); +static void play_on_demand_init (GstPlayOnDemand * filter); +static void play_on_demand_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void play_on_demand_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void play_on_demand_dispose (GObject * object); /* GStreamer functionality */ -static GstPadLinkReturn play_on_demand_pad_link (GstPad *pad, const GstCaps *caps); -static void play_on_demand_loop (GstElement *elem); -static void play_on_demand_set_clock (GstElement *elem, GstClock *clock); +static GstPadLinkReturn play_on_demand_pad_link (GstPad * pad, + const GstCaps * caps); +static void play_on_demand_loop (GstElement * elem); +static void play_on_demand_set_clock (GstElement * elem, GstClock * clock); /* signal handlers */ -static void play_on_demand_play_handler (GstElement *elem); -static void play_on_demand_clear_handler (GstElement *elem); -static void play_on_demand_reset_handler (GstElement *elem); +static void play_on_demand_play_handler (GstElement * elem); +static void play_on_demand_clear_handler (GstElement * elem); +static void play_on_demand_reset_handler (GstElement * elem); /* utility functions */ -static void play_on_demand_add_play_pointer (GstPlayOnDemand *filter, guint pos); -static void play_on_demand_resize_buffer (GstPlayOnDemand *filter); +static void play_on_demand_add_play_pointer (GstPlayOnDemand * filter, + guint pos); +static void play_on_demand_resize_buffer (GstPlayOnDemand * filter); GType gst_play_on_demand_get_type (void) { static GType play_on_demand_type = 0; - if (! play_on_demand_type) { + if (!play_on_demand_type) { static const GTypeInfo play_on_demand_info = { - sizeof(GstPlayOnDemandClass), + sizeof (GstPlayOnDemandClass), (GBaseInitFunc) play_on_demand_base_init, NULL, (GClassInitFunc) play_on_demand_class_init, NULL, NULL, - sizeof(GstPlayOnDemand), + sizeof (GstPlayOnDemand), 0, (GInstanceInitFunc) play_on_demand_init, }; - play_on_demand_type = g_type_register_static(GST_TYPE_ELEMENT, - "GstPlayOnDemand", - &play_on_demand_info, 0); + play_on_demand_type = g_type_register_static (GST_TYPE_ELEMENT, + "GstPlayOnDemand", &play_on_demand_info, 0); } return play_on_demand_type; } /* signals and properties */ -enum { +enum +{ /* add signals here */ PLAYED_SIGNAL, STOPPED_SIGNAL, @@ -130,7 +128,8 @@ enum { LAST_SIGNAL }; -enum { +enum +{ PROP_0, PROP_MUTE, PROP_BUFFER_TIME, @@ -145,215 +144,229 @@ static guint gst_pod_filter_signals[LAST_SIGNAL] = { 0 }; static GstElementClass *parent_class = NULL; static void -play_on_demand_base_init (GstPlayOnDemandClass *klass) +play_on_demand_base_init (GstPlayOnDemandClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_pad_template(element_class, - gst_static_pad_template_get(&play_on_demand_src_template)); - gst_element_class_add_pad_template(element_class, - gst_static_pad_template_get(&play_on_demand_sink_template)); - gst_element_class_set_details(element_class, &play_on_demand_details); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&play_on_demand_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&play_on_demand_sink_template)); + gst_element_class_set_details (element_class, &play_on_demand_details); } static void -play_on_demand_class_init (GstPlayOnDemandClass *klass) +play_on_demand_class_init (GstPlayOnDemandClass * klass) { - GObjectClass *gobject_class; + GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass *) klass; + gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gst_pod_filter_signals[PLAYED_SIGNAL] = - g_signal_new("played", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstPlayOnDemandClass, played), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("played", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstPlayOnDemandClass, played), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_pod_filter_signals[STOPPED_SIGNAL] = - g_signal_new("stopped", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstPlayOnDemandClass, stopped), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("stopped", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstPlayOnDemandClass, stopped), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_pod_filter_signals[PLAY_SIGNAL] = - g_signal_new("play", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstPlayOnDemandClass, play), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("play", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstPlayOnDemandClass, play), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_pod_filter_signals[CLEAR_SIGNAL] = - g_signal_new("clear", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstPlayOnDemandClass, clear), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("clear", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstPlayOnDemandClass, clear), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); gst_pod_filter_signals[RESET_SIGNAL] = - g_signal_new("reset", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GstPlayOnDemandClass, reset), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("reset", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstPlayOnDemandClass, reset), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - klass->play = play_on_demand_play_handler; + klass->play = play_on_demand_play_handler; klass->clear = play_on_demand_clear_handler; klass->reset = play_on_demand_reset_handler; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = play_on_demand_set_property; gobject_class->get_property = play_on_demand_get_property; - gobject_class->dispose = play_on_demand_dispose; + gobject_class->dispose = play_on_demand_dispose; gstelement_class->set_clock = play_on_demand_set_clock; - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_MUTE, - g_param_spec_boolean("mute", "Silence output", "Do not output any sound", - FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_BUFFER_TIME, - g_param_spec_float("buffer-time", "Buffer length in seconds", "Number of seconds of audio the buffer holds", - 0.0, G_MAXFLOAT, GST_POD_BUFFER_TIME, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_MAX_PLAYS, - g_param_spec_uint("max-plays", "Maximum simultaneous playbacks", "Maximum allowed number of simultaneous plays from the buffer", - 1, G_MAXUINT, GST_POD_MAX_PLAYS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_TICK_RATE, - g_param_spec_float("tick-rate", "Tick rate (ticks/second)", "The rate of musical ticks, the smallest time unit in a song", - 0, G_MAXFLOAT, GST_POD_TICK_RATE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_TOTAL_TICKS, - g_param_spec_uint("total-ticks", "Total number of ticks", "Total number of ticks in the tick array", - 1, G_MAXUINT, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_TICKS, - g_param_spec_pointer("ticks", "Ticks to play sample on", "An array of ticks (musical times) at which to play the sample", - G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MUTE, + g_param_spec_boolean ("mute", "Silence output", "Do not output any sound", + FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_TIME, + g_param_spec_float ("buffer-time", "Buffer length in seconds", + "Number of seconds of audio the buffer holds", 0.0, G_MAXFLOAT, + GST_POD_BUFFER_TIME, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_PLAYS, + g_param_spec_uint ("max-plays", "Maximum simultaneous playbacks", + "Maximum allowed number of simultaneous plays from the buffer", 1, + G_MAXUINT, GST_POD_MAX_PLAYS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TICK_RATE, + g_param_spec_float ("tick-rate", "Tick rate (ticks/second)", + "The rate of musical ticks, the smallest time unit in a song", 0, + G_MAXFLOAT, GST_POD_TICK_RATE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TOTAL_TICKS, + g_param_spec_uint ("total-ticks", "Total number of ticks", + "Total number of ticks in the tick array", 1, G_MAXUINT, 1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TICKS, + g_param_spec_pointer ("ticks", "Ticks to play sample on", + "An array of ticks (musical times) at which to play the sample", + G_PARAM_READWRITE)); } static void -play_on_demand_init (GstPlayOnDemand *filter) +play_on_demand_init (GstPlayOnDemand * filter) { - filter->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get(&play_on_demand_src_template), "src"); - filter->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get(&play_on_demand_sink_template), "sink"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&play_on_demand_src_template), "src"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&play_on_demand_sink_template), "sink"); - gst_pad_set_link_function(filter->sinkpad, play_on_demand_pad_link); + gst_pad_set_link_function (filter->sinkpad, play_on_demand_pad_link); - gst_element_add_pad(GST_ELEMENT(filter), filter->sinkpad); - gst_element_add_pad(GST_ELEMENT(filter), filter->srcpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); - gst_element_set_loop_function(GST_ELEMENT(filter), play_on_demand_loop); + gst_element_set_loop_function (GST_ELEMENT (filter), play_on_demand_loop); filter->clock = NULL; filter->rate = 0; - filter->ticks = g_new(guint32, filter->total_ticks / 32 + 1); - filter->plays = g_new(guint, filter->max_plays); + filter->ticks = g_new (guint32, filter->total_ticks / 32 + 1); + filter->plays = g_new (guint, filter->max_plays); - play_on_demand_resize_buffer(filter); - play_on_demand_reset_handler(GST_ELEMENT(filter)); + play_on_demand_resize_buffer (filter); + play_on_demand_reset_handler (GST_ELEMENT (filter)); } static void -play_on_demand_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +play_on_demand_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstPlayOnDemand *filter; - register guint i; - guint new_size, min_size, *new_plays; - guint *new_ticks; + register guint i; + guint new_size, min_size, *new_plays; + guint *new_ticks; - g_return_if_fail(GST_IS_PLAYONDEMAND(object)); - filter = GST_PLAYONDEMAND(object); + g_return_if_fail (GST_IS_PLAYONDEMAND (object)); + filter = GST_PLAYONDEMAND (object); switch (prop_id) { - case PROP_MUTE: - filter->mute = g_value_get_boolean(value); - break; - case PROP_BUFFER_TIME: - filter->buffer_time = g_value_get_float(value); - play_on_demand_resize_buffer(filter); - - /* clear out now-invalid play pointers */ - for (i = 0; i < filter->max_plays; i++) filter->plays[i] = G_MAXUINT; - - break; - case PROP_MAX_PLAYS: - new_size = g_value_get_uint(value); - min_size = (new_size < filter->max_plays) ? new_size : filter->max_plays; - - new_plays = g_new(guint, new_size); - for (i = 0; i < min_size; i++) new_plays[i] = filter->plays[i]; - for (i = min_size; i < new_size; i++) new_plays[i] = G_MAXUINT; - - g_free(filter->plays); - filter->plays = new_plays; - filter->max_plays = new_size; - - break; - case PROP_TICK_RATE: - filter->tick_rate = g_value_get_float(value); - break; - case PROP_TOTAL_TICKS: - new_size = g_value_get_uint(value); - min_size = (new_size < filter->total_ticks) ? new_size : filter->total_ticks; - - new_ticks = g_new(guint32, new_size / 32 + 1); - for (i = 0; i <= min_size / 32; i++) new_ticks[i] = filter->ticks[i]; - for (i = min_size / 32 + 1; i <= new_size / 32; i++) new_ticks[i] = 0; - - g_free(filter->ticks); - filter->ticks = new_ticks; - filter->total_ticks = new_size; - - break; - case PROP_TICKS: - new_ticks = (guint *) g_value_get_pointer(value); - if (new_ticks) { - g_free(filter->ticks); + case PROP_MUTE: + filter->mute = g_value_get_boolean (value); + break; + case PROP_BUFFER_TIME: + filter->buffer_time = g_value_get_float (value); + play_on_demand_resize_buffer (filter); + + /* clear out now-invalid play pointers */ + for (i = 0; i < filter->max_plays; i++) + filter->plays[i] = G_MAXUINT; + + break; + case PROP_MAX_PLAYS: + new_size = g_value_get_uint (value); + min_size = (new_size < filter->max_plays) ? new_size : filter->max_plays; + + new_plays = g_new (guint, new_size); + for (i = 0; i < min_size; i++) + new_plays[i] = filter->plays[i]; + for (i = min_size; i < new_size; i++) + new_plays[i] = G_MAXUINT; + + g_free (filter->plays); + filter->plays = new_plays; + filter->max_plays = new_size; + + break; + case PROP_TICK_RATE: + filter->tick_rate = g_value_get_float (value); + break; + case PROP_TOTAL_TICKS: + new_size = g_value_get_uint (value); + min_size = + (new_size < filter->total_ticks) ? new_size : filter->total_ticks; + + new_ticks = g_new (guint32, new_size / 32 + 1); + for (i = 0; i <= min_size / 32; i++) + new_ticks[i] = filter->ticks[i]; + for (i = min_size / 32 + 1; i <= new_size / 32; i++) + new_ticks[i] = 0; + + g_free (filter->ticks); filter->ticks = new_ticks; - } - break; - default: - break; + filter->total_ticks = new_size; + + break; + case PROP_TICKS: + new_ticks = (guint *) g_value_get_pointer (value); + if (new_ticks) { + g_free (filter->ticks); + filter->ticks = new_ticks; + } + break; + default: + break; } } static void -play_on_demand_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +play_on_demand_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstPlayOnDemand *filter; - g_return_if_fail(GST_IS_PLAYONDEMAND(object)); - filter = GST_PLAYONDEMAND(object); + g_return_if_fail (GST_IS_PLAYONDEMAND (object)); + filter = GST_PLAYONDEMAND (object); switch (prop_id) { - case PROP_MUTE: - g_value_set_boolean(value, filter->mute); - break; - case PROP_BUFFER_TIME: - g_value_set_float(value, filter->buffer_time); - break; - case PROP_MAX_PLAYS: - g_value_set_uint(value, filter->max_plays); - break; - case PROP_TICK_RATE: - g_value_set_float(value, filter->tick_rate); - break; - case PROP_TOTAL_TICKS: - g_value_set_uint(value, filter->total_ticks); - break; - case PROP_TICKS: - g_value_set_pointer(value, (gpointer) filter->ticks); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - break; + case PROP_MUTE: + g_value_set_boolean (value, filter->mute); + break; + case PROP_BUFFER_TIME: + g_value_set_float (value, filter->buffer_time); + break; + case PROP_MAX_PLAYS: + g_value_set_uint (value, filter->max_plays); + break; + case PROP_TICK_RATE: + g_value_set_float (value, filter->tick_rate); + break; + case PROP_TOTAL_TICKS: + g_value_set_uint (value, filter->total_ticks); + break; + case PROP_TICKS: + g_value_set_pointer (value, (gpointer) filter->ticks); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } static void -play_on_demand_dispose (GObject *object) +play_on_demand_dispose (GObject * object) { GstPlayOnDemand *filter = GST_PLAYONDEMAND (object); @@ -365,16 +378,16 @@ play_on_demand_dispose (GObject *object) } static GstPadLinkReturn -play_on_demand_pad_link (GstPad *pad, const GstCaps *caps) +play_on_demand_pad_link (GstPad * pad, const GstCaps * caps) { const gchar *mimetype; GstPlayOnDemand *filter; GstStructure *structure; - g_return_val_if_fail(caps != NULL, GST_PAD_LINK_DELAYED); - g_return_val_if_fail(pad != NULL, GST_PAD_LINK_DELAYED); + g_return_val_if_fail (caps != NULL, GST_PAD_LINK_DELAYED); + g_return_val_if_fail (pad != NULL, GST_PAD_LINK_DELAYED); - filter = GST_PLAYONDEMAND(GST_PAD_PARENT(pad)); + filter = GST_PLAYONDEMAND (GST_PAD_PARENT (pad)); structure = gst_caps_get_structure (caps, 0); @@ -382,54 +395,55 @@ play_on_demand_pad_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "rate", &filter->rate); gst_structure_get_int (structure, "channels", &filter->channels); - if (strcmp(mimetype, "audio/x-raw-int") == 0) { + if (strcmp (mimetype, "audio/x-raw-int") == 0) { filter->format = GST_PLAYONDEMAND_FORMAT_INT; - gst_structure_get_int (structure, "width", &filter->width); - } else if (strcmp(mimetype, "audio/x-raw-float") == 0) { + gst_structure_get_int (structure, "width", &filter->width); + } else if (strcmp (mimetype, "audio/x-raw-float") == 0) { filter->format = GST_PLAYONDEMAND_FORMAT_FLOAT; } - play_on_demand_resize_buffer(filter); + play_on_demand_resize_buffer (filter); return gst_pad_try_set_caps (filter->srcpad, caps); } inline static void -play_on_demand_add_play_pointer (GstPlayOnDemand *filter, guint pos) +play_on_demand_add_play_pointer (GstPlayOnDemand * filter, guint pos) { register guint i; if (filter->rate && ((filter->buffer_time * filter->rate) > pos)) { for (i = 0; i < filter->max_plays; i++) { if (filter->plays[i] == G_MAXUINT) { - filter->plays[i] = pos; - /* emit a signal to indicate a sample being played */ - g_signal_emit(filter, gst_pod_filter_signals[PLAYED_SIGNAL], 0); - break; + filter->plays[i] = pos; + /* emit a signal to indicate a sample being played */ + g_signal_emit (filter, gst_pod_filter_signals[PLAYED_SIGNAL], 0); + break; } } } } static void -play_on_demand_loop (GstElement *elem) +play_on_demand_loop (GstElement * elem) { - GstPlayOnDemand *filter = GST_PLAYONDEMAND(elem); - guint num_in, num_out, num_filter; - GstData *in = NULL; - GstBuffer *out = NULL; - static guint last_tick = 0; + GstPlayOnDemand *filter = GST_PLAYONDEMAND (elem); + guint num_in, num_out, num_filter; + GstData *in = NULL; + GstBuffer *out = NULL; + static guint last_tick = 0; - g_return_if_fail(filter != NULL); - g_return_if_fail(GST_IS_PLAYONDEMAND(filter)); + g_return_if_fail (filter != NULL); + g_return_if_fail (GST_IS_PLAYONDEMAND (filter)); - in = (in == NULL && ! filter->eos) ? gst_pad_pull(filter->sinkpad) : NULL; + in = (in == NULL && !filter->eos) ? gst_pad_pull (filter->sinkpad) : NULL; if (filter->format == GST_PLAYONDEMAND_FORMAT_INT) { if (filter->width == 16) { gint16 min = 0xffff; gint16 max = 0x7fff; gint16 zero = 0; + #define _TYPE_ gint16 #include "filter.func" #undef _TYPE_ @@ -437,6 +451,7 @@ play_on_demand_loop (GstElement *elem) gint8 min = 0xff; gint8 max = 0x7f; gint8 zero = 0; + #define _TYPE_ gint8 #include "filter.func" #undef _TYPE_ @@ -445,6 +460,7 @@ play_on_demand_loop (GstElement *elem) gfloat min = -1.0; gfloat max = 1.0; gfloat zero = 0.0; + #define _TYPE_ gfloat #include "filter.func" #undef _TYPE_ @@ -452,106 +468,105 @@ play_on_demand_loop (GstElement *elem) } static void -play_on_demand_set_clock (GstElement *elem, GstClock *clock) +play_on_demand_set_clock (GstElement * elem, GstClock * clock) { GstPlayOnDemand *filter; - g_return_if_fail(elem != NULL); - g_return_if_fail(GST_IS_PLAYONDEMAND(elem)); - filter = GST_PLAYONDEMAND(elem); + g_return_if_fail (elem != NULL); + g_return_if_fail (GST_IS_PLAYONDEMAND (elem)); + filter = GST_PLAYONDEMAND (elem); filter->clock = clock; } static void -play_on_demand_play_handler (GstElement *elem) +play_on_demand_play_handler (GstElement * elem) { GstPlayOnDemand *filter; - g_return_if_fail(elem != NULL); - g_return_if_fail(GST_IS_PLAYONDEMAND(elem)); - filter = GST_PLAYONDEMAND(elem); + g_return_if_fail (elem != NULL); + g_return_if_fail (GST_IS_PLAYONDEMAND (elem)); + filter = GST_PLAYONDEMAND (elem); - play_on_demand_add_play_pointer(filter, 0); + play_on_demand_add_play_pointer (filter, 0); } static void -play_on_demand_clear_handler (GstElement *elem) +play_on_demand_clear_handler (GstElement * elem) { GstPlayOnDemand *filter; register guint i; - g_return_if_fail(elem != NULL); - g_return_if_fail(GST_IS_PLAYONDEMAND(elem)); - filter = GST_PLAYONDEMAND(elem); + g_return_if_fail (elem != NULL); + g_return_if_fail (GST_IS_PLAYONDEMAND (elem)); + filter = GST_PLAYONDEMAND (elem); filter->write = 0; filter->eos = FALSE; - for (i = 0; i < filter->max_plays; i++) filter->plays[i] = G_MAXUINT; - for (i = 0; i < filter->buffer_bytes; i++) filter->buffer[i] = (gchar) 0; + for (i = 0; i < filter->max_plays; i++) + filter->plays[i] = G_MAXUINT; + for (i = 0; i < filter->buffer_bytes; i++) + filter->buffer[i] = (gchar) 0; } static void -play_on_demand_reset_handler (GstElement *elem) +play_on_demand_reset_handler (GstElement * elem) { GstPlayOnDemand *filter; register guint i; play_on_demand_clear_handler (elem); - g_return_if_fail(elem != NULL); - g_return_if_fail(GST_IS_PLAYONDEMAND(elem)); - filter = GST_PLAYONDEMAND(elem); + g_return_if_fail (elem != NULL); + g_return_if_fail (GST_IS_PLAYONDEMAND (elem)); + filter = GST_PLAYONDEMAND (elem); - for (i = 0; i <= filter->total_ticks / 32; i++) filter->ticks[i] = 0; + for (i = 0; i <= filter->total_ticks / 32; i++) + filter->ticks[i] = 0; } static void -play_on_demand_resize_buffer (GstPlayOnDemand *filter) +play_on_demand_resize_buffer (GstPlayOnDemand * filter) { - register guint i; - guint new_size, min_size; - gchar *new_buffer; + register guint i; + guint new_size, min_size; + gchar *new_buffer; /* use a default sample rate of 44100, 1 channel, 1 byte per sample if caps haven't been set yet */ - new_size = (guint) filter->buffer_time; + new_size = (guint) filter->buffer_time; new_size *= (filter->rate) ? filter->rate : 44100; new_size *= (filter->channels) ? filter->channels : 1; if (filter->format && filter->format == GST_PLAYONDEMAND_FORMAT_FLOAT) - new_size *= sizeof(gfloat); + new_size *= sizeof (gfloat); else new_size *= (filter->width) ? filter->width / 8 : 1; - min_size = (new_size < filter->buffer_bytes) ? new_size : filter->buffer_bytes; + min_size = + (new_size < filter->buffer_bytes) ? new_size : filter->buffer_bytes; - new_buffer = g_new(gchar, new_size); - for (i = 0; i < min_size; i++) new_buffer[i] = filter->buffer[i]; - for (i = min_size; i < new_size; i++) new_buffer[i] = (gchar) 0; + new_buffer = g_new (gchar, new_size); + for (i = 0; i < min_size; i++) + new_buffer[i] = filter->buffer[i]; + for (i = min_size; i < new_size; i++) + new_buffer[i] = (gchar) 0; - g_free(filter->buffer); + g_free (filter->buffer); filter->buffer = new_buffer; filter->buffer_bytes = new_size; } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "playondemand", - GST_RANK_NONE, - GST_TYPE_PLAYONDEMAND); + return gst_element_register (plugin, "playondemand", + GST_RANK_NONE, GST_TYPE_PLAYONDEMAND); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "playondemand", - "Plays a stream at specific times, or when it receives a signal", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "playondemand", + "Plays a stream at specific times, or when it receives a signal", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/playondemand/gstplayondemand.h b/gst/playondemand/gstplayondemand.h index c99c8165..a838d758 100644 --- a/gst/playondemand/gstplayondemand.h +++ b/gst/playondemand/gstplayondemand.h @@ -29,7 +29,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_PLAYONDEMAND \ (gst_play_on_demand_get_type()) #define GST_PLAYONDEMAND(obj) \ @@ -40,58 +39,59 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAYONDEMAND)) #define GST_IS_PLAYONDEMAND_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAYONDEMAND)) +typedef struct _GstPlayOnDemand GstPlayOnDemand; +typedef struct _GstPlayOnDemandClass GstPlayOnDemandClass; +typedef enum _GstPlayOnDemandFormat GstPlayOnDemandFormat; -typedef struct _GstPlayOnDemand GstPlayOnDemand; -typedef struct _GstPlayOnDemandClass GstPlayOnDemandClass; -typedef enum _GstPlayOnDemandFormat GstPlayOnDemandFormat; - -enum _GstPlayOnDemandFormat { +enum _GstPlayOnDemandFormat +{ GST_PLAYONDEMAND_FORMAT_INT, GST_PLAYONDEMAND_FORMAT_FLOAT }; -struct _GstPlayOnDemand { +struct _GstPlayOnDemand +{ GstElement element; - GstPad *sinkpad, *srcpad; + GstPad *sinkpad, *srcpad; GstClock *clock; /* filter properties */ - gboolean mute; - gfloat buffer_time; - guint max_plays; - gfloat tick_rate; - guint total_ticks; - guint32 *ticks; + gboolean mute; + gfloat buffer_time; + guint max_plays; + gfloat tick_rate; + guint total_ticks; + guint32 *ticks; /* internal buffer info */ - gchar *buffer; - guint buffer_bytes; - gboolean eos; + gchar *buffer; + guint buffer_bytes; + gboolean eos; /* play pointers == internal buffer offsets for producing output sound */ - guint *plays; - guint write; + guint *plays; + guint write; /* audio format info (used to calculate buffer_samples) */ GstPlayOnDemandFormat format; - guint rate; - guint channels; - guint width; + guint rate; + guint channels; + guint width; }; -struct _GstPlayOnDemandClass { +struct _GstPlayOnDemandClass +{ GstElementClass parent_class; - void (*play) (GstElement *elem); - void (*clear) (GstElement *elem); - void (*reset) (GstElement *elem); - void (*played) (GstElement *elem); - void (*stopped) (GstElement *elem); + void (*play) (GstElement * elem); + void (*clear) (GstElement * elem); + void (*reset) (GstElement * elem); + void (*played) (GstElement * elem); + void (*stopped) (GstElement * elem); }; -GType gst_play_on_demand_get_type(void); +GType gst_play_on_demand_get_type (void); G_END_DECLS - #endif /* __GST_PLAYONDEMAND_H__ */ diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 4826821b..f7914e24 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -41,22 +41,26 @@ GST_DEBUG_CATEGORY_EXTERN (qtdemux_debug); typedef struct _QtNode QtNode; typedef struct _QtNodeType QtNodeType; typedef struct _QtDemuxSample QtDemuxSample; + //typedef struct _QtDemuxStream QtDemuxStream; -struct _QtNode { +struct _QtNode +{ guint32 type; gpointer data; int len; }; -struct _QtNodeType { +struct _QtNodeType +{ guint32 fourcc; char *name; int flags; - void (*dump)(GstQTDemux *qtdemux, void *buffer, int depth); + void (*dump) (GstQTDemux * qtdemux, void *buffer, int depth); }; -struct _QtDemuxSample { +struct _QtDemuxSample +{ int sample_index; int chunk; int size; @@ -65,7 +69,8 @@ struct _QtDemuxSample { guint64 duration; }; -struct _QtDemuxStream { +struct _QtDemuxStream +{ guint32 subtype; GstCaps *caps; GstPad *pad; @@ -78,14 +83,15 @@ struct _QtDemuxStream { int width; int height; float fps; - + double rate; int n_channels; guint bytes_per_frame; guint samples_per_packet; }; -enum QtDemuxState { +enum QtDemuxState +{ QTDEMUX_STATE_NULL, QTDEMUX_STATE_HEADER, QTDEMUX_STATE_HEADER_SEEKING, @@ -95,85 +101,87 @@ enum QtDemuxState { QTDEMUX_STATE_EOS, }; -static GNode *qtdemux_tree_get_child_by_type(GNode *node, guint32 fourcc); -static GNode *qtdemux_tree_get_sibling_by_type(GNode *node, guint32 fourcc); +static GNode *qtdemux_tree_get_child_by_type (GNode * node, guint32 fourcc); +static GNode *qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc); -static GstElementDetails -gst_qtdemux_details = -{ +static GstElementDetails gst_qtdemux_details = { "QuickTime Demuxer", "Codec/Demuxer", "Demultiplex a QuickTime file into audio and video streams", "David Schleef " }; -enum { +enum +{ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; static GstStaticPadTemplate gst_qtdemux_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS ("video/quicktime") -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("video/quicktime") + ); static GstStaticPadTemplate gst_qtdemux_videosrc_template = -GST_STATIC_PAD_TEMPLATE ( - "audio_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("audio_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_qtdemux_audiosrc_template = -GST_STATIC_PAD_TEMPLATE ( - "video_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("video_%02d", + GST_PAD_SRC, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS_ANY); static GstElementClass *parent_class = NULL; -static void gst_qtdemux_class_init (GstQTDemuxClass *klass); -static void gst_qtdemux_base_init (GstQTDemuxClass *klass); -static void gst_qtdemux_init (GstQTDemux *quicktime_demux); -static GstElementStateReturn gst_qtdemux_change_state(GstElement *element); -static void gst_qtdemux_loop_header (GstElement *element); -static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux); - -static void qtdemux_parse_moov(GstQTDemux *qtdemux, void *buffer, int length); -static void qtdemux_parse(GstQTDemux *qtdemux, GNode *node, void *buffer, int length); -static QtNodeType *qtdemux_type_get(guint32 fourcc); -static void qtdemux_node_dump(GstQTDemux *qtdemux, GNode *node); -static void qtdemux_parse_tree(GstQTDemux *qtdemux); -static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *stsd_data); -static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *data); - -static GType gst_qtdemux_get_type (void) +static void gst_qtdemux_class_init (GstQTDemuxClass * klass); +static void gst_qtdemux_base_init (GstQTDemuxClass * klass); +static void gst_qtdemux_init (GstQTDemux * quicktime_demux); +static GstElementStateReturn gst_qtdemux_change_state (GstElement * element); +static void gst_qtdemux_loop_header (GstElement * element); +static gboolean gst_qtdemux_handle_sink_event (GstQTDemux * qtdemux); + +static void qtdemux_parse_moov (GstQTDemux * qtdemux, void *buffer, int length); +static void qtdemux_parse (GstQTDemux * qtdemux, GNode * node, void *buffer, + int length); +static QtNodeType *qtdemux_type_get (guint32 fourcc); +static void qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node); +static void qtdemux_parse_tree (GstQTDemux * qtdemux); +static GstCaps *qtdemux_video_caps (GstQTDemux * qtdemux, guint32 fourcc, + const guint8 * stsd_data); +static GstCaps *qtdemux_audio_caps (GstQTDemux * qtdemux, guint32 fourcc, + const guint8 * data); + +static GType +gst_qtdemux_get_type (void) { static GType qtdemux_type = 0; if (!qtdemux_type) { static const GTypeInfo qtdemux_info = { - sizeof(GstQTDemuxClass), - (GBaseInitFunc)gst_qtdemux_base_init, NULL, - (GClassInitFunc)gst_qtdemux_class_init, - NULL, NULL, sizeof(GstQTDemux), 0, - (GInstanceInitFunc)gst_qtdemux_init, + sizeof (GstQTDemuxClass), + (GBaseInitFunc) gst_qtdemux_base_init, NULL, + (GClassInitFunc) gst_qtdemux_class_init, + NULL, NULL, sizeof (GstQTDemux), 0, + (GInstanceInitFunc) gst_qtdemux_init, }; - qtdemux_type = g_type_register_static (GST_TYPE_ELEMENT, "GstQTDemux", &qtdemux_info, 0); + qtdemux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstQTDemux", &qtdemux_info, + 0); } return qtdemux_type; } -static void gst_qtdemux_base_init (GstQTDemuxClass *klass) +static void +gst_qtdemux_base_init (GstQTDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -187,31 +195,33 @@ static void gst_qtdemux_base_init (GstQTDemuxClass *klass) } -static void gst_qtdemux_class_init (GstQTDemuxClass *klass) +static void +gst_qtdemux_class_init (GstQTDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_qtdemux_change_state; } -static void -gst_qtdemux_init (GstQTDemux *qtdemux) +static void +gst_qtdemux_init (GstQTDemux * qtdemux) { - qtdemux->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_qtdemux_sink_template), "sink"); + qtdemux->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_qtdemux_sink_template), "sink"); gst_element_set_loop_function (GST_ELEMENT (qtdemux), gst_qtdemux_loop_header); gst_element_add_pad (GST_ELEMENT (qtdemux), qtdemux->sinkpad); } static const GstFormat * -gst_qtdemux_get_src_formats (GstPad *pad) +gst_qtdemux_get_src_formats (GstPad * pad) { static const GstFormat src_a_formats[] = { GST_FORMAT_TIME, @@ -224,55 +234,55 @@ gst_qtdemux_get_src_formats (GstPad *pad) GST_FORMAT_DEFAULT, 0 }; - QtDemuxStream *stream = gst_pad_get_element_private(pad); + QtDemuxStream *stream = gst_pad_get_element_private (pad); - return (stream->subtype == GST_MAKE_FOURCC('v','i','d','e')) ? - src_v_formats : src_a_formats; + return (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) ? + src_v_formats : src_a_formats; } static gboolean -gst_qtdemux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_qtdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; - QtDemuxStream *stream = gst_pad_get_element_private(pad); + QtDemuxStream *stream = gst_pad_get_element_private (pad); - if (stream->subtype == GST_MAKE_FOURCC('v','i','d','e') && + if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e') && (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES)) return FALSE; switch (src_format) { case GST_FORMAT_TIME: switch (*dest_format) { - case GST_FORMAT_BYTES: - *dest_value = src_value * 1; /* FIXME */ - break; - case GST_FORMAT_DEFAULT: - *dest_value = src_value * 1; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_BYTES: + *dest_value = src_value * 1; /* FIXME */ + break; + case GST_FORMAT_DEFAULT: + *dest_value = src_value * 1; /* FIXME */ + break; + default: + res = FALSE; + break; } break; case GST_FORMAT_BYTES: switch (*dest_format) { - case GST_FORMAT_TIME: - *dest_value = src_value * 1; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *dest_value = src_value * 1; /* FIXME */ + break; + default: + res = FALSE; + break; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { - case GST_FORMAT_TIME: - *dest_value = src_value * 1; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *dest_value = src_value * 1; /* FIXME */ + break; + default: + res = FALSE; + break; } break; default: @@ -283,7 +293,7 @@ gst_qtdemux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value, } static const GstQueryType * -gst_qtdemux_get_src_query_types (GstPad *pad) +gst_qtdemux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_TOTAL, @@ -295,54 +305,55 @@ gst_qtdemux_get_src_query_types (GstPad *pad) } static const GstEventMask * -gst_qtdemux_get_event_mask (GstPad *pad) +gst_qtdemux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT }, - { 0, } + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT}, + {0,} }; return masks; } static gboolean -gst_qtdemux_handle_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value) +gst_qtdemux_handle_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value) { gboolean res = TRUE; + //QtDemuxStream *stream = gst_pad_get_element_private(pad); switch (type) { case GST_QUERY_TOTAL: switch (*format) { - case GST_FORMAT_TIME: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_BYTES: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_DEFAULT: - *value = 0; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_BYTES: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_DEFAULT: + *value = 0; /* FIXME */ + break; + default: + res = FALSE; + break; } break; case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_TIME: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_BYTES: - *value = 0; /* FIXME */ - break; - case GST_FORMAT_DEFAULT: - *value = 0; /* FIXME */ - break; - default: - res = FALSE; - break; + case GST_FORMAT_TIME: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_BYTES: + *value = 0; /* FIXME */ + break; + case GST_FORMAT_DEFAULT: + *value = 0; /* FIXME */ + break; + default: + res = FALSE; + break; } break; default: @@ -354,9 +365,10 @@ gst_qtdemux_handle_src_query (GstPad *pad, GstQueryType type, } static gboolean -gst_qtdemux_handle_src_event (GstPad *pad, GstEvent *event) +gst_qtdemux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; + //QtDemuxStream *stream = gst_pad_get_element_private(pad); switch (GST_EVENT_TYPE (event)) { @@ -364,19 +376,19 @@ gst_qtdemux_handle_src_event (GstPad *pad, GstEvent *event) GST_DEBUG ("seek format %d", GST_EVENT_SEEK_FORMAT (event)); switch (GST_EVENT_SEEK_FORMAT (event)) { - case GST_FORMAT_BYTES: - case GST_FORMAT_DEFAULT: - case GST_FORMAT_TIME: - { - gint64 desired_offset = GST_EVENT_SEEK_OFFSET (event); - - GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); - - res = FALSE; - } - default: - res = FALSE; - break; + case GST_FORMAT_BYTES: + case GST_FORMAT_DEFAULT: + case GST_FORMAT_TIME: + { + gint64 desired_offset = GST_EVENT_SEEK_OFFSET (event); + + GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); + + res = FALSE; + } + default: + res = FALSE; + break; } default: res = FALSE; @@ -393,7 +405,7 @@ gst_qtdemux_handle_src_event (GstPad *pad, GstEvent *event) GST_DEBUG_CATEGORY (qtdemux_debug); static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (qtdemux_debug, "qtdemux", 0, "qtdemux plugin"); @@ -404,36 +416,30 @@ plugin_init (GstPlugin *plugin) return FALSE; return gst_element_register (plugin, "qtdemux", - GST_RANK_PRIMARY, GST_TYPE_QTDEMUX); + GST_RANK_PRIMARY, GST_TYPE_QTDEMUX); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "qtdemux", - "Quicktime stream demuxer", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) - -static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "qtdemux", + "Quicktime stream demuxer", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) + + static gboolean gst_qtdemux_handle_sink_event (GstQTDemux * qtdemux) { guint32 remaining; GstEvent *event; GstEventType type; - gst_bytestream_get_status(qtdemux->bs, &remaining, &event); + gst_bytestream_get_status (qtdemux->bs, &remaining, &event); - type = event ? GST_EVENT_TYPE(event) : GST_EVENT_UNKNOWN; + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; GST_DEBUG ("qtdemux: event %p %d", event, type); - switch(type){ + switch (type) { case GST_EVENT_EOS: - gst_bytestream_flush(qtdemux->bs, remaining); - gst_pad_event_default(qtdemux->sinkpad, event); + gst_bytestream_flush (qtdemux->bs, remaining); + gst_pad_event_default (qtdemux->sinkpad, event); return FALSE; case GST_EVENT_FLUSH: //g_warning("flush event"); @@ -443,23 +449,24 @@ static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux) //gst_bytestream_flush_fast(qtdemux->bs, remaining); break; default: - g_warning("unhandled event %d",type); + g_warning ("unhandled event %d", type); break; } - gst_event_unref(event); + gst_event_unref (event); return TRUE; } -static GstElementStateReturn gst_qtdemux_change_state(GstElement *element) +static GstElementStateReturn +gst_qtdemux_change_state (GstElement * element) { - GstQTDemux *qtdemux = GST_QTDEMUX(element); + GstQTDemux *qtdemux = GST_QTDEMUX (element); - switch(GST_STATE_TRANSITION(element)){ + switch (GST_STATE_TRANSITION (element)) { case GST_STATE_NULL_TO_READY: break; case GST_STATE_READY_TO_PAUSED: - qtdemux->bs = gst_bytestream_new(qtdemux->sinkpad); + qtdemux->bs = gst_bytestream_new (qtdemux->sinkpad); qtdemux->state = QTDEMUX_STATE_HEADER; /* FIXME */ break; @@ -468,7 +475,7 @@ static GstElementStateReturn gst_qtdemux_change_state(GstElement *element) case GST_STATE_PLAYING_TO_PAUSED: break; case GST_STATE_PAUSED_TO_READY: - gst_bytestream_destroy(qtdemux->bs); + gst_bytestream_destroy (qtdemux->bs); break; case GST_STATE_READY_TO_NULL: break; @@ -476,12 +483,13 @@ static GstElementStateReturn gst_qtdemux_change_state(GstElement *element) break; } - return GST_ELEMENT_CLASS(parent_class)->change_state(element); + return GST_ELEMENT_CLASS (parent_class)->change_state (element); } -static void gst_qtdemux_loop_header (GstElement *element) +static void +gst_qtdemux_loop_header (GstElement * element) { - GstQTDemux *qtdemux = GST_QTDEMUX(element); + GstQTDemux *qtdemux = GST_QTDEMUX (element); guint8 *data; guint32 length; guint32 fourcc; @@ -493,220 +501,230 @@ static void gst_qtdemux_loop_header (GstElement *element) /* FIXME _tell gets the offset wrong */ //cur_offset = gst_bytestream_tell(qtdemux->bs); - + cur_offset = qtdemux->offset; - GST_DEBUG ("loop at position %d",cur_offset); - - switch(qtdemux->state){ - case QTDEMUX_STATE_HEADER: - { - do{ - ret = gst_bytestream_peek_bytes(qtdemux->bs, &data, 16); - if(ret<16){ - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; + GST_DEBUG ("loop at position %d", cur_offset); + + switch (qtdemux->state) { + case QTDEMUX_STATE_HEADER: + { + do { + ret = gst_bytestream_peek_bytes (qtdemux->bs, &data, 16); + if (ret < 16) { + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; + } + } else { + break; } - }else{ - break; + } while (1); + + length = GUINT32_FROM_BE (*(guint32 *) data); + GST_DEBUG ("length %08x", length); + fourcc = GUINT32_FROM_LE (*(guint32 *) (data + 4)); + GST_DEBUG ("fourcc " GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); + + if (length == 0) { + length = gst_bytestream_length (qtdemux->bs) - cur_offset; } - }while(1); + if (length == 1) { + guint32 length1, length2; - length = GUINT32_FROM_BE(*(guint32 *)data); - GST_DEBUG ("length %08x",length); - fourcc = GUINT32_FROM_LE(*(guint32 *)(data+4)); - GST_DEBUG ("fourcc " GST_FOURCC_FORMAT, GST_FOURCC_ARGS(fourcc)); + length1 = GUINT32_FROM_BE (*(guint32 *) (data + 8)); + GST_DEBUG ("length1 %08x", length1); + length2 = GUINT32_FROM_BE (*(guint32 *) (data + 12)); + GST_DEBUG ("length2 %08x", length2); - if(length==0){ - length = gst_bytestream_length(qtdemux->bs) - cur_offset; - } - if(length==1){ - guint32 length1, length2; - - length1 = GUINT32_FROM_BE(*(guint32 *)(data+8)); - GST_DEBUG ("length1 %08x",length1); - length2 = GUINT32_FROM_BE(*(guint32 *)(data+12)); - GST_DEBUG ("length2 %08x",length2); - - length=length2; - } - - switch(fourcc){ - case GST_MAKE_FOURCC('m','d','a','t'): - case GST_MAKE_FOURCC('f','r','e','e'): - case GST_MAKE_FOURCC('w','i','d','e'): - case GST_MAKE_FOURCC('P','I','C','T'): - case GST_MAKE_FOURCC('p','n','o','t'): - break; - case GST_MAKE_FOURCC('m','o','o','v'): - { - GstBuffer *moov; - - do{ - ret = gst_bytestream_read(qtdemux->bs, &moov, length); - if(ret < length){ - GST_DEBUG ("read failed (%d < %d)",ret,length); - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; + length = length2; + } + + switch (fourcc) { + case GST_MAKE_FOURCC ('m', 'd', 'a', 't'): + case GST_MAKE_FOURCC ('f', 'r', 'e', 'e'): + case GST_MAKE_FOURCC ('w', 'i', 'd', 'e'): + case GST_MAKE_FOURCC ('P', 'I', 'C', 'T'): + case GST_MAKE_FOURCC ('p', 'n', 'o', 't'): + break; + case GST_MAKE_FOURCC ('m', 'o', 'o', 'v'): + { + GstBuffer *moov; + + do { + ret = gst_bytestream_read (qtdemux->bs, &moov, length); + if (ret < length) { + GST_DEBUG ("read failed (%d < %d)", ret, length); + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; + } + } else { + break; } - }else{ - break; + } while (1); + + qtdemux_parse_moov (qtdemux, GST_BUFFER_DATA (moov), length); + if (1) + qtdemux_node_dump (qtdemux, qtdemux->moov_node); + qtdemux_parse_tree (qtdemux); + qtdemux->state = QTDEMUX_STATE_MOVIE; + break; + } + default: + { + GST_LOG ("unknown %08x '" GST_FOURCC_FORMAT "' at %d\n", + fourcc, GST_FOURCC_ARGS (fourcc), cur_offset); + break; + } + } + ret = gst_bytestream_seek (qtdemux->bs, cur_offset + length, + GST_SEEK_METHOD_SET); + qtdemux->offset = cur_offset + length; + GST_DEBUG ("seek returned %d\n", ret); + break; + } + case QTDEMUX_STATE_SEEKING_EOS: + { + guint8 *data; + + do { + ret = gst_bytestream_peek_bytes (qtdemux->bs, &data, 1); + if (ret < 1) { + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; } - }while(1); + } else { + break; + } + } while (TRUE); + gst_element_set_eos (element); - qtdemux_parse_moov(qtdemux, GST_BUFFER_DATA(moov), length); - if(1)qtdemux_node_dump(qtdemux, qtdemux->moov_node); - qtdemux_parse_tree(qtdemux); - qtdemux->state = QTDEMUX_STATE_MOVIE; - break; - } - default: - { - GST_LOG("unknown %08x '" GST_FOURCC_FORMAT "' at %d\n", - fourcc, GST_FOURCC_ARGS(fourcc), cur_offset); - break; - } + qtdemux->state = QTDEMUX_STATE_EOS; + return; } - ret = gst_bytestream_seek(qtdemux->bs, cur_offset + length, - GST_SEEK_METHOD_SET); - qtdemux->offset = cur_offset + length; - GST_DEBUG ("seek returned %d\n",ret); - break; - } - case QTDEMUX_STATE_SEEKING_EOS: - { - guint8 *data; - - do{ - ret = gst_bytestream_peek_bytes(qtdemux->bs, &data, 1); - if(ret<1){ - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; - } - }else{ - break; + case QTDEMUX_STATE_EOS: + g_warning ("spinning in EOS\n"); + return; + case QTDEMUX_STATE_MOVIE: + { + QtDemuxStream *stream; + guint64 min_time; + int index = -1; + int i; + + min_time = G_MAXUINT64; + for (i = 0; i < qtdemux->n_streams; i++) { + stream = qtdemux->streams[i]; + + if (stream->sample_index < stream->n_samples && + stream->samples[stream->sample_index].timestamp < min_time) { + min_time = stream->samples[stream->sample_index].timestamp; + index = i; + } } - }while(TRUE); - gst_element_set_eos(element); - qtdemux->state = QTDEMUX_STATE_EOS; - return; - } - case QTDEMUX_STATE_EOS: - g_warning("spinning in EOS\n"); - return; - case QTDEMUX_STATE_MOVIE: - { - QtDemuxStream *stream; - guint64 min_time; - int index = -1; - int i; - - min_time = G_MAXUINT64; - for(i=0;in_streams;i++){ - stream = qtdemux->streams[i]; - - if(stream->sample_index < stream->n_samples && - stream->samples[stream->sample_index].timestamp < min_time){ - min_time = stream->samples[stream->sample_index].timestamp; - index = i; - } - } + if (index == -1) { + for (i = 0; i < qtdemux->n_streams; i++) { + gst_pad_push (qtdemux->streams[i]->pad, + GST_DATA (gst_event_new (GST_EVENT_EOS))); + } + ret = gst_bytestream_seek (qtdemux->bs, 0, GST_SEEK_METHOD_END); + GST_DEBUG ("seek returned %d", ret); - if(index==-1){ - for(i=0;in_streams;i++){ - gst_pad_push(qtdemux->streams[i]->pad, - GST_DATA(gst_event_new (GST_EVENT_EOS))); + qtdemux->state = QTDEMUX_STATE_SEEKING_EOS; + return; } - ret = gst_bytestream_seek(qtdemux->bs, 0, GST_SEEK_METHOD_END); - GST_DEBUG ("seek returned %d",ret); - - qtdemux->state = QTDEMUX_STATE_SEEKING_EOS; - return; - } - stream = qtdemux->streams[index]; + stream = qtdemux->streams[index]; - offset = stream->samples[stream->sample_index].offset; - size = stream->samples[stream->sample_index].size; + offset = stream->samples[stream->sample_index].offset; + size = stream->samples[stream->sample_index].size; - GST_INFO ("pushing from stream %d, sample_index=%d offset=%d size=%d timestamp=%lld", - index, stream->sample_index, offset, size, - stream->samples[stream->sample_index].timestamp); + GST_INFO + ("pushing from stream %d, sample_index=%d offset=%d size=%d timestamp=%lld", + index, stream->sample_index, offset, size, + stream->samples[stream->sample_index].timestamp); - cur_offset = gst_bytestream_tell(qtdemux->bs); - if(offset != cur_offset){ - GST_DEBUG ("seeking to offset %d",offset); - GST_LOG ("seeking to offset %d\n",offset); - ret = gst_bytestream_seek(qtdemux->bs, offset, GST_SEEK_METHOD_SET); - GST_DEBUG ("seek returned %d",ret); - return; - } + cur_offset = gst_bytestream_tell (qtdemux->bs); + if (offset != cur_offset) { + GST_DEBUG ("seeking to offset %d", offset); + GST_LOG ("seeking to offset %d\n", offset); + ret = gst_bytestream_seek (qtdemux->bs, offset, GST_SEEK_METHOD_SET); + GST_DEBUG ("seek returned %d", ret); + return; + } - GST_DEBUG ("reading %d bytes\n",size); - buf = NULL; - do{ - ret = gst_bytestream_read(qtdemux->bs, &buf, size); - if(ret < size){ - GST_DEBUG ("read failed (%d < %d)",ret,size); - if(!gst_qtdemux_handle_sink_event(qtdemux)){ - return; + GST_DEBUG ("reading %d bytes\n", size); + buf = NULL; + do { + ret = gst_bytestream_read (qtdemux->bs, &buf, size); + if (ret < size) { + GST_DEBUG ("read failed (%d < %d)", ret, size); + if (!gst_qtdemux_handle_sink_event (qtdemux)) { + return; + } + } else { + break; + } + } while (TRUE); + + if (buf) { + /* hum... */ + if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) { + float fps = + 1. * GST_SECOND / stream->samples[stream->sample_index].duration; + if (fps != stream->fps) { + gst_caps_set_simple (stream->caps, "framerate", G_TYPE_DOUBLE, fps, + NULL); + stream->fps = fps; + gst_pad_set_explicit_caps (stream->pad, stream->caps); + } } - }else{ - break; - } - }while(TRUE); - - if(buf){ - /* hum... */ - if(stream->subtype == GST_MAKE_FOURCC('v','i','d','e')){ - float fps = 1. * GST_SECOND / stream->samples[stream->sample_index].duration; - if (fps != stream->fps) { - gst_caps_set_simple (stream->caps, "framerate", G_TYPE_DOUBLE, fps, - NULL); - stream->fps = fps; - gst_pad_set_explicit_caps(stream->pad, stream->caps); - } - } - GST_BUFFER_TIMESTAMP(buf) = stream->samples[stream->sample_index].timestamp; - GST_BUFFER_DURATION(buf) = stream->samples[stream->sample_index].duration; - gst_pad_push(stream->pad, GST_DATA (buf)); + GST_BUFFER_TIMESTAMP (buf) = + stream->samples[stream->sample_index].timestamp; + GST_BUFFER_DURATION (buf) = + stream->samples[stream->sample_index].duration; + gst_pad_push (stream->pad, GST_DATA (buf)); - GST_DEBUG ("pushing buffer on %" GST_PTR_FORMAT, stream->pad); + GST_DEBUG ("pushing buffer on %" GST_PTR_FORMAT, stream->pad); + } + stream->sample_index++; + break; } - stream->sample_index++; - break; - } - default: - /* unreached */ - g_assert(0); + default: + /* unreached */ + g_assert (0); } } -void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream) +void +gst_qtdemux_add_stream (GstQTDemux * qtdemux, QtDemuxStream * stream) { - if(stream->subtype == GST_MAKE_FOURCC('v','i','d','e')){ + if (stream->subtype == GST_MAKE_FOURCC ('v', 'i', 'd', 'e')) { gchar *name = g_strdup_printf ("video_%02d", qtdemux->n_video_streams); - stream->pad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_qtdemux_videosrc_template), name); + + stream->pad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_qtdemux_videosrc_template), name); g_free (name); stream->fps = 1. * GST_SECOND / stream->samples[0].duration; - if(stream->caps){ - gst_caps_set_simple(stream->caps, + if (stream->caps) { + gst_caps_set_simple (stream->caps, "width", G_TYPE_INT, stream->width, "height", G_TYPE_INT, stream->height, "framerate", G_TYPE_DOUBLE, stream->fps, NULL); } qtdemux->n_video_streams++; - }else{ + } else { gchar *name = g_strdup_printf ("audio_%02d", qtdemux->n_audio_streams); - stream->pad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_qtdemux_audiosrc_template), name); + + stream->pad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_qtdemux_audiosrc_template), name); g_free (name); - if(stream->caps){ - gst_caps_set_simple(stream->caps, - "rate", G_TYPE_INT, (int)stream->rate, + if (stream->caps) { + gst_caps_set_simple (stream->caps, + "rate", G_TYPE_INT, (int) stream->rate, "channels", G_TYPE_INT, stream->n_channels, NULL); } qtdemux->n_audio_streams++; @@ -714,22 +732,23 @@ void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream) gst_pad_use_explicit_caps (stream->pad); - GST_PAD_ELEMENT_PRIVATE(stream->pad) = stream; + GST_PAD_ELEMENT_PRIVATE (stream->pad) = stream; qtdemux->streams[qtdemux->n_streams] = stream; qtdemux->n_streams++; GST_DEBUG ("n_streams is now %d", qtdemux->n_streams); gst_pad_set_event_mask_function (stream->pad, gst_qtdemux_get_event_mask); gst_pad_set_event_function (stream->pad, gst_qtdemux_handle_src_event); - gst_pad_set_query_type_function (stream->pad, gst_qtdemux_get_src_query_types); + gst_pad_set_query_type_function (stream->pad, + gst_qtdemux_get_src_query_types); gst_pad_set_query_function (stream->pad, gst_qtdemux_handle_src_query); gst_pad_set_formats_function (stream->pad, gst_qtdemux_get_src_formats); gst_pad_set_convert_function (stream->pad, gst_qtdemux_src_convert); - gst_pad_set_explicit_caps(stream->pad, stream->caps); + gst_pad_set_explicit_caps (stream->pad, stream->caps); GST_DEBUG ("adding pad %p to qtdemux %p", stream->pad, qtdemux); - gst_element_add_pad(GST_ELEMENT (qtdemux), stream->pad); + gst_element_add_pad (GST_ELEMENT (qtdemux), stream->pad); } @@ -777,101 +796,104 @@ void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream) #define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d') -static void qtdemux_dump_mvhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_tkhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_elst(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_mdhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_hdlr(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_vmhd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_dref(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stsd(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stts(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stss(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stsc(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stsz(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_stco(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_co64(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_dcom(GstQTDemux *qtdemux, void *buffer, int depth); -static void qtdemux_dump_cmvd(GstQTDemux *qtdemux, void *buffer, int depth); +static void qtdemux_dump_mvhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_tkhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_elst (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_mdhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_hdlr (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_vmhd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_dref (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stsd (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stts (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stss (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stsc (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stsz (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_stco (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_co64 (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_dcom (GstQTDemux * qtdemux, void *buffer, int depth); +static void qtdemux_dump_cmvd (GstQTDemux * qtdemux, void *buffer, int depth); QtNodeType qt_node_types[] = { - { FOURCC_moov, "movie", QT_CONTAINER, }, - { FOURCC_mvhd, "movie header", 0, - qtdemux_dump_mvhd }, - { FOURCC_clip, "clipping", QT_CONTAINER, }, - { FOURCC_trak, "track", QT_CONTAINER, }, - { FOURCC_udta, "user data", 0, }, /* special container */ - { FOURCC_ctab, "color table", 0, }, - { FOURCC_tkhd, "track header", 0, - qtdemux_dump_tkhd }, - { FOURCC_crgn, "clipping region", 0, }, - { FOURCC_matt, "track matte", QT_CONTAINER, }, - { FOURCC_kmat, "compressed matte", 0, }, - { FOURCC_edts, "edit", QT_CONTAINER, }, - { FOURCC_elst, "edit list", 0, - qtdemux_dump_elst }, - { FOURCC_load, "track load settings", 0, }, - { FOURCC_tref, "track reference", QT_CONTAINER, }, - { FOURCC_imap, "track input map", QT_CONTAINER, }, - { FOURCC___in, "track input", 0, }, /* special container */ - { FOURCC___ty, "input type", 0, }, - { FOURCC_mdia, "media", QT_CONTAINER }, - { FOURCC_mdhd, "media header", 0, - qtdemux_dump_mdhd }, - { FOURCC_hdlr, "handler reference", 0, - qtdemux_dump_hdlr }, - { FOURCC_minf, "media information", QT_CONTAINER }, - { FOURCC_vmhd, "video media information", 0, - qtdemux_dump_vmhd }, - { FOURCC_smhd, "sound media information", 0 }, - { FOURCC_gmhd, "base media information header", 0 }, - { FOURCC_gmin, "base media info", 0 }, - { FOURCC_dinf, "data information", QT_CONTAINER }, - { FOURCC_dref, "data reference", 0, - qtdemux_dump_dref }, - { FOURCC_stbl, "sample table", QT_CONTAINER }, - { FOURCC_stsd, "sample description", 0, - qtdemux_dump_stsd }, - { FOURCC_stts, "time-to-sample", 0, - qtdemux_dump_stts }, - { FOURCC_stss, "sync sample", 0, - qtdemux_dump_stss }, - { FOURCC_stsc, "sample-to-chunk", 0, - qtdemux_dump_stsc }, - { FOURCC_stsz, "sample size", 0, - qtdemux_dump_stsz }, - { FOURCC_stco, "chunk offset", 0, - qtdemux_dump_stco }, - { FOURCC_co64, "64-bit chunk offset", 0, - qtdemux_dump_co64 }, - { FOURCC_vide, "video media", 0 }, - { FOURCC_cmov, "compressed movie", QT_CONTAINER }, - { FOURCC_dcom, "compressed data", 0, - qtdemux_dump_dcom }, - { FOURCC_cmvd, "compressed movie data", 0, - qtdemux_dump_cmvd }, - { 0, "unknown", 0 }, + {FOURCC_moov, "movie", QT_CONTAINER,}, + {FOURCC_mvhd, "movie header", 0, + qtdemux_dump_mvhd}, + {FOURCC_clip, "clipping", QT_CONTAINER,}, + {FOURCC_trak, "track", QT_CONTAINER,}, + {FOURCC_udta, "user data", 0,}, /* special container */ + {FOURCC_ctab, "color table", 0,}, + {FOURCC_tkhd, "track header", 0, + qtdemux_dump_tkhd}, + {FOURCC_crgn, "clipping region", 0,}, + {FOURCC_matt, "track matte", QT_CONTAINER,}, + {FOURCC_kmat, "compressed matte", 0,}, + {FOURCC_edts, "edit", QT_CONTAINER,}, + {FOURCC_elst, "edit list", 0, + qtdemux_dump_elst}, + {FOURCC_load, "track load settings", 0,}, + {FOURCC_tref, "track reference", QT_CONTAINER,}, + {FOURCC_imap, "track input map", QT_CONTAINER,}, + {FOURCC___in, "track input", 0,}, /* special container */ + {FOURCC___ty, "input type", 0,}, + {FOURCC_mdia, "media", QT_CONTAINER}, + {FOURCC_mdhd, "media header", 0, + qtdemux_dump_mdhd}, + {FOURCC_hdlr, "handler reference", 0, + qtdemux_dump_hdlr}, + {FOURCC_minf, "media information", QT_CONTAINER}, + {FOURCC_vmhd, "video media information", 0, + qtdemux_dump_vmhd}, + {FOURCC_smhd, "sound media information", 0}, + {FOURCC_gmhd, "base media information header", 0}, + {FOURCC_gmin, "base media info", 0}, + {FOURCC_dinf, "data information", QT_CONTAINER}, + {FOURCC_dref, "data reference", 0, + qtdemux_dump_dref}, + {FOURCC_stbl, "sample table", QT_CONTAINER}, + {FOURCC_stsd, "sample description", 0, + qtdemux_dump_stsd}, + {FOURCC_stts, "time-to-sample", 0, + qtdemux_dump_stts}, + {FOURCC_stss, "sync sample", 0, + qtdemux_dump_stss}, + {FOURCC_stsc, "sample-to-chunk", 0, + qtdemux_dump_stsc}, + {FOURCC_stsz, "sample size", 0, + qtdemux_dump_stsz}, + {FOURCC_stco, "chunk offset", 0, + qtdemux_dump_stco}, + {FOURCC_co64, "64-bit chunk offset", 0, + qtdemux_dump_co64}, + {FOURCC_vide, "video media", 0}, + {FOURCC_cmov, "compressed movie", QT_CONTAINER}, + {FOURCC_dcom, "compressed data", 0, + qtdemux_dump_dcom}, + {FOURCC_cmvd, "compressed movie data", 0, + qtdemux_dump_cmvd}, + {0, "unknown", 0}, }; -static int n_qt_node_types = sizeof(qt_node_types)/sizeof(qt_node_types[0]); +static int n_qt_node_types = sizeof (qt_node_types) / sizeof (qt_node_types[0]); -static void *qtdemux_zalloc(void *opaque, unsigned int items, unsigned int size) +static void * +qtdemux_zalloc (void *opaque, unsigned int items, unsigned int size) { - return g_malloc(items*size); + return g_malloc (items * size); } -static void qtdemux_zfree(void *opaque, void *addr) +static void +qtdemux_zfree (void *opaque, void *addr) { - g_free(addr); + g_free (addr); } -static void *qtdemux_inflate(void *z_buffer, int z_length, int length) +static void * +qtdemux_inflate (void *z_buffer, int z_length, int length) { void *buffer; z_stream *z; int ret; - z = g_new0(z_stream, 1); + z = g_new0 (z_stream, 1); z->zalloc = qtdemux_zalloc; z->zfree = qtdemux_zfree; z->opaque = NULL; @@ -879,147 +901,154 @@ static void *qtdemux_inflate(void *z_buffer, int z_length, int length) z->next_in = z_buffer; z->avail_in = z_length; - buffer = g_malloc(length); - ret = inflateInit(z); - while(z->avail_in > 0){ - if(z->avail_out == 0){ + buffer = g_malloc (length); + ret = inflateInit (z); + while (z->avail_in > 0) { + if (z->avail_out == 0) { length += 1024; - buffer = realloc(buffer, length); + buffer = realloc (buffer, length); z->next_out = buffer + z->total_out; z->avail_out = 1024; } - ret = inflate(z,Z_SYNC_FLUSH); - if(ret != Z_OK)break; + ret = inflate (z, Z_SYNC_FLUSH); + if (ret != Z_OK) + break; } - if(ret != Z_STREAM_END){ - g_warning("inflate() returned %d\n",ret); + if (ret != Z_STREAM_END) { + g_warning ("inflate() returned %d\n", ret); } - g_free(z); + g_free (z); return buffer; } -static void qtdemux_parse_moov(GstQTDemux *qtdemux, void *buffer, int length) +static void +qtdemux_parse_moov (GstQTDemux * qtdemux, void *buffer, int length) { GNode *cmov; - qtdemux->moov_node = g_node_new(buffer); + qtdemux->moov_node = g_node_new (buffer); - qtdemux_parse(qtdemux, qtdemux->moov_node, buffer, length); + qtdemux_parse (qtdemux, qtdemux->moov_node, buffer, length); - cmov = qtdemux_tree_get_child_by_type(qtdemux->moov_node, FOURCC_cmov); - if(cmov){ + cmov = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_cmov); + if (cmov) { GNode *dcom; GNode *cmvd; - dcom = qtdemux_tree_get_child_by_type(cmov, FOURCC_dcom); - cmvd = qtdemux_tree_get_child_by_type(cmov, FOURCC_cmvd); + dcom = qtdemux_tree_get_child_by_type (cmov, FOURCC_dcom); + cmvd = qtdemux_tree_get_child_by_type (cmov, FOURCC_cmvd); - if(QTDEMUX_FOURCC_GET(dcom->data+8) == GST_MAKE_FOURCC('z','l','i','b')){ + if (QTDEMUX_FOURCC_GET (dcom->data + 8) == GST_MAKE_FOURCC ('z', 'l', 'i', + 'b')) { int uncompressed_length; int compressed_length; void *buf; - - uncompressed_length = QTDEMUX_GUINT32_GET(cmvd->data+8); - compressed_length = QTDEMUX_GUINT32_GET(cmvd->data+4) - 12; - GST_LOG("length = %d\n",uncompressed_length); - buf = qtdemux_inflate(cmvd->data + 12, compressed_length, + uncompressed_length = QTDEMUX_GUINT32_GET (cmvd->data + 8); + compressed_length = QTDEMUX_GUINT32_GET (cmvd->data + 4) - 12; + GST_LOG ("length = %d\n", uncompressed_length); + + buf = qtdemux_inflate (cmvd->data + 12, compressed_length, uncompressed_length); qtdemux->moov_node_compressed = qtdemux->moov_node; - qtdemux->moov_node = g_node_new(buf); + qtdemux->moov_node = g_node_new (buf); - qtdemux_parse(qtdemux, qtdemux->moov_node, buf, uncompressed_length); - }else{ - GST_LOG("unknown header compression type\n"); + qtdemux_parse (qtdemux, qtdemux->moov_node, buf, uncompressed_length); + } else { + GST_LOG ("unknown header compression type\n"); } } } -static void qtdemux_parse(GstQTDemux *qtdemux, GNode *node, void *buffer, int length) +static void +qtdemux_parse (GstQTDemux * qtdemux, GNode * node, void *buffer, int length) { guint32 fourcc; guint32 node_length; QtNodeType *type; void *end; - GST_LOG("qtdemux_parse %p %d\n",buffer, length); + GST_LOG ("qtdemux_parse %p %d\n", buffer, length); - node_length = QTDEMUX_GUINT32_GET(buffer); - fourcc = QTDEMUX_FOURCC_GET(buffer+4); + node_length = QTDEMUX_GUINT32_GET (buffer); + fourcc = QTDEMUX_FOURCC_GET (buffer + 4); - type = qtdemux_type_get(fourcc); - - GST_LOG("parsing '" GST_FOURCC_FORMAT "', length=%d\n", - GST_FOURCC_ARGS(fourcc), node_length); + type = qtdemux_type_get (fourcc); - if(type->flags & QT_CONTAINER){ + GST_LOG ("parsing '" GST_FOURCC_FORMAT "', length=%d\n", + GST_FOURCC_ARGS (fourcc), node_length); + + if (type->flags & QT_CONTAINER) { void *buf; guint32 len; buf = buffer + 8; end = buffer + length; - while(buf < end){ + while (buf < end) { GNode *child; - if(buf + 8 >= end){ + if (buf + 8 >= end) { /* FIXME: get annoyed */ - GST_LOG("buffer overrun\n"); + GST_LOG ("buffer overrun\n"); } - len = QTDEMUX_GUINT32_GET(buf); + len = QTDEMUX_GUINT32_GET (buf); - child = g_node_new(buf); - g_node_append(node, child); - qtdemux_parse(qtdemux, child, buf, len); + child = g_node_new (buf); + g_node_append (node, child); + qtdemux_parse (qtdemux, child, buf, len); buf += len; } - }else{ + } else { #if 0 - if(fourcc == FOURCC_cmvd){ + if (fourcc == FOURCC_cmvd) { int uncompressed_length; void *buf; - - uncompressed_length = QTDEMUX_GUINT32_GET(buffer+8); - GST_LOG("length = %d\n",uncompressed_length); - buf = qtdemux_inflate(buffer + 12, node_length-12, uncompressed_length); + uncompressed_length = QTDEMUX_GUINT32_GET (buffer + 8); + GST_LOG ("length = %d\n", uncompressed_length); + + buf = + qtdemux_inflate (buffer + 12, node_length - 12, uncompressed_length); end = buf + uncompressed_length; - while(buf < end){ - GNode *child; + while (buf < end) { + GNode *child; guint32 len; - if(buf + 8 >= end){ + if (buf + 8 >= end) { /* FIXME: get annoyed */ - GST_LOG("buffer overrun\n"); - } - len = QTDEMUX_GUINT32_GET(buf); + GST_LOG ("buffer overrun\n"); + } + len = QTDEMUX_GUINT32_GET (buf); - child = g_node_new(buf); - g_node_append(node, child); - qtdemux_parse(qtdemux, child, buf, len); + child = g_node_new (buf); + g_node_append (node, child); + qtdemux_parse (qtdemux, child, buf, len); - buf += len; + buf += len; } } #endif } } -static QtNodeType *qtdemux_type_get(guint32 fourcc) +static QtNodeType * +qtdemux_type_get (guint32 fourcc) { int i; - for(i=0;idata; guint32 node_length; @@ -1027,353 +1056,456 @@ static gboolean qtdemux_node_dump_foreach(GNode *node, gpointer data) QtNodeType *type; int depth; - node_length = GUINT32_FROM_BE(*(guint32 *)buffer); - fourcc = GUINT32_FROM_LE(*(guint32 *)(buffer+4)); + node_length = GUINT32_FROM_BE (*(guint32 *) buffer); + fourcc = GUINT32_FROM_LE (*(guint32 *) (buffer + 4)); - type = qtdemux_type_get(fourcc); + type = qtdemux_type_get (fourcc); - depth = (g_node_depth(node)-1)*2; - GST_LOG("%*s'" GST_FOURCC_FORMAT "', [%d], %s\n", - depth, "", - GST_FOURCC_ARGS(fourcc), - node_length, - type->name); + depth = (g_node_depth (node) - 1) * 2; + GST_LOG ("%*s'" GST_FOURCC_FORMAT "', [%d], %s\n", + depth, "", GST_FOURCC_ARGS (fourcc), node_length, type->name); - if(type->dump)type->dump(data, buffer, depth); + if (type->dump) + type->dump (data, buffer, depth); return FALSE; } -static void qtdemux_node_dump(GstQTDemux *qtdemux, GNode *node) +static void +qtdemux_node_dump (GstQTDemux * qtdemux, GNode * node) { - g_node_traverse(qtdemux->moov_node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, + g_node_traverse (qtdemux->moov_node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, qtdemux_node_dump_foreach, qtdemux); } -static void qtdemux_dump_mvhd(GstQTDemux *qtdemux, void *buffer, int depth) +static void +qtdemux_dump_mvhd (GstQTDemux * qtdemux, void *buffer, int depth) { - GST_LOG("%*s version/flags: %08x\n", depth, "", QTDEMUX_GUINT32_GET(buffer+8)); - GST_LOG("%*s creation time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+12)); - GST_LOG("%*s modify time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+16)); - GST_LOG("%*s time scale: 1/%u sec\n", depth, "", QTDEMUX_GUINT32_GET(buffer+20)); - GST_LOG("%*s duration: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+24)); - GST_LOG("%*s pref. rate: %g\n", depth, "", QTDEMUX_FP32_GET(buffer+28)); - GST_LOG("%*s pref. volume: %g\n", depth, "", QTDEMUX_FP16_GET(buffer+32)); - GST_LOG("%*s preview time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+80)); - GST_LOG("%*s preview dur.: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+84)); - GST_LOG("%*s poster time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+88)); - GST_LOG("%*s select time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+92)); - GST_LOG("%*s select dur.: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+96)); - GST_LOG("%*s current time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+100)); - GST_LOG("%*s next track ID: %d\n", depth, "", QTDEMUX_GUINT32_GET(buffer+104)); + GST_LOG ("%*s version/flags: %08x\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 8)); + GST_LOG ("%*s creation time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 12)); + GST_LOG ("%*s modify time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 16)); + GST_LOG ("%*s time scale: 1/%u sec\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 20)); + GST_LOG ("%*s duration: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 24)); + GST_LOG ("%*s pref. rate: %g\n", depth, "", + QTDEMUX_FP32_GET (buffer + 28)); + GST_LOG ("%*s pref. volume: %g\n", depth, "", + QTDEMUX_FP16_GET (buffer + 32)); + GST_LOG ("%*s preview time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 80)); + GST_LOG ("%*s preview dur.: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 84)); + GST_LOG ("%*s poster time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 88)); + GST_LOG ("%*s select time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 92)); + GST_LOG ("%*s select dur.: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 96)); + GST_LOG ("%*s current time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 100)); + GST_LOG ("%*s next track ID: %d\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 104)); } -static void qtdemux_dump_tkhd(GstQTDemux *qtdemux, void *buffer, int depth) +static void +qtdemux_dump_tkhd (GstQTDemux * qtdemux, void *buffer, int depth) { - GST_LOG("%*s version/flags: %08x\n", depth, "", QTDEMUX_GUINT32_GET(buffer+8)); - GST_LOG("%*s creation time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+12)); - GST_LOG("%*s modify time: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+16)); - GST_LOG("%*s track ID: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+20)); - GST_LOG("%*s duration: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+28)); - GST_LOG("%*s layer: %u\n", depth, "", QTDEMUX_GUINT16_GET(buffer+36)); - GST_LOG("%*s alt group: %u\n", depth, "", QTDEMUX_GUINT16_GET(buffer+38)); - GST_LOG("%*s volume: %g\n", depth, "", QTDEMUX_FP16_GET(buffer+44)); - GST_LOG("%*s track width: %g\n", depth, "", QTDEMUX_FP32_GET(buffer+84)); - GST_LOG("%*s track height: %g\n", depth, "", QTDEMUX_FP32_GET(buffer+88)); + GST_LOG ("%*s version/flags: %08x\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 8)); + GST_LOG ("%*s creation time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 12)); + GST_LOG ("%*s modify time: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 16)); + GST_LOG ("%*s track ID: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 20)); + GST_LOG ("%*s duration: %u\n", depth, "", + QTDEMUX_GUINT32_GET (buffer + 28)); + GST_LOG ("%*s layer: %u\n", depth, "", + QTDEMUX_GUINT16_GET (buffer + 36)); + GST_LOG ("%*s alt group: %u\n", depth, "", + QTDEMUX_GUINT16_GET (buffer + 38)); + GST_LOG ("%*s volume: %g\n", depth, "", + QTDEMUX_FP16_GET (buffer + 44)); + GST_LOG ("%*s track width: %g\n", depth, "", + QTDEMUX_FP32_GET (buffer + 84)); + GST_LOG ("%*s track height: %g\n", depth, "", + QTDEMUX_FP32_GET (buffer + 88)); } -static void qtdemux_dump_elst(GstQTDemux *qtdemux, void *buffer, int depth) +static void +qtdemux_dump_elst (GstQTDemux * qtdemux, void *buffer, int depth) { int i; int n; - GST_LOG("%*s version/flags: %08x\n", depth, "", QTDEMUX_GUINT32_GET(buffer+8)); - GST_LOG("%*s n entries: %u\n", depth, "", QTDEMUX_GUINT32_GET(buffer+12)); - n = QTDEMUX_GUINT32_GET(buffer+12); - for(i=0;idata; - child_fourcc = GUINT32_FROM_LE(*(guint32 *)(buffer+4)); + child_fourcc = GUINT32_FROM_LE (*(guint32 *) (buffer + 4)); - if(child_fourcc == fourcc){ + if (child_fourcc == fourcc) { return child; } } return NULL; } -static GNode *qtdemux_tree_get_sibling_by_type(GNode *node, guint32 fourcc) +static GNode * +qtdemux_tree_get_sibling_by_type (GNode * node, guint32 fourcc) { GNode *child; void *buffer; guint32 child_fourcc; - for(child = g_node_next_sibling(node); child; child = g_node_next_sibling(child)){ + for (child = g_node_next_sibling (node); child; + child = g_node_next_sibling (child)) { buffer = child->data; - child_fourcc = GUINT32_FROM_LE(*(guint32 *)(buffer+4)); + child_fourcc = GUINT32_FROM_LE (*(guint32 *) (buffer + 4)); - if(child_fourcc == fourcc){ + if (child_fourcc == fourcc) { return child; } } return NULL; } -static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak); +static void qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak); -static void qtdemux_parse_tree(GstQTDemux *qtdemux) +static void +qtdemux_parse_tree (GstQTDemux * qtdemux) { GNode *mvhd; GNode *trak; - mvhd = qtdemux_tree_get_child_by_type(qtdemux->moov_node, FOURCC_mvhd); - if(mvhd==NULL){ - GST_LOG("No mvhd node found.\n"); + mvhd = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_mvhd); + if (mvhd == NULL) { + GST_LOG ("No mvhd node found.\n"); return; } - qtdemux->timescale = QTDEMUX_GUINT32_GET(mvhd->data + 20); - qtdemux->duration = QTDEMUX_GUINT32_GET(mvhd->data + 24); + qtdemux->timescale = QTDEMUX_GUINT32_GET (mvhd->data + 20); + qtdemux->duration = QTDEMUX_GUINT32_GET (mvhd->data + 24); - GST_INFO("timescale: %d\n", qtdemux->timescale); - GST_INFO("duration: %d\n", qtdemux->duration); + GST_INFO ("timescale: %d\n", qtdemux->timescale); + GST_INFO ("duration: %d\n", qtdemux->duration); - trak = qtdemux_tree_get_child_by_type(qtdemux->moov_node, FOURCC_trak); - qtdemux_parse_trak(qtdemux, trak); + trak = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_trak); + qtdemux_parse_trak (qtdemux, trak); /* trak = qtdemux_tree_get_sibling_by_type(trak, FOURCC_trak); if(trak)qtdemux_parse_trak(qtdemux, trak);*/ - while ((trak = qtdemux_tree_get_sibling_by_type(trak, FOURCC_trak)) != NULL) - qtdemux_parse_trak(qtdemux, trak); + while ((trak = qtdemux_tree_get_sibling_by_type (trak, FOURCC_trak)) != NULL) + qtdemux_parse_trak (qtdemux, trak); } -static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak) +static void +qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) { int offset; GNode *tkhd; @@ -1392,235 +1524,257 @@ static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak) QtDemuxSample *samples; int n_samples_per_chunk; int index; - int i,j,k; + int i, j, k; QtDemuxStream *stream; int n_sample_times; guint64 timestamp; int sample_size; int sample_index; - stream = g_new0(QtDemuxStream,1); + stream = g_new0 (QtDemuxStream, 1); - tkhd = qtdemux_tree_get_child_by_type(trak, FOURCC_tkhd); - g_assert(tkhd); + tkhd = qtdemux_tree_get_child_by_type (trak, FOURCC_tkhd); + g_assert (tkhd); /* track duration? */ - mdia = qtdemux_tree_get_child_by_type(trak, FOURCC_mdia); - g_assert(mdia); + mdia = qtdemux_tree_get_child_by_type (trak, FOURCC_mdia); + g_assert (mdia); - mdhd = qtdemux_tree_get_child_by_type(mdia, FOURCC_mdhd); - g_assert(mdhd); + mdhd = qtdemux_tree_get_child_by_type (mdia, FOURCC_mdhd); + g_assert (mdhd); - stream->timescale = QTDEMUX_GUINT32_GET(mdhd->data+20); - GST_INFO("track timescale: %d", stream->timescale); - - hdlr = qtdemux_tree_get_child_by_type(mdia, FOURCC_hdlr); - g_assert(hdlr); - - GST_LOG("track type: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(hdlr->data+12))); - GST_LOG("track subtype: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(hdlr->data+16))); + stream->timescale = QTDEMUX_GUINT32_GET (mdhd->data + 20); + GST_INFO ("track timescale: %d", stream->timescale); + + hdlr = qtdemux_tree_get_child_by_type (mdia, FOURCC_hdlr); + g_assert (hdlr); - stream->subtype = QTDEMUX_FOURCC_GET(hdlr->data+16); + GST_LOG ("track type: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (hdlr->data + 12))); + GST_LOG ("track subtype: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (hdlr->data + 16))); - minf = qtdemux_tree_get_child_by_type(mdia, FOURCC_minf); - g_assert(minf); + stream->subtype = QTDEMUX_FOURCC_GET (hdlr->data + 16); - stbl = qtdemux_tree_get_child_by_type(minf, FOURCC_stbl); - g_assert(stbl); + minf = qtdemux_tree_get_child_by_type (mdia, FOURCC_minf); + g_assert (minf); - stsd = qtdemux_tree_get_child_by_type(stbl, FOURCC_stsd); - g_assert(stsd); + stbl = qtdemux_tree_get_child_by_type (minf, FOURCC_stbl); + g_assert (stbl); - if(stream->subtype == FOURCC_vide){ + stsd = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsd); + g_assert (stsd); + + if (stream->subtype == FOURCC_vide) { offset = 16; - GST_LOG("st type: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+offset+4))); - - stream->width = QTDEMUX_GUINT16_GET(stsd->data+offset+32); - stream->height = QTDEMUX_GUINT16_GET(stsd->data+offset+34); - stream->fps = 0.; /* this is filled in later */ - - GST_LOG("frame count: %u\n", QTDEMUX_GUINT16_GET(stsd->data+offset+48)); - - stream->caps = qtdemux_video_caps(qtdemux, - QTDEMUX_FOURCC_GET(stsd->data+offset+4), stsd->data); - GST_INFO("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", - GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET(stsd->data+offset+4)), - stream->caps); - }else if(stream->subtype == FOURCC_soun){ + GST_LOG ("st type: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + offset + 4))); + + stream->width = QTDEMUX_GUINT16_GET (stsd->data + offset + 32); + stream->height = QTDEMUX_GUINT16_GET (stsd->data + offset + 34); + stream->fps = 0.; /* this is filled in later */ + + GST_LOG ("frame count: %u\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 48)); + + stream->caps = qtdemux_video_caps (qtdemux, + QTDEMUX_FOURCC_GET (stsd->data + offset + 4), stsd->data); + GST_INFO ("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + offset + 4)), + stream->caps); + } else if (stream->subtype == FOURCC_soun) { int version, samplesize; - GST_LOG("st type: " GST_FOURCC_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+16+4))); + GST_LOG ("st type: " GST_FOURCC_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + 16 + 4))); offset = 32; - GST_LOG("version/rev: %08x\n", QTDEMUX_GUINT32_GET(stsd->data+offset)); - version = QTDEMUX_GUINT32_GET(stsd->data+offset); - GST_LOG("vendor: %08x\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 4)); - GST_LOG("n_channels: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 8)); - stream->n_channels = QTDEMUX_GUINT16_GET(stsd->data+offset + 8); - GST_LOG("sample_size: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 10)); - samplesize = QTDEMUX_GUINT16_GET(stsd->data+offset + 10); - GST_LOG("compression_id: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 12)); - GST_LOG("packet size: %d\n", QTDEMUX_GUINT16_GET(stsd->data+offset + 14)); - GST_LOG("sample rate: %g\n", QTDEMUX_FP32_GET(stsd->data+offset + 16)); - stream->rate = QTDEMUX_FP32_GET(stsd->data+offset + 16); + GST_LOG ("version/rev: %08x\n", + QTDEMUX_GUINT32_GET (stsd->data + offset)); + version = QTDEMUX_GUINT32_GET (stsd->data + offset); + GST_LOG ("vendor: %08x\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 4)); + GST_LOG ("n_channels: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 8)); + stream->n_channels = QTDEMUX_GUINT16_GET (stsd->data + offset + 8); + GST_LOG ("sample_size: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 10)); + samplesize = QTDEMUX_GUINT16_GET (stsd->data + offset + 10); + GST_LOG ("compression_id: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 12)); + GST_LOG ("packet size: %d\n", + QTDEMUX_GUINT16_GET (stsd->data + offset + 14)); + GST_LOG ("sample rate: %g\n", + QTDEMUX_FP32_GET (stsd->data + offset + 16)); + stream->rate = QTDEMUX_FP32_GET (stsd->data + offset + 16); offset = 52; - if(version == 0x00010000){ - GST_LOG("samples/packet: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset)); - stream->samples_per_packet = QTDEMUX_GUINT32_GET(stsd->data+offset); - GST_LOG("bytes/packet: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 4)); - GST_LOG("bytes/frame: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 8)); - stream->bytes_per_frame = QTDEMUX_GUINT32_GET(stsd->data+offset + 8); - GST_LOG("bytes/sample: %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 12)); + if (version == 0x00010000) { + GST_LOG ("samples/packet: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset)); + stream->samples_per_packet = QTDEMUX_GUINT32_GET (stsd->data + offset); + GST_LOG ("bytes/packet: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 4)); + GST_LOG ("bytes/frame: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 8)); + stream->bytes_per_frame = QTDEMUX_GUINT32_GET (stsd->data + offset + 8); + GST_LOG ("bytes/sample: %d\n", + QTDEMUX_GUINT32_GET (stsd->data + offset + 12)); offset = 68; } else { stream->bytes_per_frame = stream->n_channels * samplesize / 8; stream->samples_per_packet = 1; } - stream->caps = qtdemux_audio_caps(qtdemux, - QTDEMUX_FOURCC_GET(stsd->data+16+4), (QTDEMUX_GUINT32_GET(stsd->data) > offset) ? stsd->data + offset : NULL); - GST_INFO("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", - GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+16+4)), stream->caps); - }else{ - GST_LOG("unknown subtype\n"); + stream->caps = qtdemux_audio_caps (qtdemux, + QTDEMUX_FOURCC_GET (stsd->data + 16 + 4), + (QTDEMUX_GUINT32_GET (stsd->data) > + offset) ? stsd->data + offset : NULL); + GST_INFO ("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n", + GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET (stsd->data + 16 + 4)), + stream->caps); + } else { + GST_LOG ("unknown subtype\n"); return; } /* sample to chunk */ - stsc = qtdemux_tree_get_child_by_type(stbl, FOURCC_stsc); - g_assert(stsc); + stsc = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsc); + g_assert (stsc); /* sample size */ - stsz = qtdemux_tree_get_child_by_type(stbl, FOURCC_stsz); - g_assert(stsz); + stsz = qtdemux_tree_get_child_by_type (stbl, FOURCC_stsz); + g_assert (stsz); /* chunk offsets */ - stco = qtdemux_tree_get_child_by_type(stbl, FOURCC_stco); - co64 = qtdemux_tree_get_child_by_type(stbl, FOURCC_co64); - g_assert(stco || co64); + stco = qtdemux_tree_get_child_by_type (stbl, FOURCC_stco); + co64 = qtdemux_tree_get_child_by_type (stbl, FOURCC_co64); + g_assert (stco || co64); /* sample time */ - stts = qtdemux_tree_get_child_by_type(stbl, FOURCC_stts); - g_assert(stts); + stts = qtdemux_tree_get_child_by_type (stbl, FOURCC_stts); + g_assert (stts); - sample_size = QTDEMUX_GUINT32_GET(stsz->data+12); - if(sample_size == 0){ - n_samples = QTDEMUX_GUINT32_GET(stsz->data+16); + sample_size = QTDEMUX_GUINT32_GET (stsz->data + 12); + if (sample_size == 0) { + n_samples = QTDEMUX_GUINT32_GET (stsz->data + 16); stream->n_samples = n_samples; - samples = g_malloc(sizeof(QtDemuxSample)*n_samples); + samples = g_malloc (sizeof (QtDemuxSample) * n_samples); stream->samples = samples; - for(i=0;idata + i*4 + 20); + for (i = 0; i < n_samples; i++) { + samples[i].size = QTDEMUX_GUINT32_GET (stsz->data + i * 4 + 20); } - n_samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data+12); + n_samples_per_chunk = QTDEMUX_GUINT32_GET (stsc->data + 12); index = 0; offset = 16; - for(i=0;idata + 16 + i*12 + 0) - 1; - if(i==n_samples_per_chunk-1){ - last_chunk = INT_MAX; - }else{ - last_chunk = QTDEMUX_GUINT32_GET(stsc->data +16 + i*12 + 12) - 1; + + first_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 0) - 1; + if (i == n_samples_per_chunk - 1) { + last_chunk = INT_MAX; + } else { + last_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 12) - 1; } - samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data + 16 + i*12 + 4); - - for(j=first_chunk;jdata + 16 + j*4); - }else{ - chunk_offset = QTDEMUX_GUINT64_GET(co64->data + 16 + j*8); - } - for(k=0;kdata + 16 + i * 12 + 4); + + for (j = first_chunk; j < last_chunk; j++) { + int chunk_offset; + + if (stco) { + chunk_offset = QTDEMUX_GUINT32_GET (stco->data + 16 + j * 4); + } else { + chunk_offset = QTDEMUX_GUINT64_GET (co64->data + 16 + j * 8); + } + for (k = 0; k < samples_per_chunk; k++) { samples[index].chunk = j; samples[index].offset = chunk_offset; chunk_offset += samples[index].size; index++; - if(index>=n_samples)goto done; - } + if (index >= n_samples) + goto done; + } } } -done: - - n_sample_times = QTDEMUX_GUINT32_GET(stts->data + 12); + done: + + n_sample_times = QTDEMUX_GUINT32_GET (stts->data + 12); timestamp = 0; index = 0; - for(i=0;idata + 16 + 8*i); - duration = QTDEMUX_GUINT32_GET(stts->data + 16 + 8*i + 4); - time = (GST_SECOND * duration)/stream->timescale; - for(j=0;jdata + 16 + 8 * i); + duration = QTDEMUX_GUINT32_GET (stts->data + 16 + 8 * i + 4); + time = (GST_SECOND * duration) / stream->timescale; + for (j = 0; j < n; j++) { + //GST_INFO("moo %lld", timestamp); + samples[index].timestamp = timestamp; + samples[index].duration = time; + timestamp += time; + index++; } } - }else{ + } else { int sample_width; guint64 timestamp = 0; - GST_LOG("treating chunks as samples\n"); + GST_LOG ("treating chunks as samples\n"); /* treat chunks as samples */ - if(stco){ - n_samples = QTDEMUX_GUINT32_GET(stco->data+12); - }else{ - n_samples = QTDEMUX_GUINT32_GET(co64->data+12); + if (stco) { + n_samples = QTDEMUX_GUINT32_GET (stco->data + 12); + } else { + n_samples = QTDEMUX_GUINT32_GET (co64->data + 12); } stream->n_samples = n_samples; - samples = g_malloc(sizeof(QtDemuxSample)*n_samples); + samples = g_malloc (sizeof (QtDemuxSample) * n_samples); stream->samples = samples; - sample_width = QTDEMUX_GUINT16_GET(stsd->data+offset + 10) / 8; + sample_width = QTDEMUX_GUINT16_GET (stsd->data + offset + 10) / 8; - n_samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data+12); + n_samples_per_chunk = QTDEMUX_GUINT32_GET (stsc->data + 12); offset = 16; sample_index = 0; - for(i=0;idata + 16 + i*12 + 0) - 1; - if(i==n_samples-1){ - last_chunk = INT_MAX; - }else{ - last_chunk = QTDEMUX_GUINT32_GET(stsc->data +16 + i*12 + 12) - 1; + + first_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 0) - 1; + if (i == n_samples - 1) { + last_chunk = INT_MAX; + } else { + last_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 12) - 1; } - samples_per_chunk = QTDEMUX_GUINT32_GET(stsc->data + 16 + i*12 + 4); - - for(j=first_chunk;j=n_samples)goto done2; - if(stco){ - chunk_offset = QTDEMUX_GUINT32_GET(stco->data + 16 + j*4); - }else{ - chunk_offset = QTDEMUX_GUINT64_GET(co64->data + 16 + j*8); - } + samples_per_chunk = QTDEMUX_GUINT32_GET (stsc->data + 16 + i * 12 + 4); + + for (j = first_chunk; j < last_chunk; j++) { + int chunk_offset; + + if (j >= n_samples) + goto done2; + if (stco) { + chunk_offset = QTDEMUX_GUINT32_GET (stco->data + 16 + j * 4); + } else { + chunk_offset = QTDEMUX_GUINT64_GET (co64->data + 16 + j * 8); + } samples[j].chunk = j; samples[j].offset = chunk_offset; - samples[j].size = samples_per_chunk * stream->bytes_per_frame / stream->samples_per_packet; - samples[j].duration = samples_per_chunk * GST_SECOND / (stream->rate/2); + samples[j].size = + samples_per_chunk * stream->bytes_per_frame / + stream->samples_per_packet; + samples[j].duration = + samples_per_chunk * GST_SECOND / (stream->rate / 2); samples[j].timestamp = timestamp; timestamp += (samples_per_chunk * GST_SECOND) / stream->rate; #if 0 - GST_INFO("moo samples_per_chunk=%d rate=%d dur=%lld %lld", - (int)samples_per_chunk, - (int)stream->rate, - (long long)((samples_per_chunk * GST_SECOND) / stream->rate), - (long long)timestamp); + GST_INFO ("moo samples_per_chunk=%d rate=%d dur=%lld %lld", + (int) samples_per_chunk, + (int) stream->rate, + (long long) ((samples_per_chunk * GST_SECOND) / stream->rate), + (long long) timestamp); #endif samples[j].sample_index = sample_index; sample_index += samples_per_chunk; @@ -1653,183 +1807,175 @@ done2: } done2: #if 0 - for(i=0;i10)break; + if (i > 10) + break; } #endif - gst_qtdemux_add_stream(qtdemux,stream); + gst_qtdemux_add_stream (qtdemux, stream); } -static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *stsd_data) +static GstCaps * +qtdemux_video_caps (GstQTDemux * qtdemux, guint32 fourcc, + const guint8 * stsd_data) { - switch(fourcc){ - case GST_MAKE_FOURCC('j','p','e','g'): + switch (fourcc) { + case GST_MAKE_FOURCC ('j', 'p', 'e', 'g'): /* JPEG */ return gst_caps_from_string ("image/jpeg"); - case GST_MAKE_FOURCC('m','j','p','a'): + case GST_MAKE_FOURCC ('m', 'j', 'p', 'a'): /* Motion-JPEG (format A) */ return gst_caps_from_string ("image/jpeg"); - case GST_MAKE_FOURCC('m','j','p','b'): + case GST_MAKE_FOURCC ('m', 'j', 'p', 'b'): /* Motion-JPEG (format B) */ return gst_caps_from_string ("image/jpeg"); - case GST_MAKE_FOURCC('S','V','Q','3'): + case GST_MAKE_FOURCC ('S', 'V', 'Q', '3'): if (stsd_data != NULL) { - gst_getbits_t gb; + gst_getbits_t gb; gint halfpel_flag; gint thirdpel_flag; gint unknown_svq3_flag; gint low_delay; gint size; - size = QTDEMUX_GUINT32_GET(stsd_data + 16); + size = QTDEMUX_GUINT32_GET (stsd_data + 16); + + gst_getbits_init (&gb, NULL, NULL); + gst_getbits_newbuf (&gb, (unsigned char *) stsd_data + 98 + 16 + 4, + (size - 102 + 16)); + + /* Infos ripped from ffmpeg see libavcodec/svq3.c */ - gst_getbits_init (&gb, NULL, NULL); - gst_getbits_newbuf (&gb, (unsigned char *)stsd_data + 98 + 16 + 4 , (size - 102 + 16)); - - /* Infos ripped from ffmpeg see libavcodec/svq3.c */ - /* 'frame size code' and optional 'width, height' */ - if (gst_getbitsn (&gb, 3) == 7) { - gst_getbitsn (&gb, 12); - gst_getbitsn (&gb, 12); + if (gst_getbitsn (&gb, 3) == 7) { + gst_getbitsn (&gb, 12); + gst_getbitsn (&gb, 12); } halfpel_flag = gst_get1bit (&gb); - thirdpel_flag = gst_get1bit (&gb); + thirdpel_flag = gst_get1bit (&gb); - /* unknown fields */ - gst_get1bit (&gb); - gst_get1bit (&gb); - gst_get1bit (&gb); - gst_get1bit (&gb); + /* unknown fields */ + gst_get1bit (&gb); + gst_get1bit (&gb); + gst_get1bit (&gb); + gst_get1bit (&gb); - low_delay = gst_get1bit (&gb); + low_delay = gst_get1bit (&gb); - /* unknown field */ - gst_get1bit (&gb); + /* unknown field */ + gst_get1bit (&gb); while (gst_get1bit (&gb)) { - gst_getbitsn (&gb, 8); - } - - unknown_svq3_flag = gst_get1bit (&gb); - - return gst_caps_new_simple ("video/x-svq", - "svqversion", G_TYPE_INT, 3, - "halfpel_flag", G_TYPE_INT, halfpel_flag, - "thirdpel_flag", G_TYPE_INT, thirdpel_flag, - "low_delay", G_TYPE_INT, low_delay, - "unknown_svq3_flag", G_TYPE_INT, unknown_svq3_flag, - NULL); + gst_getbitsn (&gb, 8); + } + + unknown_svq3_flag = gst_get1bit (&gb); + + return gst_caps_new_simple ("video/x-svq", + "svqversion", G_TYPE_INT, 3, + "halfpel_flag", G_TYPE_INT, halfpel_flag, + "thirdpel_flag", G_TYPE_INT, thirdpel_flag, + "low_delay", G_TYPE_INT, low_delay, + "unknown_svq3_flag", G_TYPE_INT, unknown_svq3_flag, NULL); } - return gst_caps_from_string ("video/x-svq, " - "svqversion = (int) 3"); - case GST_MAKE_FOURCC('s','v','q','i'): - case GST_MAKE_FOURCC('S','V','Q','1'): - return gst_caps_from_string ("video/x-svq, " - "svqversion = (int) 1"); - case GST_MAKE_FOURCC('r','a','w',' '): + return gst_caps_from_string ("video/x-svq, " "svqversion = (int) 3"); + case GST_MAKE_FOURCC ('s', 'v', 'q', 'i'): + case GST_MAKE_FOURCC ('S', 'V', 'Q', '1'): + return gst_caps_from_string ("video/x-svq, " "svqversion = (int) 1"); + case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): /* uncompressed RGB */ return gst_caps_from_string ("video/x-raw-rgb, " "endianness = (int) BIG_ENDIAN"); - /*"bpp", GST_PROPS_INT(x), - "depth", GST_PROPS_INT(x), - "red_mask", GST_PROPS_INT(x), - "green_mask", GST_PROPS_INT(x), - "blue_mask", GST_PROPS_INT(x), FIXME! */ - case GST_MAKE_FOURCC('Y','u','v','2'): + /*"bpp", GST_PROPS_INT(x), + "depth", GST_PROPS_INT(x), + "red_mask", GST_PROPS_INT(x), + "green_mask", GST_PROPS_INT(x), + "blue_mask", GST_PROPS_INT(x), FIXME! */ + case GST_MAKE_FOURCC ('Y', 'u', 'v', '2'): /* uncompressed YUV2 */ return gst_caps_from_string ("video/x-raw-yuv, " "format = (fourcc) YUY2"); - case GST_MAKE_FOURCC('m','p','e','g'): + case GST_MAKE_FOURCC ('m', 'p', 'e', 'g'): /* MPEG */ return gst_caps_from_string ("video/mpeg, " - "systemstream = (boolean) false, " - "mpegversion = (int) 1"); - case GST_MAKE_FOURCC('g','i','f',' '): + "systemstream = (boolean) false, " "mpegversion = (int) 1"); + case GST_MAKE_FOURCC ('g', 'i', 'f', ' '): return gst_caps_from_string ("image/gif"); - case GST_MAKE_FOURCC('h','2','6','3'): + case GST_MAKE_FOURCC ('h', '2', '6', '3'): /* H.263 */ /* ffmpeg uses the height/width props, don't know why */ return gst_caps_from_string ("video/x-h263"); - case GST_MAKE_FOURCC('m','p','4','v'): + case GST_MAKE_FOURCC ('m', 'p', '4', 'v'): /* MPEG-4 */ return gst_caps_from_string ("video/mpeg, " - "mpegversion = (int) 4, " - "systemstream = (boolean) false"); - case GST_MAKE_FOURCC('3','I','V','1'): + "mpegversion = (int) 4, " "systemstream = (boolean) false"); + case GST_MAKE_FOURCC ('3', 'I', 'V', '1'): return gst_caps_from_string ("video/x-3ivx"); - case GST_MAKE_FOURCC('c','v','i','d'): + case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'): /* Cinepak */ return gst_caps_from_string ("video/x-cinepak"); - case GST_MAKE_FOURCC('r','p','z','a'): - case GST_MAKE_FOURCC('r','l','e',' '): + case GST_MAKE_FOURCC ('r', 'p', 'z', 'a'): + case GST_MAKE_FOURCC ('r', 'l', 'e', ' '): /* Run-length encoding */ - case GST_MAKE_FOURCC('s','m','c',' '): - case GST_MAKE_FOURCC('k','p','c','d'): + case GST_MAKE_FOURCC ('s', 'm', 'c', ' '): + case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'): default: g_critical ("Don't know how to convert fourcc '" GST_FOURCC_FORMAT - "' to caps\n", GST_FOURCC_ARGS(fourcc)); + "' to caps\n", GST_FOURCC_ARGS (fourcc)); return NULL; } } -static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *data) +static GstCaps * +qtdemux_audio_caps (GstQTDemux * qtdemux, guint32 fourcc, const guint8 * data) { - switch(fourcc){ - case GST_MAKE_FOURCC('N','O','N','E'): - return NULL; /*gst_caps_from_string ("audio/raw");*/ - case GST_MAKE_FOURCC('r','a','w',' '): + switch (fourcc) { + case GST_MAKE_FOURCC ('N', 'O', 'N', 'E'): + return NULL; /*gst_caps_from_string ("audio/raw"); */ + case GST_MAKE_FOURCC ('r', 'a', 'w', ' '): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " - "width = (int) 8, " - "depth = (int) 8, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('t','w','o','s'): + "width = (int) 8, " "depth = (int) 8, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('t', 'w', 'o', 's'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 16, " "depth = (int) 16, " - "endianness = (int) G_BIG_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('s','o','w','t'): + "endianness = (int) G_BIG_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('s', 'o', 'w', 't'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 16, " "depth = (int) 16, " - "endianness = (int) G_LITTLE_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('f','l','6','4'): + "endianness = (int) G_LITTLE_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('f', 'l', '6', '4'): return gst_caps_from_string ("audio/x-raw-float, " - "width = (int) 64, " - "endianness = (int) G_BIG_ENDIAN"); - case GST_MAKE_FOURCC('f','l','3','2'): + "width = (int) 64, " "endianness = (int) G_BIG_ENDIAN"); + case GST_MAKE_FOURCC ('f', 'l', '3', '2'): return gst_caps_from_string ("audio/x-raw-float, " - "width = (int) 32, " - "endianness = (int) G_BIG_ENDIAN"); - case GST_MAKE_FOURCC('i','n','2','4'): + "width = (int) 32, " "endianness = (int) G_BIG_ENDIAN"); + case GST_MAKE_FOURCC ('i', 'n', '2', '4'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 24, " "depth = (int) 32, " - "endianness = (int) G_BIG_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('i','n','3','2'): + "endianness = (int) G_BIG_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('i', 'n', '3', '2'): /* FIXME */ return gst_caps_from_string ("audio/x-raw-int, " "width = (int) 32, " "depth = (int) 32, " - "endianness = (int) G_BIG_ENDIAN, " - "signed = (boolean) true"); - case GST_MAKE_FOURCC('u','l','a','w'): + "endianness = (int) G_BIG_ENDIAN, " "signed = (boolean) true"); + case GST_MAKE_FOURCC ('u', 'l', 'a', 'w'): /* FIXME */ return gst_caps_from_string ("audio/x-mulaw"); - case GST_MAKE_FOURCC('a','l','a','w'): + case GST_MAKE_FOURCC ('a', 'l', 'a', 'w'): /* FIXME */ return gst_caps_from_string ("audio/x-alaw"); case 0x6d730002: @@ -1843,53 +1989,47 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const gu case 0x6d730055: /* MPEG layer 3, CBR only (pre QT4.1) */ case 0x5500736d: - case GST_MAKE_FOURCC('.','m','p','3'): + case GST_MAKE_FOURCC ('.', 'm', 'p', '3'): /* MPEG layer 3, CBR & VBR (QT4.1 and later) */ return gst_caps_from_string ("audio/mpeg, " - "layer = (int) 3, " - "mpegversion = (int) 1"); - case GST_MAKE_FOURCC('M','A','C','3'): + "layer = (int) 3, " "mpegversion = (int) 1"); + case GST_MAKE_FOURCC ('M', 'A', 'C', '3'): /* MACE 3:1 */ - return gst_caps_from_string ("audio/x-mace, " - "maceversion = (int) 3"); - case GST_MAKE_FOURCC('M','A','C','6'): + return gst_caps_from_string ("audio/x-mace, " "maceversion = (int) 3"); + case GST_MAKE_FOURCC ('M', 'A', 'C', '6'): /* MACE 6:1 */ - return gst_caps_from_string ("audio/x-mace, " - "maceversion = (int) 6"); - case GST_MAKE_FOURCC('O','g','g','V'): + return gst_caps_from_string ("audio/x-mace, " "maceversion = (int) 6"); + case GST_MAKE_FOURCC ('O', 'g', 'g', 'V'): /* Ogg Vorbis */ return gst_caps_from_string ("application/ogg"); - case GST_MAKE_FOURCC('d','v','c','a'): + case GST_MAKE_FOURCC ('d', 'v', 'c', 'a'): /* DV audio */ return gst_caps_from_string ("audio/x-dv"); - case GST_MAKE_FOURCC('m','p','4','a'): + case GST_MAKE_FOURCC ('m', 'p', '4', 'a'): /* MPEG-4 AAC */ - return gst_caps_from_string ("audio/mpeg, " - "mpegversion = (int) 4"); - case GST_MAKE_FOURCC('Q','D','M','2'): + return gst_caps_from_string ("audio/mpeg, " "mpegversion = (int) 4"); + case GST_MAKE_FOURCC ('Q', 'D', 'M', '2'): /* FIXME: QDesign music version 2 (no constant) */ if (QTDEMUX_GUINT32_GET (data) <= 100) { - gst_util_dump_mem ((guint8*)data, 100); + gst_util_dump_mem ((guint8 *) data, 100); return gst_caps_new_simple ("audio/x-qdm2", - "framesize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 52), - "bitrate", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 40), - "blocksize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 44), - NULL); + "framesize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 52), + "bitrate", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 40), + "blocksize", G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 44), NULL); } - case GST_MAKE_FOURCC('q','t','v','r'): + case GST_MAKE_FOURCC ('q', 't', 'v', 'r'): /* ? */ - case GST_MAKE_FOURCC('Q','D','M','C'): + case GST_MAKE_FOURCC ('Q', 'D', 'M', 'C'): /* QDesign music */ - case GST_MAKE_FOURCC('i','m','a','4'): + case GST_MAKE_FOURCC ('i', 'm', 'a', '4'): /* IMA 4:1 */ - case GST_MAKE_FOURCC('Q','c','l','p'): + case GST_MAKE_FOURCC ('Q', 'c', 'l', 'p'): /* QUALCOMM PureVoice */ - case GST_MAKE_FOURCC('a','g','s','m'): + case GST_MAKE_FOURCC ('a', 'g', 's', 'm'): /* ? */ default: g_critical ("Don't know how to convert fourcc '" GST_FOURCC_FORMAT - "' to caps\n", GST_FOURCC_ARGS(fourcc)); + "' to caps\n", GST_FOURCC_ARGS (fourcc)); return NULL; } } - diff --git a/gst/qtdemux/qtdemux.h b/gst/qtdemux/qtdemux.h index 249ef216..ed0f3154 100644 --- a/gst/qtdemux/qtdemux.h +++ b/gst/qtdemux/qtdemux.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_QTDEMUX \ @@ -43,43 +44,45 @@ extern "C" { #define GST_QTDEMUX_MAX_STREAMS 8 -typedef struct _GstQTDemux GstQTDemux; -typedef struct _GstQTDemuxClass GstQTDemuxClass; -typedef struct _QtDemuxStream QtDemuxStream; + typedef struct _GstQTDemux GstQTDemux; + typedef struct _GstQTDemuxClass GstQTDemuxClass; + typedef struct _QtDemuxStream QtDemuxStream; -struct _GstQTDemux { - GstElement element; + struct _GstQTDemux + { + GstElement element; - /* pads */ - GstPad *sinkpad; + /* pads */ + GstPad *sinkpad; - QtDemuxStream *streams[GST_QTDEMUX_MAX_STREAMS]; - int n_streams; - int n_video_streams; - int n_audio_streams; + QtDemuxStream *streams[GST_QTDEMUX_MAX_STREAMS]; + int n_streams; + int n_video_streams; + int n_audio_streams; - GstByteStream *bs; + GstByteStream *bs; - GNode *moov_node; - GNode *moov_node_compressed; + GNode *moov_node; + GNode *moov_node_compressed; - guint32 timescale; - guint32 duration; + guint32 timescale; + guint32 duration; - int state; + int state; - int offset; + int offset; - /* track stuff */ + /* track stuff */ -}; + }; -struct _GstQTDemuxClass { - GstElementClass parent_class; -}; + struct _GstQTDemuxClass + { + GstElementClass parent_class; + }; #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_QTDEMUX_H__ */ +#endif /* __GST_QTDEMUX_H__ */ diff --git a/gst/rtjpeg/RTjpeg.c b/gst/rtjpeg/RTjpeg.c index ab87fcc7..d2e7b67d 100644 --- a/gst/rtjpeg/RTjpeg.c +++ b/gst/rtjpeg/RTjpeg.c @@ -52,38 +52,47 @@ typedef unsigned long long __u64; #include "mmx.h" #endif -static const unsigned char RTjpeg_ZZ[64]={ -0, -8, 1, -2, 9, 16, -24, 17, 10, 3, -4, 11, 18, 25, 32, -40, 33, 26, 19, 12, 5, -6, 13, 20, 27, 34, 41, 48, -56, 49, 42, 35, 28, 21, 14, 7, -15, 22, 29, 36, 43, 50, 57, -58, 51, 44, 37, 30, 23, -31, 38, 45, 52, 59, -60, 53, 46, 39, -47, 54, 61, -62, 55, -63 }; - -static const __u64 RTjpeg_aan_tab[64]={ -4294967296ULL, 5957222912ULL, 5611718144ULL, 5050464768ULL, 4294967296ULL, 3374581504ULL, 2324432128ULL, 1184891264ULL, -5957222912ULL, 8263040512ULL, 7783580160ULL, 7005009920ULL, 5957222912ULL, 4680582144ULL, 3224107520ULL, 1643641088ULL, -5611718144ULL, 7783580160ULL, 7331904512ULL, 6598688768ULL, 5611718144ULL, 4408998912ULL, 3036936960ULL, 1548224000ULL, -5050464768ULL, 7005009920ULL, 6598688768ULL, 5938608128ULL, 5050464768ULL, 3968072960ULL, 2733115392ULL, 1393296000ULL, -4294967296ULL, 5957222912ULL, 5611718144ULL, 5050464768ULL, 4294967296ULL, 3374581504ULL, 2324432128ULL, 1184891264ULL, -3374581504ULL, 4680582144ULL, 4408998912ULL, 3968072960ULL, 3374581504ULL, 2651326208ULL, 1826357504ULL, 931136000ULL, -2324432128ULL, 3224107520ULL, 3036936960ULL, 2733115392ULL, 2324432128ULL, 1826357504ULL, 1258030336ULL, 641204288ULL, -1184891264ULL, 1643641088ULL, 1548224000ULL, 1393296000ULL, 1184891264ULL, 931136000ULL, 641204288ULL, 326894240ULL, +static const unsigned char RTjpeg_ZZ[64] = { + 0, + 8, 1, + 2, 9, 16, + 24, 17, 10, 3, + 4, 11, 18, 25, 32, + 40, 33, 26, 19, 12, 5, + 6, 13, 20, 27, 34, 41, 48, + 56, 49, 42, 35, 28, 21, 14, 7, + 15, 22, 29, 36, 43, 50, 57, + 58, 51, 44, 37, 30, 23, + 31, 38, 45, 52, 59, + 60, 53, 46, 39, + 47, 54, 61, + 62, 55, + 63 +}; + +static const __u64 RTjpeg_aan_tab[64] = { + 4294967296ULL, 5957222912ULL, 5611718144ULL, 5050464768ULL, 4294967296ULL, + 3374581504ULL, 2324432128ULL, 1184891264ULL, + 5957222912ULL, 8263040512ULL, 7783580160ULL, 7005009920ULL, 5957222912ULL, + 4680582144ULL, 3224107520ULL, 1643641088ULL, + 5611718144ULL, 7783580160ULL, 7331904512ULL, 6598688768ULL, 5611718144ULL, + 4408998912ULL, 3036936960ULL, 1548224000ULL, + 5050464768ULL, 7005009920ULL, 6598688768ULL, 5938608128ULL, 5050464768ULL, + 3968072960ULL, 2733115392ULL, 1393296000ULL, + 4294967296ULL, 5957222912ULL, 5611718144ULL, 5050464768ULL, 4294967296ULL, + 3374581504ULL, 2324432128ULL, 1184891264ULL, + 3374581504ULL, 4680582144ULL, 4408998912ULL, 3968072960ULL, 3374581504ULL, + 2651326208ULL, 1826357504ULL, 931136000ULL, + 2324432128ULL, 3224107520ULL, 3036936960ULL, 2733115392ULL, 2324432128ULL, + 1826357504ULL, 1258030336ULL, 641204288ULL, + 1184891264ULL, 1643641088ULL, 1548224000ULL, 1393296000ULL, 1184891264ULL, + 931136000ULL, 641204288ULL, 326894240ULL, }; #ifndef HAVE_LIBMMX -static __s32 RTjpeg_ws[64+31]; +static __s32 RTjpeg_ws[64 + 31]; #endif -__u8 RTjpeg_alldata[2*64+4*64+4*64+4*64+4*64+32]; +__u8 RTjpeg_alldata[2 * 64 + 4 * 64 + 4 * 64 + 4 * 64 + 4 * 64 + 32]; __s16 *RTjpeg_block; __s32 *RTjpeg_lqt; @@ -97,7 +106,7 @@ int RTjpeg_width, RTjpeg_height; int RTjpeg_Ywidth, RTjpeg_Cwidth; int RTjpeg_Ysize, RTjpeg_Csize; -__s16 *RTjpeg_old=NULL; +__s16 *RTjpeg_old = NULL; #ifdef HAVE_LIBMMX mmx_t RTjpeg_lmask; @@ -106,173 +115,169 @@ mmx_t RTjpeg_cmask; __u16 RTjpeg_lmask; __u16 RTjpeg_cmask; #endif -int RTjpeg_mtest=0; +int RTjpeg_mtest = 0; static const unsigned char RTjpeg_lum_quant_tbl[64] = { - 16, 11, 10, 16, 24, 40, 51, 61, - 12, 12, 14, 19, 26, 58, 60, 55, - 14, 13, 16, 24, 40, 57, 69, 56, - 14, 17, 22, 29, 51, 87, 80, 62, - 18, 22, 37, 56, 68, 109, 103, 77, - 24, 35, 55, 64, 81, 104, 113, 92, - 49, 64, 78, 87, 103, 121, 120, 101, - 72, 92, 95, 98, 112, 100, 103, 99 - }; + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 +}; static const unsigned char RTjpeg_chrom_quant_tbl[64] = { - 17, 18, 24, 47, 99, 99, 99, 99, - 18, 21, 26, 66, 99, 99, 99, 99, - 24, 26, 56, 99, 99, 99, 99, 99, - 47, 66, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99 - }; - -int RTjpeg_b2s(__s16 *data, __s8 *strm, __u8 bt8) + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + +int +RTjpeg_b2s (__s16 * data, __s8 * strm, __u8 bt8) { - register int ci, co=1, tmp; - register __s16 ZZvalue; - - strm[0]=(__u8)(data[RTjpeg_ZZ[0]]>254) ? 254:((data[RTjpeg_ZZ[0]]<0)?0:data[RTjpeg_ZZ[0]]); - - for(ci=1; ci<=bt8; ci++) - { - ZZvalue = data[RTjpeg_ZZ[ci]]; - - if(ZZvalue>0) - { - strm[co++]=(__s8)(ZZvalue>127)?127:ZZvalue; - } - else - { - strm[co++]=(__s8)(ZZvalue<-128)?-128:ZZvalue; - } - } - - for(; ci<64; ci++) - { - ZZvalue = data[RTjpeg_ZZ[ci]]; - - if(ZZvalue>0) - { - strm[co++]=(__s8)(ZZvalue>63)?63:ZZvalue; - } - else if(ZZvalue<0) - { - strm[co++]=(__s8)(ZZvalue<-64)?-64:ZZvalue; - } - else /* compress zeros */ - { - tmp=ci; - do - { - ci++; - } - while((ci<64)&&(data[RTjpeg_ZZ[ci]]==0)); + register int ci, co = 1, tmp; + register __s16 ZZvalue; + + strm[0] = + (__u8) (data[RTjpeg_ZZ[0]] > 254) ? 254 : ((data[RTjpeg_ZZ[0]] < + 0) ? 0 : data[RTjpeg_ZZ[0]]); + + for (ci = 1; ci <= bt8; ci++) { + ZZvalue = data[RTjpeg_ZZ[ci]]; + + if (ZZvalue > 0) { + strm[co++] = (__s8) (ZZvalue > 127) ? 127 : ZZvalue; + } else { + strm[co++] = (__s8) (ZZvalue < -128) ? -128 : ZZvalue; + } + } + + for (; ci < 64; ci++) { + ZZvalue = data[RTjpeg_ZZ[ci]]; + + if (ZZvalue > 0) { + strm[co++] = (__s8) (ZZvalue > 63) ? 63 : ZZvalue; + } else if (ZZvalue < 0) { + strm[co++] = (__s8) (ZZvalue < -64) ? -64 : ZZvalue; + } else { /* compress zeros */ - strm[co++]=(__s8)(63+(ci-tmp)); - ci--; + tmp = ci; + do { + ci++; + } + while ((ci < 64) && (data[RTjpeg_ZZ[ci]] == 0)); + + strm[co++] = (__s8) (63 + (ci - tmp)); + ci--; + } } - } - return (int)co; + return (int) co; } -int RTjpeg_s2b(__s16 *data, __s8 *strm, __u8 bt8, __u32 *qtbl) +int +RTjpeg_s2b (__s16 * data, __s8 * strm, __u8 bt8, __u32 * qtbl) { - int ci=1, co=1, tmp; - register int i; - - i=RTjpeg_ZZ[0]; - data[i]=((__u8)strm[0])*qtbl[i]; - - for(co=1; co<=bt8; co++) - { - i=RTjpeg_ZZ[co]; - data[i]=strm[ci++]*qtbl[i]; - } - - for(; co<64; co++) - { - if(strm[ci]>63) - { - tmp=co+strm[ci]-63; - for(; co 63) { + tmp = co + strm[ci] - 63; + for (; co < tmp; co++) + data[RTjpeg_ZZ[co]] = 0; + co--; + } else { + i = RTjpeg_ZZ[co]; + data[i] = strm[ci] * qtbl[i]; + } + ci++; } - ci++; - } - return (int)ci; + return (int) ci; } #if defined(HAVE_LIBMMX) -void RTjpeg_quant_init(void) +void +RTjpeg_quant_init (void) { - int i; - __s16 *qtbl; - - qtbl=(__s16 *)RTjpeg_lqt; - for(i=0; i<64; i++)qtbl[i]=(__s16)RTjpeg_lqt[i]; - - qtbl=(__s16 *)RTjpeg_cqt; - for(i=0; i<64; i++)qtbl[i]=(__s16)RTjpeg_cqt[i]; + int i; + __s16 *qtbl; + + qtbl = (__s16 *) RTjpeg_lqt; + for (i = 0; i < 64; i++) + qtbl[i] = (__s16) RTjpeg_lqt[i]; + + qtbl = (__s16 *) RTjpeg_cqt; + for (i = 0; i < 64; i++) + qtbl[i] = (__s16) RTjpeg_cqt[i]; } -static mmx_t RTjpeg_ones=(mmx_t)(long long)0x0001000100010001LL; -static mmx_t RTjpeg_half=(mmx_t)(long long)0x7fff7fff7fff7fffLL; +static mmx_t RTjpeg_ones = (mmx_t) (long long) 0x0001000100010001LL; +static mmx_t RTjpeg_half = (mmx_t) (long long) 0x7fff7fff7fff7fffLL; -void RTjpeg_quant(__s16 *block, __s32 *qtbl) +void +RTjpeg_quant (__s16 * block, __s32 * qtbl) { - int i; - mmx_t *bl, *ql; - - ql=(mmx_t *)qtbl; - bl=(mmx_t *)block; - - movq_m2r(RTjpeg_ones, mm6); - movq_m2r(RTjpeg_half, mm7); - - for(i=16; i; i--) - { - movq_m2r(*(ql++), mm0); /* quant vals (4) */ - movq_m2r(*bl, mm2); /* block vals (4) */ - movq_r2r(mm0, mm1); - movq_r2r(mm2, mm3); - - punpcklwd_r2r(mm6, mm0); /* 1 qb 1 qa */ - punpckhwd_r2r(mm6, mm1); /* 1 qd 1 qc */ - - punpcklwd_r2r(mm7, mm2); /* 32767 bb 32767 ba */ - punpckhwd_r2r(mm7, mm3); /* 32767 bd 32767 bc */ - - pmaddwd_r2r(mm2, mm0); /* 32767+bb*qb 32767+ba*qa */ - pmaddwd_r2r(mm3, mm1); /* 32767+bd*qd 32767+bc*qc */ - - psrad_i2r(16, mm0); - psrad_i2r(16, mm1); - - packssdw_r2r(mm1, mm0); - - movq_r2m(mm0, *(bl++)); - - } + int i; + mmx_t *bl, *ql; + + ql = (mmx_t *) qtbl; + bl = (mmx_t *) block; + + movq_m2r (RTjpeg_ones, mm6); + movq_m2r (RTjpeg_half, mm7); + + for (i = 16; i; i--) { + movq_m2r (*(ql++), mm0); /* quant vals (4) */ + movq_m2r (*bl, mm2); /* block vals (4) */ + movq_r2r (mm0, mm1); + movq_r2r (mm2, mm3); + + punpcklwd_r2r (mm6, mm0); /* 1 qb 1 qa */ + punpckhwd_r2r (mm6, mm1); /* 1 qd 1 qc */ + + punpcklwd_r2r (mm7, mm2); /* 32767 bb 32767 ba */ + punpckhwd_r2r (mm7, mm3); /* 32767 bd 32767 bc */ + + pmaddwd_r2r (mm2, mm0); /* 32767+bb*qb 32767+ba*qa */ + pmaddwd_r2r (mm3, mm1); /* 32767+bd*qd 32767+bc*qc */ + + psrad_i2r (16, mm0); + psrad_i2r (16, mm1); + + packssdw_r2r (mm1, mm0); + + movq_r2m (mm0, *(bl++)); + + } } #else -void RTjpeg_quant_init(void) +void +RTjpeg_quant_init (void) { } -void RTjpeg_quant(__s16 *block, __s32 *qtbl) +void +RTjpeg_quant (__s16 * block, __s32 * qtbl) { - int i; - - for(i=0; i<64; i++) - block[i]=(__s16)((block[i]*qtbl[i]+32767)>>16); + int i; + + for (i = 0; i < 64; i++) + block[i] = (__s16) ((block[i] * qtbl[i] + 32767) >> 16); } #endif @@ -280,36 +285,37 @@ void RTjpeg_quant(__s16 *block, __s32 *qtbl) * Perform the forward DCT on one block of samples. */ #ifdef HAVE_LIBMMX -static mmx_t RTjpeg_C4 =(mmx_t)(long long)0x2D412D412D412D41LL; -static mmx_t RTjpeg_C6 =(mmx_t)(long long)0x187E187E187E187ELL; -static mmx_t RTjpeg_C2mC6=(mmx_t)(long long)0x22A322A322A322A3LL; -static mmx_t RTjpeg_C2pC6=(mmx_t)(long long)0x539F539F539F539FLL; -static mmx_t RTjpeg_zero =(mmx_t)(long long)0x0000000000000000LL; +static mmx_t RTjpeg_C4 = (mmx_t) (long long) 0x2D412D412D412D41LL; +static mmx_t RTjpeg_C6 = (mmx_t) (long long) 0x187E187E187E187ELL; +static mmx_t RTjpeg_C2mC6 = (mmx_t) (long long) 0x22A322A322A322A3LL; +static mmx_t RTjpeg_C2pC6 = (mmx_t) (long long) 0x539F539F539F539FLL; +static mmx_t RTjpeg_zero = (mmx_t) (long long) 0x0000000000000000LL; #else -#define FIX_0_382683433 ((__s32) 98) /* FIX(0.382683433) */ -#define FIX_0_541196100 ((__s32) 139) /* FIX(0.541196100) */ -#define FIX_0_707106781 ((__s32) 181) /* FIX(0.707106781) */ -#define FIX_1_306562965 ((__s32) 334) /* FIX(1.306562965) */ +#define FIX_0_382683433 ((__s32) 98) /* FIX(0.382683433) */ +#define FIX_0_541196100 ((__s32) 139) /* FIX(0.541196100) */ +#define FIX_0_707106781 ((__s32) 181) /* FIX(0.707106781) */ +#define FIX_1_306562965 ((__s32) 334) /* FIX(1.306562965) */ #define DESCALE10(x) (__s16)( ((x)+128) >> 8) #define DESCALE20(x) (__s16)(((x)+32768) >> 16) #define D_MULTIPLY(var,const) ((__s32) ((var) * (const))) #endif -void RTjpeg_dct_init(void) +void +RTjpeg_dct_init (void) { - int i; - - for(i=0; i<64; i++) - { - RTjpeg_lqt[i]=(((__u64)RTjpeg_lqt[i]<<32)/RTjpeg_aan_tab[i]); - RTjpeg_cqt[i]=(((__u64)RTjpeg_cqt[i]<<32)/RTjpeg_aan_tab[i]); - } + int i; + + for (i = 0; i < 64; i++) { + RTjpeg_lqt[i] = (((__u64) RTjpeg_lqt[i] << 32) / RTjpeg_aan_tab[i]); + RTjpeg_cqt[i] = (((__u64) RTjpeg_cqt[i] << 32) / RTjpeg_aan_tab[i]); + } } -void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip) +void +RTjpeg_dctY (__u8 * idata, __s16 * odata, int rskip) { #ifndef HAVE_LIBMMX __s32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; @@ -331,42 +337,42 @@ void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip) tmp5 = idataptr[2] - idataptr[5]; tmp3 = idataptr[3] + idataptr[4]; tmp4 = idataptr[3] - idataptr[4]; - + tmp10 = (tmp0 + tmp3); /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = (tmp1 + tmp2); tmp12 = tmp1 - tmp2; - - wsptr[0] = (tmp10 + tmp11)<<8; /* phase 3 */ - wsptr[4] = (tmp10 - tmp11)<<8; - - z1 = D_MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ - wsptr[2] = (tmp13<<8) + z1; /* phase 5 */ - wsptr[6] = (tmp13<<8) - z1; - + + wsptr[0] = (tmp10 + tmp11) << 8; /* phase 3 */ + wsptr[4] = (tmp10 - tmp11) << 8; + + z1 = D_MULTIPLY (tmp12 + tmp13, FIX_0_707106781); /* c4 */ + wsptr[2] = (tmp13 << 8) + z1; /* phase 5 */ + wsptr[6] = (tmp13 << 8) - z1; + tmp10 = tmp4 + tmp5; /* phase 2 */ tmp11 = tmp5 + tmp6; tmp12 = tmp6 + tmp7; - z5 = D_MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ - z2 = D_MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ - z4 = D_MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ - z3 = D_MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + z5 = D_MULTIPLY (tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = D_MULTIPLY (tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = D_MULTIPLY (tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = D_MULTIPLY (tmp11, FIX_0_707106781); /* c4 */ - z11 = (tmp7<<8) + z3; /* phase 5 */ - z13 = (tmp7<<8) - z3; + z11 = (tmp7 << 8) + z3; /* phase 5 */ + z13 = (tmp7 << 8) - z3; wsptr[5] = z13 + z2; /* phase 6 */ wsptr[3] = z13 - z2; wsptr[1] = z11 + z4; wsptr[7] = z11 - z4; - idataptr += rskip<<3; /* advance pointer to next row */ + idataptr += rskip << 3; /* advance pointer to next row */ wsptr += 8; } wsptr = RTjpeg_ws; - odataptr=odata; + odataptr = odata; for (ctr = 7; ctr >= 0; ctr--) { tmp0 = wsptr[0] + wsptr[56]; tmp7 = wsptr[0] - wsptr[56]; @@ -376,848 +382,848 @@ void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip) tmp5 = wsptr[16] - wsptr[40]; tmp3 = wsptr[24] + wsptr[32]; tmp4 = wsptr[24] - wsptr[32]; - + tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; - - odataptr[0] = DESCALE10(tmp10 + tmp11); /* phase 3 */ - odataptr[32] = DESCALE10(tmp10 - tmp11); - - z1 = D_MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ - odataptr[16] = DESCALE20((tmp13<<8) + z1); /* phase 5 */ - odataptr[48] = DESCALE20((tmp13<<8) - z1); + + odataptr[0] = DESCALE10 (tmp10 + tmp11); /* phase 3 */ + odataptr[32] = DESCALE10 (tmp10 - tmp11); + + z1 = D_MULTIPLY (tmp12 + tmp13, FIX_0_707106781); /* c4 */ + odataptr[16] = DESCALE20 ((tmp13 << 8) + z1); /* phase 5 */ + odataptr[48] = DESCALE20 ((tmp13 << 8) - z1); tmp10 = tmp4 + tmp5; /* phase 2 */ tmp11 = tmp5 + tmp6; tmp12 = tmp6 + tmp7; - z5 = D_MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ - z2 = D_MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ - z4 = D_MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ - z3 = D_MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + z5 = D_MULTIPLY (tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = D_MULTIPLY (tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = D_MULTIPLY (tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = D_MULTIPLY (tmp11, FIX_0_707106781); /* c4 */ - z11 = (tmp7<<8) + z3; /* phase 5 */ - z13 = (tmp7<<8) - z3; + z11 = (tmp7 << 8) + z3; /* phase 5 */ + z13 = (tmp7 << 8) - z3; - odataptr[40] = DESCALE20(z13 + z2); /* phase 6 */ - odataptr[24] = DESCALE20(z13 - z2); - odataptr[8] = DESCALE20(z11 + z4); - odataptr[56] = DESCALE20(z11 - z4); + odataptr[40] = DESCALE20 (z13 + z2); /* phase 6 */ + odataptr[24] = DESCALE20 (z13 - z2); + odataptr[8] = DESCALE20 (z11 + z4); + odataptr[56] = DESCALE20 (z11 - z4); odataptr++; /* advance pointer to next column */ wsptr++; } #else mmx_t tmp6, tmp7; - register mmx_t *dataptr = (mmx_t *)odata; - mmx_t *idata2 = (mmx_t *)idata; + register mmx_t *dataptr = (mmx_t *) odata; + mmx_t *idata2 = (mmx_t *) idata; + + /* first copy the input 8 bit to the destination 16 bits */ + + movq_m2r (RTjpeg_zero, mm2); + - /* first copy the input 8 bit to the destination 16 bits */ + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - movq_m2r(RTjpeg_zero, mm2); + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr)); + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 1)); - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + idata2 += rskip; - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr)); + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+1)); - - idata2 += rskip; + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 2)); - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 3)); - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+2)); + idata2 += rskip; - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+3)); - - idata2 += rskip; + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 4)); - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+4)); + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 5)); - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+5)); - - idata2 += rskip; + idata2 += rskip; - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+6)); + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 6)); - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+7)); - - idata2 += rskip; + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 7)); - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + idata2 += rskip; - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+8)); + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+9)); - - idata2 += rskip; + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 8)); - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 9)); - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+10)); + idata2 += rskip; - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+11)); - - idata2 += rskip; + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 10)); - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+12)); + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 11)); - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+13)); - - idata2 += rskip; + idata2 += rskip; - movq_m2r(*idata2, mm0); - movq_r2r(mm0, mm1); + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); - punpcklbw_r2r(mm2, mm0); - movq_r2m(mm0, *(dataptr+14)); + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 12)); - punpckhbw_r2r(mm2, mm1); - movq_r2m(mm1, *(dataptr+15)); + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 13)); + + idata2 += rskip; + + movq_m2r (*idata2, mm0); + movq_r2r (mm0, mm1); + + punpcklbw_r2r (mm2, mm0); + movq_r2m (mm0, *(dataptr + 14)); + + punpckhbw_r2r (mm2, mm1); + movq_r2m (mm1, *(dataptr + 15)); /* Start Transpose to do calculations on rows */ - movq_m2r(*(dataptr+9), mm7); /* m03:m02|m01:m00 - first line (line 4)and copy into m5 */ + movq_m2r (*(dataptr + 9), mm7); /* m03:m02|m01:m00 - first line (line 4)and copy into m5 */ - movq_m2r(*(dataptr+13), mm6); /* m23:m22|m21:m20 - third line (line 6)and copy into m2 */ - movq_r2r(mm7, mm5); + movq_m2r (*(dataptr + 13), mm6); /* m23:m22|m21:m20 - third line (line 6)and copy into m2 */ + movq_r2r (mm7, mm5); - punpcklwd_m2r(*(dataptr+11), mm7); /* m11:m01|m10:m00 - interleave first and second lines */ - movq_r2r(mm6, mm2); + punpcklwd_m2r (*(dataptr + 11), mm7); /* m11:m01|m10:m00 - interleave first and second lines */ + movq_r2r (mm6, mm2); - punpcklwd_m2r(*(dataptr+15), mm6); /* m31:m21|m30:m20 - interleave third and fourth lines */ - movq_r2r(mm7, mm1); + punpcklwd_m2r (*(dataptr + 15), mm6); /* m31:m21|m30:m20 - interleave third and fourth lines */ + movq_r2r (mm7, mm1); - movq_m2r(*(dataptr+11), mm3); /* m13:m13|m11:m10 - second line */ - punpckldq_r2r(mm6, mm7); /* m30:m20|m10:m00 - interleave to produce result 1 */ + movq_m2r (*(dataptr + 11), mm3); /* m13:m13|m11:m10 - second line */ + punpckldq_r2r (mm6, mm7); /* m30:m20|m10:m00 - interleave to produce result 1 */ - movq_m2r(*(dataptr+15), mm0); /* m13:m13|m11:m10 - fourth line */ - punpckhdq_r2r(mm6, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ + movq_m2r (*(dataptr + 15), mm0); /* m13:m13|m11:m10 - fourth line */ + punpckhdq_r2r (mm6, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ - movq_r2m(mm7,*(dataptr+9)); /* write result 1 */ - punpckhwd_r2r(mm3, mm5); /* m13:m03|m12:m02 - interleave first and second lines */ - - movq_r2m(mm1,*(dataptr+11)); /* write result 2 */ - punpckhwd_r2r(mm0, mm2); /* m33:m23|m32:m22 - interleave third and fourth lines */ + movq_r2m (mm7, *(dataptr + 9)); /* write result 1 */ + punpckhwd_r2r (mm3, mm5); /* m13:m03|m12:m02 - interleave first and second lines */ - movq_r2r(mm5, mm1); - punpckldq_r2r(mm2, mm5); /* m32:m22|m12:m02 - interleave to produce result 3 */ + movq_r2m (mm1, *(dataptr + 11)); /* write result 2 */ + punpckhwd_r2r (mm0, mm2); /* m33:m23|m32:m22 - interleave third and fourth lines */ - movq_m2r(*(dataptr+1), mm0); /* m03:m02|m01:m00 - first line, 4x4 */ - punpckhdq_r2r(mm2, mm1); /* m33:m23|m13:m03 - interleave to produce result 4 */ + movq_r2r (mm5, mm1); + punpckldq_r2r (mm2, mm5); /* m32:m22|m12:m02 - interleave to produce result 3 */ - movq_r2m(mm5,*(dataptr+13)); /* write result 3 */ + movq_m2r (*(dataptr + 1), mm0); /* m03:m02|m01:m00 - first line, 4x4 */ + punpckhdq_r2r (mm2, mm1); /* m33:m23|m13:m03 - interleave to produce result 4 */ - /* last 4x4 done */ + movq_r2m (mm5, *(dataptr + 13)); /* write result 3 */ - movq_r2m(mm1, *(dataptr+15)); /* write result 4, last 4x4 */ + /* last 4x4 done */ - movq_m2r(*(dataptr+5), mm2); /* m23:m22|m21:m20 - third line */ - movq_r2r(mm0, mm6); + movq_r2m (mm1, *(dataptr + 15)); /* write result 4, last 4x4 */ - punpcklwd_m2r(*(dataptr+3), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ - movq_r2r(mm2, mm7); + movq_m2r (*(dataptr + 5), mm2); /* m23:m22|m21:m20 - third line */ + movq_r2r (mm0, mm6); - punpcklwd_m2r(*(dataptr+7), mm2); /* m31:m21|m30:m20 - interleave third and fourth lines */ - movq_r2r(mm0, mm4); + punpcklwd_m2r (*(dataptr + 3), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ + movq_r2r (mm2, mm7); - - movq_m2r(*(dataptr+8), mm1); /* n03:n02|n01:n00 - first line */ - punpckldq_r2r(mm2, mm0); /* m30:m20|m10:m00 - interleave to produce first result */ + punpcklwd_m2r (*(dataptr + 7), mm2); /* m31:m21|m30:m20 - interleave third and fourth lines */ + movq_r2r (mm0, mm4); - movq_m2r(*(dataptr+12), mm3); /* n23:n22|n21:n20 - third line */ - punpckhdq_r2r(mm2, mm4); /* m31:m21|m11:m01 - interleave to produce second result */ - punpckhwd_m2r(*(dataptr+3), mm6); /* m13:m03|m12:m02 - interleave first and second lines */ - movq_r2r(mm1, mm2); /* copy first line */ + movq_m2r (*(dataptr + 8), mm1); /* n03:n02|n01:n00 - first line */ + punpckldq_r2r (mm2, mm0); /* m30:m20|m10:m00 - interleave to produce first result */ - punpckhwd_m2r(*(dataptr+7), mm7); /* m33:m23|m32:m22 - interleave third and fourth lines */ - movq_r2r(mm6, mm5); /* copy first intermediate result */ + movq_m2r (*(dataptr + 12), mm3); /* n23:n22|n21:n20 - third line */ + punpckhdq_r2r (mm2, mm4); /* m31:m21|m11:m01 - interleave to produce second result */ - movq_r2m(mm0, *(dataptr+8)); /* write result 1 */ - punpckhdq_r2r(mm7, mm5); /* m33:m23|m13:m03 - produce third result */ + punpckhwd_m2r (*(dataptr + 3), mm6); /* m13:m03|m12:m02 - interleave first and second lines */ + movq_r2r (mm1, mm2); /* copy first line */ - punpcklwd_m2r(*(dataptr+10), mm1); /* n11:n01|n10:n00 - interleave first and second lines */ - movq_r2r(mm3, mm0); /* copy third line */ + punpckhwd_m2r (*(dataptr + 7), mm7); /* m33:m23|m32:m22 - interleave third and fourth lines */ + movq_r2r (mm6, mm5); /* copy first intermediate result */ - punpckhwd_m2r(*(dataptr+10), mm2); /* n13:n03|n12:n02 - interleave first and second lines */ + movq_r2m (mm0, *(dataptr + 8)); /* write result 1 */ + punpckhdq_r2r (mm7, mm5); /* m33:m23|m13:m03 - produce third result */ - movq_r2m(mm4, *(dataptr+10)); /* write result 2 out */ - punpckldq_r2r(mm7, mm6); /* m32:m22|m12:m02 - produce fourth result */ + punpcklwd_m2r (*(dataptr + 10), mm1); /* n11:n01|n10:n00 - interleave first and second lines */ + movq_r2r (mm3, mm0); /* copy third line */ - punpcklwd_m2r(*(dataptr+14), mm3); /* n31:n21|n30:n20 - interleave third and fourth lines */ - movq_r2r(mm1, mm4); + punpckhwd_m2r (*(dataptr + 10), mm2); /* n13:n03|n12:n02 - interleave first and second lines */ - movq_r2m(mm6, *(dataptr+12)); /* write result 3 out */ - punpckldq_r2r(mm3, mm1); /* n30:n20|n10:n00 - produce first result */ + movq_r2m (mm4, *(dataptr + 10)); /* write result 2 out */ + punpckldq_r2r (mm7, mm6); /* m32:m22|m12:m02 - produce fourth result */ - punpckhwd_m2r(*(dataptr+14), mm0); /* n33:n23|n32:n22 - interleave third and fourth lines */ - movq_r2r(mm2, mm6); + punpcklwd_m2r (*(dataptr + 14), mm3); /* n31:n21|n30:n20 - interleave third and fourth lines */ + movq_r2r (mm1, mm4); - movq_r2m(mm5, *(dataptr+14)); /* write result 4 out */ - punpckhdq_r2r(mm3, mm4); /* n31:n21|n11:n01- produce second result */ + movq_r2m (mm6, *(dataptr + 12)); /* write result 3 out */ + punpckldq_r2r (mm3, mm1); /* n30:n20|n10:n00 - produce first result */ - movq_r2m(mm1, *(dataptr+1)); /* write result 5 out - (first result for other 4 x 4 block) */ - punpckldq_r2r(mm0, mm2); /* n32:n22|n12:n02- produce third result */ + punpckhwd_m2r (*(dataptr + 14), mm0); /* n33:n23|n32:n22 - interleave third and fourth lines */ + movq_r2r (mm2, mm6); - movq_r2m(mm4, *(dataptr+3)); /* write result 6 out */ - punpckhdq_r2r(mm0, mm6); /* n33:n23|n13:n03 - produce fourth result */ + movq_r2m (mm5, *(dataptr + 14)); /* write result 4 out */ + punpckhdq_r2r (mm3, mm4); /* n31:n21|n11:n01- produce second result */ - movq_r2m(mm2, *(dataptr+5)); /* write result 7 out*/ + movq_r2m (mm1, *(dataptr + 1)); /* write result 5 out - (first result for other 4 x 4 block) */ + punpckldq_r2r (mm0, mm2); /* n32:n22|n12:n02- produce third result */ - movq_m2r(*dataptr, mm0); /* m03:m02|m01:m00 - first line, first 4x4 */ + movq_r2m (mm4, *(dataptr + 3)); /* write result 6 out */ + punpckhdq_r2r (mm0, mm6); /* n33:n23|n13:n03 - produce fourth result */ - movq_r2m(mm6, *(dataptr+7)); /* write result 8 out */ + movq_r2m (mm2, *(dataptr + 5)); /* write result 7 out */ + + movq_m2r (*dataptr, mm0); /* m03:m02|m01:m00 - first line, first 4x4 */ + + movq_r2m (mm6, *(dataptr + 7)); /* write result 8 out */ /* Do first 4x4 quadrant, which is used in the beginning of the DCT: */ - movq_m2r(*(dataptr+4), mm7); /* m23:m22|m21:m20 - third line */ - movq_r2r(mm0, mm2); + movq_m2r (*(dataptr + 4), mm7); /* m23:m22|m21:m20 - third line */ + movq_r2r (mm0, mm2); - punpcklwd_m2r(*(dataptr+2), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ - movq_r2r(mm7, mm4); + punpcklwd_m2r (*(dataptr + 2), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ + movq_r2r (mm7, mm4); - punpcklwd_m2r(*(dataptr+6), mm7); /* m31:m21|m30:m20 - interleave third and fourth lines */ - movq_r2r(mm0, mm1); + punpcklwd_m2r (*(dataptr + 6), mm7); /* m31:m21|m30:m20 - interleave third and fourth lines */ + movq_r2r (mm0, mm1); - movq_m2r(*(dataptr+2), mm6); /* m13:m12|m11:m10 - second line */ - punpckldq_r2r(mm7, mm0); /* m30:m20|m10:m00 - interleave to produce result 1 */ + movq_m2r (*(dataptr + 2), mm6); /* m13:m12|m11:m10 - second line */ + punpckldq_r2r (mm7, mm0); /* m30:m20|m10:m00 - interleave to produce result 1 */ - movq_m2r(*(dataptr+6), mm5); /* m33:m32|m31:m30 - fourth line */ - punpckhdq_r2r(mm7, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ + movq_m2r (*(dataptr + 6), mm5); /* m33:m32|m31:m30 - fourth line */ + punpckhdq_r2r (mm7, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ - movq_r2r(mm0, mm7); /* write result 1 */ - punpckhwd_r2r(mm6, mm2); /* m13:m03|m12:m02 - interleave first and second lines */ + movq_r2r (mm0, mm7); /* write result 1 */ + punpckhwd_r2r (mm6, mm2); /* m13:m03|m12:m02 - interleave first and second lines */ - psubw_m2r(*(dataptr+14), mm7); /* tmp07=x0-x7: Stage 1 */ - movq_r2r(mm1, mm6); /* write result 2 */ + psubw_m2r (*(dataptr + 14), mm7); /* tmp07=x0-x7: Stage 1 */ + movq_r2r (mm1, mm6); /* write result 2 */ - paddw_m2r(*(dataptr+14), mm0); /* tmp00=x0+x7: Stage 1 */ - punpckhwd_r2r(mm5, mm4); /* m33:m23|m32:m22 - interleave third and fourth lines */ + paddw_m2r (*(dataptr + 14), mm0); /* tmp00=x0+x7: Stage 1 */ + punpckhwd_r2r (mm5, mm4); /* m33:m23|m32:m22 - interleave third and fourth lines */ - paddw_m2r(*(dataptr+12), mm1); /* tmp01=x1+x6: Stage 1 */ - movq_r2r(mm2, mm3); /* copy first intermediate result */ + paddw_m2r (*(dataptr + 12), mm1); /* tmp01=x1+x6: Stage 1 */ + movq_r2r (mm2, mm3); /* copy first intermediate result */ - psubw_m2r(*(dataptr+12), mm6); /* tmp06=x1-x6: Stage 1 */ - punpckldq_r2r(mm4, mm2); /* m32:m22|m12:m02 - interleave to produce result 3 */ + psubw_m2r (*(dataptr + 12), mm6); /* tmp06=x1-x6: Stage 1 */ + punpckldq_r2r (mm4, mm2); /* m32:m22|m12:m02 - interleave to produce result 3 */ - movq_r2m(mm7, tmp7); - movq_r2r(mm2, mm5); /* write result 3 */ + movq_r2m (mm7, tmp7); + movq_r2r (mm2, mm5); /* write result 3 */ - movq_r2m(mm6, tmp6); - punpckhdq_r2r(mm4, mm3); /* m33:m23|m13:m03 - interleave to produce result 4 */ + movq_r2m (mm6, tmp6); + punpckhdq_r2r (mm4, mm3); /* m33:m23|m13:m03 - interleave to produce result 4 */ - paddw_m2r(*(dataptr+10), mm2); /* tmp02=x2+5: Stage 1 */ - movq_r2r(mm3, mm4); /* write result 4 */ + paddw_m2r (*(dataptr + 10), mm2); /* tmp02=x2+5: Stage 1 */ + movq_r2r (mm3, mm4); /* write result 4 */ /************************************************************************************************ End of Transpose ************************************************************************************************/ - paddw_m2r(*(dataptr+8), mm3); /* tmp03=x3+x4: stage 1 */ - movq_r2r(mm0, mm7); + paddw_m2r (*(dataptr + 8), mm3); /* tmp03=x3+x4: stage 1 */ + movq_r2r (mm0, mm7); - psubw_m2r(*(dataptr+8), mm4); /* tmp04=x3-x4: stage 1 */ - movq_r2r(mm1, mm6); + psubw_m2r (*(dataptr + 8), mm4); /* tmp04=x3-x4: stage 1 */ + movq_r2r (mm1, mm6); - paddw_r2r(mm3, mm0); /* tmp10 = tmp00 + tmp03: even 2 */ - psubw_r2r(mm3, mm7); /* tmp13 = tmp00 - tmp03: even 2 */ + paddw_r2r (mm3, mm0); /* tmp10 = tmp00 + tmp03: even 2 */ + psubw_r2r (mm3, mm7); /* tmp13 = tmp00 - tmp03: even 2 */ - psubw_r2r(mm2, mm6); /* tmp12 = tmp01 - tmp02: even 2 */ - paddw_r2r(mm2, mm1); /* tmp11 = tmp01 + tmp02: even 2 */ + psubw_r2r (mm2, mm6); /* tmp12 = tmp01 - tmp02: even 2 */ + paddw_r2r (mm2, mm1); /* tmp11 = tmp01 + tmp02: even 2 */ - psubw_m2r(*(dataptr+10), mm5); /* tmp05=x2-x5: stage 1 */ - paddw_r2r(mm7, mm6); /* tmp12 + tmp13 */ + psubw_m2r (*(dataptr + 10), mm5); /* tmp05=x2-x5: stage 1 */ + paddw_r2r (mm7, mm6); /* tmp12 + tmp13 */ - /* stage 3 */ + /* stage 3 */ - movq_m2r(tmp6, mm2); - movq_r2r(mm0, mm3); + movq_m2r (tmp6, mm2); + movq_r2r (mm0, mm3); - psllw_i2r(2, mm6); /* m8 * 2^2 */ - paddw_r2r(mm1, mm0); + psllw_i2r (2, mm6); /* m8 * 2^2 */ + paddw_r2r (mm1, mm0); - pmulhw_m2r(RTjpeg_C4, mm6); /* z1 */ - psubw_r2r(mm1, mm3); + pmulhw_m2r (RTjpeg_C4, mm6); /* z1 */ + psubw_r2r (mm1, mm3); - movq_r2m(mm0, *dataptr); - movq_r2r(mm7, mm0); - - /* Odd part */ - movq_r2m(mm3, *(dataptr+8)); - paddw_r2r(mm5, mm4); /* tmp10 */ + movq_r2m (mm0, *dataptr); + movq_r2r (mm7, mm0); - movq_m2r(tmp7, mm3); - paddw_r2r(mm6, mm0); /* tmp32 */ + /* Odd part */ + movq_r2m (mm3, *(dataptr + 8)); + paddw_r2r (mm5, mm4); /* tmp10 */ - paddw_r2r(mm2, mm5); /* tmp11 */ - psubw_r2r(mm6, mm7); /* tmp33 */ + movq_m2r (tmp7, mm3); + paddw_r2r (mm6, mm0); /* tmp32 */ - movq_r2m(mm0, *(dataptr+4)); - paddw_r2r(mm3, mm2); /* tmp12 */ + paddw_r2r (mm2, mm5); /* tmp11 */ + psubw_r2r (mm6, mm7); /* tmp33 */ - /* stage 4 */ + movq_r2m (mm0, *(dataptr + 4)); + paddw_r2r (mm3, mm2); /* tmp12 */ - movq_r2m(mm7, *(dataptr+12)); - movq_r2r(mm4, mm1); /* copy of tmp10 */ + /* stage 4 */ - psubw_r2r(mm2, mm1); /* tmp10 - tmp12 */ - psllw_i2r(2, mm4); /* m8 * 2^2 */ + movq_r2m (mm7, *(dataptr + 12)); + movq_r2r (mm4, mm1); /* copy of tmp10 */ - movq_m2r(RTjpeg_C2mC6, mm0); - psllw_i2r(2, mm1); + psubw_r2r (mm2, mm1); /* tmp10 - tmp12 */ + psllw_i2r (2, mm4); /* m8 * 2^2 */ - pmulhw_m2r(RTjpeg_C6, mm1); /* z5 */ - psllw_i2r(2, mm2); + movq_m2r (RTjpeg_C2mC6, mm0); + psllw_i2r (2, mm1); - pmulhw_r2r(mm0, mm4); /* z5 */ + pmulhw_m2r (RTjpeg_C6, mm1); /* z5 */ + psllw_i2r (2, mm2); - /* stage 5 */ + pmulhw_r2r (mm0, mm4); /* z5 */ - pmulhw_m2r(RTjpeg_C2pC6, mm2); - psllw_i2r(2, mm5); + /* stage 5 */ - pmulhw_m2r(RTjpeg_C4, mm5); /* z3 */ - movq_r2r(mm3, mm0); /* copy tmp7 */ + pmulhw_m2r (RTjpeg_C2pC6, mm2); + psllw_i2r (2, mm5); - movq_m2r(*(dataptr+1), mm7); - paddw_r2r(mm1, mm4); /* z2 */ + pmulhw_m2r (RTjpeg_C4, mm5); /* z3 */ + movq_r2r (mm3, mm0); /* copy tmp7 */ - paddw_r2r(mm1, mm2); /* z4 */ + movq_m2r (*(dataptr + 1), mm7); + paddw_r2r (mm1, mm4); /* z2 */ - paddw_r2r(mm5, mm0); /* z11 */ - psubw_r2r(mm5, mm3); /* z13 */ + paddw_r2r (mm1, mm2); /* z4 */ - /* stage 6 */ + paddw_r2r (mm5, mm0); /* z11 */ + psubw_r2r (mm5, mm3); /* z13 */ - movq_r2r(mm3, mm5); /* copy z13 */ - psubw_r2r(mm4, mm3); /* y3=z13 - z2 */ + /* stage 6 */ - paddw_r2r(mm4, mm5); /* y5=z13 + z2 */ - movq_r2r(mm0, mm6); /* copy z11 */ + movq_r2r (mm3, mm5); /* copy z13 */ + psubw_r2r (mm4, mm3); /* y3=z13 - z2 */ - movq_r2m(mm3, *(dataptr+6)); /*save y3 */ - psubw_r2r(mm2, mm0); /* y7=z11 - z4 */ + paddw_r2r (mm4, mm5); /* y5=z13 + z2 */ + movq_r2r (mm0, mm6); /* copy z11 */ - movq_r2m(mm5, *(dataptr+10)); /*save y5 */ - paddw_r2r(mm2, mm6); /* y1=z11 + z4 */ + movq_r2m (mm3, *(dataptr + 6)); /*save y3 */ + psubw_r2r (mm2, mm0); /* y7=z11 - z4 */ - movq_r2m(mm0, *(dataptr+14)); /*save y7 */ + movq_r2m (mm5, *(dataptr + 10)); /*save y5 */ + paddw_r2r (mm2, mm6); /* y1=z11 + z4 */ + + movq_r2m (mm0, *(dataptr + 14)); /*save y7 */ /************************************************ * End of 1st 4 rows ************************************************/ - movq_m2r(*(dataptr+3), mm1); /* load x1: stage 1 */ - movq_r2r(mm7, mm0); /* copy x0 */ + movq_m2r (*(dataptr + 3), mm1); /* load x1: stage 1 */ + movq_r2r (mm7, mm0); /* copy x0 */ + + movq_r2m (mm6, *(dataptr + 2)); /*save y1 */ - movq_r2m(mm6, *(dataptr+2)); /*save y1 */ + movq_m2r (*(dataptr + 5), mm2); /* load x2: stage 1 */ + movq_r2r (mm1, mm6); /* copy x1 */ - movq_m2r(*(dataptr+5), mm2); /* load x2: stage 1 */ - movq_r2r(mm1, mm6); /* copy x1 */ + paddw_m2r (*(dataptr + 15), mm0); /* tmp00 = x0 + x7 */ - paddw_m2r(*(dataptr+15), mm0); /* tmp00 = x0 + x7 */ + movq_m2r (*(dataptr + 7), mm3); /* load x3 : stage 1 */ + movq_r2r (mm2, mm5); /* copy x2 */ - movq_m2r(*(dataptr+7), mm3); /* load x3 : stage 1 */ - movq_r2r(mm2, mm5); /* copy x2 */ + psubw_m2r (*(dataptr + 15), mm7); /* tmp07 = x0 - x7 */ + movq_r2r (mm3, mm4); /* copy x3 */ - psubw_m2r(*(dataptr+15), mm7); /* tmp07 = x0 - x7 */ - movq_r2r(mm3, mm4); /* copy x3 */ + paddw_m2r (*(dataptr + 13), mm1); /* tmp01 = x1 + x6 */ - paddw_m2r(*(dataptr+13), mm1); /* tmp01 = x1 + x6 */ + movq_r2m (mm7, tmp7); /* save tmp07 */ + movq_r2r (mm0, mm7); /* copy tmp00 */ - movq_r2m(mm7, tmp7); /* save tmp07 */ - movq_r2r(mm0, mm7); /* copy tmp00 */ + psubw_m2r (*(dataptr + 13), mm6); /* tmp06 = x1 - x6 */ - psubw_m2r(*(dataptr+13), mm6); /* tmp06 = x1 - x6 */ + /* stage 2, Even Part */ - /* stage 2, Even Part */ + paddw_m2r (*(dataptr + 9), mm3); /* tmp03 = x3 + x4 */ - paddw_m2r(*(dataptr+9), mm3); /* tmp03 = x3 + x4 */ + movq_r2m (mm6, tmp6); /* save tmp07 */ + movq_r2r (mm1, mm6); /* copy tmp01 */ - movq_r2m(mm6, tmp6); /* save tmp07 */ - movq_r2r(mm1, mm6); /* copy tmp01 */ + paddw_m2r (*(dataptr + 11), mm2); /* tmp02 = x2 + x5 */ + paddw_r2r (mm3, mm0); /* tmp10 = tmp00 + tmp03 */ - paddw_m2r(*(dataptr+11), mm2); /* tmp02 = x2 + x5 */ - paddw_r2r(mm3, mm0); /* tmp10 = tmp00 + tmp03 */ + psubw_r2r (mm3, mm7); /* tmp13 = tmp00 - tmp03 */ - psubw_r2r(mm3, mm7); /* tmp13 = tmp00 - tmp03 */ + psubw_m2r (*(dataptr + 9), mm4); /* tmp04 = x3 - x4 */ + psubw_r2r (mm2, mm6); /* tmp12 = tmp01 - tmp02 */ - psubw_m2r(*(dataptr+9), mm4); /* tmp04 = x3 - x4 */ - psubw_r2r(mm2, mm6); /* tmp12 = tmp01 - tmp02 */ + paddw_r2r (mm2, mm1); /* tmp11 = tmp01 + tmp02 */ - paddw_r2r(mm2, mm1); /* tmp11 = tmp01 + tmp02 */ + psubw_m2r (*(dataptr + 11), mm5); /* tmp05 = x2 - x5 */ + paddw_r2r (mm7, mm6); /* tmp12 + tmp13 */ - psubw_m2r(*(dataptr+11), mm5); /* tmp05 = x2 - x5 */ - paddw_r2r(mm7, mm6); /* tmp12 + tmp13 */ + /* stage 3, Even and stage 4 & 5 even */ - /* stage 3, Even and stage 4 & 5 even */ + movq_m2r (tmp6, mm2); /* load tmp6 */ + movq_r2r (mm0, mm3); /* copy tmp10 */ - movq_m2r(tmp6, mm2); /* load tmp6 */ - movq_r2r(mm0, mm3); /* copy tmp10 */ + psllw_i2r (2, mm6); /* shift z1 */ + paddw_r2r (mm1, mm0); /* y0=tmp10 + tmp11 */ - psllw_i2r(2, mm6); /* shift z1 */ - paddw_r2r(mm1, mm0); /* y0=tmp10 + tmp11 */ + pmulhw_m2r (RTjpeg_C4, mm6); /* z1 */ + psubw_r2r (mm1, mm3); /* y4=tmp10 - tmp11 */ - pmulhw_m2r(RTjpeg_C4, mm6); /* z1 */ - psubw_r2r(mm1, mm3); /* y4=tmp10 - tmp11 */ + movq_r2m (mm0, *(dataptr + 1)); /*save y0 */ + movq_r2r (mm7, mm0); /* copy tmp13 */ - movq_r2m(mm0, *(dataptr+1)); /*save y0 */ - movq_r2r(mm7, mm0); /* copy tmp13 */ - - /* odd part */ + /* odd part */ - movq_r2m(mm3, *(dataptr+9)); /*save y4 */ - paddw_r2r(mm5, mm4); /* tmp10 = tmp4 + tmp5 */ + movq_r2m (mm3, *(dataptr + 9)); /*save y4 */ + paddw_r2r (mm5, mm4); /* tmp10 = tmp4 + tmp5 */ - movq_m2r(tmp7, mm3); /* load tmp7 */ - paddw_r2r(mm6, mm0); /* tmp32 = tmp13 + z1 */ + movq_m2r (tmp7, mm3); /* load tmp7 */ + paddw_r2r (mm6, mm0); /* tmp32 = tmp13 + z1 */ - paddw_r2r(mm2, mm5); /* tmp11 = tmp5 + tmp6 */ - psubw_r2r(mm6, mm7); /* tmp33 = tmp13 - z1 */ + paddw_r2r (mm2, mm5); /* tmp11 = tmp5 + tmp6 */ + psubw_r2r (mm6, mm7); /* tmp33 = tmp13 - z1 */ - movq_r2m(mm0, *(dataptr+5)); /*save y2 */ - paddw_r2r(mm3, mm2); /* tmp12 = tmp6 + tmp7 */ + movq_r2m (mm0, *(dataptr + 5)); /*save y2 */ + paddw_r2r (mm3, mm2); /* tmp12 = tmp6 + tmp7 */ - /* stage 4 */ + /* stage 4 */ - movq_r2m(mm7, *(dataptr+13)); /*save y6 */ - movq_r2r(mm4, mm1); /* copy tmp10 */ + movq_r2m (mm7, *(dataptr + 13)); /*save y6 */ + movq_r2r (mm4, mm1); /* copy tmp10 */ - psubw_r2r(mm2, mm1); /* tmp10 - tmp12 */ - psllw_i2r(2, mm4); /* shift tmp10 */ + psubw_r2r (mm2, mm1); /* tmp10 - tmp12 */ + psllw_i2r (2, mm4); /* shift tmp10 */ - movq_m2r(RTjpeg_C2mC6, mm0); /* load C2mC6 */ - psllw_i2r(2, mm1); /* shift (tmp10-tmp12) */ + movq_m2r (RTjpeg_C2mC6, mm0); /* load C2mC6 */ + psllw_i2r (2, mm1); /* shift (tmp10-tmp12) */ - pmulhw_m2r(RTjpeg_C6, mm1); /* z5 */ - psllw_i2r(2, mm5); /* prepare for multiply */ + pmulhw_m2r (RTjpeg_C6, mm1); /* z5 */ + psllw_i2r (2, mm5); /* prepare for multiply */ - pmulhw_r2r(mm0, mm4); /* multiply by converted real */ + pmulhw_r2r (mm0, mm4); /* multiply by converted real */ - /* stage 5 */ + /* stage 5 */ - pmulhw_m2r(RTjpeg_C4, mm5); /* z3 */ - psllw_i2r(2, mm2); /* prepare for multiply */ + pmulhw_m2r (RTjpeg_C4, mm5); /* z3 */ + psllw_i2r (2, mm2); /* prepare for multiply */ - pmulhw_m2r(RTjpeg_C2pC6, mm2); /* multiply */ - movq_r2r(mm3, mm0); /* copy tmp7 */ + pmulhw_m2r (RTjpeg_C2pC6, mm2); /* multiply */ + movq_r2r (mm3, mm0); /* copy tmp7 */ - movq_m2r(*(dataptr+9), mm7); /* m03:m02|m01:m00 - first line (line 4)and copy into mm7 */ - paddw_r2r(mm1, mm4); /* z2 */ + movq_m2r (*(dataptr + 9), mm7); /* m03:m02|m01:m00 - first line (line 4)and copy into mm7 */ + paddw_r2r (mm1, mm4); /* z2 */ - paddw_r2r(mm5, mm0); /* z11 */ - psubw_r2r(mm5, mm3); /* z13 */ + paddw_r2r (mm5, mm0); /* z11 */ + psubw_r2r (mm5, mm3); /* z13 */ - /* stage 6 */ + /* stage 6 */ - movq_r2r(mm3, mm5); /* copy z13 */ - paddw_r2r(mm1, mm2); /* z4 */ + movq_r2r (mm3, mm5); /* copy z13 */ + paddw_r2r (mm1, mm2); /* z4 */ - movq_r2r(mm0, mm6); /* copy z11 */ - psubw_r2r(mm4, mm5); /* y3 */ + movq_r2r (mm0, mm6); /* copy z11 */ + psubw_r2r (mm4, mm5); /* y3 */ - paddw_r2r(mm2, mm6); /* y1 */ - paddw_r2r(mm4, mm3); /* y5 */ + paddw_r2r (mm2, mm6); /* y1 */ + paddw_r2r (mm4, mm3); /* y5 */ - movq_r2m(mm5, *(dataptr+7)); /*save y3 */ + movq_r2m (mm5, *(dataptr + 7)); /*save y3 */ + + movq_r2m (mm6, *(dataptr + 3)); /*save y1 */ + psubw_r2r (mm2, mm0); /* y7 */ - movq_r2m(mm6, *(dataptr+3)); /*save y1 */ - psubw_r2r(mm2, mm0); /* y7 */ - /************************************************************************************************ Start of Transpose ************************************************************************************************/ - movq_m2r(*(dataptr+13), mm6); /* m23:m22|m21:m20 - third line (line 6)and copy into m2 */ - movq_r2r(mm7, mm5); /* copy first line */ + movq_m2r (*(dataptr + 13), mm6); /* m23:m22|m21:m20 - third line (line 6)and copy into m2 */ + movq_r2r (mm7, mm5); /* copy first line */ - punpcklwd_r2r(mm3, mm7); /* m11:m01|m10:m00 - interleave first and second lines */ - movq_r2r(mm6, mm2); /* copy third line */ + punpcklwd_r2r (mm3, mm7); /* m11:m01|m10:m00 - interleave first and second lines */ + movq_r2r (mm6, mm2); /* copy third line */ - punpcklwd_r2r(mm0, mm6); /* m31:m21|m30:m20 - interleave third and fourth lines */ - movq_r2r(mm7, mm1); /* copy first intermediate result */ + punpcklwd_r2r (mm0, mm6); /* m31:m21|m30:m20 - interleave third and fourth lines */ + movq_r2r (mm7, mm1); /* copy first intermediate result */ - punpckldq_r2r(mm6, mm7); /* m30:m20|m10:m00 - interleave to produce result 1 */ + punpckldq_r2r (mm6, mm7); /* m30:m20|m10:m00 - interleave to produce result 1 */ - punpckhdq_r2r(mm6, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ + punpckhdq_r2r (mm6, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ - movq_r2m(mm7, *(dataptr+9)); /* write result 1 */ - punpckhwd_r2r(mm3, mm5); /* m13:m03|m12:m02 - interleave first and second lines */ + movq_r2m (mm7, *(dataptr + 9)); /* write result 1 */ + punpckhwd_r2r (mm3, mm5); /* m13:m03|m12:m02 - interleave first and second lines */ - movq_r2m(mm1, *(dataptr+11)); /* write result 2 */ - punpckhwd_r2r(mm0, mm2); /* m33:m23|m32:m22 - interleave third and fourth lines */ + movq_r2m (mm1, *(dataptr + 11)); /* write result 2 */ + punpckhwd_r2r (mm0, mm2); /* m33:m23|m32:m22 - interleave third and fourth lines */ - movq_r2r(mm5, mm1); /* copy first intermediate result */ - punpckldq_r2r(mm2, mm5); /* m32:m22|m12:m02 - interleave to produce result 3 */ + movq_r2r (mm5, mm1); /* copy first intermediate result */ + punpckldq_r2r (mm2, mm5); /* m32:m22|m12:m02 - interleave to produce result 3 */ - movq_m2r(*(dataptr+1), mm0); /* m03:m02|m01:m00 - first line, 4x4 */ - punpckhdq_r2r(mm2, mm1); /* m33:m23|m13:m03 - interleave to produce result 4 */ + movq_m2r (*(dataptr + 1), mm0); /* m03:m02|m01:m00 - first line, 4x4 */ + punpckhdq_r2r (mm2, mm1); /* m33:m23|m13:m03 - interleave to produce result 4 */ - movq_r2m(mm5, *(dataptr+13)); /* write result 3 */ + movq_r2m (mm5, *(dataptr + 13)); /* write result 3 */ /****** last 4x4 done */ - movq_r2m(mm1, *(dataptr+15)); /* write result 4, last 4x4 */ + movq_r2m (mm1, *(dataptr + 15)); /* write result 4, last 4x4 */ + + movq_m2r (*(dataptr + 5), mm2); /* m23:m22|m21:m20 - third line */ + movq_r2r (mm0, mm6); /* copy first line */ - movq_m2r(*(dataptr+5), mm2); /* m23:m22|m21:m20 - third line */ - movq_r2r(mm0, mm6); /* copy first line */ + punpcklwd_m2r (*(dataptr + 3), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ + movq_r2r (mm2, mm7); /* copy third line */ - punpcklwd_m2r(*(dataptr+3), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ - movq_r2r(mm2, mm7); /* copy third line */ + punpcklwd_m2r (*(dataptr + 7), mm2); /* m31:m21|m30:m20 - interleave third and fourth lines */ + movq_r2r (mm0, mm4); /* copy first intermediate result */ - punpcklwd_m2r(*(dataptr+7), mm2); /* m31:m21|m30:m20 - interleave third and fourth lines */ - movq_r2r(mm0, mm4); /* copy first intermediate result */ - - movq_m2r(*(dataptr+8), mm1); /* n03:n02|n01:n00 - first line */ - punpckldq_r2r(mm2, mm0); /* m30:m20|m10:m00 - interleave to produce first result */ + movq_m2r (*(dataptr + 8), mm1); /* n03:n02|n01:n00 - first line */ + punpckldq_r2r (mm2, mm0); /* m30:m20|m10:m00 - interleave to produce first result */ - movq_m2r(*(dataptr+12), mm3); /* n23:n22|n21:n20 - third line */ - punpckhdq_r2r(mm2, mm4); /* m31:m21|m11:m01 - interleave to produce second result */ + movq_m2r (*(dataptr + 12), mm3); /* n23:n22|n21:n20 - third line */ + punpckhdq_r2r (mm2, mm4); /* m31:m21|m11:m01 - interleave to produce second result */ - punpckhwd_m2r(*(dataptr+3), mm6); /* m13:m03|m12:m02 - interleave first and second lines */ - movq_r2r(mm1, mm2); /* copy first line */ + punpckhwd_m2r (*(dataptr + 3), mm6); /* m13:m03|m12:m02 - interleave first and second lines */ + movq_r2r (mm1, mm2); /* copy first line */ - punpckhwd_m2r(*(dataptr+7), mm7); /* m33:m23|m32:m22 - interleave third and fourth lines */ - movq_r2r(mm6, mm5); /* copy first intermediate result */ + punpckhwd_m2r (*(dataptr + 7), mm7); /* m33:m23|m32:m22 - interleave third and fourth lines */ + movq_r2r (mm6, mm5); /* copy first intermediate result */ - movq_r2m(mm0, *(dataptr+8)); /* write result 1 */ - punpckhdq_r2r(mm7, mm5); /* m33:m23|m13:m03 - produce third result */ + movq_r2m (mm0, *(dataptr + 8)); /* write result 1 */ + punpckhdq_r2r (mm7, mm5); /* m33:m23|m13:m03 - produce third result */ - punpcklwd_m2r(*(dataptr+10), mm1); /* n11:n01|n10:n00 - interleave first and second lines */ - movq_r2r(mm3, mm0); /* copy third line */ + punpcklwd_m2r (*(dataptr + 10), mm1); /* n11:n01|n10:n00 - interleave first and second lines */ + movq_r2r (mm3, mm0); /* copy third line */ - punpckhwd_m2r(*(dataptr+10), mm2); /* n13:n03|n12:n02 - interleave first and second lines */ + punpckhwd_m2r (*(dataptr + 10), mm2); /* n13:n03|n12:n02 - interleave first and second lines */ - movq_r2m(mm4, *(dataptr+10)); /* write result 2 out */ - punpckldq_r2r(mm7, mm6); /* m32:m22|m12:m02 - produce fourth result */ + movq_r2m (mm4, *(dataptr + 10)); /* write result 2 out */ + punpckldq_r2r (mm7, mm6); /* m32:m22|m12:m02 - produce fourth result */ - punpcklwd_m2r(*(dataptr+14), mm3); /* n33:n23|n32:n22 - interleave third and fourth lines */ - movq_r2r(mm1, mm4); /* copy second intermediate result */ + punpcklwd_m2r (*(dataptr + 14), mm3); /* n33:n23|n32:n22 - interleave third and fourth lines */ + movq_r2r (mm1, mm4); /* copy second intermediate result */ - movq_r2m(mm6, *(dataptr+12)); /* write result 3 out */ - punpckldq_r2r(mm3, mm1); /* */ + movq_r2m (mm6, *(dataptr + 12)); /* write result 3 out */ + punpckldq_r2r (mm3, mm1); /* */ - punpckhwd_m2r(*(dataptr+14), mm0); /* n33:n23|n32:n22 - interleave third and fourth lines */ - movq_r2r(mm2, mm6); /* copy second intermediate result */ + punpckhwd_m2r (*(dataptr + 14), mm0); /* n33:n23|n32:n22 - interleave third and fourth lines */ + movq_r2r (mm2, mm6); /* copy second intermediate result */ - movq_r2m(mm5, *(dataptr+14)); /* write result 4 out */ - punpckhdq_r2r(mm3, mm4); /* n31:n21|n11:n01- produce second result */ + movq_r2m (mm5, *(dataptr + 14)); /* write result 4 out */ + punpckhdq_r2r (mm3, mm4); /* n31:n21|n11:n01- produce second result */ - movq_r2m(mm1, *(dataptr+1)); /* write result 5 out - (first result for other 4 x 4 block) */ - punpckldq_r2r(mm0, mm2); /* n32:n22|n12:n02- produce third result */ + movq_r2m (mm1, *(dataptr + 1)); /* write result 5 out - (first result for other 4 x 4 block) */ + punpckldq_r2r (mm0, mm2); /* n32:n22|n12:n02- produce third result */ - movq_r2m(mm4, *(dataptr+3)); /* write result 6 out */ - punpckhdq_r2r(mm0, mm6); /* n33:n23|n13:n03 - produce fourth result */ + movq_r2m (mm4, *(dataptr + 3)); /* write result 6 out */ + punpckhdq_r2r (mm0, mm6); /* n33:n23|n13:n03 - produce fourth result */ - movq_r2m(mm2, *(dataptr+5)); /* write result 7 out */ + movq_r2m (mm2, *(dataptr + 5)); /* write result 7 out */ - movq_m2r(*dataptr, mm0); /* m03:m02|m01:m00 - first line, first 4x4 */ + movq_m2r (*dataptr, mm0); /* m03:m02|m01:m00 - first line, first 4x4 */ - movq_r2m(mm6, *(dataptr+7)); /* write result 8 out */ + movq_r2m (mm6, *(dataptr + 7)); /* write result 8 out */ /* Do first 4x4 quadrant, which is used in the beginning of the DCT: */ - movq_m2r(*(dataptr+4), mm7); /* m23:m22|m21:m20 - third line */ - movq_r2r(mm0, mm2); /* copy first line */ + movq_m2r (*(dataptr + 4), mm7); /* m23:m22|m21:m20 - third line */ + movq_r2r (mm0, mm2); /* copy first line */ + + punpcklwd_m2r (*(dataptr + 2), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ + movq_r2r (mm7, mm4); /* copy third line */ - punpcklwd_m2r(*(dataptr+2), mm0); /* m11:m01|m10:m00 - interleave first and second lines */ - movq_r2r(mm7, mm4); /* copy third line */ - - punpcklwd_m2r(*(dataptr+6), mm7); /* m31:m21|m30:m20 - interleave third and fourth lines */ - movq_r2r(mm0, mm1); /* copy first intermediate result */ + punpcklwd_m2r (*(dataptr + 6), mm7); /* m31:m21|m30:m20 - interleave third and fourth lines */ + movq_r2r (mm0, mm1); /* copy first intermediate result */ - movq_m2r(*(dataptr+2), mm6); /* m13:m12|m11:m10 - second line */ - punpckldq_r2r(mm7, mm0); /* m30:m20|m10:m00 - interleave to produce result 1 */ + movq_m2r (*(dataptr + 2), mm6); /* m13:m12|m11:m10 - second line */ + punpckldq_r2r (mm7, mm0); /* m30:m20|m10:m00 - interleave to produce result 1 */ - movq_m2r(*(dataptr+6), mm5); /* m33:m32|m31:m30 - fourth line */ - punpckhdq_r2r(mm7, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ + movq_m2r (*(dataptr + 6), mm5); /* m33:m32|m31:m30 - fourth line */ + punpckhdq_r2r (mm7, mm1); /* m31:m21|m11:m01 - interleave to produce result 2 */ - movq_r2r(mm0, mm7); /* write result 1 */ - punpckhwd_r2r(mm6, mm2); /* m13:m03|m12:m02 - interleave first and second lines */ + movq_r2r (mm0, mm7); /* write result 1 */ + punpckhwd_r2r (mm6, mm2); /* m13:m03|m12:m02 - interleave first and second lines */ - psubw_m2r(*(dataptr+14), mm7); /* tmp07=x0-x7: Stage 1 */ - movq_r2r(mm1, mm6); /* write result 2 */ + psubw_m2r (*(dataptr + 14), mm7); /* tmp07=x0-x7: Stage 1 */ + movq_r2r (mm1, mm6); /* write result 2 */ - paddw_m2r(*(dataptr+14), mm0); /* tmp00=x0+x7: Stage 1 */ - punpckhwd_r2r(mm5, mm4); /* m33:m23|m32:m22 - interleave third and fourth lines */ + paddw_m2r (*(dataptr + 14), mm0); /* tmp00=x0+x7: Stage 1 */ + punpckhwd_r2r (mm5, mm4); /* m33:m23|m32:m22 - interleave third and fourth lines */ - paddw_m2r(*(dataptr+12), mm1); /* tmp01=x1+x6: Stage 1 */ - movq_r2r(mm2, mm3); /* copy first intermediate result */ + paddw_m2r (*(dataptr + 12), mm1); /* tmp01=x1+x6: Stage 1 */ + movq_r2r (mm2, mm3); /* copy first intermediate result */ - psubw_m2r(*(dataptr+12), mm6); /* tmp06=x1-x6: Stage 1 */ - punpckldq_r2r(mm4, mm2); /* m32:m22|m12:m02 - interleave to produce result 3 */ + psubw_m2r (*(dataptr + 12), mm6); /* tmp06=x1-x6: Stage 1 */ + punpckldq_r2r (mm4, mm2); /* m32:m22|m12:m02 - interleave to produce result 3 */ - movq_r2m(mm7, tmp7); /* save tmp07 */ - movq_r2r(mm2, mm5); /* write result 3 */ + movq_r2m (mm7, tmp7); /* save tmp07 */ + movq_r2r (mm2, mm5); /* write result 3 */ - movq_r2m(mm6, tmp6); /* save tmp06 */ + movq_r2m (mm6, tmp6); /* save tmp06 */ - punpckhdq_r2r(mm4, mm3); /* m33:m23|m13:m03 - interleave to produce result 4 */ + punpckhdq_r2r (mm4, mm3); /* m33:m23|m13:m03 - interleave to produce result 4 */ - paddw_m2r(*(dataptr+10), mm2); /* tmp02=x2+x5: stage 1 */ - movq_r2r(mm3, mm4); /* write result 4 */ + paddw_m2r (*(dataptr + 10), mm2); /* tmp02=x2+x5: stage 1 */ + movq_r2r (mm3, mm4); /* write result 4 */ /************************************************************************************************ End of Transpose 2 ************************************************************************************************/ - paddw_m2r(*(dataptr+8), mm3); /* tmp03=x3+x4: stage 1 */ - movq_r2r(mm0, mm7); + paddw_m2r (*(dataptr + 8), mm3); /* tmp03=x3+x4: stage 1 */ + movq_r2r (mm0, mm7); - psubw_m2r(*(dataptr+8), mm4); /* tmp04=x3-x4: stage 1 */ - movq_r2r(mm1, mm6); + psubw_m2r (*(dataptr + 8), mm4); /* tmp04=x3-x4: stage 1 */ + movq_r2r (mm1, mm6); - paddw_r2r(mm3, mm0); /* tmp10 = tmp00 + tmp03: even 2 */ - psubw_r2r(mm3, mm7); /* tmp13 = tmp00 - tmp03: even 2 */ + paddw_r2r (mm3, mm0); /* tmp10 = tmp00 + tmp03: even 2 */ + psubw_r2r (mm3, mm7); /* tmp13 = tmp00 - tmp03: even 2 */ - psubw_r2r(mm2, mm6); /* tmp12 = tmp01 - tmp02: even 2 */ - paddw_r2r(mm2, mm1); /* tmp11 = tmp01 + tmp02: even 2 */ + psubw_r2r (mm2, mm6); /* tmp12 = tmp01 - tmp02: even 2 */ + paddw_r2r (mm2, mm1); /* tmp11 = tmp01 + tmp02: even 2 */ - psubw_m2r(*(dataptr+10), mm5); /* tmp05=x2-x5: stage 1 */ - paddw_r2r(mm7, mm6); /* tmp12 + tmp13 */ + psubw_m2r (*(dataptr + 10), mm5); /* tmp05=x2-x5: stage 1 */ + paddw_r2r (mm7, mm6); /* tmp12 + tmp13 */ - /* stage 3 */ + /* stage 3 */ - movq_m2r(tmp6, mm2); - movq_r2r(mm0, mm3); + movq_m2r (tmp6, mm2); + movq_r2r (mm0, mm3); - psllw_i2r(2, mm6); /* m8 * 2^2 */ - paddw_r2r(mm1, mm0); + psllw_i2r (2, mm6); /* m8 * 2^2 */ + paddw_r2r (mm1, mm0); - pmulhw_m2r(RTjpeg_C4, mm6); /* z1 */ - psubw_r2r(mm1, mm3); + pmulhw_m2r (RTjpeg_C4, mm6); /* z1 */ + psubw_r2r (mm1, mm3); - movq_r2m(mm0, *dataptr); - movq_r2r(mm7, mm0); - - /* Odd part */ - movq_r2m(mm3, *(dataptr+8)); - paddw_r2r(mm5, mm4); /* tmp10 */ + movq_r2m (mm0, *dataptr); + movq_r2r (mm7, mm0); - movq_m2r(tmp7, mm3); - paddw_r2r(mm6, mm0); /* tmp32 */ + /* Odd part */ + movq_r2m (mm3, *(dataptr + 8)); + paddw_r2r (mm5, mm4); /* tmp10 */ - paddw_r2r(mm2, mm5); /* tmp11 */ - psubw_r2r(mm6, mm7); /* tmp33 */ + movq_m2r (tmp7, mm3); + paddw_r2r (mm6, mm0); /* tmp32 */ - movq_r2m(mm0, *(dataptr+4)); - paddw_r2r(mm3, mm2); /* tmp12 */ + paddw_r2r (mm2, mm5); /* tmp11 */ + psubw_r2r (mm6, mm7); /* tmp33 */ - /* stage 4 */ - movq_r2m(mm7, *(dataptr+12)); - movq_r2r(mm4, mm1); /* copy of tmp10 */ + movq_r2m (mm0, *(dataptr + 4)); + paddw_r2r (mm3, mm2); /* tmp12 */ - psubw_r2r(mm2, mm1); /* tmp10 - tmp12 */ - psllw_i2r(2, mm4); /* m8 * 2^2 */ + /* stage 4 */ + movq_r2m (mm7, *(dataptr + 12)); + movq_r2r (mm4, mm1); /* copy of tmp10 */ - movq_m2r(RTjpeg_C2mC6, mm0); - psllw_i2r(2, mm1); + psubw_r2r (mm2, mm1); /* tmp10 - tmp12 */ + psllw_i2r (2, mm4); /* m8 * 2^2 */ - pmulhw_m2r(RTjpeg_C6, mm1); /* z5 */ - psllw_i2r(2, mm2); + movq_m2r (RTjpeg_C2mC6, mm0); + psllw_i2r (2, mm1); - pmulhw_r2r(mm0, mm4); /* z5 */ + pmulhw_m2r (RTjpeg_C6, mm1); /* z5 */ + psllw_i2r (2, mm2); - /* stage 5 */ + pmulhw_r2r (mm0, mm4); /* z5 */ - pmulhw_m2r(RTjpeg_C2pC6, mm2); - psllw_i2r(2, mm5); + /* stage 5 */ - pmulhw_m2r(RTjpeg_C4, mm5); /* z3 */ - movq_r2r(mm3, mm0); /* copy tmp7 */ + pmulhw_m2r (RTjpeg_C2pC6, mm2); + psllw_i2r (2, mm5); - movq_m2r(*(dataptr+1), mm7); - paddw_r2r(mm1, mm4); /* z2 */ + pmulhw_m2r (RTjpeg_C4, mm5); /* z3 */ + movq_r2r (mm3, mm0); /* copy tmp7 */ - paddw_r2r(mm1, mm2); /* z4 */ + movq_m2r (*(dataptr + 1), mm7); + paddw_r2r (mm1, mm4); /* z2 */ - paddw_r2r(mm5, mm0); /* z11 */ - psubw_r2r(mm5, mm3); /* z13 */ + paddw_r2r (mm1, mm2); /* z4 */ - /* stage 6 */ + paddw_r2r (mm5, mm0); /* z11 */ + psubw_r2r (mm5, mm3); /* z13 */ - movq_r2r(mm3, mm5); /* copy z13 */ - psubw_r2r(mm4, mm3); /* y3=z13 - z2 */ + /* stage 6 */ - paddw_r2r(mm4, mm5); /* y5=z13 + z2 */ - movq_r2r(mm0, mm6); /* copy z11 */ + movq_r2r (mm3, mm5); /* copy z13 */ + psubw_r2r (mm4, mm3); /* y3=z13 - z2 */ - movq_r2m(mm3, *(dataptr+6)); /*save y3 */ - psubw_r2r(mm2, mm0); /* y7=z11 - z4 */ + paddw_r2r (mm4, mm5); /* y5=z13 + z2 */ + movq_r2r (mm0, mm6); /* copy z11 */ - movq_r2m(mm5, *(dataptr+10)); /*save y5 */ - paddw_r2r(mm2, mm6); /* y1=z11 + z4 */ + movq_r2m (mm3, *(dataptr + 6)); /*save y3 */ + psubw_r2r (mm2, mm0); /* y7=z11 - z4 */ - movq_r2m(mm0, *(dataptr+14)); /*save y7 */ + movq_r2m (mm5, *(dataptr + 10)); /*save y5 */ + paddw_r2r (mm2, mm6); /* y1=z11 + z4 */ + + movq_r2m (mm0, *(dataptr + 14)); /*save y7 */ /************************************************ * End of 1st 4 rows ************************************************/ - movq_m2r(*(dataptr+3), mm1); /* load x1 : stage 1 */ - movq_r2r(mm7, mm0); /* copy x0 */ + movq_m2r (*(dataptr + 3), mm1); /* load x1 : stage 1 */ + movq_r2r (mm7, mm0); /* copy x0 */ + + movq_r2m (mm6, *(dataptr + 2)); /*save y1 */ - movq_r2m(mm6, *(dataptr+2)); /*save y1 */ + movq_m2r (*(dataptr + 5), mm2); /* load x2 : stage 1 */ + movq_r2r (mm1, mm6); /* copy x1 */ - movq_m2r(*(dataptr+5), mm2); /* load x2 : stage 1 */ - movq_r2r(mm1, mm6); /* copy x1 */ + paddw_m2r (*(dataptr + 15), mm0); /* tmp00 = x0 + x7 */ - paddw_m2r(*(dataptr+15), mm0); /* tmp00 = x0 + x7 */ + movq_m2r (*(dataptr + 7), mm3); /* load x3 : stage 1 */ + movq_r2r (mm2, mm5); /* copy x2 */ - movq_m2r(*(dataptr+7), mm3); /* load x3 : stage 1 */ - movq_r2r(mm2, mm5); /* copy x2 */ + psubw_m2r (*(dataptr + 15), mm7); /* tmp07 = x0 - x7 */ + movq_r2r (mm3, mm4); /* copy x3 */ - psubw_m2r(*(dataptr+15), mm7); /* tmp07 = x0 - x7 */ - movq_r2r(mm3, mm4); /* copy x3 */ + paddw_m2r (*(dataptr + 13), mm1); /* tmp01 = x1 + x6 */ - paddw_m2r(*(dataptr+13), mm1); /* tmp01 = x1 + x6 */ + movq_r2m (mm7, tmp7); /* save tmp07 */ + movq_r2r (mm0, mm7); /* copy tmp00 */ - movq_r2m(mm7, tmp7); /* save tmp07 */ - movq_r2r(mm0, mm7); /* copy tmp00 */ + psubw_m2r (*(dataptr + 13), mm6); /* tmp06 = x1 - x6 */ - psubw_m2r(*(dataptr+13), mm6); /* tmp06 = x1 - x6 */ + /* stage 2, Even Part */ - /* stage 2, Even Part */ + paddw_m2r (*(dataptr + 9), mm3); /* tmp03 = x3 + x4 */ - paddw_m2r(*(dataptr+9), mm3); /* tmp03 = x3 + x4 */ + movq_r2m (mm6, tmp6); /* save tmp07 */ + movq_r2r (mm1, mm6); /* copy tmp01 */ - movq_r2m(mm6, tmp6); /* save tmp07 */ - movq_r2r(mm1, mm6); /* copy tmp01 */ + paddw_m2r (*(dataptr + 11), mm2); /* tmp02 = x2 + x5 */ + paddw_r2r (mm3, mm0); /* tmp10 = tmp00 + tmp03 */ - paddw_m2r(*(dataptr+11), mm2); /* tmp02 = x2 + x5 */ - paddw_r2r(mm3, mm0); /* tmp10 = tmp00 + tmp03 */ + psubw_r2r (mm3, mm7); /* tmp13 = tmp00 - tmp03 */ - psubw_r2r(mm3, mm7); /* tmp13 = tmp00 - tmp03 */ + psubw_m2r (*(dataptr + 9), mm4); /* tmp04 = x3 - x4 */ + psubw_r2r (mm2, mm6); /* tmp12 = tmp01 - tmp02 */ - psubw_m2r(*(dataptr+9), mm4); /* tmp04 = x3 - x4 */ - psubw_r2r(mm2, mm6); /* tmp12 = tmp01 - tmp02 */ + paddw_r2r (mm2, mm1); /* tmp11 = tmp01 + tmp02 */ - paddw_r2r(mm2, mm1); /* tmp11 = tmp01 + tmp02 */ + psubw_m2r (*(dataptr + 11), mm5); /* tmp05 = x2 - x5 */ + paddw_r2r (mm7, mm6); /* tmp12 + tmp13 */ - psubw_m2r(*(dataptr+11), mm5); /* tmp05 = x2 - x5 */ - paddw_r2r(mm7, mm6); /* tmp12 + tmp13 */ + /* stage 3, Even and stage 4 & 5 even */ - /* stage 3, Even and stage 4 & 5 even */ + movq_m2r (tmp6, mm2); /* load tmp6 */ + movq_r2r (mm0, mm3); /* copy tmp10 */ - movq_m2r(tmp6, mm2); /* load tmp6 */ - movq_r2r(mm0, mm3); /* copy tmp10 */ + psllw_i2r (2, mm6); /* shift z1 */ + paddw_r2r (mm1, mm0); /* y0=tmp10 + tmp11 */ - psllw_i2r(2, mm6); /* shift z1 */ - paddw_r2r(mm1, mm0); /* y0=tmp10 + tmp11 */ + pmulhw_m2r (RTjpeg_C4, mm6); /* z1 */ + psubw_r2r (mm1, mm3); /* y4=tmp10 - tmp11 */ - pmulhw_m2r(RTjpeg_C4, mm6); /* z1 */ - psubw_r2r(mm1, mm3); /* y4=tmp10 - tmp11 */ + movq_r2m (mm0, *(dataptr + 1)); /*save y0 */ + movq_r2r (mm7, mm0); /* copy tmp13 */ - movq_r2m(mm0, *(dataptr+1)); /*save y0 */ - movq_r2r(mm7, mm0); /* copy tmp13 */ - - /* odd part */ + /* odd part */ - movq_r2m(mm3, *(dataptr+9)); /*save y4 */ - paddw_r2r(mm5, mm4); /* tmp10 = tmp4 + tmp5 */ + movq_r2m (mm3, *(dataptr + 9)); /*save y4 */ + paddw_r2r (mm5, mm4); /* tmp10 = tmp4 + tmp5 */ - movq_m2r(tmp7, mm3); /* load tmp7 */ - paddw_r2r(mm6, mm0); /* tmp32 = tmp13 + z1 */ + movq_m2r (tmp7, mm3); /* load tmp7 */ + paddw_r2r (mm6, mm0); /* tmp32 = tmp13 + z1 */ - paddw_r2r(mm2, mm5); /* tmp11 = tmp5 + tmp6 */ - psubw_r2r(mm6, mm7); /* tmp33 = tmp13 - z1 */ + paddw_r2r (mm2, mm5); /* tmp11 = tmp5 + tmp6 */ + psubw_r2r (mm6, mm7); /* tmp33 = tmp13 - z1 */ - movq_r2m(mm0, *(dataptr+5)); /*save y2 */ - paddw_r2r(mm3, mm2); /* tmp12 = tmp6 + tmp7 */ + movq_r2m (mm0, *(dataptr + 5)); /*save y2 */ + paddw_r2r (mm3, mm2); /* tmp12 = tmp6 + tmp7 */ - /* stage 4 */ + /* stage 4 */ - movq_r2m(mm7, *(dataptr+13)); /*save y6 */ - movq_r2r(mm4, mm1); /* copy tmp10 */ + movq_r2m (mm7, *(dataptr + 13)); /*save y6 */ + movq_r2r (mm4, mm1); /* copy tmp10 */ - psubw_r2r(mm2, mm1); /* tmp10 - tmp12 */ - psllw_i2r(2, mm4); /* shift tmp10 */ + psubw_r2r (mm2, mm1); /* tmp10 - tmp12 */ + psllw_i2r (2, mm4); /* shift tmp10 */ - movq_m2r(RTjpeg_C2mC6, mm0); /* load C2mC6 */ - psllw_i2r(2, mm1); /* shift (tmp10-tmp12) */ + movq_m2r (RTjpeg_C2mC6, mm0); /* load C2mC6 */ + psllw_i2r (2, mm1); /* shift (tmp10-tmp12) */ - pmulhw_m2r(RTjpeg_C6, mm1); /* z5 */ - psllw_i2r(2, mm5); /* prepare for multiply */ + pmulhw_m2r (RTjpeg_C6, mm1); /* z5 */ + psllw_i2r (2, mm5); /* prepare for multiply */ - pmulhw_r2r(mm0, mm4); /* multiply by converted real */ + pmulhw_r2r (mm0, mm4); /* multiply by converted real */ - /* stage 5 */ + /* stage 5 */ - pmulhw_m2r(RTjpeg_C4, mm5); /* z3 */ - psllw_i2r(2, mm2); /* prepare for multiply */ + pmulhw_m2r (RTjpeg_C4, mm5); /* z3 */ + psllw_i2r (2, mm2); /* prepare for multiply */ - pmulhw_m2r(RTjpeg_C2pC6, mm2); /* multiply */ - movq_r2r(mm3, mm0); /* copy tmp7 */ + pmulhw_m2r (RTjpeg_C2pC6, mm2); /* multiply */ + movq_r2r (mm3, mm0); /* copy tmp7 */ - movq_m2r(*(dataptr+9), mm7); /* m03:m02|m01:m00 - first line (line 4)and copy into mm7 */ - paddw_r2r(mm1, mm4); /* z2 */ + movq_m2r (*(dataptr + 9), mm7); /* m03:m02|m01:m00 - first line (line 4)and copy into mm7 */ + paddw_r2r (mm1, mm4); /* z2 */ - paddw_r2r(mm5, mm0); /* z11 */ - psubw_r2r(mm5, mm3); /* z13 */ + paddw_r2r (mm5, mm0); /* z11 */ + psubw_r2r (mm5, mm3); /* z13 */ - /* stage 6 */ + /* stage 6 */ - movq_r2r(mm3, mm5); /* copy z13 */ - paddw_r2r(mm1, mm2); /* z4 */ + movq_r2r (mm3, mm5); /* copy z13 */ + paddw_r2r (mm1, mm2); /* z4 */ - movq_r2r(mm0, mm6); /* copy z11 */ - psubw_r2r(mm4, mm5); /* y3 */ + movq_r2r (mm0, mm6); /* copy z11 */ + psubw_r2r (mm4, mm5); /* y3 */ - paddw_r2r(mm2, mm6); /* y1 */ - paddw_r2r(mm4, mm3); /* y5 */ + paddw_r2r (mm2, mm6); /* y1 */ + paddw_r2r (mm4, mm3); /* y5 */ - movq_r2m(mm5, *(dataptr+7)); /*save y3 */ - psubw_r2r(mm2, mm0); /* yè=z11 - z4 */ + movq_r2m (mm5, *(dataptr + 7)); /*save y3 */ + psubw_r2r (mm2, mm0); /* yè=z11 - z4 */ - movq_r2m(mm3, *(dataptr+11)); /*save y5 */ + movq_r2m (mm3, *(dataptr + 11)); /*save y5 */ - movq_r2m(mm6, *(dataptr+3)); /*save y1 */ + movq_r2m (mm6, *(dataptr + 3)); /*save y1 */ + + movq_r2m (mm0, *(dataptr + 15)); /*save y7 */ - movq_r2m(mm0, *(dataptr+15)); /*save y7 */ - #endif } -#define FIX_1_082392200 ((__s32) 277) /* FIX(1.082392200) */ -#define FIX_1_414213562 ((__s32) 362) /* FIX(1.414213562) */ -#define FIX_1_847759065 ((__s32) 473) /* FIX(1.847759065) */ -#define FIX_2_613125930 ((__s32) 669) /* FIX(2.613125930) */ +#define FIX_1_082392200 ((__s32) 277) /* FIX(1.082392200) */ +#define FIX_1_414213562 ((__s32) 362) /* FIX(1.414213562) */ +#define FIX_1_847759065 ((__s32) 473) /* FIX(1.847759065) */ +#define FIX_2_613125930 ((__s32) 669) /* FIX(2.613125930) */ #define DESCALE(x) (__s16)( ((x)+4) >> 3) @@ -1226,284 +1232,283 @@ void RTjpeg_dctY(__u8 *idata, __s16 *odata, int rskip) #define RL(x) ((x)>235) ? 235 : (((x)<16) ? 16 : (x)) #define MULTIPLY(var,const) (((__s32) ((var) * (const)) + 128)>>8) -void RTjpeg_idct_init(void) +void +RTjpeg_idct_init (void) { - int i; - - for(i=0; i<64; i++) - { - RTjpeg_liqt[i]=((__u64)RTjpeg_liqt[i]*RTjpeg_aan_tab[i])>>32; - RTjpeg_ciqt[i]=((__u64)RTjpeg_ciqt[i]*RTjpeg_aan_tab[i])>>32; - } + int i; + + for (i = 0; i < 64; i++) { + RTjpeg_liqt[i] = ((__u64) RTjpeg_liqt[i] * RTjpeg_aan_tab[i]) >> 32; + RTjpeg_ciqt[i] = ((__u64) RTjpeg_ciqt[i] * RTjpeg_aan_tab[i]) >> 32; + } } -void RTjpeg_idct(__u8 *odata, __s16 *data, int rskip) +void +RTjpeg_idct (__u8 * odata, __s16 * data, int rskip) { #ifdef HAVE_LIBMMX -static mmx_t fix_141 = (mmx_t)(long long)0x5a825a825a825a82LL; -static mmx_t fix_184n261 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; -static mmx_t fix_184 = (mmx_t)(long long)0x7641764176417641LL; -static mmx_t fix_n184 = (mmx_t)(long long)0x896f896f896f896fLL; -static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; + static mmx_t fix_141 = (mmx_t) (long long) 0x5a825a825a825a82LL; + static mmx_t fix_184n261 = (mmx_t) (long long) 0xcf04cf04cf04cf04LL; + static mmx_t fix_184 = (mmx_t) (long long) 0x7641764176417641LL; + static mmx_t fix_n184 = (mmx_t) (long long) 0x896f896f896f896fLL; + static mmx_t fix_108n184 = (mmx_t) (long long) 0xcf04cf04cf04cf04LL; mmx_t workspace[64]; mmx_t *wsptr = workspace; - register mmx_t *dataptr = (mmx_t *)odata; - mmx_t *idata = (mmx_t *)data; + register mmx_t *dataptr = (mmx_t *) odata; + mmx_t *idata = (mmx_t *) data; - rskip = rskip>>3; + rskip = rskip >> 3; /* * Perform inverse DCT on one block of coefficients. */ - /* Odd part */ + /* Odd part */ + + movq_m2r (*(idata + 10), mm1); /* load idata[DCTSIZE*5] */ - movq_m2r(*(idata+10), mm1); /* load idata[DCTSIZE*5] */ + movq_m2r (*(idata + 6), mm0); /* load idata[DCTSIZE*3] */ - movq_m2r(*(idata+6), mm0); /* load idata[DCTSIZE*3] */ + movq_m2r (*(idata + 2), mm3); /* load idata[DCTSIZE*1] */ - movq_m2r(*(idata+2), mm3); /* load idata[DCTSIZE*1] */ + movq_r2r (mm1, mm2); /* copy tmp6 : phase 6 */ + */movq_m2r (*(idata + 14), mm4); /* load idata[DCTSIZE*7] */ - movq_r2r(mm1, mm2); /* copy tmp6 : phase 6 */ */ + paddw_r2r (mm0, mm1); /* z13 = tmp6 + tmp5; */ - movq_m2r(*(idata+14), mm4); /* load idata[DCTSIZE*7] */ + psubw_r2r (mm0, mm2); /* z10 = tmp6 - tmp5 */ - paddw_r2r(mm0, mm1); /* z13 = tmp6 + tmp5; */ + psllw_i2r (2, mm2); /* shift z10 */ + movq_r2r (mm2, mm0); /* copy z10 */ - psubw_r2r(mm0, mm2); /* z10 = tmp6 - tmp5 */ + pmulhw_m2r (fix_184n261, mm2); /* MULTIPLY( z12, FIX_1_847759065); : 2*c2 */ + movq_r2r (mm3, mm5); /* copy tmp4 */ - psllw_i2r(2, mm2); /* shift z10 */ - movq_r2r(mm2, mm0); /* copy z10 */ + pmulhw_m2r (fix_n184, mm0); /* MULTIPLY(z10, -FIX_1_847759065); : 2*c2 */ + paddw_r2r (mm4, mm3); /* z11 = tmp4 + tmp7; */ - pmulhw_m2r(fix_184n261, mm2); /* MULTIPLY( z12, FIX_1_847759065); : 2*c2 */ - movq_r2r(mm3, mm5); /* copy tmp4 */ + movq_r2r (mm3, mm6); /* copy z11 : phase 5 */ + psubw_r2r (mm4, mm5); /* z12 = tmp4 - tmp7; */ - pmulhw_m2r(fix_n184, mm0); /* MULTIPLY(z10, -FIX_1_847759065); : 2*c2 */ - paddw_r2r(mm4, mm3); /* z11 = tmp4 + tmp7; */ + psubw_r2r (mm1, mm6); /* z11-z13 */ + psllw_i2r (2, mm5); /* shift z12 */ - movq_r2r(mm3, mm6); /* copy z11 : phase 5 */ - psubw_r2r(mm4, mm5); /* z12 = tmp4 - tmp7; */ + movq_m2r (*(idata + 12), mm4); /* load idata[DCTSIZE*6], even part */ + movq_r2r (mm5, mm7); /* copy z12 */ - psubw_r2r(mm1, mm6); /* z11-z13 */ - psllw_i2r(2, mm5); /* shift z12 */ + pmulhw_m2r (fix_108n184, mm5); /* MULT(z12, (FIX_1_08-FIX_1_84)) //- z5; 2*(c2-c6): even part */ + paddw_r2r (mm1, mm3); /* tmp7 = z11 + z13; */ - movq_m2r(*(idata+12), mm4); /* load idata[DCTSIZE*6], even part */ - movq_r2r(mm5, mm7); /* copy z12 */ + /*ok */ - pmulhw_m2r(fix_108n184, mm5); /* MULT(z12, (FIX_1_08-FIX_1_84)) //- z5; 2*(c2-c6): even part */ - paddw_r2r(mm1, mm3); /* tmp7 = z11 + z13; */ + /* Even part */ + pmulhw_m2r (fix_184, mm7); /* MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) //+ z5; -2*(c2+c6) */ + psllw_i2r (2, mm6); - /*ok */ + movq_m2r (*(idata + 4), mm1); /* load idata[DCTSIZE*2] */ - /* Even part */ - pmulhw_m2r(fix_184, mm7); /* MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) //+ z5; -2*(c2+c6) */ - psllw_i2r(2, mm6); + paddw_r2r (mm5, mm0); /* tmp10 */ - movq_m2r(*(idata+4), mm1); /* load idata[DCTSIZE*2] */ + paddw_r2r (mm7, mm2); /* tmp12 */ - paddw_r2r(mm5, mm0); /* tmp10 */ + pmulhw_m2r (fix_141, mm6); /* tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); 2*c4 */ + psubw_r2r (mm3, mm2); /* tmp6 = tmp12 - tmp7 */ - paddw_r2r(mm7, mm2); /* tmp12 */ + movq_r2r (mm1, mm5); /* copy tmp1 */ + paddw_r2r (mm4, mm1); /* tmp13= tmp1 + tmp3; phases 5-3 */ - pmulhw_m2r(fix_141, mm6); /* tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); 2*c4 */ - psubw_r2r(mm3, mm2); /* tmp6 = tmp12 - tmp7 */ + psubw_r2r (mm4, mm5); /* tmp1-tmp3 */ + psubw_r2r (mm2, mm6); /* tmp5 = tmp11 - tmp6; */ - movq_r2r(mm1, mm5); /* copy tmp1 */ - paddw_r2r(mm4, mm1); /* tmp13= tmp1 + tmp3; phases 5-3 */ + movq_r2m (mm1, *(wsptr)); /* save tmp13 in workspace */ + psllw_i2r (2, mm5); /* shift tmp1-tmp3 */ - psubw_r2r(mm4, mm5); /* tmp1-tmp3 */ - psubw_r2r(mm2, mm6); /* tmp5 = tmp11 - tmp6; */ + movq_m2r (*(idata), mm7); /* load idata[DCTSIZE*0] */ - movq_r2m(mm1, *(wsptr)); /* save tmp13 in workspace */ - psllw_i2r(2, mm5); /* shift tmp1-tmp3 */ - - movq_m2r(*(idata), mm7); /* load idata[DCTSIZE*0] */ + pmulhw_m2r (fix_141, mm5); /* MULTIPLY(tmp1 - tmp3, FIX_1_414213562) */ + paddw_r2r (mm6, mm0); /* tmp4 = tmp10 + tmp5; */ - pmulhw_m2r(fix_141, mm5); /* MULTIPLY(tmp1 - tmp3, FIX_1_414213562) */ - paddw_r2r(mm6, mm0); /* tmp4 = tmp10 + tmp5; */ + movq_m2r (*(idata + 8), mm4); /* load idata[DCTSIZE*4] */ - movq_m2r(*(idata+8), mm4); /* load idata[DCTSIZE*4] */ - - psubw_r2r(mm1, mm5); /* tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; 2*c4 */ + psubw_r2r (mm1, mm5); /* tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; 2*c4 */ - movq_r2m(mm0, *(wsptr+4)); /* save tmp4 in workspace */ - movq_r2r(mm7, mm1); /* copy tmp0 : phase 3 */ + movq_r2m (mm0, *(wsptr + 4)); /* save tmp4 in workspace */ + movq_r2r (mm7, mm1); /* copy tmp0 : phase 3 */ - movq_r2m(mm5, *(wsptr+2)); /* save tmp12 in workspace */ - psubw_r2r(mm4, mm1); /* tmp11 = tmp0 - tmp2; */ + movq_r2m (mm5, *(wsptr + 2)); /* save tmp12 in workspace */ + psubw_r2r (mm4, mm1); /* tmp11 = tmp0 - tmp2; */ - paddw_r2r(mm4, mm7); /* tmp10 = tmp0 + tmp2; */ - movq_r2r(mm1, mm5); /* copy tmp11 */ - - paddw_m2r(*(wsptr+2), mm1); /* tmp1 = tmp11 + tmp12; */ - movq_r2r(mm7, mm4); /* copy tmp10 : phase 2 */ + paddw_r2r (mm4, mm7); /* tmp10 = tmp0 + tmp2; */ + movq_r2r (mm1, mm5); /* copy tmp11 */ - paddw_m2r(*(wsptr), mm7); /* tmp0 = tmp10 + tmp13; */ + paddw_m2r (*(wsptr + 2), mm1); /* tmp1 = tmp11 + tmp12; */ + movq_r2r (mm7, mm4); /* copy tmp10 : phase 2 */ - psubw_m2r(*(wsptr), mm4); /* tmp3 = tmp10 - tmp13; */ - movq_r2r(mm7, mm0); /* copy tmp0 */ + paddw_m2r (*(wsptr), mm7); /* tmp0 = tmp10 + tmp13; */ - psubw_m2r(*(wsptr+2), mm5); /* tmp2 = tmp11 - tmp12; */ - paddw_r2r(mm3, mm7); /* wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); */ - - psubw_r2r(mm3, mm0); /* wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); */ + psubw_m2r (*(wsptr), mm4); /* tmp3 = tmp10 - tmp13; */ + movq_r2r (mm7, mm0); /* copy tmp0 */ - movq_r2m(mm7, *(wsptr)); /* wsptr[DCTSIZE*0] */ - movq_r2r(mm1, mm3); /* copy tmp1 */ + psubw_m2r (*(wsptr + 2), mm5); /* tmp2 = tmp11 - tmp12; */ + paddw_r2r (mm3, mm7); /* wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); */ - movq_r2m(mm0, *(wsptr+14)); /* wsptr[DCTSIZE*7] */ - paddw_r2r(mm2, mm1); /* wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); */ + psubw_r2r (mm3, mm0); /* wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); */ - psubw_r2r(mm2, mm3); /* wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); */ + movq_r2m (mm7, *(wsptr)); /* wsptr[DCTSIZE*0] */ + movq_r2r (mm1, mm3); /* copy tmp1 */ - movq_r2m(mm1, *(wsptr+2)); /* wsptr[DCTSIZE*1] */ - movq_r2r(mm4, mm1); /* copy tmp3 */ + movq_r2m (mm0, *(wsptr + 14)); /* wsptr[DCTSIZE*7] */ + paddw_r2r (mm2, mm1); /* wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); */ - movq_r2m(mm3, *(wsptr+12)); /* wsptr[DCTSIZE*6] */ + psubw_r2r (mm2, mm3); /* wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); */ - paddw_m2r(*(wsptr+4), mm4); /* wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); */ + movq_r2m (mm1, *(wsptr + 2)); /* wsptr[DCTSIZE*1] */ + movq_r2r (mm4, mm1); /* copy tmp3 */ - psubw_m2r(*(wsptr+4), mm1); /* wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); */ + movq_r2m (mm3, *(wsptr + 12)); /* wsptr[DCTSIZE*6] */ - movq_r2m(mm4, *(wsptr+8)); - movq_r2r(mm5, mm7); /* copy tmp2 */ + paddw_m2r (*(wsptr + 4), mm4); /* wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); */ - paddw_r2r(mm6, mm5); /* wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5) */ + psubw_m2r (*(wsptr + 4), mm1); /* wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); */ - movq_r2m(mm1, *(wsptr+6)); - psubw_r2r(mm6, mm7); /* wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); */ + movq_r2m (mm4, *(wsptr + 8)); + movq_r2r (mm5, mm7); /* copy tmp2 */ - movq_r2m(mm5, *(wsptr+4)); + paddw_r2r (mm6, mm5); /* wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5) */ - movq_r2m(mm7, *(wsptr+10)); + movq_r2m (mm1, *(wsptr + 6)); + psubw_r2r (mm6, mm7); /* wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); */ - /*ok */ + movq_r2m (mm5, *(wsptr + 4)); + + movq_r2m (mm7, *(wsptr + 10)); + + /*ok */ /*****************************************************************/ - idata++; - wsptr++; + idata++; + wsptr++; /*****************************************************************/ - movq_m2r(*(idata+10), mm1); /* load idata[DCTSIZE*5] */ + movq_m2r (*(idata + 10), mm1); /* load idata[DCTSIZE*5] */ + + movq_m2r (*(idata + 6), mm0); /* load idata[DCTSIZE*3] */ + + movq_m2r (*(idata + 2), mm3); /* load idata[DCTSIZE*1] */ + movq_r2r (mm1, mm2); /* copy tmp6 : phase 6 */ + */movq_m2r (*(idata + 14), mm4); /* load idata[DCTSIZE*7] */ + paddw_r2r (mm0, mm1); /* z13 = tmp6 + tmp5; */ - movq_m2r(*(idata+6), mm0); /* load idata[DCTSIZE*3] */ + psubw_r2r (mm0, mm2); /* z10 = tmp6 - tmp5 */ - movq_m2r(*(idata+2), mm3); /* load idata[DCTSIZE*1] */ - movq_r2r(mm1, mm2); /* copy tmp6 : phase 6 */ */ + psllw_i2r (2, mm2); /* shift z10 */ + movq_r2r (mm2, mm0); /* copy z10 */ - movq_m2r(*(idata+14), mm4); /* load idata[DCTSIZE*7] */ - paddw_r2r(mm0, mm1); /* z13 = tmp6 + tmp5; */ + pmulhw_m2r (fix_184n261, mm2); /* MULTIPLY( z12, FIX_1_847759065); : 2*c2 */ + movq_r2r (mm3, mm5); /* copy tmp4 */ - psubw_r2r(mm0, mm2); /* z10 = tmp6 - tmp5 */ + pmulhw_m2r (fix_n184, mm0); /* MULTIPLY(z10, -FIX_1_847759065); : 2*c2 */ + paddw_r2r (mm4, mm3); /* z11 = tmp4 + tmp7; */ - psllw_i2r(2, mm2); /* shift z10 */ - movq_r2r(mm2, mm0); /* copy z10 */ + movq_r2r (mm3, mm6); /* copy z11 : phase 5 */ + psubw_r2r (mm4, mm5); /* z12 = tmp4 - tmp7; */ - pmulhw_m2r(fix_184n261, mm2); /* MULTIPLY( z12, FIX_1_847759065); : 2*c2 */ - movq_r2r(mm3, mm5); /* copy tmp4 */ + psubw_r2r (mm1, mm6); /* z11-z13 */ + psllw_i2r (2, mm5); /* shift z12 */ - pmulhw_m2r(fix_n184, mm0); /* MULTIPLY(z10, -FIX_1_847759065); : 2*c2 */ - paddw_r2r(mm4, mm3); /* z11 = tmp4 + tmp7; */ + movq_m2r (*(idata + 12), mm4); /* load idata[DCTSIZE*6], even part */ + movq_r2r (mm5, mm7); /* copy z12 */ - movq_r2r(mm3, mm6); /* copy z11 : phase 5 */ - psubw_r2r(mm4, mm5); /* z12 = tmp4 - tmp7; */ + pmulhw_m2r (fix_108n184, mm5); /* MULT(z12, (FIX_1_08-FIX_1_84)) //- z5; 2*(c2-c6) even part */ + paddw_r2r (mm1, mm3); /* tmp7 = z11 + z13; */ - psubw_r2r(mm1, mm6); /* z11-z13 */ - psllw_i2r(2, mm5); /* shift z12 */ + /*ok */ - movq_m2r(*(idata+12), mm4); /* load idata[DCTSIZE*6], even part */ - movq_r2r(mm5, mm7); /* copy z12 */ + /* Even part */ + pmulhw_m2r (fix_184, mm7); /* MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) //+ z5; -2*(c2+c6) */ + psllw_i2r (2, mm6); - pmulhw_m2r(fix_108n184, mm5); /* MULT(z12, (FIX_1_08-FIX_1_84)) //- z5; 2*(c2-c6) even part */ - paddw_r2r(mm1, mm3); /* tmp7 = z11 + z13; */ + movq_m2r (*(idata + 4), mm1); /* load idata[DCTSIZE*2] */ - /*ok */ + paddw_r2r (mm5, mm0); /* tmp10 */ - /* Even part */ - pmulhw_m2r(fix_184, mm7); /* MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) //+ z5; -2*(c2+c6) */ - psllw_i2r(2, mm6); + paddw_r2r (mm7, mm2); /* tmp12 */ - movq_m2r(*(idata+4), mm1); /* load idata[DCTSIZE*2] */ + pmulhw_m2r (fix_141, mm6); /* tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); 2*c4 */ + psubw_r2r (mm3, mm2); /* tmp6 = tmp12 - tmp7 */ - paddw_r2r(mm5, mm0); /* tmp10 */ + movq_r2r (mm1, mm5); /* copy tmp1 */ + paddw_r2r (mm4, mm1); /* tmp13= tmp1 + tmp3; phases 5-3 */ - paddw_r2r(mm7, mm2); /* tmp12 */ + psubw_r2r (mm4, mm5); /* tmp1-tmp3 */ + psubw_r2r (mm2, mm6); /* tmp5 = tmp11 - tmp6; */ - pmulhw_m2r(fix_141, mm6); /* tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); 2*c4 */ - psubw_r2r(mm3, mm2); /* tmp6 = tmp12 - tmp7 */ + movq_r2m (mm1, *(wsptr)); /* save tmp13 in workspace */ + psllw_i2r (2, mm5); /* shift tmp1-tmp3 */ - movq_r2r(mm1, mm5); /* copy tmp1 */ - paddw_r2r(mm4, mm1); /* tmp13= tmp1 + tmp3; phases 5-3 */ + movq_m2r (*(idata), mm7); /* load idata[DCTSIZE*0] */ + paddw_r2r (mm6, mm0); /* tmp4 = tmp10 + tmp5; */ - psubw_r2r(mm4, mm5); /* tmp1-tmp3 */ - psubw_r2r(mm2, mm6); /* tmp5 = tmp11 - tmp6; */ + pmulhw_m2r (fix_141, mm5); /* MULTIPLY(tmp1 - tmp3, FIX_1_414213562) */ - movq_r2m(mm1, *(wsptr)); /* save tmp13 in workspace */ - psllw_i2r(2, mm5); /* shift tmp1-tmp3 */ - - movq_m2r(*(idata), mm7); /* load idata[DCTSIZE*0] */ - paddw_r2r(mm6, mm0); /* tmp4 = tmp10 + tmp5; */ + movq_m2r (*(idata + 8), mm4); /* load idata[DCTSIZE*4] */ - pmulhw_m2r(fix_141, mm5); /* MULTIPLY(tmp1 - tmp3, FIX_1_414213562) */ + psubw_r2r (mm1, mm5); /* tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; 2*c4 */ - movq_m2r(*(idata+8), mm4); /* load idata[DCTSIZE*4] */ - - psubw_r2r(mm1, mm5); /* tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; 2*c4 */ + movq_r2m (mm0, *(wsptr + 4)); /* save tmp4 in workspace */ + movq_r2r (mm7, mm1); /* copy tmp0: phase 3 */ - movq_r2m(mm0, *(wsptr+4)); /* save tmp4 in workspace */ - movq_r2r(mm7, mm1); /* copy tmp0: phase 3 */ + movq_r2m (mm5, *(wsptr + 2)); /* save tmp12 in workspace */ + psubw_r2r (mm4, mm1); /* tmp11 = tmp0 - tmp2; */ - movq_r2m(mm5, *(wsptr+2)); /* save tmp12 in workspace */ - psubw_r2r(mm4, mm1); /* tmp11 = tmp0 - tmp2; */ + paddw_r2r (mm4, mm7); /* tmp10 = tmp0 + tmp2; */ + movq_r2r (mm1, mm5); /* copy tmp11 */ - paddw_r2r(mm4, mm7); /* tmp10 = tmp0 + tmp2; */ - movq_r2r(mm1, mm5); /* copy tmp11 */ - - paddw_m2r(*(wsptr+2), mm1); /* tmp1 = tmp11 + tmp12; */ - movq_r2r(mm7, mm4); /* copy tmp10: phase 2 */ + paddw_m2r (*(wsptr + 2), mm1); /* tmp1 = tmp11 + tmp12; */ + movq_r2r (mm7, mm4); /* copy tmp10: phase 2 */ - paddw_m2r(*(wsptr), mm7); /* tmp0 = tmp10 + tmp13; */ + paddw_m2r (*(wsptr), mm7); /* tmp0 = tmp10 + tmp13; */ - psubw_m2r(*(wsptr), mm4); /* tmp3 = tmp10 - tmp13; */ - movq_r2r(mm7, mm0); /* copy tmp0 */ + psubw_m2r (*(wsptr), mm4); /* tmp3 = tmp10 - tmp13; */ + movq_r2r (mm7, mm0); /* copy tmp0 */ - psubw_m2r(*(wsptr+2), mm5); /* tmp2 = tmp11 - tmp12; */ - paddw_r2r(mm3, mm7); /* wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); */ - - psubw_r2r(mm3, mm0); /* wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); */ + psubw_m2r (*(wsptr + 2), mm5); /* tmp2 = tmp11 - tmp12; */ + paddw_r2r (mm3, mm7); /* wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); */ - movq_r2m(mm7, *(wsptr)); /* wsptr[DCTSIZE*0] */ - movq_r2r(mm1, mm3); /* copy tmp1 */ + psubw_r2r (mm3, mm0); /* wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); */ - movq_r2m(mm0, *(wsptr+14)); /* wsptr[DCTSIZE*7] */ - paddw_r2r(mm2, mm1); /* wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); */ + movq_r2m (mm7, *(wsptr)); /* wsptr[DCTSIZE*0] */ + movq_r2r (mm1, mm3); /* copy tmp1 */ - psubw_r2r(mm2, mm3); /* wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); */ + movq_r2m (mm0, *(wsptr + 14)); /* wsptr[DCTSIZE*7] */ + paddw_r2r (mm2, mm1); /* wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); */ - movq_r2m(mm1, *(wsptr+2)); /* wsptr[DCTSIZE*1] */ - movq_r2r(mm4, mm1); /* copy tmp3 */ + psubw_r2r (mm2, mm3); /* wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); */ - movq_r2m(mm3, *(wsptr+12)); /* wsptr[DCTSIZE*6] */ + movq_r2m (mm1, *(wsptr + 2)); /* wsptr[DCTSIZE*1] */ + movq_r2r (mm4, mm1); /* copy tmp3 */ - paddw_m2r(*(wsptr+4), mm4); /* wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); */ + movq_r2m (mm3, *(wsptr + 12)); /* wsptr[DCTSIZE*6] */ - psubw_m2r(*(wsptr+4), mm1); /* wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); */ + paddw_m2r (*(wsptr + 4), mm4); /* wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); */ - movq_r2m(mm4, *(wsptr+8)); - movq_r2r(mm5, mm7); /* copy tmp2 */ + psubw_m2r (*(wsptr + 4), mm1); /* wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); */ - paddw_r2r(mm6, mm5); /* wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5) */ + movq_r2m (mm4, *(wsptr + 8)); + movq_r2r (mm5, mm7); /* copy tmp2 */ - movq_r2m(mm1, *(wsptr+6)); - psubw_r2r(mm6, mm7); /* wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); */ + paddw_r2r (mm6, mm5); /* wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5) */ - movq_r2m(mm5, *(wsptr+4)); + movq_r2m (mm1, *(wsptr + 6)); + psubw_r2r (mm6, mm7); /* wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); */ - movq_r2m(mm7, *(wsptr+10)); + movq_r2m (mm5, *(wsptr + 4)); + + movq_r2m (mm7, *(wsptr + 10)); /*****************************************************************/ @@ -1512,258 +1517,258 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; /* and also undo the PASS1_BITS scaling. */ /*****************************************************************/ - /* Even part */ + /* Even part */ - wsptr--; + wsptr--; /* tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); */ /* tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); */ /* tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); */ /* tmp14 = ((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6]); */ - movq_m2r(*(wsptr), mm0); /* wsptr[0,0],[0,1],[0,2],[0,3] */ + movq_m2r (*(wsptr), mm0); /* wsptr[0,0],[0,1],[0,2],[0,3] */ + + movq_m2r (*(wsptr + 1), mm1); /* wsptr[0,4],[0,5],[0,6],[0,7] */ + movq_r2r (mm0, mm2); + + movq_m2r (*(wsptr + 2), mm3); /* wsptr[1,0],[1,1],[1,2],[1,3] */ + paddw_r2r (mm1, mm0); /* wsptr[0,tmp10],[xxx],[0,tmp13],[xxx] */ + + movq_m2r (*(wsptr + 3), mm4); /* wsptr[1,4],[1,5],[1,6],[1,7] */ + psubw_r2r (mm1, mm2); /* wsptr[0,tmp11],[xxx],[0,tmp14],[xxx] */ - movq_m2r(*(wsptr+1), mm1); /* wsptr[0,4],[0,5],[0,6],[0,7] */ - movq_r2r(mm0, mm2); - - movq_m2r(*(wsptr+2), mm3); /* wsptr[1,0],[1,1],[1,2],[1,3] */ - paddw_r2r(mm1, mm0); /* wsptr[0,tmp10],[xxx],[0,tmp13],[xxx] */ + movq_r2r (mm0, mm6); + movq_r2r (mm3, mm5); - movq_m2r(*(wsptr+3), mm4); /* wsptr[1,4],[1,5],[1,6],[1,7] */ - psubw_r2r(mm1, mm2); /* wsptr[0,tmp11],[xxx],[0,tmp14],[xxx] */ + paddw_r2r (mm4, mm3); /* wsptr[1,tmp10],[xxx],[1,tmp13],[xxx] */ + movq_r2r (mm2, mm1); - movq_r2r(mm0, mm6); - movq_r2r(mm3, mm5); - - paddw_r2r(mm4, mm3); /* wsptr[1,tmp10],[xxx],[1,tmp13],[xxx] */ - movq_r2r(mm2, mm1); + psubw_r2r (mm4, mm5); /* wsptr[1,tmp11],[xxx],[1,tmp14],[xxx] */ + punpcklwd_r2r (mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[xxx],[xxx] */ - psubw_r2r(mm4, mm5); /* wsptr[1,tmp11],[xxx],[1,tmp14],[xxx] */ - punpcklwd_r2r(mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[xxx],[xxx] */ + movq_m2r (*(wsptr + 7), mm7); /* wsptr[3,4],[3,5],[3,6],[3,7] */ + punpckhwd_r2r (mm3, mm6); /* wsptr[0,tmp13],[1,tmp13],[xxx],[xxx] */ - movq_m2r(*(wsptr+7), mm7); /* wsptr[3,4],[3,5],[3,6],[3,7] */ - punpckhwd_r2r(mm3, mm6); /* wsptr[0,tmp13],[1,tmp13],[xxx],[xxx] */ + movq_m2r (*(wsptr + 4), mm3); /* wsptr[2,0],[2,1],[2,2],[2,3] */ + punpckldq_r2r (mm6, mm0); /* wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13] */ - movq_m2r(*(wsptr+4), mm3); /* wsptr[2,0],[2,1],[2,2],[2,3] */ - punpckldq_r2r(mm6, mm0); /* wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13] */ + punpcklwd_r2r (mm5, mm1); /* wsptr[0,tmp11],[1,tmp11],[xxx],[xxx] */ + movq_r2r (mm3, mm4); - punpcklwd_r2r(mm5, mm1); /* wsptr[0,tmp11],[1,tmp11],[xxx],[xxx] */ - movq_r2r(mm3, mm4); + movq_m2r (*(wsptr + 6), mm6); /* wsptr[3,0],[3,1],[3,2],[3,3] */ + punpckhwd_r2r (mm5, mm2); /* wsptr[0,tmp14],[1,tmp14],[xxx],[xxx] */ - movq_m2r(*(wsptr+6), mm6); /* wsptr[3,0],[3,1],[3,2],[3,3] */ - punpckhwd_r2r(mm5, mm2); /* wsptr[0,tmp14],[1,tmp14],[xxx],[xxx] */ + movq_m2r (*(wsptr + 5), mm5); /* wsptr[2,4],[2,5],[2,6],[2,7] */ + punpckldq_r2r (mm2, mm1); /* wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14] */ - movq_m2r(*(wsptr+5), mm5); /* wsptr[2,4],[2,5],[2,6],[2,7] */ - punpckldq_r2r(mm2, mm1); /* wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14] */ - - paddw_r2r(mm5, mm3); /* wsptr[2,tmp10],[xxx],[2,tmp13],[xxx] */ - movq_r2r(mm6, mm2); + paddw_r2r (mm5, mm3); /* wsptr[2,tmp10],[xxx],[2,tmp13],[xxx] */ + movq_r2r (mm6, mm2); - psubw_r2r(mm5, mm4); /* wsptr[2,tmp11],[xxx],[2,tmp14],[xxx] */ - paddw_r2r(mm7, mm6); /* wsptr[3,tmp10],[xxx],[3,tmp13],[xxx] */ + psubw_r2r (mm5, mm4); /* wsptr[2,tmp11],[xxx],[2,tmp14],[xxx] */ + paddw_r2r (mm7, mm6); /* wsptr[3,tmp10],[xxx],[3,tmp13],[xxx] */ - movq_r2r(mm3, mm5); - punpcklwd_r2r(mm6, mm3); /* wsptr[2,tmp10],[3,tmp10],[xxx],[xxx] */ - - psubw_r2r(mm7, mm2); /* wsptr[3,tmp11],[xxx],[3,tmp14],[xxx] */ - punpckhwd_r2r(mm6, mm5); /* wsptr[2,tmp13],[3,tmp13],[xxx],[xxx] */ + movq_r2r (mm3, mm5); + punpcklwd_r2r (mm6, mm3); /* wsptr[2,tmp10],[3,tmp10],[xxx],[xxx] */ - movq_r2r(mm4, mm7); - punpckldq_r2r(mm5, mm3); /* wsptr[2,tmp10],[3,tmp10],[2,tmp13],[3,tmp13] */ - - punpcklwd_r2r(mm2, mm4); /* wsptr[2,tmp11],[3,tmp11],[xxx],[xxx] */ + psubw_r2r (mm7, mm2); /* wsptr[3,tmp11],[xxx],[3,tmp14],[xxx] */ + punpckhwd_r2r (mm6, mm5); /* wsptr[2,tmp13],[3,tmp13],[xxx],[xxx] */ - punpckhwd_r2r(mm2, mm7); /* wsptr[2,tmp14],[3,tmp14],[xxx],[xxx] */ + movq_r2r (mm4, mm7); + punpckldq_r2r (mm5, mm3); /* wsptr[2,tmp10],[3,tmp10],[2,tmp13],[3,tmp13] */ - punpckldq_r2r(mm7, mm4); /* wsptr[2,tmp11],[3,tmp11],[2,tmp14],[3,tmp14] */ - movq_r2r(mm1, mm6); + punpcklwd_r2r (mm2, mm4); /* wsptr[2,tmp11],[3,tmp11],[xxx],[xxx] */ - /*ok */ + punpckhwd_r2r (mm2, mm7); /* wsptr[2,tmp14],[3,tmp14],[xxx],[xxx] */ + + punpckldq_r2r (mm7, mm4); /* wsptr[2,tmp11],[3,tmp11],[2,tmp14],[3,tmp14] */ + movq_r2r (mm1, mm6); + + /*ok */ /* mm0 = ;wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13] */ /* mm1 = ;wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14] */ - movq_r2r(mm0, mm2); - punpckhdq_r2r(mm4, mm6); /* wsptr[0,tmp14],[1,tmp14],[2,tmp14],[3,tmp14] */ + movq_r2r (mm0, mm2); + punpckhdq_r2r (mm4, mm6); /* wsptr[0,tmp14],[1,tmp14],[2,tmp14],[3,tmp14] */ - punpckldq_r2r(mm4, mm1); /* wsptr[0,tmp11],[1,tmp11],[2,tmp11],[3,tmp11] */ - psllw_i2r(2, mm6); + punpckldq_r2r (mm4, mm1); /* wsptr[0,tmp11],[1,tmp11],[2,tmp11],[3,tmp11] */ + psllw_i2r (2, mm6); - pmulhw_m2r(fix_141, mm6); - punpckldq_r2r(mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[2,tmp10],[3,tmp10] */ + pmulhw_m2r (fix_141, mm6); + punpckldq_r2r (mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[2,tmp10],[3,tmp10] */ - punpckhdq_r2r(mm3, mm2); /* wsptr[0,tmp13],[1,tmp13],[2,tmp13],[3,tmp13] */ - movq_r2r(mm0, mm7); + punpckhdq_r2r (mm3, mm2); /* wsptr[0,tmp13],[1,tmp13],[2,tmp13],[3,tmp13] */ + movq_r2r (mm0, mm7); /* tmp0 = tmp10 + tmp13; */ /* tmp3 = tmp10 - tmp13; */ - paddw_r2r(mm2, mm0); /* [0,tmp0],[1,tmp0],[2,tmp0],[3,tmp0] */ - psubw_r2r(mm2, mm7); /* [0,tmp3],[1,tmp3],[2,tmp3],[3,tmp3] */ + paddw_r2r (mm2, mm0); /* [0,tmp0],[1,tmp0],[2,tmp0],[3,tmp0] */ + psubw_r2r (mm2, mm7); /* [0,tmp3],[1,tmp3],[2,tmp3],[3,tmp3] */ /* tmp12 = MULTIPLY(tmp14, FIX_1_414213562) - tmp13; */ - psubw_r2r(mm2, mm6); /* wsptr[0,tmp12],[1,tmp12],[2,tmp12],[3,tmp12] */ + psubw_r2r (mm2, mm6); /* wsptr[0,tmp12],[1,tmp12],[2,tmp12],[3,tmp12] */ /* tmp1 = tmp11 + tmp12; */ /* tmp2 = tmp11 - tmp12; */ - movq_r2r(mm1, mm5); + movq_r2r (mm1, mm5); - /*OK */ + /*OK */ - /* Odd part */ + /* Odd part */ /* z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; */ /* z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; */ /* z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; */ /* z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; */ - movq_m2r(*(wsptr), mm3); /* wsptr[0,0],[0,1],[0,2],[0,3] */ - paddw_r2r(mm6, mm1); /* [0,tmp1],[1,tmp1],[2,tmp1],[3,tmp1] */ + movq_m2r (*(wsptr), mm3); /* wsptr[0,0],[0,1],[0,2],[0,3] */ + paddw_r2r (mm6, mm1); /* [0,tmp1],[1,tmp1],[2,tmp1],[3,tmp1] */ - movq_m2r(*(wsptr+1), mm4); /* wsptr[0,4],[0,5],[0,6],[0,7] */ - psubw_r2r(mm6, mm5); /* [0,tmp2],[1,tmp2],[2,tmp2],[3,tmp2] */ + movq_m2r (*(wsptr + 1), mm4); /* wsptr[0,4],[0,5],[0,6],[0,7] */ + psubw_r2r (mm6, mm5); /* [0,tmp2],[1,tmp2],[2,tmp2],[3,tmp2] */ - movq_r2r(mm3, mm6); - punpckldq_r2r(mm4, mm3); /* wsptr[0,0],[0,1],[0,4],[0,5] */ + movq_r2r (mm3, mm6); + punpckldq_r2r (mm4, mm3); /* wsptr[0,0],[0,1],[0,4],[0,5] */ - punpckhdq_r2r(mm6, mm4); /* wsptr[0,6],[0,7],[0,2],[0,3] */ - movq_r2r(mm3, mm2); + punpckhdq_r2r (mm6, mm4); /* wsptr[0,6],[0,7],[0,2],[0,3] */ + movq_r2r (mm3, mm2); /*Save tmp0 and tmp1 in wsptr */ - movq_r2m(mm0, *(wsptr)); /* save tmp0 */ - paddw_r2r(mm4, mm2); /* wsptr[xxx],[0,z11],[xxx],[0,z13] */ + movq_r2m (mm0, *(wsptr)); /* save tmp0 */ + paddw_r2r (mm4, mm2); /* wsptr[xxx],[0,z11],[xxx],[0,z13] */ + - /*Continue with z10 --- z13 */ - movq_m2r(*(wsptr+2), mm6); /* wsptr[1,0],[1,1],[1,2],[1,3] */ - psubw_r2r(mm4, mm3); /* wsptr[xxx],[0,z12],[xxx],[0,z10] */ + movq_m2r (*(wsptr + 2), mm6); /* wsptr[1,0],[1,1],[1,2],[1,3] */ + psubw_r2r (mm4, mm3); /* wsptr[xxx],[0,z12],[xxx],[0,z10] */ - movq_m2r(*(wsptr+3), mm0); /* wsptr[1,4],[1,5],[1,6],[1,7] */ - movq_r2r(mm6, mm4); + movq_m2r (*(wsptr + 3), mm0); /* wsptr[1,4],[1,5],[1,6],[1,7] */ + movq_r2r (mm6, mm4); - movq_r2m(mm1, *(wsptr+1)); /* save tmp1 */ - punpckldq_r2r(mm0, mm6); /* wsptr[1,0],[1,1],[1,4],[1,5] */ + movq_r2m (mm1, *(wsptr + 1)); /* save tmp1 */ + punpckldq_r2r (mm0, mm6); /* wsptr[1,0],[1,1],[1,4],[1,5] */ + + punpckhdq_r2r (mm4, mm0); /* wsptr[1,6],[1,7],[1,2],[1,3] */ + movq_r2r (mm6, mm1); - punpckhdq_r2r(mm4, mm0); /* wsptr[1,6],[1,7],[1,2],[1,3] */ - movq_r2r(mm6, mm1); - /*Save tmp2 and tmp3 in wsptr */ - paddw_r2r(mm0, mm6); /* wsptr[xxx],[1,z11],[xxx],[1,z13] */ - movq_r2r(mm2, mm4); - + paddw_r2r (mm0, mm6); /* wsptr[xxx],[1,z11],[xxx],[1,z13] */ + movq_r2r (mm2, mm4); + /*Continue with z10 --- z13 */ - movq_r2m(mm5, *(wsptr+2)); /* save tmp2 */ - punpcklwd_r2r(mm6, mm2); /* wsptr[xxx],[xxx],[0,z11],[1,z11] */ + movq_r2m (mm5, *(wsptr + 2)); /* save tmp2 */ + punpcklwd_r2r (mm6, mm2); /* wsptr[xxx],[xxx],[0,z11],[1,z11] */ - psubw_r2r(mm0, mm1); /* wsptr[xxx],[1,z12],[xxx],[1,z10] */ - punpckhwd_r2r(mm6, mm4); /* wsptr[xxx],[xxx],[0,z13],[1,z13] */ + psubw_r2r (mm0, mm1); /* wsptr[xxx],[1,z12],[xxx],[1,z10] */ + punpckhwd_r2r (mm6, mm4); /* wsptr[xxx],[xxx],[0,z13],[1,z13] */ - movq_r2r(mm3, mm0); - punpcklwd_r2r(mm1, mm3); /* wsptr[xxx],[xxx],[0,z12],[1,z12] */ + movq_r2r (mm3, mm0); + punpcklwd_r2r (mm1, mm3); /* wsptr[xxx],[xxx],[0,z12],[1,z12] */ - movq_r2m(mm7, *(wsptr+3)); /* save tmp3 */ - punpckhwd_r2r(mm1, mm0); /* wsptr[xxx],[xxx],[0,z10],[1,z10] */ + movq_r2m (mm7, *(wsptr + 3)); /* save tmp3 */ + punpckhwd_r2r (mm1, mm0); /* wsptr[xxx],[xxx],[0,z10],[1,z10] */ - movq_m2r(*(wsptr+4), mm6); /* wsptr[2,0],[2,1],[2,2],[2,3] */ - punpckhdq_r2r(mm2, mm0); /* wsptr[0,z10],[1,z10],[0,z11],[1,z11] */ + movq_m2r (*(wsptr + 4), mm6); /* wsptr[2,0],[2,1],[2,2],[2,3] */ + punpckhdq_r2r (mm2, mm0); /* wsptr[0,z10],[1,z10],[0,z11],[1,z11] */ - movq_m2r(*(wsptr+5), mm7); /* wsptr[2,4],[2,5],[2,6],[2,7] */ - punpckhdq_r2r(mm4, mm3); /* wsptr[0,z12],[1,z12],[0,z13],[1,z13] */ + movq_m2r (*(wsptr + 5), mm7); /* wsptr[2,4],[2,5],[2,6],[2,7] */ + punpckhdq_r2r (mm4, mm3); /* wsptr[0,z12],[1,z12],[0,z13],[1,z13] */ - movq_m2r(*(wsptr+6), mm1); /* wsptr[3,0],[3,1],[3,2],[3,3] */ - movq_r2r(mm6, mm4); + movq_m2r (*(wsptr + 6), mm1); /* wsptr[3,0],[3,1],[3,2],[3,3] */ + movq_r2r (mm6, mm4); - punpckldq_r2r(mm7, mm6); /* wsptr[2,0],[2,1],[2,4],[2,5] */ - movq_r2r(mm1, mm5); + punpckldq_r2r (mm7, mm6); /* wsptr[2,0],[2,1],[2,4],[2,5] */ + movq_r2r (mm1, mm5); - punpckhdq_r2r(mm4, mm7); /* wsptr[2,6],[2,7],[2,2],[2,3] */ - movq_r2r(mm6, mm2); - - movq_m2r(*(wsptr+7), mm4); /* wsptr[3,4],[3,5],[3,6],[3,7] */ - paddw_r2r(mm7, mm6); /* wsptr[xxx],[2,z11],[xxx],[2,z13] */ + punpckhdq_r2r (mm4, mm7); /* wsptr[2,6],[2,7],[2,2],[2,3] */ + movq_r2r (mm6, mm2); - psubw_r2r(mm7, mm2); /* wsptr[xxx],[2,z12],[xxx],[2,z10] */ - punpckldq_r2r(mm4, mm1); /* wsptr[3,0],[3,1],[3,4],[3,5] */ + movq_m2r (*(wsptr + 7), mm4); /* wsptr[3,4],[3,5],[3,6],[3,7] */ + paddw_r2r (mm7, mm6); /* wsptr[xxx],[2,z11],[xxx],[2,z13] */ - punpckhdq_r2r(mm5, mm4); /* wsptr[3,6],[3,7],[3,2],[3,3] */ - movq_r2r(mm1, mm7); + psubw_r2r (mm7, mm2); /* wsptr[xxx],[2,z12],[xxx],[2,z10] */ + punpckldq_r2r (mm4, mm1); /* wsptr[3,0],[3,1],[3,4],[3,5] */ - paddw_r2r(mm4, mm1); /* wsptr[xxx],[3,z11],[xxx],[3,z13] */ - psubw_r2r(mm4, mm7); /* wsptr[xxx],[3,z12],[xxx],[3,z10] */ + punpckhdq_r2r (mm5, mm4); /* wsptr[3,6],[3,7],[3,2],[3,3] */ + movq_r2r (mm1, mm7); - movq_r2r(mm6, mm5); - punpcklwd_r2r(mm1, mm6); /* wsptr[xxx],[xxx],[2,z11],[3,z11] */ + paddw_r2r (mm4, mm1); /* wsptr[xxx],[3,z11],[xxx],[3,z13] */ + psubw_r2r (mm4, mm7); /* wsptr[xxx],[3,z12],[xxx],[3,z10] */ - punpckhwd_r2r(mm1, mm5); /* wsptr[xxx],[xxx],[2,z13],[3,z13] */ - movq_r2r(mm2, mm4); + movq_r2r (mm6, mm5); + punpcklwd_r2r (mm1, mm6); /* wsptr[xxx],[xxx],[2,z11],[3,z11] */ - punpcklwd_r2r(mm7, mm2); /* wsptr[xxx],[xxx],[2,z12],[3,z12] */ + punpckhwd_r2r (mm1, mm5); /* wsptr[xxx],[xxx],[2,z13],[3,z13] */ + movq_r2r (mm2, mm4); - punpckhwd_r2r(mm7, mm4); /* wsptr[xxx],[xxx],[2,z10],[3,z10] */ + punpcklwd_r2r (mm7, mm2); /* wsptr[xxx],[xxx],[2,z12],[3,z12] */ - punpckhdq_r2r(mm6, mm4); /*/ wsptr[2,z10],[3,z10],[2,z11],[3,z11] */ + punpckhwd_r2r (mm7, mm4); /* wsptr[xxx],[xxx],[2,z10],[3,z10] */ - punpckhdq_r2r(mm5, mm2); /* wsptr[2,z12],[3,z12],[2,z13],[3,z13] */ - movq_r2r(mm0, mm5); + punpckhdq_r2r (mm6, mm4); /*/ wsptr[2,z10],[3,z10],[2,z11],[3,z11] */ - punpckldq_r2r(mm4, mm0); /* wsptr[0,z10],[1,z10],[2,z10],[3,z10] */ + punpckhdq_r2r (mm5, mm2); /* wsptr[2,z12],[3,z12],[2,z13],[3,z13] */ + movq_r2r (mm0, mm5); - punpckhdq_r2r(mm4, mm5); /* wsptr[0,z11],[1,z11],[2,z11],[3,z11] */ - movq_r2r(mm3, mm4); + punpckldq_r2r (mm4, mm0); /* wsptr[0,z10],[1,z10],[2,z10],[3,z10] */ - punpckhdq_r2r(mm2, mm4); /* wsptr[0,z13],[1,z13],[2,z13],[3,z13] */ - movq_r2r(mm5, mm1); + punpckhdq_r2r (mm4, mm5); /* wsptr[0,z11],[1,z11],[2,z11],[3,z11] */ + movq_r2r (mm3, mm4); - punpckldq_r2r(mm2, mm3); /* wsptr[0,z12],[1,z12],[2,z12],[3,z12] */ + punpckhdq_r2r (mm2, mm4); /* wsptr[0,z13],[1,z13],[2,z13],[3,z13] */ + movq_r2r (mm5, mm1); + + punpckldq_r2r (mm2, mm3); /* wsptr[0,z12],[1,z12],[2,z12],[3,z12] */ /* tmp7 = z11 + z13; : phase 5 */ /* tmp8 = z11 - z13; : phase 5 */ - psubw_r2r(mm4, mm1); /* tmp8 */ + psubw_r2r (mm4, mm1); /* tmp8 */ - paddw_r2r(mm4, mm5); /* tmp7 */ + paddw_r2r (mm4, mm5); /* tmp7 */ /* tmp21 = MULTIPLY(tmp8, FIX_1_414213562); 2*c4 */ - psllw_i2r(2, mm1); + psllw_i2r (2, mm1); - psllw_i2r(2, mm0); + psllw_i2r (2, mm0); - pmulhw_m2r(fix_141, mm1); /* tmp21 */ + pmulhw_m2r (fix_141, mm1); /* tmp21 */ /* tmp20 = MULTIPLY(z12, (FIX_1_082392200- FIX_1_847759065)) 2*(c2-c6) */ /* + MULTIPLY(z10, - FIX_1_847759065); : 2*c2 */ - psllw_i2r(2, mm3); - movq_r2r(mm0, mm7); + psllw_i2r (2, mm3); + movq_r2r (mm0, mm7); - pmulhw_m2r(fix_n184, mm7); - movq_r2r(mm3, mm6); + pmulhw_m2r (fix_n184, mm7); + movq_r2r (mm3, mm6); - movq_m2r(*(wsptr), mm2); /* tmp0,final1 */ + movq_m2r (*(wsptr), mm2); /* tmp0,final1 */ - pmulhw_m2r(fix_108n184, mm6); + pmulhw_m2r (fix_108n184, mm6); /* tmp22 = MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) : -2*(c2+c6) */ /* + MULTIPLY(z12, FIX_1_847759065); 2*c2 */ - movq_r2r(mm2, mm4); /* final1 */ - - pmulhw_m2r(fix_184n261, mm0); - paddw_r2r(mm5, mm2); /* tmp0+tmp7,final1 */ + movq_r2r (mm2, mm4); /* final1 */ + + pmulhw_m2r (fix_184n261, mm0); + paddw_r2r (mm5, mm2); /* tmp0+tmp7,final1 */ - pmulhw_m2r(fix_184, mm3); - psubw_r2r(mm5, mm4); /* tmp0-tmp7,final1 */ + pmulhw_m2r (fix_184, mm3); + psubw_r2r (mm5, mm4); /* tmp0-tmp7,final1 */ /* tmp6 = tmp22 - tmp7; phase 2 */ - psraw_i2r(3, mm2); /* outptr[0,0],[1,0],[2,0],[3,0],final1 */ + psraw_i2r (3, mm2); /* outptr[0,0],[1,0],[2,0],[3,0],final1 */ - paddw_r2r(mm6, mm7); /* tmp20 */ - psraw_i2r(3, mm4); /* outptr[0,7],[1,7],[2,7],[3,7],final1 */ + paddw_r2r (mm6, mm7); /* tmp20 */ + psraw_i2r (3, mm4); /* outptr[0,7],[1,7],[2,7],[3,7],final1 */ - paddw_r2r(mm0, mm3); /* tmp22 */ + paddw_r2r (mm0, mm3); /* tmp22 */ /* tmp5 = tmp21 - tmp6; */ - psubw_r2r(mm5, mm3); /* tmp6 */ + psubw_r2r (mm5, mm3); /* tmp6 */ /* tmp4 = tmp20 + tmp5; */ - movq_m2r(*(wsptr+1), mm0); /* tmp1,final2 */ - psubw_r2r(mm3, mm1); /* tmp5 */ + movq_m2r (*(wsptr + 1), mm0); /* tmp1,final2 */ + psubw_r2r (mm3, mm1); /* tmp5 */ - movq_r2r(mm0, mm6); /* final2 */ - paddw_r2r(mm3, mm0); /* tmp1+tmp6,final2 */ + movq_r2r (mm0, mm6); /* final2 */ + paddw_r2r (mm3, mm0); /* tmp1+tmp6,final2 */ - /* Final output stage: scale down by a factor of 8 and range-limit */ + /* Final output stage: scale down by a factor of 8 and range-limit */ /* outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) */ @@ -1776,30 +1781,30 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; /* & RANGE_MASK]; */ /* outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) */ /* & RANGE_MASK]; final2 */ - psubw_r2r(mm3, mm6); /* tmp1-tmp6,final2 */ - psraw_i2r(3, mm0); /* outptr[0,1],[1,1],[2,1],[3,1] */ + psubw_r2r (mm3, mm6); /* tmp1-tmp6,final2 */ + psraw_i2r (3, mm0); /* outptr[0,1],[1,1],[2,1],[3,1] */ + + psraw_i2r (3, mm6); /* outptr[0,6],[1,6],[2,6],[3,6] */ + + packuswb_r2r (mm4, mm0); /* out[0,1],[1,1],[2,1],[3,1],[0,7],[1,7],[2,7],[3,7] */ - psraw_i2r(3, mm6); /* outptr[0,6],[1,6],[2,6],[3,6] */ - - packuswb_r2r(mm4, mm0); /* out[0,1],[1,1],[2,1],[3,1],[0,7],[1,7],[2,7],[3,7] */ - - movq_m2r(*(wsptr+2), mm5); /* tmp2,final3 */ - packuswb_r2r(mm6, mm2); /* out[0,0],[1,0],[2,0],[3,0],[0,6],[1,6],[2,6],[3,6] */ + movq_m2r (*(wsptr + 2), mm5); /* tmp2,final3 */ + packuswb_r2r (mm6, mm2); /* out[0,0],[1,0],[2,0],[3,0],[0,6],[1,6],[2,6],[3,6] */ /* outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) */ /* & RANGE_MASK]; */ /* outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) */ /* & RANGE_MASK]; final3 */ - paddw_r2r(mm1, mm7); /* tmp4 */ - movq_r2r(mm5, mm3); + paddw_r2r (mm1, mm7); /* tmp4 */ + movq_r2r (mm5, mm3); - paddw_r2r(mm1, mm5); /* tmp2+tmp5 */ - psubw_r2r(mm1, mm3); /* tmp2-tmp5 */ + paddw_r2r (mm1, mm5); /* tmp2+tmp5 */ + psubw_r2r (mm1, mm3); /* tmp2-tmp5 */ - psraw_i2r(3, mm5); /* outptr[0,2],[1,2],[2,2],[3,2] */ + psraw_i2r (3, mm5); /* outptr[0,2],[1,2],[2,2],[3,2] */ - movq_m2r(*(wsptr+3), mm4); /* tmp3,final4 */ - psraw_i2r(3, mm3); /* outptr[0,5],[1,5],[2,5],[3,5] */ + movq_m2r (*(wsptr + 3), mm4); /* tmp3,final4 */ + psraw_i2r (3, mm3); /* outptr[0,5],[1,5],[2,5],[3,5] */ @@ -1807,74 +1812,74 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; /* & RANGE_MASK]; */ /* outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) */ /* & RANGE_MASK]; final4 */ - movq_r2r(mm4, mm6); - paddw_r2r(mm7, mm4); /* tmp3+tmp4 */ + movq_r2r (mm4, mm6); + paddw_r2r (mm7, mm4); /* tmp3+tmp4 */ - psubw_r2r(mm7, mm6); /* tmp3-tmp4 */ - psraw_i2r(3, mm4); /* outptr[0,4],[1,4],[2,4],[3,4] */ + psubw_r2r (mm7, mm6); /* tmp3-tmp4 */ + psraw_i2r (3, mm4); /* outptr[0,4],[1,4],[2,4],[3,4] */ - /* mov ecx, [dataptr] */ + /* mov ecx, [dataptr] */ - psraw_i2r(3, mm6); /* outptr[0,3],[1,3],[2,3],[3,3] */ + psraw_i2r (3, mm6); /* outptr[0,3],[1,3],[2,3],[3,3] */ - packuswb_r2r(mm4, mm5); /* out[0,2],[1,2],[2,2],[3,2],[0,4],[1,4],[2,4],[3,4] */ + packuswb_r2r (mm4, mm5); /* out[0,2],[1,2],[2,2],[3,2],[0,4],[1,4],[2,4],[3,4] */ - packuswb_r2r(mm3, mm6); /* out[0,3],[1,3],[2,3],[3,3],[0,5],[1,5],[2,5],[3,5] */ - movq_r2r(mm2, mm4); + packuswb_r2r (mm3, mm6); /* out[0,3],[1,3],[2,3],[3,3],[0,5],[1,5],[2,5],[3,5] */ + movq_r2r (mm2, mm4); - movq_r2r(mm5, mm7); - punpcklbw_r2r(mm0, mm2); /* out[0,0],[0,1],[1,0],[1,1],[2,0],[2,1],[3,0],[3,1] */ + movq_r2r (mm5, mm7); + punpcklbw_r2r (mm0, mm2); /* out[0,0],[0,1],[1,0],[1,1],[2,0],[2,1],[3,0],[3,1] */ - punpckhbw_r2r(mm0, mm4); /* out[0,6],[0,7],[1,6],[1,7],[2,6],[2,7],[3,6],[3,7] */ - movq_r2r(mm2, mm1); + punpckhbw_r2r (mm0, mm4); /* out[0,6],[0,7],[1,6],[1,7],[2,6],[2,7],[3,6],[3,7] */ + movq_r2r (mm2, mm1); - punpcklbw_r2r(mm6, mm5); /* out[0,2],[0,3],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3] */ + punpcklbw_r2r (mm6, mm5); /* out[0,2],[0,3],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3] */ - /* add dataptr, 4 */ + /* add dataptr, 4 */ - punpckhbw_r2r(mm6, mm7); /* out[0,4],[0,5],[1,4],[1,5],[2,4],[2,5],[3,4],[3,5] */ + punpckhbw_r2r (mm6, mm7); /* out[0,4],[0,5],[1,4],[1,5],[2,4],[2,5],[3,4],[3,5] */ - punpcklwd_r2r(mm5, mm2); /* out[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3] */ - - /* add ecx, output_col */ + punpcklwd_r2r (mm5, mm2); /* out[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3] */ - movq_r2r(mm7, mm6); - punpckhwd_r2r(mm5, mm1); /* out[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3] */ + /* add ecx, output_col */ - movq_r2r(mm2, mm0); - punpcklwd_r2r(mm4, mm6); /* out[0,4],[0,5],[0,6],[0,7],[1,4],[1,5],[1,6],[1,7] */ + movq_r2r (mm7, mm6); + punpckhwd_r2r (mm5, mm1); /* out[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3] */ - /* mov idata, [dataptr] */ - - punpckldq_r2r(mm6, mm2); /* out[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7] */ + movq_r2r (mm2, mm0); + punpcklwd_r2r (mm4, mm6); /* out[0,4],[0,5],[0,6],[0,7],[1,4],[1,5],[1,6],[1,7] */ - /* add dataptr, 4 */ - - movq_r2r(mm1, mm3); + /* mov idata, [dataptr] */ - /* add idata, output_col */ - - punpckhwd_r2r(mm4, mm7); /* out[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7] */ - - movq_r2m(mm2, *(dataptr)); - - punpckhdq_r2r(mm6, mm0); /* out[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7] */ + punpckldq_r2r (mm6, mm2); /* out[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7] */ - dataptr += rskip; - movq_r2m(mm0, *(dataptr)); + /* add dataptr, 4 */ - punpckldq_r2r(mm7, mm1); /* out[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7] */ - punpckhdq_r2r(mm7, mm3); /* out[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7] */ - - dataptr += rskip; - movq_r2m(mm1, *(dataptr)); + movq_r2r (mm1, mm3); - dataptr += rskip; - movq_r2m(mm3, *(dataptr)); + /* add idata, output_col */ + + punpckhwd_r2r (mm4, mm7); /* out[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7] */ + + movq_r2m (mm2, *(dataptr)); + + punpckhdq_r2r (mm6, mm0); /* out[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7] */ + + dataptr += rskip; + movq_r2m (mm0, *(dataptr)); + + punpckldq_r2r (mm7, mm1); /* out[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7] */ + punpckhdq_r2r (mm7, mm3); /* out[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7] */ + + dataptr += rskip; + movq_r2m (mm1, *(dataptr)); + + dataptr += rskip; + movq_r2m (mm3, *(dataptr)); /*******************************************************************/ - wsptr += 8; + wsptr += 8; /*******************************************************************/ @@ -1882,249 +1887,249 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; /* tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); */ /* tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); */ /* tmp14 = ((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6]); */ - movq_m2r(*(wsptr), mm0); /* wsptr[0,0],[0,1],[0,2],[0,3] */ + movq_m2r (*(wsptr), mm0); /* wsptr[0,0],[0,1],[0,2],[0,3] */ + + movq_m2r (*(wsptr + 1), mm1); /* wsptr[0,4],[0,5],[0,6],[0,7] */ + movq_r2r (mm0, mm2); - movq_m2r(*(wsptr+1), mm1); /* wsptr[0,4],[0,5],[0,6],[0,7] */ - movq_r2r(mm0, mm2); - - movq_m2r(*(wsptr+2), mm3); /* wsptr[1,0],[1,1],[1,2],[1,3] */ - paddw_r2r(mm1, mm0); /* wsptr[0,tmp10],[xxx],[0,tmp13],[xxx] */ + movq_m2r (*(wsptr + 2), mm3); /* wsptr[1,0],[1,1],[1,2],[1,3] */ + paddw_r2r (mm1, mm0); /* wsptr[0,tmp10],[xxx],[0,tmp13],[xxx] */ - movq_m2r(*(wsptr+3), mm4); /* wsptr[1,4],[1,5],[1,6],[1,7] */ - psubw_r2r(mm1, mm2); /* wsptr[0,tmp11],[xxx],[0,tmp14],[xxx] */ + movq_m2r (*(wsptr + 3), mm4); /* wsptr[1,4],[1,5],[1,6],[1,7] */ + psubw_r2r (mm1, mm2); /* wsptr[0,tmp11],[xxx],[0,tmp14],[xxx] */ - movq_r2r(mm0, mm6); - movq_r2r(mm3, mm5); - - paddw_r2r(mm4, mm3); /* wsptr[1,tmp10],[xxx],[1,tmp13],[xxx] */ - movq_r2r(mm2, mm1); + movq_r2r (mm0, mm6); + movq_r2r (mm3, mm5); - psubw_r2r(mm4, mm5); /* wsptr[1,tmp11],[xxx],[1,tmp14],[xxx] */ - punpcklwd_r2r(mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[xxx],[xxx] */ + paddw_r2r (mm4, mm3); /* wsptr[1,tmp10],[xxx],[1,tmp13],[xxx] */ + movq_r2r (mm2, mm1); - movq_m2r(*(wsptr+7), mm7); /* wsptr[3,4],[3,5],[3,6],[3,7] */ - punpckhwd_r2r(mm3, mm6); /* wsptr[0,tmp13],[1,tmp13],[xxx],[xxx] */ + psubw_r2r (mm4, mm5); /* wsptr[1,tmp11],[xxx],[1,tmp14],[xxx] */ + punpcklwd_r2r (mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[xxx],[xxx] */ - movq_m2r(*(wsptr+4), mm3); /* wsptr[2,0],[2,1],[2,2],[2,3] */ - punpckldq_r2r(mm6, mm0); /* wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13] */ + movq_m2r (*(wsptr + 7), mm7); /* wsptr[3,4],[3,5],[3,6],[3,7] */ + punpckhwd_r2r (mm3, mm6); /* wsptr[0,tmp13],[1,tmp13],[xxx],[xxx] */ - punpcklwd_r2r(mm5, mm1); /* wsptr[0,tmp11],[1,tmp11],[xxx],[xxx] */ - movq_r2r(mm3, mm4); + movq_m2r (*(wsptr + 4), mm3); /* wsptr[2,0],[2,1],[2,2],[2,3] */ + punpckldq_r2r (mm6, mm0); /* wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13] */ - movq_m2r(*(wsptr+6), mm6); /* wsptr[3,0],[3,1],[3,2],[3,3] */ - punpckhwd_r2r(mm5, mm2); /* wsptr[0,tmp14],[1,tmp14],[xxx],[xxx] */ + punpcklwd_r2r (mm5, mm1); /* wsptr[0,tmp11],[1,tmp11],[xxx],[xxx] */ + movq_r2r (mm3, mm4); - movq_m2r(*(wsptr+5), mm5); /* wsptr[2,4],[2,5],[2,6],[2,7] */ - punpckldq_r2r(mm2, mm1); /* wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14] */ + movq_m2r (*(wsptr + 6), mm6); /* wsptr[3,0],[3,1],[3,2],[3,3] */ + punpckhwd_r2r (mm5, mm2); /* wsptr[0,tmp14],[1,tmp14],[xxx],[xxx] */ - paddw_r2r(mm5, mm3); /* wsptr[2,tmp10],[xxx],[2,tmp13],[xxx] */ - movq_r2r(mm6, mm2); + movq_m2r (*(wsptr + 5), mm5); /* wsptr[2,4],[2,5],[2,6],[2,7] */ + punpckldq_r2r (mm2, mm1); /* wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14] */ - psubw_r2r(mm5, mm4); /* wsptr[2,tmp11],[xxx],[2,tmp14],[xxx] */ - paddw_r2r(mm7, mm6); /* wsptr[3,tmp10],[xxx],[3,tmp13],[xxx] */ + paddw_r2r (mm5, mm3); /* wsptr[2,tmp10],[xxx],[2,tmp13],[xxx] */ + movq_r2r (mm6, mm2); - movq_r2r(mm3, mm5); - punpcklwd_r2r(mm6, mm3); /* wsptr[2,tmp10],[3,tmp10],[xxx],[xxx] */ - - psubw_r2r(mm7, mm2); /* wsptr[3,tmp11],[xxx],[3,tmp14],[xxx] */ - punpckhwd_r2r(mm6, mm5); /* wsptr[2,tmp13],[3,tmp13],[xxx],[xxx] */ + psubw_r2r (mm5, mm4); /* wsptr[2,tmp11],[xxx],[2,tmp14],[xxx] */ + paddw_r2r (mm7, mm6); /* wsptr[3,tmp10],[xxx],[3,tmp13],[xxx] */ - movq_r2r(mm4, mm7); - punpckldq_r2r(mm5, mm3); /* wsptr[2,tmp10],[3,tmp10],[2,tmp13],[3,tmp13] */ + movq_r2r (mm3, mm5); + punpcklwd_r2r (mm6, mm3); /* wsptr[2,tmp10],[3,tmp10],[xxx],[xxx] */ - punpcklwd_r2r(mm2, mm4); /* wsptr[2,tmp11],[3,tmp11],[xxx],[xxx] */ + psubw_r2r (mm7, mm2); /* wsptr[3,tmp11],[xxx],[3,tmp14],[xxx] */ + punpckhwd_r2r (mm6, mm5); /* wsptr[2,tmp13],[3,tmp13],[xxx],[xxx] */ - punpckhwd_r2r(mm2, mm7); /* wsptr[2,tmp14],[3,tmp14],[xxx],[xxx] */ + movq_r2r (mm4, mm7); + punpckldq_r2r (mm5, mm3); /* wsptr[2,tmp10],[3,tmp10],[2,tmp13],[3,tmp13] */ - punpckldq_r2r(mm7, mm4); /* wsptr[2,tmp11],[3,tmp11],[2,tmp14],[3,tmp14] */ - movq_r2r(mm1, mm6); + punpcklwd_r2r (mm2, mm4); /* wsptr[2,tmp11],[3,tmp11],[xxx],[xxx] */ - /*OK */ + punpckhwd_r2r (mm2, mm7); /* wsptr[2,tmp14],[3,tmp14],[xxx],[xxx] */ + + punpckldq_r2r (mm7, mm4); /* wsptr[2,tmp11],[3,tmp11],[2,tmp14],[3,tmp14] */ + movq_r2r (mm1, mm6); + + /*OK */ /* mm0 = ;wsptr[0,tmp10],[1,tmp10],[0,tmp13],[1,tmp13] */ /* mm1 = ;wsptr[0,tmp11],[1,tmp11],[0,tmp14],[1,tmp14] */ - movq_r2r(mm0, mm2); - punpckhdq_r2r(mm4, mm6); /* wsptr[0,tmp14],[1,tmp14],[2,tmp14],[3,tmp14] */ + movq_r2r (mm0, mm2); + punpckhdq_r2r (mm4, mm6); /* wsptr[0,tmp14],[1,tmp14],[2,tmp14],[3,tmp14] */ - punpckldq_r2r(mm4, mm1); /* wsptr[0,tmp11],[1,tmp11],[2,tmp11],[3,tmp11] */ - psllw_i2r(2, mm6); + punpckldq_r2r (mm4, mm1); /* wsptr[0,tmp11],[1,tmp11],[2,tmp11],[3,tmp11] */ + psllw_i2r (2, mm6); - pmulhw_m2r(fix_141, mm6); - punpckldq_r2r(mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[2,tmp10],[3,tmp10] */ + pmulhw_m2r (fix_141, mm6); + punpckldq_r2r (mm3, mm0); /* wsptr[0,tmp10],[1,tmp10],[2,tmp10],[3,tmp10] */ - punpckhdq_r2r(mm3, mm2); /* wsptr[0,tmp13],[1,tmp13],[2,tmp13],[3,tmp13] */ - movq_r2r(mm0, mm7); + punpckhdq_r2r (mm3, mm2); /* wsptr[0,tmp13],[1,tmp13],[2,tmp13],[3,tmp13] */ + movq_r2r (mm0, mm7); /* tmp0 = tmp10 + tmp13; */ /* tmp3 = tmp10 - tmp13; */ - paddw_r2r(mm2, mm0); /* [0,tmp0],[1,tmp0],[2,tmp0],[3,tmp0] */ - psubw_r2r(mm2, mm7); /* [0,tmp3],[1,tmp3],[2,tmp3],[3,tmp3] */ + paddw_r2r (mm2, mm0); /* [0,tmp0],[1,tmp0],[2,tmp0],[3,tmp0] */ + psubw_r2r (mm2, mm7); /* [0,tmp3],[1,tmp3],[2,tmp3],[3,tmp3] */ /* tmp12 = MULTIPLY(tmp14, FIX_1_414213562) - tmp13; */ - psubw_r2r(mm2, mm6); /* wsptr[0,tmp12],[1,tmp12],[2,tmp12],[3,tmp12] */ + psubw_r2r (mm2, mm6); /* wsptr[0,tmp12],[1,tmp12],[2,tmp12],[3,tmp12] */ /* tmp1 = tmp11 + tmp12; */ /* tmp2 = tmp11 - tmp12; */ - movq_r2r(mm1, mm5); + movq_r2r (mm1, mm5); - /*OK */ + /*OK */ - /* Odd part */ + /* Odd part */ /* z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; */ /* z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; */ /* z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; */ /* z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; */ - movq_m2r(*(wsptr), mm3); /* wsptr[0,0],[0,1],[0,2],[0,3] */ - paddw_r2r(mm6, mm1); /* [0,tmp1],[1,tmp1],[2,tmp1],[3,tmp1] */ + movq_m2r (*(wsptr), mm3); /* wsptr[0,0],[0,1],[0,2],[0,3] */ + paddw_r2r (mm6, mm1); /* [0,tmp1],[1,tmp1],[2,tmp1],[3,tmp1] */ - movq_m2r(*(wsptr+1), mm4); /* wsptr[0,4],[0,5],[0,6],[0,7] */ - psubw_r2r(mm6, mm5); /* [0,tmp2],[1,tmp2],[2,tmp2],[3,tmp2] */ + movq_m2r (*(wsptr + 1), mm4); /* wsptr[0,4],[0,5],[0,6],[0,7] */ + psubw_r2r (mm6, mm5); /* [0,tmp2],[1,tmp2],[2,tmp2],[3,tmp2] */ - movq_r2r(mm3, mm6); - punpckldq_r2r(mm4, mm3); /* wsptr[0,0],[0,1],[0,4],[0,5] */ + movq_r2r (mm3, mm6); + punpckldq_r2r (mm4, mm3); /* wsptr[0,0],[0,1],[0,4],[0,5] */ - punpckhdq_r2r(mm6, mm4); /* wsptr[0,6],[0,7],[0,2],[0,3] */ - movq_r2r(mm3, mm2); + punpckhdq_r2r (mm6, mm4); /* wsptr[0,6],[0,7],[0,2],[0,3] */ + movq_r2r (mm3, mm2); /*Save tmp0 and tmp1 in wsptr */ - movq_r2m(mm0, *(wsptr)); /* save tmp0 */ - paddw_r2r(mm4, mm2); /* wsptr[xxx],[0,z11],[xxx],[0,z13] */ + movq_r2m (mm0, *(wsptr)); /* save tmp0 */ + paddw_r2r (mm4, mm2); /* wsptr[xxx],[0,z11],[xxx],[0,z13] */ + - /*Continue with z10 --- z13 */ - movq_m2r(*(wsptr+2), mm6); /* wsptr[1,0],[1,1],[1,2],[1,3] */ - psubw_r2r(mm4, mm3); /* wsptr[xxx],[0,z12],[xxx],[0,z10] */ + movq_m2r (*(wsptr + 2), mm6); /* wsptr[1,0],[1,1],[1,2],[1,3] */ + psubw_r2r (mm4, mm3); /* wsptr[xxx],[0,z12],[xxx],[0,z10] */ - movq_m2r(*(wsptr+3), mm0); /* wsptr[1,4],[1,5],[1,6],[1,7] */ - movq_r2r(mm6, mm4); + movq_m2r (*(wsptr + 3), mm0); /* wsptr[1,4],[1,5],[1,6],[1,7] */ + movq_r2r (mm6, mm4); - movq_r2m(mm1, *(wsptr+1)); /* save tmp1 */ - punpckldq_r2r(mm0, mm6); /* wsptr[1,0],[1,1],[1,4],[1,5] */ + movq_r2m (mm1, *(wsptr + 1)); /* save tmp1 */ + punpckldq_r2r (mm0, mm6); /* wsptr[1,0],[1,1],[1,4],[1,5] */ + + punpckhdq_r2r (mm4, mm0); /* wsptr[1,6],[1,7],[1,2],[1,3] */ + movq_r2r (mm6, mm1); - punpckhdq_r2r(mm4, mm0); /* wsptr[1,6],[1,7],[1,2],[1,3] */ - movq_r2r(mm6, mm1); - /*Save tmp2 and tmp3 in wsptr */ - paddw_r2r(mm0, mm6); /* wsptr[xxx],[1,z11],[xxx],[1,z13] */ - movq_r2r(mm2, mm4); - + paddw_r2r (mm0, mm6); /* wsptr[xxx],[1,z11],[xxx],[1,z13] */ + movq_r2r (mm2, mm4); + /*Continue with z10 --- z13 */ - movq_r2m(mm5, *(wsptr+2)); /* save tmp2 */ - punpcklwd_r2r(mm6, mm2); /* wsptr[xxx],[xxx],[0,z11],[1,z11] */ + movq_r2m (mm5, *(wsptr + 2)); /* save tmp2 */ + punpcklwd_r2r (mm6, mm2); /* wsptr[xxx],[xxx],[0,z11],[1,z11] */ - psubw_r2r(mm0, mm1); /* wsptr[xxx],[1,z12],[xxx],[1,z10] */ - punpckhwd_r2r(mm6, mm4); /* wsptr[xxx],[xxx],[0,z13],[1,z13] */ + psubw_r2r (mm0, mm1); /* wsptr[xxx],[1,z12],[xxx],[1,z10] */ + punpckhwd_r2r (mm6, mm4); /* wsptr[xxx],[xxx],[0,z13],[1,z13] */ - movq_r2r(mm3, mm0); - punpcklwd_r2r(mm1, mm3); /* wsptr[xxx],[xxx],[0,z12],[1,z12] */ + movq_r2r (mm3, mm0); + punpcklwd_r2r (mm1, mm3); /* wsptr[xxx],[xxx],[0,z12],[1,z12] */ - movq_r2m(mm7, *(wsptr+3)); /* save tmp3 */ - punpckhwd_r2r(mm1, mm0); /* wsptr[xxx],[xxx],[0,z10],[1,z10] */ + movq_r2m (mm7, *(wsptr + 3)); /* save tmp3 */ + punpckhwd_r2r (mm1, mm0); /* wsptr[xxx],[xxx],[0,z10],[1,z10] */ - movq_m2r(*(wsptr+4), mm6); /* wsptr[2,0],[2,1],[2,2],[2,3] */ - punpckhdq_r2r(mm2, mm0); /* wsptr[0,z10],[1,z10],[0,z11],[1,z11] */ + movq_m2r (*(wsptr + 4), mm6); /* wsptr[2,0],[2,1],[2,2],[2,3] */ + punpckhdq_r2r (mm2, mm0); /* wsptr[0,z10],[1,z10],[0,z11],[1,z11] */ - movq_m2r(*(wsptr+5), mm7); /* wsptr[2,4],[2,5],[2,6],[2,7] */ - punpckhdq_r2r(mm4, mm3); /* wsptr[0,z12],[1,z12],[0,z13],[1,z13] */ + movq_m2r (*(wsptr + 5), mm7); /* wsptr[2,4],[2,5],[2,6],[2,7] */ + punpckhdq_r2r (mm4, mm3); /* wsptr[0,z12],[1,z12],[0,z13],[1,z13] */ - movq_m2r(*(wsptr+6), mm1); /* wsptr[3,0],[3,1],[3,2],[3,3] */ - movq_r2r(mm6, mm4); + movq_m2r (*(wsptr + 6), mm1); /* wsptr[3,0],[3,1],[3,2],[3,3] */ + movq_r2r (mm6, mm4); - punpckldq_r2r(mm7, mm6); /* wsptr[2,0],[2,1],[2,4],[2,5] */ - movq_r2r(mm1, mm5); + punpckldq_r2r (mm7, mm6); /* wsptr[2,0],[2,1],[2,4],[2,5] */ + movq_r2r (mm1, mm5); - punpckhdq_r2r(mm4, mm7); /* wsptr[2,6],[2,7],[2,2],[2,3] */ - movq_r2r(mm6, mm2); - - movq_m2r(*(wsptr+7), mm4); /* wsptr[3,4],[3,5],[3,6],[3,7] */ - paddw_r2r(mm7, mm6); /* wsptr[xxx],[2,z11],[xxx],[2,z13] */ + punpckhdq_r2r (mm4, mm7); /* wsptr[2,6],[2,7],[2,2],[2,3] */ + movq_r2r (mm6, mm2); - psubw_r2r(mm7, mm2); /* wsptr[xxx],[2,z12],[xxx],[2,z10] */ - punpckldq_r2r(mm4, mm1); /* wsptr[3,0],[3,1],[3,4],[3,5] */ + movq_m2r (*(wsptr + 7), mm4); /* wsptr[3,4],[3,5],[3,6],[3,7] */ + paddw_r2r (mm7, mm6); /* wsptr[xxx],[2,z11],[xxx],[2,z13] */ - punpckhdq_r2r(mm5, mm4); /* wsptr[3,6],[3,7],[3,2],[3,3] */ - movq_r2r(mm1, mm7); + psubw_r2r (mm7, mm2); /* wsptr[xxx],[2,z12],[xxx],[2,z10] */ + punpckldq_r2r (mm4, mm1); /* wsptr[3,0],[3,1],[3,4],[3,5] */ - paddw_r2r(mm4, mm1); /* wsptr[xxx],[3,z11],[xxx],[3,z13] */ - psubw_r2r(mm4, mm7); /* wsptr[xxx],[3,z12],[xxx],[3,z10] */ + punpckhdq_r2r (mm5, mm4); /* wsptr[3,6],[3,7],[3,2],[3,3] */ + movq_r2r (mm1, mm7); - movq_r2r(mm6, mm5); - punpcklwd_r2r(mm1, mm6); /* wsptr[xxx],[xxx],[2,z11],[3,z11] */ + paddw_r2r (mm4, mm1); /* wsptr[xxx],[3,z11],[xxx],[3,z13] */ + psubw_r2r (mm4, mm7); /* wsptr[xxx],[3,z12],[xxx],[3,z10] */ - punpckhwd_r2r(mm1, mm5); /* wsptr[xxx],[xxx],[2,z13],[3,z13] */ - movq_r2r(mm2, mm4); + movq_r2r (mm6, mm5); + punpcklwd_r2r (mm1, mm6); /* wsptr[xxx],[xxx],[2,z11],[3,z11] */ - punpcklwd_r2r(mm7, mm2); /* wsptr[xxx],[xxx],[2,z12],[3,z12] */ + punpckhwd_r2r (mm1, mm5); /* wsptr[xxx],[xxx],[2,z13],[3,z13] */ + movq_r2r (mm2, mm4); - punpckhwd_r2r(mm7, mm4); /* wsptr[xxx],[xxx],[2,z10],[3,z10] */ + punpcklwd_r2r (mm7, mm2); /* wsptr[xxx],[xxx],[2,z12],[3,z12] */ - punpckhdq_r2r(mm6, mm4); /* wsptr[2,z10],[3,z10],[2,z11],[3,z11] */ + punpckhwd_r2r (mm7, mm4); /* wsptr[xxx],[xxx],[2,z10],[3,z10] */ - punpckhdq_r2r(mm5, mm2); /* wsptr[2,z12],[3,z12],[2,z13],[3,z13] */ - movq_r2r(mm0, mm5); + punpckhdq_r2r (mm6, mm4); /* wsptr[2,z10],[3,z10],[2,z11],[3,z11] */ - punpckldq_r2r(mm4, mm0); /* wsptr[0,z10],[1,z10],[2,z10],[3,z10] */ + punpckhdq_r2r (mm5, mm2); /* wsptr[2,z12],[3,z12],[2,z13],[3,z13] */ + movq_r2r (mm0, mm5); - punpckhdq_r2r(mm4, mm5); /* wsptr[0,z11],[1,z11],[2,z11],[3,z11] */ - movq_r2r(mm3, mm4); + punpckldq_r2r (mm4, mm0); /* wsptr[0,z10],[1,z10],[2,z10],[3,z10] */ - punpckhdq_r2r(mm2, mm4); /* wsptr[0,z13],[1,z13],[2,z13],[3,z13] */ - movq_r2r(mm5, mm1); + punpckhdq_r2r (mm4, mm5); /* wsptr[0,z11],[1,z11],[2,z11],[3,z11] */ + movq_r2r (mm3, mm4); - punpckldq_r2r(mm2, mm3); /* wsptr[0,z12],[1,z12],[2,z12],[3,z12] */ + punpckhdq_r2r (mm2, mm4); /* wsptr[0,z13],[1,z13],[2,z13],[3,z13] */ + movq_r2r (mm5, mm1); + + punpckldq_r2r (mm2, mm3); /* wsptr[0,z12],[1,z12],[2,z12],[3,z12] */ /* tmp7 = z11 + z13; : phase 5 */ /* tmp8 = z11 - z13; : phase 5 */ - psubw_r2r(mm4, mm1); /* tmp8 */ + psubw_r2r (mm4, mm1); /* tmp8 */ - paddw_r2r(mm4, mm5); /* tmp7 */ + paddw_r2r (mm4, mm5); /* tmp7 */ /* tmp21 = MULTIPLY(tmp8, FIX_1_414213562); 2*c4 */ - psllw_i2r(2, mm1); + psllw_i2r (2, mm1); - psllw_i2r(2, mm0); + psllw_i2r (2, mm0); - pmulhw_m2r(fix_141, mm1); /* tmp21 */ + pmulhw_m2r (fix_141, mm1); /* tmp21 */ /* tmp20 = MULTIPLY(z12, (FIX_1_082392200- FIX_1_847759065)) : 2*(c2-c6) */ /* + MULTIPLY(z10, - FIX_1_847759065); : 2*c2 */ - psllw_i2r(2, mm3); - movq_r2r(mm0, mm7); + psllw_i2r (2, mm3); + movq_r2r (mm0, mm7); - pmulhw_m2r(fix_n184, mm7); - movq_r2r(mm3, mm6); + pmulhw_m2r (fix_n184, mm7); + movq_r2r (mm3, mm6); - movq_m2r(*(wsptr), mm2); /* tmp0,final1 */ + movq_m2r (*(wsptr), mm2); /* tmp0,final1 */ - pmulhw_m2r(fix_108n184, mm6); + pmulhw_m2r (fix_108n184, mm6); /* tmp22 = MULTIPLY(z10,(FIX_1_847759065 - FIX_2_613125930)) : -2*(c2+c6) */ /* + MULTIPLY(z12, FIX_1_847759065); : 2*c2 */ - movq_r2r(mm2, mm4); /* final1 */ - - pmulhw_m2r(fix_184n261, mm0); - paddw_r2r(mm5, mm2); /* tmp0+tmp7,final1 */ + movq_r2r (mm2, mm4); /* final1 */ + + pmulhw_m2r (fix_184n261, mm0); + paddw_r2r (mm5, mm2); /* tmp0+tmp7,final1 */ - pmulhw_m2r(fix_184, mm3); - psubw_r2r(mm5, mm4); /* tmp0-tmp7,final1 */ + pmulhw_m2r (fix_184, mm3); + psubw_r2r (mm5, mm4); /* tmp0-tmp7,final1 */ /* tmp6 = tmp22 - tmp7; phase 2 */ - psraw_i2r(3, mm2); /* outptr[0,0],[1,0],[2,0],[3,0],final1 */ + psraw_i2r (3, mm2); /* outptr[0,0],[1,0],[2,0],[3,0],final1 */ - paddw_r2r(mm6, mm7); /* tmp20 */ - psraw_i2r(3, mm4); /* outptr[0,7],[1,7],[2,7],[3,7],final1 */ + paddw_r2r (mm6, mm7); /* tmp20 */ + psraw_i2r (3, mm4); /* outptr[0,7],[1,7],[2,7],[3,7],final1 */ - paddw_r2r(mm0, mm3); /* tmp22 */ + paddw_r2r (mm0, mm3); /* tmp22 */ /* tmp5 = tmp21 - tmp6; */ - psubw_r2r(mm5, mm3); /* tmp6 */ + psubw_r2r (mm5, mm3); /* tmp6 */ /* tmp4 = tmp20 + tmp5; */ - movq_m2r(*(wsptr+1), mm0); /* tmp1,final2 */ - psubw_r2r(mm3, mm1); /* tmp5 */ + movq_m2r (*(wsptr + 1), mm0); /* tmp1,final2 */ + psubw_r2r (mm3, mm1); /* tmp5 */ - movq_r2r(mm0, mm6); /* final2 */ - paddw_r2r(mm3, mm0); /* tmp1+tmp6,final2 */ + movq_r2r (mm0, mm6); /* final2 */ + paddw_r2r (mm3, mm0); /* tmp1+tmp6,final2 */ - /* Final output stage: scale down by a factor of 8 and range-limit */ + /* Final output stage: scale down by a factor of 8 and range-limit */ /* outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) */ /* & RANGE_MASK]; */ @@ -2136,30 +2141,30 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; /* & RANGE_MASK]; */ /* outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) */ /* & RANGE_MASK]; final2 */ - psubw_r2r(mm3, mm6); /* tmp1-tmp6,final2 */ - psraw_i2r(3, mm0); /* outptr[0,1],[1,1],[2,1],[3,1] */ + psubw_r2r (mm3, mm6); /* tmp1-tmp6,final2 */ + psraw_i2r (3, mm0); /* outptr[0,1],[1,1],[2,1],[3,1] */ + + psraw_i2r (3, mm6); /* outptr[0,6],[1,6],[2,6],[3,6] */ + + packuswb_r2r (mm4, mm0); /* out[0,1],[1,1],[2,1],[3,1],[0,7],[1,7],[2,7],[3,7] */ - psraw_i2r(3, mm6); /* outptr[0,6],[1,6],[2,6],[3,6] */ - - packuswb_r2r(mm4, mm0); /* out[0,1],[1,1],[2,1],[3,1],[0,7],[1,7],[2,7],[3,7] */ - - movq_m2r(*(wsptr+2), mm5); /* tmp2,final3 */ - packuswb_r2r(mm6, mm2); /* out[0,0],[1,0],[2,0],[3,0],[0,6],[1,6],[2,6],[3,6] */ + movq_m2r (*(wsptr + 2), mm5); /* tmp2,final3 */ + packuswb_r2r (mm6, mm2); /* out[0,0],[1,0],[2,0],[3,0],[0,6],[1,6],[2,6],[3,6] */ /* outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) */ /* & RANGE_MASK]; */ /* outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) */ /* & RANGE_MASK]; final3 */ - paddw_r2r(mm1, mm7); /* tmp4 */ - movq_r2r(mm5, mm3); + paddw_r2r (mm1, mm7); /* tmp4 */ + movq_r2r (mm5, mm3); - paddw_r2r(mm1, mm5); /* tmp2+tmp5 */ - psubw_r2r(mm1, mm3); /* tmp2-tmp5 */ + paddw_r2r (mm1, mm5); /* tmp2+tmp5 */ + psubw_r2r (mm1, mm3); /* tmp2-tmp5 */ - psraw_i2r(3, mm5); /* outptr[0,2],[1,2],[2,2],[3,2] */ + psraw_i2r (3, mm5); /* outptr[0,2],[1,2],[2,2],[3,2] */ - movq_m2r(*(wsptr+3), mm4); /* tmp3,final4 */ - psraw_i2r(3, mm3); /* outptr[0,5],[1,5],[2,5],[3,5] */ + movq_m2r (*(wsptr + 3), mm4); /* tmp3,final4 */ + psraw_i2r (3, mm3); /* outptr[0,5],[1,5],[2,5],[3,5] */ @@ -2167,68 +2172,68 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; /* & RANGE_MASK]; */ /* outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) */ /* & RANGE_MASK]; final4 */ - movq_r2r(mm4, mm6); - paddw_r2r(mm7, mm4); /* tmp3+tmp4 */ + movq_r2r (mm4, mm6); + paddw_r2r (mm7, mm4); /* tmp3+tmp4 */ - psubw_r2r(mm7, mm6); /* tmp3-tmp4 */ - psraw_i2r(3, mm4); /* outptr[0,4],[1,4],[2,4],[3,4] */ + psubw_r2r (mm7, mm6); /* tmp3-tmp4 */ + psraw_i2r (3, mm4); /* outptr[0,4],[1,4],[2,4],[3,4] */ - psraw_i2r(3, mm6); /* outptr[0,3],[1,3],[2,3],[3,3] */ + psraw_i2r (3, mm6); /* outptr[0,3],[1,3],[2,3],[3,3] */ - /* - movq_r2m(mm4, *dummy); - fprintf(stderr, "3-4 %016llx\n", dummy); - movq_r2m(mm4, *dummy); - fprintf(stderr, "3+4 %016llx\n", dummy); - */ - + /* + movq_r2m(mm4, *dummy); + fprintf(stderr, "3-4 %016llx\n", dummy); + movq_r2m(mm4, *dummy); + fprintf(stderr, "3+4 %016llx\n", dummy); + */ - packuswb_r2r(mm4, mm5); /* out[0,2],[1,2],[2,2],[3,2],[0,4],[1,4],[2,4],[3,4] */ - packuswb_r2r(mm3, mm6); /* out[0,3],[1,3],[2,3],[3,3],[0,5],[1,5],[2,5],[3,5] */ - movq_r2r(mm2, mm4); + packuswb_r2r (mm4, mm5); /* out[0,2],[1,2],[2,2],[3,2],[0,4],[1,4],[2,4],[3,4] */ - movq_r2r(mm5, mm7); - punpcklbw_r2r(mm0, mm2); /* out[0,0],[0,1],[1,0],[1,1],[2,0],[2,1],[3,0],[3,1] */ + packuswb_r2r (mm3, mm6); /* out[0,3],[1,3],[2,3],[3,3],[0,5],[1,5],[2,5],[3,5] */ + movq_r2r (mm2, mm4); - punpckhbw_r2r(mm0, mm4); /* out[0,6],[0,7],[1,6],[1,7],[2,6],[2,7],[3,6],[3,7] */ - movq_r2r(mm2, mm1); + movq_r2r (mm5, mm7); + punpcklbw_r2r (mm0, mm2); /* out[0,0],[0,1],[1,0],[1,1],[2,0],[2,1],[3,0],[3,1] */ - punpcklbw_r2r(mm6, mm5); /* out[0,2],[0,3],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3] */ - - punpckhbw_r2r(mm6, mm7); /* out[0,4],[0,5],[1,4],[1,5],[2,4],[2,5],[3,4],[3,5] */ + punpckhbw_r2r (mm0, mm4); /* out[0,6],[0,7],[1,6],[1,7],[2,6],[2,7],[3,6],[3,7] */ + movq_r2r (mm2, mm1); - punpcklwd_r2r(mm5, mm2); /* out[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3] */ - - movq_r2r(mm7, mm6); - punpckhwd_r2r(mm5, mm1); /* out[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3] */ + punpcklbw_r2r (mm6, mm5); /* out[0,2],[0,3],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3] */ - movq_r2r(mm2, mm0); - punpcklwd_r2r(mm4, mm6); /* out[0,4],[0,5],[0,6],[0,7],[1,4],[1,5],[1,6],[1,7] */ + punpckhbw_r2r (mm6, mm7); /* out[0,4],[0,5],[1,4],[1,5],[2,4],[2,5],[3,4],[3,5] */ - punpckldq_r2r(mm6, mm2); /* out[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7] */ + punpcklwd_r2r (mm5, mm2); /* out[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3] */ - movq_r2r(mm1, mm3); + movq_r2r (mm7, mm6); + punpckhwd_r2r (mm5, mm1); /* out[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3] */ - punpckhwd_r2r(mm4, mm7); /* out[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7] */ - - dataptr += rskip; - movq_r2m(mm2, *(dataptr)); + movq_r2r (mm2, mm0); + punpcklwd_r2r (mm4, mm6); /* out[0,4],[0,5],[0,6],[0,7],[1,4],[1,5],[1,6],[1,7] */ - punpckhdq_r2r(mm6, mm0); /* out[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7] */ + punpckldq_r2r (mm6, mm2); /* out[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7] */ - dataptr += rskip; - movq_r2m(mm0, *(dataptr)); + movq_r2r (mm1, mm3); - punpckldq_r2r(mm7, mm1); /* out[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7] */ - - punpckhdq_r2r(mm7, mm3); /* out[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7] */ + punpckhwd_r2r (mm4, mm7); /* out[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7] */ - dataptr += rskip; - movq_r2m(mm1, *(dataptr)); + dataptr += rskip; + movq_r2m (mm2, *(dataptr)); - dataptr += rskip; - movq_r2m(mm3, *(dataptr)); + punpckhdq_r2r (mm6, mm0); /* out[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7] */ + + dataptr += rskip; + movq_r2m (mm0, *(dataptr)); + + punpckldq_r2r (mm7, mm1); /* out[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7] */ + + punpckhdq_r2r (mm7, mm3); /* out[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7] */ + + dataptr += rskip; + movq_r2m (mm1, *(dataptr)); + + dataptr += rskip; + movq_r2m (mm3, *(dataptr)); #else __s32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; @@ -2244,9 +2249,9 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; inptr = data; wsptr = workspace; for (ctr = 8; ctr > 0; ctr--) { - + if ((inptr[8] | inptr[16] | inptr[24] | - inptr[32] | inptr[40] | inptr[48] | inptr[56]) == 0) { + inptr[32] | inptr[40] | inptr[48] | inptr[56]) == 0) { dcval = inptr[0]; wsptr[0] = dcval; wsptr[8] = dcval; @@ -2256,12 +2261,12 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; wsptr[40] = dcval; wsptr[48] = dcval; wsptr[56] = dcval; - - inptr++; + + inptr++; wsptr++; continue; - } - + } + tmp0 = inptr[0]; tmp1 = inptr[16]; tmp2 = inptr[32]; @@ -2271,13 +2276,13 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; tmp11 = tmp0 - tmp2; tmp13 = tmp1 + tmp3; - tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; + tmp12 = MULTIPLY (tmp1 - tmp3, FIX_1_414213562) - tmp13; tmp0 = tmp10 + tmp13; tmp3 = tmp10 - tmp13; tmp1 = tmp11 + tmp12; tmp2 = tmp11 - tmp12; - + tmp4 = inptr[8]; tmp5 = inptr[24]; tmp6 = inptr[40]; @@ -2289,11 +2294,11 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; z12 = tmp4 - tmp7; tmp7 = z11 + z13; - tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); + tmp11 = MULTIPLY (z11 - z13, FIX_1_414213562); - z5 = MULTIPLY(z10 + z12, FIX_1_847759065); - tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; - tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; + z5 = MULTIPLY (z10 + z12, FIX_1_847759065); + tmp10 = MULTIPLY (z12, FIX_1_082392200) - z5; + tmp12 = MULTIPLY (z10, -FIX_2_613125930) + z5; tmp6 = tmp12 - tmp7; tmp5 = tmp11 - tmp6; @@ -2314,13 +2319,13 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; wsptr = workspace; for (ctr = 0; ctr < 8; ctr++) { - outptr = &(odata[ctr*rskip]); + outptr = &(odata[ctr * rskip]); tmp10 = wsptr[0] + wsptr[4]; tmp11 = wsptr[0] - wsptr[4]; tmp13 = wsptr[2] + wsptr[6]; - tmp12 = MULTIPLY(wsptr[2] - wsptr[6], FIX_1_414213562) - tmp13; + tmp12 = MULTIPLY (wsptr[2] - wsptr[6], FIX_1_414213562) - tmp13; tmp0 = tmp10 + tmp13; tmp3 = tmp10 - tmp13; @@ -2333,29 +2338,30 @@ static mmx_t fix_108n184 = (mmx_t)(long long)0xcf04cf04cf04cf04LL; z12 = wsptr[1] - wsptr[7]; tmp7 = z11 + z13; - tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); + tmp11 = MULTIPLY (z11 - z13, FIX_1_414213562); - z5 = MULTIPLY(z10 + z12, FIX_1_847759065); - tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; - tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; + z5 = MULTIPLY (z10 + z12, FIX_1_847759065); + tmp10 = MULTIPLY (z12, FIX_1_082392200) - z5; + tmp12 = MULTIPLY (z10, -FIX_2_613125930) + z5; tmp6 = tmp12 - tmp7; tmp5 = tmp11 - tmp6; tmp4 = tmp10 + tmp5; - outptr[0] = RL(DESCALE(tmp0 + tmp7)); - outptr[7] = RL(DESCALE(tmp0 - tmp7)); - outptr[1] = RL(DESCALE(tmp1 + tmp6)); - outptr[6] = RL(DESCALE(tmp1 - tmp6)); - outptr[2] = RL(DESCALE(tmp2 + tmp5)); - outptr[5] = RL(DESCALE(tmp2 - tmp5)); - outptr[4] = RL(DESCALE(tmp3 + tmp4)); - outptr[3] = RL(DESCALE(tmp3 - tmp4)); + outptr[0] = RL (DESCALE (tmp0 + tmp7)); + outptr[7] = RL (DESCALE (tmp0 - tmp7)); + outptr[1] = RL (DESCALE (tmp1 + tmp6)); + outptr[6] = RL (DESCALE (tmp1 - tmp6)); + outptr[2] = RL (DESCALE (tmp2 + tmp5)); + outptr[5] = RL (DESCALE (tmp2 - tmp5)); + outptr[4] = RL (DESCALE (tmp3 + tmp4)); + outptr[3] = RL (DESCALE (tmp3 - tmp4)); wsptr += 8; } #endif } + /* Main Routines @@ -2374,24 +2380,25 @@ Initialise all the cache-aliged data blocks */ -void RTjpeg_init_data(void) +void +RTjpeg_init_data (void) { - unsigned long dptr; - - dptr=(unsigned long)&(RTjpeg_alldata[0]); - dptr+=32; - dptr=dptr>>5; - dptr=dptr<<5; /* cache align data */ - - RTjpeg_block=(__s16 *)dptr; - dptr+=sizeof(__s16)*64; - RTjpeg_lqt=(__s32 *)dptr; - dptr+=sizeof(__s32)*64; - RTjpeg_cqt=(__s32 *)dptr; - dptr+=sizeof(__s32)*64; - RTjpeg_liqt=(__u32 *)dptr; - dptr+=sizeof(__u32)*64; - RTjpeg_ciqt=(__u32 *)dptr; + unsigned long dptr; + + dptr = (unsigned long) &(RTjpeg_alldata[0]); + dptr += 32; + dptr = dptr >> 5; + dptr = dptr << 5; /* cache align data */ + + RTjpeg_block = (__s16 *) dptr; + dptr += sizeof (__s16) * 64; + RTjpeg_lqt = (__s32 *) dptr; + dptr += sizeof (__s32) * 64; + RTjpeg_cqt = (__s32 *) dptr; + dptr += sizeof (__s32) * 64; + RTjpeg_liqt = (__u32 *) dptr; + dptr += sizeof (__u32) * 64; + RTjpeg_ciqt = (__u32 *) dptr; } /* @@ -2405,35 +2412,39 @@ Input: buf -> pointer to 128 ints for quant values store to pass back to Q -> quality factor (192=best, 32=worst) */ -void RTjpeg_init_Q(__u8 Q) +void +RTjpeg_init_Q (__u8 Q) { - int i; - __u64 qual; - - qual=(__u64)Q<<(32-7); /* 32 bit FP, 255=2, 0=0 */ - - for(i=0; i<64; i++) - { - RTjpeg_lqt[i]=(__s32)((qual/((__u64)RTjpeg_lum_quant_tbl[i]<<16))>>3); - if(RTjpeg_lqt[i]==0)RTjpeg_lqt[i]=1; - RTjpeg_cqt[i]=(__s32)((qual/((__u64)RTjpeg_chrom_quant_tbl[i]<<16))>>3); - if(RTjpeg_cqt[i]==0)RTjpeg_cqt[i]=1; - RTjpeg_liqt[i]=(1<<16)/(RTjpeg_lqt[i]<<3); - RTjpeg_ciqt[i]=(1<<16)/(RTjpeg_cqt[i]<<3); - RTjpeg_lqt[i]=((1<<16)/RTjpeg_liqt[i])>>3; - RTjpeg_cqt[i]=((1<<16)/RTjpeg_ciqt[i])>>3; - } - - RTjpeg_lb8=0; - while(RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]]<=8); - RTjpeg_lb8--; - RTjpeg_cb8=0; - while(RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]]<=8); - RTjpeg_cb8--; - - RTjpeg_dct_init(); - RTjpeg_idct_init(); - RTjpeg_quant_init(); + int i; + __u64 qual; + + qual = (__u64) Q << (32 - 7); /* 32 bit FP, 255=2, 0=0 */ + + for (i = 0; i < 64; i++) { + RTjpeg_lqt[i] = + (__s32) ((qual / ((__u64) RTjpeg_lum_quant_tbl[i] << 16)) >> 3); + if (RTjpeg_lqt[i] == 0) + RTjpeg_lqt[i] = 1; + RTjpeg_cqt[i] = + (__s32) ((qual / ((__u64) RTjpeg_chrom_quant_tbl[i] << 16)) >> 3); + if (RTjpeg_cqt[i] == 0) + RTjpeg_cqt[i] = 1; + RTjpeg_liqt[i] = (1 << 16) / (RTjpeg_lqt[i] << 3); + RTjpeg_ciqt[i] = (1 << 16) / (RTjpeg_cqt[i] << 3); + RTjpeg_lqt[i] = ((1 << 16) / RTjpeg_liqt[i]) >> 3; + RTjpeg_cqt[i] = ((1 << 16) / RTjpeg_ciqt[i]) >> 3; + } + + RTjpeg_lb8 = 0; + while (RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]] <= 8); + RTjpeg_lb8--; + RTjpeg_cb8 = 0; + while (RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]] <= 8); + RTjpeg_cb8--; + + RTjpeg_dct_init (); + RTjpeg_idct_init (); + RTjpeg_quant_init (); } /* @@ -2450,337 +2461,338 @@ Input: buf -> pointer to 128 ints for quant values store to pass back to */ -void RTjpeg_init_compress(__u32 *buf, int width, int height, __u8 Q) +void +RTjpeg_init_compress (__u32 * buf, int width, int height, __u8 Q) { - int i; - __u64 qual; - - RTjpeg_init_data(); - - RTjpeg_width=width; - RTjpeg_height=height; - RTjpeg_Ywidth = RTjpeg_width>>3; - RTjpeg_Ysize=width * height; - RTjpeg_Cwidth = RTjpeg_width>>4; - RTjpeg_Csize= (width>>1) * height; - - qual=(__u64)Q<<(32-7); /* 32 bit FP, 255=2, 0=0 */ - - for(i=0; i<64; i++) - { - RTjpeg_lqt[i]=(__s32)((qual/((__u64)RTjpeg_lum_quant_tbl[i]<<16))>>3); - if(RTjpeg_lqt[i]==0)RTjpeg_lqt[i]=1; - RTjpeg_cqt[i]=(__s32)((qual/((__u64)RTjpeg_chrom_quant_tbl[i]<<16))>>3); - if(RTjpeg_cqt[i]==0)RTjpeg_cqt[i]=1; - RTjpeg_liqt[i]=(1<<16)/(RTjpeg_lqt[i]<<3); - RTjpeg_ciqt[i]=(1<<16)/(RTjpeg_cqt[i]<<3); - RTjpeg_lqt[i]=((1<<16)/RTjpeg_liqt[i])>>3; - RTjpeg_cqt[i]=((1<<16)/RTjpeg_ciqt[i])>>3; - } - - RTjpeg_lb8=0; - while(RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]]<=8); - RTjpeg_lb8--; - RTjpeg_cb8=0; - while(RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]]<=8); - RTjpeg_cb8--; - - RTjpeg_dct_init(); - RTjpeg_quant_init(); - - for(i=0; i<64; i++) - buf[i]=RTjpeg_liqt[i]; - for(i=0; i<64; i++) - buf[64+i]=RTjpeg_ciqt[i]; + int i; + __u64 qual; + + RTjpeg_init_data (); + + RTjpeg_width = width; + RTjpeg_height = height; + RTjpeg_Ywidth = RTjpeg_width >> 3; + RTjpeg_Ysize = width * height; + RTjpeg_Cwidth = RTjpeg_width >> 4; + RTjpeg_Csize = (width >> 1) * height; + + qual = (__u64) Q << (32 - 7); /* 32 bit FP, 255=2, 0=0 */ + + for (i = 0; i < 64; i++) { + RTjpeg_lqt[i] = + (__s32) ((qual / ((__u64) RTjpeg_lum_quant_tbl[i] << 16)) >> 3); + if (RTjpeg_lqt[i] == 0) + RTjpeg_lqt[i] = 1; + RTjpeg_cqt[i] = + (__s32) ((qual / ((__u64) RTjpeg_chrom_quant_tbl[i] << 16)) >> 3); + if (RTjpeg_cqt[i] == 0) + RTjpeg_cqt[i] = 1; + RTjpeg_liqt[i] = (1 << 16) / (RTjpeg_lqt[i] << 3); + RTjpeg_ciqt[i] = (1 << 16) / (RTjpeg_cqt[i] << 3); + RTjpeg_lqt[i] = ((1 << 16) / RTjpeg_liqt[i]) >> 3; + RTjpeg_cqt[i] = ((1 << 16) / RTjpeg_ciqt[i]) >> 3; + } + + RTjpeg_lb8 = 0; + while (RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]] <= 8); + RTjpeg_lb8--; + RTjpeg_cb8 = 0; + while (RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]] <= 8); + RTjpeg_cb8--; + + RTjpeg_dct_init (); + RTjpeg_quant_init (); + + for (i = 0; i < 64; i++) + buf[i] = RTjpeg_liqt[i]; + for (i = 0; i < 64; i++) + buf[64 + i] = RTjpeg_ciqt[i]; } -void RTjpeg_init_decompress(__u32 *buf, int width, int height) +void +RTjpeg_init_decompress (__u32 * buf, int width, int height) { - int i; - - RTjpeg_init_data(); - - RTjpeg_width=width; - RTjpeg_height=height; - RTjpeg_Ywidth = RTjpeg_width>>3; - RTjpeg_Ysize=width * height; - RTjpeg_Cwidth = RTjpeg_width>>4; - RTjpeg_Csize= (width>>1) * height; - - for(i=0; i<64; i++) - { - RTjpeg_liqt[i]=buf[i]; - RTjpeg_ciqt[i]=buf[i+64]; - } - - RTjpeg_lb8=0; - while(RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]]<=8); - RTjpeg_lb8--; - RTjpeg_cb8=0; - while(RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]]<=8); - RTjpeg_cb8--; - - RTjpeg_idct_init(); + int i; + + RTjpeg_init_data (); + + RTjpeg_width = width; + RTjpeg_height = height; + RTjpeg_Ywidth = RTjpeg_width >> 3; + RTjpeg_Ysize = width * height; + RTjpeg_Cwidth = RTjpeg_width >> 4; + RTjpeg_Csize = (width >> 1) * height; + + for (i = 0; i < 64; i++) { + RTjpeg_liqt[i] = buf[i]; + RTjpeg_ciqt[i] = buf[i + 64]; + } + + RTjpeg_lb8 = 0; + while (RTjpeg_liqt[RTjpeg_ZZ[++RTjpeg_lb8]] <= 8); + RTjpeg_lb8--; + RTjpeg_cb8 = 0; + while (RTjpeg_ciqt[RTjpeg_ZZ[++RTjpeg_cb8]] <= 8); + RTjpeg_cb8--; + + RTjpeg_idct_init (); /* RTjpeg_color_init(); */ } -int RTjpeg_compressYUV420(__s8 *sp, unsigned char *bp) +int +RTjpeg_compressYUV420 (__s8 * sp, unsigned char *bp) { - __s8 * sb; - register __s8 * bp1 = bp + (RTjpeg_width<<3); - register __s8 * bp2 = bp + RTjpeg_Ysize; - register __s8 * bp3 = bp2 + (RTjpeg_Csize>>1); - register int i, j, k; + __s8 *sb; + register __s8 *bp1 = bp + (RTjpeg_width << 3); + register __s8 *bp2 = bp + RTjpeg_Ysize; + register __s8 *bp3 = bp2 + (RTjpeg_Csize >> 1); + register int i, j, k; #ifdef HAVE_LIBMMX - emms(); + emms (); #endif - sb=sp; + sb = sp; /* Y */ - for(i=RTjpeg_height>>1; i; i-=8) - { - for(j=0, k=0; j> 1; i; i -= 8) { + for (j = 0, k = 0; j < RTjpeg_width; j += 16, k += 8) { + RTjpeg_dctY (bp + j, RTjpeg_block, RTjpeg_Ywidth); + RTjpeg_quant (RTjpeg_block, RTjpeg_lqt); + sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_lb8); + + RTjpeg_dctY (bp + j + 8, RTjpeg_block, RTjpeg_Ywidth); + RTjpeg_quant (RTjpeg_block, RTjpeg_lqt); + sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_lb8); + + RTjpeg_dctY (bp1 + j, RTjpeg_block, RTjpeg_Ywidth); + RTjpeg_quant (RTjpeg_block, RTjpeg_lqt); + sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_lb8); + + RTjpeg_dctY (bp1 + j + 8, RTjpeg_block, RTjpeg_Ywidth); + RTjpeg_quant (RTjpeg_block, RTjpeg_lqt); + sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_lb8); + + RTjpeg_dctY (bp2 + k, RTjpeg_block, RTjpeg_Cwidth); + RTjpeg_quant (RTjpeg_block, RTjpeg_cqt); + sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_cb8); + + RTjpeg_dctY (bp3 + k, RTjpeg_block, RTjpeg_Cwidth); + RTjpeg_quant (RTjpeg_block, RTjpeg_cqt); + sp += RTjpeg_b2s (RTjpeg_block, sp, RTjpeg_cb8); + + } + bp += RTjpeg_width << 4; + bp1 += RTjpeg_width << 4; + bp2 += RTjpeg_width << 2; + bp3 += RTjpeg_width << 2; } - bp+=RTjpeg_width<<4; - bp1+=RTjpeg_width<<4; - bp2+=RTjpeg_width<<2; - bp3+=RTjpeg_width<<2; - - } #ifdef HAVE_LIBMMX - emms(); + emms (); #endif - return (sp-sb); + return (sp - sb); } -int RTjpeg_compressYUV422(__s8 *sp, unsigned char *bp) +int +RTjpeg_compressYUV422 (__s8 * sp, unsigned char *bp) { - __s8 * sb; - register __s8 * bp2 = bp + RTjpeg_Ysize; - register __s8 * bp3 = bp2 + RTjpeg_Csize; - register int i, j, k; + __s8 *sb; + register __s8 *bp2 = bp + RTjpeg_Ysize; + register __s8 *bp3 = bp2 + RTjpeg_Csize; + register int i, j, k; #ifdef HAVE_LIBMMX - emms(); + emms (); #endif - sb=sp; + sb = sp; /* Y */ - for(i=RTjpeg_height; i; i-=8) - { - for(j=0, k=0; j>1); - } - if(*sp==-1)sp++; - else - { - sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt); - RTjpeg_idct(bp3+k, RTjpeg_block, RTjpeg_width>>1); - } + for (i = RTjpeg_height; i; i -= 8) { + for (k = 0, j = 0; j < RTjpeg_width; j += 16, k += 8) { + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt); + RTjpeg_idct (bp + j, RTjpeg_block, RTjpeg_width); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt); + RTjpeg_idct (bp + j + 8, RTjpeg_block, RTjpeg_width); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt); + RTjpeg_idct (bp2 + k, RTjpeg_block, RTjpeg_width >> 1); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt); + RTjpeg_idct (bp3 + k, RTjpeg_block, RTjpeg_width >> 1); + } + } + bp += RTjpeg_width << 3; + bp2 += RTjpeg_width << 2; + bp3 += RTjpeg_width << 2; } - bp+=RTjpeg_width<<3; - bp2+=RTjpeg_width<<2; - bp3+=RTjpeg_width<<2; - } #ifdef HAVE_LIBMMX - emms(); + emms (); #endif } -void RTjpeg_decompressYUV420(__s8 *sp, __u8 *bp) +void +RTjpeg_decompressYUV420 (__s8 * sp, __u8 * bp) { - register __s8 * bp1 = bp + (RTjpeg_width<<3); - register __s8 * bp2 = bp + RTjpeg_Ysize; - register __s8 * bp3 = bp2 + (RTjpeg_Csize>>1); - int i, j,k; + register __s8 *bp1 = bp + (RTjpeg_width << 3); + register __s8 *bp2 = bp + RTjpeg_Ysize; + register __s8 *bp3 = bp2 + (RTjpeg_Csize >> 1); + int i, j, k; #ifdef HAVE_LIBMMX - emms(); + emms (); #endif /* Y */ - for(i=RTjpeg_height>>1; i; i-=8) - { - for(k=0, j=0; j>1); - } - if(*sp==-1)sp++; - else - { - sp+=RTjpeg_s2b(RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt); - RTjpeg_idct(bp3+k, RTjpeg_block, RTjpeg_width>>1); - } + for (i = RTjpeg_height >> 1; i; i -= 8) { + for (k = 0, j = 0; j < RTjpeg_width; j += 16, k += 8) { + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt); + RTjpeg_idct (bp + j, RTjpeg_block, RTjpeg_width); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt); + RTjpeg_idct (bp + j + 8, RTjpeg_block, RTjpeg_width); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt); + RTjpeg_idct (bp1 + j, RTjpeg_block, RTjpeg_width); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_lb8, RTjpeg_liqt); + RTjpeg_idct (bp1 + j + 8, RTjpeg_block, RTjpeg_width); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt); + RTjpeg_idct (bp2 + k, RTjpeg_block, RTjpeg_width >> 1); + } + if (*sp == -1) + sp++; + else { + sp += RTjpeg_s2b (RTjpeg_block, sp, RTjpeg_cb8, RTjpeg_ciqt); + RTjpeg_idct (bp3 + k, RTjpeg_block, RTjpeg_width >> 1); + } + } + bp += RTjpeg_width << 4; + bp1 += RTjpeg_width << 4; + bp2 += RTjpeg_width << 2; + bp3 += RTjpeg_width << 2; } - bp+=RTjpeg_width<<4; - bp1+=RTjpeg_width<<4; - bp2+=RTjpeg_width<<2; - bp3+=RTjpeg_width<<2; - } #ifdef HAVE_LIBMMX - emms(); + emms (); #endif } -void RTjpeg_decompress8(__s8 *sp, __u8 *bp) +void +RTjpeg_decompress8 (__s8 * sp, __u8 * bp) { - int i, j; + int i, j; #ifdef HAVE_LIBMMX - emms(); + emms (); #endif /* Y */ - for(i=0; i>5; - RTjpeg_old=(__s16 *)(tmp<<5); - } - if (!RTjpeg_old) - { - fprintf(stderr, "RTjpeg: Could not allocate memory\n"); - exit(-1); - } - memset (RTjpeg_old, 0, ((4*RTjpeg_width*RTjpeg_height))); + unsigned long tmp; + + if (!RTjpeg_old) { + RTjpeg_old = malloc ((4 * RTjpeg_width * RTjpeg_height) + 32); + tmp = (unsigned long) RTjpeg_old; + tmp += 32; + tmp = tmp >> 5; + RTjpeg_old = (__s16 *) (tmp << 5); + } + if (!RTjpeg_old) { + fprintf (stderr, "RTjpeg: Could not allocate memory\n"); + exit (-1); + } + memset (RTjpeg_old, 0, ((4 * RTjpeg_width * RTjpeg_height))); } #ifdef HAVE_LIBMMX -int RTjpeg_bcomp(__s16 *old, mmx_t *mask) +int +RTjpeg_bcomp (__s16 * old, mmx_t * mask) { - int i; - mmx_t *mold=(mmx_t *)old; - mmx_t *mblock=(mmx_t *)RTjpeg_block; - mmx_t result; - static mmx_t neg=(mmx_t)(unsigned long long)0xffffffffffffffffULL; - - movq_m2r(*mask, mm7); - movq_m2r(neg, mm6); - pxor_r2r(mm5, mm5); - - for(i=0; i<8; i++) - { - movq_m2r(*(mblock++), mm0); - movq_m2r(*(mblock++), mm2); - movq_m2r(*(mold++), mm1); - movq_m2r(*(mold++), mm3); - psubsw_r2r(mm1, mm0); - psubsw_r2r(mm3, mm2); - movq_r2r(mm0, mm1); - movq_r2r(mm2, mm3); - pcmpgtw_r2r(mm7, mm0); - pcmpgtw_r2r(mm7, mm2); - pxor_r2r(mm6, mm1); - pxor_r2r(mm6, mm3); - pcmpgtw_r2r(mm7, mm1); - pcmpgtw_r2r(mm7, mm3); - por_r2r(mm0, mm5); - por_r2r(mm2, mm5); - por_r2r(mm1, mm5); - por_r2r(mm3, mm5); - } - movq_r2m(mm5, result); - - if(result.q) - { - if(!RTjpeg_mtest) - for(i=0; i<16; i++)((__u64 *)old)[i]=((__u64 *)RTjpeg_block)[i]; - return 0; - } + int i; + mmx_t *mold = (mmx_t *) old; + mmx_t *mblock = (mmx_t *) RTjpeg_block; + mmx_t result; + static mmx_t neg = (mmx_t) (unsigned long long) 0xffffffffffffffffULL; + + movq_m2r (*mask, mm7); + movq_m2r (neg, mm6); + pxor_r2r (mm5, mm5); + + for (i = 0; i < 8; i++) { + movq_m2r (*(mblock++), mm0); + movq_m2r (*(mblock++), mm2); + movq_m2r (*(mold++), mm1); + movq_m2r (*(mold++), mm3); + psubsw_r2r (mm1, mm0); + psubsw_r2r (mm3, mm2); + movq_r2r (mm0, mm1); + movq_r2r (mm2, mm3); + pcmpgtw_r2r (mm7, mm0); + pcmpgtw_r2r (mm7, mm2); + pxor_r2r (mm6, mm1); + pxor_r2r (mm6, mm3); + pcmpgtw_r2r (mm7, mm1); + pcmpgtw_r2r (mm7, mm3); + por_r2r (mm0, mm5); + por_r2r (mm2, mm5); + por_r2r (mm1, mm5); + por_r2r (mm3, mm5); + } + movq_r2m (mm5, result); + + if (result.q) { + if (!RTjpeg_mtest) + for (i = 0; i < 16; i++) + ((__u64 *) old)[i] = ((__u64 *) RTjpeg_block)[i]; + return 0; + } /* printf("."); */ - return 1; + return 1; } #else -int RTjpeg_bcomp(__s16 *old, __u16 *mask) +int +RTjpeg_bcomp (__s16 * old, __u16 * mask) { - int i; - - for(i=0; i<64; i++) - if(abs(old[i]-RTjpeg_block[i])>*mask) - { - if(!RTjpeg_mtest) - for(i=0; i<16; i++)((__u64 *)old)[i]=((__u64 *)RTjpeg_block)[i]; - return 0; - } - return 1; + int i; + + for (i = 0; i < 64; i++) + if (abs (old[i] - RTjpeg_block[i]) > *mask) { + if (!RTjpeg_mtest) + for (i = 0; i < 16; i++) + ((__u64 *) old)[i] = ((__u64 *) RTjpeg_block)[i]; + return 0; + } + return 1; } #endif -void RTjpeg_set_test(int i) +void +RTjpeg_set_test (int i) { - RTjpeg_mtest=i; + RTjpeg_mtest = i; } -int RTjpeg_mcompress(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask) +int +RTjpeg_mcompress (__s8 * sp, unsigned char *bp, __u16 lmask, __u16 cmask) { - __s8 * sb; - __s16 *block; - register __s8 * bp2; - register __s8 * bp3; - register int i, j, k; + __s8 *sb; + __s16 *block; + register __s8 *bp2; + register __s8 *bp3; + register int i, j, k; #ifdef HAVE_LIBMMX - emms(); - RTjpeg_lmask=(mmx_t)(((__u64)lmask<<48)|((__u64)lmask<<32)|((__u64)lmask<<16)|lmask); - RTjpeg_cmask=(mmx_t)(((__u64)cmask<<48)|((__u64)cmask<<32)|((__u64)cmask<<16)|cmask); + emms (); + RTjpeg_lmask = + (mmx_t) (((__u64) lmask << 48) | ((__u64) lmask << 32) | ((__u64) lmask << + 16) | lmask); + RTjpeg_cmask = + (mmx_t) (((__u64) cmask << 48) | ((__u64) cmask << 32) | ((__u64) cmask << + 16) | cmask); #else - RTjpeg_lmask=lmask; - RTjpeg_cmask=cmask; + RTjpeg_lmask = lmask; + RTjpeg_cmask = cmask; #endif - - bp = bp - RTjpeg_width*0; - bp2 = bp + RTjpeg_Ysize-RTjpeg_width*0; - bp3 = bp2 + RTjpeg_Csize; - sb=sp; - block=RTjpeg_old; -/* Y */ - for(i=RTjpeg_height; i; i-=8) - { - for(j=0, k=0; j>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+cbB)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+1]-16)*Ky; - - tmp=(y+crR)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+cbB)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - + int tmp; + int i, j; + __s32 y, crR, crG, cbG, cbB; + __u8 *bufcr, *bufcb, *bufy, *bufoute; + int yskip; + + yskip = RTjpeg_width; + + bufcb = &buf[RTjpeg_width * RTjpeg_height]; + bufcr = + &buf[RTjpeg_width * RTjpeg_height + (RTjpeg_width * RTjpeg_height) / 2]; + bufy = &buf[0]; + bufoute = rgb; + + for (i = 0; i < (RTjpeg_height); i++) { + for (j = 0; j < RTjpeg_width; j += 2) { + crR = (*bufcr - 128) * KcrR; + crG = (*(bufcr++) - 128) * KcrG; + cbG = (*bufcb - 128) * KcbG; + cbB = (*(bufcb++) - 128) * KcbB; + + y = (bufy[j] - 16) * Ky; + + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + 1] - 16) * Ky; + + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + } + bufy += yskip; } - bufy+=yskip; - } } -void RTjpeg_yuv420rgb(__u8 *buf, __u8 *rgb) +void +RTjpeg_yuv420rgb (__u8 * buf, __u8 * rgb) { - int tmp; - int i, j; - __s32 y, crR, crG, cbG, cbB; - __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; - int oskip, yskip; - - oskip=RTjpeg_width*3; - yskip=RTjpeg_width; - - bufcb=&buf[RTjpeg_width*RTjpeg_height]; - bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4]; - bufy=&buf[0]; - bufoute=rgb; - bufouto=rgb+oskip; - - for(i=0; i<(RTjpeg_height>>1); i++) - { - for(j=0; j>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+cbB)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+1]-16)*Ky; - - tmp=(y+crR)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+cbB)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+yskip]-16)*Ky; - - tmp=(y+crR)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+cbB)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+1+yskip]-16)*Ky; - - tmp=(y+crR)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+cbB)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - + int tmp; + int i, j; + __s32 y, crR, crG, cbG, cbB; + __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; + int oskip, yskip; + + oskip = RTjpeg_width * 3; + yskip = RTjpeg_width; + + bufcb = &buf[RTjpeg_width * RTjpeg_height]; + bufcr = + &buf[RTjpeg_width * RTjpeg_height + (RTjpeg_width * RTjpeg_height) / 4]; + bufy = &buf[0]; + bufoute = rgb; + bufouto = rgb + oskip; + + for (i = 0; i < (RTjpeg_height >> 1); i++) { + for (j = 0; j < RTjpeg_width; j += 2) { + crR = (*bufcr - 128) * KcrR; + crG = (*(bufcr++) - 128) * KcrG; + cbG = (*bufcb - 128) * KcbG; + cbB = (*(bufcb++) - 128) * KcbB; + + y = (bufy[j] - 16) * Ky; + + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + 1] - 16) * Ky; + + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + yskip] - 16) * Ky; + + tmp = (y + crR) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + cbB) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + 1 + yskip] - 16) * Ky; + + tmp = (y + crR) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + cbB) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + } + bufoute += oskip; + bufouto += oskip; + bufy += yskip << 1; } - bufoute+=oskip; - bufouto+=oskip; - bufy+=yskip<<1; - } } -void RTjpeg_yuvrgb32(__u8 *buf, __u8 *rgb) +void +RTjpeg_yuvrgb32 (__u8 * buf, __u8 * rgb) { - int tmp; - int i, j; - __s32 y, crR, crG, cbG, cbB; - __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; - int oskip, yskip; - - oskip=RTjpeg_width*4; - yskip=RTjpeg_width; - - bufcb=&buf[RTjpeg_width*RTjpeg_height]; - bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/2]; - bufy=&buf[0]; - bufoute=rgb; - bufouto=rgb+oskip; - - for(i=0; i<(RTjpeg_height>>1); i++) - { - for(j=0; j>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - bufoute++; - - y=(bufy[j+1]-16)*Ky; - - tmp=(y+cbB)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - bufoute++; - - y=(bufy[j+yskip]-16)*Ky; - - tmp=(y+cbB)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - bufouto++; - - y=(bufy[j+1+yskip]-16)*Ky; - - tmp=(y+cbB)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - bufouto++; - + int tmp; + int i, j; + __s32 y, crR, crG, cbG, cbB; + __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; + int oskip, yskip; + + oskip = RTjpeg_width * 4; + yskip = RTjpeg_width; + + bufcb = &buf[RTjpeg_width * RTjpeg_height]; + bufcr = + &buf[RTjpeg_width * RTjpeg_height + (RTjpeg_width * RTjpeg_height) / 2]; + bufy = &buf[0]; + bufoute = rgb; + bufouto = rgb + oskip; + + for (i = 0; i < (RTjpeg_height >> 1); i++) { + for (j = 0; j < RTjpeg_width; j += 2) { + crR = (*bufcr - 128) * KcrR; + crG = (*(bufcr++) - 128) * KcrG; + cbG = (*bufcb - 128) * KcbG; + cbB = (*(bufcb++) - 128) * KcbB; + + y = (bufy[j] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + bufoute++; + + y = (bufy[j + 1] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + bufoute++; + + y = (bufy[j + yskip] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + bufouto++; + + y = (bufy[j + 1 + yskip] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + bufouto++; + + } + bufoute += oskip; + bufouto += oskip; + bufy += yskip << 1; } - bufoute+=oskip; - bufouto+=oskip; - bufy+=yskip<<1; - } } -void RTjpeg_yuvrgb24(__u8 *buf, __u8 *rgb) +void +RTjpeg_yuvrgb24 (__u8 * buf, __u8 * rgb) { - int tmp; - int i, j; - __s32 y, crR, crG, cbG, cbB; - __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; - int oskip, yskip; - - oskip=RTjpeg_width*3; - yskip=RTjpeg_width; - - bufcb=&buf[RTjpeg_width*RTjpeg_height]; - bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4]; - bufy=&buf[0]; - bufoute=rgb; - bufouto=rgb+oskip; - - for(i=0; i<(RTjpeg_height>>1); i++) - { - for(j=0; j>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+1]-16)*Ky; - - tmp=(y+cbB)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufoute++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+yskip]-16)*Ky; - - tmp=(y+cbB)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - - y=(bufy[j+1+yskip]-16)*Ky; - - tmp=(y+cbB)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - *(bufouto++)=(tmp>255)?255:((tmp<0)?0:tmp); - + int tmp; + int i, j; + __s32 y, crR, crG, cbG, cbB; + __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; + int oskip, yskip; + + oskip = RTjpeg_width * 3; + yskip = RTjpeg_width; + + bufcb = &buf[RTjpeg_width * RTjpeg_height]; + bufcr = + &buf[RTjpeg_width * RTjpeg_height + (RTjpeg_width * RTjpeg_height) / 4]; + bufy = &buf[0]; + bufoute = rgb; + bufouto = rgb + oskip; + + for (i = 0; i < (RTjpeg_height >> 1); i++) { + for (j = 0; j < RTjpeg_width; j += 2) { + crR = (*bufcr - 128) * KcrR; + crG = (*(bufcr++) - 128) * KcrG; + cbG = (*bufcb - 128) * KcbG; + cbB = (*(bufcb++) - 128) * KcbB; + + y = (bufy[j] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + 1] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufoute++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + yskip] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + y = (bufy[j + 1 + yskip] - 16) * Ky; + + tmp = (y + cbB) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + *(bufouto++) = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + + } + bufoute += oskip; + bufouto += oskip; + bufy += yskip << 1; } - bufoute+=oskip; - bufouto+=oskip; - bufy+=yskip<<1; - } } -void RTjpeg_yuvrgb16(__u8 *buf, __u8 *rgb) +void +RTjpeg_yuvrgb16 (__u8 * buf, __u8 * rgb) { - int tmp; - int i, j; - __s32 y, crR, crG, cbG, cbB; - __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; - int oskip, yskip; - unsigned char r, g, b; - - oskip=RTjpeg_width*2; - yskip=RTjpeg_width; - - bufcb=&buf[RTjpeg_width*RTjpeg_height]; - bufcr=&buf[RTjpeg_width*RTjpeg_height+(RTjpeg_width*RTjpeg_height)/4]; - bufy=&buf[0]; - bufoute=rgb; - bufouto=rgb+oskip; - - for(i=0; i<(RTjpeg_height>>1); i++) - { - for(j=0; j>16; - b=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - g=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - r=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(int)((int)b >> 3); - tmp|=(int)(((int)g >> 2) << 5); - tmp|=(int)(((int)r >> 3) << 11); - *(bufoute++)=tmp&0xff; - *(bufoute++)=tmp>>8; - - - y=(bufy[j+1]-16)*Ky; - - tmp=(y+cbB)>>16; - b=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - g=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - r=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(int)((int)b >> 3); - tmp|=(int)(((int)g >> 2) << 5); - tmp|=(int)(((int)r >> 3) << 11); - *(bufoute++)=tmp&0xff; - *(bufoute++)=tmp>>8; - - y=(bufy[j+yskip]-16)*Ky; - - tmp=(y+cbB)>>16; - b=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - g=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - r=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(int)((int)b >> 3); - tmp|=(int)(((int)g >> 2) << 5); - tmp|=(int)(((int)r >> 3) << 11); - *(bufouto++)=tmp&0xff; - *(bufouto++)=tmp>>8; - - y=(bufy[j+1+yskip]-16)*Ky; - - tmp=(y+cbB)>>16; - b=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y-crG-cbG)>>16; - g=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(y+crR)>>16; - r=(tmp>255)?255:((tmp<0)?0:tmp); - tmp=(int)((int)b >> 3); - tmp|=(int)(((int)g >> 2) << 5); - tmp|=(int)(((int)r >> 3) << 11); - *(bufouto++)=tmp&0xff; - *(bufouto++)=tmp>>8; - + int tmp; + int i, j; + __s32 y, crR, crG, cbG, cbB; + __u8 *bufcr, *bufcb, *bufy, *bufoute, *bufouto; + int oskip, yskip; + unsigned char r, g, b; + + oskip = RTjpeg_width * 2; + yskip = RTjpeg_width; + + bufcb = &buf[RTjpeg_width * RTjpeg_height]; + bufcr = + &buf[RTjpeg_width * RTjpeg_height + (RTjpeg_width * RTjpeg_height) / 4]; + bufy = &buf[0]; + bufoute = rgb; + bufouto = rgb + oskip; + + for (i = 0; i < (RTjpeg_height >> 1); i++) { + for (j = 0; j < RTjpeg_width; j += 2) { + crR = (*bufcr - 128) * KcrR; + crG = (*(bufcr++) - 128) * KcrG; + cbG = (*bufcb - 128) * KcbG; + cbB = (*(bufcb++) - 128) * KcbB; + + y = (bufy[j] - 16) * Ky; + + tmp = (y + cbB) >> 16; + b = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + g = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + r = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (int) ((int) b >> 3); + tmp |= (int) (((int) g >> 2) << 5); + tmp |= (int) (((int) r >> 3) << 11); + *(bufoute++) = tmp & 0xff; + *(bufoute++) = tmp >> 8; + + + y = (bufy[j + 1] - 16) * Ky; + + tmp = (y + cbB) >> 16; + b = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + g = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + r = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (int) ((int) b >> 3); + tmp |= (int) (((int) g >> 2) << 5); + tmp |= (int) (((int) r >> 3) << 11); + *(bufoute++) = tmp & 0xff; + *(bufoute++) = tmp >> 8; + + y = (bufy[j + yskip] - 16) * Ky; + + tmp = (y + cbB) >> 16; + b = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + g = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + r = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (int) ((int) b >> 3); + tmp |= (int) (((int) g >> 2) << 5); + tmp |= (int) (((int) r >> 3) << 11); + *(bufouto++) = tmp & 0xff; + *(bufouto++) = tmp >> 8; + + y = (bufy[j + 1 + yskip] - 16) * Ky; + + tmp = (y + cbB) >> 16; + b = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y - crG - cbG) >> 16; + g = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (y + crR) >> 16; + r = (tmp > 255) ? 255 : ((tmp < 0) ? 0 : tmp); + tmp = (int) ((int) b >> 3); + tmp |= (int) (((int) g >> 2) << 5); + tmp |= (int) (((int) r >> 3) << 11); + *(bufouto++) = tmp & 0xff; + *(bufouto++) = tmp >> 8; + + } + bufoute += oskip; + bufouto += oskip; + bufy += yskip << 1; } - bufoute+=oskip; - bufouto+=oskip; - bufy+=yskip<<1; - } } -void RTjpeg_yuvrgb8(__u8 *buf, __u8 *rgb) +void +RTjpeg_yuvrgb8 (__u8 * buf, __u8 * rgb) { - bcopy(buf, rgb, RTjpeg_width*RTjpeg_height); + bcopy (buf, rgb, RTjpeg_width * RTjpeg_height); } -void RTjpeg_double32(__u32 *buf) +void +RTjpeg_double32 (__u32 * buf) { - int i, j; - - __u32 *iptr, *optr1, *optr2; - - iptr=buf+(RTjpeg_width*RTjpeg_height)-1; - optr1=buf+(RTjpeg_width*RTjpeg_height*4)-1; - optr2=optr1-(2*RTjpeg_width); - - for(i=0; i -typedef uint8_t __u8; +typedef uint8_t __u8; typedef uint32_t __u32; -typedef int8_t __s8; +typedef int8_t __s8; typedef uint16_t __u16; -extern void RTjpeg_init_Q(__u8 Q); -extern void RTjpeg_init_compress(long unsigned int *buf, int width, int height, __u8 Q); -extern void RTjpeg_init_decompress(long unsigned int *buf, int width, int height); -extern int RTjpeg_compressYUV420(__s8 *sp, unsigned char *bp); -extern int RTjpeg_compressYUV422(__s8 *sp, unsigned char *bp); -extern void RTjpeg_decompressYUV420(__s8 *sp, __u8 *bp); -extern void RTjpeg_decompressYUV422(__s8 *sp, __u8 *bp); -extern int RTjpeg_compress8(__s8 *sp, unsigned char *bp); -extern void RTjpeg_decompress8(__s8 *sp, __u8 *bp); - -extern void RTjpeg_init_mcompress(void); -extern int RTjpeg_mcompress(__s8 *sp, unsigned char *bp, __u16 lmask, __u16 cmask); -extern int RTjpeg_mcompress8(__s8 *sp, unsigned char *bp, __u16 lmask); -extern void RTjpeg_set_test(int i); - -extern void RTjpeg_yuv420rgb(__u8 *buf, __u8 *rgb); -extern void RTjpeg_yuv422rgb(__u8 *buf, __u8 *rgb); -extern void RTjpeg_yuvrgb8(__u8 *buf, __u8 *rgb); -extern void RTjpeg_yuvrgb16(__u8 *buf, __u8 *rgb); -extern void RTjpeg_yuvrgb24(__u8 *buf, __u8 *rgb); -extern void RTjpeg_yuvrgb32(__u8 *buf, __u8 *rgb); - +extern void RTjpeg_init_Q (__u8 Q); +extern void RTjpeg_init_compress (long unsigned int *buf, int width, int height, + __u8 Q); +extern void RTjpeg_init_decompress (long unsigned int *buf, int width, + int height); +extern int RTjpeg_compressYUV420 (__s8 * sp, unsigned char *bp); +extern int RTjpeg_compressYUV422 (__s8 * sp, unsigned char *bp); +extern void RTjpeg_decompressYUV420 (__s8 * sp, __u8 * bp); +extern void RTjpeg_decompressYUV422 (__s8 * sp, __u8 * bp); +extern int RTjpeg_compress8 (__s8 * sp, unsigned char *bp); +extern void RTjpeg_decompress8 (__s8 * sp, __u8 * bp); + +extern void RTjpeg_init_mcompress (void); +extern int RTjpeg_mcompress (__s8 * sp, unsigned char *bp, __u16 lmask, + __u16 cmask); +extern int RTjpeg_mcompress8 (__s8 * sp, unsigned char *bp, __u16 lmask); +extern void RTjpeg_set_test (int i); + +extern void RTjpeg_yuv420rgb (__u8 * buf, __u8 * rgb); +extern void RTjpeg_yuv422rgb (__u8 * buf, __u8 * rgb); +extern void RTjpeg_yuvrgb8 (__u8 * buf, __u8 * rgb); +extern void RTjpeg_yuvrgb16 (__u8 * buf, __u8 * rgb); +extern void RTjpeg_yuvrgb24 (__u8 * buf, __u8 * rgb); +extern void RTjpeg_yuvrgb32 (__u8 * buf, __u8 * rgb); diff --git a/gst/rtjpeg/gstrtjpeg.c b/gst/rtjpeg/gstrtjpeg.c index 2b9ff37d..e61cb7d0 100644 --- a/gst/rtjpeg/gstrtjpeg.c +++ b/gst/rtjpeg/gstrtjpeg.c @@ -25,25 +25,19 @@ #include static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "rtjpegenc", - GST_RANK_NONE, GST_TYPE_RTJPEGENC) || + GST_RANK_NONE, GST_TYPE_RTJPEGENC) || !gst_element_register (plugin, "rtjpegdec", - GST_RANK_NONE, GST_TYPE_RTJPEGDEC)) + GST_RANK_NONE, GST_TYPE_RTJPEGDEC)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "rtjpeg", - "Justin Schoeman's RTjpeg codec", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "rtjpeg", + "Justin Schoeman's RTjpeg codec", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/rtjpeg/gstrtjpegdec.c b/gst/rtjpeg/gstrtjpegdec.c index 7173c132..44dcc3f3 100644 --- a/gst/rtjpeg/gstrtjpegdec.c +++ b/gst/rtjpeg/gstrtjpegdec.c @@ -34,24 +34,27 @@ GstElementDetails gst_rtjpegdec_details = { }; /* GstRTJpegDec signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_QUALITY, }; -static void gst_rtjpegdec_class_init (GstRTJpegDecClass *klass); -static void gst_rtjpegdec_base_init (GstRTJpegDecClass *klass); -static void gst_rtjpegdec_init (GstRTJpegDec *rtjpegdec); +static void gst_rtjpegdec_class_init (GstRTJpegDecClass * klass); +static void gst_rtjpegdec_base_init (GstRTJpegDecClass * klass); +static void gst_rtjpegdec_init (GstRTJpegDec * rtjpegdec); -static void gst_rtjpegdec_chain (GstPad *pad, GstData *_data); +static void gst_rtjpegdec_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_rtjpegdec_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -61,23 +64,25 @@ gst_rtjpegdec_get_type (void) if (!rtjpegdec_type) { static const GTypeInfo rtjpegdec_info = { - sizeof(GstRTJpegDecClass), - (GBaseInitFunc)gst_rtjpegdec_base_init, + sizeof (GstRTJpegDecClass), + (GBaseInitFunc) gst_rtjpegdec_base_init, NULL, - (GClassInitFunc)gst_rtjpegdec_class_init, + (GClassInitFunc) gst_rtjpegdec_class_init, NULL, NULL, - sizeof(GstRTJpegDec), + sizeof (GstRTJpegDec), 0, - (GInstanceInitFunc)gst_rtjpegdec_init, + (GInstanceInitFunc) gst_rtjpegdec_init, }; - rtjpegdec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstRTJpegDec", &rtjpegdec_info, 0); + rtjpegdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRTJpegDec", + &rtjpegdec_info, 0); } return rtjpegdec_type; } static void -gst_rtjpegdec_base_init (GstRTJpegDecClass *klass) +gst_rtjpegdec_base_init (GstRTJpegDecClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -85,27 +90,27 @@ gst_rtjpegdec_base_init (GstRTJpegDecClass *klass) } static void -gst_rtjpegdec_class_init (GstRTJpegDecClass *klass) +gst_rtjpegdec_class_init (GstRTJpegDecClass * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*)klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); } static void -gst_rtjpegdec_init (GstRTJpegDec *rtjpegdec) +gst_rtjpegdec_init (GstRTJpegDec * rtjpegdec) { - rtjpegdec->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(rtjpegdec),rtjpegdec->sinkpad); - gst_pad_set_chain_function(rtjpegdec->sinkpad,gst_rtjpegdec_chain); - rtjpegdec->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(rtjpegdec),rtjpegdec->srcpad); + rtjpegdec->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (rtjpegdec), rtjpegdec->sinkpad); + gst_pad_set_chain_function (rtjpegdec->sinkpad, gst_rtjpegdec_chain); + rtjpegdec->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (rtjpegdec), rtjpegdec->srcpad); } static void -gst_rtjpegdec_chain (GstPad *pad, GstData *_data) +gst_rtjpegdec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstRTJpegDec *rtjpegdec; @@ -117,10 +122,10 @@ gst_rtjpegdec_chain (GstPad *pad, GstData *_data) g_return_if_fail (buf != NULL); rtjpegdec = GST_RTJPEGDEC (GST_OBJECT_PARENT (pad)); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - gst_info("would be encoding frame here\n"); + gst_info ("would be encoding frame here\n"); - gst_pad_push(rtjpegdec->srcpad,GST_DATA (buf)); + gst_pad_push (rtjpegdec->srcpad, GST_DATA (buf)); } diff --git a/gst/rtjpeg/gstrtjpegdec.h b/gst/rtjpeg/gstrtjpegdec.h index 2214ebd8..23ddce44 100644 --- a/gst/rtjpeg/gstrtjpegdec.h +++ b/gst/rtjpeg/gstrtjpegdec.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_RTJPEGDEC \ @@ -41,30 +42,32 @@ extern "C" { #define GST_IS_RTJPEGDEC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTJPEGDEC))) -typedef struct _GstRTJpegDec GstRTJpegDec; -typedef struct _GstRTJpegDecClass GstRTJpegDecClass; + typedef struct _GstRTJpegDec GstRTJpegDec; + typedef struct _GstRTJpegDecClass GstRTJpegDecClass; -struct _GstRTJpegDec { - GstElement element; + struct _GstRTJpegDec + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width,height; - gint quality; - gint quant[128]; + gint width, height; + gint quality; + gint quant[128]; -}; + }; -struct _GstRTJpegDecClass { - GstElementClass parent_class; -}; + struct _GstRTJpegDecClass + { + GstElementClass parent_class; + }; -GType gst_rtjpegdec_get_type(void); + GType gst_rtjpegdec_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __RTJPEGDEC_H__ */ +#endif /* __RTJPEGDEC_H__ */ diff --git a/gst/rtjpeg/gstrtjpegenc.c b/gst/rtjpeg/gstrtjpegenc.c index d562471a..14d7df1f 100644 --- a/gst/rtjpeg/gstrtjpegenc.c +++ b/gst/rtjpeg/gstrtjpegenc.c @@ -32,24 +32,27 @@ GstElementDetails gst_rtjpegenc_details = { }; /* GstRTJpegEnc signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_QUALITY, }; -static void gst_rtjpegenc_class_init (GstRTJpegEncClass *klass); -static void gst_rtjpegenc_base_init (GstRTJpegEncClass *klass); -static void gst_rtjpegenc_init (GstRTJpegEnc *rtjpegenc); +static void gst_rtjpegenc_class_init (GstRTJpegEncClass * klass); +static void gst_rtjpegenc_base_init (GstRTJpegEncClass * klass); +static void gst_rtjpegenc_init (GstRTJpegEnc * rtjpegenc); -static void gst_rtjpegenc_chain (GstPad *pad, GstData *_data); +static void gst_rtjpegenc_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_rtjpegenc_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -59,23 +62,25 @@ gst_rtjpegenc_get_type (void) if (!rtjpegenc_type) { static const GTypeInfo rtjpegenc_info = { - sizeof(GstRTJpegEncClass), - (GBaseInitFunc)gst_rtjpegenc_base_init, + sizeof (GstRTJpegEncClass), + (GBaseInitFunc) gst_rtjpegenc_base_init, NULL, - (GClassInitFunc)gst_rtjpegenc_class_init, + (GClassInitFunc) gst_rtjpegenc_class_init, NULL, NULL, - sizeof(GstRTJpegEnc), + sizeof (GstRTJpegEnc), 0, - (GInstanceInitFunc)gst_rtjpegenc_init, + (GInstanceInitFunc) gst_rtjpegenc_init, }; - rtjpegenc_type = g_type_register_static(GST_TYPE_ELEMENT, "GstRTJpegEnc", &rtjpegenc_info, 0); + rtjpegenc_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstRTJpegEnc", + &rtjpegenc_info, 0); } return rtjpegenc_type; } static void -gst_rtjpegenc_base_init (GstRTJpegEncClass *klass) +gst_rtjpegenc_base_init (GstRTJpegEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -83,42 +88,42 @@ gst_rtjpegenc_base_init (GstRTJpegEncClass *klass) } static void -gst_rtjpegenc_class_init (GstRTJpegEncClass *klass) +gst_rtjpegenc_class_init (GstRTJpegEncClass * klass) { GstElementClass *gstelement_class; - gstelement_class = (GstElementClass*)klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); } static void -gst_rtjpegenc_init (GstRTJpegEnc *rtjpegenc) +gst_rtjpegenc_init (GstRTJpegEnc * rtjpegenc) { - rtjpegenc->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(rtjpegenc),rtjpegenc->sinkpad); - gst_pad_set_chain_function(rtjpegenc->sinkpad,gst_rtjpegenc_chain); - rtjpegenc->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(rtjpegenc),rtjpegenc->srcpad); + rtjpegenc->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (rtjpegenc), rtjpegenc->sinkpad); + gst_pad_set_chain_function (rtjpegenc->sinkpad, gst_rtjpegenc_chain); + rtjpegenc->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (rtjpegenc), rtjpegenc->srcpad); } static void -gst_rtjpegenc_chain (GstPad *pad, GstData *_data) +gst_rtjpegenc_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstRTJpegEnc *rtjpegenc; guchar *data; gulong size; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); rtjpegenc = GST_RTJPEGENC (GST_OBJECT_PARENT (pad)); - data = GST_BUFFER_DATA(buf); - size = GST_BUFFER_SIZE(buf); + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); - gst_info("would be encoding frame here\n"); + gst_info ("would be encoding frame here\n"); - gst_pad_push(rtjpegenc->srcpad,GST_DATA (buf)); + gst_pad_push (rtjpegenc->srcpad, GST_DATA (buf)); } diff --git a/gst/rtjpeg/gstrtjpegenc.h b/gst/rtjpeg/gstrtjpegenc.h index 61303b7b..34c143b2 100644 --- a/gst/rtjpeg/gstrtjpegenc.h +++ b/gst/rtjpeg/gstrtjpegenc.h @@ -28,8 +28,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_RTJPEGENC \ @@ -43,29 +44,31 @@ extern "C" { #define GST_IS_RTJPEGENC_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTJPEGENC)) -typedef struct _GstRTJpegEnc GstRTJpegEnc; -typedef struct _GstRTJpegEncClass GstRTJpegEncClass; + typedef struct _GstRTJpegEnc GstRTJpegEnc; + typedef struct _GstRTJpegEncClass GstRTJpegEncClass; -struct _GstRTJpegEnc { - GstElement element; + struct _GstRTJpegEnc + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width,height; - gint quality; - gint quant[128]; -}; + gint width, height; + gint quality; + gint quant[128]; + }; -struct _GstRTJpegEncClass { - GstElementClass parent_class; -}; + struct _GstRTJpegEncClass + { + GstElementClass parent_class; + }; -GType gst_rtjpegenc_get_type(void); + GType gst_rtjpegenc_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __RTJPEGENC_H__ */ +#endif /* __RTJPEGENC_H__ */ diff --git a/gst/smooth/gstsmooth.c b/gst/smooth/gstsmooth.c index 286786e8..0302c7e0 100644 --- a/gst/smooth/gstsmooth.c +++ b/gst/smooth/gstsmooth.c @@ -34,12 +34,14 @@ static GstElementDetails smooth_details = { /* Smooth signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_ACTIVE, ARG_TOLERANCE, @@ -48,37 +50,36 @@ enum { }; static GstStaticPadTemplate gst_smooth_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); static GstStaticPadTemplate gst_smooth_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); - -static void gst_smooth_class_init (GstSmoothClass *klass); -static void gst_smooth_base_init (GstSmoothClass *klass); -static void gst_smooth_init (GstSmooth *smooth); - -static void gst_smooth_chain (GstPad *pad, GstData *_data); -static void smooth_filter (unsigned char* dest, unsigned char* src, - int width, int height, int tolerance, int filtersize); - -static void gst_smooth_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_smooth_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); + +static void gst_smooth_class_init (GstSmoothClass * klass); +static void gst_smooth_base_init (GstSmoothClass * klass); +static void gst_smooth_init (GstSmooth * smooth); + +static void gst_smooth_chain (GstPad * pad, GstData * _data); +static void smooth_filter (unsigned char *dest, unsigned char *src, + int width, int height, int tolerance, int filtersize); + +static void gst_smooth_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smooth_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_smooth_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -88,23 +89,24 @@ gst_smooth_get_type (void) if (!smooth_type) { static const GTypeInfo smooth_info = { - sizeof(GstSmoothClass), - (GBaseInitFunc)gst_smooth_base_init, + sizeof (GstSmoothClass), + (GBaseInitFunc) gst_smooth_base_init, NULL, - (GClassInitFunc)gst_smooth_class_init, + (GClassInitFunc) gst_smooth_class_init, NULL, NULL, - sizeof(GstSmooth), + sizeof (GstSmooth), 0, - (GInstanceInitFunc)gst_smooth_init, + (GInstanceInitFunc) gst_smooth_init, }; - smooth_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSmooth", &smooth_info, 0); + smooth_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSmooth", &smooth_info, 0); } return smooth_type; } static void -gst_smooth_base_init (GstSmoothClass *klass) +gst_smooth_base_init (GstSmoothClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -116,25 +118,19 @@ gst_smooth_base_init (GstSmoothClass *klass) } static void -gst_smooth_class_init (GstSmoothClass *klass) +gst_smooth_class_init (GstSmoothClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_ACTIVE, - g_param_spec_boolean("active","active","active", - TRUE,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_TOLERANCE, - g_param_spec_int("tolerance","tolerance","tolerance", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FILTERSIZE, - g_param_spec_int("filtersize","filtersize","filtersize", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACTIVE, g_param_spec_boolean ("active", "active", "active", TRUE, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOLERANCE, g_param_spec_int ("tolerance", "tolerance", "tolerance", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FILTERSIZE, g_param_spec_int ("filtersize", "filtersize", "filtersize", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = gst_smooth_set_property; gobject_class->get_property = gst_smooth_get_property; @@ -142,7 +138,7 @@ gst_smooth_class_init (GstSmoothClass *klass) } static GstPadLinkReturn -gst_smooth_link (GstPad *pad, const GstCaps *caps) +gst_smooth_link (GstPad * pad, const GstCaps * caps) { GstSmooth *filter; GstStructure *structure; @@ -154,22 +150,25 @@ gst_smooth_link (GstPad *pad, const GstCaps *caps) ret = gst_structure_get_int (structure, "width", &filter->width); ret &= gst_structure_get_int (structure, "height", &filter->height); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; return gst_pad_try_set_caps (filter->srcpad, caps); } static void -gst_smooth_init (GstSmooth *smooth) +gst_smooth_init (GstSmooth * smooth) { - smooth->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_smooth_sink_template), "sink"); + smooth->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smooth_sink_template), "sink"); gst_pad_set_link_function (smooth->sinkpad, gst_smooth_link); gst_pad_set_chain_function (smooth->sinkpad, gst_smooth_chain); gst_element_add_pad (GST_ELEMENT (smooth), smooth->sinkpad); - smooth->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_smooth_sink_template), "src"); + smooth->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smooth_sink_template), "src"); gst_pad_set_link_function (smooth->srcpad, gst_smooth_link); gst_element_add_pad (GST_ELEMENT (smooth), smooth->srcpad); @@ -180,55 +179,53 @@ gst_smooth_init (GstSmooth *smooth) } static void -smooth_filter (unsigned char* dest, unsigned char* src, int width, int height, int tolerance, int filtersize) +smooth_filter (unsigned char *dest, unsigned char *src, int width, int height, + int tolerance, int filtersize) { int refval, aktval, upperval, lowerval, numvalues, sum; int x, y, fx, fy, fy1, fy2, fx1, fx2; unsigned char *srcp = src; fy1 = 0; - fy2 = MIN(filtersize+1, height) * width; + fy2 = MIN (filtersize + 1, height) * width; - for(y = 0; y < height; y++) - { - if (y>(filtersize+1)) fy1 += width; - if (y (filtersize + 1)) + fy1 += width; + if (y < height - (filtersize + 1)) + fy2 += width; - for(x = 0; x < width; x++) - { - refval = *src; - upperval = refval + tolerance; - lowerval = refval - tolerance; + for (x = 0; x < width; x++) { + refval = *src; + upperval = refval + tolerance; + lowerval = refval - tolerance; numvalues = 1; - sum = refval; - - fx1 = MAX(x-filtersize, 0) + fy1; - fx2 = MIN(x+filtersize+1, width) + fy1; - - for (fy = fy1; fyactive) { - gst_pad_push(smooth->srcpad,GST_DATA (buf)); + gst_pad_push (smooth->srcpad, GST_DATA (buf)); return; } @@ -253,23 +250,24 @@ gst_smooth_chain (GstPad *pad, GstData *_data) GST_DEBUG ("smooth: have buffer of %d", GST_BUFFER_SIZE (buf)); - outbuf = gst_buffer_new(); + outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (buf)); GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf); - lumsize = smooth->width*smooth->height; - chromsize = lumsize/4; + lumsize = smooth->width * smooth->height; + chromsize = lumsize / 4; - smooth_filter (GST_BUFFER_DATA (outbuf), data, smooth->width, smooth->height, - smooth->tolerance, smooth->filtersize); + smooth_filter (GST_BUFFER_DATA (outbuf), data, smooth->width, smooth->height, + smooth->tolerance, smooth->filtersize); if (!smooth->lum_only) { - smooth_filter (GST_BUFFER_DATA (outbuf)+lumsize, data+lumsize, smooth->width/2, smooth->height/2, - smooth->tolerance, smooth->filtersize/2); - smooth_filter (GST_BUFFER_DATA (outbuf)+lumsize+chromsize, data+lumsize+chromsize, smooth->width/2, - smooth->height/2, smooth->tolerance, smooth->filtersize/2); - } - else { - memcpy (GST_BUFFER_DATA (outbuf)+lumsize, data+lumsize, chromsize*2); + smooth_filter (GST_BUFFER_DATA (outbuf) + lumsize, data + lumsize, + smooth->width / 2, smooth->height / 2, smooth->tolerance, + smooth->filtersize / 2); + smooth_filter (GST_BUFFER_DATA (outbuf) + lumsize + chromsize, + data + lumsize + chromsize, smooth->width / 2, smooth->height / 2, + smooth->tolerance, smooth->filtersize / 2); + } else { + memcpy (GST_BUFFER_DATA (outbuf) + lumsize, data + lumsize, chromsize * 2); } GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); @@ -280,13 +278,14 @@ gst_smooth_chain (GstPad *pad, GstData *_data) } static void -gst_smooth_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_smooth_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstSmooth *smooth; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SMOOTH(object)); - smooth = GST_SMOOTH(object); + g_return_if_fail (GST_IS_SMOOTH (object)); + smooth = GST_SMOOTH (object); switch (prop_id) { case ARG_ACTIVE: @@ -307,13 +306,14 @@ gst_smooth_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_smooth_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_smooth_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstSmooth *smooth; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SMOOTH(object)); - smooth = GST_SMOOTH(object); + g_return_if_fail (GST_IS_SMOOTH (object)); + smooth = GST_SMOOTH (object); switch (prop_id) { case ARG_ACTIVE: @@ -336,20 +336,14 @@ gst_smooth_get_property (GObject *object, guint prop_id, GValue *value, GParamSp static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "smooth", - GST_RANK_NONE, GST_TYPE_SMOOTH); + return gst_element_register (plugin, "smooth", + GST_RANK_NONE, GST_TYPE_SMOOTH); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "smooth", - "Apply a smooth filter to an image", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "smooth", + "Apply a smooth filter to an image", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/smooth/gstsmooth.h b/gst/smooth/gstsmooth.h index eb32de36..aae3cc21 100644 --- a/gst/smooth/gstsmooth.h +++ b/gst/smooth/gstsmooth.h @@ -25,8 +25,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SMOOTH \ @@ -40,34 +41,36 @@ extern "C" { #define GST_IS_SMOOTH_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOOTH)) -typedef struct _GstSmooth GstSmooth; -typedef struct _GstSmoothClass GstSmoothClass; + typedef struct _GstSmooth GstSmooth; + typedef struct _GstSmoothClass GstSmoothClass; -struct _GstSmooth { - GstElement element; + struct _GstSmooth + { + GstElement element; - int format; - int width; - int height; + int format; + int width; + int height; - gboolean active; - int tolerance; - int filtersize; - gboolean lum_only; + gboolean active; + int tolerance; + int filtersize; + gboolean lum_only; - GstPad *sinkpad,*srcpad; -}; + GstPad *sinkpad, *srcpad; + }; -struct _GstSmoothClass { - GstElementClass parent_class; -}; + struct _GstSmoothClass + { + GstElementClass parent_class; + }; -GType gst_smooth_get_type(void); + GType gst_smooth_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SMOOTH_H__ */ +#endif /* __GST_SMOOTH_H__ */ diff --git a/gst/smoothwave/demo-osssrc.c b/gst/smoothwave/demo-osssrc.c index 457900d7..c39bc72c 100644 --- a/gst/smoothwave/demo-osssrc.c +++ b/gst/smoothwave/demo-osssrc.c @@ -3,11 +3,13 @@ extern gboolean _gst_plugin_spew; -gboolean idle_func(gpointer data); +gboolean idle_func (gpointer data); GtkWidget *drawingarea; -int main(int argc,char *argv[]) { +int +main (int argc, char *argv[]) +{ GstElement *bin; GstElementFactory *srcfactory; GstElement *src; @@ -16,46 +18,47 @@ int main(int argc,char *argv[]) { GtkWidget *wave_widget; GtkWidget *appwindow; - gst_init(&argc,&argv); - gst_plugin_load("libsmoothwave.so"); - gtk_init(&argc,&argv); + gst_init (&argc, &argv); + gst_plugin_load ("libsmoothwave.so"); + gtk_init (&argc, &argv); - bin = gst_pipeline_new("bin"); + bin = gst_pipeline_new ("bin"); - srcfactory = gst_element_factory_find("sinesrc"); - g_return_val_if_fail(srcfactory != NULL, -1); - wavefactory = gst_element_factory_find("smoothwave"); - g_return_val_if_fail(wavefactory != NULL, -1); + srcfactory = gst_element_factory_find ("sinesrc"); + g_return_val_if_fail (srcfactory != NULL, -1); + wavefactory = gst_element_factory_find ("smoothwave"); + g_return_val_if_fail (wavefactory != NULL, -1); - src = gst_element_factory_create(srcfactory,"src"); + src = gst_element_factory_create (srcfactory, "src"); //g_object_set(G_OBJECT(src),"bytes_per_read",(gulong)2048,NULL); - wave = gst_element_factory_create(wavefactory,"wave"); - g_object_set(G_OBJECT(wave),"width",256,"height",100,NULL); + wave = gst_element_factory_create (wavefactory, "wave"); + g_object_set (G_OBJECT (wave), "width", 256, "height", 100, NULL); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(src)); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(wave)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (src)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (wave)); - gst_pad_link(gst_element_get_pad(src,"src"), - gst_element_get_pad(wave,"sink")); + gst_pad_link (gst_element_get_pad (src, "src"), + gst_element_get_pad (wave, "sink")); - appwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_object_get(G_OBJECT(wave),"widget",&wave_widget,NULL); - gtk_container_add(GTK_CONTAINER(appwindow), wave_widget); - gtk_widget_show_all(appwindow); + appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_object_get (G_OBJECT (wave), "widget", &wave_widget, NULL); + gtk_container_add (GTK_CONTAINER (appwindow), wave_widget); + gtk_widget_show_all (appwindow); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_READY); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_PLAYING); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING); - g_idle_add(idle_func,bin); + g_idle_add (idle_func, bin); - gtk_main(); + gtk_main (); return 0; } -gboolean idle_func(gpointer data) +gboolean +idle_func (gpointer data) { - gst_bin_iterate(GST_BIN(data)); + gst_bin_iterate (GST_BIN (data)); return TRUE; } diff --git a/gst/smoothwave/gstsmoothwave.c b/gst/smoothwave/gstsmoothwave.c index 57c267e5..2abbdec2 100644 --- a/gst/smoothwave/gstsmoothwave.c +++ b/gst/smoothwave/gstsmoothwave.c @@ -25,37 +25,41 @@ #include "gstsmoothwave.h" -static GstElementDetails gst_smoothwave_details = GST_ELEMENT_DETAILS ( - "Smooth waveform", - "Visualization", - "Fading grayscale waveform display", - "Erik Walthinsen " -); +static GstElementDetails gst_smoothwave_details = +GST_ELEMENT_DETAILS ("Smooth waveform", + "Visualization", + "Fading grayscale waveform display", + "Erik Walthinsen "); /* SmoothWave signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_WIDTH, ARG_HEIGHT, ARG_WIDGET, }; -static void gst_smoothwave_base_init (gpointer g_class); -static void gst_smoothwave_class_init (GstSmoothWaveClass *klass); -static void gst_smoothwave_init (GstSmoothWave *smoothwave); +static void gst_smoothwave_base_init (gpointer g_class); +static void gst_smoothwave_class_init (GstSmoothWaveClass * klass); +static void gst_smoothwave_init (GstSmoothWave * smoothwave); -static void gst_smoothwave_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_smoothwave_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_smoothwave_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smoothwave_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_smoothwave_chain (GstPad *pad, GstData *_data); +static void gst_smoothwave_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_smoothwave_signals[LAST_SIGNAL] = { 0 }; */ @@ -66,17 +70,19 @@ gst_smoothwave_get_type (void) if (!smoothwave_type) { static const GTypeInfo smoothwave_info = { - sizeof(GstSmoothWaveClass), + sizeof (GstSmoothWaveClass), gst_smoothwave_base_init, NULL, - (GClassInitFunc)gst_smoothwave_class_init, + (GClassInitFunc) gst_smoothwave_class_init, NULL, NULL, - sizeof(GstSmoothWave), + sizeof (GstSmoothWave), 0, - (GInstanceInitFunc)gst_smoothwave_init, + (GInstanceInitFunc) gst_smoothwave_init, }; - smoothwave_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSmoothWave", &smoothwave_info, 0); + smoothwave_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSmoothWave", + &smoothwave_info, 0); } return smoothwave_type; } @@ -90,83 +96,77 @@ gst_smoothwave_base_init (gpointer g_class) } static void -gst_smoothwave_class_init (GstSmoothWaveClass *klass) +gst_smoothwave_class_init (GstSmoothWaveClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_WIDTH, - g_param_spec_int("width","width","width", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HEIGHT, - g_param_spec_int("height","height","height", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_WIDGET, - g_param_spec_object("widget","widget","widget", - GTK_TYPE_WIDGET,G_PARAM_READABLE)); /* CHECKME! */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, g_param_spec_int ("width", "width", "width", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT, g_param_spec_int ("height", "height", "height", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDGET, g_param_spec_object ("widget", "widget", "widget", GTK_TYPE_WIDGET, G_PARAM_READABLE)); /* CHECKME! */ gobject_class->set_property = gst_smoothwave_set_property; gobject_class->get_property = gst_smoothwave_get_property; } static void -gst_smoothwave_init (GstSmoothWave *smoothwave) +gst_smoothwave_init (GstSmoothWave * smoothwave) { int i; guint32 palette[256]; - smoothwave->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(smoothwave),smoothwave->sinkpad); - gst_pad_set_chain_function(smoothwave->sinkpad,gst_smoothwave_chain); - smoothwave->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(smoothwave),smoothwave->srcpad); + smoothwave->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (smoothwave), smoothwave->sinkpad); + gst_pad_set_chain_function (smoothwave->sinkpad, gst_smoothwave_chain); + smoothwave->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (smoothwave), smoothwave->srcpad); /* smoothwave->meta = NULL; */ smoothwave->width = 512; smoothwave->height = 256; - gdk_rgb_init(); + gdk_rgb_init (); /* gtk_widget_set_default_colormap (gdk_rgb_get_cmap()); */ /* gtk_widget_set_default_visual (gdk_rgb_get_visual()); */ /* GST_DEBUG ("creating palette"); */ - for (i=0;i<256;i++) + for (i = 0; i < 256; i++) palette[i] = (i << 16) || (i << 8); /* GST_DEBUG ("creating cmap"); */ - smoothwave->cmap = gdk_rgb_cmap_new(palette,256); + smoothwave->cmap = gdk_rgb_cmap_new (palette, 256); /* GST_DEBUG ("created cmap"); */ /* gtk_widget_set_default_colormap (smoothwave->cmap); */ - smoothwave->image = gtk_drawing_area_new(); - gtk_drawing_area_size(GTK_DRAWING_AREA(smoothwave->image), - smoothwave->width,smoothwave->height); - gtk_widget_show(smoothwave->image); + smoothwave->image = gtk_drawing_area_new (); + gtk_drawing_area_size (GTK_DRAWING_AREA (smoothwave->image), + smoothwave->width, smoothwave->height); + gtk_widget_show (smoothwave->image); - smoothwave->imagebuffer = g_malloc(smoothwave->width*smoothwave->height); - memset(smoothwave->imagebuffer,0,smoothwave->width*smoothwave->height); + smoothwave->imagebuffer = g_malloc (smoothwave->width * smoothwave->height); + memset (smoothwave->imagebuffer, 0, smoothwave->width * smoothwave->height); } static void -gst_smoothwave_chain (GstPad *pad, GstData *_data) +gst_smoothwave_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstSmoothWave *smoothwave; gint16 *samples; - gint samplecount,i; + gint samplecount, i; register guint32 *ptr; gint qheight; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); /* g_return_if_fail(GST_IS_BUFFER(buf)); */ - smoothwave = GST_SMOOTHWAVE(GST_OBJECT_PARENT (pad)); + smoothwave = GST_SMOOTHWAVE (GST_OBJECT_PARENT (pad)); /* first deal with audio metadata */ #if 0 @@ -175,36 +175,35 @@ gst_smoothwave_chain (GstPad *pad, GstData *_data) /* FIXME: need to unref the old metadata so it goes away */ } /* we just make a copy of the pointer */ - smoothwave->meta = (MetaAudioRaw *)(buf->meta); + smoothwave->meta = (MetaAudioRaw *) (buf->meta); /* FIXME: now we have to ref the metadata so it doesn't go away */ } #endif /* g_return_if_fail(smoothwave->meta != NULL); */ - samples = (gint16 *)GST_BUFFER_DATA(buf); + samples = (gint16 *) GST_BUFFER_DATA (buf); /* samplecount = buf->datasize / (smoothwave->meta->channels * sizeof(gint16)); */ - samplecount = GST_BUFFER_SIZE(buf) / (2 * sizeof(gint16)); + samplecount = GST_BUFFER_SIZE (buf) / (2 * sizeof (gint16)); - qheight = smoothwave->height/4; + qheight = smoothwave->height / 4; /* GST_DEBUG ("traversing %d",smoothwave->width); */ - for (i=0;iwidth,samplecount);i++) { - gint16 y1 = (gint32)(samples[i*2] * qheight) / 32768 + - qheight; - gint16 y2 = (gint32)(samples[(i*2)+1] * qheight) / 32768 + - (qheight*3); - smoothwave->imagebuffer[y1*smoothwave->width + i] = 0xff; - smoothwave->imagebuffer[y2*smoothwave->width + i] = 0xff; + for (i = 0; i < MAX (smoothwave->width, samplecount); i++) { + gint16 y1 = (gint32) (samples[i * 2] * qheight) / 32768 + qheight; + gint16 y2 = (gint32) (samples[(i * 2) + 1] * qheight) / 32768 + + (qheight * 3); + smoothwave->imagebuffer[y1 * smoothwave->width + i] = 0xff; + smoothwave->imagebuffer[y2 * smoothwave->width + i] = 0xff; /* smoothwave->imagebuffer[i+(smoothwave->width*5)] = i; */ } - ptr = (guint32 *)smoothwave->imagebuffer; - for (i=0;i<(smoothwave->width*smoothwave->height)/4;i++) { - if (*ptr){ + ptr = (guint32 *) smoothwave->imagebuffer; + for (i = 0; i < (smoothwave->width * smoothwave->height) / 4; i++) { + if (*ptr) { *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5); ptr++; - }else{ + } else { ptr++; } } @@ -223,40 +222,40 @@ gst_smoothwave_chain (GstPad *pad, GstData *_data) GDK_RGB_DITHER_NONE, smoothwave->imagebuffer,smoothwave->width, smoothwave->cmap);*/ - gdk_draw_gray_image(smoothwave->image->window, - smoothwave->image->style->fg_gc[GTK_STATE_NORMAL], - 0,0,smoothwave->width,smoothwave->height, - GDK_RGB_DITHER_NORMAL, - smoothwave->imagebuffer,smoothwave->width); + gdk_draw_gray_image (smoothwave->image->window, + smoothwave->image->style->fg_gc[GTK_STATE_NORMAL], + 0, 0, smoothwave->width, smoothwave->height, + GDK_RGB_DITHER_NORMAL, smoothwave->imagebuffer, smoothwave->width); /* gst_trace_add_entry(NULL,0,buf,"smoothwave: calculated smoothwave"); */ - gst_buffer_unref(buf); + gst_buffer_unref (buf); } static void -gst_smoothwave_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_smoothwave_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSmoothWave *smoothwave; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SMOOTHWAVE(object)); - smoothwave = GST_SMOOTHWAVE(object); + g_return_if_fail (GST_IS_SMOOTHWAVE (object)); + smoothwave = GST_SMOOTHWAVE (object); switch (prop_id) { case ARG_WIDTH: smoothwave->width = g_value_get_int (value); - gtk_drawing_area_size(GTK_DRAWING_AREA(smoothwave->image), - smoothwave->width,smoothwave->height); - gtk_widget_set_usize(GTK_WIDGET(smoothwave->image), - smoothwave->width,smoothwave->height); + gtk_drawing_area_size (GTK_DRAWING_AREA (smoothwave->image), + smoothwave->width, smoothwave->height); + gtk_widget_set_usize (GTK_WIDGET (smoothwave->image), + smoothwave->width, smoothwave->height); break; case ARG_HEIGHT: smoothwave->height = g_value_get_int (value); - gtk_drawing_area_size(GTK_DRAWING_AREA(smoothwave->image), - smoothwave->width,smoothwave->height); - gtk_widget_set_usize(GTK_WIDGET(smoothwave->image), - smoothwave->width,smoothwave->height); + gtk_drawing_area_size (GTK_DRAWING_AREA (smoothwave->image), + smoothwave->width, smoothwave->height); + gtk_widget_set_usize (GTK_WIDGET (smoothwave->image), + smoothwave->width, smoothwave->height); break; default: break; @@ -264,27 +263,28 @@ gst_smoothwave_set_property (GObject *object, guint prop_id, const GValue *value } static void -gst_smoothwave_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_smoothwave_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstSmoothWave *smoothwave; /* it's not null if we got it, but it might not be ours */ - smoothwave = GST_SMOOTHWAVE(object); + smoothwave = GST_SMOOTHWAVE (object); switch (prop_id) { - case ARG_WIDTH: { + case ARG_WIDTH:{ g_value_set_int (value, smoothwave->width); break; } - case ARG_HEIGHT: { + case ARG_HEIGHT:{ g_value_set_int (value, smoothwave->height); break; } - case ARG_WIDGET: { + case ARG_WIDGET:{ g_value_set_object (value, smoothwave->image); break; } - default: { + default:{ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } @@ -294,21 +294,17 @@ gst_smoothwave_get_property (GObject *object, guint prop_id, GValue *value, GPar static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - if (!gst_element_register (plugin, "smoothwave", GST_RANK_NONE, GST_TYPE_SMOOTHWAVE)) + if (!gst_element_register (plugin, "smoothwave", GST_RANK_NONE, + GST_TYPE_SMOOTHWAVE)) return FALSE; return TRUE; } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "smoothwave", - "Fading greyscale waveform display", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "smoothwave", + "Fading greyscale waveform display", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/smoothwave/gstsmoothwave.h b/gst/smoothwave/gstsmoothwave.h index 87165131..df4d8763 100644 --- a/gst/smoothwave/gstsmoothwave.h +++ b/gst/smoothwave/gstsmoothwave.h @@ -26,8 +26,9 @@ #include #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SMOOTHWAVE \ @@ -41,31 +42,33 @@ extern "C" { #define GST_IS_SMOOTHWAVE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOOTHWAVE)) -typedef struct _GstSmoothWave GstSmoothWave; -typedef struct _GstSmoothWaveClass GstSmoothWaveClass; + typedef struct _GstSmoothWave GstSmoothWave; + typedef struct _GstSmoothWaveClass GstSmoothWaveClass; -struct _GstSmoothWave { - GstElement element; + struct _GstSmoothWave + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width,height; + gint width, height; - GdkRgbCmap *cmap; - GtkWidget *image; - guchar *imagebuffer; -}; + GdkRgbCmap *cmap; + GtkWidget *image; + guchar *imagebuffer; + }; -struct _GstSmoothWaveClass { - GstElementClass parent_class; -}; + struct _GstSmoothWaveClass + { + GstElementClass parent_class; + }; -GType gst_smoothwave_get_type(void); + GType gst_smoothwave_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SMOOTHWAVE_H__ */ +#endif /* __GST_SMOOTHWAVE_H__ */ diff --git a/gst/smpte/barboxwipes.c b/gst/smpte/barboxwipes.c index a490f632..2508adf4 100644 --- a/gst/smpte/barboxwipes.c +++ b/gst/smpte/barboxwipes.c @@ -26,544 +26,533 @@ enum { - BOX_VERTICAL = 1, - BOX_HORIZONTAL = 2, - BOX_CLOCK = 3, - TRIGANLE_LINEAR = 4, + BOX_VERTICAL = 1, + BOX_HORIZONTAL = 2, + BOX_CLOCK = 3, + TRIGANLE_LINEAR = 4, }; -static gint boxes_1b[][7] = -{ +static gint boxes_1b[][7] = { #define WIPE_B1_1 0 - { BOX_VERTICAL, 0, 0, 0, 1, 1, 1 }, + {BOX_VERTICAL, 0, 0, 0, 1, 1, 1}, #define WIPE_B1_2 1 - { BOX_HORIZONTAL, 0, 0, 0, 1, 1, 1 } + {BOX_HORIZONTAL, 0, 0, 0, 1, 1, 1} }; -static gint boxes_2b[][7*2] = -{ +static gint boxes_2b[][7 * 2] = { #define WIPE_B2_21 0 - { BOX_VERTICAL, 0, 0, 1, 1, 2, 0, - BOX_VERTICAL, 1, 0, 0, 2, 2, 1 }, + {BOX_VERTICAL, 0, 0, 1, 1, 2, 0, + BOX_VERTICAL, 1, 0, 0, 2, 2, 1}, #define WIPE_B2_22 1 - { BOX_HORIZONTAL, 0, 0, 1, 2, 1, 0, - BOX_HORIZONTAL, 0, 1, 0, 2, 2, 1 }, + {BOX_HORIZONTAL, 0, 0, 1, 2, 1, 0, + BOX_HORIZONTAL, 0, 1, 0, 2, 2, 1}, }; -static gint box_clock_1b[][1*10] = -{ +static gint box_clock_1b[][1 * 10] = { #define WIPE_B1_241 0 - { BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 1, 1 }, + {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 1, 1}, #define WIPE_B1_242 1 - { BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1 }, + {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1}, #define WIPE_B1_243 2 - { BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B1_244 3 - { BOX_CLOCK, 1, 0, 0, 0, 0, 0, 1, 1, 1 }, + {BOX_CLOCK, 1, 0, 0, 0, 0, 0, 1, 1, 1}, }; #define WIPE_B2_221 0 -static gint box_clock_2b[][2*10] = -{ +static gint box_clock_2b[][2 * 10] = { #define WIPE_B2_221 0 - { BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, - BOX_CLOCK, 1, 0, 0, 1, 2, 1, 0, 0, 2 }, + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, + BOX_CLOCK, 1, 0, 0, 1, 2, 1, 0, 0, 2}, #define WIPE_B2_222 1 - { BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1, - BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 0, 2 }, + {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 0, 2}, #define WIPE_B2_223 2 - { BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2 }, + {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2}, #define WIPE_B2_224 3 - { BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, - BOX_CLOCK, 0, 1, 0, 2, 1, 1, 0, 2, 2 }, + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, + BOX_CLOCK, 0, 1, 0, 2, 1, 1, 0, 2, 2}, #define WIPE_B2_225 4 - { BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, - BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 2, 1, + BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1}, #define WIPE_B2_226 5 - { BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, - BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1 }, + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 2, 1, 1, + BOX_CLOCK, 2, 1, 0, 2, 2, 0, 0, 1, 1}, #define WIPE_B2_231 6 - { BOX_CLOCK, 1, 0, 0, 1, 2, 0, 2, 0, 1, - BOX_CLOCK, 1, 0, 0, 1, 2, 0, 0, 0, 1 }, + {BOX_CLOCK, 1, 0, 0, 1, 2, 0, 2, 0, 1, + BOX_CLOCK, 1, 0, 0, 1, 2, 0, 0, 0, 1}, #define WIPE_B2_232 7 - { BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 0, 1, - BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 2, 1 }, + {BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 0, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 0, 2, 2, 1}, #define WIPE_B2_233 8 - { BOX_CLOCK, 1, 2, 0, 1, 0, 0, 2, 2, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 0, 0, 2, 1 }, + {BOX_CLOCK, 1, 2, 0, 1, 0, 0, 2, 2, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 0, 0, 2, 1}, #define WIPE_B2_234 9 - { BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 0, 1, - BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 2, 1 }, + {BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 0, 1, + BOX_CLOCK, 0, 1, 0, 2, 1, 0, 0, 2, 1}, #define WIPE_B2_251 10 - { BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 2, 1, - BOX_CLOCK, 2, 0, 0, 1, 0, 0, 2, 2, 1 }, + {BOX_CLOCK, 0, 0, 0, 1, 0, 0, 0, 2, 1, + BOX_CLOCK, 2, 0, 0, 1, 0, 0, 2, 2, 1}, #define WIPE_B2_252 11 - { BOX_CLOCK, 0, 0, 0, 0, 1, 0, 2, 0, 1, - BOX_CLOCK, 0, 2, 0, 0, 1, 0, 2, 2, 1 }, + {BOX_CLOCK, 0, 0, 0, 0, 1, 0, 2, 0, 1, + BOX_CLOCK, 0, 2, 0, 0, 1, 0, 2, 2, 1}, #define WIPE_B2_253 12 - { BOX_CLOCK, 0, 2, 0, 1, 2, 0, 0, 0, 1, - BOX_CLOCK, 2, 2, 0, 1, 2, 0, 2, 0, 1 }, + {BOX_CLOCK, 0, 2, 0, 1, 2, 0, 0, 0, 1, + BOX_CLOCK, 2, 2, 0, 1, 2, 0, 2, 0, 1}, #define WIPE_B2_254 13 - { BOX_CLOCK, 2, 0, 0, 2, 1, 0, 0, 0, 1, - BOX_CLOCK, 2, 2, 0, 2, 1, 0, 0, 2, 1 }, + {BOX_CLOCK, 2, 0, 0, 2, 1, 0, 0, 0, 1, + BOX_CLOCK, 2, 2, 0, 2, 1, 0, 0, 2, 1}, }; -static gint box_clock_4b[][4*10] = -{ +static gint box_clock_4b[][4 * 10] = { #define WIPE_B4_201 0 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, - BOX_CLOCK, 1, 1, 0, 1, 2, 2, 0, 1, 3, - BOX_CLOCK, 1, 1, 0, 0, 1, 3, 1, 0, 4 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 2, 2, 0, 1, 3, + BOX_CLOCK, 1, 1, 0, 0, 1, 3, 1, 0, 4}, #define WIPE_B4_202 1 - { BOX_CLOCK, 1, 1, 0, 1, 0, 3, 2, 1, 4, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, - BOX_CLOCK, 1, 1, 0, 0, 1, 2, 1, 0, 3 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 3, 2, 1, 4, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 0, 1, 2, 1, 0, 3}, #define WIPE_B4_203 2 - { BOX_CLOCK, 1, 1, 0, 1, 0, 2, 2, 1, 3, - BOX_CLOCK, 1, 1, 0, 2, 1, 3, 1, 2, 4, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 2, 2, 1, 3, + BOX_CLOCK, 1, 1, 0, 2, 1, 3, 1, 2, 4, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, #define WIPE_B4_204 3 - { BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, - BOX_CLOCK, 1, 1, 0, 2, 1, 2, 1, 2, 3, - BOX_CLOCK, 1, 1, 0, 1, 2, 3, 0, 1, 4, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 2, 1, 2, 3, + BOX_CLOCK, 1, 1, 0, 1, 2, 3, 0, 1, 4, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_205 4 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 0, 2}, #define WIPE_B4_206 5 - { BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 1, 2, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_207 6 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1}, #define WIPE_B4_211 7 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, - BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 2, 2 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 1, 1, 2, 2, + BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 1, 1, 2, 2}, #define WIPE_B4_212 8 - { BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, - BOX_CLOCK, 1, 1, 0, 1, 0, 1, 0, 1, 2, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2 }, + {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 1, 0, 1, 0, 1, 2, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 1, 0, 1, 2}, #define WIPE_B4_213 9 - { BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 2, 1, 1, - BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1 }, + {BOX_CLOCK, 1, 1, 0, 1, 0, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 0, 0, 0, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 2, 1, 1, + BOX_CLOCK, 1, 1, 0, 1, 2, 0, 0, 1, 1}, #define WIPE_B4_214 10 - { BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, - BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1, - BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 2, 1 }, + {BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 2, 1, 0, 1, 2, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 0, 1, + BOX_CLOCK, 1, 1, 0, 0, 1, 0, 1, 2, 1}, #define WIPE_B4_227 11 - { BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 1, 1, - BOX_CLOCK, 1, 0, 0, 1, 1, 1, 0, 0, 2, - BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 1, 1, - BOX_CLOCK, 1, 2, 0, 1, 1, 1, 0, 2, 2 }, + {BOX_CLOCK, 1, 0, 0, 2, 0, 0, 1, 1, 1, + BOX_CLOCK, 1, 0, 0, 1, 1, 1, 0, 0, 2, + BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 1, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 1, 0, 2, 2}, #define WIPE_B4_228 12 - { BOX_CLOCK, 0, 1, 0, 0, 0, 0, 1, 1, 1, - BOX_CLOCK, 0, 1, 0, 1, 1, 1, 0, 2, 2, - BOX_CLOCK, 2, 1, 0, 2, 0, 0, 1, 1, 1, - BOX_CLOCK, 2, 1, 0, 1, 1, 1, 2, 2, 2 }, + {BOX_CLOCK, 0, 1, 0, 0, 0, 0, 1, 1, 1, + BOX_CLOCK, 0, 1, 0, 1, 1, 1, 0, 2, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 0, 1, 1, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 1, 2, 2, 2}, #define WIPE_B4_235 13 - { BOX_CLOCK, 1, 0, 0, 1, 1, 0, 0, 0, 1, - BOX_CLOCK, 1, 0, 0, 1, 1, 0, 2, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 1, 0, 2, 2, 1, - BOX_CLOCK, 1, 2, 0, 1, 1, 0, 0, 2, 1 }, + {BOX_CLOCK, 1, 0, 0, 1, 1, 0, 0, 0, 1, + BOX_CLOCK, 1, 0, 0, 1, 1, 0, 2, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 0, 2, 2, 1, + BOX_CLOCK, 1, 2, 0, 1, 1, 0, 0, 2, 1}, #define WIPE_B4_236 14 - { BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1, - BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 2, 1, - BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 0, 1, - BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 2, 1 }, + {BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 0, 1, + BOX_CLOCK, 0, 1, 0, 1, 1, 0, 0, 2, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 0, 1, + BOX_CLOCK, 2, 1, 0, 1, 1, 0, 2, 2, 1}, }; -static gint box_clock_8b[][8*10] = -{ +static gint box_clock_8b[][8 * 10] = { #define WIPE_B8_261 0 - { BOX_CLOCK, 2, 1, 0, 2, 2, 0, 4, 1, 1, - BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 0, 2, - BOX_CLOCK, 2, 1, 0, 2, 0, 2, 0, 1, 3, - BOX_CLOCK, 2, 1, 0, 0, 1, 3, 2, 2, 4, - BOX_CLOCK, 2, 3, 0, 2, 2, 0, 4, 3, 1, - BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 4, 2, - BOX_CLOCK, 2, 3, 0, 2, 4, 2, 0, 3, 3, - BOX_CLOCK, 2, 3, 0, 0, 3, 3, 2, 2, 4 }, + {BOX_CLOCK, 2, 1, 0, 2, 2, 0, 4, 1, 1, + BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 0, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 2, 0, 1, 3, + BOX_CLOCK, 2, 1, 0, 0, 1, 3, 2, 2, 4, + BOX_CLOCK, 2, 3, 0, 2, 2, 0, 4, 3, 1, + BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 4, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 2, 0, 3, 3, + BOX_CLOCK, 2, 3, 0, 0, 3, 3, 2, 2, 4}, #define WIPE_B8_262 1 - { BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 1, 0, 2, 2, - BOX_CLOCK, 1, 2, 0, 0, 2, 2, 1, 4, 3, - BOX_CLOCK, 1, 2, 0, 1, 4, 3, 2, 2, 4, - BOX_CLOCK, 3, 2, 0, 2, 2, 0, 3, 0, 1, - BOX_CLOCK, 3, 2, 0, 3, 0, 1, 4, 2, 2, - BOX_CLOCK, 3, 2, 0, 4, 2, 2, 3, 4, 3, - BOX_CLOCK, 3, 2, 0, 3, 4, 3, 2, 2, 4 }, + {BOX_CLOCK, 1, 2, 0, 2, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 0, 2, 2, + BOX_CLOCK, 1, 2, 0, 0, 2, 2, 1, 4, 3, + BOX_CLOCK, 1, 2, 0, 1, 4, 3, 2, 2, 4, + BOX_CLOCK, 3, 2, 0, 2, 2, 0, 3, 0, 1, + BOX_CLOCK, 3, 2, 0, 3, 0, 1, 4, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 2, 3, 4, 3, + BOX_CLOCK, 3, 2, 0, 3, 4, 3, 2, 2, 4}, #define WIPE_B8_263 2 - { BOX_CLOCK, 2, 1, 0, 2, 0, 0, 4, 1, 1, - BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 2, 2, - BOX_CLOCK, 2, 1, 0, 2, 0, 0, 0, 1, 1, - BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 2, 2, - BOX_CLOCK, 2, 3, 0, 2, 4, 0, 4, 3, 1, - BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 2, 2, - BOX_CLOCK, 2, 3, 0, 2, 4, 0, 0, 3, 1, - BOX_CLOCK, 2, 3, 0, 0, 3, 1, 2, 2, 2 }, + {BOX_CLOCK, 2, 1, 0, 2, 0, 0, 4, 1, 1, + BOX_CLOCK, 2, 1, 0, 4, 1, 1, 2, 2, 2, + BOX_CLOCK, 2, 1, 0, 2, 0, 0, 0, 1, 1, + BOX_CLOCK, 2, 1, 0, 0, 1, 1, 2, 2, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 0, 4, 3, 1, + BOX_CLOCK, 2, 3, 0, 4, 3, 1, 2, 2, 2, + BOX_CLOCK, 2, 3, 0, 2, 4, 0, 0, 3, 1, + BOX_CLOCK, 2, 3, 0, 0, 3, 1, 2, 2, 2}, #define WIPE_B8_264 3 - { BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, - BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2, - BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 4, 1, - BOX_CLOCK, 1, 2, 0, 1, 4, 1, 2, 2, 2, - BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 0, 1, - BOX_CLOCK, 3, 2, 0, 3, 0, 1, 2, 2, 2, - BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 4, 1, - BOX_CLOCK, 3, 2, 0, 3, 4, 1, 2, 2, 2 }, + {BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 0, 1, + BOX_CLOCK, 1, 2, 0, 1, 0, 1, 2, 2, 2, + BOX_CLOCK, 1, 2, 0, 0, 2, 0, 1, 4, 1, + BOX_CLOCK, 1, 2, 0, 1, 4, 1, 2, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 0, 1, + BOX_CLOCK, 3, 2, 0, 3, 0, 1, 2, 2, 2, + BOX_CLOCK, 3, 2, 0, 4, 2, 0, 3, 4, 1, + BOX_CLOCK, 3, 2, 0, 3, 4, 1, 2, 2, 2}, }; -static gint triangles_2t[][2*9] = -{ +static gint triangles_2t[][2 * 9] = { /* 3 -> 6 */ #define WIPE_T2_3 0 - { 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 0, 1, 1, 1 }, + {0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 1, 1, 1}, #define WIPE_T2_4 WIPE_T2_3+1 - { 0, 0, 1, 1, 0, 0, 0, 1, 1, - 1, 0, 0, 0, 1, 1, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 1, 1, 1, 1}, #define WIPE_T2_5 WIPE_T2_4+1 - { 0, 0, 1, 0, 1, 1, 1, 1, 0, - 1, 0, 1, 0, 0, 1, 1, 1, 0 }, + {0, 0, 1, 0, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 0}, #define WIPE_T2_6 WIPE_T2_5+1 - { 0, 0, 1, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 1, 1 }, + {0, 0, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 1, 1}, #define WIPE_T2_41 WIPE_T2_6+1 - { 0, 0, 0, 1, 0, 1, 0, 1, 1, - 1, 0, 1, 0, 1, 1, 1, 1, 2 }, + {0, 0, 0, 1, 0, 1, 0, 1, 1, + 1, 0, 1, 0, 1, 1, 1, 1, 2}, #define WIPE_T2_42 WIPE_T2_41+1 - { 0, 0, 1, 1, 0, 0, 1, 1, 1, - 0, 0, 1, 0, 1, 2, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 0, 1, 2, 1, 1, 1}, #define WIPE_T2_45 WIPE_T2_42+1 - { 0, 0, 1, 1, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 1, 1, 1}, #define WIPE_T2_46 WIPE_T2_45+1 - { 0, 0, 0, 1, 0, 1, 1, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0 }, + {0, 0, 0, 1, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0}, #define WIPE_T2_245 WIPE_T2_46+1 - { 0, 0, 0, 2, 0, 0, 2, 2, 1, - 2, 2, 0, 0, 2, 0, 0, 0, 1 }, + {0, 0, 0, 2, 0, 0, 2, 2, 1, + 2, 2, 0, 0, 2, 0, 0, 0, 1}, #define WIPE_T2_246 WIPE_T2_245+1 - { 0, 2, 0, 0, 0, 0, 2, 0, 1, - 2, 0, 0, 2, 2, 0, 0, 2, 1 }, + {0, 2, 0, 0, 0, 0, 2, 0, 1, + 2, 0, 0, 2, 2, 0, 0, 2, 1}, }; -static gint triangles_3t[][3*9] = -{ +static gint triangles_3t[][3 * 9] = { /* 23 -> 26 */ #define WIPE_T3_23 0 - { 0, 0, 1, 1, 0, 0, 0, 2, 1, - 1, 0, 0, 0, 2, 1, 2, 2, 1, - 1, 0, 0, 2, 0, 1, 2, 2, 1 }, + {0, 0, 1, 1, 0, 0, 0, 2, 1, + 1, 0, 0, 0, 2, 1, 2, 2, 1, + 1, 0, 0, 2, 0, 1, 2, 2, 1}, #define WIPE_T3_24 1 - { 0, 0, 1, 2, 0, 1, 2, 1, 0, - 0, 0, 1, 2, 1, 0, 0, 2, 1, - 2, 1, 0, 0, 2, 1, 2, 2, 1 }, + {0, 0, 1, 2, 0, 1, 2, 1, 0, + 0, 0, 1, 2, 1, 0, 0, 2, 1, + 2, 1, 0, 0, 2, 1, 2, 2, 1}, #define WIPE_T3_25 2 - { 0, 0, 1, 0, 2, 1, 1, 2, 0, - 0, 0, 1, 2, 0, 1, 1, 2, 0, - 2, 0, 1, 1, 2, 0, 2, 2, 1 }, + {0, 0, 1, 0, 2, 1, 1, 2, 0, + 0, 0, 1, 2, 0, 1, 1, 2, 0, + 2, 0, 1, 1, 2, 0, 2, 2, 1}, #define WIPE_T3_26 3 - { 0, 0, 1, 2, 0, 1, 0, 1, 0, - 2, 0, 1, 0, 1, 0, 2, 2, 1, - 0, 1, 0, 0, 2, 1, 2, 2, 1 }, + {0, 0, 1, 2, 0, 1, 0, 1, 0, + 2, 0, 1, 0, 1, 0, 2, 2, 1, + 0, 1, 0, 0, 2, 1, 2, 2, 1}, }; -static gint triangles_4t[][4*9] = -{ +static gint triangles_4t[][4 * 9] = { #define WIPE_T4_61 0 - { 0, 0, 1, 1, 0, 0, 1, 2, 1, - 0, 0, 1, 0, 2, 2, 1, 2, 1, - 1, 0, 0, 2, 0, 1, 1, 2, 1, - 2, 0, 1, 1, 2, 1, 2, 2, 2 }, + {0, 0, 1, 1, 0, 0, 1, 2, 1, + 0, 0, 1, 0, 2, 2, 1, 2, 1, + 1, 0, 0, 2, 0, 1, 1, 2, 1, + 2, 0, 1, 1, 2, 1, 2, 2, 2}, #define WIPE_T4_62 1 - { 0, 0, 2, 2, 0, 1, 0, 1, 1, - 2, 0, 1, 0, 1, 1, 2, 1, 0, - 0, 1, 1, 2, 1, 0, 2, 2, 1, - 0, 1, 1, 0, 2, 2, 2, 2, 1 }, + {0, 0, 2, 2, 0, 1, 0, 1, 1, + 2, 0, 1, 0, 1, 1, 2, 1, 0, + 0, 1, 1, 2, 1, 0, 2, 2, 1, + 0, 1, 1, 0, 2, 2, 2, 2, 1}, #define WIPE_T4_63 2 - { 0, 0, 2, 1, 0, 1, 0, 2, 1, - 1, 0, 1, 0, 2, 1, 1, 2, 0, - 1, 0, 1, 1, 2, 0, 2, 2, 1, - 1, 0, 1, 2, 0, 2, 2, 2, 1 }, + {0, 0, 2, 1, 0, 1, 0, 2, 1, + 1, 0, 1, 0, 2, 1, 1, 2, 0, + 1, 0, 1, 1, 2, 0, 2, 2, 1, + 1, 0, 1, 2, 0, 2, 2, 2, 1}, #define WIPE_T4_64 3 - { 0, 0, 1, 2, 0, 2, 2, 1, 1, - 0, 0, 1, 0, 1, 0, 2, 1, 1, - 0, 1, 0, 2, 1, 1, 0, 2, 1, - 2, 1, 1, 0, 2, 1, 2, 2, 2 }, + {0, 0, 1, 2, 0, 2, 2, 1, 1, + 0, 0, 1, 0, 1, 0, 2, 1, 1, + 0, 1, 0, 2, 1, 1, 0, 2, 1, + 2, 1, 1, 0, 2, 1, 2, 2, 2}, #define WIPE_T4_65 4 - { 0, 0, 0, 1, 0, 1, 1, 2, 0, - 0, 0, 0, 0, 2, 1, 1, 2, 0, - 1, 0, 1, 2, 0, 0, 1, 2, 0, - 2, 0, 0, 1, 2, 0, 2, 2, 1 }, + {0, 0, 0, 1, 0, 1, 1, 2, 0, + 0, 0, 0, 0, 2, 1, 1, 2, 0, + 1, 0, 1, 2, 0, 0, 1, 2, 0, + 2, 0, 0, 1, 2, 0, 2, 2, 1}, #define WIPE_T4_66 5 - { 0, 0, 1, 2, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 1, 0, 2, 1, 1, - 0, 1, 0, 2, 1, 1, 2, 2, 0, - 0, 1, 0, 0, 2, 1, 2, 2, 0 }, + {0, 0, 1, 2, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 1, 0, 2, 1, 1, + 0, 1, 0, 2, 1, 1, 2, 2, 0, + 0, 1, 0, 0, 2, 1, 2, 2, 0}, #define WIPE_T4_67 6 - { 0, 0, 1, 1, 0, 0, 0, 2, 0, - 1, 0, 0, 0, 2, 0, 1, 2, 1, - 1, 0, 0, 1, 2, 1, 2, 2, 0, - 1, 0, 0, 2, 0, 1, 2, 2, 0 }, + {0, 0, 1, 1, 0, 0, 0, 2, 0, + 1, 0, 0, 0, 2, 0, 1, 2, 1, + 1, 0, 0, 1, 2, 1, 2, 2, 0, + 1, 0, 0, 2, 0, 1, 2, 2, 0}, #define WIPE_T4_68 7 - { 0, 0, 0, 2, 0, 1, 2, 1, 0, - 0, 0, 0, 0, 1, 1, 2, 1, 0, - 0, 1, 1, 2, 1, 0, 0, 2, 0, - 2, 1, 0, 0, 2, 0, 2, 2, 1 }, + {0, 0, 0, 2, 0, 1, 2, 1, 0, + 0, 0, 0, 0, 1, 1, 2, 1, 0, + 0, 1, 1, 2, 1, 0, 0, 2, 0, + 2, 1, 0, 0, 2, 0, 2, 2, 1}, #define WIPE_T4_101 8 - { 0, 0, 1, 2, 0, 1, 1, 1, 0, - 0, 0, 1, 1, 1, 0, 0, 2, 1, - 1, 1, 0, 0, 2, 1, 2, 2, 1, - 2, 0, 1, 1, 1, 0, 2, 2, 1 }, + {0, 0, 1, 2, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 2, 1, + 1, 1, 0, 0, 2, 1, 2, 2, 1, + 2, 0, 1, 1, 1, 0, 2, 2, 1}, }; -static gint triangles_8t[][8*9] = -{ +static gint triangles_8t[][8 * 9] = { /* 7 */ #define WIPE_T8_7 0 - { 0, 0, 0, 1, 0, 1, 1, 1, 1, - 1, 0, 1, 2, 0, 0, 1, 1, 1, - 2, 0, 0, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 2, 0, - 1, 1, 1, 1, 2, 1, 2, 2, 0, - 1, 1, 1, 0, 2, 0, 1, 2, 1, - 0, 1, 1, 1, 1, 1, 0, 2, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 1 }, + {0, 0, 0, 1, 0, 1, 1, 1, 1, + 1, 0, 1, 2, 0, 0, 1, 1, 1, + 2, 0, 0, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 2, 0, + 1, 1, 1, 1, 2, 1, 2, 2, 0, + 1, 1, 1, 0, 2, 0, 1, 2, 1, + 0, 1, 1, 1, 1, 1, 0, 2, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1}, #define WIPE_T8_43 1 - { 0, 0, 1, 1, 0, 0, 1, 1, 1, - 1, 0, 0, 2, 0, 1, 1, 1, 1, - 2, 0, 1, 1, 1, 1, 2, 1, 2, - 1, 1, 1, 2, 1, 2, 2, 2, 1, - 1, 1, 1, 1, 2, 0, 2, 2, 1, - 1, 1, 1, 0, 2, 1, 1, 2, 0, - 0, 1, 2, 1, 1, 1, 0, 2, 1, - 0, 0, 1, 0, 1, 2, 1, 1, 1 }, + {0, 0, 1, 1, 0, 0, 1, 1, 1, + 1, 0, 0, 2, 0, 1, 1, 1, 1, + 2, 0, 1, 1, 1, 1, 2, 1, 2, + 1, 1, 1, 2, 1, 2, 2, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 2, 1, + 1, 1, 1, 0, 2, 1, 1, 2, 0, + 0, 1, 2, 1, 1, 1, 0, 2, 1, + 0, 0, 1, 0, 1, 2, 1, 1, 1}, #define WIPE_T8_44 2 - { 0, 0, 1, 1, 0, 2, 1, 1, 1, - 1, 0, 2, 2, 0, 1, 1, 1, 1, - 2, 0, 1, 1, 1, 1, 2, 1, 0, - 1, 1, 1, 2, 1, 0, 2, 2, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 1, - 1, 1, 1, 0, 2, 1, 1, 2, 2, - 0, 1, 0, 1, 1, 1, 0, 2, 1, - 0, 0, 1, 0, 1, 0, 1, 1, 1 }, + {0, 0, 1, 1, 0, 2, 1, 1, 1, + 1, 0, 2, 2, 0, 1, 1, 1, 1, + 2, 0, 1, 1, 1, 1, 2, 1, 0, + 1, 1, 1, 2, 1, 0, 2, 2, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 0, 2, 1, 1, 2, 2, + 0, 1, 0, 1, 1, 1, 0, 2, 1, + 0, 0, 1, 0, 1, 0, 1, 1, 1}, #define WIPE_T8_47 3 - { 0, 0, 0, 1, 0, 1, 1, 1, 0, - 1, 0, 1, 2, 0, 0, 1, 1, 0, - 2, 0, 0, 1, 1, 0, 2, 1, 1, - 1, 1, 0, 2, 1, 1, 2, 2, 0, - 1, 1, 0, 1, 2, 1, 2, 2, 0, - 1, 1, 0, 0, 2, 0, 1, 2, 1, - 0, 1, 1, 1, 1, 0, 0, 2, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 0 }, + {0, 0, 0, 1, 0, 1, 1, 1, 0, + 1, 0, 1, 2, 0, 0, 1, 1, 0, + 2, 0, 0, 1, 1, 0, 2, 1, 1, + 1, 1, 0, 2, 1, 1, 2, 2, 0, + 1, 1, 0, 1, 2, 1, 2, 2, 0, + 1, 1, 0, 0, 2, 0, 1, 2, 1, + 0, 1, 1, 1, 1, 0, 0, 2, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0}, #define WIPE_T8_48 4 - { 0, 0, 1, 1, 0, 0, 0, 1, 0, - 1, 0, 0, 0, 1, 0, 1, 1, 1, - 1, 0, 0, 2, 0, 1, 2, 1, 0, - 1, 0, 0, 1, 1, 1, 2, 1, 0, - 0, 1, 0, 1, 1, 1, 1, 2, 0, - 0, 1, 0, 0, 2, 1, 1, 2, 0, - 1, 1, 1, 2, 1, 0, 1, 2, 0, - 2, 1, 0, 1, 2, 0, 2, 2, 1 }, + {0, 0, 1, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 1, 1, 1, + 1, 0, 0, 2, 0, 1, 2, 1, 0, + 1, 0, 0, 1, 1, 1, 2, 1, 0, + 0, 1, 0, 1, 1, 1, 1, 2, 0, + 0, 1, 0, 0, 2, 1, 1, 2, 0, + 1, 1, 1, 2, 1, 0, 1, 2, 0, + 2, 1, 0, 1, 2, 0, 2, 2, 1}, }; -static gint triangles_16t[][16*9] = -{ +static gint triangles_16t[][16 * 9] = { /* 8 */ #define WIPE_T16_8 0 - { 0, 0, 1, 2, 0, 1, 1, 1, 0, - 2, 0, 1, 1, 1, 0, 2, 2, 1, - 1, 1, 0, 0, 2, 1, 2, 2, 1, - 0, 0, 1, 1, 1, 0, 0, 2, 1, - 2, 0, 1, 4, 0, 1, 3, 1, 0, - 4, 0, 1, 3, 1, 0, 4, 2, 1, - 3, 1, 0, 2, 2, 1, 4, 2, 1, - 2, 0, 1, 3, 1, 0, 2, 2, 1, - 0, 2, 1, 2, 2, 1, 1, 3, 0, - 2, 2, 1, 1, 3, 0, 2, 4, 1, - 1, 3, 0, 0, 4, 1, 2, 4, 1, - 0, 2, 1, 1, 3, 0, 0, 4, 1, - 2, 2, 1, 4, 2, 1, 3, 3, 0, - 4, 2, 1, 3, 3, 0, 4, 4, 1, - 3, 3, 0, 2, 4, 1, 4, 4, 1, - 2, 2, 1, 3, 3, 0, 2, 4, 1 } + {0, 0, 1, 2, 0, 1, 1, 1, 0, + 2, 0, 1, 1, 1, 0, 2, 2, 1, + 1, 1, 0, 0, 2, 1, 2, 2, 1, + 0, 0, 1, 1, 1, 0, 0, 2, 1, + 2, 0, 1, 4, 0, 1, 3, 1, 0, + 4, 0, 1, 3, 1, 0, 4, 2, 1, + 3, 1, 0, 2, 2, 1, 4, 2, 1, + 2, 0, 1, 3, 1, 0, 2, 2, 1, + 0, 2, 1, 2, 2, 1, 1, 3, 0, + 2, 2, 1, 1, 3, 0, 2, 4, 1, + 1, 3, 0, 0, 4, 1, 2, 4, 1, + 0, 2, 1, 1, 3, 0, 0, 4, 1, + 2, 2, 1, 4, 2, 1, 3, 3, 0, + 4, 2, 1, 3, 3, 0, 4, 4, 1, + 3, 3, 0, 2, 4, 1, 4, 4, 1, + 2, 2, 1, 3, 3, 0, 2, 4, 1} }; typedef struct _GstWipeConfig GstWipeConfig; -struct _GstWipeConfig { - gint *objects; - gint nobjects; - gint xscale; - gint yscale; - gint cscale; +struct _GstWipeConfig +{ + gint *objects; + gint nobjects; + gint xscale; + gint yscale; + gint cscale; }; -static GstWipeConfig wipe_config[] = -{ +static GstWipeConfig wipe_config[] = { #define WIPE_CONFIG_1 0 - { boxes_1b[WIPE_B1_1], 1, 0, 0, 0 }, /* 1 */ + {boxes_1b[WIPE_B1_1], 1, 0, 0, 0}, /* 1 */ #define WIPE_CONFIG_2 WIPE_CONFIG_1+1 - { boxes_1b[WIPE_B1_2], 1, 0, 0, 0 }, /* 2 */ + {boxes_1b[WIPE_B1_2], 1, 0, 0, 0}, /* 2 */ #define WIPE_CONFIG_3 WIPE_CONFIG_2+1 - { triangles_2t[WIPE_T2_3], 2, 0, 0, 0 }, /* 3 */ + {triangles_2t[WIPE_T2_3], 2, 0, 0, 0}, /* 3 */ #define WIPE_CONFIG_4 WIPE_CONFIG_3+1 - { triangles_2t[WIPE_T2_4], 2, 0, 0, 0 }, /* 4 */ + {triangles_2t[WIPE_T2_4], 2, 0, 0, 0}, /* 4 */ #define WIPE_CONFIG_5 WIPE_CONFIG_4+1 - { triangles_2t[WIPE_T2_5], 2, 0, 0, 0 }, /* 5 */ + {triangles_2t[WIPE_T2_5], 2, 0, 0, 0}, /* 5 */ #define WIPE_CONFIG_6 WIPE_CONFIG_5+1 - { triangles_2t[WIPE_T2_6], 2, 0, 0, 0 }, /* 6 */ + {triangles_2t[WIPE_T2_6], 2, 0, 0, 0}, /* 6 */ #define WIPE_CONFIG_7 WIPE_CONFIG_6+1 - { triangles_8t[WIPE_T8_7], 8, 1, 1, 0 }, /* 7 */ + {triangles_8t[WIPE_T8_7], 8, 1, 1, 0}, /* 7 */ #define WIPE_CONFIG_8 WIPE_CONFIG_7+1 - { triangles_16t[WIPE_T16_8], 16, 2, 2, 0 }, /* 8 */ + {triangles_16t[WIPE_T16_8], 16, 2, 2, 0}, /* 8 */ #define WIPE_CONFIG_21 WIPE_CONFIG_8+1 - { boxes_2b[WIPE_B2_21], 2, 1, 1, 0 }, /* 21 */ + {boxes_2b[WIPE_B2_21], 2, 1, 1, 0}, /* 21 */ #define WIPE_CONFIG_22 WIPE_CONFIG_21+1 - { boxes_2b[WIPE_B2_22], 2, 1, 1, 0 }, /* 22 */ + {boxes_2b[WIPE_B2_22], 2, 1, 1, 0}, /* 22 */ #define WIPE_CONFIG_23 WIPE_CONFIG_22+1 - { triangles_3t[WIPE_T3_23], 3, 1, 1, 0 }, /* 23 */ + {triangles_3t[WIPE_T3_23], 3, 1, 1, 0}, /* 23 */ #define WIPE_CONFIG_24 WIPE_CONFIG_23+1 - { triangles_3t[WIPE_T3_24], 3, 1, 1, 0 }, /* 24 */ + {triangles_3t[WIPE_T3_24], 3, 1, 1, 0}, /* 24 */ #define WIPE_CONFIG_25 WIPE_CONFIG_24+1 - { triangles_3t[WIPE_T3_23], 3, 1, 1, 0 }, /* 25 */ + {triangles_3t[WIPE_T3_23], 3, 1, 1, 0}, /* 25 */ #define WIPE_CONFIG_26 WIPE_CONFIG_25+1 - { triangles_3t[WIPE_T3_26], 3, 1, 1, 0 }, /* 26 */ + {triangles_3t[WIPE_T3_26], 3, 1, 1, 0}, /* 26 */ #define WIPE_CONFIG_41 WIPE_CONFIG_26+1 - { triangles_2t[WIPE_T2_41], 2, 0, 0, 1 }, /* 41 */ + {triangles_2t[WIPE_T2_41], 2, 0, 0, 1}, /* 41 */ #define WIPE_CONFIG_42 WIPE_CONFIG_41+1 - { triangles_2t[WIPE_T2_42], 2, 0, 0, 1 }, /* 42 */ + {triangles_2t[WIPE_T2_42], 2, 0, 0, 1}, /* 42 */ #define WIPE_CONFIG_43 WIPE_CONFIG_42+1 - { triangles_8t[WIPE_T8_43], 8, 1, 1, 1 }, /* 43 */ + {triangles_8t[WIPE_T8_43], 8, 1, 1, 1}, /* 43 */ #define WIPE_CONFIG_44 WIPE_CONFIG_43+1 - { triangles_8t[WIPE_T8_44], 8, 1, 1, 1 }, /* 44 */ + {triangles_8t[WIPE_T8_44], 8, 1, 1, 1}, /* 44 */ #define WIPE_CONFIG_45 WIPE_CONFIG_44+1 - { triangles_2t[WIPE_T2_45], 2, 0, 0, 0 }, /* 45 */ + {triangles_2t[WIPE_T2_45], 2, 0, 0, 0}, /* 45 */ #define WIPE_CONFIG_46 WIPE_CONFIG_45+1 - { triangles_2t[WIPE_T2_46], 2, 0, 0, 0 }, /* 46 */ + {triangles_2t[WIPE_T2_46], 2, 0, 0, 0}, /* 46 */ #define WIPE_CONFIG_47 WIPE_CONFIG_46+1 - { triangles_8t[WIPE_T8_47], 8, 1, 1, 0 }, /* 47 */ + {triangles_8t[WIPE_T8_47], 8, 1, 1, 0}, /* 47 */ #define WIPE_CONFIG_48 WIPE_CONFIG_47+1 - { triangles_8t[WIPE_T8_48], 8, 1, 1, 0 }, /* 48 */ + {triangles_8t[WIPE_T8_48], 8, 1, 1, 0}, /* 48 */ #define WIPE_CONFIG_61 WIPE_CONFIG_48+1 - { triangles_4t[WIPE_T4_61], 4, 1, 1, 1 }, /* 61 */ + {triangles_4t[WIPE_T4_61], 4, 1, 1, 1}, /* 61 */ #define WIPE_CONFIG_62 WIPE_CONFIG_61+1 - { triangles_4t[WIPE_T4_62], 4, 1, 1, 1 }, /* 62 */ + {triangles_4t[WIPE_T4_62], 4, 1, 1, 1}, /* 62 */ #define WIPE_CONFIG_63 WIPE_CONFIG_62+1 - { triangles_4t[WIPE_T4_63], 4, 1, 1, 1 }, /* 63 */ + {triangles_4t[WIPE_T4_63], 4, 1, 1, 1}, /* 63 */ #define WIPE_CONFIG_64 WIPE_CONFIG_63+1 - { triangles_4t[WIPE_T4_64], 4, 1, 1, 1 }, /* 64 */ + {triangles_4t[WIPE_T4_64], 4, 1, 1, 1}, /* 64 */ #define WIPE_CONFIG_65 WIPE_CONFIG_64+1 - { triangles_4t[WIPE_T4_65], 4, 1, 1, 0 }, /* 65 */ + {triangles_4t[WIPE_T4_65], 4, 1, 1, 0}, /* 65 */ #define WIPE_CONFIG_66 WIPE_CONFIG_65+1 - { triangles_4t[WIPE_T4_66], 4, 1, 1, 0 }, /* 66 */ + {triangles_4t[WIPE_T4_66], 4, 1, 1, 0}, /* 66 */ #define WIPE_CONFIG_67 WIPE_CONFIG_66+1 - { triangles_4t[WIPE_T4_67], 4, 1, 1, 0 }, /* 67 */ + {triangles_4t[WIPE_T4_67], 4, 1, 1, 0}, /* 67 */ #define WIPE_CONFIG_68 WIPE_CONFIG_67+1 - { triangles_4t[WIPE_T4_68], 4, 1, 1, 0 }, /* 68 */ + {triangles_4t[WIPE_T4_68], 4, 1, 1, 0}, /* 68 */ #define WIPE_CONFIG_101 WIPE_CONFIG_68+1 - { triangles_4t[WIPE_T4_101], 4, 1, 1, 0 }, /* 101 */ + {triangles_4t[WIPE_T4_101], 4, 1, 1, 0}, /* 101 */ #define WIPE_CONFIG_201 WIPE_CONFIG_101+1 - { box_clock_4b[WIPE_B4_201], 4, 1, 1, 2 }, /* 201 */ + {box_clock_4b[WIPE_B4_201], 4, 1, 1, 2}, /* 201 */ #define WIPE_CONFIG_202 WIPE_CONFIG_201+1 - { box_clock_4b[WIPE_B4_202], 4, 1, 1, 2 }, /* 202 */ + {box_clock_4b[WIPE_B4_202], 4, 1, 1, 2}, /* 202 */ #define WIPE_CONFIG_203 WIPE_CONFIG_202+1 - { box_clock_4b[WIPE_B4_203], 4, 1, 1, 2 }, /* 203 */ + {box_clock_4b[WIPE_B4_203], 4, 1, 1, 2}, /* 203 */ #define WIPE_CONFIG_204 WIPE_CONFIG_203+1 - { box_clock_4b[WIPE_B4_204], 4, 1, 1, 2 }, /* 204 */ + {box_clock_4b[WIPE_B4_204], 4, 1, 1, 2}, /* 204 */ #define WIPE_CONFIG_205 WIPE_CONFIG_204+1 - { box_clock_4b[WIPE_B4_205], 4, 1, 1, 1 }, /* 205 */ + {box_clock_4b[WIPE_B4_205], 4, 1, 1, 1}, /* 205 */ #define WIPE_CONFIG_206 WIPE_CONFIG_205+1 - { box_clock_4b[WIPE_B4_206], 4, 1, 1, 1 }, /* 206 */ + {box_clock_4b[WIPE_B4_206], 4, 1, 1, 1}, /* 206 */ #define WIPE_CONFIG_207 WIPE_CONFIG_206+1 - { box_clock_4b[WIPE_B4_207], 4, 1, 1, 0 }, /* 207 */ + {box_clock_4b[WIPE_B4_207], 4, 1, 1, 0}, /* 207 */ #define WIPE_CONFIG_211 WIPE_CONFIG_207+1 - { box_clock_4b[WIPE_B4_211], 4, 1, 1, 1 }, /* 211 */ + {box_clock_4b[WIPE_B4_211], 4, 1, 1, 1}, /* 211 */ #define WIPE_CONFIG_212 WIPE_CONFIG_211+1 - { box_clock_4b[WIPE_B4_212], 4, 1, 1, 1 }, /* 212 */ + {box_clock_4b[WIPE_B4_212], 4, 1, 1, 1}, /* 212 */ #define WIPE_CONFIG_213 WIPE_CONFIG_212+1 - { box_clock_4b[WIPE_B4_213], 4, 1, 1, 0 }, /* 213 */ + {box_clock_4b[WIPE_B4_213], 4, 1, 1, 0}, /* 213 */ #define WIPE_CONFIG_214 WIPE_CONFIG_213+1 - { box_clock_4b[WIPE_B4_214], 4, 1, 1, 0 }, /* 214 */ + {box_clock_4b[WIPE_B4_214], 4, 1, 1, 0}, /* 214 */ #define WIPE_CONFIG_221 WIPE_CONFIG_214+1 - { box_clock_2b[WIPE_B2_221], 2, 1, 1, 1 }, /* 221 */ + {box_clock_2b[WIPE_B2_221], 2, 1, 1, 1}, /* 221 */ #define WIPE_CONFIG_222 WIPE_CONFIG_221+1 - { box_clock_2b[WIPE_B2_222], 2, 1, 1, 1 }, /* 222 */ + {box_clock_2b[WIPE_B2_222], 2, 1, 1, 1}, /* 222 */ #define WIPE_CONFIG_223 WIPE_CONFIG_222+1 - { box_clock_2b[WIPE_B2_223], 2, 1, 1, 1 }, /* 223 */ + {box_clock_2b[WIPE_B2_223], 2, 1, 1, 1}, /* 223 */ #define WIPE_CONFIG_224 WIPE_CONFIG_223+1 - { box_clock_2b[WIPE_B2_224], 2, 1, 1, 1 }, /* 224 */ + {box_clock_2b[WIPE_B2_224], 2, 1, 1, 1}, /* 224 */ #define WIPE_CONFIG_225 WIPE_CONFIG_224+1 - { box_clock_2b[WIPE_B2_225], 2, 1, 1, 0 }, /* 225 */ + {box_clock_2b[WIPE_B2_225], 2, 1, 1, 0}, /* 225 */ #define WIPE_CONFIG_226 WIPE_CONFIG_225+1 - { box_clock_2b[WIPE_B2_226], 2, 1, 1, 0 }, /* 226 */ + {box_clock_2b[WIPE_B2_226], 2, 1, 1, 0}, /* 226 */ #define WIPE_CONFIG_227 WIPE_CONFIG_226+1 - { box_clock_4b[WIPE_B4_227], 4, 1, 1, 1 }, /* 227 */ + {box_clock_4b[WIPE_B4_227], 4, 1, 1, 1}, /* 227 */ #define WIPE_CONFIG_228 WIPE_CONFIG_227+1 - { box_clock_4b[WIPE_B4_228], 4, 1, 1, 1 }, /* 228 */ + {box_clock_4b[WIPE_B4_228], 4, 1, 1, 1}, /* 228 */ #define WIPE_CONFIG_231 WIPE_CONFIG_228+1 - { box_clock_2b[WIPE_B2_231], 2, 1, 1, 0 }, /* 231 */ + {box_clock_2b[WIPE_B2_231], 2, 1, 1, 0}, /* 231 */ #define WIPE_CONFIG_232 WIPE_CONFIG_231+1 - { box_clock_2b[WIPE_B2_232], 2, 1, 1, 0 }, /* 232 */ + {box_clock_2b[WIPE_B2_232], 2, 1, 1, 0}, /* 232 */ #define WIPE_CONFIG_233 WIPE_CONFIG_232+1 - { box_clock_2b[WIPE_B2_233], 2, 1, 1, 0 }, /* 233 */ + {box_clock_2b[WIPE_B2_233], 2, 1, 1, 0}, /* 233 */ #define WIPE_CONFIG_234 WIPE_CONFIG_233+1 - { box_clock_2b[WIPE_B2_234], 2, 1, 1, 0 }, /* 234 */ + {box_clock_2b[WIPE_B2_234], 2, 1, 1, 0}, /* 234 */ #define WIPE_CONFIG_235 WIPE_CONFIG_234+1 - { box_clock_4b[WIPE_B4_235], 4, 1, 1, 0 }, /* 235 */ + {box_clock_4b[WIPE_B4_235], 4, 1, 1, 0}, /* 235 */ #define WIPE_CONFIG_236 WIPE_CONFIG_235+1 - { box_clock_4b[WIPE_B4_236], 4, 1, 1, 0 }, /* 236 */ + {box_clock_4b[WIPE_B4_236], 4, 1, 1, 0}, /* 236 */ #define WIPE_CONFIG_241 WIPE_CONFIG_236+1 - { box_clock_1b[WIPE_B1_241], 1, 0, 0, 0 }, /* 241 */ + {box_clock_1b[WIPE_B1_241], 1, 0, 0, 0}, /* 241 */ #define WIPE_CONFIG_242 WIPE_CONFIG_241+1 - { box_clock_1b[WIPE_B1_242], 1, 0, 0, 0 }, /* 242 */ + {box_clock_1b[WIPE_B1_242], 1, 0, 0, 0}, /* 242 */ #define WIPE_CONFIG_243 WIPE_CONFIG_242+1 - { box_clock_1b[WIPE_B1_243], 1, 0, 0, 0 }, /* 243 */ + {box_clock_1b[WIPE_B1_243], 1, 0, 0, 0}, /* 243 */ #define WIPE_CONFIG_244 WIPE_CONFIG_243+1 - { box_clock_1b[WIPE_B1_244], 1, 0, 0, 0 }, /* 244 */ + {box_clock_1b[WIPE_B1_244], 1, 0, 0, 0}, /* 244 */ #define WIPE_CONFIG_245 WIPE_CONFIG_244+1 - { triangles_2t[WIPE_T2_245], 2, 1, 1, 0 }, /* 245 */ + {triangles_2t[WIPE_T2_245], 2, 1, 1, 0}, /* 245 */ #define WIPE_CONFIG_246 WIPE_CONFIG_245+1 - { triangles_2t[WIPE_T2_246], 2, 1, 1, 0 }, /* 246 */ + {triangles_2t[WIPE_T2_246], 2, 1, 1, 0}, /* 246 */ #define WIPE_CONFIG_251 WIPE_CONFIG_246+1 - { box_clock_2b[WIPE_B2_251], 2, 1, 1, 0 }, /* 251 */ + {box_clock_2b[WIPE_B2_251], 2, 1, 1, 0}, /* 251 */ #define WIPE_CONFIG_252 WIPE_CONFIG_251+1 - { box_clock_2b[WIPE_B2_252], 2, 1, 1, 0 }, /* 252 */ + {box_clock_2b[WIPE_B2_252], 2, 1, 1, 0}, /* 252 */ #define WIPE_CONFIG_253 WIPE_CONFIG_252+1 - { box_clock_2b[WIPE_B2_253], 2, 1, 1, 0 }, /* 253 */ + {box_clock_2b[WIPE_B2_253], 2, 1, 1, 0}, /* 253 */ #define WIPE_CONFIG_254 WIPE_CONFIG_253+1 - { box_clock_2b[WIPE_B2_254], 2, 1, 1, 0 }, /* 254 */ + {box_clock_2b[WIPE_B2_254], 2, 1, 1, 0}, /* 254 */ #define WIPE_CONFIG_261 WIPE_CONFIG_254+1 - { box_clock_8b[WIPE_B8_261], 8, 2, 2, 2 }, /* 261 */ + {box_clock_8b[WIPE_B8_261], 8, 2, 2, 2}, /* 261 */ #define WIPE_CONFIG_262 WIPE_CONFIG_261+1 - { box_clock_8b[WIPE_B8_262], 8, 2, 2, 2 }, /* 262 */ + {box_clock_8b[WIPE_B8_262], 8, 2, 2, 2}, /* 262 */ #define WIPE_CONFIG_263 WIPE_CONFIG_262+1 - { box_clock_8b[WIPE_B8_263], 8, 2, 2, 1 }, /* 263 */ + {box_clock_8b[WIPE_B8_263], 8, 2, 2, 1}, /* 263 */ #define WIPE_CONFIG_264 WIPE_CONFIG_263+1 - { box_clock_8b[WIPE_B8_264], 8, 2, 2, 1 }, /* 264 */ + {box_clock_8b[WIPE_B8_264], 8, 2, 2, 1}, /* 264 */ }; static void -gst_wipe_boxes_draw (GstMask *mask) +gst_wipe_boxes_draw (GstMask * mask) { GstWipeConfig *config = mask->user_data; gint *impacts = config->objects; @@ -576,30 +565,30 @@ gst_wipe_boxes_draw (GstMask *mask) for (i = 0; i < config->nobjects; i++) { switch (impacts[0]) { case BOX_VERTICAL: - gst_smpte_paint_vbox (mask->data, mask->width, - impacts[1] * width, impacts[2] * height, impacts[3] * depth, - impacts[4] * width, impacts[5] * height, impacts[6] * depth); + gst_smpte_paint_vbox (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth); impacts += 7; - break; + break; case BOX_HORIZONTAL: - gst_smpte_paint_hbox (mask->data, mask->width, - impacts[1] * width, impacts[2] * height, impacts[3] * depth, - impacts[4] * width, impacts[5] * height, impacts[6] * depth); + gst_smpte_paint_hbox (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth); impacts += 7; case BOX_CLOCK: - gst_smpte_paint_box_clock (mask->data, mask->width, - impacts[1] * width, impacts[2] * height, impacts[3] * depth, - impacts[4] * width, impacts[5] * height, impacts[6] * depth, - impacts[7] * width, impacts[8] * height, impacts[9] * depth); + gst_smpte_paint_box_clock (mask->data, mask->width, + impacts[1] * width, impacts[2] * height, impacts[3] * depth, + impacts[4] * width, impacts[5] * height, impacts[6] * depth, + impacts[7] * width, impacts[8] * height, impacts[9] * depth); impacts += 10; default: - break; + break; } } } static void -gst_wipe_triangles_clock_draw (GstMask *mask) +gst_wipe_triangles_clock_draw (GstMask * mask) { GstWipeConfig *config = mask->user_data; gint *impacts = config->objects; @@ -610,15 +599,15 @@ gst_wipe_triangles_clock_draw (GstMask *mask) for (i = 0; i < config->nobjects; i++) { gst_smpte_paint_triangle_clock (mask->data, mask->width, - impacts[0] * width, impacts[1] * height, impacts[2] * depth, - impacts[3] * width, impacts[4] * height, impacts[5] * depth, - impacts[6] * width, impacts[7] * height, impacts[8] * depth); + impacts[0] * width, impacts[1] * height, impacts[2] * depth, + impacts[3] * width, impacts[4] * height, impacts[5] * depth, + impacts[6] * width, impacts[7] * height, impacts[8] * depth); impacts += 9; } } static void -gst_wipe_triangles_draw (GstMask *mask) +gst_wipe_triangles_draw (GstMask * mask) { GstWipeConfig *config = mask->user_data; gint *impacts = config->objects; @@ -630,295 +619,295 @@ gst_wipe_triangles_draw (GstMask *mask) for (i = 0; i < config->nobjects; i++) { gst_smpte_paint_triangle_linear (mask->data, mask->width, - impacts[0] * width, impacts[1] * height, impacts[2] * depth, - impacts[3] * width, impacts[4] * height, impacts[5] * depth, - impacts[6] * width, impacts[7] * height, impacts[8] * depth); + impacts[0] * width, impacts[1] * height, impacts[2] * depth, + impacts[3] * width, impacts[4] * height, impacts[5] * depth, + impacts[6] * width, impacts[7] * height, impacts[8] * depth); impacts += 9; } } -static GstMaskDefinition definitions[] = { - { 1, "bar_wipe_lr", - "A bar moves from left to right", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_1] }, - { 2, "bar_wipe_tb", - "A bar moves from top to bottom", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_2] }, - { 3, "box_wipe_tl", - "A box expands from the upper-left corner to the lower-right corner", - gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_3] }, - { 4, "box_wipe_tr", - "A box expands from the upper-right corner to the lower-left corner", - gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_4] }, - { 5, "box_wipe_br", - "A box expands from the lower-right corner to the upper-left corner", - gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_5] }, - { 6, "box_wipe_bl", - "A box expands from the lower-left corner to the upper-right corner", +static GstMaskDefinition definitions[] = { + {1, "bar_wipe_lr", + "A bar moves from left to right", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_1]}, + {2, "bar_wipe_tb", + "A bar moves from top to bottom", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_2]}, + {3, "box_wipe_tl", + "A box expands from the upper-left corner to the lower-right corner", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_3]}, + {4, "box_wipe_tr", + "A box expands from the upper-right corner to the lower-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_6] }, - { 7 , "four_box_wipe_ci", - "A box shape expands from each of the four corners toward the center", + &wipe_config[WIPE_CONFIG_4]}, + {5, "box_wipe_br", + "A box expands from the lower-right corner to the upper-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_7] }, - { 8 , "four_box_wipe_co", - "A box shape expands from the center of each quadrant toward the corners of each quadrant", + &wipe_config[WIPE_CONFIG_5]}, + {6, "box_wipe_bl", + "A box expands from the lower-left corner to the upper-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_8] }, - { 21, "barndoor_v", - "A central, vertical line splits and expands toward the left and right edges", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_21] }, - { 22, "barndoor_h", - "A central, horizontal line splits and expands toward the top and bottom edges", - gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_22] }, - { 23, "box_wipe_tc", - "A box expands from the top edge's midpoint to the bottom corners", + &wipe_config[WIPE_CONFIG_6]}, + {7, "four_box_wipe_ci", + "A box shape expands from each of the four corners toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_23] }, - { 24, "box_wipe_rc", - "A box expands from the right edge's midpoint to the left corners", + &wipe_config[WIPE_CONFIG_7]}, + {8, "four_box_wipe_co", + "A box shape expands from the center of each quadrant toward the corners of each quadrant", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_24] }, - { 25, "box_wipe_bc", - "A box expands from the bottom edge's midpoint to the top corners", + &wipe_config[WIPE_CONFIG_8]}, + {21, "barndoor_v", + "A central, vertical line splits and expands toward the left and right edges", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_21]}, + {22, "barndoor_h", + "A central, horizontal line splits and expands toward the top and bottom edges", + gst_wipe_boxes_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_22]}, + {23, "box_wipe_tc", + "A box expands from the top edge's midpoint to the bottom corners", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_23]}, + {24, "box_wipe_rc", + "A box expands from the right edge's midpoint to the left corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_25] }, - { 26, "box_wipe_lc", - "A box expands from the left edge's midpoint to the right corners", + &wipe_config[WIPE_CONFIG_24]}, + {25, "box_wipe_bc", + "A box expands from the bottom edge's midpoint to the top corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_26] }, - { 41, "diagonal_tl", - "A diagonal line moves from the upper-left corner to the lower-right corner", + &wipe_config[WIPE_CONFIG_25]}, + {26, "box_wipe_lc", + "A box expands from the left edge's midpoint to the right corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_41] }, - { 42, "diagonal_tr", - "A diagonal line moves from the upper right corner to the lower-left corner", + &wipe_config[WIPE_CONFIG_26]}, + {41, "diagonal_tl", + "A diagonal line moves from the upper-left corner to the lower-right corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_42] }, - { 43, "bowtie_v", - "Two wedge shapes slide in from the top and bottom edges toward the center", + &wipe_config[WIPE_CONFIG_41]}, + {42, "diagonal_tr", + "A diagonal line moves from the upper right corner to the lower-left corner", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_43] }, - { 44, "bowtie_h", - "Two wedge shapes slide in from the left and right edges toward the center", + &wipe_config[WIPE_CONFIG_42]}, + {43, "bowtie_v", + "Two wedge shapes slide in from the top and bottom edges toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_44] }, - { 45, "barndoor_dbl", - "A diagonal line from the lower-left to upper-right corners splits and expands toward the opposite corners", + &wipe_config[WIPE_CONFIG_43]}, + {44, "bowtie_h", + "Two wedge shapes slide in from the left and right edges toward the center", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_45] }, - { 46, "barndoor_dtl", - "A diagonal line from upper-left to lower-right corners splits and expands toward the opposite corners", + &wipe_config[WIPE_CONFIG_44]}, + {45, "barndoor_dbl", + "A diagonal line from the lower-left to upper-right corners splits and expands toward the opposite corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_46] }, - { 47, "misc_diagonal_dbd", - "Four wedge shapes split from the center and retract toward the four edges", + &wipe_config[WIPE_CONFIG_45]}, + {46, "barndoor_dtl", + "A diagonal line from upper-left to lower-right corners splits and expands toward the opposite corners", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_47] }, - { 48, "misc_diagonal_dd", - "A diamond connecting the four edge midpoints simultaneously contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_46]}, + {47, "misc_diagonal_dbd", + "Four wedge shapes split from the center and retract toward the four edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_48] }, - { 61, "vee_d", - "A wedge shape moves from top to bottom", + &wipe_config[WIPE_CONFIG_47]}, + {48, "misc_diagonal_dd", + "A diamond connecting the four edge midpoints simultaneously contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_61] }, - { 62, "vee_l", - "A wedge shape moves from right to left", + &wipe_config[WIPE_CONFIG_48]}, + {61, "vee_d", + "A wedge shape moves from top to bottom", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_62] }, - { 63, "vee_u", - "A wedge shape moves from bottom to top", + &wipe_config[WIPE_CONFIG_61]}, + {62, "vee_l", + "A wedge shape moves from right to left", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_63] }, - { 64, "vee_r", - "A wedge shape moves from left to right", + &wipe_config[WIPE_CONFIG_62]}, + {63, "vee_u", + "A wedge shape moves from bottom to top", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_64] }, - { 65, "barnvee_d", - "A 'V' shape extending from the bottom edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_63]}, + {64, "vee_r", + "A wedge shape moves from left to right", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_65] }, - { 66, "barnvee_l", - "A 'V' shape extending from the left edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_64]}, + {65, "barnvee_d", + "A 'V' shape extending from the bottom edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_66] }, - { 67, "barnvee_u", - "A 'V' shape extending from the top edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_65]}, + {66, "barnvee_l", + "A 'V' shape extending from the left edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_67] }, - { 68, "barnvee_r", - "A 'V' shape extending from the right edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", + &wipe_config[WIPE_CONFIG_66]}, + {67, "barnvee_u", + "A 'V' shape extending from the top edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_68] }, - { 101, "iris_rect", - "A rectangle expands from the center.", + &wipe_config[WIPE_CONFIG_67]}, + {68, "barnvee_r", + "A 'V' shape extending from the right edge's midpoint to the opposite corners contracts toward the center and expands toward the edges", gst_wipe_triangles_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_101] }, - { 201, "clock_cw12", - "A radial hand sweeps clockwise from the twelve o'clock position", + &wipe_config[WIPE_CONFIG_68]}, + {101, "iris_rect", + "A rectangle expands from the center.", + gst_wipe_triangles_draw, _gst_mask_default_destroy, + &wipe_config[WIPE_CONFIG_101]}, + {201, "clock_cw12", + "A radial hand sweeps clockwise from the twelve o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_201] }, - { 202, "clock_cw3", - "A radial hand sweeps clockwise from the three o'clock position", + &wipe_config[WIPE_CONFIG_201]}, + {202, "clock_cw3", + "A radial hand sweeps clockwise from the three o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_202] }, - { 203, "clock_cw6", - "A radial hand sweeps clockwise from the six o'clock position", + &wipe_config[WIPE_CONFIG_202]}, + {203, "clock_cw6", + "A radial hand sweeps clockwise from the six o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_203] }, - { 204, "clock_cw9", - "A radial hand sweeps clockwise from the nine o'clock position", + &wipe_config[WIPE_CONFIG_203]}, + {204, "clock_cw9", + "A radial hand sweeps clockwise from the nine o'clock position", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_204] }, - { 205, "pinwheel_tbv", - "Two radial hands sweep clockwise from the twelve and six o'clock positions", + &wipe_config[WIPE_CONFIG_204]}, + {205, "pinwheel_tbv", + "Two radial hands sweep clockwise from the twelve and six o'clock positions", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_205] }, - { 206, "pinwheel_tbh", - "Two radial hands sweep clockwise from the nine and three o'clock positions", + &wipe_config[WIPE_CONFIG_205]}, + {206, "pinwheel_tbh", + "Two radial hands sweep clockwise from the nine and three o'clock positions", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_206] }, - { 207, "pinwheel_fb", - "Four radial hands sweep clockwise", + &wipe_config[WIPE_CONFIG_206]}, + {207, "pinwheel_fb", + "Four radial hands sweep clockwise", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_207] }, - { 211, "fan_ct", - "A fan unfolds from the top edge, the fan axis at the center", + &wipe_config[WIPE_CONFIG_207]}, + {211, "fan_ct", + "A fan unfolds from the top edge, the fan axis at the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_211] }, - { 212, "fan_cr", - "A fan unfolds from the right edge, the fan axis at the center", + &wipe_config[WIPE_CONFIG_211]}, + {212, "fan_cr", + "A fan unfolds from the right edge, the fan axis at the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_212] }, - { 213, "doublefan_fov", - "Two fans, their axes at the center, unfold from the top and bottom", + &wipe_config[WIPE_CONFIG_212]}, + {213, "doublefan_fov", + "Two fans, their axes at the center, unfold from the top and bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_213] }, - { 214, "doublefan_foh", - "Two fans, their axes at the center, unfold from the left and right", + &wipe_config[WIPE_CONFIG_213]}, + {214, "doublefan_foh", + "Two fans, their axes at the center, unfold from the left and right", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_214] }, - { 221, "singlesweep_cwt", - "A radial hand sweeps clockwise from the top edge's midpoint", + &wipe_config[WIPE_CONFIG_214]}, + {221, "singlesweep_cwt", + "A radial hand sweeps clockwise from the top edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_221] }, - { 222, "singlesweep_cwr", - "A radial hand sweeps clockwise from the right edge's midpoint", + &wipe_config[WIPE_CONFIG_221]}, + {222, "singlesweep_cwr", + "A radial hand sweeps clockwise from the right edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_222] }, - { 223, "singlesweep_cwb", - "A radial hand sweeps clockwise from the bottom edge's midpoint", + &wipe_config[WIPE_CONFIG_222]}, + {223, "singlesweep_cwb", + "A radial hand sweeps clockwise from the bottom edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_223] }, - { 224, "singlesweep_cwl", - "A radial hand sweeps clockwise from the left edge's midpoint", + &wipe_config[WIPE_CONFIG_223]}, + {224, "singlesweep_cwl", + "A radial hand sweeps clockwise from the left edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_224] }, - { 225, "doublesweep_pv", - "Two radial hands sweep clockwise and counter-clockwise from the top and bottom edges' midpoints", + &wipe_config[WIPE_CONFIG_224]}, + {225, "doublesweep_pv", + "Two radial hands sweep clockwise and counter-clockwise from the top and bottom edges' midpoints", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_225] }, - { 226, "doublesweep_pd", - "Two radial hands sweep clockwise and counter-clockwise from the left and right edges' midpoints", + &wipe_config[WIPE_CONFIG_225]}, + {226, "doublesweep_pd", + "Two radial hands sweep clockwise and counter-clockwise from the left and right edges' midpoints", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_226] }, - { 227, "doublesweep_ov", - "Two radial hands attached at the top and bottom edges' midpoints sweep from right to left", + &wipe_config[WIPE_CONFIG_226]}, + {227, "doublesweep_ov", + "Two radial hands attached at the top and bottom edges' midpoints sweep from right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_227] }, - { 228, "doublesweep_oh", - "Two radial hands attached at the left and right edges' midpoints sweep from top to bottom", + &wipe_config[WIPE_CONFIG_227]}, + {228, "doublesweep_oh", + "Two radial hands attached at the left and right edges' midpoints sweep from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_228] }, - { 231, "fan_t", - "A fan unfolds from the bottom, the fan axis at the top edge's midpoint", + &wipe_config[WIPE_CONFIG_228]}, + {231, "fan_t", + "A fan unfolds from the bottom, the fan axis at the top edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_231] }, - { 232, "fan_r", - "A fan unfolds from the left, the fan axis at the right edge's midpoint", + &wipe_config[WIPE_CONFIG_231]}, + {232, "fan_r", + "A fan unfolds from the left, the fan axis at the right edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_232] }, - { 233, "fan_b", - "A fan unfolds from the top, the fan axis at the bottom edge's midpoint", + &wipe_config[WIPE_CONFIG_232]}, + {233, "fan_b", + "A fan unfolds from the top, the fan axis at the bottom edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_233] }, - { 234, "fan_l", - "A fan unfolds from the right, the fan axis at the left edge's midpoint", + &wipe_config[WIPE_CONFIG_233]}, + {234, "fan_l", + "A fan unfolds from the right, the fan axis at the left edge's midpoint", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_234] }, - { 235, "doublefan_fiv", - "Two fans, their axes at the top and bottom, unfold from the center", + &wipe_config[WIPE_CONFIG_234]}, + {235, "doublefan_fiv", + "Two fans, their axes at the top and bottom, unfold from the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_235] }, - { 236, "doublefan_fih", - "Two fans, their axes at the left and right, unfold from the center", + &wipe_config[WIPE_CONFIG_235]}, + {236, "doublefan_fih", + "Two fans, their axes at the left and right, unfold from the center", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_236] }, - { 241, "singlesweep_cwtl", - "A radial hand sweeps clockwise from the upper-left corner", + &wipe_config[WIPE_CONFIG_236]}, + {241, "singlesweep_cwtl", + "A radial hand sweeps clockwise from the upper-left corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_241] }, - { 242, "singlesweep_cwbl", - "A radial hand sweeps counter-clockwise from the lower-left corner.", + &wipe_config[WIPE_CONFIG_241]}, + {242, "singlesweep_cwbl", + "A radial hand sweeps counter-clockwise from the lower-left corner.", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_242] }, - { 243, "singlesweep_cwbr", - "A radial hand sweeps clockwise from the lower-right corner", + &wipe_config[WIPE_CONFIG_242]}, + {243, "singlesweep_cwbr", + "A radial hand sweeps clockwise from the lower-right corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_243] }, - { 244, "singlesweep_cwtr", - "A radial hand sweeps counter-clockwise from the upper-right corner", + &wipe_config[WIPE_CONFIG_243]}, + {244, "singlesweep_cwtr", + "A radial hand sweeps counter-clockwise from the upper-right corner", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_244] }, - { 245, "doublesweep_pdtl", - "Two radial hands attached at the upper-left and lower-right corners sweep down and up", + &wipe_config[WIPE_CONFIG_244]}, + {245, "doublesweep_pdtl", + "Two radial hands attached at the upper-left and lower-right corners sweep down and up", gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_245] }, - { 246, "doublesweep_pdbl", - "Two radial hands attached at the lower-left and upper-right corners sweep down and up", + &wipe_config[WIPE_CONFIG_245]}, + {246, "doublesweep_pdbl", + "Two radial hands attached at the lower-left and upper-right corners sweep down and up", gst_wipe_triangles_clock_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_246] }, - { 251, "saloondoor_t", - "Two radial hands attached at the upper-left and upper-right corners sweep down", + &wipe_config[WIPE_CONFIG_246]}, + {251, "saloondoor_t", + "Two radial hands attached at the upper-left and upper-right corners sweep down", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_251] }, - { 252, "saloondoor_l", - "Two radial hands attached at the upper-left and lower-left corners sweep to the right", + &wipe_config[WIPE_CONFIG_251]}, + {252, "saloondoor_l", + "Two radial hands attached at the upper-left and lower-left corners sweep to the right", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_252] }, - { 253, "saloondoor_b", - "Two radial hands attached at the lower-left and lower-right corners sweep up", + &wipe_config[WIPE_CONFIG_252]}, + {253, "saloondoor_b", + "Two radial hands attached at the lower-left and lower-right corners sweep up", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_253] }, - { 254, "saloondoor_r", - "Two radial hands attached at the upper-right and lower-right corners sweep to the left", + &wipe_config[WIPE_CONFIG_253]}, + {254, "saloondoor_r", + "Two radial hands attached at the upper-right and lower-right corners sweep to the left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_254] }, - { 261, "windshield_r", - "Two radial hands attached at the midpoints of the top and bottom halves sweep from right to left", + &wipe_config[WIPE_CONFIG_254]}, + {261, "windshield_r", + "Two radial hands attached at the midpoints of the top and bottom halves sweep from right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_261] }, - { 262, "windshield_u", - "Two radial hands attached at the midpoints of the left and right halves sweep from top to bottom", + &wipe_config[WIPE_CONFIG_261]}, + {262, "windshield_u", + "Two radial hands attached at the midpoints of the left and right halves sweep from top to bottom", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_262] }, - { 263, "windshield_v", - "Two sets of radial hands attached at the midpoints of the top and bottom halves sweep from top to bottom and bottom to top", + &wipe_config[WIPE_CONFIG_262]}, + {263, "windshield_v", + "Two sets of radial hands attached at the midpoints of the top and bottom halves sweep from top to bottom and bottom to top", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_263] }, - { 264, "windshield_h", - "Two sets of radial hands attached at the midpoints of the left and right halves sweep from left to right and right to left", + &wipe_config[WIPE_CONFIG_263]}, + {264, "windshield_h", + "Two sets of radial hands attached at the midpoints of the left and right halves sweep from left to right and right to left", gst_wipe_boxes_draw, _gst_mask_default_destroy, - &wipe_config[WIPE_CONFIG_264] }, - { 0, NULL, NULL, NULL } + &wipe_config[WIPE_CONFIG_264]}, + {0, NULL, NULL, NULL} }; void @@ -931,4 +920,3 @@ _gst_barboxwipes_register (void) i++; } } - diff --git a/gst/smpte/gstmask.c b/gst/smpte/gstmask.c index 13c79b34..0e2cf01f 100644 --- a/gst/smpte/gstmask.c +++ b/gst/smpte/gstmask.c @@ -35,25 +35,25 @@ _gst_mask_init (void) } static gint -gst_mask_compare (GstMaskDefinition *def1, - GstMaskDefinition *def2) +gst_mask_compare (GstMaskDefinition * def1, GstMaskDefinition * def2) { return (def1->type - def2->type); } void -_gst_mask_register (GstMaskDefinition *definition) +_gst_mask_register (GstMaskDefinition * definition) { - masks = g_list_insert_sorted (masks, definition, (GCompareFunc) gst_mask_compare); + masks = + g_list_insert_sorted (masks, definition, (GCompareFunc) gst_mask_compare); } -const GList* +const GList * gst_mask_get_definitions (void) { return masks; } -static GstMaskDefinition* +static GstMaskDefinition * gst_mask_find_definition (gint type) { GList *walk = masks; @@ -63,13 +63,13 @@ gst_mask_find_definition (gint type) if (def->type == type) return def; - + walk = g_list_next (walk); } return NULL; } -GstMask* +GstMask * gst_mask_factory_new (gint type, gint bpp, gint width, gint height) { GstMaskDefinition *definition; @@ -95,14 +95,14 @@ gst_mask_factory_new (gint type, gint bpp, gint width, gint height) } void -_gst_mask_default_destroy (GstMask *mask) +_gst_mask_default_destroy (GstMask * mask) { g_free (mask->data); g_free (mask); } void -gst_mask_destroy (GstMask *mask) +gst_mask_destroy (GstMask * mask) { if (mask->destroy_func) mask->destroy_func (mask); diff --git a/gst/smpte/gstmask.h b/gst/smpte/gstmask.h index 6131c624..6f82078f 100644 --- a/gst/smpte/gstmask.h +++ b/gst/smpte/gstmask.h @@ -27,37 +27,39 @@ typedef struct _GstMask GstMask; typedef struct _GstMaskDefinition GstMaskDefinition; -typedef void (*GstMaskDrawFunc) (GstMask *mask); -typedef void (*GstMaskDestroyFunc) (GstMask *mask); - -struct _GstMaskDefinition { - gint type; - gchar *short_name; - gchar *long_name; - GstMaskDrawFunc draw_func; - GstMaskDestroyFunc destroy_func; - gpointer user_data; +typedef void (*GstMaskDrawFunc) (GstMask * mask); +typedef void (*GstMaskDestroyFunc) (GstMask * mask); + +struct _GstMaskDefinition +{ + gint type; + gchar *short_name; + gchar *long_name; + GstMaskDrawFunc draw_func; + GstMaskDestroyFunc destroy_func; + gpointer user_data; }; -struct _GstMask { - gint type; - guint32 *data; - gpointer user_data; +struct _GstMask +{ + gint type; + guint32 *data; + gpointer user_data; - gint width; - gint height; - gint bpp; + gint width; + gint height; + gint bpp; - GstMaskDestroyFunc destroy_func; + GstMaskDestroyFunc destroy_func; }; -void _gst_mask_init (void); -void _gst_mask_register (GstMaskDefinition *definition); +void _gst_mask_init (void); +void _gst_mask_register (GstMaskDefinition * definition); -void _gst_mask_default_destroy (GstMask *mask); +void _gst_mask_default_destroy (GstMask * mask); -const GList* gst_mask_get_definitions (void); -GstMask* gst_mask_factory_new (gint type, gint bpp, gint width, gint height); -void gst_mask_destroy (GstMask *mask); +const GList *gst_mask_get_definitions (void); +GstMask *gst_mask_factory_new (gint type, gint bpp, gint width, gint height); +void gst_mask_destroy (GstMask * mask); #endif /* __GST_MASK_H__ */ diff --git a/gst/smpte/gstsmpte.c b/gst/smpte/gstsmpte.c index 5899a9a1..91b91d9d 100644 --- a/gst/smpte/gstsmpte.c +++ b/gst/smpte/gstsmpte.c @@ -34,43 +34,39 @@ static GstElementDetails smpte_details = { }; static GstStaticPadTemplate gst_smpte_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); static GstStaticPadTemplate gst_smpte_sink1_template = -GST_STATIC_PAD_TEMPLATE ( - "sink1", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("sink1", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); static GstStaticPadTemplate gst_smpte_sink2_template = -GST_STATIC_PAD_TEMPLATE ( - "sink2", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_YUV("I420") - ) -); +GST_STATIC_PAD_TEMPLATE ("sink2", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") + ) + ); /* SMPTE signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_TYPE, ARG_BORDER, @@ -80,48 +76,51 @@ enum { #define GST_TYPE_SMPTE_TRANSITION_TYPE (gst_smpte_transition_type_get_type()) static GType -gst_smpte_transition_type_get_type (void) +gst_smpte_transition_type_get_type (void) { static GType smpte_transition_type = 0; GEnumValue *smpte_transitions; if (!smpte_transition_type) { const GList *definitions; - gint i=0; + gint i = 0; definitions = gst_mask_get_definitions (); - smpte_transitions = g_new0 (GEnumValue, g_list_length ((GList *)definitions)+1); + smpte_transitions = + g_new0 (GEnumValue, g_list_length ((GList *) definitions) + 1); while (definitions) { GstMaskDefinition *definition = (GstMaskDefinition *) definitions->data; + definitions = g_list_next (definitions); smpte_transitions[i].value = definition->type; smpte_transitions[i].value_name = definition->short_name; smpte_transitions[i].value_nick = definition->long_name; - + i++; } - smpte_transition_type = - g_enum_register_static ("GstSMPTETransitionType", smpte_transitions); + smpte_transition_type = + g_enum_register_static ("GstSMPTETransitionType", smpte_transitions); } return smpte_transition_type; -} +} -static void gst_smpte_class_init (GstSMPTEClass *klass); -static void gst_smpte_base_init (GstSMPTEClass *klass); -static void gst_smpte_init (GstSMPTE *smpte); +static void gst_smpte_class_init (GstSMPTEClass * klass); +static void gst_smpte_base_init (GstSMPTEClass * klass); +static void gst_smpte_init (GstSMPTE * smpte); -static void gst_smpte_loop (GstElement *element); +static void gst_smpte_loop (GstElement * element); -static void gst_smpte_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_smpte_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_smpte_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_smpte_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstElementClass *parent_class = NULL; + /*static guint gst_smpte_signals[LAST_SIGNAL] = { 0 }; */ static GType @@ -131,45 +130,46 @@ gst_smpte_get_type (void) if (!smpte_type) { static const GTypeInfo smpte_info = { - sizeof(GstSMPTEClass), - (GBaseInitFunc)gst_smpte_base_init, + sizeof (GstSMPTEClass), + (GBaseInitFunc) gst_smpte_base_init, NULL, - (GClassInitFunc)gst_smpte_class_init, + (GClassInitFunc) gst_smpte_class_init, NULL, NULL, - sizeof(GstSMPTE), + sizeof (GstSMPTE), 0, - (GInstanceInitFunc)gst_smpte_init, + (GInstanceInitFunc) gst_smpte_init, }; - smpte_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0); + smpte_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSMPTE", &smpte_info, 0); } return smpte_type; } static void -gst_smpte_base_init (GstSMPTEClass *klass) +gst_smpte_base_init (GstSMPTEClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_smpte_sink1_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_smpte_sink2_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get(&gst_smpte_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smpte_sink1_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smpte_sink2_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_smpte_src_template)); gst_element_class_set_details (element_class, &smpte_details); } static void -gst_smpte_class_init (GstSMPTEClass *klass) +gst_smpte_class_init (GstSMPTEClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gobject_class->set_property = gst_smpte_set_property; gobject_class->get_property = gst_smpte_get_property; @@ -177,39 +177,42 @@ gst_smpte_class_init (GstSMPTEClass *klass) _gst_mask_init (); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, - g_param_spec_enum ("type", "Type", "The type of transition to use", - GST_TYPE_SMPTE_TRANSITION_TYPE, 1, G_PARAM_READWRITE)); + g_param_spec_enum ("type", "Type", "The type of transition to use", + GST_TYPE_SMPTE_TRANSITION_TYPE, 1, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FPS, - g_param_spec_float ("fps", "FPS", "Frames per second if no input files are given", - 0., G_MAXFLOAT, 25., G_PARAM_READWRITE)); + g_param_spec_float ("fps", "FPS", + "Frames per second if no input files are given", 0., G_MAXFLOAT, 25., + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BORDER, - g_param_spec_int ("border", "Border", "The border width of the transition", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("border", "Border", + "The border width of the transition", 0, G_MAXINT, 0, + G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DEPTH, - g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", - 1, 24, 16, G_PARAM_READWRITE)); + g_param_spec_int ("depth", "Depth", "Depth of the mask in bits", 1, 24, + 16, G_PARAM_READWRITE)); } /* wht yel cya grn mag red blu blk -I Q */ -static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 }; -static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; -static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; +static int y_colors[] = { 255, 226, 179, 150, 105, 76, 29, 16, 16, 0 }; +static int u_colors[] = { 128, 0, 170, 46, 212, 85, 255, 128, 0, 128 }; +static int v_colors[] = { 128, 155, 0, 21, 235, 255, 107, 128, 128, 255 }; static void -fill_i420 (guint8 *data, gint width, gint height, gint color) +fill_i420 (guint8 * data, gint width, gint height, gint color) { gint size = width * height, size4 = size >> 2; guint8 *yp = data; guint8 *up = data + size; guint8 *vp = data + size + size4; - + memset (yp, y_colors[color], size); memset (up, u_colors[color], size4); memset (vp, v_colors[color], size4); } static gboolean -gst_smpte_update_mask (GstSMPTE *smpte, gint type, gint depth, gint width, gint height) +gst_smpte_update_mask (GstSMPTE * smpte, gint type, gint depth, gint width, + gint height) { GstMask *newmask; @@ -230,7 +233,7 @@ gst_smpte_update_mask (GstSMPTE *smpte, gint type, gint depth, gint width, gint } static gboolean -gst_smpte_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_smpte_sinkconnect (GstPad * pad, const GstCaps * caps) { GstSMPTE *smpte; GstStructure *structure; @@ -243,29 +246,34 @@ gst_smpte_sinkconnect (GstPad *pad, const GstCaps *caps) ret = gst_structure_get_int (structure, "width", &smpte->width); ret &= gst_structure_get_int (structure, "height", &smpte->height); ret &= gst_structure_get_double (structure, "framerate", &smpte->fps); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; - gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, smpte->height); + gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, + smpte->height); /* forward to the next plugin */ - return gst_pad_try_set_caps(smpte->srcpad, caps); + return gst_pad_try_set_caps (smpte->srcpad, caps); } -static void -gst_smpte_init (GstSMPTE *smpte) +static void +gst_smpte_init (GstSMPTE * smpte) { - smpte->sinkpad1 = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_smpte_sink1_template), "sink1"); + smpte->sinkpad1 = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smpte_sink1_template), "sink1"); gst_pad_set_link_function (smpte->sinkpad1, gst_smpte_sinkconnect); gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad1); - smpte->sinkpad2 = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_smpte_sink2_template), "sink2"); + smpte->sinkpad2 = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smpte_sink2_template), "sink2"); gst_pad_set_link_function (smpte->sinkpad2, gst_smpte_sinkconnect); gst_element_add_pad (GST_ELEMENT (smpte), smpte->sinkpad2); - smpte->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get(&gst_smpte_src_template), "src"); + smpte->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_smpte_src_template), "src"); gst_element_add_pad (GST_ELEMENT (smpte), smpte->srcpad); gst_element_set_loop_function (GST_ELEMENT (smpte), gst_smpte_loop); @@ -278,48 +286,53 @@ gst_smpte_init (GstSMPTE *smpte) smpte->type = 1; smpte->border = 0; smpte->depth = 16; - gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, smpte->height); + gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, + smpte->height); } static void -gst_smpte_blend_i420 (guint8 *in1, guint8 *in2, guint8 *out, GstMask *mask, - gint width, gint height, gint border, gint pos) +gst_smpte_blend_i420 (guint8 * in1, guint8 * in2, guint8 * out, GstMask * mask, + gint width, gint height, gint border, gint pos) { guint32 *maskp; gint value; gint i, j; gint min, max; - guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; + guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv; gint lumsize = width * height; gint chromsize = lumsize >> 2; - if (border == 0) border++; + if (border == 0) + border++; - min = pos - border; + min = pos - border; max = pos; - in1u = in1 + lumsize; in1v = in1u + chromsize; - in2u = in2 + lumsize; in2v = in2u + chromsize; - outu = out + lumsize; outv = outu + chromsize; - + in1u = in1 + lumsize; + in1v = in1u + chromsize; + in2u = in2 + lumsize; + in2v = in2u + chromsize; + outu = out + lumsize; + outv = outu + chromsize; + maskp = mask->data; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { value = *maskp++; value = ((CLAMP (value, min, max) - min) << 8) / border; - + *out++ = ((*in1++ * value) + (*in2++ * (256 - value))) >> 8; if (!(i & 1) && !(j & 1)) { - *outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8; - *outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8; + *outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8; + *outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8; } } } } static void -gst_smpte_loop (GstElement *element) +gst_smpte_loop (GstElement * element) { GstSMPTE *smpte; GstBuffer *outbuf; @@ -335,8 +348,7 @@ gst_smpte_loop (GstElement *element) if (GST_IS_EVENT (in1)) { gst_pad_push (smpte->srcpad, GST_DATA (in1)); in1 = NULL; - } - else + } else ts = GST_BUFFER_TIMESTAMP (in1); } if (GST_PAD_IS_USABLE (smpte->sinkpad2) && in2 == NULL) { @@ -344,8 +356,7 @@ gst_smpte_loop (GstElement *element) if (GST_IS_EVENT (in2)) { gst_pad_push (smpte->srcpad, GST_DATA (in2)); in2 = NULL; - } - else + } else ts = GST_BUFFER_TIMESTAMP (in2); } @@ -358,33 +369,33 @@ gst_smpte_loop (GstElement *element) fill_i420 (GST_BUFFER_DATA (in2), smpte->width, smpte->height, 0); } - if (smpte->position < smpte->duration) { + if (smpte->position < smpte->duration) { outbuf = gst_buffer_new_and_alloc (smpte->width * smpte->height * 3); if (!GST_PAD_CAPS (smpte->srcpad)) { GstCaps *caps; - caps = gst_caps_copy (gst_static_caps_get ( - &gst_smpte_src_template.static_caps)); - gst_caps_set_simple (caps, - "width", G_TYPE_INT, smpte->width, - "height", G_TYPE_INT, smpte->height, - "framerate", G_TYPE_DOUBLE, smpte->fps, NULL); + + caps = + gst_caps_copy (gst_static_caps_get (&gst_smpte_src_template. + static_caps)); + gst_caps_set_simple (caps, "width", G_TYPE_INT, smpte->width, "height", + G_TYPE_INT, smpte->height, "framerate", G_TYPE_DOUBLE, smpte->fps, + NULL); if (!gst_pad_try_set_caps (smpte->srcpad, caps)) { - GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), (NULL)); - return; + GST_ELEMENT_ERROR (smpte, CORE, NEGOTIATION, (NULL), (NULL)); + return; } } - gst_smpte_blend_i420 (GST_BUFFER_DATA (in1), - GST_BUFFER_DATA (in2), - GST_BUFFER_DATA (outbuf), - smpte->mask, smpte->width, smpte->height, - smpte->border, - ((1 << smpte->depth) + smpte->border) * - smpte->position / smpte->duration); - } - else { + gst_smpte_blend_i420 (GST_BUFFER_DATA (in1), + GST_BUFFER_DATA (in2), + GST_BUFFER_DATA (outbuf), + smpte->mask, smpte->width, smpte->height, + smpte->border, + ((1 << smpte->depth) + smpte->border) * + smpte->position / smpte->duration); + } else { outbuf = in2; gst_buffer_ref (in2); } @@ -401,20 +412,20 @@ gst_smpte_loop (GstElement *element) } static void -gst_smpte_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_smpte_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSMPTE *smpte; - smpte = GST_SMPTE(object); + smpte = GST_SMPTE (object); switch (prop_id) { case ARG_TYPE: { gint type = g_value_get_enum (value); - gst_smpte_update_mask (smpte, type, smpte->depth, - smpte->width, smpte->height); + gst_smpte_update_mask (smpte, type, smpte->depth, + smpte->width, smpte->height); break; } case ARG_BORDER: @@ -427,8 +438,8 @@ gst_smpte_set_property (GObject *object, guint prop_id, { gint depth = g_value_get_int (value); - gst_smpte_update_mask (smpte, smpte->type, depth, - smpte->width, smpte->height); + gst_smpte_update_mask (smpte, smpte->type, depth, + smpte->width, smpte->height); break; } default: @@ -438,12 +449,12 @@ gst_smpte_set_property (GObject *object, guint prop_id, } static void -gst_smpte_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_smpte_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstSMPTE *smpte; - smpte = GST_SMPTE(object); + smpte = GST_SMPTE (object); switch (prop_id) { case ARG_TYPE: @@ -468,20 +479,13 @@ gst_smpte_get_property (GObject *object, guint prop_id, static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "smpte", - GST_RANK_NONE, GST_TYPE_SMPTE); + return gst_element_register (plugin, "smpte", GST_RANK_NONE, GST_TYPE_SMPTE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "smpte", - "Apply the standard SMPTE transitions on video images", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "smpte", + "Apply the standard SMPTE transitions on video images", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/smpte/gstsmpte.h b/gst/smpte/gstsmpte.h index 40844209..762eebf8 100644 --- a/gst/smpte/gstsmpte.h +++ b/gst/smpte/gstsmpte.h @@ -38,28 +38,28 @@ typedef struct _GstSMPTE GstSMPTE; typedef struct _GstSMPTEClass GstSMPTEClass; -struct _GstSMPTE { - GstElement element; +struct _GstSMPTE +{ + GstElement element; - gint format; - gint width; - gint height; - gdouble fps; + gint format; + gint width; + gint height; + gdouble fps; - gint duration; - gint position; + gint duration; + gint position; - GstPad *srcpad, - *sinkpad1, - *sinkpad2; + GstPad *srcpad, *sinkpad1, *sinkpad2; - gint type; - gint border; - gint depth; - GstMask *mask; + gint type; + gint border; + gint depth; + GstMask *mask; }; -struct _GstSMPTEClass { +struct _GstSMPTEClass +{ GstElementClass parent_class; }; diff --git a/gst/smpte/paint.c b/gst/smpte/paint.c index dae3c6f1..fdff77e5 100644 --- a/gst/smpte/paint.c +++ b/gst/smpte/paint.c @@ -26,21 +26,20 @@ #include "paint.h" void -gst_smpte_paint_vbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1) +gst_smpte_paint_vbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) { gint i, j; gint width, height; width = x1 - x0; height = y1 - y0; - + g_assert (width > 0); g_assert (height > 0); dest = dest + y0 * stride + x0; - + for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { dest[j] = (c1 * j + c0 * (width - j)) / width; @@ -50,16 +49,15 @@ gst_smpte_paint_vbox (guint32 *dest, gint stride, } void -gst_smpte_paint_hbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1) +gst_smpte_paint_hbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1) { gint i, j; gint width, height; width = x1 - x0; height = y1 - y0; - + g_assert (width > 0); g_assert (height > 0); @@ -68,7 +66,8 @@ gst_smpte_paint_hbox (guint32 *dest, gint stride, dest = dest + y0 * stride + x0; for (i = 0; i < height; i++) { - guint32 value = (c1 * i + c0 * (height - i)) / height; + guint32 value = (c1 * i + c0 * (height - i)) / height; + for (j = 0; j < width; j++) { dest[j] = value; } @@ -148,29 +147,35 @@ G_STMT_START { \ } G_STMT_END void -gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) +gst_smpte_paint_triangle_linear (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gint sdxl, sdyl, sdcl, dxlabs, dylabs, dclabs, xrl, yrl, crl, pxl, pyl, pcl; gint sdxr, sdyr, sdcr, dxrabs, dyrabs, dcrabs, xrr, yrr, crr, pxr, pyr, pcr; gint i, j, k, seg_start, seg_end; - if (y0 > y1) { SWAP_INT (x0, x1); SWAP_INT (y0, y1); SWAP_INT (c0, c1); } - if (y0 > y2) { SWAP_INT (x0, x2); SWAP_INT (y0, y2); SWAP_INT (c0, c2); } - if (y1 > y2) { SWAP_INT (x1, x2); SWAP_INT (y1, y2); SWAP_INT (c1, c2); } - - PREPARE_3D_LINE (x0,y0,c0,x2,y2,c2, - dxlabs,dylabs,dclabs, - sdxl, sdyl,sdcl, - xrl,yrl,crl, - pxl,pyl,pcl); - - PREPARE_3D_LINE (x0,y0,c0,x1,y1,c1, - dxrabs,dyrabs,dcrabs, - sdxr, sdyr,sdcr, - xrr,yrr,crr, - pxr,pyr,pcr); + if (y0 > y1) { + SWAP_INT (x0, x1); + SWAP_INT (y0, y1); + SWAP_INT (c0, c1); + } + if (y0 > y2) { + SWAP_INT (x0, x2); + SWAP_INT (y0, y2); + SWAP_INT (c0, c2); + } + if (y1 > y2) { + SWAP_INT (x1, x2); + SWAP_INT (y1, y2); + SWAP_INT (c1, c2); + } + + PREPARE_3D_LINE (x0, y0, c0, x2, y2, c2, + dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, xrl, yrl, crl, pxl, pyl, pcl); + + PREPARE_3D_LINE (x0, y0, c0, x1, y1, c1, + dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); dest = dest + stride * y0; seg_start = y0; @@ -183,37 +188,32 @@ gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, gint sign = SIGN (e - s); e += sign; - for (j = s; j != e; j+=sign) { - dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); + for (j = s; j != e; j += sign) { + dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); } while (pyr == i) { - STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, - xrr, yrr, crr, pxr, pyr, pcr); + STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, + xrr, yrr, crr, pxr, pyr, pcr); } while (pyl == i) { - STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, - xrl, yrl, crl, pxl, pyl, pcl); + STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, + xrl, yrl, crl, pxl, pyl, pcl); } dest += stride; } - PREPARE_3D_LINE (x1,y1,c1,x2,y2,c2, - dxrabs,dyrabs,dcrabs, - sdxr, sdyr,sdcr, - xrr,yrr,crr, - pxr,pyr,pcr); + PREPARE_3D_LINE (x1, y1, c1, x2, y2, c2, + dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, xrr, yrr, crr, pxr, pyr, pcr); seg_start = y1; seg_end = y2; } } -static void -draw_bresenham_line (guint32 *dest, gint stride, - gint x0, gint y0, - gint x1, gint y1, - guint32 col) +static void +draw_bresenham_line (guint32 * dest, gint stride, + gint x0, gint y0, gint x1, gint y1, guint32 col) { gint dx = abs (x1 - x0); gint dy = abs (y1 - y0); @@ -224,13 +224,12 @@ draw_bresenham_line (guint32 *dest, gint stride, x_incr = SIGN (x1 - x0); y_incr = SIGN (y1 - y0) * stride; - - if (dx >= dy) { + + if (dx >= dy) { dpr = dy << 1; i = dx; indep = x_incr; - } - else { + } else { dpr = dx << 1; i = dy; indep = y_incr; @@ -242,7 +241,7 @@ draw_bresenham_line (guint32 *dest, gint stride, for (; i >= 0; i--) { *dest = col; - if (P > 0) { + if (P > 0) { dest += x_incr; dest += y_incr; P += dpru; @@ -254,10 +253,9 @@ draw_bresenham_line (guint32 *dest, gint stride, } void -gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2) +gst_smpte_paint_triangle_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gint i; gint sign; @@ -265,11 +263,11 @@ gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, gfloat len1; angle_s = 0.0; - angle_e = acos (((x1-x0) * (x2-x0) + (y1-y0) * (y2-y0))/ - (sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) * - sqrt ((x2-x0) * (x2-x0) + (y2-y0) * (y2-y0)))); + angle_e = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0)) / + (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * + sqrt ((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0)))); - len1 = sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)); + len1 = sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); if (x1 == x2) { sign = SIGN (y2 - y1); @@ -278,65 +276,57 @@ gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, if (y1 == i) angle = 0; else - angle = acos (((x1-x0) * (x2-x0) + (y1-y0) * (i-y0)) / - (len1 * sqrt ((x1-x0) * (x1-x0) + (i-y0) * (i-y0)))) / angle_e; + angle = acos (((x1 - x0) * (x2 - x0) + (y1 - y0) * (i - y0)) / + (len1 * sqrt ((x1 - x0) * (x1 - x0) + (i - y0) * (i - + y0)))) / angle_e; draw_bresenham_line (dest, stride, - x0, y0, x1, i, - (c2 * angle + c1 * (1.0-angle))); + x0, y0, x1, i, (c2 * angle + c1 * (1.0 - angle))); } - } - else if (y1 == y2) { + } else if (y1 == y2) { sign = SIGN (x2 - x1); for (i = x1; i != (x2 + sign); i += sign) { if (x1 == i) angle = 0; else - angle = acos (((x1-x0) * (i-x0) + (y1-y0) * (y2-y0)) / - (len1 * sqrt ((i-x0) * (i-x0) + (y2-y0) * (y2-y0)))) / angle_e; + angle = acos (((x1 - x0) * (i - x0) + (y1 - y0) * (y2 - y0)) / + (len1 * sqrt ((i - x0) * (i - x0) + (y2 - y0) * (y2 - + y0)))) / angle_e; draw_bresenham_line (dest, stride, - x0, y0, i, y1, - (c2 * angle + c1 * (1.0-angle))); + x0, y0, i, y1, (c2 * angle + c1 * (1.0 - angle))); } } } void -gst_smpte_paint_box_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2) +gst_smpte_paint_box_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) { gfloat angle_m, col_m; gint xv, yv; - if (x1 == x0) { + if (x1 == x0) { xv = x2; yv = y1; } else if (y1 == y0) { xv = x1; yv = y2; - } - else { + } else { g_warning ("paint box clock: not supported"); return; } - angle_m = 2 * acos (((x1-x0) * (xv-x0) + (y1-y0) * (yv-y0))/ - (sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) * - sqrt ((xv-x0) * (xv-x0) + (yv-y0) * (yv-y0)))) / M_PI; - - col_m = c2 * angle_m + c1 * (1.0-angle_m); + angle_m = 2 * acos (((x1 - x0) * (xv - x0) + (y1 - y0) * (yv - y0)) / + (sqrt ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) * + sqrt ((xv - x0) * (xv - x0) + (yv - y0) * (yv - y0)))) / M_PI; + + col_m = c2 * angle_m + c1 * (1.0 - angle_m); gst_smpte_paint_triangle_clock (dest, stride, - x0, y0, c0, - x1, y1, c1, - xv, yv, col_m); + x0, y0, c0, x1, y1, c1, xv, yv, col_m); gst_smpte_paint_triangle_clock (dest, stride, - x0, y0, c0, - xv, yv, col_m, - x2, y2, c2); + x0, y0, c0, xv, yv, col_m, x2, y2, c2); } - diff --git a/gst/smpte/paint.h b/gst/smpte/paint.h index 4c34cf92..aa9fd425 100644 --- a/gst/smpte/paint.h +++ b/gst/smpte/paint.h @@ -22,26 +22,21 @@ #include -void gst_smpte_paint_vbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1); -void gst_smpte_paint_hbox (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1); +void gst_smpte_paint_vbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1); +void gst_smpte_paint_hbox (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, gint x1, gint y1, gint c1); -void gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2); +void gst_smpte_paint_triangle_linear (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); -void gst_smpte_paint_triangle_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2); +void gst_smpte_paint_triangle_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); -void gst_smpte_paint_box_clock (guint32 *dest, gint stride, - gint x0, gint y0, gint c0, - gint x1, gint y1, gint c1, - gint x2, gint y2, gint c2); +void gst_smpte_paint_box_clock (guint32 * dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2); #endif /* __GST_SMPTE_PAINT_H__ */ diff --git a/gst/spectrum/demo-osssrc.c b/gst/spectrum/demo-osssrc.c index 3431ec91..462fcf90 100644 --- a/gst/spectrum/demo-osssrc.c +++ b/gst/spectrum/demo-osssrc.c @@ -3,12 +3,14 @@ extern gboolean _gst_plugin_spew; -void spectrum_chain(GstPad *pad,GstData *_data); -gboolean idle_func(gpointer data); +void spectrum_chain (GstPad * pad, GstData * _data); +gboolean idle_func (gpointer data); GtkWidget *drawingarea; -int main(int argc,char *argv[]) { +int +main (int argc, char *argv[]) +{ GstElement *bin; GstElementFactory *srcfactory; GstElement *src; @@ -20,63 +22,67 @@ int main(int argc,char *argv[]) { _gst_plugin_spew = TRUE; - gst_init(&argc,&argv); - gnome_init("Spectrum","0.0.1",argc,argv); + gst_init (&argc, &argv); + gnome_init ("Spectrum", "0.0.1", argc, argv); - bin = gst_bin_new("bin"); + bin = gst_bin_new ("bin"); - srcfactory = gst_element_factory_find("osssrc"); - spectrumfactory = gst_element_factory_find("gstspectrum"); + srcfactory = gst_element_factory_find ("osssrc"); + spectrumfactory = gst_element_factory_find ("gstspectrum"); - src = gst_element_factory_create(srcfactory,"src"); - gtk_object_set(GTK_OBJECT(src),"bytes_per_read",(gulong)1024,NULL); - spectrum = gst_element_factory_create(spectrumfactory,"spectrum"); - gtk_object_set(GTK_OBJECT(spectrum),"width",256,NULL); + src = gst_element_factory_create (srcfactory, "src"); + gtk_object_set (GTK_OBJECT (src), "bytes_per_read", (gulong) 1024, NULL); + spectrum = gst_element_factory_create (spectrumfactory, "spectrum"); + gtk_object_set (GTK_OBJECT (spectrum), "width", 256, NULL); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(src)); - gst_bin_add(GST_BIN(bin),GST_ELEMENT(spectrum)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (src)); + gst_bin_add (GST_BIN (bin), GST_ELEMENT (spectrum)); - gst_pad_link(gst_element_get_pad(src,"src"), - gst_element_get_pad(spectrum,"sink")); + gst_pad_link (gst_element_get_pad (src, "src"), + gst_element_get_pad (spectrum, "sink")); - spectrumpad = gst_pad_new("sink",GST_PAD_SINK); - gst_pad_set_chain_function(spectrumpad,spectrum_chain); + spectrumpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_pad_set_chain_function (spectrumpad, spectrum_chain); - gst_pad_link(gst_element_get_pad(spectrum,"src"),spectrumpad); + gst_pad_link (gst_element_get_pad (spectrum, "src"), spectrumpad); - appwindow = gnome_app_new("spectrum","Spectrum"); - drawingarea = gtk_drawing_area_new(); - gtk_drawing_area_size(GTK_DRAWING_AREA(drawingarea),256,32); - gnome_app_set_contents(GNOME_APP(appwindow),drawingarea); - gtk_widget_show_all(appwindow); + appwindow = gnome_app_new ("spectrum", "Spectrum"); + drawingarea = gtk_drawing_area_new (); + gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), 256, 32); + gnome_app_set_contents (GNOME_APP (appwindow), drawingarea); + gtk_widget_show_all (appwindow); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_READY); - gst_element_set_state(GST_ELEMENT(bin),GST_STATE_PLAYING); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY); + gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING); - g_idle_add(idle_func,src); + g_idle_add (idle_func, src); - gtk_main(); + gtk_main (); return 0; } -void spectrum_chain(GstPad *pad,GstData *_data) { +void +spectrum_chain (GstPad * pad, GstData * _data) +{ GstBuffer *buf = GST_BUFFER (_data); gint i; guchar *data = buf->data; - gdk_draw_rectangle(drawingarea->window,drawingarea->style->black_gc, - TRUE,0,0,GST_BUFFER_SIZE(buf),25); - for (i=0;iwindow,drawingarea->style->white_gc, - TRUE,i,32-data[i],1,data[i]); + gdk_draw_rectangle (drawingarea->window, drawingarea->style->black_gc, + TRUE, 0, 0, GST_BUFFER_SIZE (buf), 25); + for (i = 0; i < GST_BUFFER_SIZE (buf); i++) { + gdk_draw_rectangle (drawingarea->window, drawingarea->style->white_gc, + TRUE, i, 32 - data[i], 1, data[i]); } - gst_buffer_unref(buf); + gst_buffer_unref (buf); } -gboolean idle_func(gpointer data) { +gboolean +idle_func (gpointer data) +{ /*gst_src_push(GST_SRC(data)); */ return TRUE; } diff --git a/gst/spectrum/fix_fft.c b/gst/spectrum/fix_fft.c index a5dd658f..db6c3a82 100644 --- a/gst/spectrum/fix_fft.c +++ b/gst/spectrum/fix_fft.c @@ -67,8 +67,8 @@ extern fixed gst_spectrum_Sinewave[N_WAVE]; /* placed at end of this file for clarity */ extern fixed gst_spectrum_Loudampl[N_LOUD]; -static int gst_spectrum_db_from_ampl(fixed re, fixed im); -static fixed gst_spectrum_fix_mpy(fixed a, fixed b); +static int gst_spectrum_db_from_ampl (fixed re, fixed im); +static fixed gst_spectrum_fix_mpy (fixed a, fixed b); /* fix_fft() - perform fast Fourier transform. @@ -78,127 +78,119 @@ static fixed gst_spectrum_fix_mpy(fixed a, fixed b); size of data = 2**m set inverse to 0=dft, 1=idft */ -int gst_spectrum_fix_fft(fixed fr[], fixed fi[], int m, int inverse) { - int mr, nn, i, j, l, k, istep, n, scale, shift; - fixed qr, qi, tr, ti, wr, wi; - - n = 1 << m; - - if (n > N_WAVE) - return -1; - - mr = 0; - nn = n - 1; - scale = 0; - - /* decimation in time - re-order data */ - for (m = 1; m <= nn; ++m) - { - l = n; - do - { - l >>= 1; - } - while (mr + l > nn); - mr = (mr & (l - 1)) + l; - - if (mr <= m) - continue; - tr = fr[m]; - fr[m] = fr[mr]; - fr[mr] = tr; - ti = fi[m]; - fi[m] = fi[mr]; - fi[mr] = ti; +int +gst_spectrum_fix_fft (fixed fr[], fixed fi[], int m, int inverse) +{ + int mr, nn, i, j, l, k, istep, n, scale, shift; + fixed qr, qi, tr, ti, wr, wi; + + n = 1 << m; + + if (n > N_WAVE) + return -1; + + mr = 0; + nn = n - 1; + scale = 0; + + /* decimation in time - re-order data */ + for (m = 1; m <= nn; ++m) { + l = n; + do { + l >>= 1; + } + while (mr + l > nn); + mr = (mr & (l - 1)) + l; + + if (mr <= m) + continue; + tr = fr[m]; + fr[m] = fr[mr]; + fr[mr] = tr; + ti = fi[m]; + fi[m] = fi[mr]; + fi[mr] = ti; + } + + l = 1; + k = LOG2_N_WAVE - 1; + while (l < n) { + if (inverse) { + /* variable scaling, depending upon data */ + shift = 0; + for (i = 0; i < n; ++i) { + j = fr[i]; + if (j < 0) + j = -j; + m = fi[i]; + if (m < 0) + m = -m; + if (j > 16383 || m > 16383) { + shift = 1; + break; } - - l = 1; - k = LOG2_N_WAVE - 1; - while (l < n) - { - if (inverse) - { - /* variable scaling, depending upon data */ - shift = 0; - for (i = 0; i < n; ++i) - { - j = fr[i]; - if (j < 0) - j = -j; - m = fi[i]; - if (m < 0) - m = -m; - if (j > 16383 || m > 16383) - { - shift = 1; - break; - } - } - if (shift) - ++scale; - } - else - { - /* fixed scaling, for proper normalization - - there will be log2(n) passes, so this - results in an overall factor of 1/n, - distributed to maximize arithmetic accuracy. */ - shift = 1; - } - /* it may not be obvious, but the shift will be performed - on each data point exactly once, during this pass. */ - istep = l << 1; - for (m = 0; m < l; ++m) - { - j = m << k; - /* 0 <= j < N_WAVE/2 */ - wr = gst_spectrum_Sinewave[j + N_WAVE / 4]; - wi = -gst_spectrum_Sinewave[j]; - if (inverse) - wi = -wi; - if (shift) - { - wr >>= 1; - wi >>= 1; - } - for (i = m; i < n; i += istep) - { - j = i + l; - tr = gst_spectrum_fix_mpy(wr, fr[j]) - - gst_spectrum_fix_mpy(wi, fi[j]); - ti = gst_spectrum_fix_mpy(wr, fi[j]) + - gst_spectrum_fix_mpy(wi, fr[j]); - qr = fr[i]; - qi = fi[i]; - if (shift) - { - qr >>= 1; - qi >>= 1; - } - fr[j] = qr - tr; - fi[j] = qi - ti; - fr[i] = qr + tr; - fi[i] = qi + ti; - } - } - --k; - l = istep; + } + if (shift) + ++scale; + } else { + /* fixed scaling, for proper normalization - + there will be log2(n) passes, so this + results in an overall factor of 1/n, + distributed to maximize arithmetic accuracy. */ + shift = 1; + } + /* it may not be obvious, but the shift will be performed + on each data point exactly once, during this pass. */ + istep = l << 1; + for (m = 0; m < l; ++m) { + j = m << k; + /* 0 <= j < N_WAVE/2 */ + wr = gst_spectrum_Sinewave[j + N_WAVE / 4]; + wi = -gst_spectrum_Sinewave[j]; + if (inverse) + wi = -wi; + if (shift) { + wr >>= 1; + wi >>= 1; + } + for (i = m; i < n; i += istep) { + j = i + l; + tr = gst_spectrum_fix_mpy (wr, fr[j]) - + gst_spectrum_fix_mpy (wi, fi[j]); + ti = gst_spectrum_fix_mpy (wr, fi[j]) + + gst_spectrum_fix_mpy (wi, fr[j]); + qr = fr[i]; + qi = fi[i]; + if (shift) { + qr >>= 1; + qi >>= 1; } - - return scale; + fr[j] = qr - tr; + fi[j] = qi - ti; + fr[i] = qr + tr; + fi[i] = qi + ti; + } + } + --k; + l = istep; + } + + return scale; } /* window() - apply a Hanning window */ -void gst_spectrum_window(fixed fr[], int n) { - int i, j, k; - - j = N_WAVE / n; - n >>= 1; - for (i = 0, k = N_WAVE / 4; i < n; ++i, k += j) - FIX_MPY(fr[i], fr[i], 16384 - (gst_spectrum_Sinewave[k] >> 1)); - n <<= 1; - for (k -= j; i < n; ++i, k -= j) - FIX_MPY(fr[i], fr[i], 16384 - (gst_spectrum_Sinewave[k] >> 1)); +void +gst_spectrum_window (fixed fr[], int n) +{ + int i, j, k; + + j = N_WAVE / n; + n >>= 1; + for (i = 0, k = N_WAVE / 4; i < n; ++i, k += j) + FIX_MPY (fr[i], fr[i], 16384 - (gst_spectrum_Sinewave[k] >> 1)); + n <<= 1; + for (k -= j; i < n; ++i, k -= j) + FIX_MPY (fr[i], fr[i], 16384 - (gst_spectrum_Sinewave[k] >> 1)); } /* fix_loud() - compute loudness of freq-vis components. @@ -208,73 +200,81 @@ void gst_spectrum_window(fixed fr[], int n) { was obtained from an inverse FFT, 0 otherwise. loud[] is the loudness, in dB wrt 32767; will be +10 to -N_LOUD. */ -void gst_spectrum_fix_loud(fixed loud[], fixed fr[], fixed fi[], int n, int scale_shift) { - int i, max; - - max = 0; - if (scale_shift > 0) - max = 10; - scale_shift = (scale_shift + 1) * 6; - - for (i = 0; i < n; ++i) - { - loud[i] = gst_spectrum_db_from_ampl(fr[i], fi[i]) + scale_shift; - if (loud[i] > max) - loud[i] = max; - } +void +gst_spectrum_fix_loud (fixed loud[], fixed fr[], fixed fi[], int n, + int scale_shift) +{ + int i, max; + + max = 0; + if (scale_shift > 0) + max = 10; + scale_shift = (scale_shift + 1) * 6; + + for (i = 0; i < n; ++i) { + loud[i] = gst_spectrum_db_from_ampl (fr[i], fi[i]) + scale_shift; + if (loud[i] > max) + loud[i] = max; + } } /* db_from_ampl() - find loudness (in dB) from the complex amplitude. */ -int gst_spectrum_db_from_ampl(fixed re, fixed im) { - static long loud2[N_LOUD] = - {0}; - long v; - int i; - - if (loud2[0] == 0) - { - loud2[0] = (long) gst_spectrum_Loudampl[0] * (long) gst_spectrum_Loudampl[0]; - for (i = 1; i < N_LOUD; ++i) - { - v = (long) gst_spectrum_Loudampl[i] * (long) gst_spectrum_Loudampl[i]; - loud2[i] = v; - loud2[i - 1] = (loud2[i - 1] + v) / 2; - } - } - - v = (long) re *(long) re + (long) im *(long) im; - - for (i = 0; i < N_LOUD; ++i) - if (loud2[i] <= v) - break; - - return (-i); +int +gst_spectrum_db_from_ampl (fixed re, fixed im) +{ + static long loud2[N_LOUD] = { 0 }; + long v; + int i; + + if (loud2[0] == 0) { + loud2[0] = + (long) gst_spectrum_Loudampl[0] * (long) gst_spectrum_Loudampl[0]; + for (i = 1; i < N_LOUD; ++i) { + v = (long) gst_spectrum_Loudampl[i] * (long) gst_spectrum_Loudampl[i]; + loud2[i] = v; + loud2[i - 1] = (loud2[i - 1] + v) / 2; + } + } + + v = (long) re *(long) re + (long) im *(long) im; + + for (i = 0; i < N_LOUD; ++i) + if (loud2[i] <= v) + break; + + return (-i); } /* fix_mpy() - fixed-point multiplication */ -fixed gst_spectrum_fix_mpy(fixed a, fixed b) { - FIX_MPY(a, a, b); - return a; +fixed +gst_spectrum_fix_mpy (fixed a, fixed b) +{ + FIX_MPY (a, a, b); + return a; } /* iscale() - scale an integer value by (numer/denom) */ -int gst_spectrum_iscale(int value, int numer, int denom) { - return (long) value *(long) numer / (long) denom; +int +gst_spectrum_iscale (int value, int numer, int denom) +{ + return (long) value *(long) numer / (long) denom; } /* fix_dot() - dot product of two fixed arrays */ -fixed gst_spectrum_fix_dot(fixed * hpa, fixed * pb, int n) { - fixed *pa = hpa; /* FIXME */ - long sum; - register fixed a, b; +fixed +gst_spectrum_fix_dot (fixed * hpa, fixed * pb, int n) +{ + fixed *pa = hpa; /* FIXME */ + long sum; + register fixed a, b; /* seg = FP_SEG(hpa); off = FP_OFF(hpa); @@ -282,174 +282,169 @@ fixed gst_spectrum_fix_dot(fixed * hpa, fixed * pb, int n) { off &= 0x000F; pa = MK_FP(seg,off); */ - sum = 0L; - while (n--) - { - a = *pa++; - b = *pb++; - FIX_MPY(a, a, b); - sum += a; - } + sum = 0L; + while (n--) { + a = *pa++; + b = *pb++; + FIX_MPY (a, a, b); + sum += a; + } - if (sum > 0x7FFF) - sum = 0x7FFF; - else if (sum < -0x7FFF) - sum = -0x7FFF; + if (sum > 0x7FFF) + sum = 0x7FFF; + else if (sum < -0x7FFF) + sum = -0x7FFF; - return (fixed) sum; + return (fixed) sum; } #if N_WAVE != 1024 ERROR:N_WAVE != 1024 #endif -fixed gst_spectrum_Sinewave[1024] = { - 0, 201, 402, 603, 804, 1005, 1206, 1406, - 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011, - 3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608, - 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195, - 6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766, - 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319, - 9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849, - 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353, - 12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827, - 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268, - 15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672, - 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036, - 18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357, - 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631, - 20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855, - 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027, - 23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143, - 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201, - 25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198, - 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132, - 27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001, - 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802, - 28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534, - 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195, - 30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783, - 30851, 30918, 30984, 31049, - 31113, 31175, 31236, 31297, - 31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735, - 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097, - 32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382, - 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588, - 32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717, - 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766, - 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32736, - 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628, - 32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441, - 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176, - 32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833, - 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413, - 31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918, - 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349, - 30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706, - 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992, - 28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208, - 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355, - 27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437, - 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456, - 25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413, - 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311, - 23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153, - 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942, - 20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680, - 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371, - 18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017, - 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623, - 15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191, - 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724, - 12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227, - 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703, - 9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156, - 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589, - 6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006, - 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411, - 3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808, - 1607, 1406, 1206, 1005, 804, 603, 402, 201, - 0, -201, -402, -603, -804, -1005, -1206, -1406, - -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011, - -3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608, - -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195, - -6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766, - -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319, - -9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849, - -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353, - -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827, - -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268, - -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672, - -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036, - -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357, - -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631, - -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855, - -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027, - -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143, - -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201, - -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198, - -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132, - -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001, - -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802, - -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534, - -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195, - -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783, - -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297, - -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735, - -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097, - -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382, - -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588, - -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717, - -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766, - -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736, - -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628, - -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441, - -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176, - -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833, - -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413, - -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918, - -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349, - -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706, - -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992, - -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208, - -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355, - -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437, - -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456, - -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413, - -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311, - -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153, - -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942, - -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680, - -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371, - -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017, - -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623, - -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191, - -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724, - -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227, - -11038, -10849, -10659, -10469, -10278, -10087, -9895, -9703, - -9511, -9319, -9126, -8932, -8739, -8545, -8351, -8156, - -7961, -7766, -7571, -7375, -7179, -6982, -6786, -6589, - -6392, -6195, -5997, -5799, -5601, -5403, -5205, -5006, - -4807, -4608, -4409, -4210, -4011, -3811, -3611, -3411, - -3211, -3011, -2811, -2610, -2410, -2209, -2009, -1808, - -1607, -1406, -1206, -1005, -804, -603, -402, -201, -}; + fixed gst_spectrum_Sinewave[1024] = { +0, 201, 402, 603, 804, 1005, 1206, 1406, + 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011, + 3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608, + 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195, + 6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766, + 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319, + 9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849, + 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353, + 12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827, + 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268, + 15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672, + 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036, + 18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357, + 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631, + 20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855, + 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027, + 23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143, + 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201, + 25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198, + 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132, + 27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001, + 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802, + 28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534, + 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195, + 30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783, + 30851, 30918, 30984, 31049, + 31113, 31175, 31236, 31297, + 31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735, + 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097, + 32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382, + 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588, + 32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717, + 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766, + 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32736, + 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628, + 32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441, + 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176, + 32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833, + 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413, + 31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918, + 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349, + 30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706, + 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992, + 28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208, + 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355, + 27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437, + 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456, + 25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413, + 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311, + 23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153, + 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942, + 20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680, + 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371, + 18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017, + 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623, + 15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191, + 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724, + 12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227, + 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703, + 9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156, + 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589, + 6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006, + 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411, + 3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808, + 1607, 1406, 1206, 1005, 804, 603, 402, 201, + 0, -201, -402, -603, -804, -1005, -1206, -1406, + -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011, + -3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608, + -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195, + -6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766, + -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319, + -9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849, + -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353, + -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827, + -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268, + -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672, + -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036, + -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357, + -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631, + -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855, + -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027, + -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143, + -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201, + -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198, + -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132, + -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001, + -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802, + -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534, + -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195, + -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783, + -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297, + -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735, + -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097, + -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382, + -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588, + -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717, + -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766, + -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736, + -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628, + -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441, + -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176, + -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833, + -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413, + -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918, + -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349, + -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706, + -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992, + -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208, + -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355, + -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437, + -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456, + -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413, + -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311, + -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153, + -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942, + -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680, + -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371, + -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017, + -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623, + -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191, + -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724, + -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227, + -11038, -10849, -10659, -10469, -10278, -10087, -9895, -9703, + -9511, -9319, -9126, -8932, -8739, -8545, -8351, -8156, + -7961, -7766, -7571, -7375, -7179, -6982, -6786, -6589, + -6392, -6195, -5997, -5799, -5601, -5403, -5205, -5006, + -4807, -4608, -4409, -4210, -4011, -3811, -3611, -3411, + -3211, -3011, -2811, -2610, -2410, -2209, -2009, -1808, + -1607, -1406, -1206, -1005, -804, -603, -402, -201,}; #if N_LOUD != 100 ERROR:N_LOUD != 100 #endif -fixed gst_spectrum_Loudampl[100] = { - 32767, 29203, 26027, 23197, 20674, 18426, 16422, 14636, - 13044, 11626, 10361, 9234, 8230, 7335, 6537, 5826, - 5193, 4628, 4125, 3676, 3276, 2920, 2602, 2319, - 2067, 1842, 1642, 1463, 1304, 1162, 1036, 923, - 823, 733, 653, 582, 519, 462, 412, 367, - 327, 292, 260, 231, 206, 184, 164, 146, - 130, 116, 103, 92, 82, 73, 65, 58, - 51, 46, 41, 36, 32, 29, 26, 23, - 20, 18, 16, 14, 13, 11, 10, 9, - 8, 7, 6, 5, 5, 4, 4, 3, - 3, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -}; + fixed gst_spectrum_Loudampl[100] = { +32767, 29203, 26027, 23197, 20674, 18426, 16422, 14636, + 13044, 11626, 10361, 9234, 8230, 7335, 6537, 5826, + 5193, 4628, 4125, 3676, 3276, 2920, 2602, 2319, + 2067, 1842, 1642, 1463, 1304, 1162, 1036, 923, + 823, 733, 653, 582, 519, 462, 412, 367, + 327, 292, 260, 231, 206, 184, 164, 146, + 130, 116, 103, 92, 82, 73, 65, 58, + 51, 46, 41, 36, 32, 29, 26, 23, + 20, 18, 16, 14, 13, 11, 10, 9, + 8, 7, 6, 5, 5, 4, 4, 3, + 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; diff --git a/gst/spectrum/gstspectrum.c b/gst/spectrum/gstspectrum.c index 920d69ee..aa309f1c 100644 --- a/gst/spectrum/gstspectrum.c +++ b/gst/spectrum/gstspectrum.c @@ -25,40 +25,44 @@ #include "gstspectrum.h" /* elementfactory information */ -static GstElementDetails gst_spectrum_details = GST_ELEMENT_DETAILS ( - "Spectrum analyzer", - "Filter/Analyzer/Audio", - "Run an FFT on the audio signal, output spectrum data", - "Erik Walthinsen " -); +static GstElementDetails gst_spectrum_details = +GST_ELEMENT_DETAILS ("Spectrum analyzer", + "Filter/Analyzer/Audio", + "Run an FFT on the audio signal, output spectrum data", + "Erik Walthinsen "); /* Spectrum signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_WIDTH, }; -static void gst_spectrum_base_init (gpointer g_class); -static void gst_spectrum_class_init (GstSpectrumClass *klass); -static void gst_spectrum_init (GstSpectrum *spectrum); +static void gst_spectrum_base_init (gpointer g_class); +static void gst_spectrum_class_init (GstSpectrumClass * klass); +static void gst_spectrum_init (GstSpectrum * spectrum); -static void gst_spectrum_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); +static void gst_spectrum_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); -static void gst_spectrum_chain (GstPad *pad, GstData *_data); +static void gst_spectrum_chain (GstPad * pad, GstData * _data); #define fixed short -int gst_spectrum_fix_fft(fixed fr[], fixed fi[], int m, int inverse); -void gst_spectrum_fix_loud(fixed loud[], fixed fr[], fixed fi[], int n, int scale_shift); -void gst_spectrum_window(fixed fr[], int n); +int gst_spectrum_fix_fft (fixed fr[], fixed fi[], int m, int inverse); +void gst_spectrum_fix_loud (fixed loud[], fixed fr[], fixed fi[], int n, + int scale_shift); +void gst_spectrum_window (fixed fr[], int n); static GstElementClass *parent_class = NULL; + /*static guint gst_spectrum_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -68,17 +72,19 @@ gst_spectrum_get_type (void) if (!spectrum_type) { static const GTypeInfo spectrum_info = { - sizeof(GstSpectrumClass), + sizeof (GstSpectrumClass), gst_spectrum_base_init, NULL, - (GClassInitFunc)gst_spectrum_class_init, + (GClassInitFunc) gst_spectrum_class_init, NULL, NULL, - sizeof(GstSpectrum), + sizeof (GstSpectrum), 0, - (GInstanceInitFunc)gst_spectrum_init, + (GInstanceInitFunc) gst_spectrum_init, }; - spectrum_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSpectrum", &spectrum_info, 0); + spectrum_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSpectrum", &spectrum_info, + 0); } return spectrum_type; } @@ -91,41 +97,40 @@ gst_spectrum_base_init (gpointer g_class) gst_element_class_set_details (element_class, &gst_spectrum_details); } static void -gst_spectrum_class_init (GstSpectrumClass *klass) +gst_spectrum_class_init (GstSpectrumClass * klass) { GObjectClass *gobject_class; - gobject_class = (GObjectClass*)klass; + gobject_class = (GObjectClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_WIDTH, - g_param_spec_int("width","width","width", - G_MININT,G_MAXINT,0,G_PARAM_WRITABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, g_param_spec_int ("width", "width", "width", G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); /* CHECKME */ gobject_class->set_property = gst_spectrum_set_property; } static void -gst_spectrum_init (GstSpectrum *spectrum) +gst_spectrum_init (GstSpectrum * spectrum) { - spectrum->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(spectrum),spectrum->sinkpad); - gst_pad_set_chain_function(spectrum->sinkpad,gst_spectrum_chain); - spectrum->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(spectrum),spectrum->srcpad); + spectrum->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (spectrum), spectrum->sinkpad); + gst_pad_set_chain_function (spectrum->sinkpad, gst_spectrum_chain); + spectrum->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (spectrum), spectrum->srcpad); spectrum->width = 75; } static void -gst_spectrum_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_spectrum_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSpectrum *spectrum; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SPECTRUM(object)); - spectrum = GST_SPECTRUM(object); + g_return_if_fail (GST_IS_SPECTRUM (object)); + spectrum = GST_SPECTRUM (object); switch (prop_id) { case ARG_WIDTH: @@ -137,48 +142,49 @@ gst_spectrum_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_spectrum_chain (GstPad *pad, GstData *_data) +gst_spectrum_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstSpectrum *spectrum; gint spec_base, spec_len; gint16 *re, *im, *loud; gint16 *samples; - gint step,pos,i; + gint step, pos, i; guchar *spect; GstBuffer *newbuf; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); spectrum = GST_SPECTRUM (GST_OBJECT_PARENT (pad)); - samples = (gint16 *)GST_BUFFER_DATA(buf); + samples = (gint16 *) GST_BUFFER_DATA (buf); spec_base = 8; spec_len = 1024; - im = g_malloc(spec_len * sizeof(gint16)); - g_return_if_fail(im != NULL); - loud = g_malloc(spec_len * sizeof(gint16)); - g_return_if_fail(loud != NULL); + im = g_malloc (spec_len * sizeof (gint16)); + g_return_if_fail (im != NULL); + loud = g_malloc (spec_len * sizeof (gint16)); + g_return_if_fail (loud != NULL); - memset(im,0,spec_len * sizeof(gint16)); + memset (im, 0, spec_len * sizeof (gint16)); /*if (spectrum->meta->channels == 2) { */ - re = g_malloc(spec_len * sizeof(gint16)); - for (i=0;i> 1; + re = g_malloc (spec_len * sizeof (gint16)); + for (i = 0; i < spec_len; i++) + re[i] = (samples[(i * 2)] + samples[(i * 2) + 1]) >> 1; /*} else */ /* re = samples; */ - gst_spectrum_window(re,spec_len); - gst_spectrum_fix_fft(re,im,spec_base,FALSE); - gst_spectrum_fix_loud(loud,re,im,spec_len,0); - if (re != samples) g_free(re); - g_free(im); - step = spec_len / (spectrum->width*2); - spect = (guchar *)g_malloc(spectrum->width); - for (i=0,pos=0;iwidth;i++,pos += step) { + gst_spectrum_window (re, spec_len); + gst_spectrum_fix_fft (re, im, spec_base, FALSE); + gst_spectrum_fix_loud (loud, re, im, spec_len, 0); + if (re != samples) + g_free (re); + g_free (im); + step = spec_len / (spectrum->width * 2); + spect = (guchar *) g_malloc (spectrum->width); + for (i = 0, pos = 0; i < spectrum->width; i++, pos += step) { if (loud[pos] > -60) spect[i] = (loud[pos] + 60) / 2; else @@ -186,32 +192,27 @@ gst_spectrum_chain (GstPad *pad, GstData *_data) /* if (spect[i] > 15); */ /* spect[i] = 15; */ } - g_free(loud); - gst_buffer_unref(buf); + g_free (loud); + gst_buffer_unref (buf); /* g_free(samples); */ - newbuf = gst_buffer_new(); - g_return_if_fail(newbuf != NULL); - GST_BUFFER_DATA(newbuf) = spect; - GST_BUFFER_SIZE(newbuf) = spectrum->width; + newbuf = gst_buffer_new (); + g_return_if_fail (newbuf != NULL); + GST_BUFFER_DATA (newbuf) = spect; + GST_BUFFER_SIZE (newbuf) = spectrum->width; - gst_pad_push(spectrum->srcpad,GST_DATA (newbuf)); + gst_pad_push (spectrum->srcpad, GST_DATA (newbuf)); } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "spectrum", GST_RANK_NONE, GST_TYPE_SPECTRUM); + return gst_element_register (plugin, "spectrum", GST_RANK_NONE, + GST_TYPE_SPECTRUM); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "spectrum", - "Run an FFT on the audio signal, output spectrum data", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "spectrum", + "Run an FFT on the audio signal, output spectrum data", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/spectrum/gstspectrum.h b/gst/spectrum/gstspectrum.h index 8cc546ec..23c4ef4b 100644 --- a/gst/spectrum/gstspectrum.h +++ b/gst/spectrum/gstspectrum.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_SPECTRUM \ @@ -41,27 +42,29 @@ extern "C" { #define GST_IS_SPECTRUM_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPECTRUM)) -typedef struct _GstSpectrum GstSpectrum; -typedef struct _GstSpectrumClass GstSpectrumClass; + typedef struct _GstSpectrum GstSpectrum; + typedef struct _GstSpectrumClass GstSpectrumClass; -struct _GstSpectrum { - GstElement element; + struct _GstSpectrum + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width; -}; + gint width; + }; -struct _GstSpectrumClass { - GstElementClass parent_class; -}; + struct _GstSpectrumClass + { + GstElementClass parent_class; + }; -GType gst_spectrum_get_type(void); + GType gst_spectrum_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_SPECTRUM_H__ */ +#endif /* __GST_SPECTRUM_H__ */ diff --git a/gst/speed/demo-mp3.c b/gst/speed/demo-mp3.c index 1f99c7e1..5b83347a 100644 --- a/gst/speed/demo-mp3.c +++ b/gst/speed/demo-mp3.c @@ -22,62 +22,66 @@ #include #include -void set_speed (GtkAdjustment *adj, gpointer data) +void +set_speed (GtkAdjustment * adj, gpointer data) { - GstElement *speed = GST_ELEMENT(data); - g_object_set (speed, "speed", adj->value, NULL); + GstElement *speed = GST_ELEMENT (data); + + g_object_set (speed, "speed", adj->value, NULL); } -int main(int argc, char **argv) +int +main (int argc, char **argv) { - GtkWidget *window, *vbox, *hscale, *button; - GstElement *filesrc, *mad, *stereo2mono, *speed, *osssink, *pipeline; - - gst_init (&argc, &argv); - gtk_init (&argc, &argv); - - if (argc!=2) { - g_print("usage: %s \n", argv[0]); - exit(-1); - } - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(window), 400, 80); - vbox = gtk_vbox_new(FALSE, 0); - gtk_widget_show(vbox); - hscale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 0.01, 4.0, - 0.1, 0.0, 0.0))); - gtk_scale_set_digits(GTK_SCALE(hscale), 2); - gtk_range_set_update_policy(GTK_RANGE(hscale), GTK_UPDATE_CONTINUOUS); - button = gtk_button_new_with_label("quit"); - gtk_container_add(GTK_CONTAINER(window), vbox); - gtk_box_pack_start(GTK_BOX(vbox), hscale, TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 2); - gtk_widget_show(hscale); - gtk_signal_connect(GTK_OBJECT(button), "clicked", gtk_main_quit, NULL); - gtk_widget_show(button); - - filesrc = gst_element_factory_make("filesrc", "filesrc"); - mad = gst_element_factory_make("mad", "mad"); - stereo2mono = gst_element_factory_make("stereo2mono", "stereo2mono"); - speed = gst_element_factory_make("speed", "speed"); - osssink = gst_element_factory_make("osssink", "osssink"); - g_object_set(osssink, "fragment", 0x00180008, NULL); - - gtk_signal_connect(GTK_OBJECT(gtk_range_get_adjustment(GTK_RANGE(hscale))), - "value_changed", G_CALLBACK (set_speed), speed); - - pipeline = gst_pipeline_new("app"); - gst_bin_add_many (GST_BIN(pipeline), filesrc, mad, stereo2mono, speed, osssink, NULL); - gst_element_link_many (filesrc, mad, stereo2mono, speed, osssink, NULL); - g_object_set(G_OBJECT(filesrc), "location", argv[1], NULL); - - gst_element_set_state(pipeline, GST_STATE_PLAYING); - - gtk_widget_show(window); - gtk_idle_add((GtkFunction)gst_bin_iterate, pipeline); - - gtk_main(); - - return 0; + GtkWidget *window, *vbox, *hscale, *button; + GstElement *filesrc, *mad, *stereo2mono, *speed, *osssink, *pipeline; + + gst_init (&argc, &argv); + gtk_init (&argc, &argv); + + if (argc != 2) { + g_print ("usage: %s \n", argv[0]); + exit (-1); + } + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (window), 400, 80); + vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox); + hscale = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 0.01, 4.0, + 0.1, 0.0, 0.0))); + gtk_scale_set_digits (GTK_SCALE (hscale), 2); + gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS); + button = gtk_button_new_with_label ("quit"); + gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 2); + gtk_widget_show (hscale); + gtk_signal_connect (GTK_OBJECT (button), "clicked", gtk_main_quit, NULL); + gtk_widget_show (button); + + filesrc = gst_element_factory_make ("filesrc", "filesrc"); + mad = gst_element_factory_make ("mad", "mad"); + stereo2mono = gst_element_factory_make ("stereo2mono", "stereo2mono"); + speed = gst_element_factory_make ("speed", "speed"); + osssink = gst_element_factory_make ("osssink", "osssink"); + g_object_set (osssink, "fragment", 0x00180008, NULL); + + gtk_signal_connect (GTK_OBJECT (gtk_range_get_adjustment (GTK_RANGE + (hscale))), "value_changed", G_CALLBACK (set_speed), speed); + + pipeline = gst_pipeline_new ("app"); + gst_bin_add_many (GST_BIN (pipeline), filesrc, mad, stereo2mono, speed, + osssink, NULL); + gst_element_link_many (filesrc, mad, stereo2mono, speed, osssink, NULL); + g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + gtk_widget_show (window); + gtk_idle_add ((GtkFunction) gst_bin_iterate, pipeline); + + gtk_main (); + + return 0; } diff --git a/gst/speed/gstspeed.c b/gst/speed/gstspeed.c index 89b4edfb..12752f12 100644 --- a/gst/speed/gstspeed.c +++ b/gst/speed/gstspeed.c @@ -36,63 +36,60 @@ #define SPEED_NUMBUF 6 /* elementfactory information */ -static GstElementDetails speed_details = GST_ELEMENT_DETAILS ( - "Speed", - "Filter/Effect/Audio", - "Set speed/pitch on audio/raw streams (resampler)", - "Andy Wingo " -); +static GstElementDetails speed_details = GST_ELEMENT_DETAILS ("Speed", + "Filter/Effect/Audio", + "Set speed/pitch on audio/raw streams (resampler)", + "Andy Wingo "); /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SPEED }; static GstStaticPadTemplate gst_speed_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS - ) -); + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); static GstStaticPadTemplate gst_speed_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " - GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS - ) -); + GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " + GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS) + ); -static void speed_base_init (gpointer g_class); -static void speed_class_init (GstSpeedClass *klass); -static void speed_init (GstSpeed *filter); +static void speed_base_init (gpointer g_class); +static void speed_class_init (GstSpeedClass * klass); +static void speed_init (GstSpeed * filter); -static void speed_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void speed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void speed_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void speed_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec); -static gboolean speed_parse_caps (GstSpeed *filter, const GstCaps *caps); +static gboolean speed_parse_caps (GstSpeed * filter, const GstCaps * caps); -static void speed_loop (GstElement *element); +static void speed_loop (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; */ static GstPadLinkReturn -speed_link (GstPad *pad, const GstCaps *caps) +speed_link (GstPad * pad, const GstCaps * caps) { GstSpeed *filter; GstPad *otherpad; @@ -102,20 +99,21 @@ speed_link (GstPad *pad, const GstCaps *caps) g_return_val_if_fail (GST_IS_SPEED (filter), GST_PAD_LINK_REFUSED); otherpad = (pad == filter->srcpad ? filter->sinkpad : filter->srcpad); - if (! speed_parse_caps (filter, caps)) return GST_PAD_LINK_REFUSED; + if (!speed_parse_caps (filter, caps)) + return GST_PAD_LINK_REFUSED; - return gst_pad_try_set_caps(otherpad, caps); + return gst_pad_try_set_caps (otherpad, caps); } static gboolean -speed_parse_caps (GstSpeed *filter, const GstCaps *caps) +speed_parse_caps (GstSpeed * filter, const GstCaps * caps) { const gchar *mimetype; GstStructure *structure; gboolean ret; - g_return_val_if_fail(filter != NULL, FALSE); - g_return_val_if_fail(caps != NULL, FALSE); + g_return_val_if_fail (filter != NULL, FALSE); + g_return_val_if_fail (caps != NULL, FALSE); structure = gst_caps_get_structure (caps, 0); @@ -123,17 +121,19 @@ speed_parse_caps (GstSpeed *filter, const GstCaps *caps) ret &= gst_structure_get_int (structure, "channels", &filter->channels); ret &= gst_structure_get_int (structure, "width", &filter->width); ret &= gst_structure_get_int (structure, "endianness", &filter->endianness); - ret &= gst_structure_get_int (structure, "buffer-frames", &filter->buffer_frames); + ret &= + gst_structure_get_int (structure, "buffer-frames", + &filter->buffer_frames); mimetype = gst_structure_get_name (structure); - if (strcmp(mimetype, "audio/x-raw-int") == 0) { + if (strcmp (mimetype, "audio/x-raw-int") == 0) { filter->format = GST_SPEED_FORMAT_INT; ret &= gst_structure_get_int (structure, "depth", &filter->depth); ret &= gst_structure_get_boolean (structure, "signed", &filter->is_signed); - } else if (strcmp(mimetype, "audio/x-raw-float") == 0) { + } else if (strcmp (mimetype, "audio/x-raw-float") == 0) { filter->format = GST_SPEED_FORMAT_FLOAT; - } else { + } else { return FALSE; } return ret; @@ -141,22 +141,24 @@ speed_parse_caps (GstSpeed *filter, const GstCaps *caps) GType -gst_speed_get_type(void) { +gst_speed_get_type (void) +{ static GType speed_type = 0; if (!speed_type) { static const GTypeInfo speed_info = { - sizeof(GstSpeedClass), + sizeof (GstSpeedClass), speed_base_init, NULL, - (GClassInitFunc)speed_class_init, + (GClassInitFunc) speed_class_init, NULL, NULL, - sizeof(GstSpeed), + sizeof (GstSpeed), 0, - (GInstanceInitFunc)speed_init, + (GInstanceInitFunc) speed_init, }; - speed_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSpeed", &speed_info, 0); + speed_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstSpeed", &speed_info, 0); } return speed_type; } @@ -174,51 +176,53 @@ speed_base_init (gpointer g_class) gst_static_pad_template_get (&gst_speed_sink_template)); } static void -speed_class_init (GstSpeedClass *klass) +speed_class_init (GstSpeedClass * klass) { - GObjectClass *gobject_class = (GObjectClass*)klass; + GObjectClass *gobject_class = (GObjectClass *) klass; gobject_class->set_property = speed_set_property; gobject_class->get_property = speed_get_property; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SPEED, - g_param_spec_float("speed","speed","speed", - 0.1,40.0,1.0,G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SPEED, + g_param_spec_float ("speed", "speed", "speed", + 0.1, 40.0, 1.0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); } static void -speed_init (GstSpeed *filter) +speed_init (GstSpeed * filter) { - filter->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&gst_speed_sink_template), "sink"); - gst_pad_set_link_function(filter->sinkpad, speed_link); - gst_element_add_pad(GST_ELEMENT(filter),filter->sinkpad); - - filter->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&gst_speed_src_template), "src"); - gst_pad_set_link_function(filter->srcpad, speed_link); - gst_element_add_pad(GST_ELEMENT(filter),filter->srcpad); - - gst_element_set_loop_function(GST_ELEMENT(filter),speed_loop); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_speed_sink_template), "sink"); + gst_pad_set_link_function (filter->sinkpad, speed_link); + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_speed_src_template), "src"); + gst_pad_set_link_function (filter->srcpad, speed_link); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + + gst_element_set_loop_function (GST_ELEMENT (filter), speed_loop); } static void -speed_loop (GstElement *element) +speed_loop (GstElement * element) { - GstSpeed *filter = GST_SPEED(element); + GstSpeed *filter = GST_SPEED (element); GstBuffer *in, *out; guint i, j, nin, nout; gfloat interp, speed, lower, i_float; - g_return_if_fail(filter != NULL); - g_return_if_fail(GST_IS_SPEED(filter)); + g_return_if_fail (filter != NULL); + g_return_if_fail (GST_IS_SPEED (filter)); i = j = 0; speed = filter->speed; - - in = GST_BUFFER (gst_pad_pull(filter->sinkpad)); + + in = GST_BUFFER (gst_pad_pull (filter->sinkpad)); if (GST_IS_EVENT (in)) { gst_pad_event_default (filter->sinkpad, GST_EVENT (in)); @@ -232,36 +236,36 @@ speed_loop (GstElement *element) /* this is a bit nasty, but hey, it's what you've got to do to keep the same * algorithm and multiple data types in c. */ - if (filter->format==GST_SPEED_FORMAT_FLOAT) { + if (filter->format == GST_SPEED_FORMAT_FLOAT) { #define _FORMAT gfloat #include "filter.func" #undef _FORMAT - } else if (filter->format==GST_SPEED_FORMAT_INT && filter->width==16) { + } else if (filter->format == GST_SPEED_FORMAT_INT && filter->width == 16) { #define _FORMAT gint16 #include "filter.func" #undef _FORMAT - } else if (filter->format==GST_SPEED_FORMAT_INT && filter->width==8) { + } else if (filter->format == GST_SPEED_FORMAT_INT && filter->width == 8) { #define _FORMAT gint8 #include "filter.func" #undef _FORMAT } else { - GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION, (NULL), - ("format wasn't negotiated before chain function")); + GST_ELEMENT_ERROR (filter, CORE, NEGOTIATION, (NULL), + ("format wasn't negotiated before chain function")); gst_element_yield (element); } } static void -speed_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +speed_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstSpeed *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SPEED(object)); - filter = GST_SPEED(object); + g_return_if_fail (GST_IS_SPEED (object)); + filter = GST_SPEED (object); - switch (prop_id) - { + switch (prop_id) { case ARG_SPEED: filter->speed = g_value_get_float (value); break; @@ -271,13 +275,14 @@ speed_set_property (GObject *object, guint prop_id, const GValue *value, GParamS } static void -speed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +speed_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstSpeed *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SPEED(object)); - filter = GST_SPEED(object); + g_return_if_fail (GST_IS_SPEED (object)); + filter = GST_SPEED (object); switch (prop_id) { case ARG_SPEED: @@ -290,19 +295,13 @@ speed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *p } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register(plugin, "speed", GST_RANK_NONE, GST_TYPE_SPEED); + return gst_element_register (plugin, "speed", GST_RANK_NONE, GST_TYPE_SPEED); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "speed", - "Set speed/pitch on audio/raw streams (resampler)", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "speed", + "Set speed/pitch on audio/raw streams (resampler)", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/speed/gstspeed.h b/gst/speed/gstspeed.h index 2bbb0e6c..d86d1fce 100644 --- a/gst/speed/gstspeed.h +++ b/gst/speed/gstspeed.h @@ -25,7 +25,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_SPEED \ (gst_speed_get_type()) #define GST_SPEED(obj) \ @@ -36,17 +35,18 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPEED)) #define GST_IS_SPEED_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPEED)) - typedef struct _GstSpeed GstSpeed; typedef struct _GstSpeedClass GstSpeedClass; typedef enum _GstSpeedFormat GstSpeedFormat; -enum _GstSpeedFormat { +enum _GstSpeedFormat +{ GST_SPEED_FORMAT_INT, GST_SPEED_FORMAT_FLOAT }; -struct _GstSpeed { +struct _GstSpeed +{ GstElement element; GstPad *sinkpad, *srcpad; @@ -66,12 +66,12 @@ struct _GstSpeed { gboolean is_signed; }; -struct _GstSpeedClass { +struct _GstSpeedClass +{ GstElementClass parent_class; }; -GType gst_speed_get_type(void); +GType gst_speed_get_type (void); G_END_DECLS - #endif /* __GST_SPEED_H__ */ diff --git a/gst/stereo/gststereo.c b/gst/stereo/gststereo.c index f2e9a79d..947c3885 100644 --- a/gst/stereo/gststereo.c +++ b/gst/stereo/gststereo.c @@ -28,56 +28,61 @@ #include /* elementfactory information */ -static GstElementDetails stereo_details = GST_ELEMENT_DETAILS ( - "Stereo effect", - "Filter/Effect/Audio", - "Muck with the stereo signal to enhance its 'stereo-ness'", - "Erik Walthinsen " -); +static GstElementDetails stereo_details = GST_ELEMENT_DETAILS ("Stereo effect", + "Filter/Effect/Audio", + "Muck with the stereo signal to enhance its 'stereo-ness'", + "Erik Walthinsen "); /* Stereo signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_ACTIVE, ARG_STEREO }; -static void gst_stereo_base_init (gpointer g_class); -static void gst_stereo_class_init (GstStereoClass *klass); -static void gst_stereo_init (GstStereo *stereo); +static void gst_stereo_base_init (gpointer g_class); +static void gst_stereo_class_init (GstStereoClass * klass); +static void gst_stereo_init (GstStereo * stereo); -static void gst_stereo_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_stereo_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_stereo_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_stereo_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_stereo_chain (GstPad *pad, GstData *_data); +static void gst_stereo_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_stereo_get_type(void) { +gst_stereo_get_type (void) +{ static GType stereo_type = 0; if (!stereo_type) { static const GTypeInfo stereo_info = { - sizeof(GstStereoClass), + sizeof (GstStereoClass), gst_stereo_base_init, NULL, - (GClassInitFunc)gst_stereo_class_init, + (GClassInitFunc) gst_stereo_class_init, NULL, NULL, - sizeof(GstStereo), + sizeof (GstStereo), 0, - (GInstanceInitFunc)gst_stereo_init, + (GInstanceInitFunc) gst_stereo_init, }; - stereo_type = g_type_register_static(GST_TYPE_ELEMENT, "GstStereo", &stereo_info, 0); + stereo_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstStereo", &stereo_info, 0); } return stereo_type; } @@ -86,60 +91,57 @@ static void gst_stereo_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + gst_element_class_set_details (element_class, &stereo_details); } static void -gst_stereo_class_init (GstStereoClass *klass) +gst_stereo_class_init (GstStereoClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_ACTIVE, - g_param_spec_int("active","active","active", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */ - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_STEREO, - g_param_spec_float("stereo","stereo","stereo", - 0.0,1.0,0.0,G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACTIVE, g_param_spec_int ("active", "active", "active", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STEREO, g_param_spec_float ("stereo", "stereo", "stereo", 0.0, 1.0, 0.0, G_PARAM_READWRITE)); /* CHECKME */ gobject_class->set_property = gst_stereo_set_property; gobject_class->get_property = gst_stereo_get_property; } static void -gst_stereo_init (GstStereo *stereo) +gst_stereo_init (GstStereo * stereo) { - stereo->sinkpad = gst_pad_new("sink",GST_PAD_SINK); - gst_element_add_pad(GST_ELEMENT(stereo),stereo->sinkpad); - gst_pad_set_chain_function(stereo->sinkpad,gst_stereo_chain); - stereo->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_element_add_pad(GST_ELEMENT(stereo),stereo->srcpad); + stereo->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + gst_element_add_pad (GST_ELEMENT (stereo), stereo->sinkpad); + gst_pad_set_chain_function (stereo->sinkpad, gst_stereo_chain); + stereo->srcpad = gst_pad_new ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT (stereo), stereo->srcpad); stereo->active = FALSE; stereo->stereo = 2.5; } static void -gst_stereo_chain (GstPad *pad,GstData *_data) +gst_stereo_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstStereo *stereo; gint16 *data; gint samples; gint i; - gdouble avg,ldiff,rdiff,tmp,mul; + gdouble avg, ldiff, rdiff, tmp, mul; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); - stereo = GST_STEREO(GST_OBJECT_PARENT (pad)); - g_return_if_fail(stereo != NULL); - g_return_if_fail(GST_IS_STEREO(stereo)); + stereo = GST_STEREO (GST_OBJECT_PARENT (pad)); + g_return_if_fail (stereo != NULL); + g_return_if_fail (GST_IS_STEREO (stereo)); /* FIXME */ /* if (buf->meta) */ @@ -148,42 +150,43 @@ gst_stereo_chain (GstPad *pad,GstData *_data) if (stereo->active) { /*if (stereo->meta.channels == 2 && stereo->meta.format == AFMT_S16_LE) { */ - data = (gint16 *)GST_BUFFER_DATA(buf); - samples = GST_BUFFER_SIZE(buf) / 2; - mul = stereo->stereo; - for (i = 0; i < samples / 2; i += 2) { - avg = (data[i] + data[i + 1]) / 2; - ldiff = data[i] - avg; - rdiff = data[i + 1] - avg; - - tmp = avg + ldiff * mul; - if (tmp < -32768) - tmp = -32768; - if (tmp > 32767) - tmp = 32767; - data[i] = tmp; - - tmp = avg + rdiff * mul; - if (tmp < -32768) - tmp = -32768; - if (tmp > 32767) - tmp = 32767; - data[i + 1] = tmp; - } + data = (gint16 *) GST_BUFFER_DATA (buf); + samples = GST_BUFFER_SIZE (buf) / 2; + mul = stereo->stereo; + for (i = 0; i < samples / 2; i += 2) { + avg = (data[i] + data[i + 1]) / 2; + ldiff = data[i] - avg; + rdiff = data[i + 1] - avg; + + tmp = avg + ldiff * mul; + if (tmp < -32768) + tmp = -32768; + if (tmp > 32767) + tmp = 32767; + data[i] = tmp; + + tmp = avg + rdiff * mul; + if (tmp < -32768) + tmp = -32768; + if (tmp > 32767) + tmp = 32767; + data[i + 1] = tmp; + } /*} */ } - gst_pad_push(stereo->srcpad,GST_DATA (buf)); + gst_pad_push (stereo->srcpad, GST_DATA (buf)); } static void -gst_stereo_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_stereo_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstStereo *stereo; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_STEREO(object)); - stereo = GST_STEREO(object); + g_return_if_fail (GST_IS_STEREO (object)); + stereo = GST_STEREO (object); switch (prop_id) { case ARG_ACTIVE: @@ -198,13 +201,14 @@ gst_stereo_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_stereo_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_stereo_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstStereo *stereo; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_STEREO(object)); - stereo = GST_STEREO(object); + g_return_if_fail (GST_IS_STEREO (object)); + stereo = GST_STEREO (object); switch (prop_id) { case ARG_ACTIVE: @@ -220,20 +224,14 @@ gst_stereo_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "stereo", GST_RANK_NONE, GST_TYPE_STEREO); + return gst_element_register (plugin, "stereo", GST_RANK_NONE, + GST_TYPE_STEREO); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "stereo", - "Muck with the stereo signal, enhance it's 'stereo-ness'", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) - +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "stereo", + "Muck with the stereo signal, enhance it's 'stereo-ness'", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/stereo/gststereo.h b/gst/stereo/gststereo.h index 8b78f25e..b665432b 100644 --- a/gst/stereo/gststereo.h +++ b/gst/stereo/gststereo.h @@ -26,8 +26,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_STEREO \ @@ -41,27 +42,29 @@ extern "C" { #define GST_IS_STEREO_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STEREO)) -typedef struct _GstStereo GstStereo; -typedef struct _GstStereoClass GstStereoClass; + typedef struct _GstStereo GstStereo; + typedef struct _GstStereoClass GstStereoClass; -struct _GstStereo { - GstElement element; + struct _GstStereo + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint8 active; - gfloat stereo; -}; + gint8 active; + gfloat stereo; + }; -struct _GstStereoClass { - GstElementClass parent_class; -}; + struct _GstStereoClass + { + GstElementClass parent_class; + }; -GType gst_stereo_get_type(void); + GType gst_stereo_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_STEREO_H__ */ +#endif /* __GST_STEREO_H__ */ diff --git a/gst/switch/gstswitch.c b/gst/switch/gstswitch.c index e57508bc..995bbdbe 100644 --- a/gst/switch/gstswitch.c +++ b/gst/switch/gstswitch.c @@ -16,7 +16,7 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -24,7 +24,8 @@ /* Object header */ #include "gstswitch.h" -enum { +enum +{ ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE @@ -34,20 +35,16 @@ GST_DEBUG_CATEGORY_EXTERN (GST_CAT_ELEMENT_PADS); GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DATAFLOW); /* ElementFactory information */ -static GstElementDetails gst_switch_details = GST_ELEMENT_DETAILS ( - "Switch", - "Generic", - "N-to-1 input switching", - "Julien Moutte " -); +static GstElementDetails gst_switch_details = GST_ELEMENT_DETAILS ("Switch", + "Generic", + "N-to-1 input switching", + "Julien Moutte "); static GstStaticPadTemplate gst_switch_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("sink%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS_ANY); static GstElementClass *parent_class = NULL; @@ -58,33 +55,33 @@ static GstElementClass *parent_class = NULL; /* ============================================================= */ static void -gst_switch_release_pad (GstElement *element, GstPad *pad) +gst_switch_release_pad (GstElement * element, GstPad * pad) { GList *sinkpads = NULL; GstSwitch *gstswitch = NULL; GstSwitchPad *switchpad = NULL; - + g_return_if_fail (GST_IS_SWITCH (element)); - + gstswitch = GST_SWITCH (element); - + GST_CAT_LOG_OBJECT (GST_CAT_ELEMENT_PADS, gstswitch, - "releasing requested pad %p", pad); - + "releasing requested pad %p", pad); + sinkpads = gstswitch->sinkpads; - + /* Walking through our pad list searching for the pad we want to release */ while (sinkpads) { switchpad = sinkpads->data; - + if (switchpad && switchpad->sinkpad == pad) break; - else + else switchpad = NULL; - + sinkpads = g_list_next (sinkpads); } - + /* Releasing the found pad */ if (switchpad) { /* We unref the data of that pad to loose our reference */ @@ -102,178 +99,169 @@ gst_switch_release_pad (GstElement *element, GstPad *pad) } } -static GstPad* -gst_switch_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *unused) +static GstPad * +gst_switch_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * unused) { char *name = NULL; GstPad *sinkpad = NULL; GstSwitch *gstswitch = NULL; GstSwitchPad *switchpad = NULL; - + g_return_val_if_fail (GST_IS_SWITCH (element), NULL); - + gstswitch = GST_SWITCH (element); - + /* We only provide requested sink pads */ if (templ->direction != GST_PAD_SINK) { GST_CAT_LOG_OBJECT (GST_CAT_ELEMENT_PADS, gstswitch, - "requested a non sink pad"); + "requested a non sink pad"); return NULL; } - + name = g_strdup_printf ("sink%d", gstswitch->nb_sinkpads); - + sinkpad = gst_pad_new_from_template (templ, name); - + if (name) g_free (name); - + /* That pad will proxy caps and link */ gst_pad_set_link_function (sinkpad, - GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link)); + GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link)); gst_pad_set_getcaps_function (sinkpad, - GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); - + GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); + gst_element_add_pad (GST_ELEMENT (gstswitch), sinkpad); - + switchpad = g_new0 (GstSwitchPad, 1); if (!switchpad) return NULL; - + switchpad->sinkpad = sinkpad; switchpad->data = NULL; switchpad->forwarded = FALSE; switchpad->eos = FALSE; - + gstswitch->sinkpads = g_list_insert (gstswitch->sinkpads, switchpad, - gstswitch->nb_sinkpads); + gstswitch->nb_sinkpads); gstswitch->nb_sinkpads++; - + if (GST_PAD_CAPS (gstswitch->srcpad)) { gst_pad_try_set_caps (sinkpad, GST_PAD_CAPS (gstswitch->srcpad)); } - + return sinkpad; } static gboolean -gst_switch_poll_sinkpads (GstSwitch *gstswitch) +gst_switch_poll_sinkpads (GstSwitch * gstswitch) { GList *pads; - + g_return_val_if_fail (gstswitch != NULL, FALSE); g_return_val_if_fail (GST_IS_SWITCH (gstswitch), FALSE); - + pads = gstswitch->sinkpads; - + while (pads) { GstSwitchPad *switchpad = pads->data; - + /* We only pull from usable pads and non EOS pads */ if (GST_PAD_IS_USABLE (switchpad->sinkpad) && !switchpad->eos) { - + GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "polling pad %p", - switchpad->sinkpad); - + "polling pad %p", switchpad->sinkpad); + /* We loose the reference to the data we stored */ if (switchpad->data) { - gst_data_unref (switchpad->data); + gst_data_unref (switchpad->data); } - + /* If that data was not forwarded we unref it another time to destroy it */ if (!switchpad->forwarded && switchpad->data) { - gst_data_unref (switchpad->data); + gst_data_unref (switchpad->data); } - + switchpad->data = NULL; switchpad->data = gst_pad_pull (switchpad->sinkpad); - + if (!switchpad->data) { - GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "received NULL data from pad %p", - switchpad->sinkpad); + GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, + "received NULL data from pad %p", switchpad->sinkpad); + } else { + gst_data_ref (switchpad->data); + switchpad->forwarded = FALSE; + + /* If the buffer is an EOS event we tag the pad as being in EOS. That + means we won't try to pull more data from that pad */ + if (GST_IS_EVENT (switchpad->data) && + (GST_EVENT_TYPE (GST_EVENT (switchpad->data)) == GST_EVENT_EOS)) { + GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, + "received EOS event on pad %p", switchpad->sinkpad); + switchpad->eos = TRUE; + } } - else { - gst_data_ref (switchpad->data); - switchpad->forwarded = FALSE; - - /* If the buffer is an EOS event we tag the pad as being in EOS. That - means we won't try to pull more data from that pad */ - if (GST_IS_EVENT (switchpad->data) && - (GST_EVENT_TYPE (GST_EVENT (switchpad->data)) == GST_EVENT_EOS)) { - GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "received EOS event on pad %p", - switchpad->sinkpad); - switchpad->eos = TRUE; - } - } - } - else { + } else { GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "not pulling from pad %s (eos is %d)", - gst_pad_get_name (switchpad->sinkpad), - switchpad->eos); + "not pulling from pad %s (eos is %d)", + gst_pad_get_name (switchpad->sinkpad), switchpad->eos); } pads = g_list_next (pads); } - + return TRUE; } -static void -gst_switch_loop (GstElement *element) +static void +gst_switch_loop (GstElement * element) { GstSwitch *gstswitch = NULL; GstSwitchPad *switchpad = NULL; - + g_return_if_fail (element != NULL); g_return_if_fail (GST_IS_SWITCH (element)); - + gstswitch = GST_SWITCH (element); - + /* We poll all our sinkpads */ gst_switch_poll_sinkpads (gstswitch); - + /* We get the active sinkpad */ switchpad = g_list_nth_data (gstswitch->sinkpads, gstswitch->active_sinkpad); - + if (switchpad && switchpad->data) { GstData *data = switchpad->data; - + /* Loose our reference to that data */ gst_data_unref (switchpad->data); switchpad->data = NULL; - + GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "using data from active pad %p", - switchpad->sinkpad); - + "using data from active pad %p", switchpad->sinkpad); + if (GST_IS_EVENT (data)) { GstEvent *event = GST_EVENT (data); + GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "handling event from active pad %p", - switchpad->sinkpad); + "handling event from active pad %p", switchpad->sinkpad); /* Handling event */ gst_pad_event_default (switchpad->sinkpad, event); - } - else { + } else { /* Pushing active sinkpad data to srcpad */ GST_CAT_LOG_OBJECT (GST_CAT_DATAFLOW, gstswitch, - "pushing data from active pad %p to %p", - switchpad->sinkpad, gstswitch->srcpad); + "pushing data from active pad %p to %p", + switchpad->sinkpad, gstswitch->srcpad); gst_pad_push (gstswitch->srcpad, data); } - + /* Mark this data as forwarded so that it won't get unrefed on next poll */ switchpad->forwarded = TRUE; } } static GstElementStateReturn -gst_switch_change_state (GstElement *element) +gst_switch_change_state (GstElement * element) { GstSwitch *gstswitch; @@ -287,26 +275,26 @@ gst_switch_change_state (GstElement *element) case GST_STATE_PAUSED_TO_PLAYING: break; case GST_STATE_PLAYING_TO_PAUSED: - { - GList *sinkpads = NULL; - - sinkpads = gstswitch->sinkpads; - - while (sinkpads) { - GstSwitchPad *switchpad = sinkpads->data; - - /* If a data is still stored in our structure we unref it */ - if (switchpad->data) { - gst_data_unref (switchpad->data); - switchpad->data = NULL; - } - - switchpad->forwarded = FALSE; - switchpad->eos = FALSE; - - sinkpads = g_list_next (sinkpads); - } + { + GList *sinkpads = NULL; + + sinkpads = gstswitch->sinkpads; + + while (sinkpads) { + GstSwitchPad *switchpad = sinkpads->data; + + /* If a data is still stored in our structure we unref it */ + if (switchpad->data) { + gst_data_unref (switchpad->data); + switchpad->data = NULL; + } + + switchpad->forwarded = FALSE; + switchpad->eos = FALSE; + + sinkpads = g_list_next (sinkpads); } + } break; case GST_STATE_PAUSED_TO_READY: break; @@ -316,7 +304,7 @@ gst_switch_change_state (GstElement *element) if (GST_ELEMENT_CLASS (parent_class)->change_state) return GST_ELEMENT_CLASS (parent_class)->change_state (element); - else + else return GST_STATE_SUCCESS; } @@ -327,15 +315,15 @@ gst_switch_change_state (GstElement *element) /* =========================================== */ static void -gst_switch_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) +gst_switch_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstSwitch *gstswitch = NULL; - + g_return_if_fail (GST_IS_SWITCH (object)); - + gstswitch = GST_SWITCH (object); - + switch (prop_id) { case ARG_ACTIVE_SOURCE: gstswitch->active_sinkpad = g_value_get_int (value); @@ -347,15 +335,15 @@ gst_switch_set_property (GObject *object, guint prop_id, } static void -gst_switch_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +gst_switch_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) { GstSwitch *gstswitch = NULL; - + g_return_if_fail (GST_IS_SWITCH (object)); - + gstswitch = GST_SWITCH (object); - + switch (prop_id) { case ARG_ACTIVE_SOURCE: g_value_set_int (value, gstswitch->active_sinkpad); @@ -376,50 +364,50 @@ gst_switch_get_property (GObject *object, guint prop_id, /* =========================================== */ static void -gst_switch_dispose (GObject *object) +gst_switch_dispose (GObject * object) { GstSwitch *gstswitch = NULL; GList *sinkpads = NULL; - + gstswitch = GST_SWITCH (object); sinkpads = gstswitch->sinkpads; - + while (sinkpads) { GstSwitchPad *switchpad = sinkpads->data; - + /* If a data is still stored in our structure we unref it */ if (switchpad->data) { gst_data_unref (switchpad->data); switchpad->data = NULL; } - + /* Freeing our structure */ g_free (switchpad); - + sinkpads = g_list_next (sinkpads); } - + /* Freeing the list correctly */ - if (gstswitch->sinkpads) { + if (gstswitch->sinkpads) { g_list_free (gstswitch->sinkpads); gstswitch->sinkpads = NULL; } - + G_OBJECT_CLASS (parent_class)->dispose (object); } static void -gst_switch_init (GstSwitch *gstswitch) +gst_switch_init (GstSwitch * gstswitch) { gstswitch->srcpad = gst_pad_new ("src", GST_PAD_SRC); gst_element_add_pad (GST_ELEMENT (gstswitch), gstswitch->srcpad); gst_pad_set_link_function (gstswitch->srcpad, - GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link)); + GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link)); gst_pad_set_getcaps_function (gstswitch->srcpad, - GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); + GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_element_set_loop_function (GST_ELEMENT (gstswitch), gst_switch_loop); - + gstswitch->sinkpads = NULL; gstswitch->active_sinkpad = 0; gstswitch->nb_sinkpads = 0; @@ -429,15 +417,15 @@ static void gst_switch_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - + gst_element_class_set_details (element_class, &gst_switch_details); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_switch_sink_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_switch_sink_factory)); } static void -gst_switch_class_init (GstSwitchClass *klass) +gst_switch_class_init (GstSwitchClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -446,26 +434,22 @@ gst_switch_class_init (GstSwitchClass *klass) gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - + g_object_class_install_property (gobject_class, - ARG_NB_SOURCES, - g_param_spec_int ("nb_sources", - "number of sources", - "number of sources", - G_MININT, G_MAXINT, 0, - G_PARAM_READABLE)); + ARG_NB_SOURCES, + g_param_spec_int ("nb_sources", + "number of sources", + "number of sources", G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); g_object_class_install_property (gobject_class, - ARG_ACTIVE_SOURCE, - g_param_spec_int ("active_source", - "active source", - "active source", - G_MININT, G_MAXINT, 0, - G_PARAM_READWRITE)); - + ARG_ACTIVE_SOURCE, + g_param_spec_int ("active_source", + "active source", + "active source", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); + gobject_class->dispose = gst_switch_dispose; gobject_class->set_property = gst_switch_set_property; gobject_class->get_property = gst_switch_get_property; - + gstelement_class->change_state = gst_switch_change_state; gstelement_class->request_new_pad = gst_switch_request_new_pad; gstelement_class->release_pad = gst_switch_release_pad; @@ -483,40 +467,34 @@ gst_switch_get_type (void) static GType switch_type = 0; if (!switch_type) { - static const GTypeInfo switch_info = { - sizeof(GstSwitchClass), - gst_switch_base_init, - NULL, - (GClassInitFunc) gst_switch_class_init, - NULL, - NULL, - sizeof(GstSwitch), - 0, - (GInstanceInitFunc) gst_switch_init, - }; - - switch_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstSwitch", &switch_info, 0); + static const GTypeInfo switch_info = { + sizeof (GstSwitchClass), + gst_switch_base_init, + NULL, + (GClassInitFunc) gst_switch_class_init, + NULL, + NULL, + sizeof (GstSwitch), + 0, + (GInstanceInitFunc) gst_switch_init, + }; + + switch_type = g_type_register_static (GST_TYPE_ELEMENT, + "GstSwitch", &switch_info, 0); } - + return switch_type; } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "switch", GST_RANK_NONE, - GST_TYPE_SWITCH); + GST_TYPE_SWITCH); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "switch", - "N-to-1 input switching", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "switch", + "N-to-1 input switching", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/switch/gstswitch.h b/gst/switch/gstswitch.h index 59d66aeb..bd8e3739 100644 --- a/gst/switch/gstswitch.h +++ b/gst/switch/gstswitch.h @@ -16,14 +16,13 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - + #ifndef __GST_SWITCH_H__ #define __GST_SWITCH_H__ #include G_BEGIN_DECLS - #define GST_TYPE_SWITCH \ (gst_switch_get_type()) #define GST_SWITCH(obj) \ @@ -34,35 +33,36 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_SWITCH)) #define GST_IS_SWITCH_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_SWITCH)) - typedef struct _GstSwitchPad GstSwitchPad; typedef struct _GstSwitch GstSwitch; typedef struct _GstSwitchClass GstSwitchClass; -struct _GstSwitchPad { +struct _GstSwitchPad +{ GstPad *sinkpad; GstData *data; gboolean forwarded; gboolean eos; }; -struct _GstSwitch { +struct _GstSwitch +{ GstElement element; - + GList *sinkpads; GstPad *srcpad; - + guint nb_sinkpads; guint active_sinkpad; }; -struct _GstSwitchClass { +struct _GstSwitchClass +{ GstElementClass parent_class; }; GType gst_switch_get_type (void); G_END_DECLS - #endif /* __GST_SWITCH_H__ */ diff --git a/gst/vbidec/gstvbidec.c b/gst/vbidec/gstvbidec.c index 1670142f..2a92b297 100644 --- a/gst/vbidec/gstvbidec.c +++ b/gst/vbidec/gstvbidec.c @@ -43,39 +43,41 @@ //typedef struct _GstVBIDec GstVBIDec; typedef struct _GstVBIDecClass GstVBIDecClass; -struct _GstVBIDec { - GstElement element; +struct _GstVBIDec +{ + GstElement element; /* pads */ - GstPad *sinkpad, - *srcpad; - char caption[128]; - vbiscreen_t *vbiscreen; - vbidata_t *vbidata; - int caption_type; - gboolean dvd_input; + GstPad *sinkpad, *srcpad; + char caption[128]; + vbiscreen_t *vbiscreen; + vbidata_t *vbidata; + int caption_type; + gboolean dvd_input; }; -struct _GstVBIDecClass { +struct _GstVBIDecClass +{ GstElementClass parent_class; }; -GType gst_vbidec_get_type(void); +GType gst_vbidec_get_type (void); /* elementfactory information */ -static GstElementDetails gst_vbidec_details = GST_ELEMENT_DETAILS ( - "VBI decoder", - "Codec/Decoder/Video", - "Decodes closed captions and XDS data from VBI data", - "David I. Lehn " -); +static GstElementDetails gst_vbidec_details = +GST_ELEMENT_DETAILS ("VBI decoder", + "Codec/Decoder/Video", + "Decodes closed captions and XDS data from VBI data", + "David I. Lehn "); /* VBIDec signals and args */ -enum { +enum +{ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_VERBOSE, ARG_CAPTION_TYPE, @@ -83,20 +85,17 @@ enum { }; static GstStaticPadTemplate gst_vbidec_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); static GstStaticPadTemplate gst_vbidec_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "text/plain" ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("text/plain") + ); #define GST_TYPE_VBIDEC_CAPTION_TYPE_TYPE (gst_vbidec_caption_type_get_type()) @@ -105,35 +104,38 @@ gst_vbidec_caption_type_get_type (void) { static GType vbidec_caption_type_type = 0; static GEnumValue vbidec_caption_type[] = { - { CAPTURE_OFF, "0", "Closed Captions off"}, - { CAPTURE_CC1, "1", "Closed Caption CC1"}, - { CAPTURE_CC2, "2", "Closed Caption CC2"}, - { CAPTURE_CC3, "4", "Closed Caption CC3"}, - { CAPTURE_CC4, "5", "Closed Caption CC4"}, - { CAPTURE_T1, "6", "Closed Caption T1"}, - { CAPTURE_T2, "7", "Closed Caption T2"}, - { CAPTURE_T3, "8", "Closed Caption T3"}, - { CAPTURE_T4, "9", "Closed Caption T4"}, + {CAPTURE_OFF, "0", "Closed Captions off"}, + {CAPTURE_CC1, "1", "Closed Caption CC1"}, + {CAPTURE_CC2, "2", "Closed Caption CC2"}, + {CAPTURE_CC3, "4", "Closed Caption CC3"}, + {CAPTURE_CC4, "5", "Closed Caption CC4"}, + {CAPTURE_T1, "6", "Closed Caption T1"}, + {CAPTURE_T2, "7", "Closed Caption T2"}, + {CAPTURE_T3, "8", "Closed Caption T3"}, + {CAPTURE_T4, "9", "Closed Caption T4"}, {0, NULL, NULL}, }; if (!vbidec_caption_type_type) { - vbidec_caption_type_type = g_enum_register_static ("GstVBIDecCaptionTypeType", vbidec_caption_type); + vbidec_caption_type_type = + g_enum_register_static ("GstVBIDecCaptionTypeType", + vbidec_caption_type); } return vbidec_caption_type_type; } -static void gst_vbidec_base_init (gpointer g_class); -static void gst_vbidec_class_init (GstVBIDecClass *klass); -static void gst_vbidec_init (GstVBIDec *vbidec); +static void gst_vbidec_base_init (gpointer g_class); +static void gst_vbidec_class_init (GstVBIDecClass * klass); +static void gst_vbidec_init (GstVBIDec * vbidec); -static void gst_vbidec_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_vbidec_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_vbidec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_vbidec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_vbidec_chain (GstPad *pad, GstData *_data); +static void gst_vbidec_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; + /*static guint gst_vbidec_signals[LAST_SIGNAL] = { 0 };*/ GType @@ -143,17 +145,18 @@ gst_vbidec_get_type (void) if (!vbidec_type) { static const GTypeInfo vbidec_info = { - sizeof(GstVBIDecClass), + sizeof (GstVBIDecClass), gst_vbidec_base_init, NULL, - (GClassInitFunc)gst_vbidec_class_init, + (GClassInitFunc) gst_vbidec_class_init, NULL, NULL, - sizeof(GstVBIDec), + sizeof (GstVBIDec), 0, - (GInstanceInitFunc)gst_vbidec_init, + (GInstanceInitFunc) gst_vbidec_init, }; - vbidec_type = g_type_register_static(GST_TYPE_ELEMENT, "GstVBIDec", &vbidec_info, 0); + vbidec_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstVBIDec", &vbidec_info, 0); } return vbidec_type; } @@ -171,62 +174,66 @@ gst_vbidec_base_init (gpointer g_class) gst_static_pad_template_get (&gst_vbidec_sink_template)); } static void -gst_vbidec_class_init(GstVBIDecClass *klass) +gst_vbidec_class_init (GstVBIDecClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - gobject_class->set_property = gst_vbidec_set_property; - gobject_class->get_property = gst_vbidec_get_property; + gobject_class->set_property = gst_vbidec_set_property; + gobject_class->get_property = gst_vbidec_get_property; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_VERBOSE, g_param_spec_boolean ("verbose", "verbose", "verbose", - FALSE, G_PARAM_WRITABLE)); + FALSE, G_PARAM_WRITABLE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CAPTION_TYPE, g_param_spec_enum ("caption type", "caption type", "Closed Caption Type", - GST_TYPE_VBIDEC_CAPTION_TYPE_TYPE, CAPTURE_OFF, G_PARAM_READWRITE)); + GST_TYPE_VBIDEC_CAPTION_TYPE_TYPE, CAPTURE_OFF, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DVD_INPUT, - g_param_spec_boolean ("dvd input", "dvd input", "VBI is encapsulated in MPEG2 GOP user_data field (as on DVDs)", - FALSE, G_PARAM_READWRITE)); + g_param_spec_boolean ("dvd input", "dvd input", + "VBI is encapsulated in MPEG2 GOP user_data field (as on DVDs)", + FALSE, G_PARAM_READWRITE)); } static void -gst_vbidec_init (GstVBIDec *vbidec) +gst_vbidec_init (GstVBIDec * vbidec) { /* create the sink and src pads */ - vbidec->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_vbidec_sink_template), "sink"); + vbidec->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_vbidec_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (vbidec), vbidec->sinkpad); - gst_pad_set_chain_function (vbidec->sinkpad, GST_DEBUG_FUNCPTR (gst_vbidec_chain)); + gst_pad_set_chain_function (vbidec->sinkpad, + GST_DEBUG_FUNCPTR (gst_vbidec_chain)); - vbidec->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_vbidec_src_template), "src"); + vbidec->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_vbidec_src_template), "src"); gst_element_add_pad (GST_ELEMENT (vbidec), vbidec->srcpad); - vbidec->vbiscreen = vbiscreen_new(0, 0, 1.0, 0, (void *)vbidec); - vbidec->vbidata = vbidata_new_line(vbidec->vbiscreen, 0); + vbidec->vbiscreen = vbiscreen_new (0, 0, 1.0, 0, (void *) vbidec); + vbidec->vbidata = vbidata_new_line (vbidec->vbiscreen, 0); vbidec->caption_type = CAPTURE_OFF; - vbidata_capture_mode(vbidec->vbidata, vbidec->caption_type); + vbidata_capture_mode (vbidec->vbidata, vbidec->caption_type); vbidec->dvd_input = FALSE; } static void -line21_decode(GstVBIDec *vbidec, guint8 *data, guint32 size) +line21_decode (GstVBIDec * vbidec, guint8 * data, guint32 size) { - vbidata_process_line(vbidec->vbidata, data, 0); + vbidata_process_line (vbidec->vbidata, data, 0); } static void -dvd_user_data_decode(GstVBIDec *vbidec, guint8 *data, guint32 size) +dvd_user_data_decode (GstVBIDec * vbidec, guint8 * data, guint32 size) { //char caption[128]; //int ci; /* caption index */ - int i; /* buf index */ + int i; /* buf index */ int num_disp_field; guint8 b1, b2; int w; @@ -235,29 +242,29 @@ dvd_user_data_decode(GstVBIDec *vbidec, guint8 *data, guint32 size) //g_print("== %p %d\n", data, size); i = 0; /* Check for Closed Captioning data */ - if (data[i] != 0x43 || data[i+1] != 0x43 || - data[i+2] != 0x01 || data[i+3] != 0xf8) { + if (data[i] != 0x43 || data[i + 1] != 0x43 || + data[i + 2] != 0x01 || data[i + 3] != 0xf8) { g_print ("non-CC data\n"); return; } //g_print ("CC data\n"); - i += 4; /* above */ - i += 4; /* ? */ + i += 4; /* above */ + i += 4; /* ? */ num_disp_field = data[i] & 0x3f; //g_print ("ndf %d\n", num_disp_field); while ((data[i] & 0xfe) == 0xfe) { if (data[i] & 0x1) { - b1 = data[i+1] & 0x7f; - b2 = data[i+2] & 0x7f; + b1 = data[i + 1] & 0x7f; + b2 = data[i + 2] & 0x7f; w = (b2 << 8) | b1; - vbidata_process_16b(vbidec->vbidata, 0, w); + vbidata_process_16b (vbidec->vbidata, 0, w); } i += 3; } } static void -gst_vbidec_chain (GstPad *pad, GstData *_data) +gst_vbidec_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstVBIDec *vbidec = GST_VBIDEC (gst_pad_get_parent (pad)); @@ -270,39 +277,40 @@ gst_vbidec_chain (GstPad *pad, GstData *_data) pts = GST_BUFFER_TIMESTAMP (buf); /* - g_print("** user_data: addr:%p len:%d state:%d\n", data, size, 0); - { - int i; - guint8 ud; - g_print("** \""); - for (i=0; idvd_input) { - dvd_user_data_decode(vbidec, data, size); + dvd_user_data_decode (vbidec, data, size); } else { - line21_decode(vbidec, data, size); + line21_decode (vbidec, data, size); } - gst_buffer_unref(buf); + gst_buffer_unref (buf); } void -gst_vbidec_show_text (GstVBIDec *vbidec, char *text, int len) +gst_vbidec_show_text (GstVBIDec * vbidec, char *text, int len) { //fprintf(stderr, "%*s\n", len, text); if (len > 0) { if (GST_PAD_IS_USABLE (vbidec->srcpad)) { GstBuffer *buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), text, len); GST_BUFFER_SIZE (buf) = len; // FIXME @@ -315,7 +323,8 @@ gst_vbidec_show_text (GstVBIDec *vbidec, char *text, int len) } static void -gst_vbidec_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_vbidec_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) { GstVBIDec *vbidec; @@ -325,15 +334,15 @@ gst_vbidec_set_property (GObject *object, guint prop_id, const GValue *value, GP switch (prop_id) { case ARG_VERBOSE: - vbidata_set_verbose(vbidec->vbidata, g_value_get_boolean (value)); - vbiscreen_set_verbose(vbidec->vbiscreen, g_value_get_boolean (value)); + vbidata_set_verbose (vbidec->vbidata, g_value_get_boolean (value)); + vbiscreen_set_verbose (vbidec->vbiscreen, g_value_get_boolean (value)); break; case ARG_DVD_INPUT: - vbidec->dvd_input = g_value_get_boolean(value); + vbidec->dvd_input = g_value_get_boolean (value); break; case ARG_CAPTION_TYPE: - vbidec->caption_type = g_value_get_enum(value); - vbidata_capture_mode(vbidec->vbidata, vbidec->caption_type); + vbidec->caption_type = g_value_get_enum (value); + vbidata_capture_mode (vbidec->vbidata, vbidec->caption_type); break; default: break; @@ -341,7 +350,8 @@ gst_vbidec_set_property (GObject *object, guint prop_id, const GValue *value, GP } static void -gst_vbidec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_vbidec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVBIDec *vbidec; @@ -351,10 +361,10 @@ gst_vbidec_get_property (GObject *object, guint prop_id, GValue *value, GParamSp switch (prop_id) { case ARG_DVD_INPUT: - g_value_set_boolean(value, vbidec->dvd_input); + g_value_set_boolean (value, vbidec->dvd_input); break; case ARG_CAPTION_TYPE: - g_value_set_enum(value, vbidec->caption_type); + g_value_set_enum (value, vbidec->caption_type); break; default: break; @@ -362,19 +372,14 @@ gst_vbidec_get_property (GObject *object, guint prop_id, GValue *value, GParamSp } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "vbidec", GST_RANK_NONE, GST_TYPE_VBIDEC); + return gst_element_register (plugin, "vbidec", GST_RANK_NONE, + GST_TYPE_VBIDEC); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "vbidec", - "Decodes closed captions and XDS data from VBI data", - plugin_init, - VERSION, - "GPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "vbidec", + "Decodes closed captions and XDS data from VBI data", + plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/vbidec/gstvbidec.h b/gst/vbidec/gstvbidec.h index 8a5ea7e5..e495f25c 100644 --- a/gst/vbidec/gstvbidec.h +++ b/gst/vbidec/gstvbidec.h @@ -19,4 +19,4 @@ typedef struct _GstVBIDec GstVBIDec; -void gst_vbidec_show_text (GstVBIDec *vbidec, char *text, int len); +void gst_vbidec_show_text (GstVBIDec * vbidec, char *text, int len); diff --git a/gst/vbidec/vbidata.c b/gst/vbidec/vbidata.c index fc0af5fa..75a85e48 100644 --- a/gst/vbidec/vbidata.c +++ b/gst/vbidec/vbidata.c @@ -48,159 +48,166 @@ static int pll = 0; struct vbidata_s { - int fd; - vbiscreen_t *vs; - /*tvtime_osd_t *osd;*/ - char buf[ 65536 ]; - int wanttop; - int wanttext; - - unsigned int colour; - int row, ital; - int indent, ul; - int chan; - - unsigned int current_colour; - int current_row, current_ital; - int current_indent, current_ul; - int current_chan; - int current_istext; - - int initialised; - int enabled; - int lastcode; - int lastcount; - int verbose; - - /* XDS data */ - char xds_packet[ 2048 ]; - int xds_cursor; - - char *program_name; - char *network_name; - char *call_letters; - const char *rating; - const char *program_type; - int start_day; - int start_month; - int start_min; - int start_hour; - int length_hour; - int length_min; - int length_elapsed_hour; - int length_elapsed_min; - int length_elapsed_sec; - char *program_desc[8]; + int fd; + vbiscreen_t *vs; + /*tvtime_osd_t *osd; */ + char buf[65536]; + int wanttop; + int wanttext; + + unsigned int colour; + int row, ital; + int indent, ul; + int chan; + + unsigned int current_colour; + int current_row, current_ital; + int current_indent, current_ul; + int current_chan; + int current_istext; + + int initialised; + int enabled; + int lastcode; + int lastcount; + int verbose; + + /* XDS data */ + char xds_packet[2048]; + int xds_cursor; + + char *program_name; + char *network_name; + char *call_letters; + const char *rating; + const char *program_type; + int start_day; + int start_month; + int start_min; + int start_hour; + int length_hour; + int length_min; + int length_elapsed_hour; + int length_elapsed_min; + int length_elapsed_sec; + char *program_desc[8]; }; /* this is NOT exactly right */ //static char *ccode = " !\"#$%&'()\0341+,-./0123456789:;<=>?@" static char *ccode = " !\"#$%&'()a+,-./0123456789:;<=>?@" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // "abcdefghijklmnopqrstuvwxyz" // "[\0351]\0355\0363\0372abcdefghijklmnopqr" - "[e]iouabcdefghijklmnopqr" + "[e]iouabcdefghijklmnopqr" // "stuvwxyz\0347\0367\0245\0244\0240"; - "stuvwxyzcoNn "; + "stuvwxyzcoNn "; static char *wccode = "\0256\0260\0275\0277T\0242\0243#\0340 " - "\0350\0354\0362\0371"; + "\0350\0354\0362\0371"; static char *extcode1 = "\0301\0311\0323\0332\0334\0374" - "`\0241*'-\0251S*\"\"\0300\0302" - "\0307\0310\0312\0313\0353\0316\0317\0357" - "\0324\0331\0371\0333\0253\0273"; + "`\0241*'-\0251S*\"\"\0300\0302" + "\0307\0310\0312\0313\0353\0316\0317\0357" "\0324\0331\0371\0333\0253\0273"; static char *extcode2 = "\0303\0343\0315\0314\0354\0322\0362\0325" - "{}\\^_|~\0304\0344\0326\0366\0337\0245\0244|" - "\0305\0345\0330\0370++++"; + "{}\\^_|~\0304\0344\0326\0366\0337\0245\0244|" "\0305\0345\0330\0370++++"; -int parityok(int n) +int +parityok (int n) { /* check parity for 2 bytes packed in n */ - int j, k; - for (k = 0, j = 0; j < 7; j++) - if (n & (1 << j)) - k++; - if ((k & 1) && (n & 0x80)) - return 0; - for (k = 0, j = 8; j < 15; j++) - if (n & (1 << j)) - k++; - if ((k & 1) && (n & 0x8000)) - return 0; - return 1; + int j, k; + + for (k = 0, j = 0; j < 7; j++) + if (n & (1 << j)) + k++; + if ((k & 1) && (n & 0x80)) + return 0; + for (k = 0, j = 8; j < 15; j++) + if (n & (1 << j)) + k++; + if ((k & 1) && (n & 0x8000)) + return 0; + return 1; } -int decodebit(unsigned char *data, int threshold) +int +decodebit (unsigned char *data, int threshold) { - return ((data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + - data[6] + data[7] + data[8] + data[9] + data[10] + data[11] + - data[12] + data[13] + data[14] + data[15] + data[16] + data[17] + - data[18] + data[19] + data[20] + data[21] + data[22] + data[23] + - data[24] + data[25] + data[26] + data[27] + data[28] + data[29] + - data[30] + data[31])>>5 > threshold); + return ((data[0] + data[1] + data[2] + data[3] + data[4] + data[5] + + data[6] + data[7] + data[8] + data[9] + data[10] + data[11] + + data[12] + data[13] + data[14] + data[15] + data[16] + data[17] + + data[18] + data[19] + data[20] + data[21] + data[22] + data[23] + + data[24] + data[25] + data[26] + data[27] + data[28] + data[29] + + data[30] + data[31]) >> 5 > threshold); } -int ccdecode(unsigned char *vbiline) +int +ccdecode (unsigned char *vbiline) { - int max = 0, maxval = 0, minval = 255, i = 0, clk = 0, tmp = 0; - int sample, packedbits = 0; - - for (i=0; i<250; i++) { - sample = vbiline[i]; - if (sample - maxval > 10) - (maxval = sample, max = i); - if (sample < minval) - minval = sample; - if (maxval - sample > 40) - break; - } - sample = ((maxval + minval) >> 1); - pll = max; - - /* found clock lead-in, double-check start */ + int max = 0, maxval = 0, minval = 255, i = 0, clk = 0, tmp = 0; + int sample, packedbits = 0; + + for (i = 0; i < 250; i++) { + sample = vbiline[i]; + if (sample - maxval > 10) + (maxval = sample, max = i); + if (sample < minval) + minval = sample; + if (maxval - sample > 40) + break; + } + sample = ((maxval + minval) >> 1); + pll = max; + + /* found clock lead-in, double-check start */ #ifndef PAL_DECODE - i = max + 478; + i = max + 478; #else - i = max + 538; + i = max + 538; #endif - if (!decodebit(&vbiline[i], sample)) - return 0; + if (!decodebit (&vbiline[i], sample)) + return 0; #ifndef PAL_DECODE - tmp = i + 57; /* tmp = data bit zero */ + tmp = i + 57; /* tmp = data bit zero */ #else - tmp = i + 71; + tmp = i + 71; #endif - for (i = 0; i < 16; i++) { + for (i = 0; i < 16; i++) { #ifndef PAL_DECODE - clk = tmp + i * 57; + clk = tmp + i * 57; #else - clk = tmp + i * 71; + clk = tmp + i * 71; #endif - if (decodebit(&vbiline[clk], sample)) { - packedbits |= 1 << i; - } + if (decodebit (&vbiline[clk], sample)) { + packedbits |= 1 << i; } - if (parityok(packedbits)) - return packedbits; - return 0; + } + if (parityok (packedbits)) + return packedbits; + return 0; } /* ccdecode */ -const char *movies[] = { "N/A", "G", "PG", "PG-13", "R", - "NC-17", "X", "Not Rated" }; -const char *usa_tv[] = { "Not Rated", "TV-Y", "TV-Y7", "TV-G", - "TV-PG", "TV-14", "TV-MA", "Not Rated" }; -const char *cane_tv[] = { "Exempt", "C", "C8+", "G", "PG", - "14+", "18+", "Reserved" }; -const char *canf_tv[] = { "Exempt", "G", "8 ans +", "13 ans +", - "16 ans +", "18 ans +", "Reserved", - "Reserved" }; +const char *movies[] = { "N/A", "G", "PG", "PG-13", "R", + "NC-17", "X", "Not Rated" +}; +const char *usa_tv[] = { "Not Rated", "TV-Y", "TV-Y7", "TV-G", + "TV-PG", "TV-14", "TV-MA", "Not Rated" +}; +const char *cane_tv[] = { "Exempt", "C", "C8+", "G", "PG", + "14+", "18+", "Reserved" +}; +const char *canf_tv[] = { "Exempt", "G", "8 ans +", "13 ans +", + "16 ans +", "18 ans +", "Reserved", + "Reserved" +}; const char *months[] = { 0, "Jan", "Feb", "Mar", "Apr", "May", - "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; -static const char *eia608_program_type[ 96 ] = { +static const char *eia608_program_type[96] = { "education", "entertainment", "movie", "news", "religious", "sports", "other", "action", "advertisement", "animated", "anthology", "automobile", "awards", "baseball", "basketball", "bulletin", "business", @@ -220,245 +227,318 @@ static const char *eia608_program_type[ 96 ] = { }; -static void parse_xds_packet( vbidata_t *vbi, char *packet, int length ) +static void +parse_xds_packet (vbidata_t * vbi, char *packet, int length) { - int sum = 0; - int i; - - if( !vbi ) return; - - /* Check the checksum for validity of the packet. */ - for( i = 0; i < length - 1; i++ ) { - sum += packet[ i ]; + int sum = 0; + int i; + + if (!vbi) + return; + + /* Check the checksum for validity of the packet. */ + for (i = 0; i < length - 1; i++) { + sum += packet[i]; + } + if ((((~sum) & 0x7f) + 1) != packet[length - 1]) { + return; + } + + /* Stick a null at the end, and cut off the last two characters. */ + packet[length - 2] = '\0'; + length -= 2; + + if (packet[0] == 0x01 && packet[1] == 0x03) { + if (vbi->program_name && !strcmp (vbi->program_name, packet + 2)) { + return; } - if( (((~sum) & 0x7f) + 1) != packet[ length - 1 ] ) { - return; + if (vbi->verbose) + fprintf (stderr, "Current program name: '%s'\n", packet + 2); + if (vbi->program_name) + free (vbi->program_name); + vbi->program_name = strdup (packet + 2); + /*tvtime_osd_set_show_name( vbi->osd, vbi->program_name ); */ + } else if (packet[0] == 0x03 && packet[1] == 0x03) { + if (vbi->verbose) + fprintf (stderr, "Future program name: '%s'\n", packet + 2); + } else if (packet[0] == 0x05 && packet[1] == 0x01) { + if (vbi->network_name && !strcmp (vbi->network_name, packet + 2)) { + return; } - /* Stick a null at the end, and cut off the last two characters. */ - packet[ length - 2 ] = '\0'; - length -= 2; - - if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x03 ) { - if( vbi->program_name && !strcmp(vbi->program_name, packet + 2 ) ) { - return; - } - if( vbi->verbose ) fprintf( stderr, "Current program name: '%s'\n", packet + 2 ); - if( vbi->program_name ) free( vbi->program_name ); - vbi->program_name = strdup(packet + 2); - /*tvtime_osd_set_show_name( vbi->osd, vbi->program_name );*/ - } else if( packet[ 0 ] == 0x03 && packet[ 1 ] == 0x03 ) { - if( vbi->verbose ) fprintf( stderr, "Future program name: '%s'\n", packet + 2 ); - } else if( packet[ 0 ] == 0x05 && packet[ 1 ] == 0x01 ) { - if( vbi->network_name && !strcmp(vbi->network_name, packet + 2 ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Network name: '%s'\n", packet + 2 ); - if( vbi->network_name ) free( vbi->network_name ); - vbi->network_name = strdup( packet + 2 ); - /*tvtime_osd_set_network_name( vbi->osd, vbi->network_name );*/ - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x05 ) { - int movie_rating = packet[ 2 ] & 7; - int scheme = (packet[ 2 ] & 56) >> 3; - int tv_rating = packet[ 3 ] & 7; - int VSL = packet[ 3 ] & 56; - const char * str; - - switch( VSL | scheme ) { - case 3: /* Canadian English TV */ - str = cane_tv[ tv_rating ]; - break; - case 7: /* Canadian French TV */ - str = canf_tv[ tv_rating ]; - break; - case 19: /* Reserved */ - case 31: - str = ""; - break; - default: - if( ((VSL | scheme) & 3) == 1 ) { - /* USA TV */ - str = usa_tv[ tv_rating ]; - } else { - /* MPAA Movie Rating */ - str = movies[ movie_rating ]; - } - break; - } - - if( vbi->rating && !strcmp(vbi->rating, str ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Show rating: %s", str ); - if( ((VSL | scheme) & 3) == 1 || ((VSL | scheme) & 3) == 0 ) { - /* show VSLD for the americans */ - if( (VSL | scheme) & 32 ) { - if( vbi->verbose ) fprintf( stderr, " V" ); - } - if( (VSL | scheme) & 16 ) { - if( vbi->verbose ) fprintf( stderr, " S" ); - } - if( (VSL | scheme) & 8 ) { - if( vbi->verbose ) fprintf( stderr, " L" ); - } - if( (VSL | scheme) & 4 ) { - if( vbi->verbose ) fprintf( stderr, " D" ); - } - } - if( vbi->verbose ) fprintf( stderr, "\n" ); - vbi->rating = str; - /*tvtime_osd_set_show_rating( vbi->osd, vbi->rating );*/ - } else if( packet[ 0 ] == 0x05 && packet[ 1 ] == 0x02 ) { - if( vbi->call_letters && !strcmp(vbi->call_letters, packet + 2 ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Network call letters: '%s'\n", packet + 2 ); - if( vbi->call_letters ) free( vbi->call_letters ); - vbi->call_letters = strdup( packet + 2 ); - /*tvtime_osd_set_network_call( vbi->osd, vbi->call_letters );*/ - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x01 ) { - int month = packet[5];// & 15; - int day = packet[4];// & 31; - int hour = packet[3];// & 31; - int min = packet[2];// & 63; - char str[33]; - if( vbi->verbose ) fprintf( stderr, "Program Start: %02d %s, %02d:%02d\n", - day & 31, months[month & 15], hour & 31, min & 63 ); - // packet[ 3 ], packet[ 4 ], packet[ 5 ], packet[ 6 ] ); - //packet[ 5 ] & 31, packet[ 6 ], packet[ 4 ] & 31, packet[ 3 ] & 63 ); - vbi->start_month = month & 15; - vbi->start_day = day & 31; - vbi->start_hour = hour & 31; - vbi->start_min = hour & 63; - snprintf( str, 32, "%02d %s, %02d:%02d", - day & 31, months[month & 15], hour & 31, min & 63 ); - /*tvtime_osd_set_show_start( vbi->osd, str );*/ - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x04 ) { - if( vbi->verbose ) fprintf( stderr, "Program type: " ); - for( i = 0; i < length - 2; i++ ) { - int cur = packet[ 2 + i ] - 0x20; - if( cur >= 0 && cur < 96 ) { - if( vbi->verbose ) fprintf( stderr, "%s%s", i ? ", " : "", eia608_program_type[ cur ] ); - /* this will cause us to keep only the last type we check */ - vbi->program_type = eia608_program_type[ cur ]; - } - } - if( vbi->verbose ) fprintf( stderr, "\n" ); - } else if( packet[ 0 ] < 0x03 && packet[ 1 ] >= 0x10 && packet[ 1 ] <= 0x17 ) { - - if( vbi->program_desc[ packet[1] & 0xf ] && - !strcmp(vbi->program_desc[ packet[1] & 0xf ], packet + 2 ) ) { - return; - } - - if( vbi->verbose ) fprintf( stderr, "Program Description: Line %d", packet[1] & 0xf ); - if( vbi->verbose ) fprintf( stderr, "%s\n", packet + 2 ); - if( vbi->program_desc[ packet[1] & 0xf ] ) - free( vbi->program_desc[ packet[1] & 0xf ] ); - vbi->program_desc[ packet[1] & 0xf ] = strdup( packet + 2 ); - } else if( packet[ 0 ] == 0x01 && packet[ 1 ] == 0x02 ) { - char str[ 33 ]; - str[0] = 0; - if( vbi->verbose ) fprintf( stderr, "Program Length: %02d:%02d", - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - vbi->length_hour = packet[ 3 ] & 63; - vbi->length_min = packet[ 2 ] & 63; - snprintf( str, 32, "%02d:%02d", - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - if( length > 4 ) { - if( vbi->verbose ) fprintf( stderr, " Elapsed: %02d:%02d", packet[ 5 ] & 63, - packet[ 4 ] & 63 ); - vbi->length_elapsed_hour = packet[ 5 ] & 63; - vbi->length_elapsed_min = packet[ 4 ] & 63; - snprintf( str, 32, "%02d:%02d/%02d:%02d", - packet[ 5 ] & 63, packet[ 4 ] & 63, - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - } else { - vbi->length_elapsed_hour = 0; - vbi->length_elapsed_min = 0; - } - - if( length > 6 ) { - if( vbi->verbose ) fprintf( stderr, ".%02d", packet[ 6 ] & 63 ); - vbi->length_elapsed_hour = packet[ 6 ] & 63; - snprintf( str, 32, "%02d:%02d.%02d/%02d:%02d", - packet[ 5 ] & 63, packet[ 4 ] & 63, packet[ 6 ] & 63, - packet[ 3 ] & 63, packet[ 2 ] & 63 ); - } else { - vbi->length_elapsed_hour = 0; - } - /*tvtime_osd_set_show_length( vbi->osd, str );*/ - if( vbi->verbose ) fprintf( stderr, "\n" ); - } else if( packet[ 0 ] == 0x05 && packet[ 1 ] == 0x04 ) { - if( vbi->verbose ) fprintf( stderr, "Transmission Signal Identifier (TSID): 0x%04x\n", - packet[ 2 ] << 24 | packet[ 3 ] << 16 | packet[ 4 ] << 8 | packet[ 5 ] ); - } else { - /* unknown */ - - if( vbi->verbose ) fprintf( stderr, "Unknown XDS packet, class " ); - switch( packet[ 0 ] ) { - case 0x1: if( vbi->verbose ) fprintf( stderr, "CURRENT start\n" ); break; - case 0x2: if( vbi->verbose ) fprintf( stderr, "CURRENT continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Network name: '%s'\n", packet + 2); + if (vbi->network_name) + free (vbi->network_name); + vbi->network_name = strdup (packet + 2); + /*tvtime_osd_set_network_name( vbi->osd, vbi->network_name ); */ + } else if (packet[0] == 0x01 && packet[1] == 0x05) { + int movie_rating = packet[2] & 7; + int scheme = (packet[2] & 56) >> 3; + int tv_rating = packet[3] & 7; + int VSL = packet[3] & 56; + const char *str; + + switch (VSL | scheme) { + case 3: /* Canadian English TV */ + str = cane_tv[tv_rating]; + break; + case 7: /* Canadian French TV */ + str = canf_tv[tv_rating]; + break; + case 19: /* Reserved */ + case 31: + str = ""; + break; + default: + if (((VSL | scheme) & 3) == 1) { + /* USA TV */ + str = usa_tv[tv_rating]; + } else { + /* MPAA Movie Rating */ + str = movies[movie_rating]; + } + break; + } - case 0x3: if( vbi->verbose ) fprintf( stderr, "FUTURE start\n" ); break; - case 0x4: if( vbi->verbose ) fprintf( stderr, "FUTURE continue\n" ); break; + if (vbi->rating && !strcmp (vbi->rating, str)) { + return; + } - case 0x5: if( vbi->verbose ) fprintf( stderr, "CHANNEL start\n" ); break; - case 0x6: if( vbi->verbose ) fprintf( stderr, "CHANNEL continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Show rating: %s", str); + if (((VSL | scheme) & 3) == 1 || ((VSL | scheme) & 3) == 0) { + /* show VSLD for the americans */ + if ((VSL | scheme) & 32) { + if (vbi->verbose) + fprintf (stderr, " V"); + } + if ((VSL | scheme) & 16) { + if (vbi->verbose) + fprintf (stderr, " S"); + } + if ((VSL | scheme) & 8) { + if (vbi->verbose) + fprintf (stderr, " L"); + } + if ((VSL | scheme) & 4) { + if (vbi->verbose) + fprintf (stderr, " D"); + } + } + if (vbi->verbose) + fprintf (stderr, "\n"); + vbi->rating = str; + /*tvtime_osd_set_show_rating( vbi->osd, vbi->rating ); */ + } else if (packet[0] == 0x05 && packet[1] == 0x02) { + if (vbi->call_letters && !strcmp (vbi->call_letters, packet + 2)) { + return; + } - case 0x7: if( vbi->verbose ) fprintf( stderr, "MISC start\n" ); break; - case 0x8: if( vbi->verbose ) fprintf( stderr, "MISC continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Network call letters: '%s'\n", packet + 2); + if (vbi->call_letters) + free (vbi->call_letters); + vbi->call_letters = strdup (packet + 2); + /*tvtime_osd_set_network_call( vbi->osd, vbi->call_letters ); */ + } else if (packet[0] == 0x01 && packet[1] == 0x01) { + int month = packet[5]; // & 15; + int day = packet[4]; // & 31; + int hour = packet[3]; // & 31; + int min = packet[2]; // & 63; + char str[33]; + + if (vbi->verbose) + fprintf (stderr, "Program Start: %02d %s, %02d:%02d\n", + day & 31, months[month & 15], hour & 31, min & 63); + // packet[ 3 ], packet[ 4 ], packet[ 5 ], packet[ 6 ] ); + //packet[ 5 ] & 31, packet[ 6 ], packet[ 4 ] & 31, packet[ 3 ] & 63 ); + vbi->start_month = month & 15; + vbi->start_day = day & 31; + vbi->start_hour = hour & 31; + vbi->start_min = hour & 63; + snprintf (str, 32, "%02d %s, %02d:%02d", + day & 31, months[month & 15], hour & 31, min & 63); + /*tvtime_osd_set_show_start( vbi->osd, str ); */ + } else if (packet[0] == 0x01 && packet[1] == 0x04) { + if (vbi->verbose) + fprintf (stderr, "Program type: "); + for (i = 0; i < length - 2; i++) { + int cur = packet[2 + i] - 0x20; + + if (cur >= 0 && cur < 96) { + if (vbi->verbose) + fprintf (stderr, "%s%s", i ? ", " : "", eia608_program_type[cur]); + /* this will cause us to keep only the last type we check */ + vbi->program_type = eia608_program_type[cur]; + } + } + if (vbi->verbose) + fprintf (stderr, "\n"); + } else if (packet[0] < 0x03 && packet[1] >= 0x10 && packet[1] <= 0x17) { - case 0x9: if( vbi->verbose ) fprintf( stderr, "PUB start\n" ); break; - case 0xa: if( vbi->verbose ) fprintf( stderr, "PUB continue\n" ); break; + if (vbi->program_desc[packet[1] & 0xf] && + !strcmp (vbi->program_desc[packet[1] & 0xf], packet + 2)) { + return; + } - case 0xb: if( vbi->verbose ) fprintf( stderr, "RES start\n" ); break; - case 0xc: if( vbi->verbose ) fprintf( stderr, "RES continue\n" ); break; + if (vbi->verbose) + fprintf (stderr, "Program Description: Line %d", packet[1] & 0xf); + if (vbi->verbose) + fprintf (stderr, "%s\n", packet + 2); + if (vbi->program_desc[packet[1] & 0xf]) + free (vbi->program_desc[packet[1] & 0xf]); + vbi->program_desc[packet[1] & 0xf] = strdup (packet + 2); + } else if (packet[0] == 0x01 && packet[1] == 0x02) { + char str[33]; + + str[0] = 0; + if (vbi->verbose) + fprintf (stderr, "Program Length: %02d:%02d", + packet[3] & 63, packet[2] & 63); + vbi->length_hour = packet[3] & 63; + vbi->length_min = packet[2] & 63; + snprintf (str, 32, "%02d:%02d", packet[3] & 63, packet[2] & 63); + if (length > 4) { + if (vbi->verbose) + fprintf (stderr, " Elapsed: %02d:%02d", packet[5] & 63, packet[4] & 63); + vbi->length_elapsed_hour = packet[5] & 63; + vbi->length_elapsed_min = packet[4] & 63; + snprintf (str, 32, "%02d:%02d/%02d:%02d", + packet[5] & 63, packet[4] & 63, packet[3] & 63, packet[2] & 63); + } else { + vbi->length_elapsed_hour = 0; + vbi->length_elapsed_min = 0; + } - case 0xd: if( vbi->verbose ) fprintf( stderr, "UNDEF start\n" ); break; - case 0xe: if( vbi->verbose ) fprintf( stderr, "UNDEF continue\n" ); break; - } - for( i = 0; i < length; i++ ) { - if( vbi->verbose ) fprintf( stderr, "0x%02x ", packet[ i ] ); - } - if( vbi->verbose ) fprintf( stderr, "\n" ); + if (length > 6) { + if (vbi->verbose) + fprintf (stderr, ".%02d", packet[6] & 63); + vbi->length_elapsed_hour = packet[6] & 63; + snprintf (str, 32, "%02d:%02d.%02d/%02d:%02d", + packet[5] & 63, packet[4] & 63, packet[6] & 63, + packet[3] & 63, packet[2] & 63); + } else { + vbi->length_elapsed_hour = 0; } + /*tvtime_osd_set_show_length( vbi->osd, str ); */ + if (vbi->verbose) + fprintf (stderr, "\n"); + } else if (packet[0] == 0x05 && packet[1] == 0x04) { + if (vbi->verbose) + fprintf (stderr, "Transmission Signal Identifier (TSID): 0x%04x\n", + packet[2] << 24 | packet[3] << 16 | packet[4] << 8 | packet[5]); + } else { + /* unknown */ + + if (vbi->verbose) + fprintf (stderr, "Unknown XDS packet, class "); + switch (packet[0]) { + case 0x1: + if (vbi->verbose) + fprintf (stderr, "CURRENT start\n"); + break; + case 0x2: + if (vbi->verbose) + fprintf (stderr, "CURRENT continue\n"); + break; + + case 0x3: + if (vbi->verbose) + fprintf (stderr, "FUTURE start\n"); + break; + case 0x4: + if (vbi->verbose) + fprintf (stderr, "FUTURE continue\n"); + break; + + case 0x5: + if (vbi->verbose) + fprintf (stderr, "CHANNEL start\n"); + break; + case 0x6: + if (vbi->verbose) + fprintf (stderr, "CHANNEL continue\n"); + break; + + case 0x7: + if (vbi->verbose) + fprintf (stderr, "MISC start\n"); + break; + case 0x8: + if (vbi->verbose) + fprintf (stderr, "MISC continue\n"); + break; + + case 0x9: + if (vbi->verbose) + fprintf (stderr, "PUB start\n"); + break; + case 0xa: + if (vbi->verbose) + fprintf (stderr, "PUB continue\n"); + break; + + case 0xb: + if (vbi->verbose) + fprintf (stderr, "RES start\n"); + break; + case 0xc: + if (vbi->verbose) + fprintf (stderr, "RES continue\n"); + break; + + case 0xd: + if (vbi->verbose) + fprintf (stderr, "UNDEF start\n"); + break; + case 0xe: + if (vbi->verbose) + fprintf (stderr, "UNDEF continue\n"); + break; + } + for (i = 0; i < length; i++) { + if (vbi->verbose) + fprintf (stderr, "0x%02x ", packet[i]); + } + if (vbi->verbose) + fprintf (stderr, "\n"); + } } -static int xds_decode( vbidata_t *vbi, int b1, int b2 ) +static int +xds_decode (vbidata_t * vbi, int b1, int b2) { - if( !vbi ) return 0; - if( vbi->xds_cursor > 2046 ) { - vbi->xds_cursor = 0; - } + if (!vbi) + return 0; + if (vbi->xds_cursor > 2046) { + vbi->xds_cursor = 0; + } - if( !vbi->xds_cursor && b1 > 0xf ) { - return 0; - } + if (!vbi->xds_cursor && b1 > 0xf) { + return 0; + } - if( b1 < 0xf && (b1 & 0x2) ) { - /* ignore the continue and thus 'support' continuation of - a single packet */ - return 1; - } else if( b1 < 0xf ) { - /* kill old packet cause we got a new one */ - vbi->xds_cursor = 0; - } + if (b1 < 0xf && (b1 & 0x2)) { + /* ignore the continue and thus 'support' continuation of + a single packet */ + return 1; + } else if (b1 < 0xf) { + /* kill old packet cause we got a new one */ + vbi->xds_cursor = 0; + } - vbi->xds_packet[ vbi->xds_cursor ] = b1; - vbi->xds_packet[ vbi->xds_cursor + 1 ] = b2; - vbi->xds_cursor += 2; + vbi->xds_packet[vbi->xds_cursor] = b1; + vbi->xds_packet[vbi->xds_cursor + 1] = b2; + vbi->xds_cursor += 2; - if( b1 == 0xf ) { - parse_xds_packet( vbi, vbi->xds_packet, vbi->xds_cursor ); - vbi->xds_cursor = 0; - } + if (b1 == 0xf) { + parse_xds_packet (vbi, vbi->xds_packet, vbi->xds_cursor); + vbi->xds_cursor = 0; + } - return 1; + return 1; } #define NOMODE 0 @@ -473,33 +553,33 @@ static int xds_decode( vbidata_t *vbi, int b1, int b2 ) #define T3 3 #define T4 4 -const unsigned int colours[] = { - 0xFFFFFFFFU, /* white */ - 0xFF00FF00U, /* green */ - 0xFF0000FFU, /* blue */ - 0xFF00C7C7U, /* cyan */ - 0xFFFF0000U, /* red */ - 0xFFFFFF00U, /* yellow */ - 0xFFC700C7U /* magenta */ +const unsigned int colours[] = { + 0xFFFFFFFFU, /* white */ + 0xFF00FF00U, /* green */ + 0xFF0000FFU, /* blue */ + 0xFF00C7C7U, /* cyan */ + 0xFFFF0000U, /* red */ + 0xFFFFFF00U, /* yellow */ + 0xFFC700C7U /* magenta */ }; const int rows[] = { - 11, - 0, /* unused */ - 1, - 2, - 3, - 4, - 12, - 13, - 14, - 15, - 5, - 6, - 7, - 8, - 9, - 10 + 11, + 0, /* unused */ + 1, + 2, + 3, + 4, + 12, + 13, + 14, + 15, + 5, + 6, + 7, + 8, + 9, + 10 }; #define ROLL_2 6 @@ -509,580 +589,610 @@ const int rows[] = { #define PAINT_ON 10 -static int Process16b( vbidata_t *vbi, int bottom, int w1 ) +static int +Process16b (vbidata_t * vbi, int bottom, int w1) { - int b1, b2; + int b1, b2; - b1 = w1 & 0x7f; - b2 = (w1 >> 8) & 0x7f; + b1 = w1 & 0x7f; + b2 = (w1 >> 8) & 0x7f; - if( !b1 && !b2 ) { - return 0; + if (!b1 && !b2) { + return 0; + } + + if (vbi->enabled && b1 >= 0x10 && b1 <= 0x1F && b2 >= 0x20 && b2 <= 0x7F) { + int code; + + if ((b2 & 64)) { + /* Preamble Code */ + /* This sets up colors and indenting */ + + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + + vbi->current_chan = (b1 & 8) >> 3; + if (!bottom == vbi->wanttop) { + if (vbi->chan != vbi->current_chan) + return 0; + } else + return 0; + + vbi->current_ital = (b2 & 1); + if (!(b2 & 16)) { + vbi->current_colour = colours[(b2 & 30) >> 1]; + vbi->current_indent = 0; + } else { + vbi->current_colour = 0xFFFFFFFFU; /* white */ + vbi->current_indent = 4 * ((b2 & 14) >> 1); + } + vbi->current_row = rows[((b1 & 7) << 1) | ((b2 & 32) >> 5)]; + vbi->current_ul = b2 & 1; + + if (vbi->verbose) + fprintf (stderr, "field: %d chan %d, ital %d, ul %d, colour 0x%x, " + "indent %d, row %d\n", bottom, vbi->current_chan, + vbi->current_ital, vbi->current_ul, vbi->current_colour, + vbi->current_indent, vbi->current_row); + + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + + vbiscreen_new_caption (vbi->vs, vbi->indent, vbi->ital, + vbi->colour, vbi->row); + + } + + vbi->lastcode = (b1 << 8) | b2; + vbi->lastcount = 0; + return 1; } - if( vbi->enabled && - b1 >= 0x10 && b1 <= 0x1F && b2 >= 0x20 && b2 <= 0x7F ) { - int code; - if( (b2 & 64) ) { - /* Preamble Code */ - /* This sets up colors and indenting */ - - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - vbi->current_chan = (b1 & 8) >> 3; - if( !bottom == vbi->wanttop ) { - if( vbi->chan != vbi->current_chan ) - return 0; - } else return 0; - - vbi->current_ital = (b2 & 1); - if( !(b2 & 16) ) { - vbi->current_colour = colours[ (b2 & 30) >> 1 ]; - vbi->current_indent = 0; - } else { - vbi->current_colour = 0xFFFFFFFFU; /* white */ - vbi->current_indent = 4*( (b2 & 14) >> 1 ); - } - vbi->current_row = rows[ ((b1 & 7) << 1) | ((b2 & 32) >> 5) ]; - vbi->current_ul = b2 & 1; - - if( vbi->verbose ) fprintf( stderr, "field: %d chan %d, ital %d, ul %d, colour 0x%x, " - "indent %d, row %d\n", bottom, vbi->current_chan, - vbi->current_ital, vbi->current_ul, vbi->current_colour, - vbi->current_indent, vbi->current_row ); - - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - - vbiscreen_new_caption( vbi->vs, vbi->indent, vbi->ital, - vbi->colour, vbi->row ); - - } - - vbi->lastcode = ( b1 << 8) | b2; - vbi->lastcount = 0; - return 1; - } - - if( (b1 & 8) == 1 ) { - /* Midrow code */ - if( !vbi->initialised ) return 0; - - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - if( vbi->verbose ) fprintf( stderr, "Midrow TODO: Add me.\n" ); - - vbi->lastcode = ( b1 << 8) | b2; - return 1; - } - - if( (b1 & 2) && !(b2 & 64) ) { - if( !vbi->initialised ) return 0; - - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - if( vbi->verbose ) fprintf( stderr, "Tab Offset: %d columns\n", b2 & 3 ); - if( vbi->wanttext && vbi->current_istext && - vbi->current_chan == vbi->chan && !bottom == vbi->wanttop ) { - vbiscreen_tab( vbi->vs, b2 & 3 ); - } - vbi->lastcode = ( b1 << 8) | b2; - return 1; - } - - switch( (code = b2 & 15) ) { - case 0: /* POP-UP */ - case 5: /* ROLL UP 2 */ - case 6: /* ROLL UP 3 */ - case 7: /* ROLL UP 4 */ - case 9: /* PAINT-ON */ - case 10:/* TEXT */ - case 11:/* TEXT */ - vbi->initialised = 1; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - /* This is the repeated Control Code */ - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - switch( code ) { - case 0: /* POP-UP */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Pop-Up\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, POP_UP ); - } - break; - case 5: /* ROLL UP 2 */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Roll-Up 2 (RU2)\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, ROLL_2 ); - } - break; - case 6: /* ROLL UP 3 */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Roll-Up 3 (RU3)\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, ROLL_3 ); - } - break; - case 7: /* ROLL UP 4 */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Roll-Up 4 (RU4)\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, ROLL_4 ); - } - break; - case 9: /* PAINT-ON */ - if( !vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Paint-On\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 0; - vbiscreen_set_mode( vbi->vs, 1, PAINT_ON ); - } - break; - case 10:/* TEXT */ - if( vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Text Restart\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 1; - vbiscreen_set_mode( vbi->vs, 0, 0 ); - } - break; - case 11:/* TEXT */ - if( vbi->wanttext && vbi->current_chan == vbi->chan && - !bottom == vbi->wanttop ) { - if( vbi->verbose ) - fprintf( stderr, "Resume Text Display\n"); - vbi->indent = vbi->current_indent; - vbi->ital = vbi->current_ital; - vbi->colour = vbi->current_colour; - vbi->row = vbi->current_row; - vbi->current_istext = 1; - vbiscreen_set_mode( vbi->vs, 0, 0 ); - } - break; - default: /* impossible */ - break; - } - break; - case 1: - if( !vbi->initialised ) return 0; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - } - if( !bottom == vbi->wanttop && vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Backspace\n"); - vbiscreen_backspace( vbi->vs ); - } - break; - case 2: - case 3: - if( !vbi->initialised ) return 0; - fprintf( stderr, "Reserved\n"); - break; - case 4: - if( !vbi->initialised ) return 0; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - } - if( !bottom == vbi->wanttop && vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Delete to End of Row\n"); - vbiscreen_delete_to_end( vbi->vs ); - } - break; - case 8: - if( !vbi->initialised ) return 0; - if( vbi->verbose ) - fprintf( stderr, "Flash On\n"); - break; - case 12: - case 13: - case 14: - case 15: - if( !vbi->initialised ) return 0; - if( !bottom && vbi->lastcode == ( (b1 << 8) | b2 ) ) { - vbi->lastcount = (vbi->lastcount + 1) % 2; - return 1; - } - - switch( code ) { - case 12: - /* Show buffer 1, Fill buffer 2 */ - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Erase Displayed Memory\n"); - vbiscreen_erase_displayed( vbi->vs ); - } - break; - case 13: - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Carriage Return\n"); - vbiscreen_carriage_return( vbi->vs ); - } - break; - case 14: - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "Erase Non-Displayed\n"); - vbiscreen_erase_non_displayed( vbi->vs ); - } - break; - case 15: - /* Show buffer 2, Fill Buffer 1 */ - if( !bottom == vbi->wanttop && - vbi->current_chan == vbi->chan && - vbi->current_istext == vbi->wanttext ) { - if( vbi->verbose ) - fprintf( stderr, "End Of Caption\n"); - vbiscreen_end_of_caption( vbi->vs ); - } - break; - default: /* impossible */ - return 0; - break; - } - break; - default: /* Impossible */ - return 0; - break; - } - - if( vbi->lastcode != ((b1 << 8) | b2) ) { - vbi->lastcount = 0; - } - - vbi->lastcode = (b1 << 8) | b2; - return 1; - } + if ((b1 & 8) == 1) { + /* Midrow code */ + if (!vbi->initialised) + return 0; - if( bottom && xds_decode( vbi, b1, b2 ) ) { - return 1; - } + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } - if( !vbi->enabled ) return 0; + if (vbi->verbose) + fprintf (stderr, "Midrow TODO: Add me.\n"); - vbi->lastcode = 0; - vbi->lastcount = 0; + vbi->lastcode = (b1 << 8) | b2; + return 1; + } - if( !vbi->initialised ) - return 0; + if ((b1 & 2) && !(b2 & 64)) { + if (!vbi->initialised) + return 0; + + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + + if (vbi->verbose) + fprintf (stderr, "Tab Offset: %d columns\n", b2 & 3); + if (vbi->wanttext && vbi->current_istext && + vbi->current_chan == vbi->chan && !bottom == vbi->wanttop) { + vbiscreen_tab (vbi->vs, b2 & 3); + } + vbi->lastcode = (b1 << 8) | b2; + return 1; + } - if( !bottom != vbi->wanttop || vbi->current_chan != vbi->chan || - vbi->current_istext != vbi->wanttext ) { - return 0; + switch ((code = b2 & 15)) { + case 0: /* POP-UP */ + case 5: /* ROLL UP 2 */ + case 6: /* ROLL UP 3 */ + case 7: /* ROLL UP 4 */ + case 9: /* PAINT-ON */ + case 10: /* TEXT */ + case 11: /* TEXT */ + vbi->initialised = 1; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + /* This is the repeated Control Code */ + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + switch (code) { + case 0: /* POP-UP */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Pop-Up\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, POP_UP); + } + break; + case 5: /* ROLL UP 2 */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Roll-Up 2 (RU2)\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, ROLL_2); + } + break; + case 6: /* ROLL UP 3 */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Roll-Up 3 (RU3)\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, ROLL_3); + } + break; + case 7: /* ROLL UP 4 */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Roll-Up 4 (RU4)\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, ROLL_4); + } + break; + case 9: /* PAINT-ON */ + if (!vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Paint-On\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 0; + vbiscreen_set_mode (vbi->vs, 1, PAINT_ON); + } + break; + case 10: /* TEXT */ + if (vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Text Restart\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 1; + vbiscreen_set_mode (vbi->vs, 0, 0); + } + break; + case 11: /* TEXT */ + if (vbi->wanttext && vbi->current_chan == vbi->chan && + !bottom == vbi->wanttop) { + if (vbi->verbose) + fprintf (stderr, "Resume Text Display\n"); + vbi->indent = vbi->current_indent; + vbi->ital = vbi->current_ital; + vbi->colour = vbi->current_colour; + vbi->row = vbi->current_row; + vbi->current_istext = 1; + vbiscreen_set_mode (vbi->vs, 0, 0); + } + break; + default: /* impossible */ + break; + } + break; + case 1: + if (!vbi->initialised) + return 0; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + } + if (!bottom == vbi->wanttop && vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Backspace\n"); + vbiscreen_backspace (vbi->vs); + } + break; + case 2: + case 3: + if (!vbi->initialised) + return 0; + fprintf (stderr, "Reserved\n"); + break; + case 4: + if (!vbi->initialised) + return 0; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + } + if (!bottom == vbi->wanttop && vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Delete to End of Row\n"); + vbiscreen_delete_to_end (vbi->vs); + } + break; + case 8: + if (!vbi->initialised) + return 0; + if (vbi->verbose) + fprintf (stderr, "Flash On\n"); + break; + case 12: + case 13: + case 14: + case 15: + if (!vbi->initialised) + return 0; + if (!bottom && vbi->lastcode == ((b1 << 8) | b2)) { + vbi->lastcount = (vbi->lastcount + 1) % 2; + return 1; + } + + switch (code) { + case 12: + /* Show buffer 1, Fill buffer 2 */ + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Erase Displayed Memory\n"); + vbiscreen_erase_displayed (vbi->vs); + } + break; + case 13: + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Carriage Return\n"); + vbiscreen_carriage_return (vbi->vs); + } + break; + case 14: + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "Erase Non-Displayed\n"); + vbiscreen_erase_non_displayed (vbi->vs); + } + break; + case 15: + /* Show buffer 2, Fill Buffer 1 */ + if (!bottom == vbi->wanttop && + vbi->current_chan == vbi->chan && + vbi->current_istext == vbi->wanttext) { + if (vbi->verbose) + fprintf (stderr, "End Of Caption\n"); + vbiscreen_end_of_caption (vbi->vs); + } + break; + default: /* impossible */ + return 0; + break; + } + break; + default: /* Impossible */ + return 0; + break; } - if( b1 == 0x11 || b1 == 0x19 || - b1 == 0x12 || b1 == 0x13 || - b1 == 0x1A || b1 == 0x1B ) { - switch( b1 ) { - case 0x1A: - case 0x12: - /* use extcode1 */ - if( b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F ) - if( vbi->verbose ) - fprintf( stderr, "char %d (%c), char %d (%c)\n", b1, - extcode1[b1-32] , b2, extcode1[b2-32] ); - - break; - case 0x13: - case 0x1B: - /* use extcode2 */ - if( b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F ) - if( vbi->verbose ) - fprintf( stderr, "char %d (%c), char %d (%c)\n", b1, - extcode2[b1-32] , b2, extcode2[b2-32] ); - - break; - case 0x11: - case 0x19: - /* use wcode */ - if( b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F ) - if( vbi->verbose ) - fprintf( stderr, "char %d (%c), char %d (%c)\n", b1, - wccode[b1-32] , b2, wccode[b2-32] ); - - break; - default: - break; - } - } else if( b1 ) { - /* use ccode */ - if( b1 < 32 ) b1 = 32; - if( b2 < 32 ) b2 = 32; - if( vbi->verbose ) - fprintf( stderr, "vbidata: data: %c %c\n", ccode[b1-32], - ccode[b2-32] ); - vbiscreen_print( vbi->vs, ccode[b1-32], ccode[b2-32] ); + if (vbi->lastcode != ((b1 << 8) | b2)) { + vbi->lastcount = 0; } + vbi->lastcode = (b1 << 8) | b2; + return 1; + } + if (bottom && xds_decode (vbi, b1, b2)) { return 1; + } + + if (!vbi->enabled) + return 0; + + vbi->lastcode = 0; + vbi->lastcount = 0; + + if (!vbi->initialised) + return 0; + + if (!bottom != vbi->wanttop || vbi->current_chan != vbi->chan || + vbi->current_istext != vbi->wanttext) { + return 0; + } + + if (b1 == 0x11 || b1 == 0x19 || + b1 == 0x12 || b1 == 0x13 || b1 == 0x1A || b1 == 0x1B) { + switch (b1) { + case 0x1A: + case 0x12: + /* use extcode1 */ + if (b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F) + if (vbi->verbose) + fprintf (stderr, "char %d (%c), char %d (%c)\n", b1, + extcode1[b1 - 32], b2, extcode1[b2 - 32]); + + break; + case 0x13: + case 0x1B: + /* use extcode2 */ + if (b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F) + if (vbi->verbose) + fprintf (stderr, "char %d (%c), char %d (%c)\n", b1, + extcode2[b1 - 32], b2, extcode2[b2 - 32]); + + break; + case 0x11: + case 0x19: + /* use wcode */ + if (b1 > 31 && b2 > 31 && b1 <= 0x3F && b2 <= 0x3F) + if (vbi->verbose) + fprintf (stderr, "char %d (%c), char %d (%c)\n", b1, + wccode[b1 - 32], b2, wccode[b2 - 32]); + + break; + default: + break; + } + } else if (b1) { + /* use ccode */ + if (b1 < 32) + b1 = 32; + if (b2 < 32) + b2 = 32; + if (vbi->verbose) + fprintf (stderr, "vbidata: data: %c %c\n", ccode[b1 - 32], + ccode[b2 - 32]); + vbiscreen_print (vbi->vs, ccode[b1 - 32], ccode[b2 - 32]); + } + + + return 1; } /* Process16b */ -int ProcessLine( vbidata_t *vbi, unsigned char *s, int bottom ) +int +ProcessLine (vbidata_t * vbi, unsigned char *s, int bottom) { - int w1; - /*char *outbuf = NULL;*/ + int w1; - if( !vbi ) return 0; + /*char *outbuf = NULL; */ - w1 = ccdecode(s); + if (!vbi) + return 0; - return Process16b(vbi, bottom, w1); + w1 = ccdecode (s); + + return Process16b (vbi, bottom, w1); } /* ProcessLine */ -vbidata_t *vbidata_new_file( const char *filename, vbiscreen_t *vs, - /*tvtime_osd_t* osd,*/ int verbose ) +vbidata_t * +vbidata_new_file (const char *filename, vbiscreen_t * vs, + /*tvtime_osd_t* osd, */ int verbose) { - vbidata_t *vbi = (vbidata_t *) malloc( sizeof( vbidata_t ) ); - if( !vbi ) { - return 0; - } + vbidata_t *vbi = (vbidata_t *) malloc (sizeof (vbidata_t)); - vbi->fd = open( filename, O_RDONLY ); - if( vbi->fd < 0 ) { - fprintf( stderr, "vbidata: Can't open %s: %s\n", - filename, strerror( errno ) ); - free( vbi ); - return 0; - } + if (!vbi) { + return 0; + } + + vbi->fd = open (filename, O_RDONLY); + if (vbi->fd < 0) { + fprintf (stderr, "vbidata: Can't open %s: %s\n", + filename, strerror (errno)); + free (vbi); + return 0; + } - vbi->vs = vs; - /*vbi->osd = osd;*/ - vbi->verbose = verbose; + vbi->vs = vs; + /*vbi->osd = osd; */ + vbi->verbose = verbose; - vbidata_reset( vbi ); + vbidata_reset (vbi); - return vbi; + return vbi; } -vbidata_t *vbidata_new_line( vbiscreen_t *vs, int verbose ) +vbidata_t * +vbidata_new_line (vbiscreen_t * vs, int verbose) { - vbidata_t *vbi = (vbidata_t *) malloc( sizeof( vbidata_t ) ); - if( !vbi ) { - return 0; - } + vbidata_t *vbi = (vbidata_t *) malloc (sizeof (vbidata_t)); + + if (!vbi) { + return 0; + } - vbi->vs = vs; - /*vbi->osd = osd;*/ - vbi->verbose = verbose; + vbi->vs = vs; + /*vbi->osd = osd; */ + vbi->verbose = verbose; - vbidata_reset( vbi ); + vbidata_reset (vbi); - return vbi; + return vbi; } -void vbidata_delete( vbidata_t *vbi ) +void +vbidata_delete (vbidata_t * vbi) { - if( !vbi ) return; - if( vbi->fd != 0 ) { - close( vbi->fd ); - } - free( vbi ); + if (!vbi) + return; + if (vbi->fd != 0) { + close (vbi->fd); + } + free (vbi); } -void vbidata_reset( vbidata_t *vbi ) +void +vbidata_reset (vbidata_t * vbi) { - if( !vbi ) return; - - vbi->wanttop = 0; - vbi->wanttext = 0; - vbi->colour = 0xFFFFFFFFU; - vbi->row = 0; - - vbi->ital = 0; - vbi->indent = 0; - vbi->ul=0; - - vbi->chan=0; - - vbi->initialised = 0; - vbi->enabled = 0; - - memset(vbi->program_desc, 0, 8*sizeof(char*) ); - vbi->program_name = NULL; - vbi->network_name = NULL; - vbi->call_letters = NULL; - vbi->rating = NULL; - vbi->program_type = NULL; - - vbi->start_day = 0; - vbi->start_month = 0; - vbi->start_min = 0; - vbi->start_hour = 0; - vbi->length_hour = 0; - vbi->length_min = 0; - vbi->length_elapsed_hour = 0; - vbi->length_elapsed_min = 0; - vbi->length_elapsed_sec = 0; - - /* - tvtime_osd_set_network_call( vbi->osd, "" ); - tvtime_osd_set_network_name( vbi->osd, "" ); - tvtime_osd_set_show_name( vbi->osd, "" ); - tvtime_osd_set_show_rating( vbi->osd, "" ); - tvtime_osd_set_show_start( vbi->osd, "" ); - tvtime_osd_set_show_length( vbi->osd, "" ); - */ - - - - vbi->lastcode = 0; - vbi->lastcount = 0; - vbi->xds_packet[ 0 ] = 0; - vbi->xds_cursor = 0; - vbiscreen_reset( vbi->vs ); + if (!vbi) + return; + + vbi->wanttop = 0; + vbi->wanttext = 0; + vbi->colour = 0xFFFFFFFFU; + vbi->row = 0; + + vbi->ital = 0; + vbi->indent = 0; + vbi->ul = 0; + + vbi->chan = 0; + + vbi->initialised = 0; + vbi->enabled = 0; + + memset (vbi->program_desc, 0, 8 * sizeof (char *)); + vbi->program_name = NULL; + vbi->network_name = NULL; + vbi->call_letters = NULL; + vbi->rating = NULL; + vbi->program_type = NULL; + + vbi->start_day = 0; + vbi->start_month = 0; + vbi->start_min = 0; + vbi->start_hour = 0; + vbi->length_hour = 0; + vbi->length_min = 0; + vbi->length_elapsed_hour = 0; + vbi->length_elapsed_min = 0; + vbi->length_elapsed_sec = 0; + + /* + tvtime_osd_set_network_call( vbi->osd, "" ); + tvtime_osd_set_network_name( vbi->osd, "" ); + tvtime_osd_set_show_name( vbi->osd, "" ); + tvtime_osd_set_show_rating( vbi->osd, "" ); + tvtime_osd_set_show_start( vbi->osd, "" ); + tvtime_osd_set_show_length( vbi->osd, "" ); + */ + + + + vbi->lastcode = 0; + vbi->lastcount = 0; + vbi->xds_packet[0] = 0; + vbi->xds_cursor = 0; + vbiscreen_reset (vbi->vs); } -void vbidata_set_verbose( vbidata_t *vbi, int verbose ) +void +vbidata_set_verbose (vbidata_t * vbi, int verbose) { - vbi->verbose = verbose; + vbi->verbose = verbose; } -void vbidata_capture_mode( vbidata_t *vbi, int mode ) +void +vbidata_capture_mode (vbidata_t * vbi, int mode) { - if( !vbi ) return; - switch( mode ) { + if (!vbi) + return; + switch (mode) { case CAPTURE_OFF: - vbi->enabled = 0; - break; + vbi->enabled = 0; + break; case CAPTURE_CC1: - vbi->wanttop = 1; - vbi->wanttext = 0; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 0; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_CC2: - vbi->wanttop = 1; - vbi->wanttext = 0; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 0; + vbi->chan = 1; + vbi->enabled = 1; + break; case CAPTURE_CC3: - vbi->wanttop = 0; - vbi->wanttext = 0; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 0; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_CC4: - vbi->wanttop = 0; - vbi->wanttext = 0; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 0; + vbi->chan = 1; + vbi->enabled = 1; + break; case CAPTURE_T1: - vbi->wanttop = 1; - vbi->wanttext = 1; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 1; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_T2: - vbi->wanttop = 1; - vbi->wanttext = 1; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 1; + vbi->wanttext = 1; + vbi->chan = 1; + vbi->enabled = 1; + break; case CAPTURE_T3: - vbi->wanttop = 0; - vbi->wanttext = 1; - vbi->chan = 0; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 1; + vbi->chan = 0; + vbi->enabled = 1; + break; case CAPTURE_T4: - vbi->wanttop = 0; - vbi->wanttext = 1; - vbi->chan = 1; - vbi->enabled = 1; - break; + vbi->wanttop = 0; + vbi->wanttext = 1; + vbi->chan = 1; + vbi->enabled = 1; + break; default: - vbi->enabled = 0; - break; - } + vbi->enabled = 0; + break; + } } -void vbidata_process_frame( vbidata_t *vbi, int printdebug ) +void +vbidata_process_frame (vbidata_t * vbi, int printdebug) { - if( read( vbi->fd, vbi->buf, 65536 ) < 65536 ) { - fprintf( stderr, "error, can't read vbi data.\n" ); - return; - } + if (read (vbi->fd, vbi->buf, 65536) < 65536) { + fprintf (stderr, "error, can't read vbi data.\n"); + return; + } - ProcessLine( vbi, &vbi->buf[ DO_LINE*2048 ], 0 ); - ProcessLine( vbi, &vbi->buf[ (16+DO_LINE)*2048 ], 1 ); + ProcessLine (vbi, &vbi->buf[DO_LINE * 2048], 0); + ProcessLine (vbi, &vbi->buf[(16 + DO_LINE) * 2048], 1); } -void vbidata_process_line( vbidata_t *vbi, unsigned char *s, int bottom) +void +vbidata_process_line (vbidata_t * vbi, unsigned char *s, int bottom) { - ProcessLine( vbi, s, bottom ); + ProcessLine (vbi, s, bottom); } -void vbidata_process_16b( vbidata_t *vbi, int bottom, int w) +void +vbidata_process_16b (vbidata_t * vbi, int bottom, int w) { - Process16b( vbi, bottom, w ); + Process16b (vbi, bottom, w); } - diff --git a/gst/vbidec/vbidata.h b/gst/vbidec/vbidata.h index 66b2cc3c..78d902af 100644 --- a/gst/vbidec/vbidata.h +++ b/gst/vbidec/vbidata.h @@ -44,16 +44,16 @@ typedef struct vbidata_s vbidata_t; #define CAPTURE_T3 8 #define CAPTURE_T4 9 -vbidata_t *vbidata_new_file( const char *filename, vbiscreen_t *vs, - /*tvtime_osd_t* osd,*/ int verbose ); -vbidata_t *vbidata_new_line( vbiscreen_t *vs, int verbose ); +vbidata_t *vbidata_new_file (const char *filename, vbiscreen_t * vs, + /*tvtime_osd_t* osd, */ int verbose); +vbidata_t *vbidata_new_line (vbiscreen_t * vs, int verbose); -void vbidata_delete( vbidata_t *vbi ); -void vbidata_reset( vbidata_t *vbi ); -void vbidata_set_verbose( vbidata_t *vbi, int verbose ); -void vbidata_capture_mode( vbidata_t *vbi, int mode ); -void vbidata_process_frame( vbidata_t *vbi, int printdebug ); -void vbidata_process_line( vbidata_t *vbi, unsigned char *s, int bottom ); -void vbidata_process_16b( vbidata_t *vbi, int bottom, int w ); +void vbidata_delete (vbidata_t * vbi); +void vbidata_reset (vbidata_t * vbi); +void vbidata_set_verbose (vbidata_t * vbi, int verbose); +void vbidata_capture_mode (vbidata_t * vbi, int mode); +void vbidata_process_frame (vbidata_t * vbi, int printdebug); +void vbidata_process_line (vbidata_t * vbi, unsigned char *s, int bottom); +void vbidata_process_16b (vbidata_t * vbi, int bottom, int w); #endif /* VBIDATA_H_INCLUDED */ diff --git a/gst/vbidec/vbiscreen.c b/gst/vbidec/vbiscreen.c index bcce79e2..f441ba78 100644 --- a/gst/vbidec/vbiscreen.c +++ b/gst/vbidec/vbiscreen.c @@ -50,7 +50,8 @@ #define FONT_SIZE 20 typedef struct osd_string_s osd_string_t; -struct osd_string_s { +struct osd_string_s +{ int width; int height; int r, g, b; @@ -58,684 +59,765 @@ struct osd_string_s { GstVBIDec *vbidec; }; -osd_string_t *osd_string_new(char *c, int s, int w, int h, int a, void *user_data) { +osd_string_t * +osd_string_new (char *c, int s, int w, int h, int a, void *user_data) +{ osd_string_t *os; - os = (osd_string_t *)malloc(sizeof(osd_string_t)); + + os = (osd_string_t *) malloc (sizeof (osd_string_t)); if (!os) return NULL; os->width = 0; os->height = 0; os->r = os->g = os->b = 0; os->visible = 1; - os->vbidec = (GstVBIDec *)user_data; + os->vbidec = (GstVBIDec *) user_data; return os; } -void osd_string_show_text(osd_string_t *os, char *s, int len ) { + +void +osd_string_show_text (osd_string_t * os, char *s, int len) +{ /* FIXME: just print data when it gets here */ if (len > 0) { - gst_vbidec_show_text(os->vbidec, s, len); + gst_vbidec_show_text (os->vbidec, s, len); } } -int osd_string_get_height(osd_string_t *os) { +int +osd_string_get_height (osd_string_t * os) +{ return os->height; } -int osd_string_get_width(osd_string_t *os) { + +int +osd_string_get_width (osd_string_t * os) +{ return os->width; } -void osd_string_delete(osd_string_t *os) { - free(os); + +void +osd_string_delete (osd_string_t * os) +{ + free (os); } -void osd_string_set_colour_rgb(osd_string_t *os, int r, int g, int b) { + +void +osd_string_set_colour_rgb (osd_string_t * os, int r, int g, int b) +{ os->r = r; os->g = g; os->b = b; } -void blit_colour_packed422_scanline( unsigned char *d, int w, int luma, int cb, int cr) { + +void +blit_colour_packed422_scanline (unsigned char *d, int w, int luma, int cb, + int cr) +{ } -int osd_string_visible(osd_string_t *os) { +int +osd_string_visible (osd_string_t * os) +{ return os->visible; } -void osd_string_composite_packed422_scanline(osd_string_t *os, unsigned char *a, unsigned char *b, int w, int x, int y) { + +void +osd_string_composite_packed422_scanline (osd_string_t * os, unsigned char *a, + unsigned char *b, int w, int x, int y) +{ } -struct vbiscreen_s { +struct vbiscreen_s +{ + + osd_string_t *line[ROWS]; - osd_string_t *line[ ROWS ]; + char buffers[ROWS * COLS * 2]; + char text[2 * ROWS * COLS]; + char hiddenbuf[COLS]; + char paintbuf[ROWS * COLS]; - char buffers[ ROWS * COLS * 2 ]; - char text[ 2 * ROWS * COLS ]; - char hiddenbuf[ COLS ]; - char paintbuf[ ROWS * COLS ]; + unsigned int fgcolour; + unsigned int bgcolour; + int bg_luma, bg_cb, bg_cr; - unsigned int fgcolour; - unsigned int bgcolour; - int bg_luma, bg_cb, bg_cr; + int frame_width; + int frame_height; + int frame_aspect; - int frame_width; - int frame_height; - int frame_aspect; + int x, y; /* where to draw console */ + int width, height; /* the size box we have to draw in */ + int rowheight, charwidth; - int x, y; /* where to draw console */ - int width, height; /* the size box we have to draw in */ - int rowheight, charwidth; - - int curx, cury; /* cursor position */ - int rows, cols; /* 32 cols 15 rows */ - int captions, style; /* CC (1) or Text (0), RU2 RU3 RU4 POP_UP PAINT_ON */ - int first_line; /* where to start drawing */ - int curbuffer; - int top_of_screen; /* a pointer into line[] */ - int indent; - int got_eoc; - int scroll; + int curx, cury; /* cursor position */ + int rows, cols; /* 32 cols 15 rows */ + int captions, style; /* CC (1) or Text (0), RU2 RU3 RU4 POP_UP PAINT_ON */ + int first_line; /* where to start drawing */ + int curbuffer; + int top_of_screen; /* a pointer into line[] */ + int indent; + int got_eoc; + int scroll; - char *fontfile; - int fontsize; - int verbose; + char *fontfile; + int fontsize; + int verbose; - void *user_data; + void *user_data; }; -vbiscreen_t *vbiscreen_new( int video_width, int video_height, - double video_aspect, int verbose, void *user_data ) +vbiscreen_t * +vbiscreen_new (int video_width, int video_height, + double video_aspect, int verbose, void *user_data) { - int i=0, fontsize = FONT_SIZE; - vbiscreen_t *vs = (vbiscreen_t *)malloc(sizeof(struct vbiscreen_s)); + int i = 0, fontsize = FONT_SIZE; + vbiscreen_t *vs = (vbiscreen_t *) malloc (sizeof (struct vbiscreen_s)); - if( !vs ) { - return NULL; - } + if (!vs) { + return NULL; + } - vs->verbose = verbose; - vs->x = 0; - vs->y = 0; - vs->frame_width = video_width; - vs->frame_height = video_height; - vs->frame_aspect = video_aspect; - vs->curx = 0; - vs->cury = 0; - vs->fgcolour = 0xFFFFFFFFU; /* white */ - vs->bgcolour = 0xFF000000U; /* black */ - vs->bg_luma = 16; - vs->bg_cb = 128; - vs->bg_cr = 128; - vs->rows = ROWS; - vs->cols = COLS; - /*vs->fontfile = DATADIR "/FreeMonoBold.ttf";*/ - vs->fontfile = NULL; - vs->fontsize = fontsize; - vs->width = video_width; - vs->height = video_height; - vs->first_line = 0; - vs->captions = 0; - vs->style = 0; - vs->curbuffer = 0; - vs->top_of_screen = 0; - vs->indent = 0; - memset( vs->buffers, 0, 2 * COLS * ROWS ); - memset( vs->hiddenbuf, 0, COLS ); - memset( vs->paintbuf, 0, ROWS * COLS ); - vs->scroll = 0; - - vs->user_data = user_data; - - vs->line[0] = osd_string_new( vs->fontfile, fontsize, video_width, - video_height, - video_aspect, - user_data); - - if( !vs->line[0] ) { - vs->fontfile = "./FreeMonoBold.ttf"; - - vs->line[0] = osd_string_new( vs->fontfile, fontsize, - video_width, - video_height, - video_aspect, - user_data); - } + vs->verbose = verbose; + vs->x = 0; + vs->y = 0; + vs->frame_width = video_width; + vs->frame_height = video_height; + vs->frame_aspect = video_aspect; + vs->curx = 0; + vs->cury = 0; + vs->fgcolour = 0xFFFFFFFFU; /* white */ + vs->bgcolour = 0xFF000000U; /* black */ + vs->bg_luma = 16; + vs->bg_cb = 128; + vs->bg_cr = 128; + vs->rows = ROWS; + vs->cols = COLS; + /*vs->fontfile = DATADIR "/FreeMonoBold.ttf"; */ + vs->fontfile = NULL; + vs->fontsize = fontsize; + vs->width = video_width; + vs->height = video_height; + vs->first_line = 0; + vs->captions = 0; + vs->style = 0; + vs->curbuffer = 0; + vs->top_of_screen = 0; + vs->indent = 0; + memset (vs->buffers, 0, 2 * COLS * ROWS); + memset (vs->hiddenbuf, 0, COLS); + memset (vs->paintbuf, 0, ROWS * COLS); + vs->scroll = 0; + + vs->user_data = user_data; + + vs->line[0] = osd_string_new (vs->fontfile, fontsize, video_width, + video_height, video_aspect, user_data); + + if (!vs->line[0]) { + vs->fontfile = "./FreeMonoBold.ttf"; + + vs->line[0] = osd_string_new (vs->fontfile, fontsize, + video_width, video_height, video_aspect, user_data); + } - if( !vs->line[0] ) { - fprintf( stderr, "vbiscreen: Could not find my font (%s)!\n", - vs->fontfile ); - vbiscreen_delete( vs ); - return NULL; - } + if (!vs->line[0]) { + fprintf (stderr, "vbiscreen: Could not find my font (%s)!\n", vs->fontfile); + vbiscreen_delete (vs); + return NULL; + } - osd_string_show_text( vs->line[ 0 ], "W", 0 ); - vs->rowheight = osd_string_get_height( vs->line[ 0 ] ); - vs->charwidth = osd_string_get_width( vs->line[ 0 ] ); - osd_string_delete( vs->line[ 0 ] ); - - for( i = 0; i < ROWS; i++ ) { - vs->line[ i ] = osd_string_new( vs->fontfile, fontsize, - video_width, video_height, - video_aspect, - user_data); - if( !vs->line[ i ] ) { - fprintf( stderr, "vbiscreen: Could not allocate a line.\n" ); - vbiscreen_delete( vs ); - return NULL; - } - osd_string_set_colour_rgb( vs->line[ i ], - (vs->fgcolour & 0xff0000) >> 16, - (vs->fgcolour & 0xff00) >> 8, - (vs->fgcolour & 0xff) ); - osd_string_show_text( vs->line[ i ], " ", 0 ); + osd_string_show_text (vs->line[0], "W", 0); + vs->rowheight = osd_string_get_height (vs->line[0]); + vs->charwidth = osd_string_get_width (vs->line[0]); + osd_string_delete (vs->line[0]); + + for (i = 0; i < ROWS; i++) { + vs->line[i] = osd_string_new (vs->fontfile, fontsize, + video_width, video_height, video_aspect, user_data); + if (!vs->line[i]) { + fprintf (stderr, "vbiscreen: Could not allocate a line.\n"); + vbiscreen_delete (vs); + return NULL; } - memset( vs->text, 0, 2 * ROWS * COLS ); - return vs; + osd_string_set_colour_rgb (vs->line[i], + (vs->fgcolour & 0xff0000) >> 16, + (vs->fgcolour & 0xff00) >> 8, (vs->fgcolour & 0xff)); + osd_string_show_text (vs->line[i], " ", 0); + } + memset (vs->text, 0, 2 * ROWS * COLS); + return vs; } -void blank_screen( vbiscreen_t *vs ) +void +blank_screen (vbiscreen_t * vs) { - int i; + int i; - if( vs->verbose ) fprintf( stderr, "in blank\n"); - for( i = 0; i < ROWS; i++ ) { - osd_string_show_text( vs->line[ i ], " ", 0 ); - } + if (vs->verbose) + fprintf (stderr, "in blank\n"); + for (i = 0; i < ROWS; i++) { + osd_string_show_text (vs->line[i], " ", 0); + } } -void clear_screen( vbiscreen_t *vs ) +void +clear_screen (vbiscreen_t * vs) { - int base, i; - if( !vs ) return; + int base, i; - base = vs->top_of_screen * COLS; - for( i = 0; i < ROWS * COLS; i++ ) { - vs->text[ base ] = 0; - base++; - base %= 2 * ROWS * COLS; - } - blank_screen( vs ); + if (!vs) + return; + + base = vs->top_of_screen * COLS; + for (i = 0; i < ROWS * COLS; i++) { + vs->text[base] = 0; + base++; + base %= 2 * ROWS * COLS; + } + blank_screen (vs); } -void clear_hidden_roll( vbiscreen_t *vs ) +void +clear_hidden_roll (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->hiddenbuf, 0, COLS ); + if (!vs) + return; + memset (vs->hiddenbuf, 0, COLS); } -void clear_hidden_pop( vbiscreen_t *vs ) +void +clear_hidden_pop (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->buffers + vs->curbuffer * COLS * ROWS , 0, COLS * ROWS ); + if (!vs) + return; + memset (vs->buffers + vs->curbuffer * COLS * ROWS, 0, COLS * ROWS); } -void clear_hidden_paint( vbiscreen_t *vs ) +void +clear_hidden_paint (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->paintbuf , 0, COLS * ROWS ); + if (!vs) + return; + memset (vs->paintbuf, 0, COLS * ROWS); } -void clear_displayed_pop( vbiscreen_t *vs ) +void +clear_displayed_pop (vbiscreen_t * vs) { - if( !vs ) return; - memset( vs->buffers + ( vs->curbuffer ^ 1 ) * COLS * ROWS , 0, COLS * ROWS ); + if (!vs) + return; + memset (vs->buffers + (vs->curbuffer ^ 1) * COLS * ROWS, 0, COLS * ROWS); } -void vbiscreen_dump_screen_text( vbiscreen_t *vs ) +void +vbiscreen_dump_screen_text (vbiscreen_t * vs) { - int i, offset; - - if( !vs ) return; - offset = vs->top_of_screen * COLS; - - fprintf( stderr, "\n 0123456789abcdefghij012345678901" ); - for( i = 0; i < ROWS * COLS; i++ ) { - if( !(i % COLS) ) - fprintf( stderr, "\n%.2d ", i / COLS ); - fprintf( stderr, "%c", vs->text[ offset ] ? vs->text[ offset ] : ' ' ); - offset++; - offset %= 2 * ROWS * COLS; - } - fprintf( stderr, "\n 0123456789abcdefghij012345678901\n " ); - for( i = 0; i < COLS; i++ ) { - fprintf( stderr, "%c", vs->text[ offset ] ? vs->text[ offset ] : ' ' ); - offset++; - offset %= 2 * ROWS * COLS; - } - fprintf( stderr, "\n 0123456789abcdefghij012345678901\n" ); + int i, offset; + + if (!vs) + return; + offset = vs->top_of_screen * COLS; + + fprintf (stderr, "\n 0123456789abcdefghij012345678901"); + for (i = 0; i < ROWS * COLS; i++) { + if (!(i % COLS)) + fprintf (stderr, "\n%.2d ", i / COLS); + fprintf (stderr, "%c", vs->text[offset] ? vs->text[offset] : ' '); + offset++; + offset %= 2 * ROWS * COLS; + } + fprintf (stderr, "\n 0123456789abcdefghij012345678901\n "); + for (i = 0; i < COLS; i++) { + fprintf (stderr, "%c", vs->text[offset] ? vs->text[offset] : ' '); + offset++; + offset %= 2 * ROWS * COLS; + } + fprintf (stderr, "\n 0123456789abcdefghij012345678901\n"); } -int update_row_x( vbiscreen_t *vs, int row ) +int +update_row_x (vbiscreen_t * vs, int row) { - char text[ COLS + 1 ]; - int i, j, haschars = 0, base; - - if( !vs ) return 0; - - text[ COLS ] = 0; - base = ( ( vs->top_of_screen + row ) % ( 2 * ROWS ) ) * COLS; - for( j = 0, i = base; i < base + COLS; i++, j++ ) { - if( vs->text[ i ] ) { - text[ j ] = vs->text[ i ]; - haschars = 1; - } else { - text[ j ] = ' '; - } + char text[COLS + 1]; + int i, j, haschars = 0, base; + + if (!vs) + return 0; + + text[COLS] = 0; + base = ((vs->top_of_screen + row) % (2 * ROWS)) * COLS; + for (j = 0, i = base; i < base + COLS; i++, j++) { + if (vs->text[i]) { + text[j] = vs->text[i]; + haschars = 1; + } else { + text[j] = ' '; } + } - osd_string_set_colour_rgb( vs->line[ row ], - ( vs->fgcolour & 0xff0000 ) >> 16, - ( vs->fgcolour & 0xff00 ) >> 8, - ( vs->fgcolour & 0xff ) ); - if( !haschars ) - osd_string_show_text( vs->line[ row ], " ", 0 ); - else - osd_string_show_text( vs->line[ row ], text, 51 ); + osd_string_set_colour_rgb (vs->line[row], + (vs->fgcolour & 0xff0000) >> 16, + (vs->fgcolour & 0xff00) >> 8, (vs->fgcolour & 0xff)); + if (!haschars) + osd_string_show_text (vs->line[row], " ", 0); + else + osd_string_show_text (vs->line[row], text, 51); - return haschars; + return haschars; } -void update_row( vbiscreen_t *vs ) +void +update_row (vbiscreen_t * vs) { - if( !vs ) return; + if (!vs) + return; - update_row_x( vs, vs->cury ); - //vbiscreen_dump_screen_text( vs ); + update_row_x (vs, vs->cury); + //vbiscreen_dump_screen_text( vs ); } -void update_all_rows( vbiscreen_t *vs ) +void +update_all_rows (vbiscreen_t * vs) { - int row = 0; + int row = 0; - if( !vs ) return; + if (!vs) + return; - for( row = 0; row < ROWS; row++ ) { - update_row_x( vs, row ); - } - //vbiscreen_dump_screen_text( vs ); + for (row = 0; row < ROWS; row++) { + update_row_x (vs, row); + } + //vbiscreen_dump_screen_text( vs ); } -void vbiscreen_delete( vbiscreen_t *vs ) +void +vbiscreen_delete (vbiscreen_t * vs) { - free( vs ); + free (vs); } -void copy_row_to_screen( vbiscreen_t *vs, char *row ) +void +copy_row_to_screen (vbiscreen_t * vs, char *row) { - int base, i, j; + int base, i, j; - base = ( ( vs->top_of_screen + vs->cury ) % ( 2 * ROWS ) ) * COLS; - for( j = 0, i = base; - i < base + COLS; - j++, i++ ) { - vs->text[ i ] = row[ j ]; - } - update_row( vs ); + base = ((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS; + for (j = 0, i = base; i < base + COLS; j++, i++) { + vs->text[i] = row[j]; + } + update_row (vs); } -void scroll_screen( vbiscreen_t *vs ) +void +scroll_screen (vbiscreen_t * vs) { - int start_row; + int start_row; - if( !vs || !vs->captions || !vs->style || vs->style > ROLL_4 ) - return; - - start_row = ( vs->first_line + vs->top_of_screen ) % ( 2 * ROWS ); - if( vs->verbose ) - fprintf ( stderr, "start row : %d first line %d\n ", start_row, - vs->first_line ); + if (!vs || !vs->captions || !vs->style || vs->style > ROLL_4) + return; - /* zero out top row */ - memset( (char *)( vs->text + start_row * COLS ), 0, COLS ); - vs->top_of_screen = ( vs->top_of_screen + 1 ) % ( 2 * ROWS ); - vs->curx = vs->indent; - update_all_rows( vs ); - copy_row_to_screen( vs, vs->hiddenbuf ); - clear_hidden_roll( vs ); - vs->scroll = 26; + start_row = (vs->first_line + vs->top_of_screen) % (2 * ROWS); + if (vs->verbose) + fprintf (stderr, "start row : %d first line %d\n ", start_row, + vs->first_line); + + /* zero out top row */ + memset ((char *) (vs->text + start_row * COLS), 0, COLS); + vs->top_of_screen = (vs->top_of_screen + 1) % (2 * ROWS); + vs->curx = vs->indent; + update_all_rows (vs); + copy_row_to_screen (vs, vs->hiddenbuf); + clear_hidden_roll (vs); + vs->scroll = 26; } -void vbiscreen_set_verbose( vbiscreen_t *vs, int verbose ) +void +vbiscreen_set_verbose (vbiscreen_t * vs, int verbose) { - vs->verbose = verbose; + vs->verbose = verbose; } -void vbiscreen_new_caption( vbiscreen_t *vs, int indent, int ital, - unsigned int colour, int row ) +void +vbiscreen_new_caption (vbiscreen_t * vs, int indent, int ital, + unsigned int colour, int row) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "indent: %d, ital: %d, colour: 0x%x, row: %d\n", indent, ital, colour, row ); - - if( 0 && vs->captions && vs->style <= ROLL_4 && vs->style ) { - if( row != vs->cury+1 ) { - vs->cury = row - 1; - clear_hidden_roll( vs ); - } else { + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "indent: %d, ital: %d, colour: 0x%x, row: %d\n", indent, + ital, colour, row); + + if (0 && vs->captions && vs->style <= ROLL_4 && vs->style) { + if (row != vs->cury + 1) { + vs->cury = row - 1; + clear_hidden_roll (vs); + } else { // scroll_screen( vs ); - } } + } - if( vs->style > ROLL_4 ) { - vs->cury = ( ( row > 0 ) ? row - 1 : 0 ); - } + if (vs->style > ROLL_4) { + vs->cury = ((row > 0) ? row - 1 : 0); + } - vs->fgcolour = colour; - vs->indent = indent; - vs->curx = indent; -} - -void vbiscreen_set_mode( vbiscreen_t *vs, int caption, int style ) -{ - if( !vs ) return; - if( vs->verbose ) - fprintf( stderr, "in set mode\n"); - - if( vs->verbose ) { - fprintf( stderr, "Caption: %d ", caption ); - switch( style ) { - case ROLL_2: - fprintf( stderr, "ROLL 2\n"); - break; - case ROLL_3: - fprintf( stderr, "ROLL 3\n" ); - break; - case ROLL_4: - fprintf( stderr, "ROLL 4\n" ); - break; - case POP_UP: - fprintf( stderr, "POP UP\n" ); - break; - case PAINT_ON: - fprintf( stderr, "PAINT ON\n" ); - break; - default: - break; - } + vs->fgcolour = colour; + vs->indent = indent; + vs->curx = indent; +} + +void +vbiscreen_set_mode (vbiscreen_t * vs, int caption, int style) +{ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in set mode\n"); + + if (vs->verbose) { + fprintf (stderr, "Caption: %d ", caption); + switch (style) { + case ROLL_2: + fprintf (stderr, "ROLL 2\n"); + break; + case ROLL_3: + fprintf (stderr, "ROLL 3\n"); + break; + case ROLL_4: + fprintf (stderr, "ROLL 4\n"); + break; + case POP_UP: + fprintf (stderr, "POP UP\n"); + break; + case PAINT_ON: + fprintf (stderr, "PAINT ON\n"); + break; + default: + break; } - if( !caption ) { - /* text mode */ - vs->cury = 0; - } else { - /* captioning mode */ - /* styles: ru2 ru3 ru4 pop paint - */ - if( style != POP_UP && vs->style == POP_UP && !vs->got_eoc ) { - /* stupid that sometimes they dont send a EOC */ - vbiscreen_end_of_caption( vs ); - } - - switch( style ) { - case ROLL_2: - case ROLL_3: - case ROLL_4: - if( vs->style == style ) { - return; - } - vs->first_line = ROWS - (style - 4); - - if( vs->verbose ) - fprintf( stderr, "first_line %d\n", vs->first_line ); - - vs->cury = ROWS - 1; - break; - case POP_UP: - vs->got_eoc = 0; - break; - case PAINT_ON: - break; - } + } + if (!caption) { + /* text mode */ + vs->cury = 0; + } else { + /* captioning mode */ + /* styles: ru2 ru3 ru4 pop paint + */ + if (style != POP_UP && vs->style == POP_UP && !vs->got_eoc) { + /* stupid that sometimes they dont send a EOC */ + vbiscreen_end_of_caption (vs); } - vs->captions = caption; - vs->style = style; -} + switch (style) { + case ROLL_2: + case ROLL_3: + case ROLL_4: + if (vs->style == style) { + return; + } + vs->first_line = ROWS - (style - 4); + + if (vs->verbose) + fprintf (stderr, "first_line %d\n", vs->first_line); + + vs->cury = ROWS - 1; + break; + case POP_UP: + vs->got_eoc = 0; + break; + case PAINT_ON: + break; + } + } -void vbiscreen_tab( vbiscreen_t *vs, int cols ) -{ - if( !vs ) return; - if( cols < 0 || cols > 3 ) return; - vs->curx += cols; - if( vs->curx > 31 ) vs->curx = 31; + vs->captions = caption; + vs->style = style; } -void vbiscreen_set_colour( vbiscreen_t *vs, unsigned int col ) +void +vbiscreen_tab (vbiscreen_t * vs, int cols) { - if( !vs ) return; - vs->fgcolour = col; + if (!vs) + return; + if (cols < 0 || cols > 3) + return; + vs->curx += cols; + if (vs->curx > 31) + vs->curx = 31; } -void vbiscreen_clear_current_cell( vbiscreen_t *vs ) +void +vbiscreen_set_colour (vbiscreen_t * vs, unsigned int col) { - vs->text[ ( ( vs->top_of_screen + vs->cury ) % ( 2 * ROWS ) ) * COLS - + vs->curx + vs->indent ] = 0; + if (!vs) + return; + vs->fgcolour = col; } -void vbiscreen_set_current_cell( vbiscreen_t *vs, char text ) +void +vbiscreen_clear_current_cell (vbiscreen_t * vs) { - int base; - if( !vs ) return; - base = ( ( vs->top_of_screen + vs->cury ) % ( 2 * ROWS ) ) * COLS; - if( g_ascii_isprint( text ) ) - vs->text[ base + vs->curx + vs->indent ] = text; - else - vs->text[ base + vs->curx + vs->indent ] = ' '; + vs->text[((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS + + vs->curx + vs->indent] = 0; } -void vbiscreen_delete_to_end( vbiscreen_t *vs ) +void +vbiscreen_set_current_cell (vbiscreen_t * vs, char text) { - int i; - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in del to end\n"); - for( i = vs->curx; i < COLS; i++ ) { - vbiscreen_clear_current_cell( vs ); - vs->curx++; - } - vs->curx = COLS-1; /* is this right ? */ - if( vs->captions && vs->style && vs->style != POP_UP ) - update_row( vs ); + int base; + + if (!vs) + return; + base = ((vs->top_of_screen + vs->cury) % (2 * ROWS)) * COLS; + if (g_ascii_isprint (text)) + vs->text[base + vs->curx + vs->indent] = text; + else + vs->text[base + vs->curx + vs->indent] = ' '; } -void vbiscreen_backspace( vbiscreen_t *vs ) +void +vbiscreen_delete_to_end (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in backspace\n"); - if( !vs->curx ) return; - vs->curx--; - vbiscreen_clear_current_cell( vs ); - update_row( vs ); + int i; + + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in del to end\n"); + for (i = vs->curx; i < COLS; i++) { + vbiscreen_clear_current_cell (vs); + vs->curx++; + } + vs->curx = COLS - 1; /* is this right ? */ + if (vs->captions && vs->style && vs->style != POP_UP) + update_row (vs); } -void vbiscreen_erase_displayed( vbiscreen_t *vs ) +void +vbiscreen_backspace (vbiscreen_t * vs) +{ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in backspace\n"); + if (!vs->curx) + return; + vs->curx--; + vbiscreen_clear_current_cell (vs); + update_row (vs); +} + +void +vbiscreen_erase_displayed (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in erase disp\n"); + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in erase disp\n"); - if( vs->captions && vs->style && vs->style <= ROLL_4 ) { - clear_hidden_roll( vs ); - } + if (vs->captions && vs->style && vs->style <= ROLL_4) { + clear_hidden_roll (vs); + } - clear_displayed_pop( vs ); - clear_screen( vs ); + clear_displayed_pop (vs); + clear_screen (vs); } -void vbiscreen_erase_non_displayed( vbiscreen_t *vs ) +void +vbiscreen_erase_non_displayed (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in erase non disp\n"); - - if( vs->captions && vs->style == POP_UP ) { - memset( vs->buffers + vs->curbuffer * COLS * ROWS + vs->cury * COLS, 0, COLS ); + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in erase non disp\n"); + + if (vs->captions && vs->style == POP_UP) { + memset (vs->buffers + vs->curbuffer * COLS * ROWS + vs->cury * COLS, 0, + COLS); // clear_hidden_pop( vs ); - } else if( vs->captions && vs->style && vs->style <= ROLL_4 ) { - clear_hidden_roll( vs ); - } + } else if (vs->captions && vs->style && vs->style <= ROLL_4) { + clear_hidden_roll (vs); + } } -void vbiscreen_carriage_return( vbiscreen_t *vs ) +void +vbiscreen_carriage_return (vbiscreen_t * vs) { - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in CR\n"); - if( vs->style != POP_UP) { - /* not sure if this is right for text mode */ - /* in text mode, perhaps a CR on last row clears screen and goes - * to (0,0) */ - scroll_screen( vs ); - } + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in CR\n"); + if (vs->style != POP_UP) { + /* not sure if this is right for text mode */ + /* in text mode, perhaps a CR on last row clears screen and goes + * to (0,0) */ + scroll_screen (vs); + } - /* keep cursor on bottom for rollup */ - if( vs->captions && vs->style && vs->style <= ROLL_4 ) - vs->cury--; + /* keep cursor on bottom for rollup */ + if (vs->captions && vs->style && vs->style <= ROLL_4) + vs->cury--; - vs->cury++; - vs->curx = 0; + vs->cury++; + vs->curx = 0; } -void copy_buf_to_screen( vbiscreen_t *vs, char *buf ) +void +copy_buf_to_screen (vbiscreen_t * vs, char *buf) { - int base, i, j; - if( !vs ) return; + int base, i, j; - base = vs->top_of_screen * COLS; - for( j = 0, i = 0; i < ROWS * COLS; i++, j++ ) { - vs->text[ base ] = buf[ j ]; - base++; - base %= 2 * ROWS * COLS; - } - update_all_rows( vs ); + if (!vs) + return; + + base = vs->top_of_screen * COLS; + for (j = 0, i = 0; i < ROWS * COLS; i++, j++) { + vs->text[base] = buf[j]; + base++; + base %= 2 * ROWS * COLS; + } + update_all_rows (vs); } -void vbiscreen_end_of_caption( vbiscreen_t *vs ) +void +vbiscreen_end_of_caption (vbiscreen_t * vs) { - /*int i;*/ - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in end of caption\n"); + /*int i; */ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in end of caption\n"); + + if (vs->style == PAINT_ON) { + copy_buf_to_screen (vs, vs->paintbuf); + clear_hidden_paint (vs); + } else if (vs->style == POP_UP) { + copy_buf_to_screen (vs, vs->buffers + vs->curbuffer * COLS * ROWS); + vs->curbuffer ^= 1; + } + + /* to be safe? */ + vs->curx = 0; + vs->cury = ROWS - 1; + vs->got_eoc = 1; +} - if( vs->style == PAINT_ON ) { - copy_buf_to_screen( vs, vs->paintbuf ); - clear_hidden_paint( vs ); - } else if( vs->style == POP_UP ) { - copy_buf_to_screen( vs, vs->buffers + vs->curbuffer * COLS * ROWS ); - vs->curbuffer ^= 1; +void +vbiscreen_print (vbiscreen_t * vs, char c1, char c2) +{ + if (!vs) + return; + if (vs->verbose) + fprintf (stderr, "in print (%d, %d)[%c %c]\n", vs->curx, vs->cury, c1, c2); + if (vs->captions && vs->style == POP_UP) { + /* this all gets displayed at another time */ + if (vs->curx != COLS - 1) { + *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + + vs->cury * COLS) = c1; + vs->curx++; } - /* to be safe? */ - vs->curx = 0; - vs->cury = ROWS - 1; - vs->got_eoc = 1; -} - -void vbiscreen_print( vbiscreen_t *vs, char c1, char c2 ) -{ - if( !vs ) return; - if( vs->verbose ) fprintf( stderr, "in print (%d, %d)[%c %c]\n", vs->curx, vs->cury, c1, c2); - if( vs->captions && vs->style == POP_UP ) { - /* this all gets displayed at another time */ - if( vs->curx != COLS-1 ) { - *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + vs->cury * COLS ) = c1; - vs->curx++; - } - - if( vs->curx != COLS-1 && c2 ) { - *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + vs->cury * COLS ) = c2; - vs->curx++; - } else if( c2 ) { - *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + vs->cury * COLS ) = c2; - } + if (vs->curx != COLS - 1 && c2) { + *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + + vs->cury * COLS) = c2; + vs->curx++; + } else if (c2) { + *(vs->buffers + vs->curx + vs->curbuffer * ROWS * COLS + + vs->cury * COLS) = c2; } + } - if( vs->captions && vs->style == PAINT_ON ) { - if( vs->curx != COLS-1 ) { - vs->paintbuf[ vs->curx + vs->cury * COLS ] = c1; - vs->curx++; - } - - if( vs->curx != COLS-1 && c2 ) { - vs->paintbuf[ vs->curx + vs->cury * COLS ] = c2; - vs->curx++; - } else if( c2 ) { - vs->paintbuf[ vs->curx + vs->cury * COLS ] = c2; - } + if (vs->captions && vs->style == PAINT_ON) { + if (vs->curx != COLS - 1) { + vs->paintbuf[vs->curx + vs->cury * COLS] = c1; + vs->curx++; } - if( vs->captions && vs->style && vs->style <= ROLL_4 ) { - if( vs->curx != COLS-1 ) { - vs->hiddenbuf[ vs->curx ] = c1; - vs->curx++; - } else { - vs->hiddenbuf[ vs->curx ] = c1; - } - - if( vs->curx != COLS-1 && c2 ) { - vs->hiddenbuf[ vs->curx ] = c2; - vs->curx++; - } else if( c2 ) { - vs->hiddenbuf[ vs->curx ] = c2; - } + if (vs->curx != COLS - 1 && c2) { + vs->paintbuf[vs->curx + vs->cury * COLS] = c2; + vs->curx++; + } else if (c2) { + vs->paintbuf[vs->curx + vs->cury * COLS] = c2; + } + } + + if (vs->captions && vs->style && vs->style <= ROLL_4) { + if (vs->curx != COLS - 1) { + vs->hiddenbuf[vs->curx] = c1; + vs->curx++; + } else { + vs->hiddenbuf[vs->curx] = c1; } -} -void vbiscreen_reset( vbiscreen_t *vs ) -{ - if( !vs ) return; - clear_screen( vs ); - clear_hidden_pop( vs ); - clear_displayed_pop( vs ); - clear_hidden_roll( vs ); - vs->captions = 0; - vs->style = 0; -} - -void vbiscreen_composite_packed422_scanline( vbiscreen_t *vs, - unsigned char *output, - int width, int xpos, - int scanline ) -{ - int x=0, y=0, row=0, index=0; - - if( !vs ) return; - if( !output ) return; - if( scanline >= vs->y && scanline < vs->y + vs->height ) { - - if( 0 && !vs->captions ) - blit_colour_packed422_scanline( output + (vs->x*2), vs->width, - vs->bg_luma, vs->bg_cb, - vs->bg_cr ); - - index = vs->top_of_screen * COLS; - x = ( vs->x + vs->charwidth) & ~1; - for( row = 0; row < ROWS; row++ ) { - y = vs->y + row * vs->rowheight + vs->rowheight; - if( osd_string_visible( vs->line[ row ] ) ) { - if( scanline >= y && - scanline < y + vs->rowheight ) { - - int startx; - int strx; - - startx = x - xpos; - strx = 0; - - if( startx < 0 ) { - strx = -startx; - startx = 0; - } - - - if( startx < width ) { - - if( vs->captions ) - blit_colour_packed422_scanline( - output + (startx*2), - osd_string_get_width( vs->line[ row ] ), - vs->bg_luma, - vs->bg_cb, - vs->bg_cr ); - - osd_string_composite_packed422_scanline( - vs->line[ row ], - output + (startx*2), - output + (startx*2), - width - startx, - strx, - scanline - y ); - } - } - index++; - } - } + if (vs->curx != COLS - 1 && c2) { + vs->hiddenbuf[vs->curx] = c2; + vs->curx++; + } else if (c2) { + vs->hiddenbuf[vs->curx] = c2; } + } } +void +vbiscreen_reset (vbiscreen_t * vs) +{ + if (!vs) + return; + clear_screen (vs); + clear_hidden_pop (vs); + clear_displayed_pop (vs); + clear_hidden_roll (vs); + vs->captions = 0; + vs->style = 0; +} + +void +vbiscreen_composite_packed422_scanline (vbiscreen_t * vs, + unsigned char *output, int width, int xpos, int scanline) +{ + int x = 0, y = 0, row = 0, index = 0; + + if (!vs) + return; + if (!output) + return; + if (scanline >= vs->y && scanline < vs->y + vs->height) { + + if (0 && !vs->captions) + blit_colour_packed422_scanline (output + (vs->x * 2), vs->width, + vs->bg_luma, vs->bg_cb, vs->bg_cr); + + index = vs->top_of_screen * COLS; + x = (vs->x + vs->charwidth) & ~1; + for (row = 0; row < ROWS; row++) { + y = vs->y + row * vs->rowheight + vs->rowheight; + if (osd_string_visible (vs->line[row])) { + if (scanline >= y && scanline < y + vs->rowheight) { + + int startx; + int strx; + + startx = x - xpos; + strx = 0; + + if (startx < 0) { + strx = -startx; + startx = 0; + } + + + if (startx < width) { + + if (vs->captions) + blit_colour_packed422_scanline (output + (startx * 2), + osd_string_get_width (vs->line[row]), + vs->bg_luma, vs->bg_cb, vs->bg_cr); + + osd_string_composite_packed422_scanline (vs->line[row], + output + (startx * 2), + output + (startx * 2), width - startx, strx, scanline - y); + } + } + index++; + } + } + } +} diff --git a/gst/vbidec/vbiscreen.h b/gst/vbidec/vbiscreen.h index 9afe2843..f3c81fbf 100644 --- a/gst/vbidec/vbiscreen.h +++ b/gst/vbidec/vbiscreen.h @@ -25,26 +25,24 @@ typedef struct vbiscreen_s vbiscreen_t; -vbiscreen_t *vbiscreen_new( int video_width, int video_height, - double video_aspect, int verbose, void *user_data ); -void vbiscreen_delete( vbiscreen_t *vs ); -void vbiscreen_set_verbose( vbiscreen_t *vs, int verbose ); -void vbiscreen_set_mode( vbiscreen_t *vs, int caption, int style); -void vbiscreen_new_caption( vbiscreen_t *vs, int indent, int ital, - unsigned int colour, int row ); -void vbiscreen_tab( vbiscreen_t *vs, int cols ); -void vbiscreen_delete_to_end( vbiscreen_t *vs ); -void vbiscreen_backspace( vbiscreen_t *vs ); -void vbiscreen_erase_displayed( vbiscreen_t *vs ); -void vbiscreen_erase_non_displayed( vbiscreen_t *vs ); -void vbiscreen_carriage_return( vbiscreen_t *vs ); -void vbiscreen_end_of_caption( vbiscreen_t *vs ); -void vbiscreen_print( vbiscreen_t *vs, char c1, char c2 ); -void vbiscreen_composite_packed422_scanline( vbiscreen_t *vs, - unsigned char *output, - int width, int xpos, - int scanline ); -void vbiscreen_dump_screen_text( vbiscreen_t *vs ); -void vbiscreen_reset( vbiscreen_t *vs ); +vbiscreen_t *vbiscreen_new (int video_width, int video_height, + double video_aspect, int verbose, void *user_data); +void vbiscreen_delete (vbiscreen_t * vs); +void vbiscreen_set_verbose (vbiscreen_t * vs, int verbose); +void vbiscreen_set_mode (vbiscreen_t * vs, int caption, int style); +void vbiscreen_new_caption (vbiscreen_t * vs, int indent, int ital, + unsigned int colour, int row); +void vbiscreen_tab (vbiscreen_t * vs, int cols); +void vbiscreen_delete_to_end (vbiscreen_t * vs); +void vbiscreen_backspace (vbiscreen_t * vs); +void vbiscreen_erase_displayed (vbiscreen_t * vs); +void vbiscreen_erase_non_displayed (vbiscreen_t * vs); +void vbiscreen_carriage_return (vbiscreen_t * vs); +void vbiscreen_end_of_caption (vbiscreen_t * vs); +void vbiscreen_print (vbiscreen_t * vs, char c1, char c2); +void vbiscreen_composite_packed422_scanline (vbiscreen_t * vs, + unsigned char *output, int width, int xpos, int scanline); +void vbiscreen_dump_screen_text (vbiscreen_t * vs); +void vbiscreen_reset (vbiscreen_t * vs); #endif diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c index 6a90b5b3..f13610bc 100644 --- a/gst/videocrop/gstvideocrop.c +++ b/gst/videocrop/gstvideocrop.c @@ -39,39 +39,42 @@ typedef struct _GstVideoCrop GstVideoCrop; typedef struct _GstVideoCropClass GstVideoCropClass; -struct _GstVideoCrop { - GstElement element; +struct _GstVideoCrop +{ + GstElement element; /* pads */ - GstPad *sinkpad; - GstPad *srcpad; + GstPad *sinkpad; + GstPad *srcpad; /* caps */ - gint width, height; - gdouble fps; - gint crop_left, crop_right, crop_top, crop_bottom; + gint width, height; + gdouble fps; + gint crop_left, crop_right, crop_top, crop_bottom; }; -struct _GstVideoCropClass { +struct _GstVideoCropClass +{ GstElementClass parent_class; }; /* elementfactory information */ -static GstElementDetails gst_video_crop_details = GST_ELEMENT_DETAILS ( - "video crop filter", - "Filter/Effect/Video", - "Crops video into a user defined region", - "Wim Taymans " -); +static GstElementDetails gst_video_crop_details = +GST_ELEMENT_DETAILS ("video crop filter", + "Filter/Effect/Video", + "Crops video into a user defined region", + "Wim Taymans "); /* VideoCrop signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_LEFT, ARG_RIGHT, @@ -81,40 +84,38 @@ enum { }; static GstStaticPadTemplate gst_video_crop_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); static GstStaticPadTemplate gst_video_crop_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); -static void gst_video_crop_base_init (gpointer g_class); -static void gst_video_crop_class_init (GstVideoCropClass *klass); -static void gst_video_crop_init (GstVideoCrop *video_crop); +static void gst_video_crop_base_init (gpointer g_class); +static void gst_video_crop_class_init (GstVideoCropClass * klass); +static void gst_video_crop_init (GstVideoCrop * video_crop); -static void gst_video_crop_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_video_crop_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); +static void gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_video_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static GstPadLinkReturn - gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps); -static void gst_video_crop_chain (GstPad *pad, GstData *_data); +gst_video_crop_sink_link (GstPad * pad, const GstCaps * caps); +static void gst_video_crop_chain (GstPad * pad, GstData * _data); -static GstElementStateReturn - gst_video_crop_change_state (GstElement *element); +static GstElementStateReturn gst_video_crop_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /* static guint gst_video_crop_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -124,17 +125,19 @@ gst_video_crop_get_type (void) if (!video_crop_type) { static const GTypeInfo video_crop_info = { - sizeof(GstVideoCropClass), + sizeof (GstVideoCropClass), gst_video_crop_base_init, NULL, - (GClassInitFunc)gst_video_crop_class_init, + (GClassInitFunc) gst_video_crop_class_init, NULL, NULL, - sizeof(GstVideoCrop), + sizeof (GstVideoCrop), 0, - (GInstanceInitFunc)gst_video_crop_init, + (GInstanceInitFunc) gst_video_crop_init, }; - video_crop_type = g_type_register_static(GST_TYPE_ELEMENT, "GstVideoCrop", &video_crop_info, 0); + video_crop_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstVideoCrop", + &video_crop_info, 0); } return video_crop_type; } @@ -146,34 +149,34 @@ gst_video_crop_base_init (gpointer g_class) gst_element_class_set_details (element_class, &gst_video_crop_details); - gst_element_class_add_pad_template (element_class, + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_crop_sink_template)); - gst_element_class_add_pad_template (element_class, + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_crop_src_template)); } static void -gst_video_crop_class_init (GstVideoCropClass *klass) +gst_video_crop_class_init (GstVideoCropClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*) klass; - gstelement_class = (GstElementClass*) klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LEFT, - g_param_spec_int ("left", "Left", "Pixels to crop at left", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("left", "Left", "Pixels to crop at left", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RIGHT, - g_param_spec_int ("right", "Right", "Pixels to crop at right", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("right", "Right", "Pixels to crop at right", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOP, - g_param_spec_int ("top", "Top", "Pixels to crop at top", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("top", "Top", "Pixels to crop at top", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BOTTOM, - g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", - 0, G_MAXINT, 0, G_PARAM_READWRITE)); + g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", + 0, G_MAXINT, 0, G_PARAM_READWRITE)); gobject_class->set_property = gst_video_crop_set_property; gobject_class->get_property = gst_video_crop_get_property; @@ -182,17 +185,19 @@ gst_video_crop_class_init (GstVideoCropClass *klass) } static void -gst_video_crop_init (GstVideoCrop *video_crop) +gst_video_crop_init (GstVideoCrop * video_crop) { /* create the sink and src pads */ - video_crop->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&gst_video_crop_sink_template), "sink"); + video_crop->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_video_crop_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (video_crop), video_crop->sinkpad); gst_pad_set_chain_function (video_crop->sinkpad, gst_video_crop_chain); gst_pad_set_link_function (video_crop->sinkpad, gst_video_crop_sink_link); - video_crop->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&gst_video_crop_src_template), "src"); + video_crop->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_video_crop_src_template), "src"); gst_element_add_pad (GST_ELEMENT (video_crop), video_crop->srcpad); video_crop->crop_right = 0; @@ -205,13 +210,14 @@ gst_video_crop_init (GstVideoCrop *video_crop) /* do we need this function? */ static void -gst_video_crop_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstVideoCrop *video_crop; - + /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_VIDEO_CROP (object)); - + video_crop = GST_VIDEO_CROP (object); switch (prop_id) { @@ -233,13 +239,14 @@ gst_video_crop_set_property (GObject *object, guint prop_id, const GValue *value } } static void -gst_video_crop_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstVideoCrop *video_crop; - + /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_VIDEO_CROP (object)); - + video_crop = GST_VIDEO_CROP (object); switch (prop_id) { @@ -262,7 +269,7 @@ gst_video_crop_get_property (GObject *object, guint prop_id, GValue *value, GPar } static GstPadLinkReturn -gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps) +gst_video_crop_sink_link (GstPad * pad, const GstCaps * caps) { GstVideoCrop *video_crop; GstStructure *structure; @@ -271,7 +278,7 @@ gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps) video_crop = GST_VIDEO_CROP (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); - ret = gst_structure_get_int (structure, "width", &video_crop->width); + ret = gst_structure_get_int (structure, "width", &video_crop->width); ret &= gst_structure_get_int (structure, "height", &video_crop->height); ret &= gst_structure_get_double (structure, "framerate", &video_crop->fps); @@ -289,28 +296,30 @@ gst_video_crop_sink_link (GstPad *pad, const GstCaps *caps) #define GST_VIDEO_I420_V_ROWSTRIDE(width) ((width)/2) static void -gst_video_crop_i420 (GstVideoCrop *video_crop, GstBuffer *src_buffer, GstBuffer *dest_buffer) +gst_video_crop_i420 (GstVideoCrop * video_crop, GstBuffer * src_buffer, + GstBuffer * dest_buffer) { guint8 *src; guint8 *dest; guint8 *srcY, *srcU, *srcV; guint8 *destY, *destU, *destV; gint out_width = video_crop->width - - (video_crop->crop_left + video_crop->crop_right); + (video_crop->crop_left + video_crop->crop_right); gint out_height = video_crop->height - - (video_crop->crop_top + video_crop->crop_bottom); + (video_crop->crop_top + video_crop->crop_bottom); gint src_stride; gint j; src = GST_BUFFER_DATA (src_buffer); dest = GST_BUFFER_DATA (dest_buffer); - g_return_if_fail(GST_BUFFER_SIZE (dest_buffer) == GST_VIDEO_I420_SIZE(out_width,out_height)); + g_return_if_fail (GST_BUFFER_SIZE (dest_buffer) == + GST_VIDEO_I420_SIZE (out_width, out_height)); - srcY = src + GST_VIDEO_I420_Y_OFFSET(video_crop->width, video_crop->height); - destY = dest + GST_VIDEO_I420_Y_OFFSET(out_width, out_height); + srcY = src + GST_VIDEO_I420_Y_OFFSET (video_crop->width, video_crop->height); + destY = dest + GST_VIDEO_I420_Y_OFFSET (out_width, out_height); - src_stride = GST_VIDEO_I420_Y_ROWSTRIDE(video_crop->width); + src_stride = GST_VIDEO_I420_Y_ROWSTRIDE (video_crop->width); /* copy Y plane first */ @@ -321,32 +330,32 @@ gst_video_crop_i420 (GstVideoCrop *video_crop, GstBuffer *src_buffer, GstBuffer destY += out_width; } - src_stride = GST_VIDEO_I420_U_ROWSTRIDE(video_crop->width); + src_stride = GST_VIDEO_I420_U_ROWSTRIDE (video_crop->width); - destU = dest + GST_VIDEO_I420_U_OFFSET(out_width, out_height); - destV = dest + GST_VIDEO_I420_V_OFFSET(out_width, out_height); + destU = dest + GST_VIDEO_I420_U_OFFSET (out_width, out_height); + destV = dest + GST_VIDEO_I420_V_OFFSET (out_width, out_height); - srcU = src + GST_VIDEO_I420_U_OFFSET(video_crop->width, video_crop->height); - srcV = src + GST_VIDEO_I420_V_OFFSET(video_crop->width, video_crop->height); + srcU = src + GST_VIDEO_I420_U_OFFSET (video_crop->width, video_crop->height); + srcV = src + GST_VIDEO_I420_V_OFFSET (video_crop->width, video_crop->height); - srcU += src_stride * (video_crop->crop_top/2) + (video_crop->crop_left/2); - srcV += src_stride * (video_crop->crop_top/2) + (video_crop->crop_left/2); + srcU += src_stride * (video_crop->crop_top / 2) + (video_crop->crop_left / 2); + srcV += src_stride * (video_crop->crop_top / 2) + (video_crop->crop_left / 2); - for (j = 0; j < out_height/2; j++) { + for (j = 0; j < out_height / 2; j++) { /* copy U plane */ - memcpy (destU, srcU, out_width/2); + memcpy (destU, srcU, out_width / 2); srcU += src_stride; - destU += out_width/2; + destU += out_width / 2; /* copy V plane */ - memcpy (destV, srcV, out_width/2); + memcpy (destV, srcV, out_width / 2); srcV += src_stride; - destV += out_width/2; + destV += out_width / 2; } } static void -gst_video_crop_chain (GstPad *pad, GstData *_data) +gst_video_crop_chain (GstPad * pad, GstData * _data) { GstBuffer *buffer = GST_BUFFER (_data); GstVideoCrop *video_crop; @@ -367,9 +376,9 @@ gst_video_crop_chain (GstPad *pad, GstData *_data) } new_width = video_crop->width - - (video_crop->crop_left + video_crop->crop_right); + (video_crop->crop_left + video_crop->crop_right); new_height = video_crop->height - - (video_crop->crop_top + video_crop->crop_bottom); + (video_crop->crop_top + video_crop->crop_bottom); outbuf = gst_buffer_new_and_alloc ((new_width * new_height * 3) / 2); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); @@ -381,7 +390,7 @@ gst_video_crop_chain (GstPad *pad, GstData *_data) } static GstElementStateReturn -gst_video_crop_change_state (GstElement *element) +gst_video_crop_change_state (GstElement * element) { GstVideoCrop *video_crop; @@ -408,19 +417,14 @@ gst_video_crop_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "videocrop", GST_RANK_PRIMARY, GST_TYPE_VIDEO_CROP); + return gst_element_register (plugin, "videocrop", GST_RANK_PRIMARY, + GST_TYPE_VIDEO_CROP); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videocrop", - "Crops video into a user defined region", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videocrop", + "Crops video into a user defined region", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/videodrop/gstvideodrop.c b/gst/videodrop/gstvideodrop.c index 546873f0..6a83fd9d 100644 --- a/gst/videodrop/gstvideodrop.c +++ b/gst/videodrop/gstvideodrop.c @@ -25,63 +25,56 @@ #include /* elementfactory information */ -static GstElementDetails videodrop_details = GST_ELEMENT_DETAILS ( - "Video frame dropper", - "Filter/Effect/Video", - "Re-FPS'es video", - "Ronald Bultje " -); +static GstElementDetails videodrop_details = +GST_ELEMENT_DETAILS ("Video frame dropper", + "Filter/Effect/Video", + "Re-FPS'es video", + "Ronald Bultje "); /* GstVideodrop signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_SPEED - /* FILL ME */ + /* FILL ME */ }; static GstStaticPadTemplate gst_videodrop_src_template = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS( - GST_VIDEO_CAPS_YUV("{ YUY2, I420, YV12, YUYV, UYVY }") - ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ YUY2, I420, YV12, YUYV, UYVY }") + ) + ); static GstStaticPadTemplate gst_videodrop_sink_template = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS( - GST_VIDEO_CAPS_YUV("{ YUY2, I420, YV12, YUYV, UYVY }") - ) -); - -static void gst_videodrop_base_init (gpointer g_class); -static void gst_videodrop_class_init (GstVideodropClass *klass); -static void gst_videodrop_init (GstVideodrop *videodrop); -static void gst_videodrop_chain (GstPad *pad, GstData *_data); - -static void gst_videodrop_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_videodrop_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ YUY2, I420, YV12, YUYV, UYVY }") + ) + ); -static GstElementStateReturn - gst_videodrop_change_state (GstElement *element); +static void gst_videodrop_base_init (gpointer g_class); +static void gst_videodrop_class_init (GstVideodropClass * klass); +static void gst_videodrop_init (GstVideodrop * videodrop); +static void gst_videodrop_chain (GstPad * pad, GstData * _data); + +static void gst_videodrop_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_videodrop_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static GstElementStateReturn gst_videodrop_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_videodrop_signals[LAST_SIGNAL] = { 0 }; */ GType @@ -103,8 +96,7 @@ gst_videodrop_get_type (void) }; videodrop_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstVideodrop", - &videodrop_info, 0); + "GstVideodrop", &videodrop_info, 0); } return videodrop_type; @@ -123,7 +115,7 @@ gst_videodrop_base_init (gpointer g_class) gst_static_pad_template_get (&gst_videodrop_src_template)); } static void -gst_videodrop_class_init (GstVideodropClass *klass) +gst_videodrop_class_init (GstVideodropClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -131,9 +123,8 @@ gst_videodrop_class_init (GstVideodropClass *klass) parent_class = g_type_class_peek_parent (klass); g_object_class_install_property (object_class, ARG_SPEED, - g_param_spec_float ("speed", "Speed", - "Output speed (relative to input)", - 0.01, 100, 1, G_PARAM_READWRITE)); + g_param_spec_float ("speed", "Speed", + "Output speed (relative to input)", 0.01, 100, 1, G_PARAM_READWRITE)); object_class->set_property = gst_videodrop_set_property; object_class->get_property = gst_videodrop_get_property; @@ -142,7 +133,7 @@ gst_videodrop_class_init (GstVideodropClass *klass) } static GstCaps * -gst_videodrop_getcaps (GstPad *pad) +gst_videodrop_getcaps (GstPad * pad) { GstVideodrop *videodrop; GstPad *otherpad; @@ -153,21 +144,21 @@ gst_videodrop_getcaps (GstPad *pad) videodrop = GST_VIDEODROP (gst_pad_get_parent (pad)); otherpad = (pad == videodrop->srcpad) ? videodrop->sinkpad : - videodrop->srcpad; + videodrop->srcpad; caps = gst_pad_get_allowed_caps (otherpad); - for (i=0;isrcpad) ? videodrop->sinkpad : - videodrop->srcpad; + videodrop->srcpad; structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_double (structure, "framerate", &fps); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; if (gst_pad_is_negotiated (otherpad)) { othercaps = gst_caps_copy (caps); @@ -194,8 +186,7 @@ gst_videodrop_link (GstPad *pad, const GstCaps *caps) } else { otherfps = videodrop->to_fps; } - gst_caps_set_simple (othercaps, - "framerate", G_TYPE_DOUBLE, otherfps, NULL); + gst_caps_set_simple (othercaps, "framerate", G_TYPE_DOUBLE, otherfps, NULL); link_ret = gst_pad_try_set_caps (otherpad, othercaps); if (GST_PAD_LINK_FAILED (link_ret)) { return link_ret; @@ -212,21 +203,23 @@ gst_videodrop_link (GstPad *pad, const GstCaps *caps) } static void -gst_videodrop_init (GstVideodrop *videodrop) +gst_videodrop_init (GstVideodrop * videodrop) { GST_FLAG_SET (videodrop, GST_ELEMENT_EVENT_AWARE); - + GST_DEBUG ("gst_videodrop_init"); - videodrop->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_videodrop_sink_template), "sink"); + videodrop->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_videodrop_sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (videodrop), videodrop->sinkpad); gst_pad_set_chain_function (videodrop->sinkpad, gst_videodrop_chain); gst_pad_set_getcaps_function (videodrop->sinkpad, gst_videodrop_getcaps); gst_pad_set_link_function (videodrop->sinkpad, gst_videodrop_link); - videodrop->srcpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&gst_videodrop_src_template), "src"); - gst_element_add_pad (GST_ELEMENT(videodrop), videodrop->srcpad); + videodrop->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&gst_videodrop_src_template), "src"); + gst_element_add_pad (GST_ELEMENT (videodrop), videodrop->srcpad); gst_pad_set_getcaps_function (videodrop->srcpad, gst_videodrop_getcaps); gst_pad_set_link_function (videodrop->srcpad, gst_videodrop_link); @@ -237,7 +230,7 @@ gst_videodrop_init (GstVideodrop *videodrop) } static void -gst_videodrop_chain (GstPad *pad, GstData *data) +gst_videodrop_chain (GstPad * pad, GstData * data) { GstVideodrop *videodrop = GST_VIDEODROP (gst_pad_get_parent (pad)); GstBuffer *buf; @@ -249,12 +242,13 @@ gst_videodrop_chain (GstPad *pad, GstData *data) /* since we rely on timestamps of the source, we need to handle * changes in time carefully. */ gint64 time; + if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &time)) { - videodrop->time_adjust = time; + videodrop->time_adjust = time; videodrop->total = videodrop->pass = 0; } else { - GST_ELEMENT_ERROR (videodrop, STREAM, TOO_LAZY, (NULL), - ("Received discont, but no time information")); + GST_ELEMENT_ERROR (videodrop, STREAM, TOO_LAZY, (NULL), + ("Received discont, but no time information")); gst_event_unref (event); return; } @@ -268,7 +262,8 @@ gst_videodrop_chain (GstPad *pad, GstData *data) videodrop->total++; while (((GST_BUFFER_TIMESTAMP (buf) - videodrop->time_adjust) * - videodrop->to_fps * videodrop->speed / GST_SECOND) >= videodrop->pass) { + videodrop->to_fps * videodrop->speed / GST_SECOND) >= + videodrop->pass) { /* since we write to the struct (time/duration), we need a new struct, * but we don't want to copy around data - a subbuffer is the easiest * way to accomplish that... */ @@ -276,7 +271,7 @@ gst_videodrop_chain (GstPad *pad, GstData *data) /* adjust timestamp/duration and push forward */ GST_BUFFER_TIMESTAMP (copy) = videodrop->time_adjust / videodrop->speed + - GST_SECOND * videodrop->pass / videodrop->to_fps; + GST_SECOND * videodrop->pass / videodrop->to_fps; GST_BUFFER_DURATION (copy) = GST_SECOND / videodrop->to_fps; gst_pad_push (videodrop->srcpad, GST_DATA (copy)); @@ -287,10 +282,8 @@ gst_videodrop_chain (GstPad *pad, GstData *data) } static void -gst_videodrop_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_videodrop_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstVideodrop *videodrop = GST_VIDEODROP (object); @@ -305,10 +298,8 @@ gst_videodrop_set_property (GObject *object, } static void -gst_videodrop_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_videodrop_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstVideodrop *videodrop = GST_VIDEODROP (object); @@ -323,7 +314,7 @@ gst_videodrop_get_property (GObject *object, } static GstElementStateReturn -gst_videodrop_change_state (GstElement *element) +gst_videodrop_change_state (GstElement * element) { GstVideodrop *videodrop = GST_VIDEODROP (element); @@ -344,19 +335,14 @@ gst_videodrop_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "videodrop", GST_RANK_NONE, GST_TYPE_VIDEODROP); + return gst_element_register (plugin, "videodrop", GST_RANK_NONE, + GST_TYPE_VIDEODROP); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "videodrop", - "Re-FPS'es video", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videodrop", + "Re-FPS'es video", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/videodrop/gstvideodrop.h b/gst/videodrop/gstvideodrop.h index 20f954a4..913c91b5 100644 --- a/gst/videodrop/gstvideodrop.h +++ b/gst/videodrop/gstvideodrop.h @@ -23,7 +23,6 @@ #include G_BEGIN_DECLS - #define GST_TYPE_VIDEODROP \ (gst_videodrop_get_type()) #define GST_VIDEODROP(obj) \ @@ -34,29 +33,28 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEODROP)) #define GST_IS_VIDEODROP_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEODROP)) - typedef struct _GstVideodrop GstVideodrop; typedef struct _GstVideodropClass GstVideodropClass; -struct _GstVideodrop { +struct _GstVideodrop +{ GstElement element; GstPad *sinkpad, *srcpad; /* video state */ gboolean inited; - gfloat from_fps, - to_fps; + gfloat from_fps, to_fps; gfloat speed; guint64 pass, total, time_adjust; }; -struct _GstVideodropClass { +struct _GstVideodropClass +{ GstElementClass parent_class; }; -GType gst_videodrop_get_type(void); +GType gst_videodrop_get_type (void); G_END_DECLS - #endif /* __GST_VIDEODROP_H__ */ diff --git a/gst/virtualdub/gstvirtualdub.c b/gst/virtualdub/gstvirtualdub.c index c6091233..2495d449 100644 --- a/gst/virtualdub/gstvirtualdub.c +++ b/gst/virtualdub/gstvirtualdub.c @@ -25,69 +25,68 @@ #include "gstvirtualdub.h" -struct _elements_entry { +struct _elements_entry +{ gchar *name; - GType (*type) (void); + GType (*type) (void); GstElementDetails *details; - gboolean (*factoryinit) (GstElementFactory *factory); + gboolean (*factoryinit) (GstElementFactory * factory); }; static struct _elements_entry _elements[] = { - { "xsharpen", gst_xsharpen_get_type, &gst_xsharpen_details, NULL }, - { NULL, 0 }, + {"xsharpen", gst_xsharpen_get_type, &gst_xsharpen_details, NULL}, + {NULL, 0}, }; -GstPadTemplate* +GstPadTemplate * gst_virtualdub_src_factory (void) { static GstPadTemplate *templ = NULL; + if (!templ) { - templ = GST_PAD_TEMPLATE_NEW ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "virtualdub_src", - "video/x-raw-rgb", - "bpp", GST_PROPS_INT (32), - "depth", GST_PROPS_INT (32), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "red_mask", GST_PROPS_INT (0xff0000), - "green_mask", GST_PROPS_INT (0xff00), - "blue_mask", GST_PROPS_INT (0xff), - "width", GST_PROPS_INT_RANGE (16, 4096), - "height", GST_PROPS_INT_RANGE (16, 4096), - "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT) - ) - ); + templ = GST_PAD_TEMPLATE_NEW ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("virtualdub_src", + "video/x-raw-rgb", + "bpp", GST_PROPS_INT (32), + "depth", GST_PROPS_INT (32), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "red_mask", GST_PROPS_INT (0xff0000), + "green_mask", GST_PROPS_INT (0xff00), + "blue_mask", GST_PROPS_INT (0xff), + "width", GST_PROPS_INT_RANGE (16, 4096), + "height", GST_PROPS_INT_RANGE (16, 4096), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT) + ) + ); } return templ; } -GstPadTemplate* +GstPadTemplate * gst_virtualdub_sink_factory (void) { static GstPadTemplate *templ = NULL; + if (!templ) { - templ = GST_PAD_TEMPLATE_NEW ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "virtualdub_sink", - "video/x-raw-rgb", - "bpp", GST_PROPS_INT (32), - "depth", GST_PROPS_INT (32), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "red_mask", GST_PROPS_INT (0xff0000), - "green_mask", GST_PROPS_INT (0xff00), - "blue_mask", GST_PROPS_INT (0xff), - "width", GST_PROPS_INT_RANGE (16, 4096), - "height", GST_PROPS_INT_RANGE (16, 4096), - "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT) - ) - ); + templ = GST_PAD_TEMPLATE_NEW ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("virtualdub_sink", + "video/x-raw-rgb", + "bpp", GST_PROPS_INT (32), + "depth", GST_PROPS_INT (32), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "red_mask", GST_PROPS_INT (0xff0000), + "green_mask", GST_PROPS_INT (0xff00), + "blue_mask", GST_PROPS_INT (0xff), + "width", GST_PROPS_INT_RANGE (16, 4096), + "height", GST_PROPS_INT_RANGE (16, 4096), + "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT) + ) + ); } return templ; } @@ -100,16 +99,16 @@ plugin_init (GModule * module, GstPlugin * plugin) while (_elements[i].name) { factory = gst_element_factory_new (_elements[i].name, - (_elements[i].type) (), - _elements[i].details); + (_elements[i].type) (), _elements[i].details); if (!factory) { - g_warning ("gst_virtualdub_new failed for `%s'", - _elements[i].name); + g_warning ("gst_virtualdub_new failed for `%s'", _elements[i].name); continue; } - gst_element_factory_add_pad_template (factory, gst_virtualdub_src_factory ()); - gst_element_factory_add_pad_template (factory, gst_virtualdub_sink_factory ()); + gst_element_factory_add_pad_template (factory, + gst_virtualdub_src_factory ()); + gst_element_factory_add_pad_template (factory, + gst_virtualdub_sink_factory ()); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); if (_elements[i].factoryinit) { diff --git a/gst/virtualdub/gstvirtualdub.h b/gst/virtualdub/gstvirtualdub.h index f55d85e8..286aa39d 100644 --- a/gst/virtualdub/gstvirtualdub.h +++ b/gst/virtualdub/gstvirtualdub.h @@ -18,12 +18,12 @@ #include -typedef unsigned int Pixel; -typedef unsigned int Pixel32; -typedef unsigned char Pixel8; -typedef int PixCoord; -typedef int PixDim; -typedef int PixOffset; +typedef unsigned int Pixel; +typedef unsigned int Pixel32; +typedef unsigned char Pixel8; +typedef int PixCoord; +typedef int PixDim; +typedef int PixOffset; #define R_MASK (0x00ff0000) diff --git a/gst/virtualdub/gstxsharpen.c b/gst/virtualdub/gstxsharpen.c index bc83ed62..df4d4547 100644 --- a/gst/virtualdub/gstxsharpen.c +++ b/gst/virtualdub/gstxsharpen.c @@ -57,8 +57,7 @@ GstElementDetails gst_xsharpen_details = { "", "Filter/Video/Effect", "LGPL", - "Apply a sharpen effect on video" - VERSION, + "Apply a sharpen effect on video" VERSION, "Jeremy SIMON ", "(C) 2000 Donald Graft", }; @@ -78,19 +77,20 @@ enum ARG_0, }; -static void gst_xsharpen_class_init (GstXsharpenClass * klass); -static void gst_xsharpen_init (GstXsharpen * sharpen); +static void gst_xsharpen_class_init (GstXsharpenClass * klass); +static void gst_xsharpen_init (GstXsharpen * sharpen); -static void gst_xsharpen_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_xsharpen_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); +static void gst_xsharpen_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_xsharpen_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); -static void gst_xsharpen_chain (GstPad * pad, GstData *_data); +static void gst_xsharpen_chain (GstPad * pad, GstData * _data); static GstElementClass *parent_class = NULL; -GType gst_xsharpen_get_type (void) +GType +gst_xsharpen_get_type (void) { static GType xsharpen_type = 0; @@ -106,7 +106,9 @@ GType gst_xsharpen_get_type (void) (GInstanceInitFunc) gst_xsharpen_init, }; - xsharpen_type = g_type_register_static (GST_TYPE_ELEMENT, "GstXsharpen", &xsharpen_info, 0); + xsharpen_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstXsharpen", &xsharpen_info, + 0); } return xsharpen_type; } @@ -122,13 +124,13 @@ gst_xsharpen_class_init (GstXsharpenClass * klass) parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_STRENGTH, - g_param_spec_int("strength", "strength", "strength", - 0, 255, 255, (GParamFlags)G_PARAM_READWRITE )); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_STRENGTH, + g_param_spec_int ("strength", "strength", "strength", + 0, 255, 255, (GParamFlags) G_PARAM_READWRITE)); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_THRESHOLD, - g_param_spec_int("threshold", "threshold", "threshold", - 0, 255, 255, (GParamFlags)G_PARAM_READWRITE )); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_THRESHOLD, + g_param_spec_int ("threshold", "threshold", "threshold", + 0, 255, 255, (GParamFlags) G_PARAM_READWRITE)); gobject_class->set_property = gst_xsharpen_set_property; gobject_class->get_property = gst_xsharpen_get_property; @@ -147,7 +149,7 @@ gst_xsharpen_sinkconnect (GstPad * pad, GstCaps * caps) gst_caps_get_int (caps, "width", &sharpen->width); gst_caps_get_int (caps, "height", &sharpen->height); - sharpen->strengthinv = 255 - sharpen->strength; + sharpen->strengthinv = 255 - sharpen->strength; sharpen->dstpitch = sharpen->srcpitch = sharpen->width * sizeof (Pixel32); @@ -157,72 +159,74 @@ gst_xsharpen_sinkconnect (GstPad * pad, GstCaps * caps) static void gst_xsharpen_init (GstXsharpen * sharpen) { - sharpen->sinkpad = gst_pad_new_from_template (gst_virtualdub_sink_factory (), "sink"); + sharpen->sinkpad = + gst_pad_new_from_template (gst_virtualdub_sink_factory (), "sink"); gst_pad_set_chain_function (sharpen->sinkpad, gst_xsharpen_chain); gst_pad_set_link_function (sharpen->sinkpad, gst_xsharpen_sinkconnect); gst_element_add_pad (GST_ELEMENT (sharpen), sharpen->sinkpad); - sharpen->srcpad = gst_pad_new_from_template (gst_virtualdub_src_factory (), "src"); + sharpen->srcpad = + gst_pad_new_from_template (gst_virtualdub_src_factory (), "src"); gst_element_add_pad (GST_ELEMENT (sharpen), sharpen->srcpad); } static void -gst_xsharpen_chain (GstPad * pad, GstData *_data) +gst_xsharpen_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstXsharpen *xsharpen; - GstBuffer *outbuf; - gint x, y; - gint r, g, b, R, G, B; - Pixel32 p, min, max; - gint luma, lumac, lumamax, lumamin, mindiff, maxdiff; - Pixel32 *src_buf, *dst_buf, *src, *dst; + GstBuffer *outbuf; + gint x, y; + gint r, g, b, R, G, B; + Pixel32 p, min, max; + gint luma, lumac, lumamax, lumamin, mindiff, maxdiff; + Pixel32 *src_buf, *dst_buf, *src, *dst; xsharpen = GST_XSHARPEN (gst_pad_get_parent (pad)); - outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = ( xsharpen->width * xsharpen->height * sizeof (Pixel32)); + outbuf = gst_buffer_new (); + GST_BUFFER_SIZE (outbuf) = + (xsharpen->width * xsharpen->height * sizeof (Pixel32)); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); - - src_buf = (Pixel32 *)GST_BUFFER_DATA (buf); - dst_buf = (Pixel32 *)GST_BUFFER_DATA (outbuf); + + src_buf = (Pixel32 *) GST_BUFFER_DATA (buf); + dst_buf = (Pixel32 *) GST_BUFFER_DATA (outbuf); min = max = 0; /* First copy through the four border lines. */ src = src_buf; dst = dst_buf; - for (x = 0; x < xsharpen->width; x++) - { + for (x = 0; x < xsharpen->width; x++) { dst[x] = src[x]; } - - src = (Pixel *)((char *)src_buf + (xsharpen->height - 1) * xsharpen->srcpitch); - dst = (Pixel *)((char *)dst_buf + (xsharpen->height - 1) * xsharpen->dstpitch); - - for (x = 0; x < xsharpen->width; x++) - { + + src = + (Pixel *) ((char *) src_buf + (xsharpen->height - + 1) * xsharpen->srcpitch); + dst = + (Pixel *) ((char *) dst_buf + (xsharpen->height - + 1) * xsharpen->dstpitch); + + for (x = 0; x < xsharpen->width; x++) { dst[x] = src[x]; } - + src = src_buf; dst = dst_buf; - - for (y = 0; y < xsharpen->height; y++) - { + + for (y = 0; y < xsharpen->height; y++) { dst[0] = src[0]; - dst[xsharpen->width-1] = src[xsharpen->width-1]; - src = (Pixel *)((char *)src + xsharpen->srcpitch); - dst = (Pixel *)((char *)dst + xsharpen->dstpitch); + dst[xsharpen->width - 1] = src[xsharpen->width - 1]; + src = (Pixel *) ((char *) src + xsharpen->srcpitch); + dst = (Pixel *) ((char *) dst + xsharpen->dstpitch); } /* Now calculate and store the pixel luminances for the remaining pixels. */ src = src_buf; - for (y = 0; y < xsharpen->height; y++) - { - for (x = 0; x < xsharpen->width; x++) - { + for (y = 0; y < xsharpen->height; y++) { + for (x = 0; x < xsharpen->width; x++) { r = (src[x] >> 16) & 0xff; g = (src[x] >> 8) & 0xff; b = src[x] & 0xff; @@ -230,138 +234,118 @@ gst_xsharpen_chain (GstPad * pad, GstData *_data) src[x] &= 0x00ffffff; src[x] |= (luma << 24); } - src = (Pixel *)((char *)src + xsharpen->srcpitch); + src = (Pixel *) ((char *) src + xsharpen->srcpitch); } /* Finally run the 3x3 rank-order sharpening kernel over the pixels. */ - src = (Pixel *)((char *)src_buf + xsharpen->srcpitch); - dst = (Pixel *)((char *)dst_buf + xsharpen->dstpitch); - - for (y = 1; y < xsharpen->height - 1; y++) - { - for (x = 1; x < xsharpen->width - 1; x++) - { + src = (Pixel *) ((char *) src_buf + xsharpen->srcpitch); + dst = (Pixel *) ((char *) dst_buf + xsharpen->dstpitch); + + for (y = 1; y < xsharpen->height - 1; y++) { + for (x = 1; x < xsharpen->width - 1; x++) { /* Find the brightest and dimmest pixels in the 3x3 window surrounding the current pixel. */ - + lumamax = -1; lumamin = 1000; - - p = ((Pixel32 *)((char *)src - xsharpen->srcpitch))[x-1]; + + p = ((Pixel32 *) ((char *) src - xsharpen->srcpitch))[x - 1]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - p = ((Pixel32 *)((char *)src - xsharpen->srcpitch))[x]; + p = ((Pixel32 *) ((char *) src - xsharpen->srcpitch))[x]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - - p = ((Pixel32 *)((char *)src - xsharpen->srcpitch))[x+1]; + + p = ((Pixel32 *) ((char *) src - xsharpen->srcpitch))[x + 1]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - - p = src[x-1]; + + p = src[x - 1]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } p = src[x]; lumac = luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - p = src[x+1]; + p = src[x + 1]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - - p = ((Pixel32 *)((char *)src + xsharpen->srcpitch))[x-1]; + + p = ((Pixel32 *) ((char *) src + xsharpen->srcpitch))[x - 1]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - p = ((Pixel32 *)((char *)src + xsharpen->srcpitch))[x]; + p = ((Pixel32 *) ((char *) src + xsharpen->srcpitch))[x]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } - p = ((Pixel32 *)((char *)src + xsharpen->srcpitch))[x+1]; + p = ((Pixel32 *) ((char *) src + xsharpen->srcpitch))[x + 1]; luma = p >> 24; - if (luma > lumamax) - { - lumamax = luma; - max = p; + if (luma > lumamax) { + lumamax = luma; + max = p; } - if (luma < lumamin) - { - lumamin = luma; - min = p; + if (luma < lumamin) { + lumamin = luma; + min = p; } /* Determine whether the current pixel is closer to the @@ -369,48 +353,39 @@ gst_xsharpen_chain (GstPad * pad, GstData *_data) pixel to that closest pixel. If the difference is within threshold, map the current pixel to the closest pixel; otherwise pass it through. */ - + p = -1; - if (xsharpen->strength != 0) - { - mindiff = lumac - lumamin; - maxdiff = lumamax - lumac; - if (mindiff > maxdiff) - { - if (maxdiff < xsharpen->threshold) - { - p = max; - } - } - else - { - if (mindiff < xsharpen->threshold) - { - p = min; - } - } + if (xsharpen->strength != 0) { + mindiff = lumac - lumamin; + maxdiff = lumamax - lumac; + if (mindiff > maxdiff) { + if (maxdiff < xsharpen->threshold) { + p = max; + } + } else { + if (mindiff < xsharpen->threshold) { + p = min; + } + } } - if (p == -1) - { - dst[x] = src[x]; - } - else - { - R = (src[x] >> 16) & 0xff; - G = (src[x] >> 8) & 0xff; - B = src[x] & 0xff; - r = (p >> 16) & 0xff; - g = (p >> 8) & 0xff; - b = p & 0xff; - r = (xsharpen->strength * r + xsharpen->strengthinv * R) / 255; - g = (xsharpen->strength * g + xsharpen->strengthinv * G) / 255; - b = (xsharpen->strength * b + xsharpen->strengthinv * B) / 255; - dst[x] = (r << 16) | (g << 8) | b; + if (p == -1) { + dst[x] = src[x]; + } else { + R = (src[x] >> 16) & 0xff; + G = (src[x] >> 8) & 0xff; + B = src[x] & 0xff; + r = (p >> 16) & 0xff; + g = (p >> 8) & 0xff; + b = p & 0xff; + r = (xsharpen->strength * r + xsharpen->strengthinv * R) / 255; + g = (xsharpen->strength * g + xsharpen->strengthinv * G) / 255; + b = (xsharpen->strength * b + xsharpen->strengthinv * B) / 255; + dst[x] = (r << 16) | (g << 8) | b; } } - src = (Pixel *)((char *)src + xsharpen->srcpitch); - dst = (Pixel *)((char *)dst + xsharpen->dstpitch); + src = (Pixel *) ((char *) src + xsharpen->srcpitch); + dst = (Pixel *) ((char *) dst + xsharpen->dstpitch); } gst_buffer_unref (buf); @@ -419,7 +394,8 @@ gst_xsharpen_chain (GstPad * pad, GstData *_data) } static void -gst_xsharpen_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +gst_xsharpen_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstXsharpen *xsharpen; @@ -432,7 +408,7 @@ gst_xsharpen_set_property (GObject * object, guint prop_id, const GValue * value case ARG_STRENGTH: xsharpen->strength = g_value_get_int (value); xsharpen->strengthinv = 255 - xsharpen->strength; - case ARG_THRESHOLD: + case ARG_THRESHOLD: xsharpen->threshold = g_value_get_int (value); default: break; @@ -440,7 +416,8 @@ gst_xsharpen_set_property (GObject * object, guint prop_id, const GValue * value } static void -gst_xsharpen_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +gst_xsharpen_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstXsharpen *xsharpen; @@ -451,10 +428,10 @@ gst_xsharpen_get_property (GObject * object, guint prop_id, GValue * value, GPar switch (prop_id) { case ARG_STRENGTH: - g_value_set_int (value, xsharpen->strength ); + g_value_set_int (value, xsharpen->strength); break; case ARG_THRESHOLD: - g_value_set_int (value, xsharpen->threshold ); + g_value_set_int (value, xsharpen->threshold); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/gst/y4m/gsty4mencode.c b/gst/y4m/gsty4mencode.c index d27ff613..3c9c9fbe 100644 --- a/gst/y4m/gsty4mencode.c +++ b/gst/y4m/gsty4mencode.c @@ -26,83 +26,74 @@ #include #include "gsty4mencode.h" -static GstElementDetails y4mencode_details = GST_ELEMENT_DETAILS ( - "Y4mEncode", - "Codec/Encoder/Video", - "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", - "Wim Taymans " -); +static GstElementDetails y4mencode_details = GST_ELEMENT_DETAILS ("Y4mEncode", + "Codec/Encoder/Video", + "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", + "Wim Taymans "); /* Filter signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0 }; static GstStaticPadTemplate y4mencode_src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("application/x-yuv4mpeg, " - "y4mversion = (int) 1" - ) -); +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/x-yuv4mpeg, " "y4mversion = (int) 1") + ); static GstStaticPadTemplate y4mencode_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) -); - -static void gst_y4mencode_base_init (gpointer g_class); -static void gst_y4mencode_class_init (GstY4mEncodeClass *klass); -static void gst_y4mencode_init (GstY4mEncode *filter); - -static void gst_y4mencode_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_y4mencode_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); - -static void gst_y4mencode_chain (GstPad *pad, - GstData *_data); -static GstElementStateReturn - gst_y4mencode_change_state (GstElement *element); +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +static void gst_y4mencode_base_init (gpointer g_class); +static void gst_y4mencode_class_init (GstY4mEncodeClass * klass); +static void gst_y4mencode_init (GstY4mEncode * filter); + +static void gst_y4mencode_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_y4mencode_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static void gst_y4mencode_chain (GstPad * pad, GstData * _data); +static GstElementStateReturn gst_y4mencode_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_filter_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_y4mencode_get_type(void) { +gst_y4mencode_get_type (void) +{ static GType y4mencode_type = 0; if (!y4mencode_type) { static const GTypeInfo y4mencode_info = { - sizeof(GstY4mEncodeClass), + sizeof (GstY4mEncodeClass), gst_y4mencode_base_init, NULL, - (GClassInitFunc)gst_y4mencode_class_init, + (GClassInitFunc) gst_y4mencode_class_init, NULL, NULL, - sizeof(GstY4mEncode), + sizeof (GstY4mEncode), 0, - (GInstanceInitFunc)gst_y4mencode_init, + (GInstanceInitFunc) gst_y4mencode_init, }; - y4mencode_type = g_type_register_static(GST_TYPE_ELEMENT, - "GstY4mEncode", - &y4mencode_info, 0); + y4mencode_type = g_type_register_static (GST_TYPE_ELEMENT, + "GstY4mEncode", &y4mencode_info, 0); } return y4mencode_type; } @@ -112,23 +103,23 @@ static void gst_y4mencode_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&y4mencode_src_factory)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&y4mencode_sink_factory)); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&y4mencode_src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&y4mencode_sink_factory)); gst_element_class_set_details (element_class, &y4mencode_details); } static void -gst_y4mencode_class_init (GstY4mEncodeClass *klass) +gst_y4mencode_class_init (GstY4mEncodeClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_y4mencode_change_state; @@ -137,16 +128,16 @@ gst_y4mencode_class_init (GstY4mEncodeClass *klass) } static GstPadLinkReturn -gst_y4mencode_sinkconnect (GstPad *pad, const GstCaps *caps) +gst_y4mencode_sinkconnect (GstPad * pad, const GstCaps * caps) { GstY4mEncode *filter; gint idx = -1, i; gdouble fps; gdouble framerates[] = { 00.000, - 23.976, 24.000, /* 24fps movie */ - 25.000, /* PAL */ - 29.970, 30.000, /* NTSC */ + 23.976, 24.000, /* 24fps movie */ + 25.000, /* PAL */ + 29.970, 30.000, /* NTSC */ 50.000, 59.940, 60.000 }; @@ -156,20 +147,20 @@ gst_y4mencode_sinkconnect (GstPad *pad, const GstCaps *caps) structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "width", &filter->width); - gst_structure_get_int (structure, "height", &filter->height); - gst_structure_get_double (structure, "framerate", &fps); + gst_structure_get_int (structure, "width", &filter->width); + gst_structure_get_int (structure, "height", &filter->height); + gst_structure_get_double (structure, "framerate", &fps); /* find fps idx */ for (i = 1; i < 9; i++) { if (idx == -1) { - idx = i; + idx = i; } else { - gdouble old_diff = fabs(framerates[idx] - fps), - new_diff = fabs(framerates[i] - fps); + gdouble old_diff = fabs (framerates[idx] - fps), + new_diff = fabs (framerates[i] - fps); if (new_diff < old_diff) { - idx = i; + idx = i; } } } @@ -179,37 +170,39 @@ gst_y4mencode_sinkconnect (GstPad *pad, const GstCaps *caps) } static void -gst_y4mencode_init (GstY4mEncode *filter) +gst_y4mencode_init (GstY4mEncode * filter) { - filter->sinkpad = gst_pad_new_from_template( - gst_static_pad_template_get (&y4mencode_sink_factory), "sink"); + filter->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&y4mencode_sink_factory), "sink"); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_pad_set_chain_function (filter->sinkpad, gst_y4mencode_chain); gst_pad_set_link_function (filter->sinkpad, gst_y4mencode_sinkconnect); - filter->srcpad = gst_pad_new_from_template( - gst_static_pad_template_get (&y4mencode_src_factory), "src"); + filter->srcpad = + gst_pad_new_from_template (gst_static_pad_template_get + (&y4mencode_src_factory), "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->init = TRUE; } static void -gst_y4mencode_chain (GstPad *pad,GstData *_data) +gst_y4mencode_chain (GstPad * pad, GstData * _data) { GstBuffer *buf = GST_BUFFER (_data); GstY4mEncode *filter; - GstBuffer* outbuf; + GstBuffer *outbuf; gchar *header; gint len; - g_return_if_fail(pad != NULL); - g_return_if_fail(GST_IS_PAD(pad)); - g_return_if_fail(buf != NULL); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + g_return_if_fail (buf != NULL); filter = GST_Y4MENCODE (gst_pad_get_parent (pad)); - g_return_if_fail(filter != NULL); - g_return_if_fail(GST_IS_Y4MENCODE(filter)); + g_return_if_fail (filter != NULL); + g_return_if_fail (GST_IS_Y4MENCODE (filter)); outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (buf) + 256); @@ -217,31 +210,32 @@ gst_y4mencode_chain (GstPad *pad,GstData *_data) if (filter->init) { header = "YUV4MPEG %d %d %d\nFRAME\n"; filter->init = FALSE; - } - else { + } else { header = "FRAME\n"; } snprintf (GST_BUFFER_DATA (outbuf), 255, header, - filter->width, filter->height, filter->fps_idx); + filter->width, filter->height, filter->fps_idx); len = strlen (GST_BUFFER_DATA (outbuf)); - memcpy (GST_BUFFER_DATA (outbuf) + len, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + memcpy (GST_BUFFER_DATA (outbuf) + len, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf) + len; - gst_buffer_unref(buf); + gst_buffer_unref (buf); - gst_pad_push(filter->srcpad,GST_DATA (outbuf)); + gst_pad_push (filter->srcpad, GST_DATA (outbuf)); } static void -gst_y4mencode_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +gst_y4mencode_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) { GstY4mEncode *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_Y4MENCODE(object)); - filter = GST_Y4MENCODE(object); + g_return_if_fail (GST_IS_Y4MENCODE (object)); + filter = GST_Y4MENCODE (object); switch (prop_id) { default: @@ -250,13 +244,14 @@ gst_y4mencode_set_property (GObject *object, guint prop_id, const GValue *value, } static void -gst_y4mencode_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_y4mencode_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstY4mEncode *filter; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_Y4MENCODE(object)); - filter = GST_Y4MENCODE(object); + g_return_if_fail (GST_IS_Y4MENCODE (object)); + filter = GST_Y4MENCODE (object); switch (prop_id) { default: @@ -266,13 +261,13 @@ gst_y4mencode_get_property (GObject *object, guint prop_id, GValue *value, GPara } static GstElementStateReturn -gst_y4mencode_change_state (GstElement *element) +gst_y4mencode_change_state (GstElement * element) { GstY4mEncode *filter; g_return_val_if_fail (GST_IS_Y4MENCODE (element), GST_STATE_FAILURE); - filter = GST_Y4MENCODE(element); + filter = GST_Y4MENCODE (element); if (GST_STATE_TRANSITION (element) == GST_STATE_NULL_TO_READY) { filter->init = TRUE; @@ -285,19 +280,14 @@ gst_y4mencode_change_state (GstElement *element) } static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { - return gst_element_register (plugin, "y4menc", GST_RANK_NONE, GST_TYPE_Y4MENCODE); + return gst_element_register (plugin, "y4menc", GST_RANK_NONE, + GST_TYPE_Y4MENCODE); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "y4menc", - "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", - plugin_init, - VERSION, - GST_LICENSE, - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "y4menc", + "Encodes a YUV frame into the yuv4mpeg format (mjpegtools)", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN) diff --git a/gst/y4m/gsty4mencode.h b/gst/y4m/gsty4mencode.h index 07d369cc..607b3e6d 100644 --- a/gst/y4m/gsty4mencode.h +++ b/gst/y4m/gsty4mencode.h @@ -27,8 +27,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_Y4MENCODE \ @@ -42,30 +43,32 @@ extern "C" { #define GST_IS_Y4MENCODE_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_Y4MENCODE)) -typedef struct _GstY4mEncode GstY4mEncode; -typedef struct _GstY4mEncodeClass GstY4mEncodeClass; + typedef struct _GstY4mEncode GstY4mEncode; + typedef struct _GstY4mEncodeClass GstY4mEncodeClass; -struct _GstY4mEncode { - GstElement element; + struct _GstY4mEncode + { + GstElement element; - GstPad *sinkpad,*srcpad; + GstPad *sinkpad, *srcpad; - gint width, height; - gfloat fps_idx; + gint width, height; + gfloat fps_idx; - gboolean init; + gboolean init; -}; + }; -struct _GstY4mEncodeClass { - GstElementClass parent_class; -}; + struct _GstY4mEncodeClass + { + GstElementClass parent_class; + }; -GType gst_y4mencode_get_type(void); + GType gst_y4mencode_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_Y4MENCODE_H__ */ +#endif /* __GST_Y4MENCODE_H__ */ -- cgit v1.2.1