summaryrefslogtreecommitdiff
path: root/libavcodec/tiff.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2019-08-31 20:57:29 +0200
committerPaul B Mahol <onemda@gmail.com>2019-09-02 09:26:53 +0200
commitd7529b03bac49370aa4369b39a0dbf16724334d2 (patch)
tree19844626612e26302487361b226689e4ef2e3983 /libavcodec/tiff.c
parent63689b16ad723a23d59af81ee6167931600b1ef4 (diff)
avcodec/tiff: set color_trc, remove sRGB conversion
Diffstat (limited to 'libavcodec/tiff.c')
-rw-r--r--libavcodec/tiff.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index e88cbb6976..61ba99a192 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -773,16 +773,8 @@ static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int strid
return 0;
}
-static float av_always_inline linear_to_srgb(float value) {
- if (value <= 0.0031308f)
- return value * 12.92f;
- else
- return powf(value * 1.055f, 1.0f / 2.4f) - 0.055f;
-}
-
/**
* Map stored raw sensor values into linear reference values (see: DNG Specification - Chapter 5)
- * Then convert to sRGB color space.
*/
static uint16_t av_always_inline dng_process_color16(uint16_t value,
const uint16_t *lut,
@@ -800,8 +792,7 @@ static uint16_t av_always_inline dng_process_color16(uint16_t value,
// Color scaling
value_norm = (float)value * scale_factor;
- // Color space conversion (sRGB)
- value = av_clip_uint16_c((uint16_t)(linear_to_srgb(value_norm) * 0xFFFF));
+ value = av_clip_uint16_c(value_norm * 65535);
return value;
}
@@ -1920,6 +1911,13 @@ again:
}
}
+ if (s->photometric == TIFF_PHOTOMETRIC_LINEAR_RAW ||
+ s->photometric == TIFF_PHOTOMETRIC_CFA) {
+ p->color_trc = AVCOL_TRC_LINEAR;
+ } else if (s->photometric == TIFF_PHOTOMETRIC_BLACK_IS_ZERO) {
+ p->color_trc = AVCOL_TRC_GAMMA22;
+ }
+
/* Handle DNG images with JPEG-compressed tiles */
if (is_dng && s->is_tiled) {