mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
Some XMP stuff added.
Original commit message from CVS: Some XMP stuff added.
This commit is contained in:
parent
5888898c57
commit
929954f595
10 changed files with 290 additions and 26 deletions
21
ChangeLog
21
ChangeLog
|
@ -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:
|
||||
|
|
14
configure.ac
14
configure.ac
|
@ -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)
|
||||
])
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
64
ext/metadata/metadataparseutil.c
Normal file
64
ext/metadata/metadataparseutil.c
Normal 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);
|
||||
}
|
||||
|
||||
}
|
58
ext/metadata/metadataparseutil.h
Normal file
58
ext/metadata/metadataparseutil.h
Normal 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__ */
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue