aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-04-13 02:21:12 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-04-13 02:21:12 +0000
commitb1ec5875a63d5cf61629ff69fb337c6d96e7b964 (patch)
treee0833e6b05c1dbcd15ead4f768153b1b47b94241
parent74d3583521de27a6c6018a647362a1974f3e2b58 (diff)
downloadffmpeg-b1ec5875a63d5cf61629ff69fb337c6d96e7b964.tar.gz
yuv422p -> yuy2 (untested)
Originally committed as revision 5589 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
-rw-r--r--postproc/rgb2rgb.c23
-rw-r--r--postproc/rgb2rgb.h3
-rw-r--r--postproc/rgb2rgb_template.c35
3 files changed, 53 insertions, 8 deletions
diff --git a/postproc/rgb2rgb.c b/postproc/rgb2rgb.c
index b1178b8628..44c8e461e8 100644
--- a/postproc/rgb2rgb.c
+++ b/postproc/rgb2rgb.c
@@ -362,6 +362,29 @@ void yv12toyuy2(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, u
/**
*
+ * width should be a multiple of 16
+ */
+void yuv422ptoyuy2(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
+ unsigned int width, unsigned int height,
+ unsigned int lumStride, unsigned int chromStride, unsigned int dstStride)
+{
+#ifdef CAN_COMPILE_X86_ASM
+ // ordered per speed fasterst first
+ if(gCpuCaps.hasMMX2)
+ yuv422ptoyuy2_MMX2(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
+ else if(gCpuCaps.has3DNow)
+ yuv422ptoyuy2_3DNow(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
+ else if(gCpuCaps.hasMMX)
+ yuv422ptoyuy2_MMX(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
+ else
+ yuv422ptoyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
+#else
+ yuv422ptoyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
+#endif
+}
+
+/**
+ *
* height should be a multiple of 2 and width should be a multiple of 16 (if this is a
* problem for anyone then tell me, and ill fix it)
*/
diff --git a/postproc/rgb2rgb.h b/postproc/rgb2rgb.h
index 244ed1ed46..fb4f04590d 100644
--- a/postproc/rgb2rgb.h
+++ b/postproc/rgb2rgb.h
@@ -28,6 +28,9 @@ extern void palette8torgb24(const uint8_t *src, uint8_t *dst, unsigned num_pixel
extern void yv12toyuy2(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
unsigned int width, unsigned int height,
unsigned int lumStride, unsigned int chromStride, unsigned int dstStride);
+extern void yuv422ptoyuy2(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
+ unsigned int width, unsigned int height,
+ unsigned int lumStride, unsigned int chromStride, unsigned int dstStride);
extern void yuy2toyv12(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
unsigned int width, unsigned int height,
unsigned int lumStride, unsigned int chromStride, unsigned int srcStride);
diff --git a/postproc/rgb2rgb_template.c b/postproc/rgb2rgb_template.c
index 87493ebc1c..5c3a4e88d9 100644
--- a/postproc/rgb2rgb_template.c
+++ b/postproc/rgb2rgb_template.c
@@ -638,14 +638,9 @@ static inline void RENAME(rgb24tobgr24)(const uint8_t *src, uint8_t *dst, unsign
}
}
-/**
- *
- * height should be a multiple of 2 and width should be a multiple of 16 (if this is a
- * problem for anyone then tell me, and ill fix it)
- */
-static inline void RENAME(yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
+static inline void RENAME(yuvPlanartoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
unsigned int width, unsigned int height,
- unsigned int lumStride, unsigned int chromStride, unsigned int dstStride)
+ unsigned int lumStride, unsigned int chromStride, unsigned int dstStride, int vertLumPerChroma)
{
int y;
const int chromWidth= width>>1;
@@ -696,7 +691,7 @@ static inline void RENAME(yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc,
dst[4*i+3] = vsrc[i];
}
#endif
- if(y&1)
+ if((y&(vertLumPerChroma-1))==(vertLumPerChroma-1) )
{
usrc += chromStride;
vsrc += chromStride;
@@ -716,6 +711,30 @@ asm( EMMS" \n\t"
* height should be a multiple of 2 and width should be a multiple of 16 (if this is a
* problem for anyone then tell me, and ill fix it)
*/
+static inline void RENAME(yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
+ unsigned int width, unsigned int height,
+ unsigned int lumStride, unsigned int chromStride, unsigned int dstStride)
+{
+ //FIXME interpolate chroma
+ RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2);
+}
+
+/**
+ *
+ * width should be a multiple of 16
+ */
+static inline void RENAME(yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
+ unsigned int width, unsigned int height,
+ unsigned int lumStride, unsigned int chromStride, unsigned int dstStride)
+{
+ RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 1);
+}
+
+/**
+ *
+ * height should be a multiple of 2 and width should be a multiple of 16 (if this is a
+ * problem for anyone then tell me, and ill fix it)
+ */
static inline void RENAME(yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
unsigned int width, unsigned int height,
unsigned int lumStride, unsigned int chromStride, unsigned int srcStride)