summaryrefslogtreecommitdiffstats
path: root/libvo/vo_sdl.c
diff options
context:
space:
mode:
authoratmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-04-01 18:16:27 +0000
committeratmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-04-01 18:16:27 +0000
commit1d13f15b04d9a9965203a8f3ccfdbd953976d2db (patch)
tree99ddaebac182f8433c2592027079e39b7e1b4827 /libvo/vo_sdl.c
parenta6a5b81c2f97cceac260e56cacdff1055347dfff (diff)
downloadmpv-1d13f15b04d9a9965203a8f3ccfdbd953976d2db.tar.bz2
mpv-1d13f15b04d9a9965203a8f3ccfdbd953976d2db.tar.xz
Fix I420 handling, though still don't know why divx4 codec queries for I420 not YUY2!
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5461 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/vo_sdl.c')
-rw-r--r--libvo/vo_sdl.c59
1 files changed, 45 insertions, 14 deletions
diff --git a/libvo/vo_sdl.c b/libvo/vo_sdl.c
index 5d08c36445..14a2879601 100644
--- a/libvo/vo_sdl.c
+++ b/libvo/vo_sdl.c
@@ -1125,22 +1125,46 @@ static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int
x/=2;y/=2;w/=2;h/=2;
- dst = priv->overlay->pixels[2] + priv->overlay->pitches[2]*y + x;
- src = image[1];
+ switch(priv->format) {
+ case IMGFMT_YV12:
+ dst = priv->overlay->pixels[2] + priv->overlay->pitches[2]*y + x;
+ src = image[1];
for(i=0;i<h;i++){
memcpy(dst,src,w);
src+=stride[2];
- dst += priv->overlay->pitches[2];
+ dst += priv->overlay->pitches[2];
}
- dst = priv->overlay->pixels[1] + priv->overlay->pitches[1]*y + x;
- src = image[2];
+ dst = priv->overlay->pixels[1] + priv->overlay->pitches[1]*y + x;
+ src = image[2];
+ for(i=0;i<h;i++){
+ memcpy(dst,src,w);
+ src+=stride[1];
+ dst += priv->overlay->pitches[1];
+ }
+ break;
+ case IMGFMT_IYUV:
+ dst = priv->overlay->pixels[1] + priv->overlay->pitches[1]*y + x;
+ src = image[1];
for(i=0;i<h;i++){
memcpy(dst,src,w);
src+=stride[1];
- dst += priv->overlay->pitches[1];
+ dst += priv->overlay->pitches[1];
}
+ dst = priv->overlay->pixels[2] + priv->overlay->pitches[2]*y + x;
+ src = image[2];
+ for(i=0;i<h;i++){
+ memcpy(dst,src,w);
+ src+=stride[2];
+ dst += priv->overlay->pitches[2];
+ }
+
+ break;
+ default:
+ printf("SDL: unsupported image format in draw_slice, contact MPlayer developers!\n");
+ }
+
SDL_OVR_UNLOCK
return 0;
@@ -1610,17 +1634,24 @@ static uint32_t preinit(const char *arg)
static uint32_t get_image(mp_image_t *mpi)
{
- struct sdl_priv_s *priv = &sdl_priv;
+ struct sdl_priv_s *priv = &sdl_priv;
if(priv->format != mpi->imgfmt) return VO_FALSE;
if(mpi->type == MP_IMGTYPE_STATIC || mpi->type == MP_IMGTYPE_TEMP) {
- if(priv->format == IMGFMT_YV12 || priv->format == SDL_IYUV_OVERLAY) {
- mpi->planes[0] = priv->overlay->pixels[0] + priv->y*priv->overlay->pitches[0];
- mpi->planes[2] = priv->overlay->pixels[1] + priv->y*priv->overlay->pitches[1]/2;
- mpi->planes[1] = priv->overlay->pixels[2] + priv->y*priv->overlay->pitches[2]/2;
- mpi->stride[0] = priv->overlay->pitches[0];
- mpi->stride[2] = priv->overlay->pitches[1];
- mpi->stride[1] = priv->overlay->pitches[2];
+ if(mpi->flags&MP_IMGFLAG_PLANAR) {
+ mpi->planes[0] = priv->overlay->pixels[0] + priv->y*priv->overlay->pitches[0];
+ mpi->stride[0] = priv->overlay->pitches[0];
+ if(mpi->flags&MP_IMGFLAG_SWAPPED) {
+ mpi->planes[1] = priv->overlay->pixels[1] + priv->y*priv->overlay->pitches[1]/2;
+ mpi->stride[1] = priv->overlay->pitches[1];
+ mpi->planes[2] = priv->overlay->pixels[2] + priv->y*priv->overlay->pitches[2]/2;
+ mpi->stride[2] = priv->overlay->pitches[2];
+ } else {
+ mpi->planes[2] = priv->overlay->pixels[1] + priv->y*priv->overlay->pitches[1]/2;
+ mpi->stride[2] = priv->overlay->pitches[1];
+ mpi->planes[1] = priv->overlay->pixels[2] + priv->y*priv->overlay->pitches[2]/2;
+ mpi->stride[1] = priv->overlay->pitches[2];
+ }
}
else if(IMGFMT_IS_RGB(priv->format) || IMGFMT_IS_BGR(priv->format)) {
if(priv->dblit) {