1 #include <Python.h>
2 #include "ogg.h"
3 
4 /********************************************************
5  Audio Tools, a module and set of tools for manipulating audio data
6  Copyright (C) 2007-2014  Brian Langenberger
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21 *******************************************************/
22 
23 PyMethodDef module_methods[] = {
24     {NULL}
25 };
26 
27 typedef struct {
28     PyObject_HEAD
29 
30     struct ogg_page page;
31 } ogg_Page;
32 
33 static PyObject*
34 Page_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
35 
36 int
37 Page_init(ogg_Page *self, PyObject *args, PyObject *keywds);
38 
39 void
40 Page_dealloc(ogg_Page *self);
41 
42 
43 
44 static PyObject *
45 Page_get_packet_continuation(ogg_Page *self, void *closure);
46 
47 static int
48 Page_set_packet_continuation(ogg_Page *self, PyObject *value, void *closure);
49 
50 static PyObject *
51 Page_get_stream_beginning(ogg_Page *self, void *closure);
52 
53 static int
54 Page_set_stream_beginning(ogg_Page *self, PyObject *value, void *closure);
55 
56 static PyObject *
57 Page_get_stream_end(ogg_Page *self, void *closure);
58 
59 static int
60 Page_set_stream_end(ogg_Page *self, PyObject *value, void *closure);
61 
62 static PyObject *
63 Page_get_granule_position(ogg_Page *self, void *closure);
64 
65 static int
66 Page_set_granule_position(ogg_Page *self, PyObject *value, void *closure);
67 
68 static PyObject *
69 Page_get_bitstream_serial_number(ogg_Page *self, void *closure);
70 
71 static int
72 Page_set_bitstream_serial_number(ogg_Page *self, PyObject *value,
73                                  void *closure);
74 
75 static PyObject *
76 Page_get_sequence_number(ogg_Page *self, void *closure);
77 
78 static int
79 Page_set_sequence_number(ogg_Page *self, PyObject *value, void *closure);
80 
81 PyGetSetDef Page_getseters[] = {
82     {"packet_continuation",
83      (getter)Page_get_packet_continuation,
84      (setter)Page_set_packet_continuation,
85      "packet continuation", NULL},
86     {"stream_beginning",
87      (getter)Page_get_stream_beginning,
88      (setter)Page_set_stream_beginning,
89      "stream beginning", NULL},
90     {"stream_end",
91      (getter)Page_get_stream_end,
92      (setter)Page_set_stream_end,
93      "stream ending", NULL},
94     {"granule_position",
95      (getter)Page_get_granule_position,
96      (setter)Page_set_granule_position,
97      "granule position", NULL},
98     {"bitstream_serial_number",
99      (getter)Page_get_bitstream_serial_number,
100      (setter)Page_set_bitstream_serial_number,
101      "bitstream serial number", NULL},
102     {"sequence_number",
103      (getter)Page_get_sequence_number,
104      (setter)Page_set_sequence_number,
105      "page sequence number", NULL},
106     {NULL}
107 };
108 
109 static Py_ssize_t
110 Page_len(ogg_Page *self);
111 
112 static PyObject*
113 Page_GetItem(ogg_Page *self, Py_ssize_t i);
114 
115 static PySequenceMethods ogg_PageType_as_sequence = {
116     (lenfunc)Page_len,               /* sq_length */
117     (binaryfunc)NULL,                /* sq_concat */
118     (ssizeargfunc)NULL,              /* sq_repeat */
119     (ssizeargfunc)Page_GetItem,      /* sq_item */
120     (ssizessizeargfunc)NULL,         /* sq_slice */
121     (ssizeobjargproc)NULL,           /* sq_ass_item */
122     (ssizessizeobjargproc)NULL,      /* sq_ass_slice */
123     (objobjproc)NULL,                /* sq_contains */
124     (binaryfunc)NULL,                /* sq_inplace_concat */
125     (ssizeargfunc)NULL,              /* sq_inplace_repeat */
126 };
127 
128 
129 static PyObject*
130 Page_append(ogg_Page *self, PyObject *args);
131 
132 static PyObject*
133 Page_full(ogg_Page *self, PyObject *args);
134 
135 static PyObject*
136 Page_size(ogg_Page *self, PyObject *args);
137 
138 PyMethodDef Page_methods[] = {
139     {"append", (PyCFunction)Page_append,
140      METH_VARARGS, "append(segment)"},
141     {"full", (PyCFunction)Page_full,
142      METH_NOARGS, "full() -> True if Page can hold no more segments"},
143     {"size", (PyCFunction)Page_size,
144      METH_NOARGS, "size() -> total size of Ogg page in bytes"},
145     {NULL}
146 };
147 
148 PyTypeObject ogg_PageType = {
149     PyVarObject_HEAD_INIT(NULL, 0)
150     "_ogg.Page",               /*tp_name*/
151     sizeof(ogg_Page),          /*tp_basicsize*/
152     0,                         /*tp_itemsize*/
153     (destructor)Page_dealloc,  /*tp_dealloc*/
154     0,                         /*tp_print*/
155     0,                         /*tp_getattr*/
156     0,                         /*tp_setattr*/
157     0,                         /*tp_compare*/
158     0,                         /*tp_repr*/
159     0,                         /*tp_as_number*/
160     &ogg_PageType_as_sequence, /*tp_as_sequence*/
161     0,                         /*tp_as_mapping*/
162     0,                         /*tp_hash */
163     0,                         /*tp_call*/
164     0,                         /*tp_str*/
165     0,                         /*tp_getattro*/
166     0,                         /*tp_setattro*/
167     0,                         /*tp_as_buffer*/
168     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
169     "Ogg Page objects",        /* tp_doc */
170     0,                         /* tp_traverse */
171     0,                         /* tp_clear */
172     0,                         /* tp_richcompare */
173     0,                         /* tp_weaklistoffset */
174     0,                         /* tp_iter */
175     0,                         /* tp_iternext */
176     Page_methods,              /* tp_methods */
177     0,                         /* tp_members */
178     Page_getseters,            /* tp_getset */
179     0,                         /* tp_base */
180     0,                         /* tp_dict */
181     0,                         /* tp_descr_get */
182     0,                         /* tp_descr_set */
183     0,                         /* tp_dictoffset */
184     (initproc)Page_init,       /* tp_init */
185     0,                         /* tp_alloc */
186     Page_new,                  /* tp_new */
187 };
188 
189 
190 typedef struct {
191     PyObject_HEAD
192 
193     BitstreamReader *reader;
194 } ogg_PageReader;
195 
196 static PyObject*
197 PageReader_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
198 
199 int
200 PageReader_init(ogg_PageReader *self, PyObject *args, PyObject *kwds);
201 
202 void
203 PageReader_dealloc(ogg_PageReader *self);
204 
205 static PyObject*
206 PageReader_read(ogg_PageReader *self, PyObject *args);
207 
208 static PyObject*
209 PageReader_close(ogg_PageReader *self, PyObject *args);
210 
211 static PyObject*
212 PageReader_enter(ogg_PageReader *self, PyObject *args);
213 
214 static PyObject*
215 PageReader_exit(ogg_PageReader *self, PyObject *args);
216 
217 PyMethodDef PageReader_methods[] = {
218     {"read", (PyCFunction)PageReader_read,
219      METH_NOARGS, "read() -> Page"},
220     {"close", (PyCFunction)PageReader_close,
221      METH_NOARGS, "close()"},
222     {"__enter__", (PyCFunction)PageReader_enter,
223      METH_NOARGS, "__enter__() -> self"},
224     {"__exit__", (PyCFunction)PageReader_exit,
225      METH_VARARGS, "__exit__(exc_type, exc_value, traceback) -> None"},
226     {NULL}
227 };
228 
229 PyTypeObject ogg_PageReaderType = {
230     PyVarObject_HEAD_INIT(NULL, 0)
231     "_ogg.PageReader",         /*tp_name*/
232     sizeof(ogg_PageReader),    /*tp_basicsize*/
233     0,                         /*tp_itemsize*/
234     (destructor)PageReader_dealloc, /*tp_dealloc*/
235     0,                         /*tp_print*/
236     0,                         /*tp_getattr*/
237     0,                         /*tp_setattr*/
238     0,                         /*tp_compare*/
239     0,                         /*tp_repr*/
240     0,                         /*tp_as_number*/
241     0,                         /*tp_as_sequence*/
242     0,                         /*tp_as_mapping*/
243     0,                         /*tp_hash */
244     0,                         /*tp_call*/
245     0,                         /*tp_str*/
246     0,                         /*tp_getattro*/
247     0,                         /*tp_setattro*/
248     0,                         /*tp_as_buffer*/
249     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
250     "Ogg PageReader object",   /* tp_doc */
251     0,                         /* tp_traverse */
252     0,                         /* tp_clear */
253     0,                         /* tp_richcompare */
254     0,                         /* tp_weaklistoffset */
255     0,                         /* tp_iter */
256     0,                         /* tp_iternext */
257     PageReader_methods,        /* tp_methods */
258     0,                         /* tp_members */
259     0,                         /* tp_getset */
260     0,                         /* tp_base */
261     0,                         /* tp_dict */
262     0,                         /* tp_descr_get */
263     0,                         /* tp_descr_set */
264     0,                         /* tp_dictoffset */
265     (initproc)PageReader_init, /* tp_init */
266     0,                         /* tp_alloc */
267     PageReader_new,            /* tp_new */
268 };
269 
270 
271 typedef struct {
272     PyObject_HEAD
273 
274     BitstreamWriter *writer;
275 } ogg_PageWriter;
276 
277 static PyObject*
278 PageWriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
279 
280 int
281 PageWriter_init(ogg_PageWriter *self, PyObject *args, PyObject *kwds);
282 
283 void
284 PageWriter_dealloc(ogg_PageWriter *self);
285 
286 static PyObject*
287 PageWriter_write(ogg_PageWriter *self, PyObject *args);
288 
289 static PyObject*
290 PageWriter_flush(ogg_PageWriter *self, PyObject *args);
291 
292 static PyObject*
293 PageWriter_close(ogg_PageWriter *self, PyObject *args);
294 
295 static PyObject*
296 PageWriter_enter(ogg_PageWriter *self, PyObject *args);
297 
298 static PyObject*
299 PageWriter_exit(ogg_PageWriter *self, PyObject *args);
300 
301 PyMethodDef PageWriter_methods[] = {
302     {"write", (PyCFunction)PageWriter_write,
303      METH_VARARGS, "write(Page)"},
304     {"flush", (PyCFunction)PageWriter_flush,
305      METH_NOARGS, "flush()"},
306     {"close", (PyCFunction)PageWriter_close,
307      METH_NOARGS, "close()"},
308     {"__enter__", (PyCFunction)PageWriter_enter,
309      METH_NOARGS, "__enter__() -> self"},
310     {"__exit__", (PyCFunction)PageWriter_exit,
311      METH_VARARGS, "__exit__(exc_type, exc_value, traceback) -> None"},
312     {NULL}
313 };
314 
315 PyTypeObject ogg_PageWriterType = {
316     PyVarObject_HEAD_INIT(NULL, 0)
317     "_ogg.PageWriter",         /*tp_name*/
318     sizeof(ogg_PageWriter),    /*tp_basicsize*/
319     0,                         /*tp_itemsize*/
320     (destructor)PageWriter_dealloc, /*tp_dealloc*/
321     0,                         /*tp_print*/
322     0,                         /*tp_getattr*/
323     0,                         /*tp_setattr*/
324     0,                         /*tp_compare*/
325     0,                         /*tp_repr*/
326     0,                         /*tp_as_number*/
327     0,                         /*tp_as_sequence*/
328     0,                         /*tp_as_mapping*/
329     0,                         /*tp_hash */
330     0,                         /*tp_call*/
331     0,                         /*tp_str*/
332     0,                         /*tp_getattro*/
333     0,                         /*tp_setattro*/
334     0,                         /*tp_as_buffer*/
335     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
336     "Ogg PageWriter object",   /* tp_doc */
337     0,                         /* tp_traverse */
338     0,                         /* tp_clear */
339     0,                         /* tp_richcompare */
340     0,                         /* tp_weaklistoffset */
341     0,                         /* tp_iter */
342     0,                         /* tp_iternext */
343     PageWriter_methods,        /* tp_methods */
344     0,                         /* tp_members */
345     0,                         /* tp_getset */
346     0,                         /* tp_base */
347     0,                         /* tp_dict */
348     0,                         /* tp_descr_get */
349     0,                         /* tp_descr_set */
350     0,                         /* tp_dictoffset */
351     (initproc)PageWriter_init, /* tp_init */
352     0,                         /* tp_alloc */
353     PageWriter_new,            /* tp_new */
354 };
355