[FFmpeg-devel] [PATCH v12 03/14] lavc/tiff: Convert DNGs to sRGB color space

Paul B Mahol onemda at gmail.com
Sat Aug 10 16:06:05 EEST 2019


On Sat, Aug 10, 2019 at 2:42 PM Michael Niedermayer <michael at niedermayer.cc>
wrote:

> On Fri, Aug 09, 2019 at 07:29:48PM +0300, Nick Renieris wrote:
> > From: Nick Renieris <velocityra at gmail.com>
> >
> > Signed-off-by: Nick Renieris <velocityra at gmail.com>
> > ---
> >  libavcodec/tiff.c | 34 +++++++++++++++++++++++-----------
> >  1 file changed, 23 insertions(+), 11 deletions(-)
> >
> > diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
> > index d5673abb19..a118c37c41 100644
> > --- a/libavcodec/tiff.c
> > +++ b/libavcodec/tiff.c
> > @@ -731,14 +731,23 @@ 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.0031308)
> > +        return value * 12.92;
> > +    else
> > +        return pow(value * 1.055, 1.0 / 2.4) - 0.055;
> > +}
> > +
> >  /**
> > - * Map stored raw sensor values into linear reference values.
> > - * See: DNG Specification - Chapter 5
> > + * 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_raw_to_linear16(uint16_t value,
> > -                                                    const uint16_t *lut,
> > -                                                    uint16_t
> black_level,
> > -                                                    float scale_factor)
> {
> > +static uint16_t av_always_inline dng_process_color16(uint16_t value,
> > +                                                     const uint16_t
> *lut,
> > +                                                     uint16_t
> black_level,
> > +                                                     float
> scale_factor) {
> > +    float value_norm;
> > +
> >      // Lookup table lookup
> >      if (lut)
> >          value = lut[value];
> > @@ -747,16 +756,19 @@ static uint16_t av_always_inline
> dng_raw_to_linear16(uint16_t value,
> >      value = av_clip_uint16_c((unsigned)value - black_level);
> >
> >      // Color scaling
> > -    value = av_clip_uint16_c((unsigned)(((float)value * scale_factor) *
> 0xFFFF));
> > +    value_norm = (float)value * scale_factor;
> > +
> > +    // Color space conversion (sRGB)
> > +    value = av_clip_uint16_c((uint16_t)(linear_to_srgb(value_norm) *
> 0xFFFF));
> >
> >      return value;
> >  }
>
> Why do you put all this color space convertion code into the decoders ?
>
>
It is part of DNG specification. Do you want to not follow DNG
specification?



> Colorspace and pixel format convertion is generally done outside decoders.
>
> Thanks
>
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> What does censorship reveal? It reveals fear. -- Julian Assange
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list