[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18217 - in Extractor: . doc src/plugins
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18217 - in Extractor: . doc src/plugins |
Date: |
Sat, 19 Nov 2011 15:20:42 +0100 |
Author: grothoff
Date: 2011-11-19 15:20:42 +0100 (Sat, 19 Nov 2011)
New Revision: 18217
Added:
Extractor/src/plugins/mkv_extractor.c
Modified:
Extractor/AUTHORS
Extractor/doc/version.texi
Extractor/src/plugins/Makefile.am
Log:
first draft of MKV plugin
Modified: Extractor/AUTHORS
===================================================================
--- Extractor/AUTHORS 2011-11-19 09:29:25 UTC (rev 18216)
+++ Extractor/AUTHORS 2011-11-19 14:20:42 UTC (rev 18217)
@@ -43,6 +43,7 @@
it - Toni Ruottu <address@hidden>
xm - Toni Ruottu <address@hidden>
s3m - Toni Ruottu <address@hidden>
+mkv - Gabriel Peixoto <address@hidden>
General contributors:
Yuri N. Sedunov <address@hidden>
Modified: Extractor/doc/version.texi
===================================================================
--- Extractor/doc/version.texi 2011-11-19 09:29:25 UTC (rev 18216)
+++ Extractor/doc/version.texi 2011-11-19 14:20:42 UTC (rev 18217)
@@ -1,4 +1,4 @@
address@hidden UPDATED 29 March 2010
address@hidden UPDATED 31 March 2010
@set UPDATED-MONTH March 2010
@set EDITION 0.6.2
@set VERSION 0.6.2
Modified: Extractor/src/plugins/Makefile.am
===================================================================
--- Extractor/src/plugins/Makefile.am 2011-11-19 09:29:25 UTC (rev 18216)
+++ Extractor/src/plugins/Makefile.am 2011-11-19 14:20:42 UTC (rev 18217)
@@ -94,6 +94,7 @@
libextractor_jpeg.la \
libextractor_man.la \
libextractor_mime.la \
+ libextractor_mkv.la \
libextractor_mp3.la \
$(mpeg) \
libextractor_nsf.la \
@@ -240,6 +241,11 @@
libextractor_mime_la_LDFLAGS = \
$(PLUGINFLAGS)
+libextractor_mkv_la_SOURCES = \
+ mkv_extractor.c
+libextractor_mkv_la_LDFLAGS = \
+ $(PLUGINFLAGS)
+
libextractor_mp3_la_SOURCES = \
mp3_extractor.c
libextractor_mp3_la_LDFLAGS = \
Added: Extractor/src/plugins/mkv_extractor.c
===================================================================
--- Extractor/src/plugins/mkv_extractor.c (rev 0)
+++ Extractor/src/plugins/mkv_extractor.c 2011-11-19 14:20:42 UTC (rev
18217)
@@ -0,0 +1,389 @@
+/*
+ This file is part of libextractor.
+ (C) 2004, 2005, 2006, 2009 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.
+ */
+
+ /*
+ * Made by Gabriel Peixoto
+ * Using AVInfo 1.x code. Copyright (c) 2004 George Shuklin.
+ *
+ */
+
+#include "platform.h"
+#include "extractor.h"
+
+
+#define ADD(s,t) do { if (0 != (ret = proc (proc_cls, "mkv", t,
EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1))) goto EXIT; } while
(0)
+
+#define BUFFER_SIZE 0x4000
+#define MAX_STRING_SIZE 1024
+#define MAX_STREAMS 9
+typedef long long int64;
+enum
+{
+ MKV_Track_video = 1,
+ MKV_Track_audio = 2,
+ MKV_Track_subtitle = 3,
+ MKV_Track_subtitle_orig = 0x11
+};
+enum
+{
+ MKVID_OutputSamplingFrequency = 0x78B5,
+ MKVID_FILE_BEGIN = 0x1A,
+ MKVID_EBML = 0x1A45DFA3,
+ MKVID_Segment = 0x18538067,
+ MKVID_Info = 0x1549A966,
+ MKVID_Tracks = 0x1654AE6B,
+ MKVID_TrackEntry = 0xAE,
+ MKVID_TrackType = 0x83,
+ MKVID_DefaultDuration = 0x23E383,
+ MKVID_Language = 0x22B59C,
+ MKVID_CodecID = 0x86,
+ MKVID_CodecPrivate = 0x63A2,
+ MKVID_PixelWidth = 0xB0,
+ MKVID_PixelHeight = 0xBA,
+ MKVID_TimeCodeScale = 0x2AD7B1,
+ MKVID_Duration = 0x4489,
+ MKVID_Channels = 0x9F,
+ MKVID_BitDepth = 0x6264,
+ MKVID_SamplingFrequency = 0xB5,
+ MKVID_Title = 0x7BA9,
+ MKVID_Tags = 0x1254C367,
+ MKVID_SeekHead = 0x114D9B74,
+ MKVID_Video = 0xE0,
+ MKVID_Audio = 0xE1,
+ MKVID_CodecName = 0x258688,
+ MKVID_DisplayHeight = 0x54BA,
+ MKVID_DisplayWidth = 0x54B0
+};
+
+
+static int
+VINTparse (const unsigned char *buffer, const int start, const int end,
+ int64 * result, const int flag)
+{
+ unsigned const char mask[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 };
+ unsigned const char imask[8] = { 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1, 00 };
+ int VINT_WIDTH;
+ int c;
+
+ VINT_WIDTH = 0;
+ int64 temp;
+ unsigned char tempc;
+ *result = 0;
+
+ if (end - start < 2)
+ {
+ return 0; /*ops */
+ }
+
+ for (c = 0; c < 8; c++)
+ if (!(buffer[start] & mask[c]))
+ VINT_WIDTH++;
+ else
+ break;
+ if (VINT_WIDTH >= 8 || VINT_WIDTH + start + 1 >= end)
+ {
+ return 0;
+ }
+
+ for (c = 0; c < VINT_WIDTH; c++)
+ {
+ tempc = buffer[start + VINT_WIDTH - c];
+ temp = tempc << (c * 8);
+ *result += temp;
+ }
+
+ if (flag)
+ *result += (buffer[start] & imask[VINT_WIDTH]) << (VINT_WIDTH * 8);
+ else
+ *result += (buffer[start]) << (VINT_WIDTH * 8);
+
+ return VINT_WIDTH + 1;
+}
+
+static int
+elementRead (const char *buffer, const int start, const int end,
+ unsigned int *ID, int64 * size)
+{
+ int64 tempID;
+ int64 tempsize;
+ int ID_offset, size_offset;
+
+ tempID = 0;
+
+ ID_offset = VINTparse (buffer, start, end, &tempID, 0);
+ if (!ID_offset)
+ return 0;
+ size_offset = VINTparse (buffer, start + ID_offset, end, &tempsize, 1);
+ if (!size_offset)
+ return 0;
+ *ID = (int) tempID; /*id must be <4 and must to feet in uint */
+ *size = tempsize;
+ return ID_offset + size_offset;
+}
+
+static int64
+getInt (const char *buffer, const int start, const int size)
+{
+/*return a int [8-64], from buffer, Big Endian*/
+ int64 result = 0;
+ int c;
+
+ for (c = 1; c <= size; c++)
+ {
+ result += buffer[start + c - 1] << (8 * (size - c));
+ }
+ return result;
+}
+
+static float
+getFloat (const char *buffer, const int start, const int size)
+{
+ float result = 0;
+ char tmp[4];
+
+ if (size == sizeof (float))
+ {
+ tmp[0] = buffer[start + 3];
+ tmp[1] = buffer[start + 2];
+ tmp[2] = buffer[start + 1];
+ tmp[3] = buffer[start];
+ result = *((float *) (tmp));
+ }
+ return result;
+}
+
+const unsigned int MKV_Parse_list[] = { /*Elements, containing requed
information (sub-elements), see enum in mkv.h for values */
+ MKVID_Segment,
+ MKVID_Info,
+ MKVID_Video,
+ MKVID_Audio,
+ MKVID_TrackEntry,
+ MKVID_Tracks
+};
+
+const char stream_type_letters[] = "?vat"; /*[0]-no,
[1]-video,[2]-audio,[3]-text */
+
+
+/* video/mkv */
+int
+EXTRACTOR_mkv_extract (const unsigned char *data, size_t size1,
+ EXTRACTOR_MetaDataProcessor proc, void *proc_cls,
+ const char *options)
+{
+ int ret;
+ char buffer[128],temp[128];
+ int p; /*pointer in buffer */
+ int c, c2; /*counter in some loops */
+
+ unsigned int eID; /*element ID */
+ int64 eSize; /*Size of element content */
+ int offs;
+ int64 timescale = 1000000;
+ float Duration = 0;
+ int64 DefaultDuration = 0;
+ int TrackType = 0;
+ int pvt_look_flag = 0;
+ int curr_c = -1;
+ int a_c = -1;
+ int v_c = -1;
+ int t_c = -1;
+ int value_width = 0;
+ int value_height = 0;
+ int value = 0;
+ int size;
+
+ ret = 0;
+ p = 0;
+
+ if (size1 > 16777216)
+ {
+ size = 16777216;
+ }else{
+ size = size1;
+ }
+
+ if (!size)
+ {
+ return 0;
+ }
+
+
+ while (data[p] != MKVID_FILE_BEGIN)
+ {
+ p++;
+ if (p >= size)
+ {
+ return 0;
+ }
+ }; /*skip text while EBML begin */
+
+/*main loop*/
+ do
+ {
+ offs = elementRead (data, p, size, &eID, &eSize);
+ p += offs;
+ if (!offs || p >= size)
+ break;
+ for (c = 0; c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list); c++)
+ if (MKV_Parse_list[c] == eID)
+ {
+ break;
+ }
+ if (c < sizeof (MKV_Parse_list) / sizeof (*MKV_Parse_list))
+ continue;
+ if (p + eSize > size)
+ break; /*TODO - add (if requied) suckup from file to
data */
+ if (eSize == 4 || eSize == 8 || eSize == 1 || eSize == 2)
+ value = (int) getInt (data, p, eSize);
+
+ switch (eID)
+ {
+ case MKVID_TrackType: /*detect a stream type (video/audio/text) */
+ TrackType = value;
+ pvt_look_flag = 0;
+ switch (TrackType)
+ {
+ case MKV_Track_video:
+ v_c++;
+ if (v_c > MAX_STREAMS)
+ v_c = MAX_STREAMS;
+ sprintf (buffer, "%u(video)",
+ (int) (Duration / 1e+9 * (float) timescale));
+ ADD (buffer, EXTRACTOR_METATYPE_DURATION);
+ curr_c = v_c;
+ break;
+ case MKV_Track_audio:
+ a_c++;
+ if (a_c > MAX_STREAMS)
+ a_c = MAX_STREAMS;
+ sprintf (buffer, "%u(audio)",
+ (int) (Duration / 1e+9 * (float) timescale));
+ ADD (buffer, EXTRACTOR_METATYPE_DURATION);
+ curr_c = a_c;
+ break;
+ case MKV_Track_subtitle_orig:
+ t_c++;
+ TrackType = MKV_Track_subtitle; /*for normal use in lang array */
+ if (t_c > MAX_STREAMS)
+ t_c = MAX_STREAMS;
+ curr_c = t_c;
+ break;
+ }
+ break;
+ case MKVID_DefaultDuration: /*fps detection */
+ if (TrackType == MKV_Track_video && v_c >= 0)
+ {
+ DefaultDuration = value;
+ if (DefaultDuration > 100)
+ {
+ sprintf (buffer, "fps: %u", 1000000000 / DefaultDuration);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+ }
+ }
+ break;
+ case MKVID_Language: /*stream language */
+ if (curr_c >= 0 && TrackType < 4 && eSize < MAX_STRING_SIZE)
+ {
+ strncpy(temp,data+p,eSize);
+ temp[eSize] = '\0';
+ sprintf (buffer, "%s", temp);
+ ADD (buffer, EXTRACTOR_METATYPE_LANGUAGE);
+ }
+ break;
+ case MKVID_CodecName: /*passtrough */
+ case MKVID_CodecID: /*codec detection (if V_MS/VFW/FOURCC - set a
fourcc code, else fill a vcodecs value) */
+ if (curr_c >= 0 && TrackType < 4 && eSize < MAX_STRING_SIZE)
+ {
+ strncpy(temp,data+p,eSize);
+ temp[eSize] = '\0';
+ if (!strcmp (temp, "V_MS/VFW/FOURCC"))
+ pvt_look_flag = 1;
+ sprintf (buffer, "codec: %s", temp);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+ }
+ break;
+ case MKVID_CodecPrivate:
+ if (pvt_look_flag && v_c >= 0 && eSize >= 24)
+ { /*CodecPrivate contains a BITMAPINFOHEADER
structure due CodecID==V_MS/VFW/FOURCC */
+ pvt_look_flag = 0;
+ //TODO
+ /*
+
video[v_c][V_cc]=(buffer[p+16]<<24)+(buffer[p+17]<<16)+(buffer[p+18]<<8)+buffer[p+19];
+ if (codec[v_c][MKV_Track_video])
+ {
+ free (codec[v_c][MKV_Track_video]);
+ codec[v_c][MKV_Track_video] = NULL;
+ }
+ */
+ }
+ break;
+ case MKVID_PixelWidth: /*pasthough *//*bug with aspect differ from 1:1
*/
+ case MKVID_DisplayWidth:
+ value_width = value;
+ break;
+ case MKVID_PixelHeight: /*pasthough */
+ case MKVID_DisplayHeight:
+ value_height = value;
+ break;
+ case MKVID_TimeCodeScale:
+ timescale = getInt (data, p, eSize);
+ sprintf (buffer, "TimeScale: %u", timescale);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+ break;
+ case MKVID_Duration:
+ Duration = getFloat (data, p, eSize);
+ sprintf (buffer, "duration: %u s", Duration);
+ ADD (buffer, EXTRACTOR_METATYPE_DURATION);
+ break;
+ case MKVID_Channels:
+ sprintf (buffer, "channels: %u", value);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+ break;
+ case MKVID_BitDepth:
+ sprintf (buffer, "BitDepth: %u", value);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+ break;
+ case MKVID_OutputSamplingFrequency: /*pasthough */
+ case MKVID_SamplingFrequency:
+ sprintf (buffer, "Sampling Frequency: %u", value);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+ break;
+ break;
+ case MKVID_Title:
+ if (eSize > MAX_STRING_SIZE)
+ break;
+ strncpy(temp,data+p,eSize);
+ temp[eSize] = '\0';
+ ADD (temp, EXTRACTOR_METATYPE_TITLE);
+ break;
+/*TODO case MKVID_Tags:*/
+ }
+ p += eSize; /*skip unknown or uninteresting */
+ }
+ while (1);
+
+ sprintf (buffer, "Image dimensions: %u X %u", value_width, value_height);
+ ADD (buffer, EXTRACTOR_METATYPE_UNKNOWN);
+
+EXIT:
+
+ return ret;
+
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18217 - in Extractor: . doc src/plugins,
gnunet <=