[Mplayerxp-cvslog] CVS: mplayerxp/mplayerxp/libmpdemux asf_streaming.c,1.13,1.14 cache2.c,1.32,1.33
Brought to you by:
olov
Update of /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30953/libmpdemux Modified Files: asf_streaming.c cache2.c cdda.c demux_avi.c demux_mpg.c demux_pva.c demux_rawaudio.c demux_rawvideo.c demux_ts.c demuxer.c demuxer_r.c dvdnav_stream.h s_cdd.c s_dvdnav.c s_dvdplay.c s_dvdread.c s_file.c s_tv.c s_vcd.c s_vcdnav.c stream.c stream.h video.c Log Message: stream level redesign Index: asf_streaming.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/asf_streaming.c,v retrieving revision 1.13 retrieving revision 1.14 diff -p -u -d -r1.13 -r1.14 --- asf_streaming.c 21 Apr 2005 16:06:55 -0000 1.13 +++ asf_streaming.c 20 May 2005 07:37:09 -0000 1.14 @@ -844,7 +844,7 @@ asf_http_streaming_start( stream_t *stre return -1; } } - stream->type = STREAMTYPE_PLAYLIST; + stream->type |= STREAMTYPE_TEXT; done = 1; break; case ASF_Authenticate_e: Index: cache2.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/cache2.c,v retrieving revision 1.32 retrieving revision 1.33 diff -p -u -d -r1.32 -r1.33 --- cache2.c 16 Jan 2005 18:39:59 -0000 1.32 +++ cache2.c 20 May 2005 07:37:10 -0000 1.33 @@ -106,7 +106,7 @@ static int c2_cache_fill(cache_vars_t* c new_start = readpos - c->back_size; if(new_start<c->stream->start_pos) new_start=c->stream->start_pos; seek_eof=0; - if(!in_cache && c->stream->type!=STREAMTYPE_STREAM) + if(!in_cache && c->stream->type&STREAMTYPE_SEEKABLE) { /* seeking... */ MSG_DBG2("Out of boundaries... seeking to %lli {in_cache(%i) %lli<%lli>%lli} \n" @@ -296,7 +296,7 @@ int stream_enable_cache(stream_t *stream cache_vars_t* c; int retval; - if (stream->type==STREAMTYPE_STREAM && stream->fd < 0) { + if (!(stream->type&STREAMTYPE_SEEKABLE) && stream->fd < 0) { // The stream has no 'fd' behind it, so is non-cacheable MSG_WARN("\rThis stream is non-cacheable\n"); return 1; @@ -328,7 +328,7 @@ int stream_enable_cache(stream_t *stream START_FILEPOS(c),c->read_filepos,END_FILEPOS(c),_min,c->eof,ss); while((c->read_filepos<START_FILEPOS(c) || END_FILEPOS(c)-c->read_filepos<_min) && !c->eof && CP_NEXT(c,c->last)!=c->first){ - if(stream->type==STREAMTYPE_STREAM) + if(!(stream->type&STREAMTYPE_SEEKABLE)) MSG_STATUS("\rCache fill: %5.2f%% (%d bytes) ", 100.0*(float)(END_FILEPOS(c)-c->read_filepos)/(float)(c->buffer_size), END_FILEPOS(c)-c->read_filepos); Index: cdda.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/cdda.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- cdda.c 23 Oct 2004 15:10:15 -0000 1.5 +++ cdda.c 20 May 2005 07:37:10 -0000 1.6 @@ -164,7 +164,7 @@ int open_cdda(stream_t *st,const char* d paranoia_seek(priv->cdp,priv->start_sector,SEEK_SET); priv->sector = priv->start_sector; - st->type = STREAMTYPE_CDDA; + st->type = STREAMTYPE_SEEKABLE|STREAMTYPE_RAWAUDIO; st->priv = priv; st->start_pos = priv->start_sector*CD_FRAMESIZE_RAW; st->end_pos = priv->end_sector*CD_FRAMESIZE_RAW; Index: demux_avi.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_avi.c,v retrieving revision 1.17 retrieving revision 1.18 diff -p -u -d -r1.17 -r1.18 --- demux_avi.c 18 May 2005 07:31:44 -0000 1.17 +++ demux_avi.c 20 May 2005 07:37:17 -0000 1.18 @@ -844,7 +844,7 @@ static demuxer_t* avi_open(demuxer_t* de demuxer->priv=(void*)priv; //---- AVI header: - read_avi_header(demuxer,(demuxer->stream->type!=STREAMTYPE_STREAM)?index_mode:-2); + read_avi_header(demuxer,(demuxer->stream->type&STREAMTYPE_SEEKABLE)?index_mode:-2); if(demuxer->audio->id>=0 && !demuxer->a_streams[demuxer->audio->id]){ MSG_WARN("AVI: invalid audio stream ID: %d - ignoring (nosound)\n",demuxer->audio->id); Index: demux_mpg.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_mpg.c,v retrieving revision 1.21 retrieving revision 1.22 diff -p -u -d -r1.21 -r1.22 --- demux_mpg.c 21 Apr 2005 16:06:56 -0000 1.21 +++ demux_mpg.c 20 May 2005 07:37:17 -0000 1.22 @@ -532,7 +532,7 @@ static void mpgps_seek(demuxer_t *demuxe } if(newpos<demuxer->movi_start){ - if(demuxer->stream->type!=STREAMTYPE_VCD) demuxer->movi_start=0; // for VCD + if(!(demuxer->stream->type&STREAMTYPE_PROGRAM)) demuxer->movi_start=0; // for VCD if(newpos<demuxer->movi_start) newpos=demuxer->movi_start; } Index: demux_pva.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_pva.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- demux_pva.c 26 Mar 2005 15:14:31 -0000 1.5 +++ demux_pva.c 20 May 2005 07:37:17 -0000 1.6 @@ -136,9 +136,7 @@ static demuxer_t* pva_open (demuxer_t * stream_seek(demuxer->stream,0); priv=malloc(sizeof(pva_priv_t)); - - if(demuxer->stream->type!=STREAMTYPE_FILE) demuxer->flags &= ~DEMUXF_SEEKABLE; - else demuxer->flags|=DEMUXF_SEEKABLE; + demuxer->flags|=DEMUXF_SEEKABLE; demuxer->priv=priv; memset(demuxer->priv,0,sizeof(pva_priv_t)); Index: demux_rawaudio.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_rawaudio.c,v retrieving revision 1.6 retrieving revision 1.7 diff -p -u -d -r1.6 -r1.7 --- demux_rawaudio.c 24 Mar 2003 08:34:14 -0000 1.6 +++ demux_rawaudio.c 20 May 2005 07:37:17 -0000 1.7 @@ -13,7 +13,7 @@ int use_rawaudio = 0; static int channels = 2; static int samplerate = 44100; -static int samplesize = 2; +static int samplesize = 16; static int format = 0x1; // Raw PCM static config_t demux_rawaudio_opts[] = { @@ -38,7 +38,7 @@ extern void resync_audio_stream(sh_audio static int rawaudio_probe(demuxer_t* demuxer) { - if(demuxer->stream->type == STREAMTYPE_CDDA || use_rawaudio) + if(demuxer->stream->type == STREAMTYPE_RAWAUDIO || use_rawaudio) { demuxer->file_format=DEMUXER_TYPE_RAWAUDIO; return 1; @@ -50,15 +50,19 @@ static demuxer_t* rawaudio_open(demuxer_ sh_audio_t* sh_audio; WAVEFORMATEX* w; + demuxer->stream->driver->control(demuxer->stream,SCTRL_AUD_GET_CHANNELS,&channels); + demuxer->stream->driver->control(demuxer->stream,SCTRL_AUD_GET_SAMPLERATE,&samplerate); + demuxer->stream->driver->control(demuxer->stream,SCTRL_AUD_GET_SAMPLESIZE,&samplesize); + demuxer->stream->driver->control(demuxer->stream,SCTRL_AUD_GET_FORMAT,&format); sh_audio = new_sh_audio(demuxer,0); sh_audio->wf = w = (WAVEFORMATEX*)malloc(sizeof(WAVEFORMATEX)); w->wFormatTag = sh_audio->format = format; w->nChannels = sh_audio->channels = channels; w->nSamplesPerSec = sh_audio->samplerate = samplerate; - w->nAvgBytesPerSec = samplerate*samplesize*channels; - w->nBlockAlign = channels*samplesize; - sh_audio->samplesize = samplesize; - w->wBitsPerSample = 8*samplesize; + w->nAvgBytesPerSec = samplerate*((samplesize+7)/8)*channels; + w->nBlockAlign = channels*(samplesize+7)/8; + sh_audio->samplesize = (samplesize+7)/8; + w->wBitsPerSample = samplesize; w->cbSize = 0; demuxer->movi_start = demuxer->stream->start_pos; Index: demux_rawvideo.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_rawvideo.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- demux_rawvideo.c 16 Feb 2005 16:33:34 -0000 1.5 +++ demux_rawvideo.c 20 May 2005 07:37:17 -0000 1.6 @@ -60,7 +60,7 @@ static void rawvideo_register_options(m_ static int rawvideo_probe(demuxer_t* demuxer) { - if(use_rawvideo) + if(demuxer->stream->type == STREAMTYPE_RAWVIDEO || use_rawvideo) { demuxer->file_format=DEMUXER_TYPE_RAWVIDEO; return 1; @@ -82,6 +82,11 @@ static demuxer_t* rawvideo_open(demuxer_ case 7: width=1408;height=1152;break; case 8: width=352; height=240; break; } + demuxer->stream->driver->control(demuxer->stream,SCTRL_VID_GET_WIDTH,&width); + demuxer->stream->driver->control(demuxer->stream,SCTRL_VID_GET_HEIGHT,&height); + demuxer->stream->driver->control(demuxer->stream,SCTRL_VID_GET_FORMAT,&format); + demuxer->stream->driver->control(demuxer->stream,SCTRL_VID_GET_FPS,&fps); + if(!width || !height){ MSG_ERR("rawvideo: width or height not specified!\n"); return NULL; Index: demux_ts.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_ts.c,v retrieving revision 1.8 retrieving revision 1.9 diff -p -u -d -r1.8 -r1.9 --- demux_ts.c 21 Apr 2005 16:06:57 -0000 1.8 +++ demux_ts.c 20 May 2005 07:37:17 -0000 1.9 @@ -859,11 +859,7 @@ static demuxer_t *ts_open(demuxer_t * de demuxer->priv = priv; - if(demuxer->stream->type != STREAMTYPE_FILE) - demuxer->flags |= DEMUXF_SEEKABLE; - else - demuxer->flags &= ~DEMUXF_SEEKABLE; - + demuxer->flags |= DEMUXF_SEEKABLE; params.atype = params.vtype = params.stype = UNKNOWN; params.apid = demuxer->audio->id; Index: demuxer.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demuxer.c,v retrieving revision 1.40 retrieving revision 1.41 diff -p -u -d -r1.40 -r1.41 --- demuxer.c 22 Apr 2005 14:42:42 -0000 1.40 +++ demuxer.c 20 May 2005 07:37:18 -0000 1.41 @@ -507,7 +507,27 @@ float ds_get_next_pts(demux_stream_t *ds } // ==================================================================== - +const struct s_stream_txt_ids +{ + unsigned demuxer_id; + unsigned stream_id; +}stream_txt_ids[]= +{ + { INFOT_AUTHOR, SCTRL_TXT_GET_STREAM_AUTHOR }, + { INFOT_NAME, SCTRL_TXT_GET_STREAM_NAME }, + { INFOT_SUBJECT, SCTRL_TXT_GET_STREAM_SUBJECT }, + { INFOT_COPYRIGHT, SCTRL_TXT_GET_STREAM_COPYRIGHT }, + { INFOT_DESCRIPTION,SCTRL_TXT_GET_STREAM_DESCRIPTION }, + { INFOT_ALBUM, SCTRL_TXT_GET_STREAM_ALBUM }, + { INFOT_DATE, SCTRL_TXT_GET_STREAM_DATE }, + { INFOT_TRACK, SCTRL_TXT_GET_STREAM_TRACK }, + { INFOT_GENRE, SCTRL_TXT_GET_STREAM_GENRE }, + { INFOT_ENCODER, SCTRL_TXT_GET_STREAM_ENCODER }, + { INFOT_SOURCE_MEDIA,SCTRL_TXT_GET_STREAM_SOURCE_MEDIA }, + { INFOT_RATING, SCTRL_TXT_GET_STREAM_RATING }, + { INFOT_COMMENTS, SCTRL_TXT_GET_STREAM_COMMENT }, + { INFOT_MIME, SCTRL_TXT_GET_STREAM_MIME } +}; static demuxer_t* demux_open_stream(stream_t *stream,int file_format,int audio_id,int video_id,int dvdsub_id) { unsigned i; @@ -549,14 +569,15 @@ static demuxer_t* demux_open_stream(stre } demuxer=new_demux; MSG_OK("Using: %s\n",demuxer->driver->name); - if(!demux_info_get(demuxer,INFOT_NAME)) + for(i=0;i<sizeof(stream_txt_ids)/sizeof(struct s_stream_txt_ids);i++) + if(!demux_info_get(demuxer,stream_txt_ids[i].demuxer_id)) { char stream_name[256]; if(demuxer->stream->driver->control) { - if(demuxer->stream->driver->control(demuxer->stream,SCTRL_GET_STREAM_NAME,stream_name) == SCTRL_OK) + if(demuxer->stream->driver->control(demuxer->stream,stream_txt_ids[i].stream_id,stream_name) == SCTRL_OK) { - demux_info_add(demuxer,INFOT_NAME,stream_name); + demux_info_add(demuxer,stream_txt_ids[i].demuxer_id,stream_name); } } } @@ -619,11 +640,16 @@ int demux_seek(demuxer_t *demuxer,float sh_audio_t *sh_audio=d_audio->sh; sh_video_t *sh_video=d_video->sh; - if(!(demuxer->flags&DEMUXF_SEEKABLE)) + if(!(demuxer->stream->type&STREAMTYPE_SEEKABLE)) { MSG_WARN("Stream is not seekable\n"); return 0; } + if(!(demuxer->flags&DEMUXF_SEEKABLE)) + { + MSG_WARN("Demuxer is not seekable\n"); + return 0; + } // clear demux buffers: if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} @@ -642,7 +668,7 @@ int demux_seek(demuxer_t *demuxer,float if(sh_video) sh_video->timer=0; // !!!!!! #endif if(demuxer->driver->seek) demuxer->driver->seek(demuxer,rel_seek_secs,flags); - else MSG_WARN("Demuxer is not seekable\n"); + else MSG_WARN("Demuxer seek error\n"); return 1; } Index: demuxer_r.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demuxer_r.c,v retrieving revision 1.20 retrieving revision 1.21 diff -p -u -d -r1.20 -r1.21 --- demuxer_r.c 10 May 2005 12:18:25 -0000 1.20 +++ demuxer_r.c 20 May 2005 07:37:18 -0000 1.21 @@ -33,10 +33,7 @@ static float get_ds_stream_pts(demux_str MSG_DBG2("initial_apts from: stream_pts=%f pts_bytes=%u got_bytes=%u i_bps=%u\n" ,ds->pts,ds_tell_pts(ds),nbytes,((sh_audio_t*)ds->demuxer->audio->sh)->i_bps); /* FIXUP AUDIO PTS*/ - if((demuxer->stream->type == STREAMTYPE_DVDNAV || - demuxer->stream->type == STREAMTYPE_DVDPLAY || - demuxer->stream->type == STREAMTYPE_DVD || - demuxer->file_format == DEMUXER_TYPE_MPEG_ES || + if((demuxer->file_format == DEMUXER_TYPE_MPEG_ES || demuxer->file_format == DEMUXER_TYPE_MPEG4_ES || demuxer->file_format == DEMUXER_TYPE_H264_ES || demuxer->file_format == DEMUXER_TYPE_MPEG_PS || Index: dvdnav_stream.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/dvdnav_stream.h,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- dvdnav_stream.h 14 Mar 2003 10:04:21 -0000 1.5 +++ dvdnav_stream.h 20 May 2005 07:37:18 -0000 1.6 @@ -3,11 +3,9 @@ #include <dvdnav/dvdnav.h> -extern int dvd_nav_still; extern int dvd_nav_skip_opening; extern void dvdnav_stream_sleep(stream_t *s, int seconds); extern int dvdnav_stream_sleeping(stream_t * s); -extern unsigned int * dvdnav_stream_get_palette(stream_t * s); #endif Index: s_cdd.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_cdd.c,v retrieving revision 1.10 retrieving revision 1.11 diff -p -u -d -r1.10 -r1.11 --- s_cdd.c 20 Apr 2005 16:04:42 -0000 1.10 +++ s_cdd.c 20 May 2005 07:37:18 -0000 1.11 @@ -13,7 +13,7 @@ extern char *cdrom_device; static int track_idx=-1; static int cdd_open(stream_t *stream,const char *filename,unsigned flags) { - stream->type=STREAMTYPE_CDDA; + stream->type=STREAMTYPE_RAWAUDIO|STREAMTYPE_SEEKABLE; stream->sector_size=CD_FRAMESIZE_RAW; if(!(strncmp(filename,"cdda://",7)==0 || strncmp(filename,"cddb://",7)==0)) return 0; if(strcmp(&filename[7],"help") == 0) @@ -55,7 +55,7 @@ static int cdd_ctrl(stream_t *s,unsigned cd_track_t*tr=NULL; switch(cmd) { - case SCTRL_GET_STREAM_NAME: + case SCTRL_TXT_GET_STREAM_NAME: { if(track_idx!=-1) tr=cd_info_get_track(priv->cd_info,track_idx); if(tr) @@ -79,7 +79,7 @@ static int cdd_open(stream_t *stream,con int end_track = 0; char *track; char* end; - stream->type=STREAMTYPE_CDDA; + stream->type=STREAMTYPE_RAWAUDIO|STREAMTYPE_SEEKABLE; stream->sector_size=2352; if(!(strncmp(filename,"cdda://",7)==0 || strncmp(filename,"cddb://",7)==0)) return 0; if(strcmp(&filename[7],"help") == 0) Index: s_dvdnav.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_dvdnav.c,v retrieving revision 1.20 retrieving revision 1.21 diff -p -u -d -r1.20 -r1.21 --- s_dvdnav.c 13 May 2005 07:29:18 -0000 1.20 +++ s_dvdnav.c 20 May 2005 07:37:18 -0000 1.21 @@ -8,6 +8,8 @@ #include "stream.h" #include "demux_msg.h" #include "help_mp.h" +#include "demuxer.h" +#include "../libvo/sub.h" #ifdef USE_DVDNAV #include "dvdnav_stream.h" @@ -36,7 +38,7 @@ typedef struct { } dvdnav_event_t; int dvd_nav_skip_opening=0; /* skip opening stalls? */ -int dvd_nav_still=0; /* are we on a still picture? */ +static int dvd_nav_still=0; /* are we on a still picture? */ extern char *cdrom_device; extern int stream_cache_size; @@ -131,7 +133,7 @@ int dvdnav_stream_sleeping(stream_t * st return 0; } -unsigned int * dvdnav_stream_get_palette(stream_t * stream) { +static unsigned int * dvdnav_stream_get_palette(stream_t * stream) { #if 0 /* latest versions if libdvdnav don't provide such info */ dvdnav_priv_t *dvdnav_priv=stream->priv; if (!dvdnav_priv) { @@ -191,7 +193,7 @@ static int __dvdnav_open(stream_t *strea int ntitles; if(strncmp(filename,"dvdnav://",9)!=0) return 0; - stream->type = STREAMTYPE_DVDNAV; + stream->type = STREAMTYPE_SEEKABLE|STREAMTYPE_PROGRAM; strncpy(param,&filename[9],sizeof(param)); param[255]=0; if(strcmp(param,"help") == 0) @@ -382,12 +384,141 @@ static void __dvdnav_close(stream_t *str if(tevent) { free(tevent->details); free(tevent); } } +static char dvd_nav_text[50]; /* for reporting stuff to OSD */ +static int osd_show_dvd_nav_highlight; /* show highlight area */ +static int osd_show_dvd_nav_sx; /* start x .... */ +static int osd_show_dvd_nav_ex; +static int osd_show_dvd_nav_sy; +static int osd_show_dvd_nav_ey; +extern int dvdsub_id; +extern int audio_id; +extern int video_id; +extern void mpxp_resync_audio_stream(void); +extern demux_stream_t *d_audio; +extern demux_stream_t *d_dvdsub; +static void dvdnav_event_handler(stream_t* s,const stream_packet_t*sp) +{ + switch(sp->type) + { + case DVDNAV_BLOCK_OK: /* be silent about this one */ + break; + case DVDNAV_HIGHLIGHT: { + const dvdnav_highlight_event_t *hevent = (const dvdnav_highlight_event_t*)(sp->buf); + if (hevent->display && hevent->buttonN>0) + { + //dvdnav_priv->seen_root_menu=1; /* if we got a highlight, we're on a menu */ + sprintf( dvd_nav_text, "Highlight button %d (%u,%u)-(%u,%u) PTS %d", + hevent->buttonN, + hevent->sx,hevent->sy, + hevent->ex,hevent->ey, + hevent->pts); + MSG_DBG2("DVDNAV Event: %s\n",dvd_nav_text); + //osd_show_dvd_nav_delay = 60; + + osd_show_dvd_nav_highlight=1; + osd_show_dvd_nav_sx=hevent->sx; + osd_show_dvd_nav_ex=hevent->ex; + osd_show_dvd_nav_sy=hevent->sy; + osd_show_dvd_nav_ey=hevent->ey; + } + else { + osd_show_dvd_nav_highlight=0; + MSG_DBG2("DVDNAV Event: Highlight Hide\n"); + } + break; + } + case DVDNAV_STILL_FRAME: { + const dvdnav_still_event_t *still_event = (const dvdnav_still_event_t*)(sp->buf); + MSG_DBG2( "######## DVDNAV Event: Still Frame: %d sec(s)\n", still_event->length ); + while (dvdnav_stream_sleeping(s)) { + usleep(1000); /* 1ms */ + } + dvdnav_stream_sleep(s,still_event->length); + break; + } + case DVDNAV_STOP: + MSG_DBG2( "DVDNAV Event: Nav Stop\n" ); + break; + case DVDNAV_NOP: + MSG_DBG2("DVDNAV Event: Nav NOP\n"); + break; + case DVDNAV_SPU_STREAM_CHANGE: { + const dvdnav_spu_stream_change_event_t * stream_change=(const dvdnav_spu_stream_change_event_t*)(sp->buf); + MSG_DBG2("DVDNAV Event: Nav SPU Stream Change: phys_wide: %d phys_letterbox: %d phys_panscan: %d logical: %d\n", + stream_change->physical_wide, + stream_change->physical_letterbox, + stream_change->physical_pan_scan, + stream_change->logical); + if (vo_spudec && dvdsub_id!=stream_change->physical_wide) { + MSG_DBG2("d_dvdsub->id change: was %d is now %d\n", + d_dvdsub->id,stream_change->physical_wide); + // FIXME: need a better way to change SPU id + d_dvdsub->id=dvdsub_id=stream_change->physical_wide; + if (vo_spudec) spudec_reset(vo_spudec); + } + break; + } + case DVDNAV_AUDIO_STREAM_CHANGE: { + int aid_temp; + const dvdnav_audio_stream_change_event_t *stream_change = (const dvdnav_audio_stream_change_event_t*)(sp->buf); + MSG_DBG2("DVDNAV Event: Nav Audio Stream Change: phys: %d logical: %d\n", + stream_change->physical, + stream_change->logical); + aid_temp=stream_change->physical; + if (aid_temp>=0) aid_temp+=128; // FIXME: is this sane? + if (d_audio && audio_id!=aid_temp) { + MSG_DBG2("d_audio->id change: was %d is now %d\n", + d_audio->id,aid_temp); + // FIXME: need a bettery way to change audio stream id + d_audio->id=dvdsub_id=aid_temp; + mpxp_resync_audio_stream(); + } + break; + } + case DVDNAV_VTS_CHANGE:{ + const dvdnav_vts_change_event_t *evts = (const dvdnav_vts_change_event_t *)(sp->buf); + MSG_V("DVDNAV Event: Nav VTS Change %u\n",evts->new_domain); + } + break; + case DVDNAV_CELL_CHANGE: { + const dvdnav_cell_change_event_t *ecell=(const dvdnav_cell_change_event_t*)(sp->buf); +#if 0 + osd_show_dvd_nav_highlight=0; /* screen changed, disable menu */ +#endif + MSG_V("DVDNAV_CELL_CHANGE: N=%i pgN=%i cell_start=%f pg_start=%f cell_length=%f pg_length=%f pgc_length=%f\n" + ,ecell->cellN + ,ecell->pgN + ,ecell->cell_start/90000. + ,ecell->pg_start/90000. + ,ecell->cell_length/90000. + ,ecell->pg_length/90000. + ,ecell->pgc_length/90000.); + } + break; + case DVDNAV_NAV_PACKET: + MSG_V("DVDNAV Event: Nav Packet\n"); + break; + case DVDNAV_SPU_CLUT_CHANGE: { + const uint32_t * new_clut = (const uint32_t *)(sp->buf); + MSG_DBG2("DVDNAV Event: Nav SPU CLUT Change\n"); + // send new palette to SPU decoder + if (vo_spudec) spudec_update_palette(vo_spudec,new_clut); + break; + } +#if HAS_DVDNAVVER < 11 + case DVDNAV_SEEK_DONE: + MSG_DBG2("DVDNAV Event: Nav Seek Done\n"); + break; +#endif + } +} + static int __dvdnav_ctrl(stream_t *s,unsigned cmd,void *args) { dvdnav_priv_t *dvdnav_priv=s->priv; switch(cmd) { - case SCTRL_GET_STREAM_NAME: + case SCTRL_TXT_GET_STREAM_NAME: { const char *title_str; if (dvdnav_get_title_string(dvdnav_priv->dvdnav,&title_str)==DVDNAV_STATUS_OK) @@ -398,6 +529,19 @@ static int __dvdnav_ctrl(stream_t *s,uns } } break; + case SCTRL_VID_GET_PALETTE: + { + unsigned* pal; + pal=dvdnav_stream_get_palette(s); + *((unsigned **)args)=pal; + return SCTRL_OK; + } + break; + case SCRTL_EVT_HANDLE: + { + dvdnav_event_handler(s,args); + return SCTRL_OK; + } default: break; } return SCTRL_FALSE; Index: s_dvdplay.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_dvdplay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- s_dvdplay.c 7 Jul 2003 15:07:39 -0000 1.5 +++ s_dvdplay.c 20 May 2005 07:37:18 -0000 1.6 @@ -14,6 +14,7 @@ #ifdef USE_DVDPLAY typedef unsigned char byte_t; +#include <dvdread/ifo_types.h> #include <dvdplay/dvdplay.h> #include <dvdplay/info.h> #include <dvdplay/nav.h> @@ -44,7 +45,7 @@ static int __dvdplay_open(stream_t *stre char *dvd_device; if(strncmp(filename,"dvdplay://",10)!=0) return 0; - stream->type = STREAMTYPE_DVDPLAY; + stream->type = STREAMTYPE_SEEKABLE|STREAMTYPE_PROGRAM; if(!(stream->priv=malloc(sizeof(dvdplay_priv_t)))) { Index: s_dvdread.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_dvdread.c,v retrieving revision 1.16 retrieving revision 1.17 diff -p -u -d -r1.16 -r1.17 --- s_dvdread.c 11 May 2005 08:23:06 -0000 1.16 +++ s_dvdread.c 20 May 2005 07:37:18 -0000 1.17 @@ -77,7 +77,7 @@ static char * dvd_audio_stream_types[8] static char * dvd_audio_stream_channels[8] = { "unknown", "stereo", "unknown", "unknown", "unknown", "5.1", "6.1", "7.1" }; -int dvd_aid_from_lang(stream_t *stream, unsigned char* lang){ +static int dvd_aid_from_lang(stream_t *stream, unsigned char* lang){ dvd_priv_t *d=stream->priv; int code,i; while(lang && strlen(lang)>=2){ @@ -95,7 +95,7 @@ int code,i; return -1; } -int dvd_sid_from_lang(stream_t *stream, unsigned char* lang){ +static int dvd_sid_from_lang(stream_t *stream, unsigned char* lang){ dvd_priv_t *d=stream->priv; int code,i; while(lang && strlen(lang)>=2){ @@ -646,7 +646,7 @@ static int __dvdread_open(stream_t *stre stream->end_pos=(off_t)(d->cur_pgc->cell_playback[d->last_cell-1].last_sector)*2048; MSG_V("DVD start=%d end=%d \n",d->cur_pack,d->cur_pgc->cell_playback[d->last_cell-1].last_sector); stream->priv=(void*)d; - stream->type = STREAMTYPE_DVD; + stream->type = STREAMTYPE_SEEKABLE|STREAMTYPE_PROGRAM; stream->sector_size=2048; d->spos=0; return 1; @@ -684,7 +684,7 @@ static void __dvdread_close(stream_t *st dvd_close(stream->priv); } -unsigned int * dvdread_stream_get_palette(stream_t *stream) +static unsigned int * dvdread_stream_get_palette(stream_t *stream) { dvd_priv_t *d=(dvd_priv_t *)stream->priv; if(d) @@ -692,6 +692,40 @@ unsigned int * dvdread_stream_get_palett return d->cur_pgc->palette; return 0; } + +static int __dvdread_ctrl(stream_t *s,unsigned cmd,void *args) +{ + dvd_priv_t *dvd_priv=s->priv; + switch(cmd) + { + case SCTRL_VID_GET_PALETTE: + { + unsigned* pal; + pal=dvdread_stream_get_palette(s); + *((unsigned **)args)=pal; + return SCTRL_OK; + } + break; + case SCTRL_LNG_GET_AID: + { + int aid; + aid=dvd_aid_from_lang(s,args); + *((int *)args)=aid; + return SCTRL_OK; + } + break; + case SCTRL_LNG_GET_SID: + { + int aid; + aid=dvd_sid_from_lang(s,args); + *((int *)args)=aid; + return SCTRL_OK; + } + break; + default: break; + } + return SCTRL_FALSE; +} #else static int __dvdread_open(stream_t *stream,const char *filename,unsigned flags) { @@ -717,8 +751,9 @@ unsigned int * dvdread_stream_get_palett { return 0; } -#endif + static int __dvdread_ctrl(stream_t *s,unsigned cmd,void *args) { return SCTRL_UNKNOWN; } +#endif stream_driver_t dvdread_stream = { Index: s_file.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_file.c,v retrieving revision 1.8 retrieving revision 1.9 diff -p -u -d -r1.8 -r1.9 --- s_file.c 13 Apr 2005 06:33:11 -0000 1.8 +++ s_file.c 20 May 2005 07:37:18 -0000 1.9 @@ -31,7 +31,7 @@ static int file_open(stream_t *stream,co stream->end_pos = lseek(stream->fd,0,SEEK_END); lseek(stream->fd,0,SEEK_SET); if(stream->end_pos == -1) stream->type = STREAMTYPE_STREAM; - else stream->type = STREAMTYPE_FILE; + else stream->type = STREAMTYPE_SEEKABLE; /* decreasing number of packet from 256 to 10 speedups cache2 from 3.27% to 1.26% with absolute speed 1.04% for -nocache */ stream->sector_size=stream_cache_size?stream_cache_size*1024/10:STREAM_BUFFER_SIZE; Index: s_tv.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_tv.c,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- s_tv.c 23 Oct 2004 15:10:17 -0000 1.9 +++ s_tv.c 20 May 2005 07:37:18 -0000 1.10 @@ -581,7 +581,7 @@ static int _tv_open(stream_t*stream,cons if (!stream_open_tv(stream, stream->priv)) goto tv_err; - stream->type = STREAMTYPE_TV; + stream->type = STREAMTYPE_STREAM; return 1; /* something went wrong - uninit */ Index: s_vcd.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_vcd.c,v retrieving revision 1.10 retrieving revision 1.11 diff -p -u -d -r1.10 -r1.11 --- s_vcd.c 13 May 2005 09:16:36 -0000 1.10 +++ s_vcd.c 20 May 2005 07:37:18 -0000 1.11 @@ -77,7 +77,7 @@ static int _vcd_open(stream_t *stream,co MSG_ERR ("Error in CDRIOCSETBLOCKSIZE"); } #endif - stream->type = STREAMTYPE_VCD; + stream->type = STREAMTYPE_SEEKABLE|STREAMTYPE_PROGRAM; stream->sector_size=VCD_SECTOR_SIZE; stream->start_pos=ret; stream->end_pos=ret2; Index: s_vcdnav.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/s_vcdnav.c,v retrieving revision 1.3 retrieving revision 1.4 diff -p -u -d -r1.3 -r1.4 --- s_vcdnav.c 14 May 2005 07:37:57 -0000 1.3 +++ s_vcdnav.c 20 May 2005 07:37:18 -0000 1.4 @@ -139,7 +139,7 @@ static int _vcdnav_open(stream_t *stream _vcdnav_read(stream,NULL); /* Find first non empty segment */ priv->lsn--; priv->start=priv->lsn; - stream->type = STREAMTYPE_VCD; + stream->type = STREAMTYPE_SEEKABLE|STREAMTYPE_PROGRAM; stream->sector_size=sizeof(vcdsector_t); stream->start_pos=priv->start*sizeof(vcdsector_t); stream->end_pos=(priv->start+priv->total)*sizeof(vcdsector_t); Index: stream.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/stream.c,v retrieving revision 1.28 retrieving revision 1.29 diff -p -u -d -r1.28 -r1.29 --- stream.c 13 May 2005 07:31:24 -0000 1.28 +++ stream.c 20 May 2005 07:37:18 -0000 1.29 @@ -64,7 +64,7 @@ void stream_register_options(m_config_t* stream_t* open_stream(char* filename,int* file_format,stream_callback event_handler) { unsigned i; - stream_t* stream=new_stream(STREAMTYPE_FILE); + stream_t* stream=new_stream(STREAMTYPE_STREAM); /* No flags here */ stream->file_format=*file_format; for(i=0;i<nsdrivers;i++) { @@ -318,7 +318,7 @@ off_t nc_stream_tell(stream_t *s){ int nc_stream_seek(stream_t *s,off_t pos){ MSG_DBG3( "nc_stream_seek to %llu\n",(long long)pos); - if(s->type==STREAMTYPE_MEMORY) + if(s->type&STREAMTYPE_MEMORY) { s->buf_pos=pos; return 1; @@ -333,7 +333,7 @@ int nc_stream_seek(stream_t *s,off_t pos } int nc_stream_skip(stream_t *s,off_t len){ - if(len<0 || (len>2*STREAM_BUFFER_SIZE && s->type!=STREAMTYPE_STREAM)){ + if(len<0 || (len>2*STREAM_BUFFER_SIZE && s->type&STREAMTYPE_SEEKABLE)){ /* negative or big skip! */ return nc_stream_seek(s,nc_stream_tell(s)+len); } Index: stream.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/stream.h,v retrieving revision 1.24 retrieving revision 1.25 diff -p -u -d -r1.24 -r1.25 --- stream.h 11 May 2005 06:59:05 -0000 1.24 +++ stream.h 20 May 2005 07:37:18 -0000 1.25 @@ -9,18 +9,14 @@ #define STREAM_BUFFER_SIZE 4096 -#define STREAMTYPE_FILE 0 -#define STREAMTYPE_VCD 1 -#define STREAMTYPE_STREAM 2 // same as FILE but no seeking (for stdin) -#define STREAMTYPE_DVD 3 -#define STREAMTYPE_MEMORY 4 -#define STREAMTYPE_TV 5 -#define STREAMTYPE_PLAYLIST 6 -#define STREAMTYPE_MF 7 -#define STREAMTYPE_DS 8 -#define STREAMTYPE_DVDNAV 9 // we cannot safely "seek" in this... -#define STREAMTYPE_CDDA 10 -#define STREAMTYPE_DVDPLAY 11 +#define STREAMTYPE_STREAM 0x00000000 /**< Stream resides on remote filesystem (doesn't provide seek functionality). */ +#define STREAMTYPE_SEEKABLE 0x00000001 /**< Stream is seekable (resides on local filesystem). */ +#define STREAMTYPE_MEMORY 0x00000002 /**< Stream is memory cache (doesn't provide seek/read functionality). */ +#define STREAMTYPE_TEXT 0x00000004 /**< Stream is non-media stream (redirector, playlist, ...). */ +#define STREAMTYPE_DS 0x00000008 /**< Stream is mapped on the other demuxer. */ +#define STREAMTYPE_RAWAUDIO 0x00000010 /**< Stream contains raw audio without headers. */ +#define STREAMTYPE_RAWVIDEO 0x00000020 /**< Stream contains raw video without headers. */ +#define STREAMTYPE_PROGRAM 0x00000040 /**< Stream constains program (non-media) headers (VCD,DVD,http,...) */ #define VCD_SECTOR_SIZE 2352 #define VCD_SECTOR_OFFS 24 @@ -108,9 +104,45 @@ extern unsigned int stream_read_int24(st #define SCTRL_FALSE 0 #define SCTRL_OK 1 #define SCTRL_UNKNOWN -1 -/* returns name of stream. Accepts char *name as pointer on 256 bytes array */ -#define SCTRL_GET_STREAM_NAME 1 -#define SCTRL_EOF 2 + +/* These controls extracts text info from stream */ +#define SCTRL_TXT_GET_STREAM_AUTHOR 1 /**< Returns author of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_NAME 2 /**< Returns name of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_SUBJECT 3 /**< Returns subject of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_COPYRIGHT 4 /**< Returns copyright of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_DESCRIPTION 5 /**< Returns description of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_ALBUM 6 /**< Returns album of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_DATE 7 /**< Returns date of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_TRACK 8 /**< Returns track of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_GENRE 9 /**< Returns genre of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_ENCODER 10 /**< Returns encoder of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_SOURCE_MEDIA 11 /**< Returns mediatype of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_RATING 12 /**< Returns rating of stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_COMMENT 13 /**< Returns comments for stream. Accepts char *name as pointer on 256 bytes array */ +#define SCTRL_TXT_GET_STREAM_MIME 14 /**< Returns mimetype of stream. Accepts char *name as pointer on 256 bytes array */ + +/* These controls extracts videospecific info from stream */ +#define SCTRL_VID_GET_PALETTE 1000 /**< Returns palette array. Accepts unsigned** as pointer to palette array */ +#define SCTRL_VID_GET_WIDTH 1001 /**< Returns width of raw video in pixels. Accepts unsigned* as pointer to storage area */ +#define SCTRL_VID_GET_HEIGHT 1002 /**< Returns height of raw video in pixels. Accepts unsigned* as pointer to storage area */ +#define SCTRL_VID_GET_FORMAT 1003 /**< Returns fourcc of raw video in pixels. Accepts unsigned* as pointer to storage area */ +#define SCTRL_VID_GET_FPS 1004 /**< Returns Frames Per Seconds of raw video. Accepts float* as pointer to storage area */ + +/* These controls extracts audiospecific info from stream */ +#define SCTRL_AUD_GET_CHANNELS 2000 /**< Returns number of channels. Accepts unsigned* as pointer to channels storage */ +#define SCTRL_AUD_GET_SAMPLERATE 2001 /**< Returns rate of samples in Hz. Accepts unsigned* as pointer to storage area */ +#define SCTRL_AUD_GET_SAMPLESIZE 2002 /**< Returns size fo samples in bits. Accepts unsigned* as pointer to storage area */ +#define SCTRL_AUD_GET_FORMAT 2003 /**< Returns format of samples. Accepts unsigned* as pointer to storage area */ + +/* These controls extracts language specific info from stream */ +#define SCTRL_LNG_GET_AID 3000 /**< Returns audio id from language. Accepts char* as input language name. Stores int* id into this pointer as output. */ +#define SCTRL_LNG_GET_SID 3001 /**< Returns subtitle id from language. Accepts char* as input language name. Stores int* id into this pointer as output. */ + +/* These controls provide event handlig by stream driver */ +#define SCRTL_EVT_HANDLE 4000 /**< Accepts const stream_packet_t* as input argument */ + +#define SCTRL_EOF 10000 + typedef struct stream_driver_s { const char *name; @@ -127,22 +159,4 @@ typedef struct stream_driver_s struct config; int dvd_parse_chapter_range(struct config*, char*); //#endif - -#ifdef USE_DVDNAV -#include "dvdnav_stream.h" -#endif - -#ifdef USE_DVDREAD - -#include <dvdread/dvd_reader.h> -#include <dvdread/ifo_types.h> -#include <dvdread/ifo_read.h> -#include <dvdread/nav_read.h> - -extern int dvd_aid_from_lang(stream_t *stream, unsigned char* lang); -extern int dvd_sid_from_lang(stream_t *stream, unsigned char* lang); -extern unsigned int * dvdread_stream_get_palette(stream_t * s); - -#endif - #endif // __STREAM_H Index: video.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/video.c,v retrieving revision 1.31 retrieving revision 1.32 diff -p -u -d -r1.31 -r1.32 --- video.c 10 May 2005 12:18:25 -0000 1.31 +++ video.c 20 May 2005 07:37:18 -0000 1.32 @@ -575,10 +575,7 @@ int video_read_frame(sh_video_t* sh_vide demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_TS) d_video->pts+=frame_time; /* FIXUP VIDEO PTS*/ - if((demuxer->stream->type == STREAMTYPE_DVDNAV || - demuxer->stream->type == STREAMTYPE_DVDPLAY || - demuxer->stream->type == STREAMTYPE_DVD || - demuxer->file_format == DEMUXER_TYPE_MPEG_ES || + if((demuxer->file_format == DEMUXER_TYPE_MPEG_ES || demuxer->file_format == DEMUXER_TYPE_MPEG4_ES || demuxer->file_format == DEMUXER_TYPE_H264_ES || demuxer->file_format == DEMUXER_TYPE_MPEG_PS || |