/** * gst_tag_list_from_exif_buffer_with_tiff_header: * @buffer: The exif buffer * * Parses the exif tags starting with a tiff header structure. * * Returns: The taglist * * Since: 0.10.30 */ GstTagList * gst_tag_list_from_exif_buffer_with_tiff_header (const GstBuffer * buffer) { GstByteReader reader; guint16 fortytwo = 42; guint16 endianness = 0; guint32 offset; GstTagList *taglist = NULL; GstBuffer *subbuffer; GST_LOG ("Parsing exif tags with tiff header of size %u", GST_BUFFER_SIZE (buffer)); gst_byte_reader_init_from_buffer (&reader, buffer); GST_LOG ("Parsing the tiff header"); if (!gst_byte_reader_get_uint16_be (&reader, &endianness)) { goto byte_reader_fail; } if (endianness == TIFF_LITTLE_ENDIAN) { if (!gst_byte_reader_get_uint16_le (&reader, &fortytwo) || !gst_byte_reader_get_uint32_le (&reader, &offset)) goto byte_reader_fail; } else if (endianness == TIFF_BIG_ENDIAN) { if (!gst_byte_reader_get_uint16_be (&reader, &fortytwo) || !gst_byte_reader_get_uint32_be (&reader, &offset)) goto byte_reader_fail; } else { GST_WARNING ("Invalid endianness number %u", endianness); return NULL; } if (fortytwo != 42) { GST_WARNING ("Invalid magic number %u, should be 42", fortytwo); return NULL; } subbuffer = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (buffer) - (TIFF_HEADER_SIZE - 2)); memcpy (GST_BUFFER_DATA (subbuffer), GST_BUFFER_DATA (buffer) + TIFF_HEADER_SIZE, GST_BUFFER_SIZE (buffer) - TIFF_HEADER_SIZE); taglist = gst_tag_list_from_exif_buffer (subbuffer, endianness == TIFF_LITTLE_ENDIAN ? G_LITTLE_ENDIAN : G_BIG_ENDIAN, 8); gst_buffer_unref (subbuffer); return taglist; byte_reader_fail: { GST_WARNING ("Failed to read values from buffer"); return NULL; } }
static PyObject * _wrap_gst_tag_list_from_exif_buffer(PyObject *self, PyObject *args, PyObject *kwargs) { static char *kwlist[] = { "buffer", "byte_order", "base_offset", NULL }; PyObject *py_buffer; int byte_order; GstTagList *ret; unsigned long base_offset; const GstBuffer *buffer; if (!PyArg_ParseTupleAndKeywords(args, kwargs,"Oik:tag_list_from_exif_buffer", kwlist, &py_buffer, &byte_order, &base_offset)) return NULL; buffer = GST_BUFFER(pygstminiobject_get (py_buffer)); if (PyErr_Occurred()) return NULL; pyg_begin_allow_threads; ret = gst_tag_list_from_exif_buffer(buffer, byte_order, base_offset); pyg_end_allow_threads; /* pyg_boxed_new handles NULL checking */ return pyg_boxed_new(GST_TYPE_TAG_LIST, (GstTagList*) ret, TRUE, TRUE); }