📄 imgconvert.c
字号:
// .convert = bgr24_to_rgb24
// },
// [PIX_FMT_YUV420P] = {
// .convert = bgr24_to_yuv420p
// },
// [PIX_FMT_GRAY8] = {
// .convert = bgr24_to_gray
// },
// },
// [PIX_FMT_RGB555] = {
// [PIX_FMT_RGB24] = {
// .convert = rgb555_to_rgb24
// },
// [PIX_FMT_RGB32] = {
// .convert = rgb555_to_rgb32
// },
// [PIX_FMT_YUV420P] = {
// .convert = rgb555_to_yuv420p
// },
// [PIX_FMT_GRAY8] = {
// .convert = rgb555_to_gray
// },
// },
// [PIX_FMT_RGB565] = {
// [PIX_FMT_RGB32] = {
// .convert = rgb565_to_rgb32
// },
// [PIX_FMT_RGB24] = {
// .convert = rgb565_to_rgb24
// },
// [PIX_FMT_YUV420P] = {
// .convert = rgb565_to_yuv420p
// },
// [PIX_FMT_GRAY8] = {
// .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
// },
// [PIX_FMT_RGB565] = {
// .convert = gray_to_rgb565
// },
// [PIX_FMT_RGB24] = {
// .convert = gray_to_rgb24
// },
// [PIX_FMT_BGR24] = {
// .convert = gray_to_bgr24
// },
// [PIX_FMT_RGB32] = {
// .convert = gray_to_rgb32
// },
// [PIX_FMT_MONOWHITE] = {
// .convert = gray_to_monowhite
// },
// [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] = {
// .convert = monowhite_to_gray
// },
// },
// [PIX_FMT_MONOBLACK] = {
// [PIX_FMT_GRAY8] = {
// .convert = monoblack_to_gray
// },
// },
// [PIX_FMT_PAL8] = {
// [PIX_FMT_RGB555] = {
// .convert = pal8_to_rgb555
// },
// [PIX_FMT_RGB565] = {
// .convert = pal8_to_rgb565
// },
// [PIX_FMT_BGR24] = {
// .convert = pal8_to_bgr24
// },
// [PIX_FMT_RGB24] = {
// .convert = pal8_to_rgb24
// },
// [PIX_FMT_RGB32] = {
// .convert = pal8_to_rgb32
// },
// },
// [PIX_FMT_UYYVYY411] = {
// [PIX_FMT_YUV411P] = {
// .convert = uyyvyy411_to_yuv411p,
// },
// },
//
//};
int avpicture_alloc(AVPicture *picture,
int pix_fmt, int width, int height)
{
int size;
void *ptr;
size = avpicture_get_size(pix_fmt, width, height);
if(size<0)
goto fail;
ptr = av_malloc(size);
if (!ptr)
goto fail;
avpicture_fill(picture, ptr, pix_fmt, width, height);
return 0;
fail:
memset(picture, 0, sizeof(AVPicture));
return -1;
}
void avpicture_free(AVPicture *picture)
{
av_free(picture->data[0]);
}
/* return true if yuv planar */
static int is_yuv_planar(const PixFmtInfo *ps)
{
return (ps->color_type == FF_COLOR_YUV ||
ps->color_type == FF_COLOR_YUV_JPEG) &&
ps->pixel_type == FF_PIXEL_PLANAR;
}
int av_picture_crop(AVPicture *dst, const AVPicture *src,
int pix_fmt, int top_band, int left_band)
{
int y_shift;
int x_shift;
if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB || !is_yuv_planar(&pix_fmt_info[pix_fmt]))
return -1;
y_shift = pix_fmt_info[pix_fmt].y_chroma_shift;
x_shift = pix_fmt_info[pix_fmt].x_chroma_shift;
dst->data[0] = src->data[0] + (top_band * src->linesize[0]) + left_band;
dst->data[1] = src->data[1] + ((top_band >> y_shift) * src->linesize[1]) + (left_band >> x_shift);
dst->data[2] = src->data[2] + ((top_band >> y_shift) * src->linesize[2]) + (left_band >> x_shift);
dst->linesize[0] = src->linesize[0];
dst->linesize[1] = src->linesize[1];
dst->linesize[2] = src->linesize[2];
return 0;
}
int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
int pix_fmt, int padtop, int padbottom, int padleft, int padright,
int *color)
{
uint8_t *optr;
int y_shift;
int x_shift;
int yheight;
int i, y;
if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB ||
!is_yuv_planar(&pix_fmt_info[pix_fmt])) return -1;
for (i = 0; i < 3; i++) {
x_shift = i ? pix_fmt_info[pix_fmt].x_chroma_shift : 0;
y_shift = i ? pix_fmt_info[pix_fmt].y_chroma_shift : 0;
if (padtop || padleft) {
memset(dst->data[i], color[i],
dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));
}
if (padleft || padright) {
optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
(dst->linesize[i] - (padright >> x_shift));
yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
for (y = 0; y < yheight; y++) {
memset(optr, color[i], (padleft + padright) >> x_shift);
optr += dst->linesize[i];
}
}
if (src) { /* first line */
uint8_t *iptr = src->data[i];
optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
(padleft >> x_shift);
memcpy(optr, iptr, (width - padleft - padright) >> x_shift);
iptr += src->linesize[i];
optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
(dst->linesize[i] - (padright >> x_shift));
yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
for (y = 0; y < yheight; y++) {
memset(optr, color[i], (padleft + padright) >> x_shift);
memcpy(optr + ((padleft + padright) >> x_shift), iptr,
(width - padleft - padright) >> x_shift);
iptr += src->linesize[i];
optr += dst->linesize[i];
}
}
if (padbottom || padright) {
optr = dst->data[i] + dst->linesize[i] *
((height - padbottom) >> y_shift) - (padright >> x_shift);
memset(optr, color[i],dst->linesize[i] *
(padbottom >> y_shift) + (padright >> x_shift));
}
}
return 0;
}
#if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
void img_copy(AVPicture *dst, const AVPicture *src,
int pix_fmt, int width, int height)
{
av_picture_copy(dst, src, pix_fmt, width, height);
}
int img_crop(AVPicture *dst, const AVPicture *src,
int pix_fmt, int top_band, int left_band)
{
return av_picture_crop(dst, src, pix_fmt, top_band, left_band);
}
int img_pad(AVPicture *dst, const AVPicture *src, int height, int width,
int pix_fmt, int padtop, int padbottom, int padleft, int padright,
int *color)
{
return av_picture_pad(dst, src, height, width, pix_fmt, padtop, padbottom, padleft, padright, color);
}
#endif
#ifndef CONFIG_SWSCALE
static uint8_t y_ccir_to_jpeg[256];
static uint8_t y_jpeg_to_ccir[256];
static uint8_t c_ccir_to_jpeg[256];
static uint8_t c_jpeg_to_ccir[256];
/* init various conversion tables */
static void img_convert_init(void)
{
int i;
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
for(i = 0;i < 256; i++) {
y_ccir_to_jpeg[i] = Y_CCIR_TO_JPEG(i);
y_jpeg_to_ccir[i] = Y_JPEG_TO_CCIR(i);
c_ccir_to_jpeg[i] = C_CCIR_TO_JPEG(i);
c_jpeg_to_ccir[i] = C_JPEG_TO_CCIR(i);
}
}
/* apply to each pixel the given table */
static void img_apply_table(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height, const uint8_t *table1)
{
int n;
const uint8_t *s;
uint8_t *d;
const uint8_t *table;
table = table1;
for(;height > 0; height--) {
s = src;
d = dst;
n = width;
while (n >= 4) {
d[0] = table[s[0]];
d[1] = table[s[1]];
d[2] = table[s[2]];
d[3] = table[s[3]];
d += 4;
s += 4;
n -= 4;
}
while (n > 0) {
d[0] = table[s[0]];
d++;
s++;
n--;
}
dst += dst_wrap;
src += src_wrap;
}
}
/* XXX: use generic filter ? */
/* XXX: in most cases, the sampling position is incorrect */
/* 4x1 -> 1x1 */
static void shrink41(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height)
{
int w;
const uint8_t *s;
uint8_t *d;
for(;height > 0; height--) {
s = src;
d = dst;
for(w = width;w > 0; w--) {
d[0] = (s[0] + s[1] + s[2] + s[3] + 2) >> 2;
s += 4;
d++;
}
src += src_wrap;
dst += dst_wrap;
}
}
/* 2x1 -> 1x1 */
static void shrink21(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height)
{
int w;
const uint8_t *s;
uint8_t *d;
for(;height > 0; height--) {
s = src;
d = dst;
for(w = width;w > 0; w--) {
d[0] = (s[0] + s[1]) >> 1;
s += 2;
d++;
}
src += src_wrap;
dst += dst_wrap;
}
}
/* 1x2 -> 1x1 */
static void shrink12(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height)
{
int w;
uint8_t *d;
const uint8_t *s1, *s2;
for(;height > 0; height--) {
s1 = src;
s2 = s1 + src_wrap;
d = dst;
for(w = width;w >= 4; w-=4) {
d[0] = (s1[0] + s2[0]) >> 1;
d[1] = (s1[1] + s2[1]) >> 1;
d[2] = (s1[2] + s2[2]) >> 1;
d[3] = (s1[3] + s2[3]) >> 1;
s1 += 4;
s2 += 4;
d += 4;
}
for(;w > 0; w--) {
d[0] = (s1[0] + s2[0]) >> 1;
s1++;
s2++;
d++;
}
src += 2 * src_wrap;
dst += dst_wrap;
}
}
static void grow21_line(uint8_t *dst, const uint8_t *src,
int width)
{
int w;
const uint8_t *s1;
uint8_t *d;
s1 = src;
d = dst;
for(w = width;w >= 4; w-=4) {
d[1] = d[0] = s1[0];
d[3] = d[2] = s1[1];
s1 += 2;
d += 4;
}
for(;w >= 2; w -= 2) {
d[1] = d[0] = s1[0];
s1 ++;
d += 2;
}
/* only needed if width is not a multiple of two */
/* XXX: veryfy that */
if (w) {
d[0] = s1[0];
}
}
static void grow41_line(uint8_t *dst, const uint8_t *src,
int width)
{
int w, v;
const uint8_t *s1;
uint8_t *d;
s1 = src;
d = dst;
for(w = width;w >= 4; w-=4) {
v = s1[0];
d[0] = v;
d[1] = v;
d[2] = v;
d[3] = v;
s1 ++;
d += 4;
}
}
/* 1x1 -> 2x1 */
static void grow21(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height)
{
for(;height > 0; height--) {
grow21_line(dst, src, width);
src += src_wrap;
dst += dst_wrap;
}
}
/* 1x1 -> 1x2 */
static void grow12(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height)
{
for(;height > 0; height-=2) {
memcpy(dst, src, width);
dst += dst_wrap;
memcpy(dst, src, width);
dst += dst_wrap;
src += src_wrap;
}
}
/* 1x1 -> 2x2 */
static void grow22(uint8_t *dst, int dst_wrap,
const uint8_t *src, int src_wrap,
int width, int height)
{
for(;height > 0; height-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -