| @@ -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_height = FFMIN(height - y, dst_height); | |||
| 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; | |||
| for (i = 0; i < box_height; ++i) { | |||
| 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++) | |||
| dst[j] = last_pix; | |||
| 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 */ | |||
| static void subimage_alpha_with_fill(uint16_t *src, unsigned x, unsigned y, | |||
| unsigned stride, unsigned width, unsigned height, uint16_t *dst, | |||
| 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, | |||