diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/imgconvert.c')
-rw-r--r-- | src/libffmpeg/libavcodec/imgconvert.c | 143 |
1 files changed, 120 insertions, 23 deletions
diff --git a/src/libffmpeg/libavcodec/imgconvert.c b/src/libffmpeg/libavcodec/imgconvert.c index 850f9b04f..cc1a825fc 100644 --- a/src/libffmpeg/libavcodec/imgconvert.c +++ b/src/libffmpeg/libavcodec/imgconvert.c @@ -63,7 +63,7 @@ typedef struct PixFmtInfo { } PixFmtInfo; /* this table gives more information about formats */ -static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = { +static const PixFmtInfo pix_fmt_info[PIX_FMT_NB] = { /* YUV formats */ [PIX_FMT_YUV420P] = { .name = "yuv420p", @@ -266,7 +266,7 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr, int pix_fmt, int width, int height) { int size, w2, h2, size2; - PixFmtInfo *pinfo; + const PixFmtInfo *pinfo; if(avcodec_check_dimensions(NULL, width, height)) goto fail; @@ -359,7 +359,7 @@ fail: int avpicture_layout(const AVPicture* src, int pix_fmt, int width, int height, unsigned char *dest, int dest_size) { - PixFmtInfo* pf = &pix_fmt_info[pix_fmt]; + const PixFmtInfo* pf = &pix_fmt_info[pix_fmt]; int i, j, w, h, data_planes; const unsigned char* s; int size = avpicture_get_size(pix_fmt, width, height); @@ -572,7 +572,7 @@ int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt, return dst_pix_fmt; } -static void img_copy_plane(uint8_t *dst, int dst_wrap, +void ff_img_copy_plane(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height) { @@ -592,7 +592,7 @@ void img_copy(AVPicture *dst, const AVPicture *src, int pix_fmt, int width, int height) { int bwidth, bits, i; - PixFmtInfo *pf = &pix_fmt_info[pix_fmt]; + const PixFmtInfo *pf = &pix_fmt_info[pix_fmt]; pf = &pix_fmt_info[pix_fmt]; switch(pf->pixel_type) { @@ -612,7 +612,7 @@ void img_copy(AVPicture *dst, const AVPicture *src, break; } bwidth = (width * bits + 7) >> 3; - img_copy_plane(dst->data[0], dst->linesize[0], + ff_img_copy_plane(dst->data[0], dst->linesize[0], src->data[0], src->linesize[0], bwidth, height); break; @@ -626,17 +626,17 @@ void img_copy(AVPicture *dst, const AVPicture *src, h >>= pf->y_chroma_shift; } bwidth = (w * pf->depth + 7) >> 3; - img_copy_plane(dst->data[i], dst->linesize[i], + ff_img_copy_plane(dst->data[i], dst->linesize[i], src->data[i], src->linesize[i], bwidth, h); } break; case FF_PIXEL_PALETTE: - img_copy_plane(dst->data[0], dst->linesize[0], + ff_img_copy_plane(dst->data[0], dst->linesize[0], src->data[0], src->linesize[0], width, height); /* copy the palette */ - img_copy_plane(dst->data[1], dst->linesize[1], + ff_img_copy_plane(dst->data[1], dst->linesize[1], src->data[1], src->linesize[1], 4, 256); break; @@ -1210,7 +1210,7 @@ static void shrink12(uint8_t *dst, int dst_wrap, } /* 2x2 -> 1x1 */ -static void shrink22(uint8_t *dst, int dst_wrap, +void ff_shrink22(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height) { @@ -1243,7 +1243,7 @@ static void shrink22(uint8_t *dst, int dst_wrap, } /* 4x4 -> 1x1 */ -static void shrink44(uint8_t *dst, int dst_wrap, +void ff_shrink44(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height) { @@ -1273,6 +1273,28 @@ static void shrink44(uint8_t *dst, int dst_wrap, } } +/* 8x8 -> 1x1 */ +void ff_shrink88(uint8_t *dst, int dst_wrap, + const uint8_t *src, int src_wrap, + int width, int height) +{ + int w, i; + + for(;height > 0; height--) { + for(w = width;w > 0; w--) { + int tmp=0; + for(i=0; i<8; i++){ + tmp += src[0] + src[1] + src[2] + src[3] + src[4] + src[5] + src[6] + src[7]; + src += src_wrap; + } + *(dst++) = (tmp + 32)>>6; + src += 8 - 8*src_wrap; + } + src += 8*src_wrap - 8*width; + dst += dst_wrap - width; + } +} + static void grow21_line(uint8_t *dst, const uint8_t *src, int width) { @@ -1701,7 +1723,7 @@ typedef struct ConvertEntry { The other conversion functions are just optimisations for common cases. */ -static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = { +static const ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = { [PIX_FMT_YUV420P] = { [PIX_FMT_YUV422] = { .convert = yuv420p_to_yuv422, @@ -1922,7 +1944,7 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = { int avpicture_alloc(AVPicture *picture, int pix_fmt, int width, int height) { - unsigned int size; + int size; void *ptr; size = avpicture_get_size(pix_fmt, width, height); @@ -1944,13 +1966,88 @@ void avpicture_free(AVPicture *picture) } /* return true if yuv planar */ -static inline int is_yuv_planar(PixFmtInfo *ps) +static inline 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; } +/** + * Crop image top and left side + */ +int img_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; +} + +/** + * Pad image + */ +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) +{ + uint8_t *optr, *iptr; + 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 || src) { + if (src) { /* first line */ + iptr = src->data[i]; + optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift); + memcpy(optr, iptr, src->linesize[i]); + 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); + if (src) { + memcpy(optr + ((padleft + padright) >> x_shift), iptr, src->linesize[i]); + 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; +} + /* XXX: always use linesize. Return -1 if not supported */ int img_convert(AVPicture *dst, int dst_pix_fmt, const AVPicture *src, int src_pix_fmt, @@ -1958,8 +2055,8 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, { static int inited; int i, ret, dst_width, dst_height, int_pix_fmt; - PixFmtInfo *src_pix, *dst_pix; - ConvertEntry *ce; + const PixFmtInfo *src_pix, *dst_pix; + const ConvertEntry *ce; AVPicture tmp1, *tmp = &tmp1; if (src_pix_fmt < 0 || src_pix_fmt >= PIX_FMT_NB || @@ -1998,7 +2095,7 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, uint8_t *d; if (dst_pix->color_type == FF_COLOR_YUV_JPEG) { - img_copy_plane(dst->data[0], dst->linesize[0], + ff_img_copy_plane(dst->data[0], dst->linesize[0], src->data[0], src->linesize[0], dst_width, dst_height); } else { @@ -2026,7 +2123,7 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, if (is_yuv_planar(src_pix) && dst_pix_fmt == PIX_FMT_GRAY8) { if (src_pix->color_type == FF_COLOR_YUV_JPEG) { - img_copy_plane(dst->data[0], dst->linesize[0], + ff_img_copy_plane(dst->data[0], dst->linesize[0], src->data[0], src->linesize[0], dst_width, dst_height); } else { @@ -2064,7 +2161,7 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, YUV444 format */ switch(xy_shift) { case 0x00: - resize_func = img_copy_plane; + resize_func = ff_img_copy_plane; break; case 0x10: resize_func = shrink21; @@ -2076,10 +2173,10 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, resize_func = shrink12; break; case 0x11: - resize_func = shrink22; + resize_func = ff_shrink22; break; case 0x22: - resize_func = shrink44; + resize_func = ff_shrink44; break; case 0xf0: resize_func = grow21; @@ -2101,7 +2198,7 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, goto no_chroma_filter; } - img_copy_plane(dst->data[0], dst->linesize[0], + ff_img_copy_plane(dst->data[0], dst->linesize[0], src->data[0], src->linesize[0], dst_width, dst_height); @@ -2226,7 +2323,7 @@ static int get_alpha_info_pal8(const AVPicture *src, int width, int height) int img_get_alpha_info(const AVPicture *src, int pix_fmt, int width, int height) { - PixFmtInfo *pf = &pix_fmt_info[pix_fmt]; + const PixFmtInfo *pf = &pix_fmt_info[pix_fmt]; int ret; pf = &pix_fmt_info[pix_fmt]; |