mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
parent
092cb17983
commit
de5e71fb1b
@ -310,6 +310,19 @@ static int deinvert_buffer(TiffContext *s, const uint8_t *src, int size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void unpack_gray(TiffContext *s, AVFrame *p,
|
||||
const uint8_t *src, int lnum, int width, int bpp)
|
||||
{
|
||||
GetBitContext gb;
|
||||
uint16_t *dst = (uint16_t *)(p->data[0] + lnum * p->linesize[0]);
|
||||
|
||||
init_get_bits8(&gb, src, width);
|
||||
|
||||
for (int i = 0; i < s->width; i++) {
|
||||
dst[i] = get_bits(&gb, bpp);
|
||||
}
|
||||
}
|
||||
|
||||
static void unpack_yuv(TiffContext *s, AVFrame *p,
|
||||
const uint8_t *src, int lnum)
|
||||
{
|
||||
@ -540,6 +553,15 @@ static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int strid
|
||||
if (s->is_bayer) {
|
||||
width = (s->bpp * s->width + 7) >> 3;
|
||||
}
|
||||
if (p->format == AV_PIX_FMT_GRAY12) {
|
||||
av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, width);
|
||||
if (s->yuv_line == NULL) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
dst = s->yuv_line;
|
||||
stride = 0;
|
||||
}
|
||||
|
||||
if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
|
||||
#if CONFIG_ZLIB
|
||||
@ -587,6 +609,8 @@ static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int strid
|
||||
if (is_yuv) {
|
||||
unpack_yuv(s, p, dst, strip_start + line);
|
||||
line += s->subsampling[1] - 1;
|
||||
} else if (p->format == AV_PIX_FMT_GRAY12) {
|
||||
unpack_gray(s, p, dst, strip_start + line, width, s->bpp);
|
||||
}
|
||||
dst += stride;
|
||||
}
|
||||
@ -670,6 +694,8 @@ static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int strid
|
||||
if (is_yuv) {
|
||||
unpack_yuv(s, p, dst, strip_start + line);
|
||||
line += s->subsampling[1] - 1;
|
||||
} else if (p->format == AV_PIX_FMT_GRAY12) {
|
||||
unpack_gray(s, p, dst, strip_start + line, width, s->bpp);
|
||||
}
|
||||
dst += stride;
|
||||
}
|
||||
@ -705,6 +731,9 @@ static int init_image(TiffContext *s, ThreadFrame *frame)
|
||||
case 81:
|
||||
s->avctx->pix_fmt = s->palette_is_set ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8;
|
||||
break;
|
||||
case 121:
|
||||
s->avctx->pix_fmt = AV_PIX_FMT_GRAY12;
|
||||
break;
|
||||
case 10081:
|
||||
switch (AV_RL32(s->pattern)) {
|
||||
case 0x02010100:
|
||||
|
Loading…
Reference in New Issue
Block a user