mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-17 20:17:55 +02:00
avcodec/webp: add support for ICCP chunks
Export the raw data as ICC Profile frame side data. Reviwed-by: Rostislav Pehlivanov <atomnuker@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
5e4e9afaa1
commit
c220fe008c
@ -33,10 +33,10 @@
|
||||
*
|
||||
* @author James Almer <jamrial@gmail.com>
|
||||
* Exif metadata
|
||||
* ICC profile
|
||||
*
|
||||
* Unimplemented:
|
||||
* - Animation
|
||||
* - ICC profile
|
||||
* - XMP metadata
|
||||
*/
|
||||
|
||||
@ -197,6 +197,7 @@ typedef struct WebPContext {
|
||||
uint8_t *alpha_data; /* alpha chunk data */
|
||||
int alpha_data_size; /* alpha chunk data size */
|
||||
int has_exif; /* set after an EXIF chunk has been processed */
|
||||
int has_iccp; /* set after an ICCP chunk has been processed */
|
||||
int width; /* image width */
|
||||
int height; /* image height */
|
||||
int lossless; /* indicates lossless or lossy */
|
||||
@ -1381,6 +1382,7 @@ static int webp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
*got_frame = 0;
|
||||
s->has_alpha = 0;
|
||||
s->has_exif = 0;
|
||||
s->has_iccp = 0;
|
||||
bytestream2_init(&gb, avpkt->data, avpkt->size);
|
||||
|
||||
if (bytestream2_get_bytes_left(&gb) < 12)
|
||||
@ -1514,7 +1516,27 @@ exif_end:
|
||||
bytestream2_skip(&gb, chunk_size);
|
||||
break;
|
||||
}
|
||||
case MKTAG('I', 'C', 'C', 'P'):
|
||||
case MKTAG('I', 'C', 'C', 'P'): {
|
||||
AVFrameSideData *sd;
|
||||
|
||||
if (s->has_iccp) {
|
||||
av_log(avctx, AV_LOG_VERBOSE, "Ignoring extra ICCP chunk\n");
|
||||
bytestream2_skip(&gb, chunk_size);
|
||||
break;
|
||||
}
|
||||
if (!(vp8x_flags & VP8X_FLAG_ICC))
|
||||
av_log(avctx, AV_LOG_WARNING,
|
||||
"ICCP chunk present, but ICC Profile bit not set in the "
|
||||
"VP8X header\n");
|
||||
|
||||
s->has_iccp = 1;
|
||||
sd = av_frame_new_side_data(p, AV_FRAME_DATA_ICC_PROFILE, chunk_size);
|
||||
if (!sd)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
bytestream2_get_buffer(&gb, sd->data, chunk_size);
|
||||
break;
|
||||
}
|
||||
case MKTAG('A', 'N', 'I', 'M'):
|
||||
case MKTAG('A', 'N', 'M', 'F'):
|
||||
case MKTAG('X', 'M', 'P', ' '):
|
||||
|
Loading…
x
Reference in New Issue
Block a user