From 5475823f41bfe971bec6dd2208dd7c01bc11edd8 Mon Sep 17 00:00:00 2001 From: arpi Date: Thu, 28 Mar 2002 20:40:21 +0000 Subject: DVDnav support patch by David Holm and Kees Cook git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5381 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/stream.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) (limited to 'libmpdemux/stream.c') diff --git a/libmpdemux/stream.c b/libmpdemux/stream.c index 7247f588e7..402c9a1cf8 100644 --- a/libmpdemux/stream.c +++ b/libmpdemux/stream.c @@ -28,6 +28,13 @@ extern int verbose; // defined in mplayer.c #endif +#ifdef USE_DVDNAV +#include +#include <../linux/timer.h> +static int still_sleep_until; +static int sleeping=0; +static int stillen=0; +#endif #ifdef USE_DVDREAD int dvd_read_sector(void* d,void* p2); void dvd_seek(void* d,off_t pos); @@ -59,6 +66,98 @@ int stream_fill_buffer(stream_t *s){ len=vcd_read(s->fd,s->buffer);break; #endif #endif +#ifdef USE_DVDNAV + case STREAMTYPE_DVDNAV: { + int event = DVDNAV_NOP; + if(sleeping) + { + dvdnav_still_skip(s->priv); + if(sleeping==1) if(GetTimer()>=still_sleep_until) sleeping = 0; + len = stillen; + } + if(dvdnav_get_next_block(s->priv,s->buffer,&event,&len)!=DVDNAV_STATUS_OK) + printf( "Error getting next block from DVD (%s)\n",dvdnav_err_to_string(s->priv) ); + else switch(event) { + case DVDNAV_BLOCK_OK: { + /* be silent about this one */ + break; + } + case DVDNAV_HIGHLIGHT: { + dvdnav_highlight_event_t *hevent = (dvdnav_highlight_event_t*)(s->buffer); + if (!hevent) { + printf("Highlight event broken\n"); + break; + } + + if (hevent->display) + { + printf( "Highlight (%u,%u)-(%u,%u) (button %d)\n", + hevent->sx,hevent->sy, + hevent->ex,hevent->ey, + hevent->buttonN ); + } + else { + printf("Highlight Hide\n"); + } + break; + } + case DVDNAV_STILL_FRAME: { + printf( "Still Frame\n" ); + dvdnav_still_event_t *still_event = (dvdnav_still_event_t*)(s->buffer); + if(still_event->length==0xff) { printf( "Sleeping indefinately\n" ); sleeping=2; } + else { + InitTimer(); + still_sleep_until = GetTimer() + still_event->length*1000000; + printf( "Sleeping %d sec(s)\n", still_event->length ); + sleeping=1; + } + stillen = len; + break; + } + case DVDNAV_STOP: { + printf( "Nav Stop\n" ); + len=0; + break; + } + case DVDNAV_NOP: { + printf("Nav NOP\n"); + break; + } + case DVDNAV_SPU_STREAM_CHANGE: { + printf("Nav SPU Stream Change\n"); + break; + } + case DVDNAV_AUDIO_STREAM_CHANGE: { + printf("Nav Audio Stream Change\n"); + break; + } + case DVDNAV_VTS_CHANGE: { + printf("Nav VTS Change\n"); + break; + } + case DVDNAV_CELL_CHANGE: { + printf("Nav Cell Change\n"); + break; + } + case DVDNAV_NAV_PACKET: { + // printf("Nav Packet\n"); + break; + } + case DVDNAV_SPU_CLUT_CHANGE: { + printf("Nav SPU CLUT Change\n"); + break; + } + case DVDNAV_SEEK_DONE: { + printf("Nav Seek Done\n"); + break; + } + default: + printf("Weird nav event %d\n",event); + break; + } + break; + } +#endif #ifdef USE_DVDREAD case STREAMTYPE_DVD: { off_t pos=dvd_read_sector(s->priv,s->buffer); -- cgit v1.2.3