Commit c510ed2e authored by Nick Renieris's avatar Nick Renieris Committed by Paul B Mahol

lavc/tiff: Force DNG pixel data endianness on an edge case

This fixes "X7 RAW" and "X7 CinemaDNG" samples here:
- https://www.dji.com/gr/zenmuse-x7/info#downloadsSigned-off-by: 's avatarNick Renieris <velocityra@gmail.com>
parent 33b6752a
...@@ -1038,6 +1038,18 @@ static int init_image(TiffContext *s, ThreadFrame *frame) ...@@ -1038,6 +1038,18 @@ static int init_image(TiffContext *s, ThreadFrame *frame)
AV_RL32(s->pattern)); AV_RL32(s->pattern));
return AVERROR_PATCHWELCOME; return AVERROR_PATCHWELCOME;
} }
/* Force endianness as mentioned in 'DNG Specification: Chapter 3: BitsPerSample'
NOTE: The spec actually specifies big-endian, not sure why we need little-endian, but
such images don't work otherwise. Examples are images produced by Zenmuse X7. */
if ((s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG)
&& (s->bpp != 8 && s->bpp != 16 && s->bpp != 32)) {
switch (s->avctx->pix_fmt) {
case AV_PIX_FMT_BAYER_RGGB16BE: s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB16LE; break;
case AV_PIX_FMT_BAYER_BGGR16BE: s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR16LE; break;
case AV_PIX_FMT_BAYER_GBRG16BE: s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG16LE; break;
case AV_PIX_FMT_BAYER_GRBG16BE: s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG16LE; break;
}
}
break; break;
case 10161: case 10161:
switch (AV_RL32(s->pattern)) { switch (AV_RL32(s->pattern)) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment