libextractor  1.11
About: GNU libextractor is a library used to extract meta-data from files of arbitrary type.
  Fossies Dox: libextractor-1.11.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

mp4_extractor.c
Go to the documentation of this file.
1 /*
2  This file is part of libextractor.
3  Copyright (C) 2012 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 
21 /**
22  * @file plugins/mp4_extractor.c
23  * @brief plugin to support MP4 files
24  * @author Christian Grothoff
25  */
26 #include "platform.h"
27 #include "extractor.h"
28 #include <mp4v2/mp4v2.h>
29 
30 
31 /**
32  * Callback invoked by libmp4v2 to open the file.
33  * We cheated and passed our extractor context as
34  * the filename (fingers crossed) and will simply
35  * return it again to make it the handle.
36  *
37  * @param name "filename" to open
38  * @param open mode, only reading allowed
39  * @return NULL if the file is not opened for reading
40  */
41 static void*
42 open_cb (const char *name,
43  MP4FileMode mode)
44 {
45  void *ecp;
46 
47  if (FILEMODE_READ != mode)
48  return NULL;
49  if (1 != sscanf (name, "%p", &ecp))
50  return NULL;
51  return ecp;
52 }
53 
54 
55 /**
56  * Seek callback for libmp4v2.
57  *
58  * @param handle the 'struct EXTRACTOR_ExtractContext'
59  * @param pos target seek position (relative or absolute?)
60  * @return true on failure, false on success
61  */
62 static int
63 seek_cb (void *handle,
64  int64_t pos)
65 {
66  struct EXTRACTOR_ExtractContext *ec = handle;
67 
68  fprintf (stderr, "Seek: %lld!\n", (long long) pos);
69  if (-1 ==
70  ec->seek (ec->cls,
71  pos,
72  SEEK_CUR))
73  return true; /* failure */
74  return false;
75 }
76 
77 
78 /**
79  * Read callback for libmp4v2.
80  *
81  * @param handle the 'struct EXTRACTOR_ExtractContext'
82  * @param buffer where to write data read
83  * @param size desired number of bytes to read
84  * @param nin where to write number of bytes read
85  * @param maxChunkSize some chunk size (ignored)
86  * @return true on failure, false on success
87  */
88 static int
89 read_cb (void *handle,
90  void *buffer,
91  int64_t size,
92  int64_t *nin,
93  int64_t maxChunkSize)
94 {
95  struct EXTRACTOR_ExtractContext *ec = handle;
96  void *buf;
97  ssize_t ret;
98 
99  fprintf (stderr, "read!\n");
100  *nin = 0;
101  if (-1 ==
102  (ret = ec->read (ec->cls,
103  &buf,
104  size)))
105  return true; /* failure */
106  memcpy (buffer, buf, ret);
107  *nin = ret;
108  return false; /* success */
109 }
110 
111 
112 /**
113  * Write callback for libmp4v2.
114  *
115  * @param handle the 'struct EXTRACTOR_ExtractContext'
116  * @param buffer data to write
117  * @param size desired number of bytes to write
118  * @param nin where to write number of bytes written
119  * @param maxChunkSize some chunk size (ignored)
120  * @return true on failure (always fails)
121  */
122 static int
123 write_cb (void *handle,
124  const void *buffer,
125  int64_t size,
126  int64_t *nout,
127  int64_t maxChunkSize)
128 {
129  fprintf (stderr, "Write!?\n");
130  return true; /* failure */
131 }
132 
133 
134 /**
135  * Write callback for libmp4v2. Does nothing.
136  *
137  * @param handle the 'struct EXTRACTOR_ExtractContext'
138  * @return false on success (always succeeds)
139  */
140 static int
141 close_cb (void *handle)
142 {
143  fprintf (stderr, "Close!\n");
144  return false; /* success */
145 }
146 
147 
148 #if 0
149 /**
150  * Wrapper to replace 'stat64' call by libmp4v2.
151  */
152 int
153 stat_cb (const char *path,
154  struct stat64 *buf)
155 {
156  void *ecp;
157  struct EXTRACTOR_ExtractContext *ec;
158 
159  fprintf (stderr, "stat!\n");
160  if (1 != sscanf (path, "%p", &ecp))
161  {
162  errno = EINVAL;
163  return -1;
164  }
165  ec = ecp;
166  memset (buf, 0, sizeof (struct stat));
167  buf->st_size = ec->get_size (ec->cls);
168  return 0;
169 }
170 
171 
172 #endif
173 
174 
175 /**
176  * Main entry method for the MP4 extraction plugin.
177  *
178  * @param ec extraction context provided to the plugin
179  */
180 void
182 {
183  MP4FileProvider fp;
184  MP4FileHandle mp4;
185  const MP4Tags *tags;
186  char ecp[128];
187 
188  if (1)
189  return; /* plugin is known not to work yet;
190  see issue 138 filed against MP4v2 lib */
191  snprintf (ecp, sizeof (ecp), "%p", ec);
192  fp.open = &open_cb;
193  fp.seek = &seek_cb;
194  fp.read = &read_cb;
195  fp.write = &write_cb;
196  fp.close = &close_cb;
197  if (NULL == (mp4 = MP4ReadProvider (ecp,
198  &fp)))
199  return;
200  tags = MP4TagsAlloc ();
201  if (MP4TagsFetch (tags, mp4))
202  {
203  fprintf (stderr, "got tags!\n");
204  }
205  MP4Close (mp4, 0);
206 }
207 
208 
209 /* end of mp4_extractor.c */
#define NULL
Definition: getopt1.c:60
const char * name
void EXTRACTOR_mp4_extract_method(struct EXTRACTOR_ExtractContext *ec)
static int seek_cb(void *handle, int64_t pos)
Definition: mp4_extractor.c:63
static void * open_cb(const char *name, MP4FileMode mode)
Definition: mp4_extractor.c:42
static int write_cb(void *handle, const void *buffer, int64_t size, int64_t *nout, int64_t maxChunkSize)
static int read_cb(void *handle, void *buffer, int64_t size, int64_t *nin, int64_t maxChunkSize)
Definition: mp4_extractor.c:89
static int close_cb(void *handle)
plaform specifics
static unsigned char * buffer
int64_t(* seek)(void *cls, int64_t pos, int whence)
Definition: extractor.h:509
uint64_t(* get_size)(void *cls)
Definition: extractor.h:520
ssize_t(* read)(void *cls, void **data, size_t size)
Definition: extractor.h:494