Mercurial > mplayer.hg
changeset 5622:d354889a3944
Support XV over remote connections, patch by Dmitry Karasik <dimakar at yahoo.com>
author | atmos4 |
---|---|
date | Sun, 14 Apr 2002 22:15:29 +0000 |
parents | 0426f9b887cd |
children | cdf5b88bdaa8 |
files | libvo/vo_xv.c |
diffstat | 1 files changed, 54 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_xv.c Sun Apr 14 19:43:23 2002 +0000 +++ b/libvo/vo_xv.c Sun Apr 14 22:15:29 2002 +0000 @@ -494,24 +494,48 @@ * allocate XvImages. FIXME: no error checking, without * mit-shm this will bomb... */ - xvimage[foo] = XvShmCreateImage(mDisplay, xv_port, xv_format, 0, image_width, image_height, &Shminfo[foo]); + if ( mLocalDisplay && XShmQueryExtension( mDisplay ) ) Shmem_Flag = 1; + else + { + Shmem_Flag = 0; + if ( !Quiet_Flag ) printf( "Shared memory not supported\nReverting to normal Xv\n" ); + } + if ( Shmem_Flag ) + { + xvimage[foo] = XvShmCreateImage(mDisplay, xv_port, xv_format, 0, image_width, image_height, &Shminfo[foo]); - Shminfo[foo].shmid = shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); - Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); - Shminfo[foo].readOnly = False; + Shminfo[foo].shmid = shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); + Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); + Shminfo[foo].readOnly = False; - xvimage[foo]->data = Shminfo[foo].shmaddr; - XShmAttach(mDisplay, &Shminfo[foo]); - XSync(mDisplay, False); - shmctl(Shminfo[foo].shmid, IPC_RMID, 0); + xvimage[foo]->data = Shminfo[foo].shmaddr; + XShmAttach(mDisplay, &Shminfo[foo]); + XSync(mDisplay, False); + shmctl(Shminfo[foo].shmid, IPC_RMID, 0); + } + else + { + xvimage[foo] = XvCreateImage(mDisplay, xv_port, xv_format, 0, image_width, image_height); + xvimage[foo]->data = malloc(xvimage[foo]->data_size); + XSync(mDisplay,False); + } memset(xvimage[foo]->data,128,xvimage[foo]->data_size); return; } static void deallocate_xvimage(int foo) { - XShmDetach( mDisplay,&Shminfo[foo] ); - shmdt( Shminfo[foo].shmaddr ); + if ( Shmem_Flag ) + { + XShmDetach( mDisplay,&Shminfo[foo] ); + shmdt( Shminfo[foo].shmaddr ); + } + else + { + free(xvimage[foo]->data); + } + XFree(xvimage[foo]); + XFlush( mDisplay ); XSync(mDisplay, False); return; @@ -542,8 +566,16 @@ } if ( e & VO_EVENT_EXPOSE ) { - XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX, drwY, 1, 1, False); - XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight), False); + if ( Shmem_Flag ) + { + XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX, drwY, 1, 1, False); + XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight), False); + } + else + { + XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX, drwY, 1, 1); + XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight)); + } } } @@ -552,10 +584,19 @@ static void flip_page(void) { - XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], + if ( Shmem_Flag ) + { + XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight), False); + } + else + { + XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], + 0, 0, image_width, image_height, + drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight)); + } if (num_buffers>1){ current_buf=(current_buf+1)%num_buffers; XFlush(mDisplay);