Add documentation. Speed up a bit png muxer. Fix xmp muxer.

Original commit message from CVS:
Add documentation. Speed up a bit png muxer. Fix xmp muxer.
This commit is contained in:
Edgard Lima 2008-01-30 16:05:24 +00:00
parent 568edc33d0
commit b043a6f5e1
8 changed files with 182 additions and 83 deletions

View file

@ -1,3 +1,14 @@
2008-01-30 Edgard Lima <edgard.lima@indt.org.br>
* ext/metadata/gstbasemetadata.c:
* ext/metadata/metadatamuxjpeg.c:
* ext/metadata/metadatamuxpng.c:
* ext/metadata/metadataparsejpeg.c:
* ext/metadata/metadatatypes.c:
* ext/metadata/metadatatypes.h:
* ext/metadata/metadataxmp.c:
Add documentation. Speed up a bit png muxer. Fix xmp muxer.
2008-01-30 Sebastian Dröge <slomo@circular-chaos.org>
Patch by: Wouter Cloetens <wouter at mind dot be>

View file

@ -955,7 +955,6 @@ gst_base_metadata_buf_get_intersection_seg (const gint64 offset, guint32 size,
*boffset = 0;
/* FIXME : optimize to >= size -> = size */
if (seg_offset + seg_size >= offset + size) {
/* segment cover all buffer */
*bsize = size;
@ -1179,9 +1178,10 @@ gst_base_metadata_calculate_offsets (GstBaseMetadata * base)
bytes_inject += inject[i].size;
}
/* FIXME: For the time being we don't have append buffers 'cause in the case
of files we are handling it is not possible to append after the last byte
on original stream (which is part of a kind of end-of-file chunk) */
/* FIXME (append): For the time being we don't have append buffers 'cause
in the case of files we are handling it is not possible to append after
the last byte on original stream (which is part of a kind of end-of-file
chunk) */
#if 0
/* calculate append buffer */
append_size = 0;
@ -1491,10 +1491,9 @@ gst_base_metadata_src_event (GstPad * pad, GstEvent * event)
filter->prepend_buffer = NULL;
}
/* FIXME: if some chunk is injected after the end of original file
(which is not the case for any file type currently handled), appending
a buffer should be taken in account
*/
/* FIXME (append): if some chunk is injected after the end of original
file (which is not the case for any file type currently handled),
appending a buffer should be taken in account */
/* translate position and setup filter-prepend to be prepend to the
striped/injected buffer in next 'chain' calling */
@ -1647,14 +1646,11 @@ gst_base_metadata_get_range (GstPad * pad,
done:
if (need_append) {
/* FIXME: together with SEEK and
* gst_base_metadata_translate_pos_to_orig
* this way if chunk is added in the end we are in trouble
* ...still not implemented 'cause it will not be the
* case for the time being (All the file types handled
* have a kind of end-of-file chunk (or mark, so nothing
* will be injected after it)
*/
/* FIXME (append): together with SEEK and
gst_base_metadata_translate_pos_to_orig this way if chunk is added in
the end we are in trouble ...still not implemented 'cause it will not be
the case for the time being (All the file types handled have a kind of
end-of-file chunk (or mark, so nothing will be injected after it) */
}
return ret;
@ -1775,7 +1771,7 @@ gst_base_metadata_chain (GstPad * pad, GstBuffer * buf)
filter->offset += new_buf_size;
} else {
/* just store while still not based */
/* just store while still not parsed */
if (!filter->adapter_holding)
filter->adapter_holding = gst_adapter_new ();
gst_adapter_push (filter->adapter_holding, buf);
@ -1809,8 +1805,7 @@ gst_base_metadata_sink_activate (GstPad * pad)
if (!gst_pad_check_pull_range (pad) ||
!gst_pad_activate_pull (filter->sinkpad, TRUE)) {
/* FIXME: currently it is not possible to base in chain. Fail here ?
nothing to be done by now, activate push mode */
/* Fail here ? nothing to be done by now, activate push mode */
return gst_pad_activate_push (pad, TRUE);
}

View file

@ -264,10 +264,10 @@ done:
void
metadatamux_jpeg_lazy_update (JpegMuxData * jpeg_data)
{
gsize i;
gint i = 0;
gboolean has_exif = FALSE;
for (i = 0; i < jpeg_data->inject_chunks->len; ++i) {
while (i < jpeg_data->inject_chunks->len) {
if (jpeg_data->inject_chunks->chunk[i].size > 0 &&
jpeg_data->inject_chunks->chunk[i].data) {
switch (jpeg_data->inject_chunks->chunk[i].type) {
@ -285,7 +285,8 @@ metadatamux_jpeg_lazy_update (JpegMuxData * jpeg_data)
0, 0xFF, 0xED);
} else {
GST_ERROR ("Invalid IPTC chunk\n");
/* FIXME: remove entry from list */
metadata_chunk_array_remove_by_index (jpeg_data->inject_chunks, i);
continue;
}
}
#endif /* #ifdef HAVE_IPTC */
@ -302,7 +303,9 @@ metadatamux_jpeg_lazy_update (JpegMuxData * jpeg_data)
break;
}
}
++i;
}
if (!has_exif) {
/* EXIF not injected so not strip JFIF anymore */
metadata_chunk_array_clear (jpeg_data->strip_chunks);

View file

@ -86,6 +86,87 @@
#define READ(buf, size) ( (size)--, *((buf)++) )
/*
* static global vars
*/
static const guint32 metadatamux_crc_table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535,
0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b,
0x7eb17cbd,
0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d,
0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a,
0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e,
0xd56041e4,
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac,
0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11,
0xc1611dab,
0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589,
0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb,
0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8,
0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea,
0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158,
0x3ab551ce,
0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a,
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3,
0xb966d409,
0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739,
0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e,
0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
0x1e01f268,
0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76,
0x89d32be0,
0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8,
0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd,
0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef,
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
0xbb0b4703,
0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7,
0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14,
0x7bb12bae,
0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4,
0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6,
0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3,
0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d,
0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53,
0xdebb9ec5,
0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605,
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
/*
* static helper functions declaration
*/
@ -387,34 +468,6 @@ done:
}
/*
* metadatamux_make_crc_table:
* @crc_table: table to be written to.
*
* Creates a startup CRC table. For optimization it should be done only once.
* @see_also: #metadatamux_update_crc
*
* Returns: nothing.
*/
static void
metadatamux_make_crc_table (guint32 crc_table[])
{
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;
}
}
/*
* metadatamux_update_crc:
* @crc: seed to calculate the CRC
@ -432,14 +485,9 @@ metadatamux_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. It could be written hard coded to a file */
metadatamux_make_crc_table (crc_table);
for (n = 0; n < len; n++) {
c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
c = metadatamux_crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
}
return c;
}

View file

@ -677,7 +677,7 @@ metadataparse_jpeg_iptc (JpegParseData * jpeg_data, guint8 ** buf,
size = gst_adapter_available (*jpeg_data->iptc_adapter);
buf = gst_adapter_peek (*jpeg_data->iptc_adapter, size);
/* FIXME: currently we are trhowing away others PhotoShop data */
/* FIXME: currently we are throwing away others PhotoShop data */
res = iptc_jpeg_ps3_find_iptc (buf, size, &iptc_len);
if (res < 0) {

View file

@ -223,3 +223,27 @@ metadata_chunk_array_remove_zero_size (MetadataChunkArray * array)
}
}
}
/*
* metadata_chunk_array_remove_by_index:
* @array: an array of chunks
* @i: index of chunk to be removed
*
* This function removes the chunk at index @i from @array
*
* Returns: nothing
*/
void
metadata_chunk_array_remove_by_index (MetadataChunkArray * array, guint32 i)
{
if (i < array->len) {
if (array->chunk[i].data)
g_free (array->chunk[i].data);
if (i < --array->len) {
memmove (&array->chunk[i], &array->chunk[i + 1],
sizeof (MetadataChunk) * (array->len - i));
}
}
}

View file

@ -51,11 +51,9 @@
#include <glib.h>
G_BEGIN_DECLS
/*
* enum and types
*/
/* *INDENT-OFF* */
typedef enum _tag_MetadataParsingReturn {
@ -65,8 +63,8 @@ typedef enum _tag_MetadataParsingReturn {
} MetadataParsingReturn;
/* *INDENT-ON* */
typedef enum _tag_MetadataChunkType {
typedef enum _tag_MetadataChunkType
{
MD_CHUNK_UNKNOWN,
MD_CHUNK_EXIF,
MD_CHUNK_IPTC,
@ -78,14 +76,14 @@ typedef struct _tag_MetadataChunk
gint64 offset_orig; /* from the beginning of original file */
/*here just for convinience (filled by element) offset in new stream */
gint64 offset;
guint32 size; /* chunk or buffer size*/
guint8 * data;
guint32 size; /* chunk or buffer size */
guint8 *data;
MetadataChunkType type; /* used by mux to see what tags to insert here */
} MetadataChunk;
typedef struct _tag_MetadataChunkArray
{
MetadataChunk * chunk;
MetadataChunk *chunk;
gsize len; /* number of chunks into aray */
gsize allocated_len; /* number of slots into the array to store chunks */
} MetadataChunkArray;
@ -95,23 +93,23 @@ typedef struct _tag_MetadataChunkArray
*/
extern void
metadata_chunk_array_init(MetadataChunkArray * array, gsize alloc_size);
metadata_chunk_array_init (MetadataChunkArray * array, gsize alloc_size);
extern void metadata_chunk_array_free (MetadataChunkArray * array);
extern void metadata_chunk_array_clear (MetadataChunkArray * array);
extern void
metadata_chunk_array_free(MetadataChunkArray * array);
metadata_chunk_array_append (MetadataChunkArray * array, MetadataChunk * chunk);
extern void
metadata_chunk_array_clear(MetadataChunkArray * array);
extern void
metadata_chunk_array_append(MetadataChunkArray * array, MetadataChunk * chunk);
extern void
metadata_chunk_array_append_sorted(MetadataChunkArray * array,
metadata_chunk_array_append_sorted (MetadataChunkArray * array,
MetadataChunk * chunk);
extern void metadata_chunk_array_remove_zero_size (MetadataChunkArray * array);
extern void
metadata_chunk_array_remove_zero_size (MetadataChunkArray * array);
metadata_chunk_array_remove_by_index (MetadataChunkArray * array, guint32 i);
G_END_DECLS
#endif /* __METADATATYPES_H__ */

View file

@ -154,12 +154,14 @@ typedef struct _tag_SchemaMap
#define XMP_SCHEMA_NODE 0x80000000UL
/* *INDENT-OFF* */
static const SchemaTagMap schema_map_dublin_tags_map[] = {
{"description", GST_TAG_DESCRIPTION},
{"title", GST_TAG_TITLE},
{"rights", GST_TAG_COPYRIGHT},
{"description", GST_TAG_DESCRIPTION },
{"title", GST_TAG_TITLE },
{"rights", GST_TAG_COPYRIGHT },
{NULL, NULL}
};
/* *INDENT-ON* */
static const SchemaMap schema_map_dublin = {
"http://purl.org/dc/elements/1.1/",
@ -799,6 +801,8 @@ metadatamux_xmp_for_each_tag_in_list (const GstTagList * list,
for (i = 0; schemas_map[i]; i++) {
/* FIXME: should try to get all of values (index) for the tag */
const SchemaMap *smap = schemas_map[i];
const SchemaTagMap *stagmap =
metadatamux_xmp_get_tagsmap_from_gsttag (smap, tag);
@ -818,8 +822,24 @@ metadatamux_xmp_for_each_tag_in_list (const GstTagList * list,
}
if (value) {
uint32_t options = 0;
if (xmp_get_property_and_bits (xmp, smap->schema, stagmap->xmp_tag,
NULL, &options)) {
if (XMP_IS_PROP_SIMPLE (options)) {
xmp_set_property (xmp, smap->schema, stagmap->xmp_tag, value);
} else {
xmp_set_array_item (xmp, smap->schema, stagmap->xmp_tag, 1,
value, 0);
}
} else {
xmp_set_property (xmp, smap->schema, stagmap->xmp_tag, value);
}
g_free (value);
}
}