summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-06-21 17:29:05 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-06-21 17:29:05 +0000
commit63e90b6d98420825fad6a07a2b32bbc09234ad7b (patch)
tree60cb60da994bb651c7800a7e464eb4ce2dbd7493 /libvo
parent4839e624382e6c9b0fa9c01b354b2aa7febb06a9 (diff)
downloadmpv-63e90b6d98420825fad6a07a2b32bbc09234ad7b.tar.bz2
mpv-63e90b6d98420825fad6a07a2b32bbc09234ad7b.tar.xz
YVU9,IF09,Y800 and Y8 support - and syÃnced with mpxp
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6483 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vosub_vidix.c89
1 files changed, 84 insertions, 5 deletions
diff --git a/libvo/vosub_vidix.c b/libvo/vosub_vidix.c
index 23194058d3..6ea30b69d1 100644
--- a/libvo/vosub_vidix.c
+++ b/libvo/vosub_vidix.c
@@ -217,6 +217,81 @@ static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h
}
}
+static uint32_t vidix_draw_slice_410(uint8_t *image[], int stride[], int w,int h,int x,int y)
+{
+ uint8_t *src;
+ uint8_t *dest;
+ int i;
+
+ /* Plane Y */
+ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
+ dest += dstrides.y*y + x;
+ src = image[0];
+ for(i=0;i<h;i++){
+ memcpy(dest,src,w);
+ src+=stride[0];
+ dest += dstrides.y;
+ }
+
+ if (vidix_play.flags & VID_PLAY_INTERLEAVED_UV)
+ {
+ printf("vosub_vidix: interleaved uv for yuv410p not supported\n");
+ }
+ else
+ {
+ /* Plane V */
+ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v;
+ dest += dstrides.v*y/8 + x;
+ src = image[1];
+ for(i=0;i<h/4;i++){
+ memcpy(dest,src,w/4);
+ src+=stride[1];
+ dest+=dstrides.v/4;
+ }
+
+ /* Plane U */
+ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u;
+ dest += dstrides.u*y/8 + x;
+ src = image[2];
+ for(i=0;i<h/4;i++){
+ memcpy(dest,src,w/4);
+ src+=stride[2];
+ dest += dstrides.u/4;
+ }
+ return 0;
+ }
+}
+
+static uint32_t vidix_draw_slice_410_fast(uint8_t *image[], int stride[], int w, int h, int x, int y)
+{
+ uint8_t *src;
+ uint8_t *dest;
+ UNUSED(w);
+ UNUSED(stride);
+ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
+ dest += dstrides.y*y + x;
+ src = image[0];
+ memcpy(dest, src, dstrides.y*h*9/8);
+ return 0;
+}
+
+static uint32_t vidix_draw_slice_400(uint8_t *image[], int stride[], int w,int h,int x,int y)
+{
+ uint8_t *src;
+ uint8_t *dest;
+ int i;
+
+ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
+ dest += dstrides.y*y + x;
+ src = image[0];
+ for(i=0;i<h;i++){
+ memcpy(dest,src,w);
+ src+=stride[0];
+ dest += dstrides.y;
+ }
+ return 0;
+}
+
static uint32_t vidix_draw_slice_packed(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
@@ -258,7 +333,8 @@ uint32_t vidix_draw_frame(uint8_t *image[])
int stride[1];
if(verbose > 1) printf("vosub_vidix: vidix_draw_frame() was called\n");
/* Note it's very strange but sometime for YUY2 draw_frame is called */
- if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV)
+ if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV
+ || src_format == IMGFMT_YVU9 || src_format == IMGFMT_IF09)
printf("vosub_vidix: draw_frame for YUV420 called, frame cannot be written\n");
else
if(src_format == IMGFMT_RGB32 || src_format == IMGFMT_BGR32)
@@ -580,10 +656,10 @@ int vidix_init(unsigned src_width,unsigned src_height,
vidix_play.frame_size);
switch(format)
{
- /*
- case IMGFMT_YV09:
+ case IMGFMT_Y800:
+ case IMGFMT_Y8:
+ case IMGFMT_YVU9:
case IMGFMT_IF09:
- */
case IMGFMT_I420:
case IMGFMT_IYUV:
case IMGFMT_YV12:
@@ -617,12 +693,15 @@ int vidix_init(unsigned src_width,unsigned src_height,
break;
}
/* tune some info here */
- sstride = src_width*2;
+ sstride = src_width*image_Bpp;
if(!forced_fourcc)
{
is_422_planes_eq = sstride == dstrides.y;
+
if(src_format == IMGFMT_YV12 || src_format == IMGFMT_I420 || src_format == IMGFMT_IYUV)
vo_server->draw_slice = vidix_draw_slice_420;
+ else if (src_format == IMGFMT_YVU9 || src_format == IMGFMT_IF09)
+ vo_server->draw_slice = vidix_draw_slice_410;
else vo_server->draw_slice =
is_422_planes_eq ?
vidix_draw_slice_packed_fast: