Some XMP stuff added.

Original commit message from CVS:
Some XMP stuff added.
This commit is contained in:
Edgard Lima 2007-11-01 16:04:29 +00:00
parent 5888898c57
commit 929954f595
10 changed files with 290 additions and 26 deletions

View file

@ -1,3 +1,24 @@
2007-11-01 Edgard Lima <edgard.lima@indt.org.br>
* configure.ac:
* ext/metadata/Makefile.am:
* ext/metadata/metadataparseexif.c:
(metadataparse_exif_tags_register),
(metadataparse_exif_tag_list_add):
* ext/metadata/metadataparseiptc.c:
* ext/metadata/metadataparsejpeg.c: (metadataparse_jpeg_init),
(metadataparse_jpeg_dispose), (metadataparse_jpeg_parse),
(metadataparse_jpeg_reading), (metadataparse_jpeg_xmp):
* ext/metadata/metadataparseutil.c:
(metadataparse_tag_list_add_chunk):
* ext/metadata/metadataparseutil.h:
* ext/metadata/metadataparsexmp.c:
(metadataparse_xmp_tags_register),
(metadataparse_xmp_tag_list_add), (metadataparse_xmp_init),
(metadataparse_xmp_dispose):
* ext/metadata/metadataparsexmp.h:
Some XMP stuff added.
2007-10-31 Edgard Lima <edgard.lima@indt.org.br>
* ext/metadata/gstmetadataparse.c:

View file

@ -496,7 +496,15 @@ AG_GST_CHECK_FEATURE(METADATA, [METADATA muxer and demuxer], metadata, [
PKG_CHECK_MODULES(IPTC, libiptcdata >= 1.0.2, HAVE_IPTC="yes", [
HAVE_IPTC="no"
])
HAVE_XMP="no"
AC_CHECK_HEADER(exempi-2.0/exempi/xmp.h,
[
AC_CHECK_LIB(exempi, xmp_init,
[
HAVE_XMP="yes"
XMP_CFLAGS="-I/usr/local/include/exempi-2.0/exempi/"
XMP_LIBS="-lexempi"
], HAVE_XMP="no")
], HAVE_XMP="no")
if test x$HAVE_EXIF = xyes; then
METADATA_CFLAGS="-DHAVE_EXIF $EXIF_CFLAGS $METADATA_CFLAGS"
METADATA_LIBS="$EXIF_LIBS $METADATA_LIBS"
@ -513,8 +521,10 @@ AG_GST_CHECK_FEATURE(METADATA, [METADATA muxer and demuxer], metadata, [
HAVE_METADATA="yes"
fi
if test x$HAVE_METADATA = xno; then
AC_MSG_RESULT(no)
AC_MSG_WARN(no of metadata libraries (exif, iptc or xmp) found)
fi
dnl metadata plugin will parse whole chunks anyway
HAVE_METADATA="yes"
AC_SUBST(METADATA_CFLAGS)
AC_SUBST(METADATA_LIBS)
])

View file

@ -6,7 +6,8 @@ libgstmetadata_la_SOURCES = gstmetadata.c \
metadataparsejpeg.c \
metadataparseexif.c \
metadataparseiptc.c \
metadataparsexmp.c
metadataparsexmp.c \
metadataparseutil.c
libgstmetadata_la_CFLAGS = $(METADATA_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS)
libgstmetadata_la_LIBADD = $(METADATA_LIBS) -lgsttag-@GST_MAJORMINOR@ $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS)
@ -17,5 +18,6 @@ noinst_HEADERS = gstmetadataparse.h \
metadataparsejpeg.h \
metadataparseexif.h \
metadataparseiptc.h \
metadataparsexmp.h
metadataparsexmp.h \
metadataparseutil.h

View file

@ -42,13 +42,18 @@
*/
#include "metadataparseexif.h"
#include "metadataparseutil.h"
GST_DEBUG_CATEGORY (gst_metadata_parse_exif_debug);
#define GST_CAT_DEFAULT gst_metadata_parse_exif_debug
#define GST_TAG_EXIF "exif"
void
metadataparse_exif_tags_register (void)
{
gst_tag_register (GST_TAG_EXIF, GST_TAG_FLAG_META,
GST_TYPE_BUFFER, GST_TAG_EXIF, "exif metadata chunk", NULL);
}
#ifndef HAVE_EXIF
@ -60,6 +65,8 @@ metadataparse_exif_tag_list_add (GstTagList * taglist, GstTagMergeMode mode,
GST_LOG ("EXIF not defined, here I should send just one tag as whole chunk");
metadataparse_tag_list_add_chunk (taglist, mode, GST_TAG_EXIF, adapter);
}
#else /* ifndef HAVE_EXIF */
@ -83,6 +90,9 @@ metadataparse_exif_tag_list_add (GstTagList * taglist, GstTagMergeMode mode,
goto done;
}
/* add chunk tag */
metadataparse_tag_list_add_chunk (taglist, mode, GST_TAG_EXIF, adapter);
buf = gst_adapter_peek (adapter, size);
exif = exif_data_new_from_data (buf, size);

View file

@ -42,6 +42,7 @@
*/
#include "metadataparseiptc.h"
#include "metadataparseutil.h"
GST_DEBUG_CATEGORY (gst_metadata_parse_iptc_debug);
#define GST_CAT_DEFAULT gst_metadata_parse_iptc_debug
@ -55,26 +56,6 @@ metadataparse_iptc_tags_register (void)
GST_TYPE_BUFFER, GST_TAG_IPTC, "iptc metadata chunk", NULL);
}
void
metadataparse_tag_list_add_chunk (GstTagList * taglist, GstTagMergeMode mode,
const gchar * name, GstAdapter * adapter)
{
GstBuffer *buf;
guint size;
if (adapter && (size = gst_adapter_available (adapter))) {
buf = gst_buffer_new_and_alloc (size);
gst_adapter_copy (adapter, GST_BUFFER_DATA (buf), 0, size);
gst_tag_list_add (taglist, mode, name, buf, NULL);
gst_buffer_unref (buf);
}
}
#ifndef HAVE_IPTC
void

View file

@ -65,6 +65,10 @@ static int
metadataparse_jpeg_iptc (JpegData * jpeg_data, guint8 ** buf,
guint32 * bufsize, guint8 ** next_start, guint32 * next_size);
static int
metadataparse_jpeg_xmp (JpegData * jpeg_data, guint8 ** buf,
guint32 * bufsize, guint8 ** next_start, guint32 * next_size);
static int
metadataparse_jpeg_jump (JpegData * jpeg_data, guint8 ** buf,
guint32 * bufsize, guint8 ** next_start, guint32 * next_size);
@ -80,11 +84,14 @@ metadataparse_jpeg_init (JpegData * jpeg_data, GstAdapter ** adpt_exif,
jpeg_data->adpt_iptc = adpt_iptc;
jpeg_data->adpt_xmp = adpt_xmp;
jpeg_data->read = 0;
metadataparse_xmp_init ();
}
void
metadataparse_jpeg_dispose (JpegData * jpeg_data)
{
metadataparse_xmp_dispose ();
jpeg_data->adpt_exif = NULL;
jpeg_data->adpt_iptc = NULL;
@ -143,6 +150,11 @@ metadataparse_jpeg_parse (JpegData * jpeg_data, guint8 * buf,
metadataparse_jpeg_iptc (jpeg_data, &buf, bufsize, next_start,
next_size);
break;
case JPEG_XMP:
ret =
metadataparse_jpeg_xmp (jpeg_data, &buf, bufsize, next_start,
next_size);
break;
case JPEG_DONE:
goto done;
break;
@ -172,6 +184,7 @@ metadataparse_jpeg_reading (JpegData * jpeg_data, guint8 ** buf,
static const unsigned char ExifHeader[] =
{ 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
static const char IptcHeader[] = "Photoshop 3.0";
static const char XmpHeader[] = "http://ns.adobe.com/xap/1.0/";
*next_start = *buf;
@ -204,7 +217,8 @@ metadataparse_jpeg_reading (JpegData * jpeg_data, guint8 ** buf,
chunk_size = READ (*buf, *bufsize) << 8;
chunk_size += READ (*buf, *bufsize);
if (mark[1] == 0xE1) { /* may be it is Exif */
if (mark[1] == 0xE1) { /* may be it is Exif or XMP */
if (chunk_size >= 8) { /* size2 'EXIF' 0x00 0x00 */
guint8 ch;
@ -222,6 +236,22 @@ metadataparse_jpeg_reading (JpegData * jpeg_data, guint8 ** buf,
goto done;
}
}
if (chunk_size >= 31) { /* size2 "http://ns.adobe.com/xap/1.0/" */
if (*bufsize < 29) {
*next_size = (*buf - *next_start) + 29;
ret = 1;
goto done;
}
if (jpeg_data->adpt_xmp) {
if (0 == memcmp (XmpHeader, *buf, 29)) {
jpeg_data->read = chunk_size - 2;
ret = 0;
jpeg_data->state = JPEG_XMP;
goto done;
}
}
}
}
} else if (mark[1] == 0xED) { /* may be it is photoshop and may be there is iptc */
if (chunk_size >= 16) { /* size2 "Photoshop 3.0" */
@ -349,6 +379,16 @@ metadataparse_jpeg_iptc (JpegData * jpeg_data, guint8 ** buf,
}
static int
metadataparse_jpeg_xmp (JpegData * jpeg_data, guint8 ** buf,
guint32 * bufsize, guint8 ** next_start, guint32 * next_size)
{
return metadataparse_jpeg_hold_chunk (jpeg_data, buf,
bufsize, next_start, next_size, jpeg_data->adpt_xmp);
}
static int
metadataparse_jpeg_jump (JpegData * jpeg_data, guint8 ** buf,
guint32 * bufsize, guint8 ** next_start, guint32 * next_size)

View file

@ -0,0 +1,64 @@
/*
* GStreamer
* Copyright 2007 Edgard Lima <edgard.lima@indt.org.br>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Alternatively, the contents of this file may be used under the
* GNU Lesser General Public License Version 2.1 (the "LGPL"), in
* which case the following provisions apply instead of the ones
* mentioned above:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "metadataparseutil.h"
void
metadataparse_tag_list_add_chunk (GstTagList * taglist, GstTagMergeMode mode,
const gchar * name, GstAdapter * adapter)
{
GstBuffer *buf;
guint size;
if (adapter && (size = gst_adapter_available (adapter))) {
buf = gst_buffer_new_and_alloc (size);
gst_adapter_copy (adapter, GST_BUFFER_DATA (buf), 0, size);
gst_tag_list_add (taglist, mode, name, buf, NULL);
gst_buffer_unref (buf);
}
}

View file

@ -0,0 +1,58 @@
/*
* GStreamer
* Copyright 2007 Edgard Lima <edgard.lima@indt.org.br>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Alternatively, the contents of this file may be used under the
* GNU Lesser General Public License Version 2.1 (the "LGPL"), in
* which case the following provisions apply instead of the ones
* mentioned above:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_METADATAPARSE_UTIL_H__
#define __GST_METADATAPARSE_UTIL_H__
#include <gst/gst.h>
#include <gst/base/gstadapter.h>
G_BEGIN_DECLS
extern void
metadataparse_tag_list_add_chunk (GstTagList * taglist, GstTagMergeMode mode,
const gchar * name, GstAdapter * adapter);
G_END_DECLS
#endif /* __GST_METADATAPARSE_UTIL_H__ */

View file

@ -42,13 +42,18 @@
*/
#include "metadataparsexmp.h"
#include "metadataparseutil.h"
GST_DEBUG_CATEGORY (gst_metadata_parse_xmp_debug);
#define GST_CAT_DEFAULT gst_metadata_parse_xmp_debug
#define GST_TAG_XMP "xmp"
void
metadataparse_xmp_tags_register (void)
{
gst_tag_register (GST_TAG_XMP, GST_TAG_FLAG_META,
GST_TYPE_BUFFER, GST_TAG_XMP, "xmp metadata chunk", NULL);
}
#ifndef HAVE_XMP
@ -60,16 +65,83 @@ metadataparse_xmp_tag_list_add (GstTagList * taglist, GstTagMergeMode mode,
GST_LOG ("XMP not defined, here I should send just one tag as whole chunk");
metadataparse_tag_list_add_chunk (taglist, mode, GST_TAG_XMP, adapter);
}
gboolean
metadataparse_xmp_init (void)
{
return TRUE;
}
void
metadataparse_xmp_dispose (void)
{
return;
}
#else /* ifndef HAVE_XMP */
#include <xmp.h>
gboolean
metadataparse_xmp_init (void)
{
return xmp_init ();
}
void
metadataparse_xmp_dispose (void)
{
xmp_terminate ();
}
void
metadataparse_xmp_tag_list_add (GstTagList * taglist, GstTagMergeMode mode,
GstAdapter * adapter)
{
const guint8 *buf;
guint32 size;
XmpPtr *xmp = NULL;
XmpStringPtr xmp_str = NULL;
GST_LOG ("XMP still not implemented");
if (adapter == NULL || (size = gst_adapter_available (adapter)) == 0) {
goto done;
}
/* add chunk tag */
metadataparse_tag_list_add_chunk (taglist, mode, GST_TAG_XMP, adapter);
buf = gst_adapter_peek (adapter, size);
buf += 29; /* jump "http://ns.adobe.com/xap/1.0/" */
size -= 29;
xmp = xmp_new (buf, size);
if (!xmp)
goto done;
xmp_str = xmp_string_new ();
if (!xmp_str)
goto done;
xmp_serialize (xmp, xmp_str, XMP_SERIAL_ENCODEUTF8, 2);
GST_LOG (xmp_string_cstr (xmp_str));
done:
if (xmp_str) {
xmp_string_free (xmp_str);
}
if (xmp) {
xmp_free (xmp);
}
return;
}

View file

@ -52,6 +52,12 @@ G_BEGIN_DECLS
extern void
metadataparse_xmp_tag_list_add (GstTagList *taglist, GstTagMergeMode mode, GstAdapter * adapter);
extern gboolean
metadataparse_xmp_init(void);
extern void
metadataparse_xmp_dispose(void);
extern void
metadataparse_xmp_tags_register (void);