📄 output.c
字号:
"movd (%0), %%mm0;\n" /* Load y 0x00000000000000yy */ "psubsw mpeg3_MMX_601_Y_DIFF, %%mm0;\n" /* Subtract 16 from y */ "movd (%1), %%mm1;\n" /* Load v 0x00000000000000vv */ "movq %%mm0, %%mm3;\n" /* Copy y to temp */ "psllq $16, %%mm1;\n" /* Shift v 0x0000000000vv0000 */ "movd (%2), %%mm2;\n" /* Load u 0x00000000000000uu */ "psllq $16, %%mm3;\n" /* Shift y */ "movq %%mm1, %%mm4;\n" /* Copy v to temp */ "por %%mm3, %%mm0;\n" /* Overlay new y byte 0x0000000000yy00yy */ "psllq $16, %%mm4;\n" /* Shift v */ "movq %%mm2, %%mm5;\n" /* Copy u to temp */ "psllq $16, %%mm3;\n" /* Shift y */ "por %%mm4, %%mm1;\n" /* Overlay new v byte 0x000000vv00vv0000 */ "psllq $16, %%mm5;\n" /* Shift u */ "por %%mm3, %%mm0;\n" /* Overlay new y byte 0x000000yy00yy00yy */ "por %%mm5, %%mm2;\n" /* Overlay new u byte 0x0000000000uu00uu *//* mm0: 0x000000yy00yy00yy mm1: 0x000000vv00vv0000 mm2: 0x0000000000uu00uu */ "pmullw mpeg3_MMX_601_Y_COEF, %%mm0;\n" /* Scale y coeffs */ "psubw mpeg3_MMX_V_80_RGB, %%mm1;\n" /* Subtract 128 from v 0x000000vv00vv0000 */ "pmullw mpeg3_MMX_V_COEF_RGB, %%mm1;\n" /* Multiply v coeffs 0x0000vvvvvvvv0000 */ "psubw mpeg3_MMX_U_80_RGB, %%mm2;\n" /* Subtract 128 from u 0x0000000000uu00uu */ "pmullw mpeg3_MMX_U_COEF_RGB, %%mm2;\n" /* Multiply u coeffs 0x0000uuuuuuuuuuuu *//* mm0: 0x000000yy00yy00yy mm1: 0x0000vvvvvvvv0000 mm2: 0x00000000uuuuuuuu */ "paddsw %%mm1, %%mm0;\n" /* Add v to result */ "paddsw %%mm2, %%mm0;\n" /* Add u to result 0x0000bbbbggggrrrr */ "psraw $6, %%mm0;\n" /* Demote precision */ "packuswb %%mm0, %%mm0;\n" /* Pack into RGBA 0x0000000000bbggrr */ "movd %%mm0, (%3);\n" /* Store output */:: "r" (&y), "r" (&v), "r" (&u), "r" (output));}#endif#define DITHER_ROW_HEAD \ for(h = 0; h < video->out_h; h++) \ { \ y_in = &src[0][(video->y_table[h] + video->in_y) * \ video->coded_picture_width] + \ video->in_x; \ if(video->chroma_format == CHROMA420) \ { \ cb_in = &src[1][((video->y_table[h] + video->in_y) >> 1) * \ video->chrom_width] + \ (video->in_x >> 1); \ cr_in = &src[2][((video->y_table[h] + video->in_y) >> 1) * \ video->chrom_width] + \ (video->in_x >> 1); \ } \ else \ { \ cb_in = &src[1][(video->y_table[h] + video->in_y) * \ video->chrom_width] + \ (video->in_x >> 1); \ cr_in = &src[2][(video->y_table[h] + video->in_y) * \ video->chrom_width] + \ (video->in_x >> 1); \ } \ data = output_rows[h];#define DITHER_ROW_TAIL \ }#define DITHER_SCALE_HEAD \ for(w = 0; w < video->out_w; w++) \ { \ uv_subscript = video->x_table[w] / 2; \ y_l = y_in[video->x_table[w]]; \ y_l <<= 16; \ r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; \ g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; \ b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16;#define DITHER_SCALE_601_HEAD \ for(w = 0; w < video->out_w; w++) \ { \ uv_subscript = video->x_table[w] / 2; \ y_l = mpeg3_601_to_rgb[y_in[video->x_table[w]]]; \ y_l <<= 16; \ r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; \ g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; \ b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16;#define DITHER_SCALE_TAIL \ }#define DITHER_MMX_SCALE_HEAD \ for(w = 0; w < video->out_w; w++) \ { \ uv_subscript = video->x_table[w] / 2;#define DITHER_MMX_SCALE_TAIL \ data += step; \ }#define DITHER_MMX_HEAD \ for(w = 0; w < video->out_w; w += 2) \ {#define DITHER_MMX_TAIL \ data += step; \ cr_in++; \ cb_in++; \ }#define DITHER_HEAD \ for(w = 0; w < video->horizontal_size; w++) \ { \ y_l = *y_in++; \ y_l <<= 16; \ r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; \ g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; \ b_l = (y_l + video->cb_to_b[*cb_in]) >> 16;#define DITHER_601_HEAD \ for(w = 0; w < video->horizontal_size; w++) \ { \ y_l = mpeg3_601_to_rgb[*y_in++]; \ y_l <<= 16; \ r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; \ g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; \ b_l = (y_l + video->cb_to_b[*cb_in]) >> 16;#define DITHER_TAIL \ if(w & 1) \ { \ cr_in++; \ cb_in++; \ } \ }#define STORE_PIXEL_BGR888 \ *data++ = CLIP(b_l); \ *data++ = CLIP(g_l); \ *data++ = CLIP(r_l);#define STORE_PIXEL_BGRA8888 \ *data++ = CLIP(b_l); \ *data++ = CLIP(g_l); \ *data++ = CLIP(r_l); \ *data++ = 0;#define STORE_PIXEL_RGB565 \ *((unsigned short*)data)++ = \ ((CLIP(r_l) & 0xf8) << 8) | \ ((CLIP(g_l) & 0xfc) << 3) | \ ((CLIP(b_l) & 0xf8) >> 3);#define STORE_PIXEL_RGB888 \ *data++ = CLIP(r_l); \ *data++ = CLIP(g_l); \ *data++ = CLIP(b_l);#define STORE_PIXEL_RGBA8888 \ *data++ = CLIP(r_l); \ *data++ = CLIP(g_l); \ *data++ = CLIP(b_l); \ *data++ = 0;#define STORE_PIXEL_RGBA16161616 \ *data_s++ = CLIP(r_l); \ *data_s++ = CLIP(g_l); \ *data_s++ = CLIP(b_l); \ *data_s++ = 0;/* Only good for YUV 4:2:0 */int mpeg3video_ditherframe(mpeg3video_t *video, unsigned char **src, unsigned char **output_rows){ int h = 0; register unsigned char *y_in, *cb_in, *cr_in; long y_l, r_l, b_l, g_l; register unsigned char *data; register int uv_subscript, step, w = -1;#ifdef HAVE_MMX/* =================================== MMX ===================================== */ if(/* video->have_mmx */ 1 && video->out_w == video->horizontal_size && video->out_h == video->vertical_size && video->in_w == video->out_w && video->in_h == video->out_h && video->in_x == 0 && video->in_y == 0 && (video->color_model == MPEG3_RGB565 || video->color_model == MPEG3_601_RGB565) && video->chroma_format == CHROMA420) {/* Unscaled 16 bit from NIST */ mpeg3video_rgb16_mmx(src[0], src[2], src[1], output_rows[0], video->out_h, video->out_w, (output_rows[1] - output_rows[0]) / 2 - video->out_w); } else if(/* video->have_mmx */ 1 && (video->color_model == MPEG3_BGRA8888 || video->color_model == MPEG3_BGR888 ||/* video->color_model == MPEG3_RGB888 || */ video->color_model == MPEG3_RGBA8888 || video->color_model == MPEG3_601_BGR888 || video->color_model == MPEG3_601_BGRA8888 || video->color_model == MPEG3_601_RGB888 || video->color_model == MPEG3_601_RGBA8888)) {/* Original MMX */ if(video->color_model == MPEG3_BGRA8888 || video->color_model == MPEG3_RGBA8888 || video->color_model == MPEG3_601_BGRA8888 || video->color_model == MPEG3_601_RGBA8888) step = 4; else if(video->color_model == MPEG3_BGR888 || video->color_model == MPEG3_RGB888 || video->color_model == MPEG3_601_BGR888 || video->color_model == MPEG3_601_RGB888) step = 3; DITHER_ROW_HEAD/* Transfer row with scaling */ if(video->out_w != video->horizontal_size) { switch(video->color_model) { case MPEG3_BGRA8888: case MPEG3_BGR888: DITHER_MMX_SCALE_HEAD mpeg3_bgra32_mmx(y_in[video->x_table[w]], cr_in[uv_subscript], cb_in[uv_subscript], (unsigned long*)data); DITHER_MMX_SCALE_TAIL break; case MPEG3_601_BGRA8888: case MPEG3_601_BGR888: DITHER_MMX_SCALE_HEAD mpeg3_601_bgra32_mmx(y_in[video->x_table[w]], cr_in[uv_subscript], cb_in[uv_subscript], (unsigned long*)data); DITHER_MMX_SCALE_TAIL break; case MPEG3_RGBA8888: case MPEG3_RGB888: DITHER_MMX_SCALE_HEAD mpeg3_rgba32_mmx(y_in[video->x_table[w]], cr_in[uv_subscript], cb_in[uv_subscript], (unsigned long*)data); DITHER_MMX_SCALE_TAIL break; case MPEG3_601_RGBA8888: case MPEG3_601_RGB888: DITHER_MMX_SCALE_HEAD mpeg3_601_rgba32_mmx(y_in[video->x_table[w]], cr_in[uv_subscript], cb_in[uv_subscript], (unsigned long*)data); DITHER_MMX_SCALE_TAIL break; } } else/* Transfer row unscaled */ { switch(video->color_model) {/* MMX byte swap 24 and 32 bit */ case MPEG3_BGRA8888: case MPEG3_BGR888: DITHER_MMX_HEAD mpeg3_bgra32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); data += step; mpeg3_bgra32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); DITHER_MMX_TAIL break;/* MMX 601 byte swap 24 and 32 bit */ case MPEG3_601_BGRA8888: case MPEG3_601_BGR888: DITHER_MMX_HEAD mpeg3_601_bgra32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); data += step; mpeg3_601_bgra32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); DITHER_MMX_TAIL break;/* MMX 24 and 32 bit no byte swap */ case MPEG3_RGBA8888: case MPEG3_RGB888: DITHER_MMX_HEAD mpeg3_rgba32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); data += step; mpeg3_rgba32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); DITHER_MMX_TAIL break;/* MMX 601 24 and 32 bit no byte swap */ case MPEG3_601_RGBA8888: case MPEG3_601_RGB888: DITHER_MMX_HEAD mpeg3_601_rgba32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); data += step; mpeg3_601_rgba32_mmx(*y_in++, *cr_in, *cb_in, (unsigned long*)data); DITHER_MMX_TAIL break; } } DITHER_ROW_TAIL } else#endif/* ================================== NO MMX ==================================== */ { DITHER_ROW_HEAD/* Transfer row with scaling */ if(video->out_w != video->horizontal_size) { switch(video->color_model) { case MPEG3_BGR888:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -