[FFmpeg-devel] [PATCH 3/3] avcodec/webp: add support for ICCP chunks
Rostislav Pehlivanov
atomnuker at gmail.com
Wed Jul 26 09:18:35 EEST 2017
On 26 July 2017 at 05:31, James Almer <jamrial at gmail.com> wrote:
> Export the raw data as ICC Profile frame side data.
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> libavcodec/webp.c | 26 ++++++++++++++++++++++++--
> 1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/webp.c b/libavcodec/webp.c
> index a0d4d1812d..efa864a6f1 100644
> --- a/libavcodec/webp.c
> +++ b/libavcodec/webp.c
> @@ -33,10 +33,10 @@
> *
> * @author James Almer <jamrial at 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', ' '):
> --
> 2.13.3
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
Can't find anything that could go wrong here and the specs don't mention
anything special, so LGTM.
More information about the ffmpeg-devel
mailing list