"Fossies" - the Fresh Open Source Software Archive 
Member "libextractor-1.11/src/plugins/riff_extractor.c" (30 Jan 2021, 4531 Bytes) of package /linux/privat/libextractor-1.11.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "riff_extractor.c" see the
Fossies "Dox" file reference documentation.
1 /*
2 This file is part of libextractor.
3 Copyright (C) 2004, 2009, 2012 Vidyut Samanta and Christian Grothoff
4
5 libextractor is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 libextractor is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with libextractor; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19
20 This code was based on AVInfo 1.0 alpha 11
21 (c) George Shuklin, gs]AT[shounen.ru, 2002-2004
22 http://shounen.ru/soft/avinfo/
23
24 and bitcollider 0.6.0
25 (PD) 2004 The Bitzi Corporation
26 http://bitzi.com/
27 */
28 /**
29 * @file plugins/riff_extractor.c
30 * @brief plugin to support RIFF files (ms-video)
31 * @author Christian Grothoff
32 */
33 #include "platform.h"
34 #include "extractor.h"
35 #include <math.h>
36
37
38 /**
39 * Read an uint32_t as a little-endian (least
40 * significant byte first) integer from 'data'
41 *
42 * @param data input data
43 * @return integer read
44 */
45 static uint32_t
46 fread_le (const char *data)
47 {
48 unsigned int x;
49 uint32_t result = 0;
50
51 for (x = 0; x < 4; x++)
52 result |= ((unsigned char) data[x]) << (x * 8);
53 return result;
54 }
55
56
57 /**
58 * We implement our own rounding function, because the availability of
59 * C99's round(), nearbyint(), rint(), etc. seems to be spotty, whereas
60 * floor() is available in math.h on all C compilers.
61 *
62 * @param num value to round
63 * @return rounded-to-nearest value
64 */
65 static double
66 round_double (double num)
67 {
68 return floor (num + 0.5);
69 }
70
71
72 /**
73 * Pass the given UTF-8 string to the 'proc' callback using
74 * the given type. Uses 'return' if 'proc' returns non-0.
75 *
76 * @param s 0-terminated UTF8 string value with the meta data
77 * @param t libextractor type for the meta data
78 */
79 #define ADD(s,t) do { if (0 != ec->proc (ec->cls, "riff", t, \
80 EXTRACTOR_METAFORMAT_UTF8, \
81 "text/plain", s, strlen (s) \
82 + 1)) return; \
83 } while (0)
84
85
86 /**
87 * Main entry method for the 'video/x-msvideo' extraction plugin.
88 *
89 * @param ec extraction context provided to the plugin
90 */
91 void
92 EXTRACTOR_riff_extract_method (struct EXTRACTOR_ExtractContext *ec)
93 {
94 ssize_t xsize;
95 void *data;
96 char *xdata;
97 uint32_t blockLen;
98 unsigned int fps;
99 unsigned int duration;
100 uint64_t pos;
101 uint32_t width;
102 uint32_t height;
103 char codec[5];
104 char format[256];
105
106 /* read header */
107 if (72 > (xsize = ec->read (ec->cls, &data, 72)))
108 return;
109 xdata = data;
110
111 /* check magic values */
112 if ( (0 != memcmp (&xdata[0],
113 "RIFF", 4)) ||
114 (0 != memcmp (&xdata[8], "AVI ", 4)) ||
115 (0 != memcmp (&xdata[12], "LIST", 4)) ||
116 (0 != memcmp (&xdata[20], "hdrlavih", 8)) )
117 return;
118
119 blockLen = fread_le (&xdata[28]);
120
121 /* begin of AVI header at 32 */
122 fps = (unsigned int) round_double ((double) 1.0e6 / fread_le (&xdata[32]));
123 duration = (unsigned int) round_double ((double) fread_le (&xdata[48])
124 * 1000 / fps);
125 width = fread_le (&xdata[64]);
126 height = fread_le (&xdata[68]);
127
128 /* pos: begin of video stream header */
129 pos = blockLen + 32;
130
131 if (pos !=
132 ec->seek (ec->cls, pos, SEEK_SET))
133 return;
134 if (32 > ec->read (ec->cls, &data, 32))
135 return;
136 xdata = data;
137
138 /* check magic */
139 if ( (0 != memcmp (xdata, "LIST", 4)) ||
140 (0 != memcmp (&xdata[8], "strlstrh", 8)) ||
141 (0 != memcmp (&xdata[20], "vids", 4)) )
142 return;
143
144 /* pos + 24: video stream header with codec */
145 memcpy (codec, &xdata[24], 4);
146 codec[4] = '\0';
147 snprintf (format,
148 sizeof (format),
149 _ ("codec: %s, %u fps, %u ms"),
150 codec, fps, duration);
151 ADD (format, EXTRACTOR_METATYPE_FORMAT);
152 snprintf (format,
153 sizeof (format),
154 "%ux%u",
155 (unsigned int) width,
156 (unsigned int) height);
157 ADD (format, EXTRACTOR_METATYPE_IMAGE_DIMENSIONS);
158 ADD ("video/x-msvideo", EXTRACTOR_METATYPE_MIMETYPE);
159 }
160
161
162 /* end of riff_extractor.c */