| @@ -468,11 +468,10 @@ static av_always_inline int encode_alpha_slice_data(AVCodecContext *avctx, int8_ | |||||
| } | } | ||||
| } | } | ||||
| static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y, | |||||
| unsigned stride, unsigned width, unsigned height, uint16_t *dst, | |||||
| unsigned dst_width, unsigned dst_height) | |||||
| static inline void subimage_with_fill_template(uint16_t *src, unsigned x, unsigned y, | |||||
| unsigned stride, unsigned width, unsigned height, uint16_t *dst, | |||||
| unsigned dst_width, unsigned dst_height, int is_alpha_plane) | |||||
| { | { | ||||
| int box_width = FFMIN(width - x, dst_width); | int box_width = FFMIN(width - x, dst_width); | ||||
| int box_height = FFMIN(height - y, dst_height); | int box_height = FFMIN(height - y, dst_height); | ||||
| int i, j, src_stride = stride >> 1; | int i, j, src_stride = stride >> 1; | ||||
| @@ -481,9 +480,17 @@ static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y, | |||||
| src += y * src_stride + x; | src += y * src_stride + x; | ||||
| for (i = 0; i < box_height; ++i) { | for (i = 0; i < box_height; ++i) { | ||||
| for (j = 0; j < box_width; ++j) { | for (j = 0; j < box_width; ++j) { | ||||
| dst[j] = src[j]; | |||||
| if (!is_alpha_plane) { | |||||
| dst[j] = src[j]; | |||||
| } else { | |||||
| dst[j] = src[j] << 6; /* alpha 10b to 16b */ | |||||
| } | |||||
| } | |||||
| if (!is_alpha_plane) { | |||||
| last_pix = dst[j - 1]; | |||||
| } else { | |||||
| last_pix = dst[j - 1] << 6; /* alpha 10b to 16b */ | |||||
| } | } | ||||
| last_pix = dst[j - 1]; | |||||
| for (; j < dst_width; j++) | for (; j < dst_width; j++) | ||||
| dst[j] = last_pix; | dst[j] = last_pix; | ||||
| src += src_stride; | src += src_stride; | ||||
| @@ -498,34 +505,19 @@ static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y, | |||||
| } | } | ||||
| } | } | ||||
| static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y, | |||||
| unsigned stride, unsigned width, unsigned height, uint16_t *dst, | |||||
| unsigned dst_width, unsigned dst_height) | |||||
| { | |||||
| subimage_with_fill_template(src, x, y, stride, width, height, dst, dst_width, dst_height, 0); | |||||
| } | |||||
| /* reorganize alpha data and convert 10b -> 16b */ | /* reorganize alpha data and convert 10b -> 16b */ | ||||
| static void subimage_alpha_with_fill(uint16_t *src, unsigned x, unsigned y, | static void subimage_alpha_with_fill(uint16_t *src, unsigned x, unsigned y, | ||||
| unsigned stride, unsigned width, unsigned height, uint16_t *dst, | unsigned stride, unsigned width, unsigned height, uint16_t *dst, | ||||
| unsigned dst_width, unsigned dst_height) | unsigned dst_width, unsigned dst_height) | ||||
| { | { | ||||
| int box_width = FFMIN(width - x, dst_width); | |||||
| int box_height = FFMIN(height - y, dst_height); | |||||
| int i, j, src_stride = stride >> 1; | |||||
| uint16_t last_pix, *last_line; | |||||
| src += y * src_stride + x; | |||||
| for (i = 0; i < box_height; ++i) { | |||||
| for (j = 0; j < box_width; ++j) { | |||||
| dst[j] = src[j] << 6; /* 10b to 16b */ | |||||
| } | |||||
| last_pix = dst[j - 1] << 6; /* 10b to 16b */ | |||||
| for (; j < dst_width; j++) | |||||
| dst[j] = last_pix; | |||||
| src += src_stride; | |||||
| dst += dst_width; | |||||
| } | |||||
| last_line = dst - dst_width; | |||||
| for (; i < dst_height; i++) { | |||||
| for (j = 0; j < dst_width; ++j) { | |||||
| dst[j] = last_line[j]; | |||||
| } | |||||
| dst += dst_width; | |||||
| } | |||||
| subimage_with_fill_template(src, x, y, stride, width, height, dst, dst_width, dst_height, 1); | |||||
| } | } | ||||
| static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, int mb_x, | static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, int mb_x, | ||||