summaryrefslogtreecommitdiff
path: root/libavcodec/dpx.c
diff options
context:
space:
mode:
authorHarry Mallon <harry.mallon@codex.online>2020-12-07 10:32:12 +0000
committerPaul B Mahol <onemda@gmail.com>2020-12-17 13:02:49 +0100
commit8232e01e41488bc3f4504b3de241106a4cca7cb7 (patch)
tree128f68bef18559865bd290590b155d0fbc442ea1 /libavcodec/dpx.c
parenta041c0a0315f0941ddc2b3258c74edf40f86c8f5 (diff)
avcodec/dpx: Report color_range from DPX header
Signed-off-by: Harry Mallon <harry.mallon@codex.online>
Diffstat (limited to 'libavcodec/dpx.c')
-rw-r--r--libavcodec/dpx.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index 51428459ef..577171258a 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -132,7 +132,7 @@ static int decode_frame(AVCodecContext *avctx,
unsigned int offset;
int magic_num, endian;
- int x, y, stride, i, ret;
+ int x, y, stride, i, j, ret;
int w, h, bits_per_color, descriptor, elements, packing;
int encoding, need_align = 0;
@@ -268,6 +268,29 @@ static int decode_frame(AVCodecContext *avctx,
}
}
+ /* color range from television header */
+ if (offset >= 1964 + 4) {
+ buf = avpkt->data + 1952;
+ i = read32(&buf, endian);
+
+ buf = avpkt->data + 1964;
+ j = read32(&buf, endian);
+
+ if (i != 0xFFFFFFFF && j != 0xFFFFFFFF) {
+ float minCV, maxCV;
+ minCV = av_int2float(i);
+ maxCV = av_int2float(j);
+ if (bits_per_color >= 1 &&
+ minCV == 0.0f && maxCV == ((1<<bits_per_color) - 1)) {
+ avctx->color_range = AVCOL_RANGE_JPEG;
+ } else if (bits_per_color >= 8 &&
+ minCV == (1 <<(bits_per_color - 4)) &&
+ maxCV == (235<<(bits_per_color - 8))) {
+ avctx->color_range = AVCOL_RANGE_MPEG;
+ }
+ }
+ }
+
switch (descriptor) {
case 6: // Y
elements = 1;