Mercurial > libavcodec.hg
changeset 4066:a3f06c7a0bff libavcodec
16-bit grayscale support
author | kostya |
---|---|
date | Tue, 24 Oct 2006 04:57:43 +0000 |
parents | 93163e2a2398 |
children | 8ab58b7bc06b |
files | imgconvert.c utils.c |
diffstat | 2 files changed, 109 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/imgconvert.c Mon Oct 23 17:06:32 2006 +0000 +++ b/imgconvert.c Tue Oct 24 04:57:43 2006 +0000 @@ -193,6 +193,20 @@ }, /* gray / mono formats */ + [PIX_FMT_GRAY16BE] = { + .name = "gray16be", + .nb_channels = 1, + .color_type = FF_COLOR_GRAY, + .pixel_type = FF_PIXEL_PLANAR, + .depth = 16, + }, + [PIX_FMT_GRAY16LE] = { + .name = "gray16le", + .nb_channels = 1, + .color_type = FF_COLOR_GRAY, + .pixel_type = FF_PIXEL_PLANAR, + .depth = 16, + }, [PIX_FMT_GRAY8] = { .name = "gray", .nb_channels = 1, @@ -427,6 +441,8 @@ picture->data[2] = NULL; picture->linesize[0] = width * 4; return size * 4; + case PIX_FMT_GRAY16BE: + case PIX_FMT_GRAY16LE: case PIX_FMT_BGR555: case PIX_FMT_BGR565: case PIX_FMT_RGB555: @@ -1842,6 +1858,75 @@ gray_to_mono(dst, src, width, height, 0x00); } +static void gray_to_gray16(AVPicture *dst, const AVPicture *src, + int width, int height) +{ + int x, y, src_wrap, dst_wrap; + uint8_t *s, *d; + s = src->data[0]; + src_wrap = src->linesize[0] - width; + d = dst->data[0]; + dst_wrap = dst->linesize[0] - width * 2; + for(y=0; y<height; y++){ + for(x=0; x<width; x++){ + *d++ = *s; + *d++ = *s++; + } + s += src_wrap; + d += dst_wrap; + } +} + +static void gray16_to_gray(AVPicture *dst, const AVPicture *src, + int width, int height) +{ + int x, y, src_wrap, dst_wrap; + uint8_t *s, *d; + s = src->data[0]; + src_wrap = src->linesize[0] - width * 2; + d = dst->data[0]; + dst_wrap = dst->linesize[0] - width; + for(y=0; y<height; y++){ + for(x=0; x<width; x++){ + *d++ = *s; + s += 2; + } + s += src_wrap; + d += dst_wrap; + } +} + +static void gray16be_to_gray(AVPicture *dst, const AVPicture *src, + int width, int height) +{ + gray16_to_gray(dst, src, width, height); +} + +static void gray16le_to_gray(AVPicture *dst, const AVPicture *src, + int width, int height) +{ + gray16_to_gray(dst, src + 1, width, height); +} + +static void gray16_to_gray16(AVPicture *dst, const AVPicture *src, + int width, int height) +{ + int x, y, src_wrap, dst_wrap; + uint16_t *s, *d; + s = src->data[0]; + src_wrap = (src->linesize[0] - width * 2)/2; + d = dst->data[0]; + dst_wrap = (dst->linesize[0] - width * 2)/2; + for(y=0; y<height; y++){ + for(x=0; x<width; x++){ + *d++ = bswap_16(*s++); + } + s += src_wrap; + d += dst_wrap; + } +} + + typedef struct ConvertEntry { void (*convert)(AVPicture *dst, const AVPicture *src, int width, int height); @@ -2024,6 +2109,22 @@ .convert = rgb565_to_gray }, }, + [PIX_FMT_GRAY16BE] = { + [PIX_FMT_GRAY8] = { + .convert = gray16be_to_gray + }, + [PIX_FMT_GRAY16LE] = { + .convert = gray16_to_gray16 + }, + }, + [PIX_FMT_GRAY16LE] = { + [PIX_FMT_GRAY8] = { + .convert = gray16le_to_gray + }, + [PIX_FMT_GRAY16BE] = { + .convert = gray16_to_gray16 + }, + }, [PIX_FMT_GRAY8] = { [PIX_FMT_RGB555] = { .convert = gray_to_rgb555 @@ -2046,6 +2147,12 @@ [PIX_FMT_MONOBLACK] = { .convert = gray_to_monoblack }, + [PIX_FMT_GRAY16LE] = { + .convert = gray_to_gray16 + }, + [PIX_FMT_GRAY16BE] = { + .convert = gray_to_gray16 + }, }, [PIX_FMT_MONOWHITE] = { [PIX_FMT_GRAY8] = {