# HG changeset patch # User arpi # Date 1011054196 0 # Node ID ac62f85344093d9486685b2f98d75a622c02078c # Parent 42fec596fe7cdf1597be2a469392fbcf8ee33c7f hw spu support for dxr3 - patch by David Holm diff -r 42fec596fe7c -r ac62f8534409 DOCS/DXR3 --- a/DOCS/DXR3 Tue Jan 15 00:20:50 2002 +0000 +++ b/DOCS/DXR3 Tue Jan 15 00:23:16 2002 +0000 @@ -17,20 +17,23 @@ 2. Usage - -vo dxr3: For video output - -ao oss: For audio output - -ac hwac3 For digital audio output instead of analog - -vc mpegpes For mpeg playback - Number of device to use for playback (if you - have more than one card.). This can usually - be left out (-vo dxr3). - Mandrake 8.1 uses devfs by default. If you are - running mandrake 8.1 please use -vo dxr3:0 - Normally /dev/em8300_ma or - /dev/em8300_ma- - (-ao dxr3:/dev/em8300_ma). If left out the - default oss device will be used (normally - soundcard). + -vo dxr3: For video output + -ao oss: For audio output + -ac hwac3 For digital audio output instead of + analog + -vc mpegpes For mpeg playback + -aop list=resample:fout=48000 If samplerate is below 44100Hz + Number of device to use for playback + (if you have more than one card.). + This can usually be left out (-vo dxr3). + Mandrake 8.1 uses devfs by default. If + you are running mandrake 8.1 please use + -vo dxr3:0 + Normally /dev/em8300_ma or + /dev/em8300_ma- + (-ao dxr3:/dev/em8300_ma). If left out + the default oss device will be used + (normally soundcard). MPEG-1, MPEG-2, VCD and DVD Notes There are some important notes to take into account here for optimum playback. diff -r 42fec596fe7c -r ac62f8534409 libvo/vo_dxr3.c --- a/libvo/vo_dxr3.c Tue Jan 15 00:20:50 2002 +0000 +++ b/libvo/vo_dxr3.c Tue Jan 15 00:23:16 2002 +0000 @@ -91,6 +91,8 @@ } #endif +extern int vidmode; + static uint32_t init(uint32_t scr_width, uint32_t scr_height, uint32_t width, uint32_t height, uint32_t fullscreen, char *title, uint32_t format) { int tmp1,tmp2; @@ -112,7 +114,7 @@ sprintf(devname, "/dev/em8300_mv-%s", vo_subdevice); else sprintf(devname, "/dev/em8300_mv"); - fd_video = open(devname, O_WRONLY); + fd_video = open(devname, O_WRONLY | O_NONBLOCK); if (fd_video < 0) { printf("VO: [dxr3] Error opening %s for writing!\n", devname); uninit(); @@ -135,7 +137,7 @@ /* Subpic code isn't working yet, don't set to ON * unless you are really sure what you are doing */ - ioval = EM8300_SPUMODE_OFF; + ioval = EM8300_SPUMODE_ON; if (ioctl(fd_control, EM8300_IOCTL_SET_SPUMODE, &ioval) < 0) { printf("VO: [dxr3] Unable to set subpicture mode!\n"); uninit(); @@ -332,11 +334,19 @@ vo_mpegpes_t *p = (vo_mpegpes_t *) src[0]; size_t data_left = p->size; - if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts) < 0) - printf("VO: [dxr3] Unable to set pts\n"); + if (p->id == 0x20) { + if (ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &vo_pts) < 0) + printf("VO: [dxr3] Unable to set pts\n"); + + while (data_left) + data_left -= write(fd_spu, (void*) (p->data + p->size-data_left), data_left); + } else { + if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts) < 0) + printf("VO: [dxr3] Unable to set pts\n"); - while (data_left) - data_left -= write(fd_video, (void*) (p->data + p->size-data_left), data_left); + while (data_left) + data_left -= write(fd_video, (void*) (p->data + p->size-data_left), data_left); + } return 0; } #ifdef USE_MP1E @@ -439,7 +449,7 @@ uint32_t flag = 0; if (format == IMGFMT_MPEGPES) - flag = 0x2 | 0x4; + flag = 0x2 | 0x4 | 0x8; #ifdef USE_MP1E if (format == IMGFMT_YV12) flag = 0x1 | 0x4; diff -r 42fec596fe7c -r ac62f8534409 mplayer.c --- a/mplayer.c Tue Jan 15 00:20:50 2002 +0000 +++ b/mplayer.c Tue Jan 15 00:23:16 2002 +0000 @@ -2333,7 +2333,16 @@ #ifdef USE_DVDREAD // DVD sub: - if(vo_spudec){ + if(vo_flags & 0x08){ + static vo_mpegpes_t packet; + static vo_mpegpes_t *pkg=&packet; + packet.timestamp=sh_video->timer*90000.0; + packet.id=0x20; /* Subpic */ + while((packet.size=ds_get_packet_sub(d_dvdsub,&packet.data))>0){ + mp_msg(MSGT_CPLAYER,MSGL_V,"\rDVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n",packet.size,d_video->pts,d_dvdsub->pts); + video_out->draw_frame(&pkg); + } + }else if(vo_spudec){ unsigned char* packet=NULL; int len; current_module="spudec";