mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-15 02:58:01 +00:00
pngdec: expose gAMA and cHRM chunks as side/meta data
Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
This commit is contained in:
parent
723b6baaf8
commit
0a771e6b32
@ -25,6 +25,7 @@
|
|||||||
#include "libavutil/bprint.h"
|
#include "libavutil/bprint.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/stereo3d.h"
|
#include "libavutil/stereo3d.h"
|
||||||
|
#include "libavutil/mastering_display_metadata.h"
|
||||||
|
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "bytestream.h"
|
#include "bytestream.h"
|
||||||
@ -1167,7 +1168,7 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
|
|||||||
AVDictionary **metadatap = NULL;
|
AVDictionary **metadatap = NULL;
|
||||||
uint32_t tag, length;
|
uint32_t tag, length;
|
||||||
int decode_next_dat = 0;
|
int decode_next_dat = 0;
|
||||||
int ret;
|
int i, ret;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
length = bytestream2_get_bytes_left(&s->gb);
|
length = bytestream2_get_bytes_left(&s->gb);
|
||||||
@ -1289,6 +1290,42 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
|
|||||||
goto fail;
|
goto fail;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MKTAG('c', 'H', 'R', 'M'): {
|
||||||
|
AVMasteringDisplayMetadata *mdm = av_mastering_display_metadata_create_side_data(p);
|
||||||
|
if (!mdm) {
|
||||||
|
ret = AVERROR(ENOMEM);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
mdm->white_point[0] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
|
||||||
|
mdm->white_point[1] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
|
||||||
|
|
||||||
|
/* RGB Primaries */
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
mdm->display_primaries[i][0] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
|
||||||
|
mdm->display_primaries[i][1] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
|
||||||
|
}
|
||||||
|
|
||||||
|
mdm->has_primaries = 1;
|
||||||
|
bytestream2_skip(&s->gb, 4); /* crc */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MKTAG('g', 'A', 'M', 'A'): {
|
||||||
|
AVBPrint bp;
|
||||||
|
char *gamma_str;
|
||||||
|
int num = bytestream2_get_be32(&s->gb);
|
||||||
|
|
||||||
|
av_bprint_init(&bp, 0, -1);
|
||||||
|
av_bprintf(&bp, "%i/%i", num, 100000);
|
||||||
|
av_bprint_finalize(&bp, &gamma_str);
|
||||||
|
if (!gamma_str)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
av_dict_set(&p->metadata, "gamma", gamma_str, AV_DICT_DONT_STRDUP_VAL);
|
||||||
|
|
||||||
|
bytestream2_skip(&s->gb, 4); /* crc */
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MKTAG('I', 'E', 'N', 'D'):
|
case MKTAG('I', 'E', 'N', 'D'):
|
||||||
if (!(s->pic_state & PNG_ALLIMAGE))
|
if (!(s->pic_state & PNG_ALLIMAGE))
|
||||||
av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");
|
av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user