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:
Edgard Lima 2007-12-04 16:42:25 +00:00
parent cef8e5fe60
commit cf4c5c9655
11 changed files with 181 additions and 106 deletions

View file

@ -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:

View file

@ -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:

View file

@ -75,9 +75,7 @@ struct _GstMetadataMux
GstPad *sinkpad, *srcpad;
gboolean exif;
gboolean iptc;
gboolean xmp;
guint8 options;
MetaData mux_data;
GstAdapter *adapter_parsing;

View file

@ -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:

View file

@ -75,9 +75,7 @@ struct _GstMetadataParse
GstPad *sinkpad, *srcpad;
gboolean exif;
gboolean iptc;
gboolean xmp;
guint8 options;
gboolean need_send_tag;

View file

@ -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);
*/
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);
*/
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,
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);
*/
break;
default:
/* unexpected */

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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:

View file

@ -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,