1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-07 07:31:48 +00:00

Optimization and get_image fixes (still untested)

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5000 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
nick 2002-03-09 08:08:43 +00:00
parent 3879252453
commit af72321401

View File

@ -37,7 +37,7 @@
static VDL_HANDLE vidix_handler = NULL;
static uint8_t *vidix_mem = NULL;
static uint8_t next_frame;
static unsigned image_bpp,image_height,image_width,src_format;
static unsigned image_Bpp,image_height,image_width,src_format;
extern int verbose;
static int video_on=0;
@ -45,6 +45,7 @@ static vidix_capability_t vidix_cap;
static vidix_playback_t vidix_play;
static vidix_fourcc_t vidix_fourcc;
static vo_functions_t * vo_server;
static vidix_yuv_t dstrides;
static uint32_t (*server_control)(uint32_t request, void *data, ...);
@ -146,20 +147,16 @@ static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
/* Plane Y */
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
dest += dstrides.y*y + x;
src = image[0];
for(i=0;i<h;i++){
memcpy(dest,src,w);
src+=stride[0];
dest += bespitch;
dest += dstrides.y;
}
if (vidix_play.flags & VID_PLAY_INTERLEAVED_UV)
@ -167,7 +164,7 @@ static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h
int hi,wi;
uint8_t *src2;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v;
dest += bespitch*y/2 + x; // <- is this correct ?
dest += dstrides.y*y/2 + x; // <- is this correct ?
h/=2;
w/=2;
src = image[1];
@ -179,143 +176,61 @@ static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h
dest[2*wi+0] = src[wi];
dest[2*wi+1] = src2[wi];
}
dest += bespitch;
dest += dstrides.y;
src += stride[1];
src2+= stride[2];
}
} else {
src2+= stride[2];
}
}
else
{
/* Plane V */
apitch = vidix_play.dest.pitch.v-1;
bespitch = (w + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v;
dest += bespitch*y/4 + x;
dest += dstrides.v*y/4 + x;
src = image[1];
for(i=0;i<h/2;i++){
memcpy(dest,src,w/2);
src+=stride[1];
dest+=bespitch/2;
dest+=dstrides.v/2;
}
/* Plane U */
apitch = vidix_play.dest.pitch.u-1;
bespitch = (w + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u;
dest += bespitch*y/4 + x;
dest += dstrides.u*y/4 + x;
src = image[2];
for(i=0;i<h/2;i++){
memcpy(dest,src,w/2);
src+=stride[2];
dest += bespitch/2;
dest += dstrides.u/2;
}
return 0;
}
}
}
static uint32_t vidix_draw_slice_422(uint8_t *image[], int stride[], int w,int h,int x,int y)
static uint32_t vidix_draw_slice_packed(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w*2 + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
dest += dstrides.y*y + x;
src = image[0];
for(i=0;i<h;i++){
memcpy(dest,src,w*2);
memcpy(dest,src,w*image_Bpp);
src+=stride[0];
dest += bespitch;
dest += dstrides.y;
}
return 0;
}
static uint32_t vidix_draw_slice_422_fast(uint8_t *image[], int stride[], int w,int h,int x,int y)
static uint32_t vidix_draw_slice_packed_fast(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w*2 + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
dest += dstrides.y*y + x;
src = image[0];
memcpy(dest,src,h*bespitch);
return 0;
}
static uint32_t vidix_draw_slice_32(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w*4 + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
src = image[0];
for(i=0;i<h;i++){
memcpy(dest,src,w*4);
src+=stride[0];
dest += bespitch;
}
return 0;
}
static uint32_t vidix_draw_slice_32_fast(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w*4 + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
src = image[0];
memcpy(dest,src,h*bespitch);
return 0;
}
static uint32_t vidix_draw_slice_24(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w*3 + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
src = image[0];
for(i=0;i<h;i++){
memcpy(dest,src,w*3);
src+=stride[0];
dest += bespitch;
}
return 0;
}
static uint32_t vidix_draw_slice_24_fast(uint8_t *image[], int stride[], int w,int h,int x,int y)
{
uint8_t *src;
uint8_t *dest;
unsigned bespitch,apitch;
int i;
apitch = vidix_play.dest.pitch.y-1;
bespitch = (w*3 + apitch) & ~apitch;
dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y;
dest += bespitch*y + x;
src = image[0];
memcpy(dest,src,h*bespitch);
memcpy(dest,src,h*dstrides.y);
return 0;
}
@ -506,7 +421,7 @@ int vidix_init(unsigned src_width,unsigned src_height,
{
size_t i,awidth;
int err,is_422_planes_eq;
uint32_t sstride,dstride;
uint32_t sstride,apitch;
if(verbose > 1)
printf("vosub_vidix: vidix_init() was called\n"
"src_w=%u src_h=%u dest_x_y_w_h = %u %u %u %u\n"
@ -634,29 +549,53 @@ int vidix_init(unsigned src_width,unsigned src_height,
for (i = 0; i < vidix_play.num_frames; i++)
memset(vidix_mem + vidix_play.offsets[i], 0x80,
vidix_play.frame_size);
switch(format)
{
/*
case IMGFMT_YV09:
case IMGFMT_IF09:
*/
case IMGFMT_I420:
case IMGFMT_IYUV:
case IMGFMT_YV12:
apitch = vidix_play.dest.pitch.y-1;
dstrides.y = (image_width + apitch) & ~apitch;
apitch = vidix_play.dest.pitch.v-1;
dstrides.v = (image_width + apitch) & ~apitch;
apitch = vidix_play.dest.pitch.u-1;
dstrides.u = (image_width + apitch) & ~apitch;
image_Bpp=1;
break;
case IMGFMT_RGB32:
case IMGFMT_BGR32:
apitch = vidix_play.dest.pitch.y-1;
dstrides.y = (image_width*4 + apitch) & ~apitch;
dstrides.u = dstrides.v = 0;
image_Bpp=4;
break;
case IMGFMT_RGB24:
case IMGFMT_BGR24:
apitch = vidix_play.dest.pitch.y-1;
dstrides.y = (image_width*3 + apitch) & ~apitch;
dstrides.u = dstrides.v = 0;
image_Bpp=3;
break;
default:
apitch = vidix_play.dest.pitch.y-1;
dstrides.y = (image_width*2 + apitch) & ~apitch;
dstrides.u = dstrides.v = 0;
image_Bpp=2;
break;
}
/* tune some info here */
sstride = src_width*2;
dstride = (src_width*2+(vidix_play.dest.pitch.y-1))&~(vidix_play.dest.pitch.y-1);
is_422_planes_eq = sstride == dstride;
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_RGB32 || src_format == IMGFMT_BGR32)
vo_server->draw_slice =
else vo_server->draw_slice =
is_422_planes_eq ?
vidix_draw_slice_32_fast:
vidix_draw_slice_32;
else
if(src_format == IMGFMT_RGB24 || src_format == IMGFMT_BGR24)
vo_server->draw_slice =
is_422_planes_eq ?
vidix_draw_slice_24_fast:
vidix_draw_slice_24;
else
vo_server->draw_slice =
is_422_planes_eq ?
vidix_draw_slice_422_fast:
vidix_draw_slice_422;
vidix_draw_slice_packed_fast:
vidix_draw_slice_packed;
return 0;
}
@ -665,13 +604,13 @@ static uint32_t vidix_get_image(mp_image_t *mpi)
if(mpi->type==MP_IMGTYPE_STATIC && vidix_play.num_frames>1) return VO_FALSE;
if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; /* slow video ram */
mpi->planes[0]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.y;
mpi->stride[0]=vidix_play.dest.pitch.y;
mpi->stride[0]=dstrides.y;
if(mpi->flags&MP_IMGFLAG_PLANAR)
{
mpi->planes[1]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.v;
mpi->stride[1]=vidix_play.dest.pitch.v;
mpi->stride[1]=dstrides.v;
mpi->planes[2]=vidix_mem+vidix_play.offsets[next_frame]+vidix_play.offset.u;
mpi->stride[2]=vidix_play.dest.pitch.u;
mpi->stride[2]=dstrides.u;
}
mpi->flags|=MP_IMGFLAG_DIRECT;
return VO_TRUE;