📄 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 + -