mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
Fixed element properties and now muxer writes to png also.
Original commit message from CVS: Fixed element properties and now muxer writes to png also.
This commit is contained in:
parent
cef8e5fe60
commit
cf4c5c9655
11 changed files with 181 additions and 106 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
|||
2007-12-04 Edgard Lima <edgard.lima@indt.org.br>
|
||||
|
||||
* ext/metadata/gstmetadatamux.c:
|
||||
* ext/metadata/gstmetadatamux.h:
|
||||
* ext/metadata/gstmetadataparse.c:
|
||||
* ext/metadata/gstmetadataparse.h:
|
||||
* ext/metadata/metadata.c:
|
||||
* ext/metadata/metadata.h:
|
||||
* ext/metadata/metadatamuxjpeg.c:
|
||||
* ext/metadata/metadatamuxjpeg.h:
|
||||
* ext/metadata/metadatamuxpng.c:
|
||||
* ext/metadata/metadatamuxpng.h:
|
||||
Fixed element properties and now muxer writes to png also.
|
||||
|
||||
2007-12-03 Zaheer Abbas Merali <zaheerabbas at merali dot org>
|
||||
|
||||
* gst/mpegtsparse/Makefile.am:
|
||||
|
|
|
@ -162,8 +162,6 @@ gst_metadata_mux_mux (GstMetadataMux * filter, const guint8 * buf,
|
|||
|
||||
static void gst_metadata_mux_create_chunks_from_tags (GstMetadataMux * filter);
|
||||
|
||||
|
||||
|
||||
static int
|
||||
gst_metadata_mux_get_strip_seg (const gint64 offset, guint32 size,
|
||||
const gint64 seg_offset, const guint32 seg_size,
|
||||
|
@ -289,6 +287,7 @@ gst_metadata_mux_init (GstMetadataMux * filter, GstMetadataMuxClass * gclass)
|
|||
metadataparse_xmp_init ();
|
||||
/* init members */
|
||||
|
||||
filter->options = META_OPT_EXIF | META_OPT_IPTC | META_OPT_XMP;
|
||||
gst_metadata_mux_init_members (filter);
|
||||
|
||||
}
|
||||
|
@ -302,21 +301,21 @@ gst_metadata_mux_set_property (GObject * object, guint prop_id,
|
|||
switch (prop_id) {
|
||||
case ARG_EXIF:
|
||||
if (g_value_get_boolean (value))
|
||||
set_meta_option (filter->mux_data, META_OPT_EXIF);
|
||||
filter->options |= META_OPT_EXIF;
|
||||
else
|
||||
unset_meta_option (filter->mux_data, META_OPT_EXIF);
|
||||
filter->options &= ~META_OPT_EXIF;
|
||||
break;
|
||||
case ARG_IPTC:
|
||||
if (g_value_get_boolean (value))
|
||||
set_meta_option (filter->mux_data, META_OPT_IPTC);
|
||||
filter->options |= META_OPT_IPTC;
|
||||
else
|
||||
unset_meta_option (filter->mux_data, META_OPT_IPTC);
|
||||
filter->options &= ~META_OPT_IPTC;
|
||||
break;
|
||||
case ARG_XMP:
|
||||
if (g_value_get_boolean (value))
|
||||
set_meta_option (filter->mux_data, META_OPT_XMP);
|
||||
filter->options |= META_OPT_XMP;
|
||||
else
|
||||
unset_meta_option (filter->mux_data, META_OPT_XMP);
|
||||
filter->options &= ~META_OPT_XMP;
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
|
@ -332,16 +331,13 @@ gst_metadata_mux_get_property (GObject * object, guint prop_id,
|
|||
|
||||
switch (prop_id) {
|
||||
case ARG_EXIF:
|
||||
g_value_set_boolean (value,
|
||||
META_DATA_OPTION (filter->mux_data) & META_OPT_EXIF);
|
||||
g_value_set_boolean (value, filter->options & META_OPT_EXIF);
|
||||
break;
|
||||
case ARG_IPTC:
|
||||
g_value_set_boolean (value,
|
||||
META_DATA_OPTION (filter->mux_data) & META_OPT_IPTC);
|
||||
g_value_set_boolean (value, filter->options & META_OPT_IPTC);
|
||||
break;
|
||||
case ARG_XMP:
|
||||
g_value_set_boolean (value,
|
||||
META_DATA_OPTION (filter->mux_data) & META_OPT_XMP);
|
||||
g_value_set_boolean (value, filter->options & META_OPT_XMP);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
|
@ -604,9 +600,6 @@ static void
|
|||
gst_metadata_mux_init_members (GstMetadataMux * filter)
|
||||
{
|
||||
filter->need_calculate_offset = FALSE;
|
||||
filter->exif = TRUE;
|
||||
filter->iptc = FALSE;
|
||||
filter->xmp = FALSE;
|
||||
|
||||
filter->adapter_parsing = NULL;
|
||||
filter->adapter_holding = NULL;
|
||||
|
@ -624,6 +617,7 @@ gst_metadata_mux_init_members (GstMetadataMux * filter)
|
|||
filter->prepend_buffer = NULL;
|
||||
|
||||
memset (&filter->mux_data, 0x00, sizeof (MetaData));
|
||||
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -814,23 +808,27 @@ gst_metadata_create_chunks_from_tags (GstMetadataMux * filter)
|
|||
|
||||
if (taglist) {
|
||||
|
||||
if (META_DATA_OPTION (filter->mux_data) & META_OPT_EXIF) {
|
||||
if (filter->options & META_OPT_EXIF) {
|
||||
metadatamux_exif_create_chunk_from_tag_list (&buf, &size, taglist);
|
||||
gst_metadata_update_segment (filter, &buf, &size, MD_CHUNK_EXIF);
|
||||
}
|
||||
|
||||
if (META_DATA_OPTION (filter->mux_data) & META_OPT_IPTC) {
|
||||
if (filter->options & META_OPT_IPTC) {
|
||||
metadatamux_iptc_create_chunk_from_tag_list (&buf, &size, taglist);
|
||||
gst_metadata_update_segment (filter, &buf, &size, MD_CHUNK_IPTC);
|
||||
}
|
||||
|
||||
if (META_DATA_OPTION (filter->mux_data) & META_OPT_XMP) {
|
||||
if (filter->options & META_OPT_XMP) {
|
||||
metadatamux_xmp_create_chunk_from_tag_list (&buf, &size, taglist);
|
||||
gst_metadata_update_segment (filter, &buf, &size, MD_CHUNK_XMP);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (buf) {
|
||||
g_free (buf);
|
||||
}
|
||||
|
||||
metadata_chunk_array_remove_zero_size (&filter->mux_data.inject_chunks);
|
||||
|
||||
}
|
||||
|
@ -1768,7 +1766,7 @@ gst_metadata_mux_change_state (GstElement * element, GstStateChange transition)
|
|||
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||
gst_metadata_mux_init_members (filter);
|
||||
filter->adapter_parsing = gst_adapter_new ();
|
||||
metadata_init (&filter->mux_data, FALSE);
|
||||
metadata_init (&filter->mux_data, FALSE, filter->options);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -1792,7 +1790,7 @@ gst_metadata_mux_change_state (GstElement * element, GstStateChange transition)
|
|||
/* cleanup parser */
|
||||
/* FIXME: could be improved a bit to avoid mem allocation */
|
||||
metadata_dispose (&filter->mux_data);
|
||||
metadata_init (&filter->mux_data, FALSE);
|
||||
metadata_init (&filter->mux_data, FALSE, filter->options);
|
||||
}
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
|
|
|
@ -75,9 +75,7 @@ struct _GstMetadataMux
|
|||
|
||||
GstPad *sinkpad, *srcpad;
|
||||
|
||||
gboolean exif;
|
||||
gboolean iptc;
|
||||
gboolean xmp;
|
||||
guint8 options;
|
||||
|
||||
MetaData mux_data;
|
||||
GstAdapter *adapter_parsing;
|
||||
|
|
|
@ -283,6 +283,8 @@ gst_metadata_parse_init (GstMetadataParse * filter,
|
|||
metadataparse_xmp_init ();
|
||||
/* init members */
|
||||
|
||||
filter->options = META_OPT_EXIF | META_OPT_IPTC | META_OPT_XMP;
|
||||
|
||||
gst_metadata_parse_init_members (filter);
|
||||
|
||||
}
|
||||
|
@ -296,21 +298,21 @@ gst_metadata_parse_set_property (GObject * object, guint prop_id,
|
|||
switch (prop_id) {
|
||||
case ARG_EXIF:
|
||||
if (g_value_get_boolean (value))
|
||||
set_meta_option (filter->parse_data, META_OPT_EXIF);
|
||||
filter->options |= META_OPT_EXIF;
|
||||
else
|
||||
unset_meta_option (filter->parse_data, META_OPT_EXIF);
|
||||
filter->options &= ~META_OPT_EXIF;
|
||||
break;
|
||||
case ARG_IPTC:
|
||||
if (g_value_get_boolean (value))
|
||||
set_meta_option (filter->parse_data, META_OPT_IPTC);
|
||||
filter->options |= META_OPT_IPTC;
|
||||
else
|
||||
unset_meta_option (filter->parse_data, META_OPT_IPTC);
|
||||
filter->options &= ~META_OPT_IPTC;
|
||||
break;
|
||||
case ARG_XMP:
|
||||
if (g_value_get_boolean (value))
|
||||
set_meta_option (filter->parse_data, META_OPT_XMP);
|
||||
filter->options |= META_OPT_XMP;
|
||||
else
|
||||
unset_meta_option (filter->parse_data, META_OPT_XMP);
|
||||
filter->options &= ~META_OPT_XMP;
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
|
@ -326,16 +328,13 @@ gst_metadata_parse_get_property (GObject * object, guint prop_id,
|
|||
|
||||
switch (prop_id) {
|
||||
case ARG_EXIF:
|
||||
g_value_set_boolean (value,
|
||||
META_DATA_OPTION (filter->parse_data) & META_OPT_EXIF);
|
||||
g_value_set_boolean (value, filter->options & META_OPT_EXIF);
|
||||
break;
|
||||
case ARG_IPTC:
|
||||
g_value_set_boolean (value,
|
||||
META_DATA_OPTION (filter->parse_data) & META_OPT_IPTC);
|
||||
g_value_set_boolean (value, filter->options & META_OPT_IPTC);
|
||||
break;
|
||||
case ARG_XMP:
|
||||
g_value_set_boolean (value,
|
||||
META_DATA_OPTION (filter->parse_data) & META_OPT_XMP);
|
||||
g_value_set_boolean (value, filter->options & META_OPT_XMP);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
|
@ -591,9 +590,6 @@ static void
|
|||
gst_metadata_parse_init_members (GstMetadataParse * filter)
|
||||
{
|
||||
filter->need_send_tag = FALSE;
|
||||
filter->exif = TRUE;
|
||||
filter->iptc = TRUE;
|
||||
filter->xmp = TRUE;
|
||||
|
||||
filter->adapter_parsing = NULL;
|
||||
filter->adapter_holding = NULL;
|
||||
|
@ -611,6 +607,7 @@ gst_metadata_parse_init_members (GstMetadataParse * filter)
|
|||
filter->prepend_buffer = NULL;
|
||||
|
||||
memset (&filter->parse_data, 0x00, sizeof (MetaData));
|
||||
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -763,13 +760,13 @@ gst_metadata_parse_send_tags (GstMetadataParse * filter)
|
|||
GstTagList *taglist = gst_tag_list_new ();
|
||||
GstEvent *event;
|
||||
|
||||
if (META_DATA_OPTION (filter->parse_data) & META_OPT_EXIF)
|
||||
if (filter->options & META_OPT_EXIF)
|
||||
metadataparse_exif_tag_list_add (taglist, GST_TAG_MERGE_KEEP,
|
||||
filter->parse_data.exif_adapter, METADATA_TAG_MAP_WHOLECHUNK);
|
||||
if (META_DATA_OPTION (filter->parse_data) & META_OPT_IPTC)
|
||||
if (filter->options & META_OPT_IPTC)
|
||||
metadataparse_iptc_tag_list_add (taglist, GST_TAG_MERGE_KEEP,
|
||||
filter->parse_data.iptc_adapter, METADATA_TAG_MAP_WHOLECHUNK);
|
||||
if (META_DATA_OPTION (filter->parse_data) & META_OPT_XMP)
|
||||
if (filter->options & META_OPT_XMP)
|
||||
metadataparse_xmp_tag_list_add (taglist, GST_TAG_MERGE_KEEP,
|
||||
filter->parse_data.xmp_adapter, METADATA_TAG_MAP_WHOLECHUNK);
|
||||
|
||||
|
@ -787,13 +784,13 @@ gst_metadata_parse_send_tags (GstMetadataParse * filter)
|
|||
if (!taglist)
|
||||
taglist = gst_tag_list_new ();
|
||||
|
||||
if (META_DATA_OPTION (filter->parse_data) & META_OPT_EXIF)
|
||||
if (filter->options & META_OPT_EXIF)
|
||||
metadataparse_exif_tag_list_add (taglist, GST_TAG_MERGE_KEEP,
|
||||
filter->parse_data.exif_adapter, METADATA_TAG_MAP_INDIVIDUALS);
|
||||
if (META_DATA_OPTION (filter->parse_data) & META_OPT_IPTC)
|
||||
if (filter->options & META_OPT_IPTC)
|
||||
metadataparse_iptc_tag_list_add (taglist, GST_TAG_MERGE_KEEP,
|
||||
filter->parse_data.iptc_adapter, METADATA_TAG_MAP_INDIVIDUALS);
|
||||
if (META_DATA_OPTION (filter->parse_data) & META_OPT_XMP)
|
||||
if (filter->options & META_OPT_XMP)
|
||||
metadataparse_xmp_tag_list_add (taglist, GST_TAG_MERGE_KEEP,
|
||||
filter->parse_data.xmp_adapter, METADATA_TAG_MAP_INDIVIDUALS);
|
||||
|
||||
|
@ -1733,7 +1730,7 @@ gst_metadata_parse_change_state (GstElement * element,
|
|||
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||
gst_metadata_parse_init_members (filter);
|
||||
filter->adapter_parsing = gst_adapter_new ();
|
||||
metadata_init (&filter->parse_data, TRUE);
|
||||
metadata_init (&filter->parse_data, TRUE, filter->options);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -1757,7 +1754,7 @@ gst_metadata_parse_change_state (GstElement * element,
|
|||
/* cleanup parser */
|
||||
/* FIXME: could be improved a bit to avoid mem allocation */
|
||||
metadata_dispose (&filter->parse_data);
|
||||
metadata_init (&filter->parse_data, TRUE);
|
||||
metadata_init (&filter->parse_data, TRUE, filter->options);
|
||||
}
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
|
|
|
@ -75,9 +75,7 @@ struct _GstMetadataParse
|
|||
|
||||
GstPad *sinkpad, *srcpad;
|
||||
|
||||
gboolean exif;
|
||||
gboolean iptc;
|
||||
gboolean xmp;
|
||||
guint8 options;
|
||||
|
||||
gboolean need_send_tag;
|
||||
|
||||
|
|
|
@ -58,11 +58,11 @@ metadata_parse_none (MetaData * meta_data, const guint8 * buf,
|
|||
*/
|
||||
|
||||
void
|
||||
metadata_init (MetaData * meta_data, gboolean parse)
|
||||
metadata_init (MetaData * meta_data, gboolean parse, guint8 options)
|
||||
{
|
||||
meta_data->state = STATE_NULL;
|
||||
meta_data->img_type = IMG_NONE;
|
||||
meta_data->option = META_OPT_ALL;
|
||||
meta_data->options = options;
|
||||
meta_data->offset_orig = 0;
|
||||
meta_data->exif_adapter = NULL;
|
||||
meta_data->iptc_adapter = NULL;
|
||||
|
@ -124,13 +124,11 @@ metadata_parse (MetaData * meta_data, const guint8 * buf,
|
|||
metadataparse_png_parse (&meta_data->format_data.png_parse,
|
||||
(guint8 *) buf, &bufsize, meta_data->offset_orig, &next_start,
|
||||
next_size);
|
||||
/*
|
||||
else
|
||||
ret =
|
||||
metadatamux_png_parse (&meta_data->format_data.png_mux,
|
||||
(guint8 *) buf, &bufsize, meta_data->offset_orig, &next_start,
|
||||
next_size);
|
||||
*/
|
||||
else
|
||||
ret =
|
||||
metadatamux_png_parse (&meta_data->format_data.png_mux,
|
||||
(guint8 *) buf, &bufsize, meta_data->offset_orig, &next_start,
|
||||
next_size);
|
||||
break;
|
||||
default:
|
||||
/* unexpected */
|
||||
|
@ -165,10 +163,8 @@ metadata_dispose (MetaData * meta_data)
|
|||
case IMG_PNG:
|
||||
if (G_LIKELY (meta_data->parse))
|
||||
metadataparse_png_dispose (&meta_data->format_data.png_parse);
|
||||
/*
|
||||
else
|
||||
metadatamux_png_dispose (&meta_data->format_data.png_mux);
|
||||
*/
|
||||
else
|
||||
metadatamux_png_dispose (&meta_data->format_data.png_mux);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -217,11 +213,11 @@ metadata_parse_none (MetaData * meta_data, const guint8 * buf,
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (meta_data->option & META_OPT_EXIF)
|
||||
if (meta_data->options & META_OPT_EXIF)
|
||||
exif = &meta_data->exif_adapter;
|
||||
if (meta_data->option & META_OPT_IPTC)
|
||||
if (meta_data->options & META_OPT_IPTC)
|
||||
iptc = &meta_data->iptc_adapter;
|
||||
if (meta_data->option & META_OPT_XMP)
|
||||
if (meta_data->options & META_OPT_XMP)
|
||||
xmp = &meta_data->xmp_adapter;
|
||||
|
||||
if (buf[0] == 0xFF && buf[1] == 0xD8 && buf[2] == 0xFF) {
|
||||
|
@ -229,7 +225,7 @@ metadata_parse_none (MetaData * meta_data, const guint8 * buf,
|
|||
metadataparse_jpeg_init (&meta_data->format_data.jpeg_parse, exif, iptc,
|
||||
xmp, &meta_data->strip_chunks, &meta_data->inject_chunks);
|
||||
else
|
||||
metadatamux_jpeg_init (&meta_data->format_data.jpeg_mux, exif, iptc, xmp,
|
||||
metadatamux_jpeg_init (&meta_data->format_data.jpeg_mux,
|
||||
&meta_data->strip_chunks, &meta_data->inject_chunks);
|
||||
ret = 0;
|
||||
meta_data->img_type = IMG_JPEG;
|
||||
|
@ -247,11 +243,9 @@ metadata_parse_none (MetaData * meta_data, const guint8 * buf,
|
|||
if (G_LIKELY (meta_data->parse))
|
||||
metadataparse_png_init (&meta_data->format_data.png_parse, exif, iptc,
|
||||
xmp, &meta_data->strip_chunks, &meta_data->inject_chunks);
|
||||
/*
|
||||
else
|
||||
metadatamux_png_init (&meta_data->format_data.png_mux, exif, iptc, xmp,
|
||||
&meta_data->strip_chunks, &meta_data->inject_chunks);
|
||||
*/
|
||||
else
|
||||
metadatamux_png_init (&meta_data->format_data.png_mux,
|
||||
&meta_data->strip_chunks, &meta_data->inject_chunks);
|
||||
ret = 0;
|
||||
meta_data->img_type = IMG_PNG;
|
||||
goto done;
|
||||
|
@ -275,10 +269,8 @@ metadata_lazy_update (MetaData * meta_data)
|
|||
case IMG_PNG:
|
||||
if (G_LIKELY (meta_data->parse))
|
||||
metadataparse_png_lazy_update (&meta_data->format_data.png_parse);
|
||||
/*
|
||||
else
|
||||
metadatamux_png_lazy_update (&meta_data->format_data.png_mux);
|
||||
*/
|
||||
else
|
||||
metadatamux_png_lazy_update (&meta_data->format_data.png_mux);
|
||||
break;
|
||||
default:
|
||||
/* unexpected */
|
||||
|
|
|
@ -80,7 +80,7 @@ typedef struct _tag_MetaData
|
|||
{
|
||||
MetaState state;
|
||||
ImageType img_type;
|
||||
MetaOption option;
|
||||
guint8 options;
|
||||
guint32 offset_orig; /* offset since begining of stream */
|
||||
union
|
||||
{
|
||||
|
@ -101,11 +101,8 @@ typedef struct _tag_MetaData
|
|||
} MetaData;
|
||||
|
||||
#define META_DATA_IMG_TYPE(p) (p).img_type
|
||||
#define META_DATA_OPTION(p) (p).option
|
||||
#define set_meta_option(p, m) do { (p).option = (p).option | (m); } while(FALSE)
|
||||
#define unset_meta_option(p, m) do { (p).option = (p).option & ~(m); } while(FALSE)
|
||||
|
||||
extern void metadata_init (MetaData * meta_data, gboolean parse);
|
||||
extern void metadata_init (MetaData * meta_data, gboolean parse, guint8 options);
|
||||
|
||||
/*
|
||||
* offset: number of bytes that MUST be jumped after current "buf" pointer
|
||||
|
|
|
@ -66,8 +66,8 @@ metadatamux_wrap_chunk (MetadataChunk * chunk, guint8 * buf, guint32 buf_size,
|
|||
chunk->size += 4 + buf_size;
|
||||
data[0] = a;
|
||||
data[1] = b;
|
||||
data[2] = (chunk->size - 2) >> 8;
|
||||
data[3] = (chunk->size - 2) & 0x00FF;
|
||||
data[2] = ((chunk->size - 2) >> 8) & 0xFF;
|
||||
data[3] = (chunk->size - 2) & 0xFF;
|
||||
if (buf && buf_size) {
|
||||
memcpy (data + 4, buf, buf_size);
|
||||
}
|
||||
|
@ -130,8 +130,7 @@ metadatamux_jpeg_lazy_update (JpegMuxData * jpeg_data)
|
|||
}
|
||||
|
||||
void
|
||||
metadatamux_jpeg_init (JpegMuxData * jpeg_data, GstAdapter ** exif_adpt,
|
||||
GstAdapter ** iptc_adpt, GstAdapter ** xmp_adpt,
|
||||
metadatamux_jpeg_init (JpegMuxData * jpeg_data,
|
||||
MetadataChunkArray * strip_chunks, MetadataChunkArray * inject_chunks)
|
||||
{
|
||||
jpeg_data->state = JPEG_MUX_NULL;
|
||||
|
|
|
@ -69,8 +69,7 @@ typedef struct _tag_JpegMuxData
|
|||
|
||||
|
||||
extern void
|
||||
metadatamux_jpeg_init (JpegMuxData * jpeg_data, GstAdapter ** exif_adpt,
|
||||
GstAdapter ** iptc_adpt, GstAdapter ** xmp_adpt,
|
||||
metadatamux_jpeg_init (JpegMuxData * jpeg_data,
|
||||
MetadataChunkArray * strip_chunks, MetadataChunkArray * inject_chunks);
|
||||
|
||||
extern void metadatamux_jpeg_dispose (JpegMuxData * jpeg_data);
|
||||
|
|
|
@ -52,30 +52,120 @@ metadatamux_png_reading (PngMuxData * png_data, guint8 ** buf,
|
|||
|
||||
#define READ(buf, size) ( (size)--, *((buf)++) )
|
||||
|
||||
void
|
||||
metadatamux_png_lazy_update (PngMuxData * jpeg_data)
|
||||
static void
|
||||
make_crc_table (guint32 crc_table[])
|
||||
{
|
||||
/* nothing to do */
|
||||
guint32 c;
|
||||
guint16 n, k;
|
||||
|
||||
for (n = 0; n < 256; n++) {
|
||||
c = (guint32) n;
|
||||
for (k = 0; k < 8; k++) {
|
||||
if (c & 1)
|
||||
c = 0xedb88320L ^ (c >> 1);
|
||||
else
|
||||
c = c >> 1;
|
||||
}
|
||||
crc_table[n] = c;
|
||||
}
|
||||
}
|
||||
|
||||
static guint32
|
||||
update_crc (guint32 crc, guint8 * buf, guint32 len)
|
||||
{
|
||||
guint32 c = crc;
|
||||
guint32 n;
|
||||
guint32 crc_table[256];
|
||||
|
||||
/* FIXME: make_crc_table should be done once in life
|
||||
for speed up */
|
||||
make_crc_table (crc_table);
|
||||
|
||||
for (n = 0; n < len; n++) {
|
||||
c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/* Return the CRC of the bytes buf[0..len-1]. */
|
||||
static guint32
|
||||
calc_crc (guint8 * buf, guint32 len)
|
||||
{
|
||||
return update_crc (0xffffffffL, buf, len) ^ 0xffffffffL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
metadatamux_wrap_xmp_chunk (MetadataChunk * chunk)
|
||||
{
|
||||
static const char XmpHeader[] = "XML:com.adobe.xmp";
|
||||
guint8 *data = NULL;
|
||||
guint32 crc;
|
||||
|
||||
data = g_new (guint8, 12 + 18 + 4 + chunk->size);
|
||||
|
||||
memcpy (data + 8, XmpHeader, 18);
|
||||
memset (data + 8 + 18, 0x00, 4);
|
||||
memcpy (data + 8 + 18 + 4, chunk->data, chunk->size);
|
||||
g_free (chunk->data);
|
||||
chunk->data = data;
|
||||
chunk->size += 18 + 4;
|
||||
data[0] = (chunk->size >> 24) & 0xFF;
|
||||
data[1] = (chunk->size >> 16) & 0xFF;
|
||||
data[2] = (chunk->size >> 8) & 0xFF;
|
||||
data[3] = chunk->size & 0xFF;
|
||||
data[4] = 'i';
|
||||
data[5] = 'T';
|
||||
data[6] = 'X';
|
||||
data[7] = 't';
|
||||
crc = calc_crc (data + 4, chunk->size + 4 + 18);
|
||||
data[chunk->size + 8] = (crc >> 24) & 0xFF;
|
||||
data[chunk->size + 9] = (crc >> 16) & 0xFF;
|
||||
data[chunk->size + 10] = (crc >> 8) & 0xFF;
|
||||
data[chunk->size + 11] = crc & 0xFF;
|
||||
chunk->size += 12;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
metadatamux_png_init (PngMuxData * png_data, GstAdapter ** exif_adpt,
|
||||
GstAdapter ** iptc_adpt, GstAdapter ** xmp_adpt,
|
||||
metadatamux_png_lazy_update (PngMuxData * png_data)
|
||||
{
|
||||
gsize i;
|
||||
|
||||
for (i = 0; i < png_data->inject_chunks->len; ++i) {
|
||||
if (png_data->inject_chunks->chunk[i].size > 0 &&
|
||||
png_data->inject_chunks->chunk[i].data) {
|
||||
switch (png_data->inject_chunks->chunk[i].type) {
|
||||
case MD_CHUNK_XMP:
|
||||
{
|
||||
metadatamux_wrap_xmp_chunk (&png_data->inject_chunks->chunk[i]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
GST_ERROR ("Unexpected chunk for PNG muxer.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
metadatamux_png_init (PngMuxData * png_data,
|
||||
MetadataChunkArray * strip_chunks, MetadataChunkArray * inject_chunks)
|
||||
{
|
||||
png_data->state = PNG_MUX_NULL;
|
||||
png_data->xmp_adapter = xmp_adpt;
|
||||
png_data->read = 0;
|
||||
|
||||
png_data->strip_chunks = strip_chunks;
|
||||
png_data->inject_chunks = inject_chunks;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
metadatamux_png_dispose (PngMuxData * png_data)
|
||||
{
|
||||
png_data->xmp_adapter = NULL;
|
||||
png_data->strip_chunks = NULL;
|
||||
png_data->inject_chunks = NULL;
|
||||
|
||||
png_data->state = PNG_MUX_NULL;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -118,9 +208,6 @@ metadatamux_png_parse (PngMuxData * png_data, guint8 * buf,
|
|||
|
||||
}
|
||||
|
||||
/* JUST UNTIL NOT IMPLEMENTED */
|
||||
return 0;
|
||||
|
||||
while (ret == 0) {
|
||||
switch (png_data->state) {
|
||||
case PNG_MUX_READING:
|
||||
|
|
|
@ -64,23 +64,19 @@ typedef struct _tag_PngMuxData
|
|||
{
|
||||
PngMuxState state;
|
||||
|
||||
GstAdapter ** xmp_adapter;
|
||||
|
||||
MetadataChunkArray * strip_chunks;
|
||||
MetadataChunkArray * inject_chunks;
|
||||
|
||||
guint32 read;
|
||||
} PngMuxData;
|
||||
|
||||
|
||||
extern void
|
||||
metadatamux_png_init (PngMuxData * png_data, GstAdapter ** exif_adpt,
|
||||
GstAdapter ** iptc_adpt, GstAdapter ** xmp_adpt,
|
||||
metadatamux_png_init (PngMuxData * png_data,
|
||||
MetadataChunkArray * strip_chunks, MetadataChunkArray * inject_chunks);
|
||||
|
||||
extern void metadatamux_png_dispose (PngMuxData * png_data);
|
||||
|
||||
extern void metadatamux_png_lazy_update (PngMuxData * jpeg_data);
|
||||
extern void metadatamux_png_lazy_update (PngMuxData * png_data);
|
||||
|
||||
int
|
||||
metadatamux_png_parse (PngMuxData * png_data, guint8 * buf,
|
||||
|
|
Loading…
Reference in a new issue