mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-13 14:34:33 +02:00
Chunk fourCCs for XMP/EXIF
Use separate fourCCs "XMP " and "EXIF" instead of a common "META" Also, some refactorization in webpmux.c Change-Id: Iad3337e5c1b81e785c60670ce28b1f536dd7ee31
This commit is contained in:
@ -514,8 +514,12 @@ static ParseStatus ParseVP8X(WebPDemuxer* const dmux) {
|
||||
store_chunk = !!(dmux->feature_flags_ & ICCP_FLAG);
|
||||
goto Skip;
|
||||
}
|
||||
case MKFOURCC('M', 'E', 'T', 'A'): {
|
||||
store_chunk = !!(dmux->feature_flags_ & META_FLAG);
|
||||
case MKFOURCC('X', 'M', 'P', ' '): {
|
||||
store_chunk = !!(dmux->feature_flags_ & XMP_FLAG);
|
||||
goto Skip;
|
||||
}
|
||||
case MKFOURCC('E', 'X', 'I', 'F'): {
|
||||
store_chunk = !!(dmux->feature_flags_ & EXIF_FLAG);
|
||||
goto Skip;
|
||||
}
|
||||
Skip:
|
||||
|
@ -48,7 +48,8 @@ static void MuxRelease(WebPMux* const mux) {
|
||||
DeleteAllChunks(&mux->vp8x_);
|
||||
DeleteAllChunks(&mux->iccp_);
|
||||
DeleteAllChunks(&mux->loop_);
|
||||
DeleteAllChunks(&mux->meta_);
|
||||
DeleteAllChunks(&mux->exif_);
|
||||
DeleteAllChunks(&mux->xmp_);
|
||||
DeleteAllChunks(&mux->unknown_);
|
||||
}
|
||||
|
||||
@ -82,7 +83,8 @@ static WebPMuxError MuxSet(WebPMux* const mux, CHUNK_INDEX idx, uint32_t nth,
|
||||
SWITCH_ID_LIST(IDX_VP8X, &mux->vp8x_);
|
||||
SWITCH_ID_LIST(IDX_ICCP, &mux->iccp_);
|
||||
SWITCH_ID_LIST(IDX_LOOP, &mux->loop_);
|
||||
SWITCH_ID_LIST(IDX_META, &mux->meta_);
|
||||
SWITCH_ID_LIST(IDX_EXIF, &mux->exif_);
|
||||
SWITCH_ID_LIST(IDX_XMP, &mux->xmp_);
|
||||
if (idx == IDX_UNKNOWN && data->size > TAG_SIZE) {
|
||||
// For raw-data unknown chunk, the first four bytes should be the tag to be
|
||||
// used for the chunk.
|
||||
@ -529,11 +531,12 @@ static WebPMuxError CreateVP8XChunk(WebPMux* const mux) {
|
||||
if (mux->iccp_ != NULL && mux->iccp_->data_.bytes != NULL) {
|
||||
flags |= ICCP_FLAG;
|
||||
}
|
||||
|
||||
if (mux->meta_ != NULL && mux->meta_->data_.bytes != NULL) {
|
||||
flags |= META_FLAG;
|
||||
if (mux->exif_ != NULL && mux->exif_->data_.bytes != NULL) {
|
||||
flags |= EXIF_FLAG;
|
||||
}
|
||||
if (mux->xmp_ != NULL && mux->xmp_->data_.bytes != NULL) {
|
||||
flags |= XMP_FLAG;
|
||||
}
|
||||
|
||||
if (images->header_ != NULL) {
|
||||
if (images->header_->tag_ == kChunks[IDX_FRGM].tag) {
|
||||
// This is a tiled image.
|
||||
@ -543,7 +546,6 @@ static WebPMuxError CreateVP8XChunk(WebPMux* const mux) {
|
||||
flags |= ANIMATION_FLAG;
|
||||
}
|
||||
}
|
||||
|
||||
if (MuxImageCount(images, WEBP_CHUNK_ALPHA) > 0) {
|
||||
flags |= ALPHA_FLAG; // Some images have an alpha channel.
|
||||
}
|
||||
@ -610,8 +612,8 @@ WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data) {
|
||||
// Allocate data.
|
||||
size = ChunksListDiskSize(mux->vp8x_) + ChunksListDiskSize(mux->iccp_)
|
||||
+ ChunksListDiskSize(mux->loop_) + MuxImageListDiskSize(mux->images_)
|
||||
+ ChunksListDiskSize(mux->meta_) + ChunksListDiskSize(mux->unknown_)
|
||||
+ RIFF_HEADER_SIZE;
|
||||
+ ChunksListDiskSize(mux->exif_) + ChunksListDiskSize(mux->xmp_)
|
||||
+ ChunksListDiskSize(mux->unknown_) + RIFF_HEADER_SIZE;
|
||||
|
||||
data = (uint8_t*)malloc(size);
|
||||
if (data == NULL) return WEBP_MUX_MEMORY_ERROR;
|
||||
@ -622,7 +624,8 @@ WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data) {
|
||||
dst = ChunkListEmit(mux->iccp_, dst);
|
||||
dst = ChunkListEmit(mux->loop_, dst);
|
||||
dst = MuxImageListEmit(mux->images_, dst);
|
||||
dst = ChunkListEmit(mux->meta_, dst);
|
||||
dst = ChunkListEmit(mux->exif_, dst);
|
||||
dst = ChunkListEmit(mux->xmp_, dst);
|
||||
dst = ChunkListEmit(mux->unknown_, dst);
|
||||
assert(dst == data + size);
|
||||
|
||||
|
@ -51,7 +51,8 @@ struct WebPMuxImage {
|
||||
struct WebPMux {
|
||||
WebPMuxImage* images_;
|
||||
WebPChunk* iccp_;
|
||||
WebPChunk* meta_;
|
||||
WebPChunk* exif_;
|
||||
WebPChunk* xmp_;
|
||||
WebPChunk* loop_;
|
||||
WebPChunk* vp8x_;
|
||||
|
||||
@ -71,7 +72,8 @@ typedef enum {
|
||||
IDX_ALPHA,
|
||||
IDX_VP8,
|
||||
IDX_VP8L,
|
||||
IDX_META,
|
||||
IDX_EXIF,
|
||||
IDX_XMP,
|
||||
IDX_UNKNOWN,
|
||||
|
||||
IDX_NIL,
|
||||
|
@ -28,7 +28,8 @@ const ChunkInfo kChunks[] = {
|
||||
{ MKFOURCC('A', 'L', 'P', 'H'), WEBP_CHUNK_ALPHA, UNDEFINED_CHUNK_SIZE },
|
||||
{ MKFOURCC('V', 'P', '8', ' '), WEBP_CHUNK_IMAGE, UNDEFINED_CHUNK_SIZE },
|
||||
{ MKFOURCC('V', 'P', '8', 'L'), WEBP_CHUNK_IMAGE, UNDEFINED_CHUNK_SIZE },
|
||||
{ MKFOURCC('M', 'E', 'T', 'A'), WEBP_CHUNK_META, UNDEFINED_CHUNK_SIZE },
|
||||
{ MKFOURCC('E', 'X', 'I', 'F'), WEBP_CHUNK_EXIF, UNDEFINED_CHUNK_SIZE },
|
||||
{ MKFOURCC('X', 'M', 'P', ' '), WEBP_CHUNK_XMP, UNDEFINED_CHUNK_SIZE },
|
||||
{ MKFOURCC('U', 'N', 'K', 'N'), WEBP_CHUNK_UNKNOWN, UNDEFINED_CHUNK_SIZE },
|
||||
|
||||
{ NIL_TAG, WEBP_CHUNK_NIL, UNDEFINED_CHUNK_SIZE }
|
||||
@ -446,7 +447,8 @@ WebPChunk** MuxGetChunkListFromId(const WebPMux* mux, WebPChunkId id) {
|
||||
case WEBP_CHUNK_VP8X: return (WebPChunk**)&mux->vp8x_;
|
||||
case WEBP_CHUNK_ICCP: return (WebPChunk**)&mux->iccp_;
|
||||
case WEBP_CHUNK_LOOP: return (WebPChunk**)&mux->loop_;
|
||||
case WEBP_CHUNK_META: return (WebPChunk**)&mux->meta_;
|
||||
case WEBP_CHUNK_EXIF: return (WebPChunk**)&mux->exif_;
|
||||
case WEBP_CHUNK_XMP: return (WebPChunk**)&mux->xmp_;
|
||||
case WEBP_CHUNK_UNKNOWN: return (WebPChunk**)&mux->unknown_;
|
||||
default: return NULL;
|
||||
}
|
||||
@ -495,7 +497,8 @@ static WebPMuxError ValidateChunk(const WebPMux* const mux, CHUNK_INDEX idx,
|
||||
|
||||
WebPMuxError MuxValidate(const WebPMux* const mux) {
|
||||
int num_iccp;
|
||||
int num_meta;
|
||||
int num_exif;
|
||||
int num_xmp;
|
||||
int num_loop_chunks;
|
||||
int num_frames;
|
||||
int num_tiles;
|
||||
@ -518,8 +521,12 @@ WebPMuxError MuxValidate(const WebPMux* const mux) {
|
||||
err = ValidateChunk(mux, IDX_ICCP, ICCP_FLAG, flags, 1, &num_iccp);
|
||||
if (err != WEBP_MUX_OK) return err;
|
||||
|
||||
// At most one EXIF metadata.
|
||||
err = ValidateChunk(mux, IDX_EXIF, EXIF_FLAG, flags, 1, &num_exif);
|
||||
if (err != WEBP_MUX_OK) return err;
|
||||
|
||||
// At most one XMP metadata.
|
||||
err = ValidateChunk(mux, IDX_META, META_FLAG, flags, 1, &num_meta);
|
||||
err = ValidateChunk(mux, IDX_XMP, XMP_FLAG, flags, 1, &num_xmp);
|
||||
if (err != WEBP_MUX_OK) return err;
|
||||
|
||||
// Animation: ANIMATION_FLAG, loop chunk and frame chunk(s) are consistent.
|
||||
|
@ -42,7 +42,8 @@ static WebPMuxError MuxGet(const WebPMux* const mux, CHUNK_INDEX idx,
|
||||
SWITCH_ID_LIST(IDX_VP8X, mux->vp8x_);
|
||||
SWITCH_ID_LIST(IDX_ICCP, mux->iccp_);
|
||||
SWITCH_ID_LIST(IDX_LOOP, mux->loop_);
|
||||
SWITCH_ID_LIST(IDX_META, mux->meta_);
|
||||
SWITCH_ID_LIST(IDX_EXIF, mux->exif_);
|
||||
SWITCH_ID_LIST(IDX_XMP, mux->xmp_);
|
||||
SWITCH_ID_LIST(IDX_UNKNOWN, mux->unknown_);
|
||||
return WEBP_MUX_NOT_FOUND;
|
||||
}
|
||||
|
Reference in New Issue
Block a user