summaryrefslogtreecommitdiffstats
path: root/gst/avi/gstcdxaparse.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2002-04-20 21:42:51 +0000
committerAndy Wingo <wingo@pobox.com>2002-04-20 21:42:51 +0000
commitcca77e215b01ddf27c13eff5c105883c94e95dc2 (patch)
tree5a3f86ec87b4e63871e6af52abb27ce2d204d8f1 /gst/avi/gstcdxaparse.c
parentd4458d89c9dd748f39219a2b0e0df61dfc0cf4eb (diff)
a hack to work around intltool's brokenness a current check for mpeg2dec details->klass reorganizations an element br...
Original commit message from CVS: * a hack to work around intltool's brokenness * a current check for mpeg2dec * details->klass reorganizations * an element browser that uses details->klass * separated cdxa parse out from the avi directory
Diffstat (limited to 'gst/avi/gstcdxaparse.c')
-rw-r--r--gst/avi/gstcdxaparse.c363
1 files changed, 0 insertions, 363 deletions
diff --git a/gst/avi/gstcdxaparse.c b/gst/avi/gstcdxaparse.c
deleted file mode 100644
index 5d26e45a..00000000
--- a/gst/avi/gstcdxaparse.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- * <2002> Wim Taymans <wim.taymans@chello.be>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-
-#include <string.h>
-
-#include "gstcdxaparse.h"
-
-#define MAKE_FOUR_CC(a,b,c,d) ( ((guint32)a) | (((guint32)b)<< 8) | \
- ((guint32)c)<<16 | (((guint32)d)<<24) )
-
-
-/* RIFF types */
-#define GST_RIFF_TAG_RIFF MAKE_FOUR_CC('R','I','F','F')
-#define GST_RIFF_RIFF_CDXA MAKE_FOUR_CC('C','D','X','A')
-
-
-#define GST_RIFF_TAG_fmt MAKE_FOUR_CC('f','m','t',' ')
-#define GST_RIFF_TAG_data MAKE_FOUR_CC('d','a','t','a')
-
-
-/* elementfactory information */
-static GstElementDetails gst_cdxa_parse_details = {
- ".dat parser",
- "Parser/Video",
- "Parse a .dat file (VCD) into raw mpeg1",
- VERSION,
- "Wim Taymans <wim.taymans@tvd.be>",
- "(C) 2002",
-};
-
-static GstCaps* cdxa_type_find (GstBuffer *buf, gpointer private);
-
-/* typefactory for 'cdxa' */
-static GstTypeDefinition cdxadefinition = {
- "cdxaparse_video/avi",
- "video/avi",
- ".dat",
- cdxa_type_find,
-};
-
-/* CDXAParse signals and args */
-enum {
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- /* FILL ME */
-};
-
-GST_PAD_TEMPLATE_FACTORY (sink_templ,
- "sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "cdxaparse_sink",
- "video/avi",
- "format", GST_PROPS_STRING ("CDXA")
- )
-)
-
-GST_PAD_TEMPLATE_FACTORY (src_templ,
- "src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "cdxaparse_src",
- "video/mpeg",
- "mpegversion", GST_PROPS_INT (1),
- "systemstream", GST_PROPS_BOOLEAN (TRUE)
- )
-)
-
-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)
-{
- static GType cdxa_parse_type = 0;
-
- if (!cdxa_parse_type) {
- static const GTypeInfo cdxa_parse_info = {
- sizeof(GstCDXAParseClass),
- NULL,
- NULL,
- (GClassInitFunc)gst_cdxa_parse_class_init,
- NULL,
- NULL,
- sizeof(GstCDXAParse),
- 0,
- (GInstanceInitFunc)gst_cdxa_parse_init,
- };
- cdxa_parse_type = g_type_register_static(GST_TYPE_ELEMENT, "GstCDXAParse", &cdxa_parse_info, 0);
- }
- return cdxa_parse_type;
-}
-
-static void
-gst_cdxa_parse_class_init (GstCDXAParseClass *klass)
-{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- 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)
-{
- GST_FLAG_SET (cdxa_parse, GST_ELEMENT_EVENT_AWARE);
-
- cdxa_parse->sinkpad = gst_pad_new_from_template (
- GST_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_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);
-
-}
-
-static GstCaps*
-cdxa_type_find (GstBuffer *buf,
- gpointer private)
-{
- gchar *data = GST_BUFFER_DATA (buf);
- GstCaps *new;
-
- GST_DEBUG (0,"cdxa_parse: typefind");
-
- if (GUINT32_FROM_LE (((guint32 *)data)[0]) != GST_RIFF_TAG_RIFF)
- return NULL;
- if (GUINT32_FROM_LE (((guint32 *)data)[2]) != GST_RIFF_RIFF_CDXA)
- return NULL;
-
- new = GST_CAPS_NEW ("cdxa_type_find",
- "video/avi",
- "RIFF", GST_PROPS_STRING ("CDXA"));
-
- return new;
-}
-
-static gboolean
-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;
-
- switch (type) {
- case GST_EVENT_EOS:
- gst_pad_event_default (cdxa_parse->sinkpad, event);
- break;
- case GST_EVENT_SEEK:
- g_warning ("seek event\n");
- break;
- case GST_EVENT_FLUSH:
- g_warning ("flush event\n");
- break;
- case GST_EVENT_DISCONTINUOUS:
- g_warning ("discont event\n");
- break;
- default:
- g_warning ("unhandled event %d\n", type);
- break;
- }
-
- return TRUE;
-}
-
-/*
-
-CDXA starts with the following header:
-
-! RIFF:4 ! size:4 ! "CDXA" ! "fmt " ! size:4 ! (size+1)&~1 bytes of crap !
-! "data" ! data_size:4 ! (data_size/2352) sectors...
-
-*/
-
-typedef struct
-{
- gchar RIFF_tag[4];
- guint32 riff_size;
- gchar CDXA_tag[4];
- gchar fmt_tag[4];
- guint32 fmt_size;
-} CDXAParseHeader;
-
-/*
-A sectors is 2352 bytes long and is composed of:
-
-! sync ! header ! subheader ! data ... ! edc !
-! 12 bytes ! 4 bytes ! 8 bytes ! 2324 bytes ! 4 bytes !
-!-------------------------------------------------------!
-
-We parse the data out of it and send it to the srcpad.
-*/
-
-static void
-gst_cdxa_parse_loop (GstElement *element)
-{
- GstCDXAParse *cdxa_parse;
- CDXAParseHeader *header;
-
- g_return_if_fail (element != NULL);
- g_return_if_fail (GST_IS_CDXA_PARSE (element));
-
- cdxa_parse = GST_CDXA_PARSE (element);
-
- if (cdxa_parse->state == CDXA_PARSE_HEADER) {
- guint32 fmt_size;
- guint8 *buf;
-
- header = (CDXAParseHeader *) gst_bytestream_peek_bytes (cdxa_parse->bs, 20);
- if (!header)
- return;
-
- cdxa_parse->riff_size = GUINT32_FROM_LE (header->riff_size);
- 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 */
- buf = gst_bytestream_peek_bytes (cdxa_parse->bs, 4);
- if (!buf)
- return;
- cdxa_parse->data_size = GUINT32_FROM_LE (*((guint32 *)buf));
-
- /* flush the data size */
- if (!gst_bytestream_flush (cdxa_parse->bs, 4))
- return;
-
- if (cdxa_parse->data_size % CDXA_SECTOR_SIZE)
- 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 {
- GstBuffer *buf;
- GstBuffer *outbuf;
-
- buf = gst_bytestream_read (cdxa_parse->bs, CDXA_SECTOR_SIZE);
- if (!buf) {
- gst_cdxa_parse_handle_event (cdxa_parse);
- return;
- }
-
- outbuf = gst_buffer_create_sub (buf, 24, CDXA_DATA_SIZE);
- gst_buffer_unref (buf);
-
- gst_pad_push (cdxa_parse->srcpad, outbuf);
- }
-}
-
-static GstElementStateReturn
-gst_cdxa_parse_change_state (GstElement *element)
-{
- GstCDXAParse *cdxa_parse = GST_CDXA_PARSE (element);
-
- switch (GST_STATE_TRANSITION (element)) {
- case GST_STATE_NULL_TO_READY:
- break;
- case GST_STATE_READY_TO_PAUSED:
- cdxa_parse->state = CDXA_PARSE_HEADER;
- cdxa_parse->bs = gst_bytestream_new (cdxa_parse->sinkpad);
- break;
- case GST_STATE_PAUSED_TO_PLAYING:
- break;
- case GST_STATE_PLAYING_TO_PAUSED:
- break;
- case GST_STATE_PAUSED_TO_READY:
- gst_bytestream_destroy (cdxa_parse->bs);
- break;
- case GST_STATE_READY_TO_NULL:
- break;
- default:
- break;
- }
-
- parent_class->change_state (element);
-
- return GST_STATE_SUCCESS;
-}
-
-static gboolean
-plugin_init (GModule *module, GstPlugin *plugin)
-{
- GstElementFactory *factory;
- GstTypeFactory *type;
-
- /* this filter needs the riff parser */
- if (!gst_library_load ("gstbytestream")) {
- gst_info("cdxaparse: could not load support library: 'gstbytestream'\n");
- return FALSE;
- }
-
- /* create an elementfactory for the cdxa_parse element */
- factory = gst_element_factory_new ("cdxaparse", GST_TYPE_CDXA_PARSE,
- &gst_cdxa_parse_details);
- g_return_val_if_fail (factory != NULL, FALSE);
-
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_templ));
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (sink_templ));
-
- type = gst_type_factory_new (&cdxadefinition);
- gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
-
- gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
-
- return TRUE;
-}
-
-GstPluginDesc plugin_desc = {
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "cdxaparse",
- plugin_init
-};
-