gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r9748 - Extractor/src/plugins


From: gnunet
Subject: [GNUnet-SVN] r9748 - Extractor/src/plugins
Date: Mon, 14 Dec 2009 15:26:01 +0100

Author: grothoff
Date: 2009-12-14 15:26:01 +0100 (Mon, 14 Dec 2009)
New Revision: 9748

Added:
   Extractor/src/plugins/asf_extractor.c
Removed:
   Extractor/src/plugins/asfextractor.c
Modified:
   Extractor/src/plugins/Makefile.am
   Extractor/src/plugins/applefile_extractor.c
Log:
asf

Modified: Extractor/src/plugins/Makefile.am
===================================================================
--- Extractor/src/plugins/Makefile.am   2009-12-14 14:18:47 UTC (rev 9747)
+++ Extractor/src/plugins/Makefile.am   2009-12-14 14:26:01 UTC (rev 9748)
@@ -87,6 +87,7 @@
 
 plugin_LTLIBRARIES = \
   libextractor_applefile.la \
+  libextractor_asf.la \
   libextractor_html.la \
   libextractor_it.la \
   libextractor_mime.la 
@@ -99,6 +100,11 @@
   $(top_builddir)/src/common/libextractor_common.la \
   $(LE_LIBINTL)
 
+libextractor_asf_la_SOURCES = \
+  asf_extractor.c 
+libextractor_asf_la_LDFLAGS = \
+  $(PLUGINFLAGS)
+
 libextractor_html_la_SOURCES = \
   html_extractor.c 
 libextractor_html_la_LDFLAGS = \
@@ -121,7 +127,6 @@
 
 OLD_LIBS = \
   $(pdfplugin) \
-  libextractor_asf.la \
   libextractor_deb.la \
   libextractor_dvi.la \
   libextractor_elf.la \
@@ -237,11 +242,6 @@
 libextractor_dvi_la_LDFLAGS = \
   $(PLUGINFLAGS)
 
-libextractor_asf_la_SOURCES = \
-  asfextractor.c 
-libextractor_asf_la_LDFLAGS = \
-  $(PLUGINFLAGS)
-
 if HAVE_ZLIB
 libextractor_tar_la_SOURCES = \
   tarextractor.c 

Modified: Extractor/src/plugins/applefile_extractor.c
===================================================================
--- Extractor/src/plugins/applefile_extractor.c 2009-12-14 14:18:47 UTC (rev 
9747)
+++ Extractor/src/plugins/applefile_extractor.c 2009-12-14 14:26:01 UTC (rev 
9748)
@@ -127,7 +127,7 @@
        (memcmp(header.magic, APPLEDOUBLE_SIGNATURE, 4) != 0) )
     return 0;
   if (0 != proc (proc_cls, 
-                "html",
+                "applefile",
                 EXTRACTOR_METATYPE_MIMETYPE,
                 EXTRACTOR_METAFORMAT_UTF8,
                 "text/plain",
@@ -168,7 +168,7 @@
           snprintf (s, 13, "%.2f %s", (double) dsc.length, _("Bytes"));
 
        if (0 != proc (proc_cls, 
-                      "html",
+                      "applefile",
                       EXTRACTOR_METATYPE_EMBEDDED_FILE_SIZE,
                       EXTRACTOR_METAFORMAT_UTF8,
                       "text/plain",
@@ -185,7 +185,7 @@
            memcpy(s, data + dsc.offset, dsc.length);
            s[dsc.length] = '\0';
            if (0 != proc (proc_cls, 
-                          "html",
+                          "applefile",
                           EXTRACTOR_METATYPE_FILENAME,
                           EXTRACTOR_METAFORMAT_UTF8,
                           "text/plain",
@@ -202,7 +202,7 @@
             memcpy(s, data + dsc.offset, dsc.length);
            s[dsc.length] = '\0';
            if (0 != proc (proc_cls, 
-                          "html",
+                          "applefile",
                           EXTRACTOR_METATYPE_COMMENT,
                           EXTRACTOR_METAFORMAT_UTF8,
                           "text/plain",
@@ -222,7 +222,7 @@
          memcpy(s, data + dsc.offset, 4);
          s[4] = '\0';
          if (0 != proc (proc_cls, 
-                        "html",
+                        "applefile",
                         EXTRACTOR_METATYPE_FINDER_FILE_TYPE,
                         EXTRACTOR_METAFORMAT_C_STRING,
                         "text/plain",
@@ -233,7 +233,7 @@
          memcpy(s, data + dsc.offset + 4, 4);
          s[4] = '\0';
          if (0 != proc (proc_cls, 
-                        "html",
+                        "applefile",
                         EXTRACTOR_METATYPE_FINDER_FILE_CREATOR,
                         EXTRACTOR_METAFORMAT_C_STRING,
                         "text/plain",

Copied: Extractor/src/plugins/asf_extractor.c (from rev 9746, 
Extractor/src/plugins/asfextractor.c)
===================================================================
--- Extractor/src/plugins/asf_extractor.c                               (rev 0)
+++ Extractor/src/plugins/asf_extractor.c       2009-12-14 14:26:01 UTC (rev 
9748)
@@ -0,0 +1,789 @@
+/*
+     This file is part of libextractor.
+     (C) 2002, 2003 Vidyut Samanta and Christian Grothoff
+
+     libextractor is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     libextractor 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
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with libextractor; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * This file is based on demux_asf from the xine project (copyright follows).
+ *
+ * Copyright (C) 2000-2002 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+ *
+ * $Id: asfextractor.c,v 1.6 2004/10/05 20:02:08 grothoff Exp $
+ *
+ * demultiplexer for asf streams
+ *
+ * based on ffmpeg's
+ * ASF compatible encoder and decoder.
+ * Copyright (c) 2000, 2001 Gerard Lantau.
+ *
+ * GUID list from avifile
+ * some other ideas from MPlayer
+ */
+
+#include "platform.h"
+#include "extractor.h"
+
+#define CODEC_TYPE_AUDIO       0
+#define CODEC_TYPE_VIDEO       1
+#define CODEC_TYPE_CONTROL     2
+#define MAX_NUM_STREAMS       23
+
+#define DEFRAG_BUFSIZE    65536
+#define DEMUX_START 1
+#define DEMUX_FINISHED 0
+
+
+/*
+ * define asf GUIDs (list from avifile)
+ */
+#define GUID_ERROR                              0
+
+    /* base ASF objects */
+#define GUID_ASF_HEADER                         1
+#define GUID_ASF_DATA                           2
+#define GUID_ASF_SIMPLE_INDEX                   3
+
+    /* header ASF objects */
+#define GUID_ASF_FILE_PROPERTIES                4
+#define GUID_ASF_STREAM_PROPERTIES              5
+#define GUID_ASF_STREAM_BITRATE_PROPERTIES      6
+#define GUID_ASF_CONTENT_DESCRIPTION            7
+#define GUID_ASF_EXTENDED_CONTENT_ENCRYPTION    8
+#define GUID_ASF_SCRIPT_COMMAND                 9
+#define GUID_ASF_MARKER                        10
+#define GUID_ASF_HEADER_EXTENSION              11
+#define GUID_ASF_BITRATE_MUTUAL_EXCLUSION      12
+#define GUID_ASF_CODEC_LIST                    13
+#define GUID_ASF_EXTENDED_CONTENT_DESCRIPTION  14
+#define GUID_ASF_ERROR_CORRECTION              15
+#define GUID_ASF_PADDING                       16
+
+    /* stream properties object stream type */
+#define GUID_ASF_AUDIO_MEDIA                   17
+#define GUID_ASF_VIDEO_MEDIA                   18
+#define GUID_ASF_COMMAND_MEDIA                 19
+
+    /* stream properties object error correction type */
+#define GUID_ASF_NO_ERROR_CORRECTION           20
+#define GUID_ASF_AUDIO_SPREAD                  21
+
+    /* mutual exclusion object exlusion type */
+#define GUID_ASF_MUTEX_BITRATE                 22
+#define GUID_ASF_MUTEX_UKNOWN                  23
+
+    /* header extension */
+#define GUID_ASF_RESERVED_1                    24
+
+    /* script command */
+#define GUID_ASF_RESERVED_SCRIPT_COMMNAND      25
+
+    /* marker object */
+#define GUID_ASF_RESERVED_MARKER               26
+
+    /* various */
+/*
+#define GUID_ASF_HEAD2                         27
+*/
+#define GUID_ASF_AUDIO_CONCEAL_NONE            27
+#define GUID_ASF_CODEC_COMMENT1_HEADER         28
+#define GUID_ASF_2_0_HEADER                    29
+
+#define GUID_END                               30
+
+
+/* asf stream types */
+#define ASF_STREAM_TYPE_UNKNOWN  0
+#define ASF_STREAM_TYPE_AUDIO    1
+#define ASF_STREAM_TYPE_VIDEO    2
+#define ASF_STREAM_TYPE_CONTROL  3
+
+#define ASF_MAX_NUM_STREAMS     23
+
+
+typedef unsigned long long ext_uint64_t;
+typedef unsigned int ext_uint32_t;
+typedef unsigned short ext_uint16_t;
+typedef unsigned char ext_uint8_t;
+
+typedef struct
+{
+  ext_uint32_t v1;
+  ext_uint16_t v2;
+  ext_uint16_t v3;
+  ext_uint8_t v4[8];
+} LE_GUID;
+
+static const struct
+{
+  const char *name;
+  const LE_GUID guid;
+} guids[] =
+{
+  {
+    "error",
+    {
+  0x0,}},
+    /* base ASF objects */
+  {
+    "header",
+    {
+      0x75b22630, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "data",
+    {
+      0x75b22636, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "simple index",
+    {
+      0x33000890, 0xe5b1, 0x11cf,
+      {
+  0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}},
+    /* header ASF objects */
+  {
+    "file properties",
+    {
+      0x8cabdca1, 0xa947, 0x11cf,
+      {
+  0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "stream header",
+    {
+      0xb7dc0791, 0xa9b7, 0x11cf,
+      {
+  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "stream bitrate properties",        /* (http://get.to/sdp) */
+    {
+      0x7bf875ce, 0x468d, 0x11d1,
+      {
+  0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}},
+  {
+    "content description",
+    {
+      0x75b22633, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "extended content encryption",
+    {
+      0x298ae614, 0x2622, 0x4c17,
+      {
+  0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c}}},
+  {
+    "script command",
+    {
+      0x1efb1a30, 0x0b62, 0x11d0,
+      {
+  0xa3, 0x9b, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "marker",
+    {
+      0xf487cd01, 0xa951, 0x11cf,
+      {
+  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "header extension",
+    {
+      0x5fbf03b5, 0xa92e, 0x11cf,
+      {
+  0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+  {
+    "bitrate mutual exclusion",
+    {
+      0xd6e229dc, 0x35da, 0x11d1,
+      {
+  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
+  {
+    "codec list",
+    {
+      0x86d15240, 0x311d, 0x11d0,
+      {
+  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "extended content description",
+    {
+      0xd2d0a440, 0xe307, 0x11d2,
+      {
+  0x97, 0xf0, 0x00, 0xa0, 0xc9, 0x5e, 0xa8, 0x50}}},
+  {
+    "error correction",
+    {
+      0x75b22635, 0x668e, 0x11cf,
+      {
+  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
+  {
+    "padding",
+    {
+      0x1806d474, 0xcadf, 0x4509,
+      {
+  0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8}}},
+    /* stream properties object stream type */
+  {
+    "audio media",
+    {
+      0xf8699e40, 0x5b4d, 0x11cf,
+      {
+  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
+  {
+    "video media",
+    {
+      0xbc19efc0, 0x5b4d, 0x11cf,
+      {
+  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
+  {
+    "command media",
+    {
+      0x59dacfc0, 0x59e6, 0x11d0,
+      {
+  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+    /* stream properties object error correction */
+  {
+    "no error correction",
+    {
+      0x20fb5700, 0x5b55, 0x11cf,
+      {
+  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
+  {
+    "audio spread",
+    {
+      0xbfc3cd50, 0x618f, 0x11cf,
+      {
+  0x8b, 0xb2, 0x00, 0xaa, 0x00, 0xb4, 0xe2, 0x20}}},
+    /* mutual exclusion object exlusion type */
+  {
+    "mutex bitrate",
+    {
+      0xd6e22a01, 0x35da, 0x11d1,
+      {
+  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
+  {
+    "mutex unknown",
+    {
+      0xd6e22a02, 0x35da, 0x11d1,
+      {
+  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
+    /* header extension */
+  {
+    "reserved_1",
+    {
+      0xabd3d211, 0xa9ba, 0x11cf,
+      {
+  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
+    /* script command */
+  {
+    "reserved script command",
+    {
+      0x4B1ACBE3, 0x100B, 0x11D0,
+      {
+  0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6}}},
+    /* marker object */
+  {
+    "reserved marker",
+    {
+      0x4CFEDB20, 0x75F6, 0x11CF,
+      {
+  0x9C, 0x0F, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB}}},
+    /* various */
+    /* Already defined (reserved_1)
+       { "head2",
+       { 0xabd3d211, 0xa9ba, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 
0x53, 0x65 }} },
+     */
+  {
+    "audio conceal none",
+    {
+      0x49f1a440, 0x4ece, 0x11d0,
+      {
+  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "codec comment1 header",
+    {
+      0x86d15241, 0x311d, 0x11d0,
+      {
+  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
+  {
+    "asf 2.0 header",
+    {
+      0xd6e229d1, 0x35da, 0x11d1,
+      {
+0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},};
+
+typedef struct
+{
+  int num;
+  int seq;
+
+  int frag_offset;
+  int64_t timestamp;
+  int ts_per_kbyte;
+  int defrag;
+
+  ext_uint32_t buf_type;
+  int stream_id;
+
+  ext_uint8_t *buffer;
+} asf_stream_t;
+
+typedef struct demux_asf_s
+{
+  /* pointer to the stream data */
+  const char *input;
+  /* current position in stream */
+  size_t inputPos;
+  size_t inputLen;
+
+  int keyframe_found;
+
+  int seqno;
+  ext_uint32_t packet_size;
+  ext_uint8_t packet_flags;
+  ext_uint32_t data_size;
+
+  ext_uint32_t bitrates[MAX_NUM_STREAMS];
+  int num_streams;
+  int num_audio_streams;
+  int num_video_streams;
+  int audio_stream;
+  int video_stream;
+  int audio_stream_id;
+  int video_stream_id;
+  int control_stream_id;
+
+  ext_uint16_t wavex[1024];
+  int wavex_size;
+
+  char title[512];
+  char author[512];
+  char copyright[512];
+  char comment[512];
+
+  ext_uint32_t length, rate;
+
+  /* packet filling */
+  int packet_size_left;
+
+  /* frame rate calculations, discontinuity detection */
+
+  int64_t last_pts[2];
+  int32_t frame_duration;
+  int send_newpts;
+  int64_t last_frame_pts;
+
+  /* only for reading */
+  ext_uint32_t packet_padsize;
+  int nb_frames;
+  ext_uint8_t frame_flag;
+  ext_uint8_t segtype;
+  int frame;
+
+  int status;
+
+  /* byte reordering from audio streams */
+  int reorder_h;
+  int reorder_w;
+  int reorder_b;
+
+  off_t header_size;
+  int buf_flag_seek;
+
+  /* first packet position */
+  int64_t first_packet_pos;
+
+  int reference_mode;
+} demux_asf_t;
+
+static int
+readBuf (demux_asf_t * this, void *buf, int len)
+{
+  int min;
+
+  min = len;
+  if (this->inputLen - this->inputPos < min)
+    min = this->inputLen - this->inputPos;
+  memcpy (buf, &this->input[this->inputPos], min);
+  this->inputPos += min;
+  return min;
+}
+
+static ext_uint8_t
+get_byte (demux_asf_t * this)
+{
+  ext_uint8_t buf;
+  int i;
+
+  i = readBuf (this, &buf, 1);
+  if (i != 1)
+    this->status = DEMUX_FINISHED;
+  return buf;
+}
+
+static ext_uint16_t
+get_le16 (demux_asf_t * this)
+{
+  ext_uint8_t buf[2];
+  int i;
+
+  i = readBuf (this, buf, 2);
+  if (i != 2)
+    this->status = DEMUX_FINISHED;
+  return buf[0] | (buf[1] << 8);
+}
+
+static ext_uint32_t
+get_le32 (demux_asf_t * this)
+{
+  ext_uint8_t buf[4];
+  int i;
+
+  i = readBuf (this, buf, 4);
+  if (i != 4)
+    this->status = DEMUX_FINISHED;
+  return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
+}
+
+static ext_uint64_t
+get_le64 (demux_asf_t * this)
+{
+  ext_uint8_t buf[8];
+  int i;
+
+  i = readBuf (this, buf, 8);
+  if (i != 8)
+    this->status = DEMUX_FINISHED;
+  return (ext_uint64_t) buf[0]
+    | ((ext_uint64_t) buf[1] << 8)
+    | ((ext_uint64_t) buf[2] << 16)
+    | ((ext_uint64_t) buf[3] << 24)
+    | ((ext_uint64_t) buf[4] << 32)
+    | ((ext_uint64_t) buf[5] << 40)
+    | ((ext_uint64_t) buf[6] << 48) | ((ext_uint64_t) buf[7] << 54);
+}
+
+static int
+get_guid (demux_asf_t * this)
+{
+  int i;
+  LE_GUID g;
+
+  g.v1 = get_le32 (this);
+  g.v2 = get_le16 (this);
+  g.v3 = get_le16 (this);
+  for (i = 0; i < 8; i++)
+    g.v4[i] = get_byte (this);
+  if (this->status == DEMUX_FINISHED)
+    return GUID_ERROR;
+  for (i = 1; i < GUID_END; i++)
+    if (!memcmp (&g, &guids[i].guid, sizeof (LE_GUID)))
+      return i;
+
+  return GUID_ERROR;
+}
+
+static void
+get_str16_nolen (demux_asf_t * this, int len, char *buf, int buf_size)
+{
+
+  int c;
+  char *q;
+
+  q = buf;
+  while (len > 0)
+    {
+      c = get_le16 (this);
+      if ((q - buf) < buf_size - 1)
+        *q++ = c;
+      len -= 2;
+    }
+  *q = '\0';
+}
+
+static int
+asf_read_header (demux_asf_t * this)
+{
+  int guid;
+  ext_uint64_t gsize;
+
+  guid = get_guid (this);
+  if (guid != GUID_ASF_HEADER)
+    return 0;
+  get_le64 (this);
+  get_le32 (this);
+  get_byte (this);
+  get_byte (this);
+
+  while (this->status != DEMUX_FINISHED)
+    {
+      guid = get_guid (this);
+      gsize = get_le64 (this);
+
+      if (gsize < 24)
+        goto fail;
+
+      switch (guid)
+        {
+        case GUID_ASF_FILE_PROPERTIES:
+          {
+            ext_uint64_t start_time, end_time;
+
+            guid = get_guid (this);
+            get_le64 (this);    /* file size */
+            get_le64 (this);    /* file time */
+            get_le64 (this);    /* nb_packets */
+
+            end_time = get_le64 (this);
+
+            this->length = get_le64 (this) / 10000;
+            if (this->length)
+              this->rate = this->inputLen / (this->length / 1000);
+            else
+              this->rate = 0;
+
+
+            start_time = get_le32 (this);       /* start timestamp in 1/1000 s 
*/
+
+            get_le32 (this);    /* unknown */
+            get_le32 (this);    /* min size */
+            this->packet_size = get_le32 (this);        /* max size */
+            get_le32 (this);    /* max bitrate */
+            get_le32 (this);
+          }
+          break;
+
+        case (GUID_ASF_STREAM_PROPERTIES):
+          {
+            int type;
+            ext_uint32_t total_size, stream_data_size;
+            ext_uint16_t stream_id;
+            ext_uint64_t pos1, pos2;
+            pos1 = this->inputPos;
+
+            guid = get_guid (this);
+            switch (guid)
+              {
+              case GUID_ASF_AUDIO_MEDIA:
+                type = CODEC_TYPE_AUDIO;
+                break;
+
+              case GUID_ASF_VIDEO_MEDIA:
+                type = CODEC_TYPE_VIDEO;
+                break;
+
+              case GUID_ASF_COMMAND_MEDIA:
+                type = CODEC_TYPE_CONTROL;
+                break;
+
+              default:
+                goto fail;
+              }
+
+            guid = get_guid (this);
+            get_le64 (this);
+            total_size = get_le32 (this);
+            if (total_size > sizeof (this->wavex))
+              goto fail;
+            stream_data_size = get_le32 (this);
+            stream_id = get_le16 (this);        /* stream id */
+            get_le32 (this);
+
+            if (type == CODEC_TYPE_AUDIO)
+              {
+                ext_uint8_t buffer[6];
+
+                readBuf (this, (ext_uint8_t *) this->wavex, total_size);
+                if (guid == GUID_ASF_AUDIO_SPREAD)
+                  {
+                    readBuf (this, buffer, 6);
+                    this->reorder_h = buffer[0];
+                    this->reorder_w = (buffer[2] << 8) | buffer[1];
+                    this->reorder_b = (buffer[4] << 8) | buffer[3];
+                    this->reorder_w /= this->reorder_b;
+                  }
+                else
+                  {
+                    this->reorder_b = this->reorder_h = this->reorder_w = 1;
+                  }
+
+                this->wavex_size = total_size;  /* 18 + this->wavex[8]; */
+                this->num_audio_streams++;
+              }
+            else if (type == CODEC_TYPE_VIDEO)
+              {
+
+                ext_uint16_t i;
+
+                get_le32 (this);        /* width */
+                get_le32 (this);        /* height */
+                get_byte (this);
+
+                i = get_le16 (this);    /* size */
+                this->inputPos += i;
+                this->num_video_streams++;
+              }
+            else if (type == CODEC_TYPE_CONTROL)
+              {
+                this->control_stream_id = stream_id;
+              }
+
+            this->num_streams++;
+            pos2 = this->inputPos;
+            this->inputPos += gsize - (pos2 - pos1 + 24);
+          }
+          break;
+
+        case GUID_ASF_DATA:
+          goto headers_ok;
+          break;
+        case GUID_ASF_CONTENT_DESCRIPTION:
+          {
+            ext_uint16_t len1, len2, len3, len4, len5;
+
+            len1 = get_le16 (this);
+            len2 = get_le16 (this);
+            len3 = get_le16 (this);
+            len4 = get_le16 (this);
+            len5 = get_le16 (this);
+            get_str16_nolen (this, len1, this->title, sizeof (this->title));
+            get_str16_nolen (this, len2, this->author, sizeof (this->author));
+            get_str16_nolen (this, len3, this->copyright,
+                             sizeof (this->copyright));
+            get_str16_nolen (this, len4, this->comment,
+                             sizeof (this->comment));
+            this->inputPos += len5;
+          }
+          break;
+
+        case GUID_ASF_STREAM_BITRATE_PROPERTIES:
+          {
+            ext_uint16_t streams, stream_id;
+            ext_uint16_t i;
+
+            streams = get_le16 (this);
+            for (i = 0; i < streams; i++)
+              {
+                stream_id = get_le16 (this);
+                this->bitrates[stream_id] = get_le32 (this);
+              }
+          }
+          break;
+
+        default:
+          this->inputPos += gsize - 24;
+        }
+    }
+
+headers_ok:
+  this->inputPos += sizeof (LE_GUID) + 10;
+  this->packet_size_left = 0;
+  this->first_packet_pos = this->inputPos;
+  return 1;
+
+fail:
+  return 0;
+}
+
+
+/* mimetypes:
+   video/x-ms-asf: asf: ASF stream;
+   video/x-ms-wmv: wmv: Windows Media Video;
+   video/x-ms-wma: wma: Windows Media Audio;
+   application/vnd.ms-asf: asf: ASF stream;
+   application/x-mplayer2: asf,asx,asp: mplayer2;
+   video/x-ms-asf-plugin: asf,asx,asp: mms animation;
+   video/x-ms-wvx: wvx: wmv metafile;
+   video/x-ms-wax: wva: wma metafile; */
+
+/* mimetype = application/applefile */
+int 
+EXTRACTOR_asf_extract (const char *data,
+                      size_t size,
+                      EXTRACTOR_MetaDataProcessor proc,
+                      void *proc_cls,
+                      const char *options)
+{
+  demux_asf_t this;
+
+  memset (&this, 0, sizeof (demux_asf_t));
+  this.input = data;
+  this.inputLen = size;
+  this.status = DEMUX_START;
+  if (0 == asf_read_header (&this))
+    return 0;    
+  
+  if ( ( (strlen(this.title) > 0) &&
+        (0 != proc (proc_cls, 
+                    "asf",
+                    EXTRACTOR_METATYPE_TITLE,
+                    EXTRACTOR_METAFORMAT_C_STRING,
+                    "text/plain",
+                    this.title,
+                    strlen(this.title) + 1)) ) ||
+       ( (strlen(this.author) > 0) &&
+        (0 != proc (proc_cls, 
+                    "asf",
+                    EXTRACTOR_METATYPE_AUTHOR_NAME,
+                    EXTRACTOR_METAFORMAT_C_STRING,
+                    "text/plain",
+                    this.author,
+                    strlen(this.author) + 1)) ) ||
+       ( (strlen(this.comment) > 0) &&
+        (0 != proc (proc_cls, 
+                    "asf",
+                    EXTRACTOR_METATYPE_COMMENT,
+                    EXTRACTOR_METAFORMAT_C_STRING,
+                    "text/plain",
+                    this.comment,
+                    strlen(this.comment) + 1)) ) ||
+       ( (strlen(this.copyright) > 0) &&
+        (0 != proc (proc_cls, 
+                    "asf",
+                    EXTRACTOR_METATYPE_COPYRIGHT,
+                    EXTRACTOR_METAFORMAT_C_STRING,
+                    "text/plain",
+                    this.copyright,
+                    strlen(this.copyright) + 1)) ) ||
+       (0 != proc (proc_cls, 
+                  "asf",
+                  EXTRACTOR_METATYPE_MIMETYPE,
+                  EXTRACTOR_METAFORMAT_C_STRING,
+                  "text/plain",
+                  "video/x-ms-asf",
+                  strlen("video/x-ms-asf") + 1)) )       
+    return 1;  
+  return 0;
+}
+
+/*  end of asf_extractor.c */

Deleted: Extractor/src/plugins/asfextractor.c
===================================================================
--- Extractor/src/plugins/asfextractor.c        2009-12-14 14:18:47 UTC (rev 
9747)
+++ Extractor/src/plugins/asfextractor.c        2009-12-14 14:26:01 UTC (rev 
9748)
@@ -1,797 +0,0 @@
-/*
-     This file is part of libextractor.
-     (C) 2002, 2003 Vidyut Samanta and Christian Grothoff
-
-     libextractor is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
-     option) any later version.
-
-     libextractor 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
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with libextractor; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
- */
-
-/*
- * This file is based on demux_asf from the xine project (copyright follows).
- *
- * Copyright (C) 2000-2002 the xine project
- *
- * This file is part of xine, a free video player.
- *
- * xine is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * xine 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
- *
- * $Id: asfextractor.c,v 1.6 2004/10/05 20:02:08 grothoff Exp $
- *
- * demultiplexer for asf streams
- *
- * based on ffmpeg's
- * ASF compatible encoder and decoder.
- * Copyright (c) 2000, 2001 Gerard Lantau.
- *
- * GUID list from avifile
- * some other ideas from MPlayer
- */
-
-#include "platform.h"
-#include "extractor.h"
-
-#define CODEC_TYPE_AUDIO       0
-#define CODEC_TYPE_VIDEO       1
-#define CODEC_TYPE_CONTROL     2
-#define MAX_NUM_STREAMS       23
-
-#define DEFRAG_BUFSIZE    65536
-#define DEMUX_START 1
-#define DEMUX_FINISHED 0
-
-
-/*
- * define asf GUIDs (list from avifile)
- */
-#define GUID_ERROR                              0
-
-    /* base ASF objects */
-#define GUID_ASF_HEADER                         1
-#define GUID_ASF_DATA                           2
-#define GUID_ASF_SIMPLE_INDEX                   3
-
-    /* header ASF objects */
-#define GUID_ASF_FILE_PROPERTIES                4
-#define GUID_ASF_STREAM_PROPERTIES              5
-#define GUID_ASF_STREAM_BITRATE_PROPERTIES      6
-#define GUID_ASF_CONTENT_DESCRIPTION            7
-#define GUID_ASF_EXTENDED_CONTENT_ENCRYPTION    8
-#define GUID_ASF_SCRIPT_COMMAND                 9
-#define GUID_ASF_MARKER                        10
-#define GUID_ASF_HEADER_EXTENSION              11
-#define GUID_ASF_BITRATE_MUTUAL_EXCLUSION      12
-#define GUID_ASF_CODEC_LIST                    13
-#define GUID_ASF_EXTENDED_CONTENT_DESCRIPTION  14
-#define GUID_ASF_ERROR_CORRECTION              15
-#define GUID_ASF_PADDING                       16
-
-    /* stream properties object stream type */
-#define GUID_ASF_AUDIO_MEDIA                   17
-#define GUID_ASF_VIDEO_MEDIA                   18
-#define GUID_ASF_COMMAND_MEDIA                 19
-
-    /* stream properties object error correction type */
-#define GUID_ASF_NO_ERROR_CORRECTION           20
-#define GUID_ASF_AUDIO_SPREAD                  21
-
-    /* mutual exclusion object exlusion type */
-#define GUID_ASF_MUTEX_BITRATE                 22
-#define GUID_ASF_MUTEX_UKNOWN                  23
-
-    /* header extension */
-#define GUID_ASF_RESERVED_1                    24
-
-    /* script command */
-#define GUID_ASF_RESERVED_SCRIPT_COMMNAND      25
-
-    /* marker object */
-#define GUID_ASF_RESERVED_MARKER               26
-
-    /* various */
-/*
-#define GUID_ASF_HEAD2                         27
-*/
-#define GUID_ASF_AUDIO_CONCEAL_NONE            27
-#define GUID_ASF_CODEC_COMMENT1_HEADER         28
-#define GUID_ASF_2_0_HEADER                    29
-
-#define GUID_END                               30
-
-
-/* asf stream types */
-#define ASF_STREAM_TYPE_UNKNOWN  0
-#define ASF_STREAM_TYPE_AUDIO    1
-#define ASF_STREAM_TYPE_VIDEO    2
-#define ASF_STREAM_TYPE_CONTROL  3
-
-#define ASF_MAX_NUM_STREAMS     23
-
-
-typedef unsigned long long ext_uint64_t;
-typedef unsigned int ext_uint32_t;
-typedef unsigned short ext_uint16_t;
-typedef unsigned char ext_uint8_t;
-
-typedef struct
-{
-  ext_uint32_t v1;
-  ext_uint16_t v2;
-  ext_uint16_t v3;
-  ext_uint8_t v4[8];
-} LE_GUID;
-
-static const struct
-{
-  const char *name;
-  const LE_GUID guid;
-} guids[] =
-{
-  {
-    "error",
-    {
-  0x0,}},
-    /* base ASF objects */
-  {
-    "header",
-    {
-      0x75b22630, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "data",
-    {
-      0x75b22636, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "simple index",
-    {
-      0x33000890, 0xe5b1, 0x11cf,
-      {
-  0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}},
-    /* header ASF objects */
-  {
-    "file properties",
-    {
-      0x8cabdca1, 0xa947, 0x11cf,
-      {
-  0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "stream header",
-    {
-      0xb7dc0791, 0xa9b7, 0x11cf,
-      {
-  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "stream bitrate properties",        /* (http://get.to/sdp) */
-    {
-      0x7bf875ce, 0x468d, 0x11d1,
-      {
-  0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}},
-  {
-    "content description",
-    {
-      0x75b22633, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "extended content encryption",
-    {
-      0x298ae614, 0x2622, 0x4c17,
-      {
-  0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c}}},
-  {
-    "script command",
-    {
-      0x1efb1a30, 0x0b62, 0x11d0,
-      {
-  0xa3, 0x9b, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "marker",
-    {
-      0xf487cd01, 0xa951, 0x11cf,
-      {
-  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "header extension",
-    {
-      0x5fbf03b5, 0xa92e, 0x11cf,
-      {
-  0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-  {
-    "bitrate mutual exclusion",
-    {
-      0xd6e229dc, 0x35da, 0x11d1,
-      {
-  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
-  {
-    "codec list",
-    {
-      0x86d15240, 0x311d, 0x11d0,
-      {
-  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "extended content description",
-    {
-      0xd2d0a440, 0xe307, 0x11d2,
-      {
-  0x97, 0xf0, 0x00, 0xa0, 0xc9, 0x5e, 0xa8, 0x50}}},
-  {
-    "error correction",
-    {
-      0x75b22635, 0x668e, 0x11cf,
-      {
-  0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}}},
-  {
-    "padding",
-    {
-      0x1806d474, 0xcadf, 0x4509,
-      {
-  0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8}}},
-    /* stream properties object stream type */
-  {
-    "audio media",
-    {
-      0xf8699e40, 0x5b4d, 0x11cf,
-      {
-  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
-  {
-    "video media",
-    {
-      0xbc19efc0, 0x5b4d, 0x11cf,
-      {
-  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
-  {
-    "command media",
-    {
-      0x59dacfc0, 0x59e6, 0x11d0,
-      {
-  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-    /* stream properties object error correction */
-  {
-    "no error correction",
-    {
-      0x20fb5700, 0x5b55, 0x11cf,
-      {
-  0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}}},
-  {
-    "audio spread",
-    {
-      0xbfc3cd50, 0x618f, 0x11cf,
-      {
-  0x8b, 0xb2, 0x00, 0xaa, 0x00, 0xb4, 0xe2, 0x20}}},
-    /* mutual exclusion object exlusion type */
-  {
-    "mutex bitrate",
-    {
-      0xd6e22a01, 0x35da, 0x11d1,
-      {
-  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
-  {
-    "mutex unknown",
-    {
-      0xd6e22a02, 0x35da, 0x11d1,
-      {
-  0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},
-    /* header extension */
-  {
-    "reserved_1",
-    {
-      0xabd3d211, 0xa9ba, 0x11cf,
-      {
-  0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}}},
-    /* script command */
-  {
-    "reserved script command",
-    {
-      0x4B1ACBE3, 0x100B, 0x11D0,
-      {
-  0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6}}},
-    /* marker object */
-  {
-    "reserved marker",
-    {
-      0x4CFEDB20, 0x75F6, 0x11CF,
-      {
-  0x9C, 0x0F, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB}}},
-    /* various */
-    /* Already defined (reserved_1)
-       { "head2",
-       { 0xabd3d211, 0xa9ba, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 
0x53, 0x65 }} },
-     */
-  {
-    "audio conceal none",
-    {
-      0x49f1a440, 0x4ece, 0x11d0,
-      {
-  0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "codec comment1 header",
-    {
-      0x86d15241, 0x311d, 0x11d0,
-      {
-  0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6}}},
-  {
-    "asf 2.0 header",
-    {
-      0xd6e229d1, 0x35da, 0x11d1,
-      {
-0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe}}},};
-
-typedef struct
-{
-  int num;
-  int seq;
-
-  int frag_offset;
-  int64_t timestamp;
-  int ts_per_kbyte;
-  int defrag;
-
-  ext_uint32_t buf_type;
-  int stream_id;
-
-  ext_uint8_t *buffer;
-} asf_stream_t;
-
-typedef struct demux_asf_s
-{
-  /* pointer to the stream data */
-  char *input;
-  /* current position in stream */
-  size_t inputPos;
-  size_t inputLen;
-
-  int keyframe_found;
-
-  int seqno;
-  ext_uint32_t packet_size;
-  ext_uint8_t packet_flags;
-  ext_uint32_t data_size;
-
-  ext_uint32_t bitrates[MAX_NUM_STREAMS];
-  int num_streams;
-  int num_audio_streams;
-  int num_video_streams;
-  int audio_stream;
-  int video_stream;
-  int audio_stream_id;
-  int video_stream_id;
-  int control_stream_id;
-
-  ext_uint16_t wavex[1024];
-  int wavex_size;
-
-  char title[512];
-  char author[512];
-  char copyright[512];
-  char comment[512];
-
-  ext_uint32_t length, rate;
-
-  /* packet filling */
-  int packet_size_left;
-
-  /* frame rate calculations, discontinuity detection */
-
-  int64_t last_pts[2];
-  int32_t frame_duration;
-  int send_newpts;
-  int64_t last_frame_pts;
-
-  /* only for reading */
-  ext_uint32_t packet_padsize;
-  int nb_frames;
-  ext_uint8_t frame_flag;
-  ext_uint8_t segtype;
-  int frame;
-
-  int status;
-
-  /* byte reordering from audio streams */
-  int reorder_h;
-  int reorder_w;
-  int reorder_b;
-
-  off_t header_size;
-  int buf_flag_seek;
-
-  /* first packet position */
-  int64_t first_packet_pos;
-
-  int reference_mode;
-} demux_asf_t;
-
-static int
-readBuf (demux_asf_t * this, void *buf, int len)
-{
-  int min;
-
-  min = len;
-  if (this->inputLen - this->inputPos < min)
-    min = this->inputLen - this->inputPos;
-  memcpy (buf, &this->input[this->inputPos], min);
-  this->inputPos += min;
-  return min;
-}
-
-static ext_uint8_t
-get_byte (demux_asf_t * this)
-{
-  ext_uint8_t buf;
-  int i;
-
-  i = readBuf (this, &buf, 1);
-  if (i != 1)
-    this->status = DEMUX_FINISHED;
-  return buf;
-}
-
-static ext_uint16_t
-get_le16 (demux_asf_t * this)
-{
-  ext_uint8_t buf[2];
-  int i;
-
-  i = readBuf (this, buf, 2);
-  if (i != 2)
-    this->status = DEMUX_FINISHED;
-  return buf[0] | (buf[1] << 8);
-}
-
-static ext_uint32_t
-get_le32 (demux_asf_t * this)
-{
-  ext_uint8_t buf[4];
-  int i;
-
-  i = readBuf (this, buf, 4);
-  if (i != 4)
-    this->status = DEMUX_FINISHED;
-  return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
-}
-
-static ext_uint64_t
-get_le64 (demux_asf_t * this)
-{
-  ext_uint8_t buf[8];
-  int i;
-
-  i = readBuf (this, buf, 8);
-  if (i != 8)
-    this->status = DEMUX_FINISHED;
-  return (ext_uint64_t) buf[0]
-    | ((ext_uint64_t) buf[1] << 8)
-    | ((ext_uint64_t) buf[2] << 16)
-    | ((ext_uint64_t) buf[3] << 24)
-    | ((ext_uint64_t) buf[4] << 32)
-    | ((ext_uint64_t) buf[5] << 40)
-    | ((ext_uint64_t) buf[6] << 48) | ((ext_uint64_t) buf[7] << 54);
-}
-
-static int
-get_guid (demux_asf_t * this)
-{
-  int i;
-  LE_GUID g;
-
-  g.v1 = get_le32 (this);
-  g.v2 = get_le16 (this);
-  g.v3 = get_le16 (this);
-  for (i = 0; i < 8; i++)
-    g.v4[i] = get_byte (this);
-  if (this->status == DEMUX_FINISHED)
-    return GUID_ERROR;
-  for (i = 1; i < GUID_END; i++)
-    if (!memcmp (&g, &guids[i].guid, sizeof (LE_GUID)))
-      return i;
-
-  return GUID_ERROR;
-}
-
-static void
-get_str16_nolen (demux_asf_t * this, int len, char *buf, int buf_size)
-{
-
-  int c;
-  char *q;
-
-  q = buf;
-  while (len > 0)
-    {
-      c = get_le16 (this);
-      if ((q - buf) < buf_size - 1)
-        *q++ = c;
-      len -= 2;
-    }
-  *q = '\0';
-}
-
-static int
-asf_read_header (demux_asf_t * this)
-{
-  int guid;
-  ext_uint64_t gsize;
-
-  guid = get_guid (this);
-  if (guid != GUID_ASF_HEADER)
-    return 0;
-  get_le64 (this);
-  get_le32 (this);
-  get_byte (this);
-  get_byte (this);
-
-  while (this->status != DEMUX_FINISHED)
-    {
-      guid = get_guid (this);
-      gsize = get_le64 (this);
-
-      if (gsize < 24)
-        goto fail;
-
-      switch (guid)
-        {
-        case GUID_ASF_FILE_PROPERTIES:
-          {
-            ext_uint64_t start_time, end_time;
-
-            guid = get_guid (this);
-            get_le64 (this);    /* file size */
-            get_le64 (this);    /* file time */
-            get_le64 (this);    /* nb_packets */
-
-            end_time = get_le64 (this);
-
-            this->length = get_le64 (this) / 10000;
-            if (this->length)
-              this->rate = this->inputLen / (this->length / 1000);
-            else
-              this->rate = 0;
-
-
-            start_time = get_le32 (this);       /* start timestamp in 1/1000 s 
*/
-
-            get_le32 (this);    /* unknown */
-            get_le32 (this);    /* min size */
-            this->packet_size = get_le32 (this);        /* max size */
-            get_le32 (this);    /* max bitrate */
-            get_le32 (this);
-          }
-          break;
-
-        case (GUID_ASF_STREAM_PROPERTIES):
-          {
-            int type;
-            ext_uint32_t total_size, stream_data_size;
-            ext_uint16_t stream_id;
-            ext_uint64_t pos1, pos2;
-            pos1 = this->inputPos;
-
-            guid = get_guid (this);
-            switch (guid)
-              {
-              case GUID_ASF_AUDIO_MEDIA:
-                type = CODEC_TYPE_AUDIO;
-                break;
-
-              case GUID_ASF_VIDEO_MEDIA:
-                type = CODEC_TYPE_VIDEO;
-                break;
-
-              case GUID_ASF_COMMAND_MEDIA:
-                type = CODEC_TYPE_CONTROL;
-                break;
-
-              default:
-                goto fail;
-              }
-
-            guid = get_guid (this);
-            get_le64 (this);
-            total_size = get_le32 (this);
-            if (total_size > sizeof (this->wavex))
-              goto fail;
-            stream_data_size = get_le32 (this);
-            stream_id = get_le16 (this);        /* stream id */
-            get_le32 (this);
-
-            if (type == CODEC_TYPE_AUDIO)
-              {
-                ext_uint8_t buffer[6];
-
-                readBuf (this, (ext_uint8_t *) this->wavex, total_size);
-                if (guid == GUID_ASF_AUDIO_SPREAD)
-                  {
-                    readBuf (this, buffer, 6);
-                    this->reorder_h = buffer[0];
-                    this->reorder_w = (buffer[2] << 8) | buffer[1];
-                    this->reorder_b = (buffer[4] << 8) | buffer[3];
-                    this->reorder_w /= this->reorder_b;
-                  }
-                else
-                  {
-                    this->reorder_b = this->reorder_h = this->reorder_w = 1;
-                  }
-
-                this->wavex_size = total_size;  /* 18 + this->wavex[8]; */
-                this->num_audio_streams++;
-              }
-            else if (type == CODEC_TYPE_VIDEO)
-              {
-
-                ext_uint16_t i;
-
-                get_le32 (this);        /* width */
-                get_le32 (this);        /* height */
-                get_byte (this);
-
-                i = get_le16 (this);    /* size */
-                this->inputPos += i;
-                this->num_video_streams++;
-              }
-            else if (type == CODEC_TYPE_CONTROL)
-              {
-                this->control_stream_id = stream_id;
-              }
-
-            this->num_streams++;
-            pos2 = this->inputPos;
-            this->inputPos += gsize - (pos2 - pos1 + 24);
-          }
-          break;
-
-        case GUID_ASF_DATA:
-          goto headers_ok;
-          break;
-        case GUID_ASF_CONTENT_DESCRIPTION:
-          {
-            ext_uint16_t len1, len2, len3, len4, len5;
-
-            len1 = get_le16 (this);
-            len2 = get_le16 (this);
-            len3 = get_le16 (this);
-            len4 = get_le16 (this);
-            len5 = get_le16 (this);
-            get_str16_nolen (this, len1, this->title, sizeof (this->title));
-            get_str16_nolen (this, len2, this->author, sizeof (this->author));
-            get_str16_nolen (this, len3, this->copyright,
-                             sizeof (this->copyright));
-            get_str16_nolen (this, len4, this->comment,
-                             sizeof (this->comment));
-            this->inputPos += len5;
-          }
-          break;
-
-        case GUID_ASF_STREAM_BITRATE_PROPERTIES:
-          {
-            ext_uint16_t streams, stream_id;
-            ext_uint16_t i;
-
-            streams = get_le16 (this);
-            for (i = 0; i < streams; i++)
-              {
-                stream_id = get_le16 (this);
-                this->bitrates[stream_id] = get_le32 (this);
-              }
-          }
-          break;
-
-        default:
-          this->inputPos += gsize - 24;
-        }
-    }
-
-headers_ok:
-  this->inputPos += sizeof (LE_GUID) + 10;
-  this->packet_size_left = 0;
-  this->first_packet_pos = this->inputPos;
-  return 1;
-
-fail:
-  return 0;
-}
-
-
-static struct EXTRACTOR_Keywords *
-addKeyword (EXTRACTOR_KeywordType type,
-            char *keyword, struct EXTRACTOR_Keywords *next)
-{
-  EXTRACTOR_KeywordList *result;
-
-  if (keyword == NULL)
-    return next;
-  result = malloc (sizeof (EXTRACTOR_KeywordList));
-  result->next = next;
-  result->keyword = strdup (keyword);
-  result->keywordType = type;
-  return result;
-}
-
-
-/* mimetypes:
-   video/x-ms-asf: asf: ASF stream;
-   video/x-ms-wmv: wmv: Windows Media Video;
-   video/x-ms-wma: wma: Windows Media Audio;
-   application/vnd.ms-asf: asf: ASF stream;
-   application/x-mplayer2: asf,asx,asp: mplayer2;
-   video/x-ms-asf-plugin: asf,asx,asp: mms animation;
-   video/x-ms-wvx: wvx: wmv metafile;
-   video/x-ms-wax: wva: wma metafile; */
-struct EXTRACTOR_Keywords *
-libextractor_asf_extract (char *filename,
-                          char *data,
-                          size_t size, struct EXTRACTOR_Keywords *prev)
-{
-  demux_asf_t *this;
-
-  this = malloc (sizeof (demux_asf_t));
-  memset (this, 0, sizeof (demux_asf_t));
-  this->input = data;
-  this->inputPos = 0;
-  this->inputLen = size;
-  this->status = DEMUX_START;
-
-  if (0 == asf_read_header (this))
-    {
-      free (this);
-      return prev;
-    }
-
-  if (strlen (this->title) > 0)
-    prev = addKeyword (EXTRACTOR_TITLE, this->title, prev);
-  if (strlen (this->author) > 0)
-    prev = addKeyword (EXTRACTOR_AUTHOR, this->author, prev);
-  if (strlen (this->comment) > 0)
-    prev = addKeyword (EXTRACTOR_COMMENT, this->comment, prev);
-  if (strlen (this->copyright) > 0)
-    prev = addKeyword (EXTRACTOR_COPYRIGHT, this->copyright, prev);
-  prev = addKeyword (EXTRACTOR_MIMETYPE, "video/x-ms-asf", prev);
-
-  /* build a description from author and title */
-  if (strlen (this->author) * strlen (this->title) > 0)
-    {
-      EXTRACTOR_KeywordList *keyword =
-        malloc (sizeof (EXTRACTOR_KeywordList));
-      char *word;
-      int len = 3 + strlen (this->author) + strlen (this->title);
-
-      word = malloc (len);
-      word[0] = '\0';
-      strcat (word, this->author);
-      strcat (word, ": ");
-      strcat (word, this->title);
-      keyword->next = prev;
-      keyword->keyword = word;
-      keyword->keywordType = EXTRACTOR_DESCRIPTION;
-      prev = keyword;
-    }
-  free (this);
-  return prev;
-}
-
-
-/*  end of asfextractor.c */





reply via email to

[Prev in Thread] Current Thread [Next in Thread]