- switch (AV_RL32(s->pattern)) {
- case 0x02010100:
- s->avctx->pix_fmt = s->le ? AV_PIX_FMT_BAYER_RGGB16LE : AV_PIX_FMT_BAYER_RGGB16BE;
- break;
- case 0x00010102:
- s->avctx->pix_fmt = s->le ? AV_PIX_FMT_BAYER_BGGR16LE : AV_PIX_FMT_BAYER_BGGR16BE;
- break;
- case 0x01000201:
- s->avctx->pix_fmt = s->le ? AV_PIX_FMT_BAYER_GBRG16LE : AV_PIX_FMT_BAYER_GBRG16BE;
- break;
- case 0x01020001:
- s->avctx->pix_fmt = s->le ? AV_PIX_FMT_BAYER_GRBG16LE : AV_PIX_FMT_BAYER_GRBG16BE;
- break;
- default:
- av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n",
- AV_RL32(s->pattern));
- 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;