Mercurial > mplayer.hg
changeset 6231:3acbdbc8f212
- some cleanup, removed unused code
- no more ignoring offset & stride values from XvImage struct -> fixed
shifted/skewed colors with width%8!=0 movies
author | arpi |
---|---|
date | Thu, 30 May 2002 00:08:47 +0000 |
parents | 936aa617e829 |
children | f8e0eac1256c |
files | libvo/vo_xv.c |
diffstat | 1 files changed, 68 insertions(+), 107 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_xv.c Wed May 29 22:39:25 2002 +0000 +++ b/libvo/vo_xv.c Thu May 30 00:08:47 2002 +0000 @@ -618,43 +618,48 @@ uint8_t *src; uint8_t *dst; int i; + int srcstride; - dst = xvimage[current_buf]->data + image_width * y + x; + dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[0] + + xvimage[current_buf]->pitches[0]*y + x; src = image[0]; - if(w==stride[0] && w==image_width) memcpy(dst,src,w*h); + if(w==stride[0] && w==xvimage[current_buf]->pitches[0]) memcpy(dst,src,w*h); else for(i=0;i<h;i++) { memcpy(dst,src,w); src+=stride[0]; - dst+=image_width; + dst+=xvimage[current_buf]->pitches[0]; } x/=2;y/=2;w/=2;h/=2; - dst = xvimage[current_buf]->data + image_width * image_height + (image_width>>1) * y + x; - if(image_format!=IMGFMT_YV12) dst+=(image_width>>1)*(image_height>>1); - src = image[2]; - if(w==stride[2] && w==image_width/2) memcpy(dst,src,w*h); + dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[1] + + xvimage[current_buf]->pitches[1]*y + x; + src=image[2];srcstride=stride[2]; + if(image_format!=IMGFMT_YV12){ src=image[1];srcstride=stride[1]; } + if(w==srcstride && w==xvimage[current_buf]->pitches[1]) memcpy(dst,src,w*h); else for(i=0;i<h;i++) { memcpy(dst,src,w); - src+=stride[2]; - dst+=image_width/2; + src+=srcstride; + dst+=xvimage[current_buf]->pitches[1]; } - dst = xvimage[current_buf]->data + image_width * image_height + (image_width>>1) * y + x; - if(image_format==IMGFMT_YV12) dst+=(image_width>>1)*(image_height>>1); - src = image[1]; - if(w==stride[1] && w==image_width/2) memcpy(dst,src,w*h); + dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[2] + + xvimage[current_buf]->pitches[2]*y + x; + src=image[2];srcstride=stride[2]; + if(image_format==IMGFMT_YV12){ src=image[1];srcstride=stride[1]; } + if(w==srcstride && w==xvimage[current_buf]->pitches[2]) memcpy(dst,src,w*h); else for(i=0;i<h;i++) { memcpy(dst,src,w); - src+=stride[1]; - dst+=image_width/2; - } + src+=srcstride; + dst+=xvimage[current_buf]->pitches[2]; + } + return 0; } @@ -666,56 +671,44 @@ case IMGFMT_UYVY: case IMGFMT_YVYU: - // YUY2 packed, flipped -#if 0 - int i; - unsigned short *s=(unsigned short *)src[0]; - unsigned short *d=(unsigned short *)xvimage[current_buf]->data; - s+=image_width*image_height; - for(i=0;i<image_height;i++) { - s-=image_width; - memcpy(d,s,image_width*2); - d+=image_width; - } -#else - memcpy(xvimage[current_buf]->data,src[0],image_width*image_height*2); -#endif - break; +// printf("off=0x%X pitch=%d width=%d \n",xvimage[current_buf]->offsets[0],xvimage[current_buf]->pitches[0],image_width); - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - - // YV12 planar - memcpy(xvimage[current_buf]->data,src[0],image_width*image_height); - if (xv_format == IMGFMT_YV12) - { - memcpy(xvimage[current_buf]->data+image_width*image_height,src[2],image_width*image_height/4); - memcpy(xvimage[current_buf]->data+image_width*image_height*5/4,src[1],image_width*image_height/4); - } - else - { - memcpy(xvimage[current_buf]->data+image_width*image_height,src[1],image_width*image_height/4); - memcpy(xvimage[current_buf]->data+image_width*image_height*5/4,src[2],image_width*image_height/4); - } - break; + // YUY2 packed + if(image_width*2==xvimage[current_buf]->pitches[0]){ + memcpy(xvimage[current_buf]->data+xvimage[current_buf]->offsets[0], + src[0], image_width*image_height*2); + } else { + unsigned char* s=src[0]; + unsigned char* d=xvimage[current_buf]->data+xvimage[current_buf]->offsets[0]; + int i; + for(i=0;i<image_height;i++) { + memcpy(d,s,image_width*2); + s+=image_width*2; + d+=xvimage[current_buf]->pitches[0]; + } + } + break; case IMGFMT_BGR24: if(flip_flag) // tricky, using negative src stride: rgb24toyv12(src[0]+3*image_width*(image_height-1), - xvimage[current_buf]->data, - xvimage[current_buf]->data+image_width*image_height*5/4, - xvimage[current_buf]->data+image_width*image_height, + xvimage[current_buf]->data+xvimage[current_buf]->offsets[0], + xvimage[current_buf]->data+xvimage[current_buf]->offsets[2], + xvimage[current_buf]->data+xvimage[current_buf]->offsets[1], image_width,image_height, - image_width,image_width/2,-3*image_width); + xvimage[current_buf]->pitches[0], + xvimage[current_buf]->pitches[1], + -3*image_width); else rgb24toyv12(src[0], - xvimage[current_buf]->data, - xvimage[current_buf]->data+image_width*image_height*5/4, - xvimage[current_buf]->data+image_width*image_height, + xvimage[current_buf]->data+xvimage[current_buf]->offsets[0], + xvimage[current_buf]->data+xvimage[current_buf]->offsets[2], + xvimage[current_buf]->data+xvimage[current_buf]->offsets[1], image_width,image_height, - image_width,image_width/2,3*image_width); + xvimage[current_buf]->pitches[0], + xvimage[current_buf]->pitches[1], + 3*image_width); break; } @@ -728,24 +721,26 @@ if(mpi->type==MP_IMGTYPE_IPB && num_buffers<3 && mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // not enough if(mpi->imgfmt!=image_format || mpi->imgfmt==IMGFMT_BGR24) return VO_FALSE; // needs conversion :( // if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram - if(mpi->width==image_width){ - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[0]=xvimage[current_buf]->data; - if(mpi->flags&MP_IMGFLAG_SWAPPED){ - // I420 - mpi->planes[1]=xvimage[current_buf]->data+image_width*image_height; - mpi->planes[2]=mpi->planes[1]+(image_width>>1)*(image_height>>1); - } else { + if( (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH)) || + (mpi->width*(mpi->bpp/8)==xvimage[current_buf]->pitches[0]) ){ + mpi->planes[0]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[0]; + mpi->stride[0]=xvimage[current_buf]->pitches[0]; + mpi->width=mpi->stride[0]/(mpi->bpp/8); + if(mpi->flags&MP_IMGFLAG_PLANAR){ + if(mpi->flags&MP_IMGFLAG_SWAPPED){ + // I420 + mpi->planes[1]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[1]; + mpi->planes[2]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[2]; + mpi->stride[1]=xvimage[current_buf]->pitches[1]; + mpi->stride[2]=xvimage[current_buf]->pitches[2]; + } else { // YV12 - mpi->planes[2]=xvimage[current_buf]->data+image_width*image_height; - mpi->planes[1]=mpi->planes[2]+(image_width>>1)*(image_height>>1); - } - mpi->stride[0]=image_width; - mpi->stride[1]=mpi->stride[2]=image_width/2; - } else { - mpi->planes[0]=xvimage[current_buf]->data; - mpi->stride[0]=image_width*(mpi->bpp>>3); - } + mpi->planes[1]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[2]; + mpi->planes[2]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[1]; + mpi->stride[1]=xvimage[current_buf]->pitches[2]; + mpi->stride[2]=xvimage[current_buf]->pitches[1]; + } + } mpi->flags|=MP_IMGFLAG_DIRECT; // printf("mga: get_image() SUCCESS -> Direct Rendering ENABLED\n"); return VO_TRUE; @@ -759,46 +754,14 @@ /* check image formats */ if(format==IMGFMT_BGR24){ format=IMGFMT_YV12;flag&=~2;flag|=VFCAP_FLIP;} // conversion! for(i = 0; i < formats; i++){ -// printf("Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id,(char*)&fo[i].id, (fo[i].format == XvPacked) ? "packed" : "planar"); if (fo[i].id == format) return flag; //xv_format = fo[i].id; } return 0; - -/* -switch(format){ - case IMGFMT_YUY2: - case IMGFMT_UYVY: - case IMGFMT_YVYU: - - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - - case IMGFMT_BGR24: - -// umm, this is a kludge, we need to ask the server.. (see init function above) - return 1; -} -return 0; -*/ - } static void uninit(void) { int i; -#if 0 - - if(!mDisplay) return; - saver_on(mDisplay); // screen saver back on - if(vo_config_count) for( i=0;i<num_buffers;i++ ) deallocate_xvimage( i ); -#ifdef HAVE_XF86VM - vo_vm_close(mDisplay); -#endif - if(vo_config_count) vo_x11_uninit(); - -#else - if ( !vo_config_count ) return; saver_on(mDisplay); // screen saver back on for( i=0;i<num_buffers;i++ ) deallocate_xvimage( i ); @@ -806,8 +769,6 @@ vo_vm_close(mDisplay); #endif vo_x11_uninit(); - -#endif } static uint32_t preinit(const char *arg)